@dxos/react-ui 0.8.4-main.ef1bc66f44 → 0.8.4-main.f466a3d56e

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 (376) 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-EJYV4HAH.mjs → chunk-LY5XDQR5.mjs} +189 -117
  6. package/dist/lib/browser/chunk-LY5XDQR5.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +3257 -2048
  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 +70 -41
  11. package/dist/lib/browser/testing/index.mjs.map +4 -4
  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-YTLZCZ2M.mjs → chunk-NGKLIKP3.mjs} +189 -117
  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 +3257 -2048
  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 +70 -41
  22. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  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 +2 -2
  32. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  33. package/dist/types/src/components/Button/Button.stories.d.ts +1 -1
  34. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -1
  35. package/dist/types/src/components/Button/IconButton.d.ts +1 -0
  36. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  37. package/dist/types/src/components/Button/IconButton.stories.d.ts +3 -0
  38. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
  39. package/dist/types/src/components/Button/Toggle.d.ts +2 -2
  40. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -1
  41. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
  42. package/dist/types/src/components/Button/ToggleGroup.d.ts +6 -6
  43. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -1
  44. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +2 -2
  45. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
  46. package/dist/types/src/components/Card/Card.d.ts +124 -0
  47. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  48. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  49. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  50. package/dist/types/src/components/Card/index.d.ts +2 -0
  51. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  52. package/dist/types/src/components/Carousel/Carousel.d.ts +90 -0
  53. package/dist/types/src/components/Carousel/Carousel.d.ts.map +1 -0
  54. package/dist/types/src/components/Carousel/index.d.ts +2 -0
  55. package/dist/types/src/components/Carousel/index.d.ts.map +1 -0
  56. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  57. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  58. package/dist/types/src/components/Clipboard/index.d.ts +10 -1
  59. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  60. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  61. package/dist/types/src/components/Dialog/AlertDialog.d.ts +43 -23
  62. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  63. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  64. package/dist/types/src/components/Dialog/Dialog.d.ts +48 -30
  65. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  66. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +6 -8
  67. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  68. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  69. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  70. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  71. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  72. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  73. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +19 -0
  74. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  75. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  76. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  77. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  78. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  79. package/dist/types/src/components/Focus/Focus.d.ts +36 -0
  80. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -0
  81. package/dist/types/src/components/Focus/Focus.stories.d.ts +9 -0
  82. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -0
  83. package/dist/types/src/components/Focus/index.d.ts +2 -0
  84. package/dist/types/src/components/Focus/index.d.ts.map +1 -0
  85. package/dist/types/src/components/Icon/Icon.d.ts +4 -0
  86. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  87. package/dist/types/src/components/Icon/Icon.stories.d.ts +11 -3
  88. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/Image/Image.d.ts +15 -0
  90. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  91. package/dist/types/src/components/Image/Image.stories.d.ts +34 -0
  92. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  93. package/dist/types/src/components/Image/index.d.ts +2 -0
  94. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  95. package/dist/types/src/components/Input/Input.d.ts +16 -22
  96. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  97. package/dist/types/src/components/Input/Input.stories.d.ts +6 -6
  98. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  99. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  100. package/dist/types/src/components/List/List.d.ts +5 -3
  101. package/dist/types/src/components/List/List.d.ts.map +1 -1
  102. package/dist/types/src/components/List/List.stories.d.ts +3 -1
  103. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  104. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -1
  105. package/dist/types/src/components/List/Tree.d.ts +2 -2
  106. package/dist/types/src/components/List/Tree.d.ts.map +1 -1
  107. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
  108. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -1
  109. package/dist/types/src/components/List/Treegrid.d.ts +5 -9
  110. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  111. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
  112. package/dist/types/src/components/Main/Main.d.ts +11 -7
  113. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  114. package/dist/types/src/components/Main/Main.stories.d.ts +0 -3
  115. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  116. package/dist/types/src/components/Main/useSwipeToDismiss.d.ts.map +1 -1
  117. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +46 -0
  118. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -0
  119. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts +16 -0
  120. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts.map +1 -0
  121. package/dist/types/src/components/MediaPlayer/index.d.ts +2 -0
  122. package/dist/types/src/components/MediaPlayer/index.d.ts.map +1 -0
  123. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -1
  124. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -1
  125. package/dist/types/src/components/Menu/DropdownMenu.d.ts +58 -49
  126. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
  127. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +14 -1
  128. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
  129. package/dist/types/src/components/Message/Message.d.ts +1 -1
  130. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  131. package/dist/types/src/components/Message/Message.stories.d.ts +4 -5
  132. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  133. package/dist/types/src/components/Popover/Popover.d.ts +39 -22
  134. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  135. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  136. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +12 -11
  137. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  138. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +21 -10
  139. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  140. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +42 -13
  141. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  142. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +9 -5
  143. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  144. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  145. package/dist/types/src/components/Select/Select.stories.d.ts +2 -2
  146. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  147. package/dist/types/src/components/Separator/Separator.d.ts +3 -3
  148. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  149. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -1
  150. package/dist/types/src/components/Splitter/Splitter.d.ts +23 -15
  151. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -1
  152. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -1
  153. package/dist/types/src/components/Status/Status.d.ts +3 -4
  154. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  155. package/dist/types/src/components/Status/Status.stories.d.ts +4 -2
  156. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  157. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  158. package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
  159. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  160. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +1 -1
  161. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  162. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts +12 -0
  163. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  164. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +54 -55
  165. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  166. package/dist/types/src/components/ThemeProvider/index.d.ts +1 -1
  167. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  168. package/dist/types/src/components/Toast/Toast.d.ts +16 -16
  169. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  170. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  171. package/dist/types/src/components/Toolbar/Toolbar.d.ts +32 -15
  172. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  173. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  174. package/dist/types/src/components/Tooltip/Tooltip.d.ts +16 -16
  175. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  176. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +2 -2
  177. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  178. package/dist/types/src/components/index.d.ts +9 -4
  179. package/dist/types/src/components/index.d.ts.map +1 -1
  180. package/dist/types/src/exemplars/generics.stories.d.ts +8 -6
  181. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -1
  182. package/dist/types/src/exemplars/slot.stories.d.ts +1 -0
  183. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -1
  184. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -1
  185. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  186. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  187. package/dist/types/src/hooks/index.d.ts +1 -0
  188. package/dist/types/src/hooks/index.d.ts.map +1 -1
  189. package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
  190. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  191. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  192. package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
  193. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  194. package/dist/types/src/hooks/useSafeCollisionPadding.d.ts.map +1 -1
  195. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  196. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  197. package/dist/types/src/playground/Custom.stories.d.ts +1 -1
  198. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  199. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  200. package/dist/types/src/primitives/Column/Column.d.ts +33 -0
  201. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  202. package/dist/types/src/primitives/Column/Column.stories.d.ts +25 -0
  203. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  204. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  205. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  206. package/dist/types/src/primitives/Container/Container.d.ts +6 -22
  207. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -1
  208. package/dist/types/src/primitives/Container/Container.stories.d.ts +2 -7
  209. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -1
  210. package/dist/types/src/primitives/Container/index.d.ts +0 -1
  211. package/dist/types/src/primitives/Container/index.d.ts.map +1 -1
  212. package/dist/types/src/primitives/Flex/Flex.d.ts +8 -5
  213. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -1
  214. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  215. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  216. package/dist/types/src/primitives/Grid/Grid.d.ts +10 -0
  217. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  218. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  219. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  220. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  221. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  222. package/dist/types/src/primitives/Panel/Panel.d.ts +35 -0
  223. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  224. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  225. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  226. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  227. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  228. package/dist/types/src/primitives/index.d.ts +3 -0
  229. package/dist/types/src/primitives/index.d.ts.map +1 -1
  230. package/dist/types/src/testing/Loading.d.ts +9 -0
  231. package/dist/types/src/testing/Loading.d.ts.map +1 -0
  232. package/dist/types/src/testing/decorators/withLayout.d.ts +1 -1
  233. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  234. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  235. package/dist/types/src/testing/decorators/withTheme.d.ts +1 -1
  236. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  237. package/dist/types/src/testing/index.d.ts +1 -0
  238. package/dist/types/src/testing/index.d.ts.map +1 -1
  239. package/dist/types/src/translations.d.ts +16 -0
  240. package/dist/types/src/translations.d.ts.map +1 -0
  241. package/dist/types/src/util/usePx.d.ts.map +1 -1
  242. package/dist/types/tsconfig.tsbuildinfo +1 -1
  243. package/package.json +34 -27
  244. package/src/components/Avatars/Avatar.stories.tsx +5 -7
  245. package/src/components/Avatars/Avatar.tsx +6 -14
  246. package/src/components/Avatars/AvatarGroup.stories.tsx +0 -1
  247. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -2
  248. package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
  249. package/src/components/Button/Button.stories.tsx +1 -2
  250. package/src/components/Button/Button.tsx +11 -25
  251. package/src/components/Button/IconButton.stories.tsx +6 -4
  252. package/src/components/Button/IconButton.tsx +3 -4
  253. package/src/components/Button/Toggle.stories.tsx +0 -1
  254. package/src/components/Button/Toggle.tsx +4 -4
  255. package/src/components/Button/ToggleGroup.stories.tsx +0 -1
  256. package/src/components/Button/ToggleGroup.tsx +12 -16
  257. package/src/components/Card/Card.stories.tsx +151 -0
  258. package/src/components/Card/Card.tsx +514 -0
  259. package/src/components/Card/index.ts +5 -0
  260. package/src/components/Carousel/Carousel.tsx +337 -0
  261. package/src/components/Carousel/index.ts +5 -0
  262. package/src/components/Clipboard/CopyButton.tsx +6 -7
  263. package/src/components/Dialog/AlertDialog.stories.tsx +14 -15
  264. package/src/components/Dialog/AlertDialog.tsx +123 -82
  265. package/src/components/Dialog/Dialog.stories.tsx +90 -14
  266. package/src/components/Dialog/Dialog.tsx +98 -113
  267. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +45 -0
  268. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  269. package/src/components/ErrorFallback/ErrorStack.tsx +114 -0
  270. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  271. package/src/components/ErrorFallback/index.ts +9 -0
  272. package/src/components/Focus/AUDIT.md +43 -0
  273. package/src/components/Focus/Focus.stories.tsx +230 -0
  274. package/src/components/Focus/Focus.tsx +201 -0
  275. package/src/components/Focus/index.ts +5 -0
  276. package/src/components/Icon/Icon.stories.tsx +43 -13
  277. package/src/components/Icon/Icon.tsx +14 -3
  278. package/src/components/Image/Image.stories.tsx +86 -0
  279. package/src/components/Image/Image.tsx +246 -0
  280. package/src/components/Image/index.ts +5 -0
  281. package/src/components/Input/Input.stories.tsx +17 -38
  282. package/src/components/Input/Input.tsx +27 -71
  283. package/src/components/Link/Link.stories.tsx +0 -1
  284. package/src/components/Link/Link.tsx +2 -2
  285. package/src/components/List/List.stories.tsx +14 -22
  286. package/src/components/List/List.tsx +16 -20
  287. package/src/components/List/ListDropIndicator.tsx +7 -8
  288. package/src/components/List/Tree.stories.tsx +4 -5
  289. package/src/components/List/Tree.tsx +0 -1
  290. package/src/components/List/TreeDropIndicator.tsx +6 -6
  291. package/src/components/List/Treegrid.stories.tsx +27 -28
  292. package/src/components/List/Treegrid.tsx +22 -27
  293. package/src/components/Main/Main.stories.tsx +3 -7
  294. package/src/components/Main/Main.tsx +57 -48
  295. package/src/components/MediaPlayer/MediaPlayer.stories.tsx +50 -0
  296. package/src/components/MediaPlayer/MediaPlayer.tsx +153 -0
  297. package/src/components/MediaPlayer/index.ts +5 -0
  298. package/src/components/Menu/ContextMenu.stories.tsx +0 -1
  299. package/src/components/Menu/ContextMenu.tsx +9 -33
  300. package/src/components/Menu/DropdownMenu.stories.tsx +0 -1
  301. package/src/components/Menu/DropdownMenu.tsx +58 -52
  302. package/src/components/Message/Message.stories.tsx +25 -11
  303. package/src/components/Message/Message.tsx +30 -29
  304. package/src/components/Popover/Popover.stories.tsx +5 -6
  305. package/src/components/Popover/Popover.tsx +62 -59
  306. package/src/components/ScrollArea/ScrollArea.stories.tsx +98 -39
  307. package/src/components/ScrollArea/ScrollArea.tsx +45 -33
  308. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +46 -25
  309. package/src/components/ScrollContainer/ScrollContainer.tsx +199 -92
  310. package/src/components/Select/Select.stories.tsx +5 -6
  311. package/src/components/Select/Select.tsx +11 -27
  312. package/src/components/Separator/Separator.tsx +5 -8
  313. package/src/components/Skeleton/Skeleton.stories.tsx +12 -13
  314. package/src/components/Skeleton/Skeleton.tsx +1 -1
  315. package/src/components/Splitter/Splitter.stories.tsx +47 -37
  316. package/src/components/Splitter/Splitter.tsx +44 -40
  317. package/src/components/Status/Status.stories.tsx +19 -16
  318. package/src/components/Status/Status.tsx +10 -7
  319. package/src/components/Tag/Tag.stories.tsx +3 -9
  320. package/src/components/Tag/Tag.tsx +2 -7
  321. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +31 -0
  322. package/src/components/ThemeProvider/ThemeProvider.tsx +8 -7
  323. package/src/components/ThemeProvider/index.ts +1 -1
  324. package/src/components/Toast/Toast.stories.tsx +0 -1
  325. package/src/components/Toast/Toast.tsx +22 -41
  326. package/src/components/Toolbar/Toolbar.stories.tsx +0 -1
  327. package/src/components/Toolbar/Toolbar.tsx +175 -30
  328. package/src/components/Tooltip/Tooltip.stories.tsx +18 -17
  329. package/src/components/Tooltip/Tooltip.tsx +32 -31
  330. package/src/components/index.ts +10 -5
  331. package/src/exemplars/generics.stories.tsx +12 -15
  332. package/src/exemplars/slot.stories.tsx +68 -61
  333. package/src/exemplars/tabster.stories.tsx +5 -5
  334. package/src/exemplars/virtualizer.stories.tsx +136 -0
  335. package/src/hooks/index.ts +1 -0
  336. package/src/hooks/useDensityContext.ts +2 -2
  337. package/src/playground/Controls.stories.tsx +0 -6
  338. package/src/playground/Custom.stories.tsx +13 -16
  339. package/src/playground/Typography.stories.tsx +1 -1
  340. package/src/primitives/Column/AUDIT.md +148 -0
  341. package/src/primitives/Column/Column.stories.tsx +181 -0
  342. package/src/primitives/Column/Column.tsx +165 -0
  343. package/src/primitives/Column/index.ts +5 -0
  344. package/src/primitives/Container/Container.stories.tsx +13 -51
  345. package/src/primitives/Container/Container.tsx +14 -77
  346. package/src/primitives/Container/index.ts +0 -1
  347. package/src/primitives/Flex/Flex.stories.tsx +57 -0
  348. package/src/primitives/Flex/Flex.tsx +20 -19
  349. package/src/primitives/Grid/Grid.stories.tsx +56 -0
  350. package/src/primitives/Grid/Grid.tsx +30 -0
  351. package/src/primitives/Grid/index.ts +5 -0
  352. package/src/primitives/Panel/Panel.stories.tsx +68 -0
  353. package/src/primitives/Panel/Panel.tsx +120 -0
  354. package/src/primitives/Panel/index.ts +5 -0
  355. package/src/primitives/index.ts +3 -0
  356. package/src/testing/Loading.tsx +47 -0
  357. package/src/testing/decorators/withLayout.tsx +15 -11
  358. package/src/testing/decorators/withLayoutVariants.tsx +18 -21
  359. package/src/testing/decorators/withTheme.tsx +10 -7
  360. package/src/testing/index.ts +2 -0
  361. package/src/translations.ts +24 -0
  362. package/src/util/usePx.ts +1 -0
  363. package/dist/lib/browser/chunk-EJYV4HAH.mjs.map +0 -7
  364. package/dist/lib/node-esm/chunk-YTLZCZ2M.mjs.map +0 -7
  365. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -22
  366. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  367. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  368. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  369. package/dist/types/src/primitives/Container/Layout.d.ts +0 -18
  370. package/dist/types/src/primitives/Container/Layout.d.ts.map +0 -1
  371. package/dist/types/src/primitives/Container/Layout.stories.d.ts +0 -10
  372. package/dist/types/src/primitives/Container/Layout.stories.d.ts.map +0 -1
  373. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -67
  374. package/src/components/AnchoredOverflow/index.ts +0 -5
  375. package/src/primitives/Container/Layout.stories.tsx +0 -57
  376. package/src/primitives/Container/Layout.tsx +0 -61
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- // This is based upon `@radix-ui/react-popover` fetched 25 Oct 2024 at https://github.com/radix-ui/primitives at commit 374c7d7.
5
+ // This is based upon `@radix-ui/react-popover` fetched Oct 25, 2024 at https://github.com/radix-ui/primitives at commit 374c7d7.
6
6
 
7
7
  import { composeEventHandlers } from '@radix-ui/primitive';
8
8
  import { useComposedRefs } from '@radix-ui/react-compose-refs';
@@ -23,9 +23,8 @@ import { hideOthers } from 'aria-hidden';
23
23
  import React, {
24
24
  type ComponentPropsWithRef,
25
25
  type ComponentPropsWithoutRef,
26
- type ElementRef,
26
+ type ComponentRef,
27
27
  type FC,
28
- type MutableRefObject,
29
28
  type ReactNode,
30
29
  type RefObject,
31
30
  forwardRef,
@@ -37,30 +36,31 @@ import React, {
37
36
  } from 'react';
38
37
  import { RemoveScroll } from 'react-remove-scroll';
39
38
 
40
- import { useElevationContext, useThemeContext } from '../../hooks';
41
- import { useSafeCollisionPadding } from '../../hooks/useSafeCollisionPadding';
39
+ import { useSafeCollisionPadding, useElevationContext, useThemeContext } from '../../hooks';
42
40
  import { type ThemedClassName } from '../../util';
43
41
 
44
42
  //
45
43
  // Context
46
44
  //
47
45
 
46
+ type ScopedProps<P> = P & { __scopePopover?: Scope };
47
+
48
48
  const POPOVER_NAME = 'Popover';
49
49
 
50
- type ScopedProps<P> = P & { __scopePopover?: Scope };
51
50
  const [createPopoverContext, createPopoverScope] = createContextScope(POPOVER_NAME, [createPopperScope]);
51
+
52
52
  const usePopperScope = createPopperScope();
53
53
 
54
54
  type PopoverContextValue = {
55
- triggerRef: MutableRefObject<HTMLButtonElement>;
55
+ triggerRef: RefObject<HTMLButtonElement>;
56
56
  contentId: string;
57
+ hasCustomAnchor: boolean;
58
+ modal: boolean;
57
59
  open: boolean;
58
60
  onOpenChange(open: boolean): void;
59
61
  onOpenToggle(): void;
60
- hasCustomAnchor: boolean;
61
62
  onCustomAnchorAdd(): void;
62
63
  onCustomAnchorRemove(): void;
63
- modal: boolean;
64
64
  };
65
65
 
66
66
  const [PopoverProvider, usePopoverContext] = createPopoverContext<PopoverContextValue>(POPOVER_NAME);
@@ -69,13 +69,13 @@ const [PopoverProvider, usePopoverContext] = createPopoverContext<PopoverContext
69
69
  // PopoverRoot
70
70
  //
71
71
 
72
- interface PopoverRootProps {
72
+ type PopoverRootProps = {
73
73
  children?: ReactNode;
74
74
  open?: boolean;
75
75
  defaultOpen?: boolean;
76
76
  onOpenChange?: (open: boolean) => void;
77
77
  modal?: boolean;
78
- }
78
+ };
79
79
 
80
80
  const PopoverRoot: FC<PopoverRootProps> = (props: ScopedProps<PopoverRootProps>) => {
81
81
  const { __scopePopover, children, open: openProp, defaultOpen, onOpenChange, modal = false } = props;
@@ -93,7 +93,7 @@ const PopoverRoot: FC<PopoverRootProps> = (props: ScopedProps<PopoverRootProps>)
93
93
  <PopoverProvider
94
94
  scope={__scopePopover}
95
95
  contentId={useId()}
96
- triggerRef={triggerRef as MutableRefObject<HTMLButtonElement>}
96
+ triggerRef={triggerRef as RefObject<HTMLButtonElement>}
97
97
  open={open}
98
98
  onOpenChange={setOpen}
99
99
  onOpenToggle={useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen])}
@@ -116,9 +116,9 @@ PopoverRoot.displayName = POPOVER_NAME;
116
116
 
117
117
  const ANCHOR_NAME = 'PopoverAnchor';
118
118
 
119
- type PopoverAnchorElement = ElementRef<typeof PopperPrimitive.Anchor>;
119
+ type PopoverAnchorElement = ComponentRef<typeof PopperPrimitive.Anchor>;
120
120
  type PopperAnchorProps = ComponentPropsWithoutRef<typeof PopperPrimitive.Anchor>;
121
- interface PopoverAnchorProps extends PopperAnchorProps {}
121
+ type PopoverAnchorProps = PopperAnchorProps;
122
122
 
123
123
  const PopoverAnchor = forwardRef<PopoverAnchorElement, PopoverAnchorProps>(
124
124
  (props: ScopedProps<PopoverAnchorProps>, forwardedRef) => {
@@ -144,19 +144,22 @@ PopoverAnchor.displayName = ANCHOR_NAME;
144
144
 
145
145
  const TRIGGER_NAME = 'PopoverTrigger';
146
146
 
147
- type PopoverTriggerElement = ElementRef<typeof Primitive.button>;
147
+ type PopoverTriggerElement = ComponentRef<typeof Primitive.button>;
148
148
  type PrimitiveButtonProps = ComponentPropsWithoutRef<typeof Primitive.button>;
149
- interface PopoverTriggerProps extends PrimitiveButtonProps {}
149
+ type PopoverTriggerProps = PrimitiveButtonProps & {
150
+ asChild?: boolean;
151
+ };
150
152
 
151
153
  const PopoverTrigger = forwardRef<PopoverTriggerElement, PopoverTriggerProps>(
152
154
  (props: ScopedProps<PopoverTriggerProps>, forwardedRef) => {
153
- const { __scopePopover, ...triggerProps } = props;
155
+ const { __scopePopover, asChild, ...triggerProps } = props;
154
156
  const context = usePopoverContext(TRIGGER_NAME, __scopePopover);
155
157
  const popperScope = usePopperScope(__scopePopover);
156
158
  const composedTriggerRef = useComposedRefs(forwardedRef, context.triggerRef);
159
+ const Comp = asChild ? Slot : Primitive.button;
157
160
 
158
161
  const trigger = (
159
- <Primitive.button
162
+ <Comp
160
163
  type='button'
161
164
  aria-haspopup='dialog'
162
165
  aria-expanded={context.open}
@@ -186,9 +189,9 @@ PopoverTrigger.displayName = TRIGGER_NAME;
186
189
 
187
190
  const VIRTUAL_TRIGGER_NAME = 'PopoverVirtualTrigger';
188
191
 
189
- interface PopoverVirtualTriggerProps {
192
+ type PopoverVirtualTriggerProps = {
190
193
  virtualRef: RefObject<PopoverTriggerElement | null>;
191
- }
194
+ };
192
195
 
193
196
  const PopoverVirtualTrigger = (props: ScopedProps<PopoverVirtualTriggerProps>) => {
194
197
  const { __scopePopover, virtualRef } = props;
@@ -216,7 +219,7 @@ const [PortalProvider, usePortalContext] = createPopoverContext<PortalContextVal
216
219
  });
217
220
 
218
221
  type PortalProps = ComponentPropsWithoutRef<typeof PortalPrimitive>;
219
- interface PopoverPortalProps {
222
+ type PopoverPortalProps = {
220
223
  children?: ReactNode;
221
224
  /**
222
225
  * Specify a container element to portal the content into.
@@ -227,9 +230,9 @@ interface PopoverPortalProps {
227
230
  * controlling animation with React animation libraries.
228
231
  */
229
232
  forceMount?: true;
230
- }
233
+ };
231
234
 
232
- const PopoverPortal: FC<PopoverPortalProps> = (props: ScopedProps<PopoverPortalProps>) => {
235
+ const PopoverPortal = (props: ScopedProps<PopoverPortalProps>) => {
233
236
  const { __scopePopover, forceMount, children, container } = props;
234
237
  const context = usePopoverContext(PORTAL_NAME, __scopePopover);
235
238
  return (
@@ -280,8 +283,10 @@ const PopoverContent = forwardRef<PopoverContentTypeElement, PopoverContentProps
280
283
  PopoverContent.displayName = CONTENT_NAME;
281
284
 
282
285
  type PopoverContentTypeElement = PopoverContentImplElement;
283
- export interface PopoverContentTypeProps
284
- extends Omit<PopoverContentImplProps, 'trapFocus' | 'disableOutsidePointerEvents'> {}
286
+ export interface PopoverContentTypeProps extends Omit<
287
+ PopoverContentImplProps,
288
+ 'trapFocus' | 'disableOutsidePointerEvents'
289
+ > {}
285
290
 
286
291
  const PopoverContentModal = forwardRef<PopoverContentTypeElement, PopoverContentTypeProps>(
287
292
  (props: ScopedProps<PopoverContentTypeProps>, forwardedRef) => {
@@ -303,8 +308,7 @@ const PopoverContentModal = forwardRef<PopoverContentTypeElement, PopoverContent
303
308
  <PopoverContentImpl
304
309
  {...props}
305
310
  ref={composedRefs}
306
- // we make sure we're not trapping once it's been closed
307
- // (closed !== unmounted when animating out)
311
+ // Make sure we're not trapping once it's been closed (closed !== unmounted when animating out).
308
312
  trapFocus={context.open}
309
313
  disableOutsidePointerEvents
310
314
  onCloseAutoFocus={composeEventHandlers(props.onCloseAutoFocus, (event) => {
@@ -393,32 +397,31 @@ const PopoverContentNonModal = forwardRef<PopoverContentTypeElement, PopoverCont
393
397
  },
394
398
  );
395
399
 
396
- type PopoverContentImplElement = ElementRef<typeof PopperPrimitive.Content>;
400
+ type PopoverContentImplElement = ComponentRef<typeof PopperPrimitive.Content>;
397
401
  type FocusScopeProps = ComponentPropsWithoutRef<typeof FocusScope>;
398
402
  type DismissableLayerProps = ComponentPropsWithoutRef<typeof DismissableLayer>;
399
403
  type PopperContentProps = ThemedClassName<ComponentPropsWithoutRef<typeof PopperPrimitive.Content>>;
400
404
 
401
- interface PopoverContentImplProps
402
- extends Omit<PopperContentProps, 'onPlaced'>,
403
- Omit<DismissableLayerProps, 'onDismiss'> {
404
- /**
405
- * Whether focus should be trapped within the `Popover`
406
- * (default: false)
407
- */
408
- trapFocus?: FocusScopeProps['trapped'];
409
-
410
- /**
411
- * Event handler called when auto-focusing on open.
412
- * Can be prevented.
413
- */
414
- onOpenAutoFocus?: FocusScopeProps['onMountAutoFocus'];
415
-
416
- /**
417
- * Event handler called when auto-focusing on close.
418
- * Can be prevented.
419
- */
420
- onCloseAutoFocus?: FocusScopeProps['onUnmountAutoFocus'];
421
- }
405
+ type PopoverContentImplProps = Omit<PopperContentProps, 'onPlaced'> &
406
+ Omit<DismissableLayerProps, 'onDismiss'> & {
407
+ /**
408
+ * Whether focus should be trapped within the `Popover`
409
+ * (default: false)
410
+ */
411
+ trapFocus?: FocusScopeProps['trapped'];
412
+
413
+ /**
414
+ * Event handler called when auto-focusing on open.
415
+ * Can be prevented.
416
+ */
417
+ onOpenAutoFocus?: FocusScopeProps['onMountAutoFocus'];
418
+
419
+ /**
420
+ * Event handler called when auto-focusing on close.
421
+ * Can be prevented.
422
+ */
423
+ onCloseAutoFocus?: FocusScopeProps['onUnmountAutoFocus'];
424
+ };
422
425
 
423
426
  const PopoverContentImpl = forwardRef<PopoverContentImplElement, PopoverContentImplProps>(
424
427
  (props: ScopedProps<PopoverContentImplProps>, forwardedRef) => {
@@ -485,7 +488,7 @@ const PopoverContentImpl = forwardRef<PopoverContentImplElement, PopoverContentI
485
488
  {...contentProps}
486
489
  collisionPadding={safeCollisionPadding}
487
490
  collisionBoundary={computedCollisionBoundary}
488
- className={tx('popover.content', 'popover', { elevation }, classNames)}
491
+ className={tx('popover.content', { elevation }, classNames)}
489
492
  ref={forwardedRef}
490
493
  style={{
491
494
  ...contentProps.style,
@@ -511,8 +514,8 @@ const PopoverContentImpl = forwardRef<PopoverContentImplElement, PopoverContentI
511
514
 
512
515
  const CLOSE_NAME = 'PopoverClose';
513
516
 
514
- type PopoverCloseElement = ElementRef<typeof Primitive.button>;
515
- interface PopoverCloseProps extends PrimitiveButtonProps {}
517
+ type PopoverCloseElement = ComponentRef<typeof Primitive.button>;
518
+ type PopoverCloseProps = PrimitiveButtonProps;
516
519
 
517
520
  const PopoverClose = forwardRef<PopoverCloseElement, PopoverCloseProps>(
518
521
  (props: ScopedProps<PopoverCloseProps>, forwardedRef) => {
@@ -537,9 +540,9 @@ PopoverClose.displayName = CLOSE_NAME;
537
540
 
538
541
  const ARROW_NAME = 'PopoverArrow';
539
542
 
540
- type PopoverArrowElement = ElementRef<typeof PopperPrimitive.Arrow>;
543
+ type PopoverArrowElement = ComponentRef<typeof PopperPrimitive.Arrow>;
541
544
  type PopperArrowProps = ThemedClassName<ComponentPropsWithoutRef<typeof PopperPrimitive.Arrow>>;
542
- interface PopoverArrowProps extends PopperArrowProps {}
545
+ type PopoverArrowProps = PopperArrowProps;
543
546
 
544
547
  const PopoverArrow = forwardRef<PopoverArrowElement, PopoverArrowProps>(
545
548
  (props: ScopedProps<PopoverArrowProps>, forwardedRef) => {
@@ -550,7 +553,7 @@ const PopoverArrow = forwardRef<PopoverArrowElement, PopoverArrowProps>(
550
553
  <PopperPrimitive.Arrow
551
554
  {...popperScope}
552
555
  {...arrowProps}
553
- className={tx('popover.arrow', 'popover__arrow', {}, classNames)}
556
+ className={tx('popover.arrow', {}, classNames)}
554
557
  ref={forwardedRef}
555
558
  />
556
559
  );
@@ -572,15 +575,15 @@ type PopoverViewportProps = ThemedClassName<ComponentPropsWithRef<typeof Primiti
572
575
  const PopoverViewport = forwardRef<HTMLDivElement, PopoverViewportProps>(
573
576
  ({ classNames, asChild, constrainInline = true, constrainBlock = true, children, ...props }, forwardedRef) => {
574
577
  const { tx } = useThemeContext();
575
- const Root = asChild ? Slot : Primitive.div;
578
+ const Comp = asChild ? Slot : Primitive.div;
576
579
  return (
577
- <Root
580
+ <Comp
578
581
  {...props}
579
- className={tx('popover.viewport', 'popover__viewport', { constrainInline, constrainBlock }, classNames)}
582
+ className={tx('popover.viewport', { constrainInline, constrainBlock }, classNames)}
580
583
  ref={forwardedRef}
581
584
  >
582
585
  {children}
583
- </Root>
586
+ </Comp>
584
587
  );
585
588
  },
586
589
  );
@@ -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='text-sm'>
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 = () => (
36
- <div className='flex gap-2 is-max'>
37
- {Array.from({ length: 50 }).map((_, index) => (
37
+ const Row = ({ items = 50 }: { items?: number }) => (
38
+ <div className='flex gap-2 w-max'>
39
+ {Array.from({ length: items }).map((_, index) => (
38
40
  <div
39
41
  key={index}
40
- className='shrink-0 bs-20 is-20 border border-separator rounded-md flex items-center justify-center text-sm'
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='bs-72 is-48 p-2 border border-separator rounded-md'>
56
+ <Container classNames='h-72 w-48'>
51
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='bs-72 is-48 p-2 border border-separator rounded-md'>
68
+ <Container classNames='h-72 w-48'>
63
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='is-96 p-2 border border-separator rounded-md'>
109
+ <Container classNames='w-96'>
75
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='is-96 p-2 border border-separator rounded-md'>
121
+ <Container classNames='w-96'>
87
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='bs-72 is-96 p-2 border border-separator rounded-md'>
99
- <ScrollArea.Root thin orientation='all'>
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) => (
@@ -104,7 +139,7 @@ export const Both = {
104
139
  {Array.from({ length: 50 }).map((_, colIndex) => (
105
140
  <div
106
141
  key={colIndex}
107
- className='shrink-0 bs-20 is-20 flex items-center justify-center text-sm border border-separator font-mono'
142
+ className='shrink-0 h-20 w-20 flex items-center justify-center text-sm border border-separator font-mono'
108
143
  >
109
144
  [{colIndex}:{rowIndex}]
110
145
  </div>
@@ -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,30 +184,30 @@ 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
138
197
  key={column.id}
139
- className='shrink-0 bs-full is-[16rem] grid grid-rows-[min-content_1fr_min-content] border border-separator'
198
+ className='shrink-0 h-full w-[16rem] grid grid-rows-[min-content_1fr_min-content] border border-separator'
140
199
  >
141
- <header className='flex shrink-0 p-2 border-be border-separator'>Column {column.id}</header>
200
+ <header className='flex shrink-0 p-2 border-b border-separator'>Column {column.id}</header>
142
201
  <ScrollArea.Root thin orientation='vertical'>
143
- <ScrollArea.Viewport classNames='plb-2 pli-2 gap-2'>
202
+ <ScrollArea.Viewport classNames='py-2 px-2 gap-2'>
144
203
  {Array.from({ length: column.count }, (_, i) => (
145
- <div key={i} role='listitem' className={`shrink-0 p-2 text-sm border border-separator rounded-sm`}>
204
+ <div key={i} role='listitem' className={`shrink-0 p-2 text-sm border border-separator rounded-xs`}>
146
205
  Item {i + 1}
147
206
  </div>
148
207
  ))}
149
208
  </ScrollArea.Viewport>
150
209
  </ScrollArea.Root>
151
- <footer className={`p-2 text-subdued border-bs border-separator`}>{column.count}</footer>
210
+ <footer className={`p-2 text-subdued border-t border-separator`}>{column.count}</footer>
152
211
  </section>
153
212
  ))}
154
213
  </ScrollArea.Viewport>
@@ -159,18 +218,18 @@ export const NestedScrollAreas = {
159
218
 
160
219
  export const NativeScroll = {
161
220
  render: () => (
162
- <div className='group bs-48 is-48 border border-separator'>
221
+ <div className='group h-48 w-48 border border-separator'>
163
222
  <div
164
223
  className={mx(
165
- 'group bs-full is-full overflow-y-scroll',
166
- '[&::-webkit-scrollbar]:is-3',
224
+ 'group h-full w-full overflow-y-scroll',
225
+ '[&::-webkit-scrollbar]:w-3',
167
226
  '[&::-webkit-scrollbar-thumb]:rounded-none',
168
- '[&::-webkit-scrollbar-track]:bg-scrollbarTrack',
169
- '[&::-webkit-scrollbar-thumb]:bg-scrollbarThumbSubdued',
170
- 'group-hover:[&::-webkit-scrollbar-thumb]:bg-scrollbarThumb',
227
+ '[&::-webkit-scrollbar-track]:bg-scrollbar-track',
228
+ '[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumbSubdued',
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
  ),
@@ -3,9 +3,12 @@
3
3
  //
4
4
 
5
5
  import { createContext } from '@radix-ui/react-context';
6
- import React, { type HTMLAttributes, forwardRef } from 'react';
6
+ import { Primitive } from '@radix-ui/react-primitive';
7
+ import { Slot } from '@radix-ui/react-slot';
8
+ import React, { CSSProperties, useMemo } from 'react';
7
9
 
8
- 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';
9
12
 
10
13
  import { useThemeContext } from '../../hooks';
11
14
 
@@ -21,7 +24,7 @@ type ScrollAreaContextType = {
21
24
  /** Hide scrollbars when not scrolling. */
22
25
  autoHide: boolean;
23
26
  /** Apply padding to opposite side of scrollbar. */
24
- margin?: boolean;
27
+ centered?: boolean;
25
28
  /** Apply padding. */
26
29
  padding: boolean;
27
30
  /** Use thin scrollbars. */
@@ -38,20 +41,19 @@ const [ScrollAreaProvider, useScrollAreaContext] = createContext<ScrollAreaConte
38
41
 
39
42
  const SCROLLAREA_ROOT_NAME = 'ScrollArea.Root';
40
43
 
41
- type ScrollAreaRootProps = SlottableProps<HTMLDivElement> & Partial<ScrollAreaContextType>;
44
+ type ScrollAreaRootProps = Partial<ScrollAreaContextType>;
42
45
 
43
46
  /**
44
47
  * ScrollArea provides native scrollbars with custom styling.
45
48
  */
46
- const ScrollAreaRoot = forwardRef<HTMLDivElement, ScrollAreaRootProps>(
49
+ const ScrollAreaRoot = slottable<HTMLDivElement, ScrollAreaRootProps>(
47
50
  (
48
51
  {
49
- className,
50
- classNames,
51
52
  children,
53
+ asChild,
52
54
  orientation = 'vertical',
53
55
  autoHide = true,
54
- margin = false,
56
+ centered = false,
55
57
  padding = false,
56
58
  thin = false,
57
59
  snap = false,
@@ -60,17 +62,18 @@ const ScrollAreaRoot = forwardRef<HTMLDivElement, ScrollAreaRootProps>(
60
62
  forwardedRef,
61
63
  ) => {
62
64
  const { tx } = useThemeContext();
63
- const options = { orientation, autoHide, margin, padding, thin, snap };
65
+ const { className, ...rest } = composableProps(props);
66
+ const Comp = asChild ? Slot : Primitive.div;
67
+ const options = useMemo(
68
+ () => ({ orientation, autoHide, centered, padding, thin, snap }),
69
+ [orientation, autoHide, centered, padding, thin, snap],
70
+ );
64
71
 
65
72
  return (
66
73
  <ScrollAreaProvider {...options}>
67
- <div
68
- {...props}
69
- className={tx('scrollArea.root', 'scroll-area', options, [className, classNames])}
70
- ref={forwardedRef}
71
- >
74
+ <Comp {...rest} className={tx('scrollArea.root', options, className)} ref={forwardedRef}>
72
75
  {children}
73
- </div>
76
+ </Comp>
74
77
  </ScrollAreaProvider>
75
78
  );
76
79
  },
@@ -84,24 +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
96
- {...props}
97
- className={tx('scrollArea.viewport', 'scroll-area__viewport', options, classNames)}
98
- ref={forwardedRef}
99
- >
100
- {children}
101
- </div>
102
- );
103
- },
104
- );
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
+ });
105
117
 
106
118
  ScrollAreaViewport.displayName = SCROLLAREA_VIEWPORT_NAME;
107
119