@dxos/react-ui 0.8.4-main.72ec0f3 → 0.8.4-main.765dc60934

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 (420) 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-BDBC6H6V.mjs +848 -0
  6. package/dist/lib/browser/chunk-BDBC6H6V.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +4388 -67
  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 +85 -67
  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-3JSJK2ZY.mjs +850 -0
  15. package/dist/lib/node-esm/chunk-3JSJK2ZY.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 +4388 -67
  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 +85 -67
  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 +3 -3
  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 +3 -1
  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 +10 -10
  43. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -1
  44. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +6 -6
  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 +1 -1
  61. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  62. package/dist/types/src/components/Dialog/AlertDialog.d.ts +43 -23
  63. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  64. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  65. package/dist/types/src/components/Dialog/Dialog.d.ts +56 -23
  66. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  67. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +10 -10
  68. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  69. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  70. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  71. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  72. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  73. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  74. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  75. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +19 -0
  76. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  77. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  78. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  79. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  80. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  81. package/dist/types/src/components/Focus/Focus.d.ts +36 -0
  82. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -0
  83. package/dist/types/src/components/Focus/Focus.stories.d.ts +9 -0
  84. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -0
  85. package/dist/types/src/components/Focus/index.d.ts +2 -0
  86. package/dist/types/src/components/Focus/index.d.ts.map +1 -0
  87. package/dist/types/src/components/Icon/Icon.d.ts +5 -1
  88. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  89. package/dist/types/src/components/Icon/Icon.stories.d.ts +11 -3
  90. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  91. package/dist/types/src/components/Image/Image.d.ts +15 -0
  92. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  93. package/dist/types/src/components/Image/Image.stories.d.ts +34 -0
  94. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  95. package/dist/types/src/components/Image/index.d.ts +2 -0
  96. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  97. package/dist/types/src/components/Input/Input.d.ts +19 -22
  98. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  99. package/dist/types/src/components/Input/Input.stories.d.ts +8 -8
  100. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  101. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  102. package/dist/types/src/components/List/List.d.ts +6 -4
  103. package/dist/types/src/components/List/List.d.ts.map +1 -1
  104. package/dist/types/src/components/List/List.stories.d.ts +3 -1
  105. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  106. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -1
  107. package/dist/types/src/components/List/Tree.d.ts +2 -2
  108. package/dist/types/src/components/List/Tree.d.ts.map +1 -1
  109. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
  110. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -1
  111. package/dist/types/src/components/List/Treegrid.d.ts +5 -9
  112. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  113. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
  114. package/dist/types/src/components/Main/Main.d.ts +16 -13
  115. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  116. package/dist/types/src/components/Main/Main.stories.d.ts +0 -3
  117. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  118. package/dist/types/src/components/Main/useSwipeToDismiss.d.ts.map +1 -1
  119. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +30 -0
  120. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -0
  121. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts +15 -0
  122. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts.map +1 -0
  123. package/dist/types/src/components/MediaPlayer/index.d.ts +2 -0
  124. package/dist/types/src/components/MediaPlayer/index.d.ts.map +1 -0
  125. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  126. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  127. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  128. package/dist/types/src/components/Menu/DropdownMenu.d.ts +121 -0
  129. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  130. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +28 -0
  131. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  132. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  133. package/dist/types/src/components/Message/Message.d.ts +2 -2
  134. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  135. package/dist/types/src/components/Message/Message.stories.d.ts +5 -6
  136. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  137. package/dist/types/src/components/Popover/Popover.d.ts +40 -23
  138. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  139. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  140. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +27 -27
  141. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  142. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +57 -8
  143. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  144. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +45 -14
  145. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  146. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +10 -5
  147. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  148. package/dist/types/src/components/Select/Select.d.ts +9 -9
  149. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  150. package/dist/types/src/components/Select/Select.stories.d.ts +2 -2
  151. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  152. package/dist/types/src/components/Separator/Separator.d.ts +4 -4
  153. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  154. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  155. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  156. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  157. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  158. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  159. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  160. package/dist/types/src/components/Splitter/Splitter.d.ts +34 -0
  161. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  162. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  163. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  164. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  165. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  166. package/dist/types/src/components/Status/Status.d.ts +3 -4
  167. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  168. package/dist/types/src/components/Status/Status.stories.d.ts +4 -2
  169. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  170. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  171. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  172. package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
  173. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  174. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +3 -3
  175. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  176. package/dist/types/src/components/{Menus/DropdownMenu.stories.d.ts → ThemeProvider/ThemeProvider.stories.d.ts} +2 -5
  177. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  178. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +55 -63
  179. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  180. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  181. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  182. package/dist/types/src/components/Toast/Toast.d.ts +20 -20
  183. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  184. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  185. package/dist/types/src/components/Toolbar/Toolbar.d.ts +39 -21
  186. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  187. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  188. package/dist/types/src/components/Tooltip/Tooltip.d.ts +10 -10
  189. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  190. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +2 -2
  191. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  192. package/dist/types/src/components/index.d.ts +12 -5
  193. package/dist/types/src/components/index.d.ts.map +1 -1
  194. package/dist/types/src/exemplars/generics.stories.d.ts +19 -0
  195. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  196. package/dist/types/src/exemplars/slot.stories.d.ts +15 -0
  197. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  198. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  199. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  200. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  201. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  202. package/dist/types/src/hooks/index.d.ts +1 -0
  203. package/dist/types/src/hooks/index.d.ts.map +1 -1
  204. package/dist/types/src/hooks/useDensityContext.d.ts +2 -2
  205. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  206. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  207. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  208. package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
  209. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  210. package/dist/types/src/hooks/useSafeCollisionPadding.d.ts.map +1 -1
  211. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  212. package/dist/types/src/index.d.ts +2 -1
  213. package/dist/types/src/index.d.ts.map +1 -1
  214. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  215. package/dist/types/src/playground/Custom.stories.d.ts +1 -1
  216. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  217. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  218. package/dist/types/src/primitives/Column/Column.d.ts +33 -0
  219. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  220. package/dist/types/src/primitives/Column/Column.stories.d.ts +25 -0
  221. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  222. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  223. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  224. package/dist/types/src/primitives/Container/Container.d.ts +7 -0
  225. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  226. package/dist/types/src/primitives/Container/Container.stories.d.ts +6 -0
  227. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  228. package/dist/types/src/primitives/Container/index.d.ts +2 -0
  229. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  230. package/dist/types/src/primitives/Flex/Flex.d.ts +11 -0
  231. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  232. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  233. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  234. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  235. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  236. package/dist/types/src/primitives/Grid/Grid.d.ts +10 -0
  237. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  238. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  239. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  240. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  241. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  242. package/dist/types/src/primitives/Panel/Panel.d.ts +35 -0
  243. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  244. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  245. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  246. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  247. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  248. package/dist/types/src/primitives/index.d.ts +6 -0
  249. package/dist/types/src/primitives/index.d.ts.map +1 -0
  250. package/dist/types/src/testing/Loading.d.ts +9 -0
  251. package/dist/types/src/testing/Loading.d.ts.map +1 -0
  252. package/dist/types/src/testing/decorators/withLayout.d.ts +3 -3
  253. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  254. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +1 -1
  255. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  256. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  257. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  258. package/dist/types/src/testing/index.d.ts +1 -0
  259. package/dist/types/src/testing/index.d.ts.map +1 -1
  260. package/dist/types/src/translations.d.ts +16 -0
  261. package/dist/types/src/translations.d.ts.map +1 -0
  262. package/dist/types/src/util/index.d.ts +1 -2
  263. package/dist/types/src/util/index.d.ts.map +1 -1
  264. package/dist/types/src/util/usePx.d.ts.map +1 -1
  265. package/dist/types/tsconfig.tsbuildinfo +1 -1
  266. package/package.json +52 -40
  267. package/src/components/Avatars/Avatar.stories.tsx +7 -9
  268. package/src/components/Avatars/Avatar.tsx +7 -15
  269. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -3
  270. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +3 -4
  271. package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
  272. package/src/components/Button/Button.stories.tsx +3 -4
  273. package/src/components/Button/Button.tsx +12 -26
  274. package/src/components/Button/IconButton.stories.tsx +8 -6
  275. package/src/components/Button/IconButton.tsx +10 -6
  276. package/src/components/Button/Toggle.stories.tsx +2 -3
  277. package/src/components/Button/Toggle.tsx +4 -4
  278. package/src/components/Button/ToggleGroup.stories.tsx +2 -3
  279. package/src/components/Button/ToggleGroup.tsx +12 -16
  280. package/src/components/Card/Card.stories.tsx +151 -0
  281. package/src/components/Card/Card.tsx +514 -0
  282. package/src/components/Card/index.ts +5 -0
  283. package/src/components/Carousel/Carousel.tsx +339 -0
  284. package/src/components/Carousel/index.ts +5 -0
  285. package/src/components/Clipboard/CopyButton.tsx +9 -10
  286. package/src/components/DensityProvider/DensityProvider.tsx +1 -1
  287. package/src/components/Dialog/AlertDialog.stories.tsx +16 -17
  288. package/src/components/Dialog/AlertDialog.tsx +123 -82
  289. package/src/components/Dialog/Dialog.stories.tsx +138 -28
  290. package/src/components/Dialog/Dialog.tsx +197 -71
  291. package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
  292. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +45 -0
  293. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  294. package/src/components/ErrorFallback/ErrorStack.tsx +114 -0
  295. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  296. package/src/components/ErrorFallback/index.ts +9 -0
  297. package/src/components/Focus/AUDIT.md +43 -0
  298. package/src/components/Focus/Focus.stories.tsx +230 -0
  299. package/src/components/Focus/Focus.tsx +201 -0
  300. package/src/components/Focus/index.ts +5 -0
  301. package/src/components/Icon/Icon.stories.tsx +45 -15
  302. package/src/components/Icon/Icon.tsx +15 -4
  303. package/src/components/Image/Image.stories.tsx +86 -0
  304. package/src/components/Image/Image.tsx +246 -0
  305. package/src/components/Image/index.ts +5 -0
  306. package/src/components/Input/Input.stories.tsx +21 -41
  307. package/src/components/Input/Input.tsx +38 -74
  308. package/src/components/Link/Link.stories.tsx +2 -3
  309. package/src/components/Link/Link.tsx +2 -2
  310. package/src/components/List/List.stories.tsx +31 -35
  311. package/src/components/List/List.tsx +17 -21
  312. package/src/components/List/ListDropIndicator.tsx +7 -8
  313. package/src/components/List/Tree.stories.tsx +6 -7
  314. package/src/components/List/Tree.tsx +0 -1
  315. package/src/components/List/TreeDropIndicator.tsx +6 -6
  316. package/src/components/List/Treegrid.stories.tsx +29 -30
  317. package/src/components/List/Treegrid.tsx +23 -28
  318. package/src/components/Main/Main.stories.tsx +41 -24
  319. package/src/components/Main/Main.tsx +139 -83
  320. package/src/components/MediaPlayer/MediaPlayer.stories.tsx +42 -0
  321. package/src/components/MediaPlayer/MediaPlayer.tsx +97 -0
  322. package/src/components/MediaPlayer/index.ts +5 -0
  323. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +2 -3
  324. package/src/components/{Menus → Menu}/ContextMenu.tsx +9 -33
  325. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +2 -3
  326. package/src/components/{Menus → Menu}/DropdownMenu.tsx +119 -109
  327. package/src/components/Message/Message.stories.tsx +27 -13
  328. package/src/components/Message/Message.tsx +59 -33
  329. package/src/components/Popover/Popover.stories.tsx +7 -8
  330. package/src/components/Popover/Popover.tsx +97 -92
  331. package/src/components/ScrollArea/ScrollArea.stories.tsx +221 -36
  332. package/src/components/ScrollArea/ScrollArea.tsx +97 -79
  333. package/src/components/ScrollArea/index.ts +1 -1
  334. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +47 -25
  335. package/src/components/ScrollContainer/ScrollContainer.tsx +224 -110
  336. package/src/components/Select/Select.stories.tsx +7 -8
  337. package/src/components/Select/Select.tsx +11 -27
  338. package/src/components/Separator/Separator.tsx +5 -8
  339. package/src/components/Skeleton/Skeleton.stories.tsx +51 -0
  340. package/src/components/Skeleton/Skeleton.tsx +26 -0
  341. package/src/components/Skeleton/index.ts +5 -0
  342. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  343. package/src/components/Splitter/Splitter.tsx +127 -0
  344. package/src/components/Splitter/index.ts +5 -0
  345. package/src/components/Status/Status.stories.tsx +21 -18
  346. package/src/components/Status/Status.tsx +10 -7
  347. package/src/components/Tag/Tag.stories.tsx +6 -12
  348. package/src/components/Tag/Tag.tsx +3 -8
  349. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +31 -0
  350. package/src/components/ThemeProvider/ThemeProvider.tsx +10 -10
  351. package/src/components/ThemeProvider/TranslationsProvider.tsx +1 -16
  352. package/src/components/ThemeProvider/index.ts +3 -3
  353. package/src/components/Toast/Toast.stories.tsx +2 -3
  354. package/src/components/Toast/Toast.tsx +22 -41
  355. package/src/components/Toolbar/Toolbar.stories.tsx +2 -3
  356. package/src/components/Toolbar/Toolbar.tsx +188 -24
  357. package/src/components/Tooltip/Tooltip.stories.tsx +20 -19
  358. package/src/components/Tooltip/Tooltip.tsx +40 -38
  359. package/src/components/index.ts +13 -6
  360. package/src/exemplars/generics.stories.tsx +41 -0
  361. package/src/exemplars/slot.stories.tsx +115 -0
  362. package/src/exemplars/tabster.stories.tsx +127 -0
  363. package/src/exemplars/virtualizer.stories.tsx +136 -0
  364. package/src/hooks/index.ts +1 -0
  365. package/src/hooks/useDensityContext.ts +3 -3
  366. package/src/hooks/useElevationContext.ts +1 -1
  367. package/src/index.ts +2 -1
  368. package/src/playground/Controls.stories.tsx +3 -10
  369. package/src/playground/Custom.stories.tsx +15 -18
  370. package/src/playground/Typography.stories.tsx +3 -3
  371. package/src/primitives/Column/AUDIT.md +148 -0
  372. package/src/primitives/Column/Column.stories.tsx +181 -0
  373. package/src/primitives/Column/Column.tsx +165 -0
  374. package/src/primitives/Column/index.ts +5 -0
  375. package/src/primitives/Container/Container.stories.tsx +29 -0
  376. package/src/primitives/Container/Container.tsx +19 -0
  377. package/src/primitives/Container/index.ts +5 -0
  378. package/src/primitives/Flex/Flex.stories.tsx +57 -0
  379. package/src/primitives/Flex/Flex.tsx +27 -0
  380. package/src/primitives/Flex/index.ts +5 -0
  381. package/src/primitives/Grid/Grid.stories.tsx +56 -0
  382. package/src/primitives/Grid/Grid.tsx +30 -0
  383. package/src/primitives/Grid/index.ts +5 -0
  384. package/src/primitives/Panel/Panel.stories.tsx +68 -0
  385. package/src/primitives/Panel/Panel.tsx +120 -0
  386. package/src/primitives/Panel/index.ts +5 -0
  387. package/src/primitives/index.ts +9 -0
  388. package/src/testing/Loading.tsx +47 -0
  389. package/src/testing/decorators/withLayout.tsx +32 -21
  390. package/src/testing/decorators/withLayoutVariants.tsx +20 -23
  391. package/src/testing/decorators/withTheme.tsx +26 -20
  392. package/src/testing/index.ts +2 -0
  393. package/src/translations.ts +24 -0
  394. package/src/util/index.ts +2 -2
  395. package/src/util/usePx.ts +1 -0
  396. package/dist/lib/browser/chunk-53MI2QCM.mjs +0 -4707
  397. package/dist/lib/browser/chunk-53MI2QCM.mjs.map +0 -7
  398. package/dist/lib/node-esm/chunk-ID67AFFF.mjs +0 -4709
  399. package/dist/lib/node-esm/chunk-ID67AFFF.mjs.map +0 -7
  400. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  401. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  402. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  403. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  404. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  405. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  406. package/dist/types/src/components/Menus/DropdownMenu.d.ts +0 -113
  407. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  408. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  409. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  410. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  411. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  412. package/dist/types/src/util/domino.d.ts +0 -18
  413. package/dist/types/src/util/domino.d.ts.map +0 -1
  414. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
  415. package/src/components/AnchoredOverflow/index.ts +0 -5
  416. package/src/util/ThemedClassName.ts +0 -7
  417. package/src/util/domino.ts +0 -53
  418. /package/dist/types/src/components/{Menus → Menu}/ContextMenu.stories.d.ts +0 -0
  419. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  420. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -4,49 +4,32 @@
4
4
 
5
5
  import { Primitive } from '@radix-ui/react-primitive';
6
6
  import { Slot } from '@radix-ui/react-slot';
7
- import {
8
- ToastAction as ToastActionPrimitive,
9
- type ToastActionProps as ToastActionPrimitiveProps,
10
- ToastClose as ToastClosePrimitive,
11
- type ToastCloseProps as ToastClosePrimitiveProps,
12
- ToastDescription as ToastDescriptionPrimitive,
13
- type ToastDescriptionProps as ToastDescriptionPrimitiveProps,
14
- ToastProvider as ToastProviderPrimitive,
15
- type ToastProviderProps as ToastProviderPrimitiveProps,
16
- Root as ToastRootPrimitive,
17
- type ToastProps as ToastRootPrimitiveProps,
18
- ToastTitle as ToastTitlePrimitive,
19
- type ToastTitleProps as ToastTitlePrimitiveProps,
20
- ToastViewport as ToastViewportPrimitive,
21
- type ToastViewportProps as ToastViewportPrimitiveProps,
22
- } from '@radix-ui/react-toast';
7
+ import * as ToastPrimitive from '@radix-ui/react-toast';
23
8
  import React, { type ComponentPropsWithRef, type FunctionComponent, forwardRef } from 'react';
24
9
 
25
10
  import { useThemeContext } from '../../hooks';
26
11
  import { type ThemedClassName } from '../../util';
27
12
  import { ElevationProvider } from '../ElevationProvider';
28
13
 
29
- type ToastProviderProps = ToastProviderPrimitiveProps;
14
+ type ToastProviderProps = ToastPrimitive.ToastProviderProps;
30
15
 
31
- const ToastProvider: FunctionComponent<ToastProviderProps> = ToastProviderPrimitive;
16
+ const ToastProvider: FunctionComponent<ToastProviderProps> = ToastPrimitive.Provider;
32
17
 
33
- type ToastViewportProps = ThemedClassName<ToastViewportPrimitiveProps>;
18
+ type ToastViewportProps = ThemedClassName<ToastPrimitive.ToastViewportProps>;
34
19
 
35
20
  const ToastViewport = forwardRef<HTMLOListElement, ToastViewportProps>(({ classNames, ...props }, forwardedRef) => {
36
21
  const { tx } = useThemeContext();
37
- return (
38
- <ToastViewportPrimitive className={tx('toast.viewport', 'toast-viewport', {}, classNames)} ref={forwardedRef} />
39
- );
22
+ return <ToastPrimitive.Viewport {...props} className={tx('toast.viewport', {}, classNames)} ref={forwardedRef} />;
40
23
  });
41
24
 
42
- type ToastRootProps = ThemedClassName<ToastRootPrimitiveProps>;
25
+ type ToastRootProps = ThemedClassName<ToastPrimitive.ToastProps>;
43
26
 
44
27
  const ToastRoot = forwardRef<HTMLLIElement, ToastRootProps>(({ classNames, children, ...props }, forwardedRef) => {
45
28
  const { tx } = useThemeContext();
46
29
  return (
47
- <ToastRootPrimitive {...props} className={tx('toast.root', 'toast', {}, classNames)} ref={forwardedRef}>
30
+ <ToastPrimitive.Root {...props} className={tx('toast.root', {}, classNames)} ref={forwardedRef}>
48
31
  <ElevationProvider elevation='toast'>{children}</ElevationProvider>
49
- </ToastRootPrimitive>
32
+ </ToastPrimitive.Root>
50
33
  );
51
34
  });
52
35
 
@@ -54,29 +37,27 @@ type ToastBodyProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.div
54
37
 
55
38
  const ToastBody = forwardRef<HTMLDivElement, ToastBodyProps>(({ asChild, classNames, ...props }, forwardedRef) => {
56
39
  const { tx } = useThemeContext();
57
- const Root = asChild ? Slot : Primitive.div;
58
- return <Root {...props} className={tx('toast.body', 'toast__body', {}, classNames)} ref={forwardedRef} />;
40
+ const Comp = asChild ? Slot : Primitive.div;
41
+ return <Comp {...props} className={tx('toast.body', {}, classNames)} ref={forwardedRef} />;
59
42
  });
60
43
 
61
- type ToastTitleProps = ThemedClassName<ToastTitlePrimitiveProps>;
44
+ type ToastTitleProps = ThemedClassName<ToastPrimitive.ToastTitleProps>;
62
45
 
63
46
  const ToastTitle = forwardRef<HTMLHeadingElement, ToastTitleProps>(
64
47
  ({ asChild, classNames, ...props }, forwardedRef) => {
65
48
  const { tx } = useThemeContext();
66
- const Root = asChild ? Slot : ToastTitlePrimitive;
67
- return <Root {...props} className={tx('toast.title', 'toast__title', {}, classNames)} ref={forwardedRef} />;
49
+ const Comp = asChild ? Slot : ToastPrimitive.Title;
50
+ return <Comp {...props} className={tx('toast.title', {}, classNames)} ref={forwardedRef} />;
68
51
  },
69
52
  );
70
53
 
71
- type ToastDescriptionProps = ThemedClassName<ToastDescriptionPrimitiveProps>;
54
+ type ToastDescriptionProps = ThemedClassName<ToastPrimitive.ToastDescriptionProps>;
72
55
 
73
56
  const ToastDescription = forwardRef<HTMLParagraphElement, ToastDescriptionProps>(
74
57
  ({ asChild, classNames, ...props }, forwardedRef) => {
75
58
  const { tx } = useThemeContext();
76
- const Root = asChild ? Slot : ToastDescriptionPrimitive;
77
- return (
78
- <Root {...props} className={tx('toast.description', 'toast__description', {}, classNames)} ref={forwardedRef} />
79
- );
59
+ const Comp = asChild ? Slot : ToastPrimitive.Description;
60
+ return <Comp {...props} className={tx('toast.description', {}, classNames)} ref={forwardedRef} />;
80
61
  },
81
62
  );
82
63
 
@@ -85,18 +66,18 @@ type ToastActionsProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.
85
66
  const ToastActions = forwardRef<HTMLDivElement, ToastActionsProps>(
86
67
  ({ asChild, classNames, ...props }, forwardedRef) => {
87
68
  const { tx } = useThemeContext();
88
- const Root = asChild ? Slot : Primitive.div;
89
- return <Root {...props} className={tx('toast.actions', 'toast__actions', {}, classNames)} ref={forwardedRef} />;
69
+ const Comp = asChild ? Slot : Primitive.div;
70
+ return <Comp {...props} className={tx('toast.actions', {}, classNames)} ref={forwardedRef} />;
90
71
  },
91
72
  );
92
73
 
93
- type ToastActionProps = ToastActionPrimitiveProps;
74
+ type ToastActionProps = ToastPrimitive.ToastActionProps;
94
75
 
95
- const ToastAction: FunctionComponent<ToastActionProps> = ToastActionPrimitive;
76
+ const ToastAction: FunctionComponent<ToastActionProps> = ToastPrimitive.Action;
96
77
 
97
- type ToastCloseProps = ToastClosePrimitiveProps;
78
+ type ToastCloseProps = ToastPrimitive.ToastCloseProps;
98
79
 
99
- const ToastClose: FunctionComponent<ToastCloseProps> = ToastClosePrimitive;
80
+ const ToastClose: FunctionComponent<ToastCloseProps> = ToastPrimitive.Close;
100
81
 
101
82
  export const Toast = {
102
83
  Provider: ToastProvider,
@@ -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 = {};
@@ -69,10 +68,10 @@ const DefaultStory = (props: StorybookToolbarProps) => {
69
68
  };
70
69
 
71
70
  const meta = {
72
- title: 'ui/react-ui-core/Toolbar',
71
+ title: 'ui/react-ui-core/components/Toolbar',
73
72
  component: Toolbar as any,
74
73
  render: DefaultStory,
75
- decorators: [withTheme],
74
+ decorators: [withTheme()],
76
75
  } satisfies Meta<typeof DefaultStory>;
77
76
 
78
77
  export default meta;
@@ -2,12 +2,19 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import { Primitive } from '@radix-ui/react-primitive';
6
+ import { Slot } from '@radix-ui/react-slot';
5
7
  import type { ToggleGroupItemProps as ToggleGroupItemPrimitiveProps } from '@radix-ui/react-toggle-group';
6
8
  import * as ToolbarPrimitive from '@radix-ui/react-toolbar';
7
- import React, { Fragment, forwardRef } from 'react';
9
+ import React, { forwardRef } from 'react';
10
+ import { useTranslation } from 'react-i18next';
11
+
12
+ import { composable, composableProps, slottable, type ToolbarStyleProps } from '@dxos/ui-theme';
13
+ import { type SlottableProps } from '@dxos/ui-types';
14
+
15
+ import { translationKey } from '#translations';
8
16
 
9
17
  import { useThemeContext } from '../../hooks';
10
- import { type ThemedClassName } from '../../util';
11
18
  import {
12
19
  Button,
13
20
  ButtonGroup,
@@ -20,37 +27,57 @@ import {
20
27
  type ToggleProps,
21
28
  } from '../Button';
22
29
  import { Link, type LinkProps } from '../Link';
30
+ import { DropdownMenu } from '../Menu';
23
31
  import { Separator, type SeparatorProps } from '../Separator';
24
32
 
25
- type ToolbarRootProps = ThemedClassName<
26
- ToolbarPrimitive.ToolbarProps & {
27
- textBlockWidth?: boolean;
28
- layoutManaged?: boolean;
29
- disabled?: boolean;
30
- }
31
- >;
33
+ //
34
+ // Root
35
+ //
36
+
37
+ type ToolbarRootProps = ToolbarPrimitive.ToolbarProps & ToolbarStyleProps;
32
38
 
33
- const ToolbarRoot = forwardRef<HTMLDivElement, ToolbarRootProps>(
34
- ({ classNames, children, layoutManaged, textBlockWidth: textBlockWidthParam, disabled, ...props }, forwardedRef) => {
39
+ const ToolbarRoot = composable<HTMLDivElement, ToolbarRootProps>(
40
+ ({ children, density, disabled, layoutManaged, orientation, ...props }, forwardedRef) => {
41
+ const { className, role, ...rest } = composableProps(props);
35
42
  const { tx } = useThemeContext();
36
- const InnerRoot = textBlockWidthParam ? 'div' : Fragment;
37
- const innerRootProps = textBlockWidthParam
38
- ? { role: 'none', className: tx('toolbar.inner', 'toolbar', { layoutManaged }, classNames) }
39
- : {};
40
43
 
41
44
  return (
42
45
  <ToolbarPrimitive.Root
43
- {...props}
44
- data-arrow-keys={props.orientation === 'vertical' ? 'up down' : 'left right'}
45
- className={tx('toolbar.root', 'toolbar', { layoutManaged, disabled }, classNames)}
46
+ {...rest}
47
+ // Only pass role when explicitly set; radix provides role="toolbar" by default.
48
+ {...(role !== 'none' && { role })}
49
+ orientation={orientation}
50
+ data-arrow-keys={orientation === 'vertical' ? 'up down' : 'left right'}
51
+ className={tx('toolbar.root', { density, disabled, layoutManaged }, className)}
46
52
  ref={forwardedRef}
47
53
  >
48
- <InnerRoot {...innerRootProps}>{children}</InnerRoot>
54
+ {children}
49
55
  </ToolbarPrimitive.Root>
50
56
  );
51
57
  },
52
58
  );
53
59
 
60
+ //
61
+ // Text
62
+ //
63
+
64
+ type ToolbarTextProps = SlottableProps;
65
+
66
+ const ToolbarText = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
67
+ const { className, ...rest } = composableProps(props);
68
+ const Comp = asChild ? Slot : Primitive.div;
69
+ const { tx } = useThemeContext();
70
+ return (
71
+ <Comp {...rest} className={tx('toolbar.text', {}, className)} ref={forwardedRef}>
72
+ {children}
73
+ </Comp>
74
+ );
75
+ });
76
+
77
+ //
78
+ // Button
79
+ //
80
+
54
81
  type ToolbarButtonProps = ButtonProps;
55
82
 
56
83
  const ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>((props, forwardedRef) => {
@@ -61,12 +88,16 @@ const ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>((props,
61
88
  );
62
89
  });
63
90
 
91
+ //
92
+ // IconButton
93
+ //
94
+
64
95
  type ToolbarIconButtonProps = IconButtonProps;
65
96
 
66
97
  const ToolbarIconButton = forwardRef<HTMLButtonElement, ToolbarIconButtonProps>((props, forwardedRef) => {
67
98
  return (
68
99
  <ToolbarPrimitive.Button asChild>
69
- <IconButton {...props} ref={forwardedRef} />
100
+ <IconButton {...props} noTooltip ref={forwardedRef} />
70
101
  </ToolbarPrimitive.Button>
71
102
  );
72
103
  });
@@ -81,6 +112,10 @@ const ToolbarToggle = forwardRef<HTMLButtonElement, ToolbarToggleProps>((props,
81
112
  );
82
113
  });
83
114
 
115
+ //
116
+ // Link
117
+ //
118
+
84
119
  type ToolbarLinkProps = LinkProps;
85
120
 
86
121
  const ToolbarLink = forwardRef<HTMLAnchorElement, ToolbarLinkProps>((props, forwardedRef) => {
@@ -97,6 +132,10 @@ type ToolbarToggleGroupProps = (
97
132
  ) &
98
133
  ButtonGroupProps;
99
134
 
135
+ //
136
+ // ToggleGroup
137
+ //
138
+
100
139
  const ToolbarToggleGroup = forwardRef<HTMLDivElement, ToolbarToggleGroupProps>(
101
140
  ({ classNames, children, elevation, ...props }, forwardedRef) => {
102
141
  return (
@@ -122,22 +161,38 @@ const ToolbarToggleGroupItem = forwardRef<HTMLButtonElement, ToolbarToggleGroupI
122
161
  type ToolbarToggleGroupIconItemProps = Omit<ToggleGroupItemPrimitiveProps, 'className'> & IconButtonProps;
123
162
 
124
163
  const ToolbarToggleGroupIconItem = forwardRef<HTMLButtonElement, ToolbarToggleGroupIconItemProps>(
125
- ({ variant, density, elevation, classNames, icon, label, iconOnly, ...props }, forwardedRef) => {
164
+ ({ variant, density, elevation, classNames, icon, label, iconOnly, iconClassNames, ...props }, forwardedRef) => {
126
165
  return (
127
166
  <ToolbarPrimitive.ToolbarToggleItem {...props} asChild>
128
- <IconButton {...{ variant, density, elevation, classNames, icon, label, iconOnly }} ref={forwardedRef} />
167
+ <IconButton
168
+ {...{
169
+ variant,
170
+ density,
171
+ elevation,
172
+ classNames,
173
+ icon,
174
+ label,
175
+ iconOnly,
176
+ iconClassNames,
177
+ }}
178
+ ref={forwardedRef}
179
+ />
129
180
  </ToolbarPrimitive.ToolbarToggleItem>
130
181
  );
131
182
  },
132
183
  );
133
184
 
185
+ //
186
+ // Separator
187
+ //
188
+
134
189
  type ToolbarSeparatorProps = SeparatorProps & { variant?: 'gap' | 'line' };
135
190
 
136
191
  const ToolbarSeparator = forwardRef<HTMLDivElement, ToolbarSeparatorProps>(
137
- ({ variant = 'line', ...props }, forwardedRef) => {
192
+ ({ variant = 'gap', ...props }, forwardedRef) => {
138
193
  return variant === 'line' ? (
139
194
  <ToolbarPrimitive.Separator asChild>
140
- <Separator {...props} ref={forwardedRef} />
195
+ <Separator orientation='vertical' {...props} ref={forwardedRef} />
141
196
  </ToolbarPrimitive.Separator>
142
197
  ) : (
143
198
  <ToolbarPrimitive.Separator className='grow' ref={forwardedRef} />
@@ -145,8 +200,109 @@ const ToolbarSeparator = forwardRef<HTMLDivElement, ToolbarSeparatorProps>(
145
200
  },
146
201
  );
147
202
 
203
+ //
204
+ // DragHandle
205
+ //
206
+
207
+ type ToolbarDragHandleProps = { testId?: string; label?: string };
208
+
209
+ const ToolbarDragHandle = forwardRef<HTMLButtonElement, ToolbarDragHandleProps>(
210
+ ({ testId = 'drag-handle', label }, forwardedRef) => {
211
+ const { t } = useTranslation(translationKey);
212
+ return (
213
+ <ToolbarIconButton
214
+ data-testid={testId}
215
+ tabIndex={-1}
216
+ noTooltip
217
+ iconOnly
218
+ icon='ph--dots-six-vertical--regular'
219
+ variant='ghost'
220
+ label={label ?? t('toolbar-drag-handle.label')}
221
+ classNames='dx-focus-ring-none cursor-pointer'
222
+ disabled={!forwardedRef}
223
+ ref={forwardedRef}
224
+ />
225
+ );
226
+ },
227
+ );
228
+
229
+ //
230
+ // CloseIconButton
231
+ //
232
+
233
+ type ToolbarCloseIconButtonProps = { onClick?: () => void; label?: string };
234
+
235
+ const ToolbarCloseIconButton = forwardRef<HTMLButtonElement, ToolbarCloseIconButtonProps>(
236
+ ({ onClick, label }, forwardedRef) => {
237
+ const { t } = useTranslation(translationKey);
238
+
239
+ return (
240
+ <ToolbarIconButton
241
+ iconOnly
242
+ icon='ph--x--regular'
243
+ variant='ghost'
244
+ label={label ?? t('toolbar-close.label')}
245
+ classNames='cursor-pointer'
246
+ onClick={onClick}
247
+ ref={forwardedRef}
248
+ />
249
+ );
250
+ },
251
+ );
252
+
253
+ //
254
+ // Menu
255
+ //
256
+
257
+ type ToolbarMenuItem<T extends any | void = void> = {
258
+ label: string;
259
+ onClick: (context: T) => void;
260
+ };
261
+
262
+ type ToolbarMenuProps<T extends any | void = void> = {
263
+ context?: T;
264
+ items?: ToolbarMenuItem<T>[];
265
+ };
266
+
267
+ // TODO(burdon): Make slottable.
268
+ const ToolbarMenu = <T extends any | void = void>({ context, items }: ToolbarMenuProps<T>) => {
269
+ const { t } = useTranslation(translationKey);
270
+
271
+ return (
272
+ <DropdownMenu.Root>
273
+ <DropdownMenu.Trigger disabled={!items?.length} asChild>
274
+ <ToolbarIconButton
275
+ iconOnly
276
+ variant='ghost'
277
+ icon='ph--dots-three-vertical--regular'
278
+ label={t('toolbar-menu.label')}
279
+ />
280
+ </DropdownMenu.Trigger>
281
+ {(items?.length ?? 0) > 0 && (
282
+ <DropdownMenu.Portal>
283
+ <DropdownMenu.Content>
284
+ <DropdownMenu.Viewport>
285
+ {items?.map(({ label, onClick: onSelect }, index) => (
286
+ <DropdownMenu.Item key={index} onSelect={() => onSelect(context as T)}>
287
+ {label}
288
+ </DropdownMenu.Item>
289
+ ))}
290
+ </DropdownMenu.Viewport>
291
+ <DropdownMenu.Arrow />
292
+ </DropdownMenu.Content>
293
+ </DropdownMenu.Portal>
294
+ )}
295
+ </DropdownMenu.Root>
296
+ );
297
+ };
298
+
299
+ //
300
+ // Toolbar
301
+ //
302
+
148
303
  export const Toolbar = {
149
304
  Root: ToolbarRoot,
305
+ Text: ToolbarText,
150
306
  Button: ToolbarButton,
151
307
  IconButton: ToolbarIconButton,
152
308
  Link: ToolbarLink,
@@ -155,10 +311,14 @@ export const Toolbar = {
155
311
  ToggleGroupItem: ToolbarToggleGroupItem,
156
312
  ToggleGroupIconItem: ToolbarToggleGroupIconItem,
157
313
  Separator: ToolbarSeparator,
314
+ DragHandle: ToolbarDragHandle,
315
+ CloseIconButton: ToolbarCloseIconButton,
316
+ Menu: ToolbarMenu,
158
317
  };
159
318
 
160
319
  export type {
161
320
  ToolbarRootProps,
321
+ ToolbarTextProps,
162
322
  ToolbarButtonProps,
163
323
  ToolbarIconButtonProps,
164
324
  ToolbarLinkProps,
@@ -167,4 +327,8 @@ export type {
167
327
  ToolbarToggleGroupItemProps,
168
328
  ToolbarToggleGroupIconItemProps,
169
329
  ToolbarSeparatorProps,
330
+ ToolbarDragHandleProps,
331
+ ToolbarCloseIconButtonProps,
332
+ ToolbarMenuItem,
333
+ ToolbarMenuProps,
170
334
  };
@@ -5,35 +5,36 @@
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) => (
21
- <Tooltip.Provider defaultOpen={defaultOpen}>
22
- <div role='none' className='is-32'>
23
- {tooltips.map(({ label, content }, i) => (
24
- <Tooltip.Trigger asChild key={i} content={content} side='right'>
25
- <Button classNames='block is-full'>{label}</Button>
26
- </Tooltip.Trigger>
27
- ))}
28
- </div>
29
- </Tooltip.Provider>
30
- );
19
+ const DefaultStory = ({ tooltips, defaultOpen }: DefaultStoryProps) => {
20
+ return (
21
+ <Tooltip.Provider defaultOpen={defaultOpen}>
22
+ <div className='w-32'>
23
+ {tooltips.map(({ label, content }, i) => (
24
+ <Tooltip.Trigger asChild key={i} content={content} side='right'>
25
+ <Button classNames='block w-full'>{label}</Button>
26
+ </Tooltip.Trigger>
27
+ ))}
28
+ </div>
29
+ </Tooltip.Provider>
30
+ );
31
+ };
31
32
 
32
33
  const meta = {
33
- title: 'ui/react-ui-core/Tooltip',
34
+ title: 'ui/react-ui-core/components/Tooltip',
34
35
  component: Tooltip as any,
35
36
  render: DefaultStory,
36
- decorators: [withTheme],
37
+ decorators: [withTheme()],
37
38
  } satisfies Meta<typeof DefaultStory>;
38
39
 
39
40
  export default meta;
@@ -72,10 +73,10 @@ export const DefaultOpen: Story = {
72
73
  export const StressTest: Story = {
73
74
  args: {
74
75
  defaultOpen: true,
75
- tooltips: faker.helpers.multiple(
76
+ tooltips: random.helpers.multiple(
76
77
  () => ({
77
- label: faker.lorem.words(2),
78
- content: faker.lorem.words(5),
78
+ label: random.lorem.words(2),
79
+ content: random.lorem.words(5),
79
80
  }),
80
81
  { count: 32 },
81
82
  ),