@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
@@ -4,14 +4,17 @@
4
4
 
5
5
  import React, { type ComponentPropsWithRef, forwardRef } from 'react';
6
6
 
7
+ import { type StatusStyleProps } from '@dxos/ui-theme';
8
+
7
9
  import { useThemeContext } from '../../hooks';
8
10
  import { type ThemedClassName } from '../../util';
9
11
 
10
- type StatusProps = ThemedClassName<ComponentPropsWithRef<'span'>> & {
11
- indeterminate?: boolean;
12
- variant?: 'default' | 'main-bottom';
13
- progress?: number;
14
- };
12
+ type StatusProps = ThemedClassName<
13
+ ComponentPropsWithRef<'span'> &
14
+ StatusStyleProps & {
15
+ progress?: number;
16
+ }
17
+ >;
15
18
 
16
19
  const Status = forwardRef<HTMLSpanElement, StatusProps>(
17
20
  ({ classNames, children, progress = 0, indeterminate, variant, ...props }, forwardedRef) => {
@@ -9,7 +9,6 @@ import { hues } from '@dxos/ui-theme';
9
9
  import { type ChromaticPalette, type MessageValence } from '@dxos/ui-types';
10
10
 
11
11
  import { withLayout, withTheme } from '../../testing';
12
-
13
12
  import { Tag } from './Tag';
14
13
 
15
14
  const palettes = ['neutral', 'success', 'info', 'warning', 'error', ...hues] as (ChromaticPalette | MessageValence)[];
@@ -7,7 +7,6 @@ import React from 'react';
7
7
 
8
8
  import { useThemeContext } from '../../hooks';
9
9
  import { withLayout, withTheme } from '../../testing';
10
-
11
10
  import { ThemeProvider } from './ThemeProvider';
12
11
 
13
12
  const meta = {
@@ -11,7 +11,6 @@ import { type SafeAreaPadding, useSafeArea } from '../../hooks';
11
11
  import { hasIosKeyboard } from '../../util';
12
12
  import { DensityProvider } from '../DensityProvider';
13
13
  import { ElevationProvider } from '../ElevationProvider';
14
-
15
14
  import { TranslationsProvider, type TranslationsProviderProps } from './TranslationsProvider';
16
15
 
17
16
  export type ThemeContextValue = {
@@ -43,7 +42,8 @@ export const ThemeProvider = ({
43
42
  tx = (_path, _styleProps, ..._options) => undefined,
44
43
  themeMode = 'dark',
45
44
  rootDensity = 'fine',
46
- ...rest
45
+ noCache,
46
+ platform,
47
47
  }: ThemeProviderProps) => {
48
48
  useEffect(() => {
49
49
  if (document.defaultView) {
@@ -54,9 +54,10 @@ export const ThemeProvider = ({
54
54
  }, []);
55
55
 
56
56
  const safeAreaPadding = useSafeArea();
57
+ // Destructure all props explicitly so useMemo deps are stable primitives, not a new `rest` object every render.
57
58
  const contextValue = useMemo(
58
- () => ({ tx, themeMode, hasIosKeyboard: hasIosKeyboard(), safeAreaPadding, ...rest }),
59
- [tx, themeMode, safeAreaPadding, rest],
59
+ () => ({ tx, themeMode, hasIosKeyboard: hasIosKeyboard(), safeAreaPadding, noCache, platform }),
60
+ [tx, themeMode, safeAreaPadding, noCache, platform],
60
61
  );
61
62
 
62
63
  return (
@@ -2,7 +2,7 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- export { type Label, isLabel, toLocalizedString } from '@dxos/ui-types';
5
+ export { type Label, isLabel, toLocalizedString } from '@dxos/ui-types/translations';
6
6
 
7
7
  export * from './ThemeProvider';
8
8
  export { useTranslation } from './TranslationsProvider';
@@ -7,7 +7,6 @@ import React, { type ReactNode, useState } from 'react';
7
7
 
8
8
  import { withTheme } from '../../testing';
9
9
  import { Button } from '../Button';
10
-
11
10
  import { Toast } from './Toast';
12
11
 
13
12
  type ActionTriggerProps = { altText: string; trigger: ReactNode };
@@ -9,7 +9,6 @@ import { withTheme } from '../../testing';
9
9
  import { Toggle } from '../Button';
10
10
  import { Icon } from '../Icon';
11
11
  import { Select } from '../Select';
12
-
13
12
  import { Toolbar } from './Toolbar';
14
13
 
15
14
  type StorybookToolbarProps = {};
@@ -6,15 +6,15 @@ import { Primitive } from '@radix-ui/react-primitive';
6
6
  import { Slot } from '@radix-ui/react-slot';
7
7
  import type { ToggleGroupItemProps as ToggleGroupItemPrimitiveProps } from '@radix-ui/react-toggle-group';
8
8
  import * as ToolbarPrimitive from '@radix-ui/react-toolbar';
9
- import React, { Fragment, forwardRef } from 'react';
9
+ import React, { forwardRef } from 'react';
10
10
  import { useTranslation } from 'react-i18next';
11
11
 
12
- import { composableProps, type ToolbarStyleProps } from '@dxos/ui-theme';
12
+ import { composable, composableProps, slottable, type ToolbarStyleProps } from '@dxos/ui-theme';
13
13
  import { type SlottableProps } from '@dxos/ui-types';
14
14
 
15
+ import { translationKey } from '#translations';
16
+
15
17
  import { useThemeContext } from '../../hooks';
16
- import { translationKey } from '../../translations';
17
- import { type ThemedClassName } from '../../util';
18
18
  import {
19
19
  Button,
20
20
  ButtonGroup,
@@ -34,16 +34,18 @@ import { Separator, type SeparatorProps } from '../Separator';
34
34
  // Root
35
35
  //
36
36
 
37
- type ToolbarRootProps = ThemedClassName<ToolbarPrimitive.ToolbarProps & ToolbarStyleProps>;
37
+ type ToolbarRootProps = ToolbarPrimitive.ToolbarProps & ToolbarStyleProps;
38
38
 
39
- const ToolbarRoot = forwardRef<HTMLDivElement, ToolbarRootProps>(
39
+ const ToolbarRoot = composable<HTMLDivElement, ToolbarRootProps>(
40
40
  ({ children, density, disabled, layoutManaged, orientation, ...props }, forwardedRef) => {
41
- const { className, dir: _, ...rest } = composableProps(props);
41
+ const { className, role, ...rest } = composableProps(props);
42
42
  const { tx } = useThemeContext();
43
43
 
44
44
  return (
45
45
  <ToolbarPrimitive.Root
46
46
  {...rest}
47
+ // Only pass role when explicitly set; radix provides role="toolbar" by default.
48
+ {...(role !== 'none' && { role })}
47
49
  orientation={orientation}
48
50
  data-arrow-keys={orientation === 'vertical' ? 'up down' : 'left right'}
49
51
  className={tx('toolbar.root', { density, disabled, layoutManaged }, className)}
@@ -59,9 +61,9 @@ const ToolbarRoot = forwardRef<HTMLDivElement, ToolbarRootProps>(
59
61
  // Text
60
62
  //
61
63
 
62
- type ToolbarTextProps = SlottableProps<HTMLDivElement>;
64
+ type ToolbarTextProps = SlottableProps;
63
65
 
64
- const ToolbarText = forwardRef<HTMLDivElement, ToolbarTextProps>(({ children, asChild, ...props }, forwardedRef) => {
66
+ const ToolbarText = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
65
67
  const { className, ...rest } = composableProps(props);
66
68
  const Comp = asChild ? Slot : Primitive.div;
67
69
  const { tx } = useThemeContext();
@@ -159,7 +161,7 @@ const ToolbarToggleGroupItem = forwardRef<HTMLButtonElement, ToolbarToggleGroupI
159
161
  type ToolbarToggleGroupIconItemProps = Omit<ToggleGroupItemPrimitiveProps, 'className'> & IconButtonProps;
160
162
 
161
163
  const ToolbarToggleGroupIconItem = forwardRef<HTMLButtonElement, ToolbarToggleGroupIconItemProps>(
162
- ({ variant, density, elevation, classNames, icon, label, iconOnly, ...props }, forwardedRef) => {
164
+ ({ variant, density, elevation, classNames, icon, label, iconOnly, iconClassNames, ...props }, forwardedRef) => {
163
165
  return (
164
166
  <ToolbarPrimitive.ToolbarToggleItem {...props} asChild>
165
167
  <IconButton
@@ -171,6 +173,7 @@ const ToolbarToggleGroupIconItem = forwardRef<HTMLButtonElement, ToolbarToggleGr
171
173
  icon,
172
174
  label,
173
175
  iconOnly,
176
+ iconClassNames,
174
177
  }}
175
178
  ref={forwardedRef}
176
179
  />
@@ -189,7 +192,7 @@ const ToolbarSeparator = forwardRef<HTMLDivElement, ToolbarSeparatorProps>(
189
192
  ({ variant = 'gap', ...props }, forwardedRef) => {
190
193
  return variant === 'line' ? (
191
194
  <ToolbarPrimitive.Separator asChild>
192
- <Separator {...props} ref={forwardedRef} />
195
+ <Separator orientation='vertical' {...props} ref={forwardedRef} />
193
196
  </ToolbarPrimitive.Separator>
194
197
  ) : (
195
198
  <ToolbarPrimitive.Separator className='grow' ref={forwardedRef} />
@@ -209,12 +212,13 @@ const ToolbarDragHandle = forwardRef<HTMLButtonElement, ToolbarDragHandleProps>(
209
212
  return (
210
213
  <ToolbarIconButton
211
214
  data-testid={testId}
215
+ tabIndex={-1}
212
216
  noTooltip
213
217
  iconOnly
214
218
  icon='ph--dots-six-vertical--regular'
215
219
  variant='ghost'
216
- label={label ?? t('toolbar drag handle label')}
217
- classNames='cursor-pointer'
220
+ label={label ?? t('toolbar-drag-handle.label')}
221
+ classNames='dx-focus-ring-none cursor-pointer'
218
222
  disabled={!forwardedRef}
219
223
  ref={forwardedRef}
220
224
  />
@@ -237,7 +241,7 @@ const ToolbarCloseIconButton = forwardRef<HTMLButtonElement, ToolbarCloseIconBut
237
241
  iconOnly
238
242
  icon='ph--x--regular'
239
243
  variant='ghost'
240
- label={label ?? t('toolbar close label')}
244
+ label={label ?? t('toolbar-close.label')}
241
245
  classNames='cursor-pointer'
242
246
  onClick={onClick}
243
247
  ref={forwardedRef}
@@ -271,7 +275,7 @@ const ToolbarMenu = <T extends any | void = void>({ context, items }: ToolbarMen
271
275
  iconOnly
272
276
  variant='ghost'
273
277
  icon='ph--dots-three-vertical--regular'
274
- label={t('toolbar menu label')}
278
+ label={t('toolbar-menu.label')}
275
279
  />
276
280
  </DropdownMenu.Trigger>
277
281
  {(items?.length ?? 0) > 0 && (
@@ -5,22 +5,21 @@
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
 
10
10
  import { withTheme } from '../../testing';
11
11
  import { Button } from '../Button';
12
-
13
12
  import { Tooltip } from './Tooltip';
14
13
 
15
- type StoryProps = {
14
+ type DefaultStoryProps = {
16
15
  tooltips: { label: string; content: string }[];
17
16
  defaultOpen?: boolean;
18
17
  };
19
18
 
20
- const DefaultStory = ({ tooltips, defaultOpen }: StoryProps) => {
19
+ const DefaultStory = ({ tooltips, defaultOpen }: DefaultStoryProps) => {
21
20
  return (
22
21
  <Tooltip.Provider defaultOpen={defaultOpen}>
23
- <div role='none' className='w-32'>
22
+ <div className='w-32'>
24
23
  {tooltips.map(({ label, content }, i) => (
25
24
  <Tooltip.Trigger asChild key={i} content={content} side='right'>
26
25
  <Button classNames='block w-full'>{label}</Button>
@@ -74,10 +73,10 @@ export const DefaultOpen: Story = {
74
73
  export const StressTest: Story = {
75
74
  args: {
76
75
  defaultOpen: true,
77
- tooltips: faker.helpers.multiple(
76
+ tooltips: random.helpers.multiple(
78
77
  () => ({
79
- label: faker.lorem.words(2),
80
- content: faker.lorem.words(5),
78
+ label: random.lorem.words(2),
79
+ content: random.lorem.words(5),
81
80
  }),
82
81
  { count: 32 },
83
82
  ),
@@ -54,7 +54,7 @@ type TooltipContextValue = {
54
54
  open: boolean;
55
55
  stateAttribute: 'closed' | 'delayed-open' | 'instant-open';
56
56
  trigger: TooltipTriggerElement | null;
57
- onTriggerChange(trigger: TooltipTriggerElement | null): void;
57
+ onTriggerChange(trigger: TooltipTriggerElement | null, content?: ReactNode, side?: TooltipSide): void;
58
58
  onTriggerEnter(): void;
59
59
  onTriggerLeave(): void;
60
60
  onOpen(): void;
@@ -111,15 +111,18 @@ const TooltipProvider: FC<TooltipProviderProps> = (props: TooltipScopedProps<Too
111
111
 
112
112
  const popperScope = usePopperScope(__scopeTooltip);
113
113
  const [trigger, setTrigger] = useState<HTMLButtonElement | null>(null);
114
- const [content, setContent] = useState<string>('');
114
+ const [content, setContent] = useState<ReactNode>(null);
115
115
  const [side, setSide] = useState<TooltipSide | undefined>(undefined);
116
116
  const triggerRef = useRef<HTMLButtonElement | null>(trigger);
117
- const handleTriggerChange = useCallback((nextTrigger: HTMLButtonElement | null) => {
118
- setTrigger(nextTrigger);
119
- triggerRef.current = nextTrigger;
120
- setContent(nextTrigger?.getAttribute('data-tooltip-content') ?? '');
121
- setSide((nextTrigger?.getAttribute('data-tooltip-side') as TooltipSide | null) ?? undefined);
122
- }, []);
117
+ const handleTriggerChange = useCallback(
118
+ (nextTrigger: HTMLButtonElement | null, nextContent?: ReactNode, nextSide?: TooltipSide) => {
119
+ setTrigger(nextTrigger);
120
+ triggerRef.current = nextTrigger;
121
+ setContent(nextContent ?? null);
122
+ setSide(nextSide);
123
+ },
124
+ [],
125
+ );
123
126
  const contentId = useId();
124
127
  const openTimerRef = useRef(0);
125
128
  const wasOpenDelayedRef = useRef(false);
@@ -248,9 +251,9 @@ const TRIGGER_NAME = 'TooltipTrigger';
248
251
 
249
252
  type TooltipTriggerElement = ComponentRef<typeof Primitive.button>;
250
253
  type PrimitiveButtonProps = ComponentPropsWithoutRef<typeof Primitive.button>;
251
- type TooltipTriggerProps = PrimitiveButtonProps &
254
+ type TooltipTriggerProps = Omit<PrimitiveButtonProps, 'content'> &
252
255
  Pick<TooltipProps, 'delayDuration'> & {
253
- content?: string;
256
+ content?: ReactNode;
254
257
  side?: TooltipSide;
255
258
  onInteract?: (event: SyntheticEvent) => void;
256
259
  };
@@ -283,8 +286,6 @@ const TooltipTrigger = forwardRef<TooltipTriggerElement, TooltipTriggerProps>(
283
286
  // commonly anchors and the anchor `type` attribute signifies MIME type.
284
287
  aria-describedby={context.open ? context.contentId : undefined}
285
288
  data-state={context.stateAttribute}
286
- data-tooltip-content={content}
287
- data-tooltip-side={side}
288
289
  {...triggerProps}
289
290
  ref={composedRefs}
290
291
  onPointerMove={composeEventHandlers(props.onPointerMove, (event) => {
@@ -296,7 +297,7 @@ const TooltipTrigger = forwardRef<TooltipTriggerElement, TooltipTriggerProps>(
296
297
  if (event.defaultPrevented) {
297
298
  return;
298
299
  }
299
- context.onTriggerChange(ref.current);
300
+ context.onTriggerChange(ref.current, content, side);
300
301
  context.onTriggerEnter();
301
302
  hasPointerMoveOpenedRef.current = true;
302
303
  }
@@ -10,15 +10,18 @@ export * from './Avatars';
10
10
  export * from './Breadcrumb';
11
11
  export * from './Button';
12
12
  export * from './Card';
13
+ export * from './Carousel';
13
14
  export * from './Clipboard';
14
15
  export * from './Dialog';
15
16
  export * from './ErrorFallback';
17
+ export * from './Focus';
16
18
  export * from './Icon';
17
19
  export * from './Image';
18
20
  export * from './Input';
19
21
  export * from './Link';
20
22
  export * from './List';
21
23
  export * from './Main';
24
+ export * from './MediaPlayer';
22
25
  export * from './Menu';
23
26
  export * from './Message';
24
27
  export * from './Popover';
@@ -3,13 +3,16 @@
3
3
  //
4
4
 
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
- import React, { type ReactElement, type Ref, forwardRef } from 'react';
6
+ import React from 'react';
7
7
 
8
- import { type SlottableProps } from '@dxos/ui-types';
8
+ import { slottable } from '@dxos/ui-theme';
9
9
 
10
10
  import { withTheme } from '../testing';
11
11
 
12
- const ComponentInner = forwardRef<HTMLDivElement, ComponentProps>(({ children, ...props }, forwardedRef) => {
12
+ /**
13
+ * Generic component pattern using the slottable factory.
14
+ */
15
+ const Component = slottable<HTMLDivElement>(({ children, ...props }, forwardedRef) => {
13
16
  return (
14
17
  <div {...props} ref={forwardedRef}>
15
18
  {children}
@@ -17,21 +20,10 @@ const ComponentInner = forwardRef<HTMLDivElement, ComponentProps>(({ children, .
17
20
  );
18
21
  });
19
22
 
20
- ComponentInner.displayName = 'Component';
21
-
22
- /**
23
- * Generic component pattern.
24
- */
25
- type ComponentProps<P extends HTMLElement = any> = SlottableProps<P>;
26
-
27
- const Component = ComponentInner as <P extends HTMLElement>(
28
- props: SlottableProps<P> & { ref?: Ref<P> },
29
- ) => ReactElement;
30
-
31
23
  const meta = {
32
24
  title: 'ui/react-ui-core/exemplars/generics',
33
25
  component: Component,
34
- render: (props) => <Component<HTMLDivElement> {...props} />,
26
+ render: (props) => <Component {...props} />,
35
27
  decorators: [withTheme()],
36
28
  parameters: {
37
29
  layout: 'centered',
@@ -3,84 +3,64 @@
3
3
  //
4
4
 
5
5
  import { Primitive } from '@radix-ui/react-primitive';
6
+ import { Slot } from '@radix-ui/react-slot';
6
7
  import { type Meta, type StoryObj } from '@storybook/react-vite';
7
- import React, { HTMLAttributes, type PropsWithChildren, forwardRef } from 'react';
8
+ import React, { PropsWithChildren } from 'react';
8
9
 
9
- import { composableProps } from '@dxos/ui-theme';
10
- import { type ComposableProps, type SlottableProps, type ThemedClassName } from '@dxos/ui-types';
10
+ import { composable, composableProps, mx, slottable } from '@dxos/ui-theme';
11
11
 
12
12
  import { withTheme } from '../testing';
13
- import { Slot } from '@radix-ui/react-slot';
13
+ import { ThemedClassName } from '../util';
14
14
 
15
15
  /**
16
- * Composition
17
- *
16
+ * Radix-style composition.
18
17
  * All Radix primitive parts that render a DOM element accept an asChild prop.
19
- * When asChild is set to true, Radix will not render a default DOM element, instead cloning the part's child and passing it the props and behavior required to make it functional.
18
+ * When asChild is set to true, Radix will not render a default DOM element,
19
+ * instead cloning the part's child and passing it the props and behavior required to make it functional.
20
20
  * https://www.radix-ui.com/primitives/docs/guides/composition
21
21
  */
22
22
 
23
- const Outer = forwardRef<HTMLDivElement, SlottableProps<HTMLDivElement>>(
24
- ({ children, asChild, ...props }, forwardedRef) => {
23
+ const Outer = slottable<HTMLDivElement, { priority?: number }>(
24
+ ({ children, asChild, priority, ...props }, forwardedRef) => {
25
25
  const Comp = asChild ? Slot : Primitive.div;
26
26
  return (
27
- <Comp {...composableProps<HTMLDivElement>(props, { role: 'none' })} ref={forwardedRef}>
27
+ <Comp
28
+ {...composableProps<HTMLDivElement>(props, { classNames: 'p-2 border border-red-500 rounded' })}
29
+ ref={forwardedRef}
30
+ >
28
31
  {children}
29
32
  </Comp>
30
33
  );
31
34
  },
32
35
  );
33
36
 
34
- const Middle = forwardRef<HTMLDivElement, SlottableProps<HTMLDivElement>>(
35
- ({ children, asChild, ...props }, forwardedRef) => {
36
- const Comp = asChild ? Slot : Primitive.div;
37
- return (
38
- <Comp {...composableProps<HTMLDivElement>(props, { role: 'none' })} ref={forwardedRef}>
39
- {children}
40
- </Comp>
41
- );
42
- },
43
- );
44
-
45
- const Leaf = forwardRef<HTMLButtonElement, ComposableProps<HTMLButtonElement>>(
46
- ({ children, ...props }, forwardedRef) => {
47
- return (
48
- <button {...composableProps<HTMLButtonElement>(props, { role: 'none' })} ref={forwardedRef}>
49
- {children}
50
- </button>
51
- );
52
- },
53
- );
54
-
55
- const TestSingle = (props: ThemedClassName<{ role?: string }>) => {
37
+ const Middle = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
38
+ const Comp = asChild ? Slot : Primitive.div;
56
39
  return (
57
- <Outer asChild {...composableProps<HTMLDivElement>(props, { role: 'none' })}>
58
- <Leaf>Single asChild (non-compliant see console)</Leaf>
59
- </Outer>
40
+ <Comp
41
+ {...composableProps<HTMLDivElement>(props, { classNames: 'p-2 border border-red-500 rounded' })}
42
+ ref={forwardedRef}
43
+ >
44
+ {children}
45
+ </Comp>
60
46
  );
61
- };
47
+ });
62
48
 
63
- const TestNested = (props: ThemedClassName<{ role?: string }>) => {
49
+ const Leaf = composable<HTMLButtonElement>(({ children, ...props }, forwardedRef) => {
64
50
  return (
65
- <Outer asChild {...composableProps<HTMLDivElement>(props, { role: 'none' })}>
66
- <Middle asChild>
67
- <Leaf>Nested asChild</Leaf>
68
- </Middle>
69
- </Outer>
51
+ <button
52
+ {...composableProps<HTMLButtonElement>(props, { classNames: 'p-2 border border-red-500 rounded' })}
53
+ ref={forwardedRef}
54
+ >
55
+ {children}
56
+ </button>
70
57
  );
71
- };
58
+ });
72
59
 
73
- const TestInner = (props: ThemedClassName<{ role?: string }>) => {
74
- return (
75
- <Outer asChild {...composableProps<HTMLDivElement>(props, { role: 'none' })}>
76
- <Middle asChild>
77
- <Leaf>
78
- <div role='none'>Leaf</div>
79
- </Leaf>
80
- </Middle>
81
- </Outer>
82
- );
83
- };
60
+ /** This isn't a valid child for a `slottable` component. */
61
+ const Simple = ({ children, classNames }: ThemedClassName<PropsWithChildren>) => (
62
+ <div className={mx(classNames)}>{children}</div>
63
+ );
84
64
 
85
65
  const meta = {
86
66
  title: 'ui/react-ui-core/exemplars/slot',
@@ -95,13 +75,41 @@ export default meta;
95
75
  type Story = StoryObj<typeof meta>;
96
76
 
97
77
  export const Single: Story = {
98
- render: () => <TestSingle role='listitem' classNames='border-red-500' />,
78
+ render: () => (
79
+ <Outer asChild role='article' classNames='border-green-500' priority={1}>
80
+ <Leaf>Single asChild (non-compliant — see console)</Leaf>
81
+ </Outer>
82
+ ),
99
83
  };
100
84
 
101
85
  export const Nested: Story = {
102
- render: () => <TestNested role='listitem' classNames='border-green-500' />,
86
+ render: () => (
87
+ <Outer asChild role='article' classNames='border-blue-500'>
88
+ <Middle asChild>
89
+ <Leaf>Nested asChild</Leaf>
90
+ </Middle>
91
+ </Outer>
92
+ ),
103
93
  };
104
94
 
105
95
  export const Inner: Story = {
106
- render: () => <TestInner role='listitem' classNames='border-blue-500' />,
96
+ render: () => (
97
+ <Outer asChild role='article' classNames='border-orange-500'>
98
+ <Middle asChild>
99
+ <Leaf>
100
+ <div>Leaf</div>
101
+ </Leaf>
102
+ </Middle>
103
+ </Outer>
104
+ ),
105
+ };
106
+
107
+ export const Error: Story = {
108
+ render: () => (
109
+ <Outer asChild role='none' classNames='p-2 border border-green-500 rounded'>
110
+ <Middle asChild>
111
+ <Simple>Simple</Simple>
112
+ </Middle>
113
+ </Outer>
114
+ ),
107
115
  };
@@ -43,7 +43,7 @@ const Column = forwardRef<HTMLDivElement, { items: string[] }>(({ items }, ref)
43
43
  const tabsterAttrs = useMergedTabsterAttributes_unstable(focusableGroupAttrs, arrowNavigationAttrs);
44
44
 
45
45
  return (
46
- <ScrollArea.Root tabIndex={0} orientation='vertical' classNames={mx('w-[25rem]', border)}>
46
+ <ScrollArea.Root orientation='vertical' classNames={mx('w-[25rem]', border)}>
47
47
  <ScrollArea.Viewport {...tabsterAttrs} classNames='p-4 gap-4' ref={ref}>
48
48
  {items.map((item) => (
49
49
  <Item key={item} value={item} />
@@ -6,11 +6,11 @@ import { type Meta } from '@storybook/react-vite';
6
6
  import { useVirtualizer } from '@tanstack/react-virtual';
7
7
  import React, { useEffect, useMemo, useRef, useState } from 'react';
8
8
 
9
- import { faker } from '@dxos/random';
9
+ import { random } from '@dxos/random';
10
10
  import { Panel, ScrollArea, Toolbar } from '@dxos/react-ui';
11
11
  import { withLayout, withTheme } from '@dxos/react-ui/testing';
12
12
 
13
- faker.seed(999);
13
+ random.seed(999);
14
14
 
15
15
  type TestItem = {
16
16
  name: string;
@@ -37,7 +37,7 @@ export const Default = {
37
37
  const items = useMemo<TestItem[]>(
38
38
  () =>
39
39
  Array.from({ length: NUM_ITEMS }, () => ({
40
- name: faker.lorem.paragraph(),
40
+ name: random.lorem.paragraph(),
41
41
  })),
42
42
  [],
43
43
  );
@@ -63,10 +63,9 @@ export const Default = {
63
63
  <ScrollToolbar items={items} index={index} setIndex={setIndex} />
64
64
  </Panel.Toolbar>
65
65
  <Panel.Content asChild>
66
- <ScrollArea.Root orientation='vertical' margin>
66
+ <ScrollArea.Root orientation='vertical' centered>
67
67
  <ScrollArea.Viewport classNames='p-2' ref={setViewport}>
68
68
  <div
69
- role='none'
70
69
  style={{
71
70
  position: 'relative',
72
71
  height: virtualizer.getTotalSize(),
@@ -8,7 +8,7 @@ import { type Density } from '@dxos/ui-types';
8
8
 
9
9
  import { DensityContext } from '../components';
10
10
 
11
- export const useDensityContext = (propsDensity?: Density) => {
11
+ export const useDensityContext = (densityProp?: Density): Density | undefined => {
12
12
  const { density } = useContext(DensityContext);
13
- return propsDensity ?? density;
13
+ return densityProp ?? density;
14
14
  };
@@ -20,15 +20,14 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
20
20
  </Button>
21
21
  </div>
22
22
  <div className='flex justify-center'>
23
- <IconButton {...args} label='Test' icon='ph--atom--regular' size={7} density='coarse' />
23
+ <IconButton {...args} label='Test' icon='ph--circle--regular' density='coarse' />
24
24
  </div>
25
25
  <div className='flex justify-center'>
26
26
  <IconButton
27
27
  {...args}
28
28
  label='Test'
29
- icon='ph--atom--regular'
29
+ icon='ph--circle--regular'
30
30
  iconOnly
31
- size={6}
32
31
  density='coarse'
33
32
  classNames='px-1.5'
34
33
  />
@@ -43,13 +42,13 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
43
42
  </Button>
44
43
  </div>
45
44
  <div className='flex justify-center'>
46
- <IconButton {...args} label='Test' icon='ph--atom--regular' density='fine' classNames='px-2' />
45
+ <IconButton {...args} label='Test' icon='ph--circle--regular' density='fine' classNames='px-2' />
47
46
  </div>
48
47
  <div className='flex justify-center'>
49
48
  <IconButton
50
49
  {...args}
51
50
  label='Test'
52
- icon='ph--atom--regular'
51
+ icon='ph--circle--regular'
53
52
  iconOnly
54
53
  density='fine'
55
54
  classNames='py-1 px-1.5'
@@ -68,9 +67,8 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
68
67
  <IconButton
69
68
  {...args}
70
69
  label='Test'
71
- icon='ph--atom--regular'
70
+ icon='ph--circle--regular'
72
71
  density='fine'
73
- size={4}
74
72
  classNames={'!h-[24px] !text-[14px] p-1 min-h-0 gap-0.5'}
75
73
  />
76
74
  </div>
@@ -78,10 +76,9 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
78
76
  <IconButton
79
77
  {...args}
80
78
  label='Test'
81
- icon='ph--atom--regular'
79
+ icon='ph--circle--regular'
82
80
  iconOnly
83
81
  density='fine'
84
- size={4}
85
82
  classNames={'!h-[24px] !text-[14px] p-1 min-h-0'}
86
83
  />
87
84
  </div>