@dxos/react-ui 0.8.4-main.5ad4a44 → 0.8.4-main.60689f5b1c

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 (480) 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-LY5XDQR5.mjs +846 -0
  6. package/dist/lib/browser/chunk-LY5XDQR5.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +4425 -65
  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 +102 -56
  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-NGKLIKP3.mjs +848 -0
  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 +4425 -65
  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 +102 -56
  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/{Buttons → Button}/Button.d.ts +3 -3
  32. package/dist/types/src/components/Button/Button.d.ts.map +1 -0
  33. package/dist/types/src/components/{Buttons → Button}/Button.stories.d.ts +1 -1
  34. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -0
  35. package/dist/types/src/components/{Buttons → Button}/IconButton.d.ts +3 -2
  36. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -0
  37. package/dist/types/src/components/{Buttons → Button}/IconButton.stories.d.ts +3 -0
  38. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -0
  39. package/dist/types/src/components/{Buttons → Button}/Toggle.d.ts +2 -2
  40. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -0
  41. package/dist/types/src/components/Button/Toggle.stories.d.ts +16 -0
  42. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -0
  43. package/dist/types/src/components/Button/ToggleGroup.d.ts +27 -0
  44. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -0
  45. package/dist/types/src/components/{Buttons → Button}/ToggleGroup.stories.d.ts +6 -6
  46. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -0
  47. package/dist/types/src/components/Button/index.d.ts.map +1 -0
  48. package/dist/types/src/components/Card/Card.d.ts +124 -0
  49. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  50. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  51. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  52. package/dist/types/src/components/Card/index.d.ts +2 -0
  53. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  54. package/dist/types/src/components/Carousel/Carousel.d.ts +106 -0
  55. package/dist/types/src/components/Carousel/Carousel.d.ts.map +1 -0
  56. package/dist/types/src/components/Carousel/index.d.ts +2 -0
  57. package/dist/types/src/components/Carousel/index.d.ts.map +1 -0
  58. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  59. package/dist/types/src/components/Clipboard/CopyButton.d.ts +1 -1
  60. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  61. package/dist/types/src/components/Clipboard/index.d.ts +10 -1
  62. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  63. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  64. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  65. package/dist/types/src/components/Dialog/AlertDialog.d.ts +51 -0
  66. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -0
  67. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -0
  68. package/dist/types/src/components/Dialog/Dialog.d.ts +64 -0
  69. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -0
  70. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +25 -0
  71. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -0
  72. package/dist/types/src/components/Dialog/index.d.ts.map +1 -0
  73. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  74. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  75. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  76. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  77. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  78. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  79. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +19 -0
  80. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  81. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  82. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  83. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  84. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  85. package/dist/types/src/components/Focus/Focus.d.ts +36 -0
  86. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -0
  87. package/dist/types/src/components/Focus/Focus.stories.d.ts +9 -0
  88. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -0
  89. package/dist/types/src/components/Focus/index.d.ts +2 -0
  90. package/dist/types/src/components/Focus/index.d.ts.map +1 -0
  91. package/dist/types/src/components/Icon/Icon.d.ts +5 -1
  92. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  93. package/dist/types/src/components/Icon/Icon.stories.d.ts +25 -0
  94. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -0
  95. package/dist/types/src/components/Image/Image.d.ts +15 -0
  96. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  97. package/dist/types/src/components/Image/Image.stories.d.ts +34 -0
  98. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  99. package/dist/types/src/components/Image/index.d.ts +2 -0
  100. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  101. package/dist/types/src/components/Input/Input.d.ts +19 -22
  102. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  103. package/dist/types/src/components/Input/Input.stories.d.ts +8 -8
  104. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  105. package/dist/types/src/components/Link/Link.d.ts.map +1 -1
  106. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  107. package/dist/types/src/components/{Lists → List}/List.d.ts +6 -4
  108. package/dist/types/src/components/List/List.d.ts.map +1 -0
  109. package/dist/types/src/components/{Lists → List}/List.stories.d.ts +3 -1
  110. package/dist/types/src/components/List/List.stories.d.ts.map +1 -0
  111. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -0
  112. package/dist/types/src/components/{Lists → List}/Tree.d.ts +2 -2
  113. package/dist/types/src/components/List/Tree.d.ts.map +1 -0
  114. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -0
  115. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -0
  116. package/dist/types/src/components/{Lists → List}/Treegrid.d.ts +5 -9
  117. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -0
  118. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -0
  119. package/dist/types/src/components/List/index.d.ts.map +1 -0
  120. package/dist/types/src/components/Main/Main.d.ts +24 -21
  121. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  122. package/dist/types/src/components/Main/Main.stories.d.ts +0 -3
  123. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  124. package/dist/types/src/components/Main/useSwipeToDismiss.d.ts.map +1 -1
  125. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +46 -0
  126. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -0
  127. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts +16 -0
  128. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts.map +1 -0
  129. package/dist/types/src/components/MediaPlayer/index.d.ts +2 -0
  130. package/dist/types/src/components/MediaPlayer/index.d.ts.map +1 -0
  131. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  132. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  133. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  134. package/dist/types/src/components/Menu/DropdownMenu.d.ts +121 -0
  135. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  136. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +28 -0
  137. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  138. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  139. package/dist/types/src/components/Message/Message.d.ts +2 -2
  140. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  141. package/dist/types/src/components/Message/Message.stories.d.ts +5 -6
  142. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  143. package/dist/types/src/components/Popover/Popover.d.ts +40 -23
  144. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  145. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  146. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +27 -27
  147. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  148. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +57 -8
  149. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  150. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +68 -0
  151. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -0
  152. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +23 -0
  153. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -0
  154. package/dist/types/src/components/ScrollContainer/index.d.ts +2 -0
  155. package/dist/types/src/components/ScrollContainer/index.d.ts.map +1 -0
  156. package/dist/types/src/components/Select/Select.d.ts +10 -10
  157. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  158. package/dist/types/src/components/Select/Select.stories.d.ts +2 -2
  159. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  160. package/dist/types/src/components/Separator/Separator.d.ts +4 -4
  161. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  162. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  163. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  164. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  165. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  166. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  167. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  168. package/dist/types/src/components/Splitter/Splitter.d.ts +34 -0
  169. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  170. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  171. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  172. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  173. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  174. package/dist/types/src/components/Status/Status.d.ts +3 -4
  175. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  176. package/dist/types/src/components/Status/Status.stories.d.ts +4 -2
  177. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  178. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  179. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  180. package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
  181. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  182. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +3 -3
  183. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  184. package/dist/types/src/components/{Menus/DropdownMenu.stories.d.ts → ThemeProvider/ThemeProvider.stories.d.ts} +2 -5
  185. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  186. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +55 -63
  187. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  188. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  189. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  190. package/dist/types/src/components/Toast/Toast.d.ts +20 -20
  191. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  192. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  193. package/dist/types/src/components/Toolbar/Toolbar.d.ts +41 -19
  194. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  195. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  196. package/dist/types/src/components/Tooltip/Tooltip.d.ts +16 -16
  197. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  198. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +2 -2
  199. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  200. package/dist/types/src/components/index.d.ts +16 -8
  201. package/dist/types/src/components/index.d.ts.map +1 -1
  202. package/dist/types/src/exemplars/generics.stories.d.ts +19 -0
  203. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  204. package/dist/types/src/exemplars/slot.stories.d.ts +15 -0
  205. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  206. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  207. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  208. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  209. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  210. package/dist/types/src/hooks/index.d.ts +1 -0
  211. package/dist/types/src/hooks/index.d.ts.map +1 -1
  212. package/dist/types/src/hooks/useDensityContext.d.ts +2 -2
  213. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  214. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  215. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  216. package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
  217. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  218. package/dist/types/src/hooks/useSafeCollisionPadding.d.ts.map +1 -1
  219. package/dist/types/src/hooks/useVisualViewport.d.ts +2 -2
  220. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  221. package/dist/types/src/index.d.ts +2 -1
  222. package/dist/types/src/index.d.ts.map +1 -1
  223. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  224. package/dist/types/src/playground/Custom.stories.d.ts +1 -1
  225. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  226. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  227. package/dist/types/src/primitives/Column/Column.d.ts +33 -0
  228. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  229. package/dist/types/src/primitives/Column/Column.stories.d.ts +25 -0
  230. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  231. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  232. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  233. package/dist/types/src/primitives/Container/Container.d.ts +7 -0
  234. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  235. package/dist/types/src/primitives/Container/Container.stories.d.ts +6 -0
  236. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  237. package/dist/types/src/primitives/Container/index.d.ts +2 -0
  238. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  239. package/dist/types/src/primitives/Flex/Flex.d.ts +11 -0
  240. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  241. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  242. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  243. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  244. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  245. package/dist/types/src/primitives/Grid/Grid.d.ts +10 -0
  246. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  247. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  248. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  249. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  250. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  251. package/dist/types/src/primitives/Panel/Panel.d.ts +35 -0
  252. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  253. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  254. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  255. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  256. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  257. package/dist/types/src/primitives/index.d.ts +6 -0
  258. package/dist/types/src/primitives/index.d.ts.map +1 -0
  259. package/dist/types/src/testing/Loading.d.ts +9 -0
  260. package/dist/types/src/testing/Loading.d.ts.map +1 -0
  261. package/dist/types/src/testing/decorators/index.d.ts +2 -1
  262. package/dist/types/src/testing/decorators/index.d.ts.map +1 -1
  263. package/dist/types/src/testing/decorators/withLayout.d.ts +15 -0
  264. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -0
  265. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +12 -0
  266. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -0
  267. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  268. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  269. package/dist/types/src/testing/index.d.ts +1 -0
  270. package/dist/types/src/testing/index.d.ts.map +1 -1
  271. package/dist/types/src/translations.d.ts +16 -0
  272. package/dist/types/src/translations.d.ts.map +1 -0
  273. package/dist/types/src/util/index.d.ts +1 -2
  274. package/dist/types/src/util/index.d.ts.map +1 -1
  275. package/dist/types/src/util/usePx.d.ts.map +1 -1
  276. package/dist/types/tsconfig.tsbuildinfo +1 -1
  277. package/package.json +53 -38
  278. package/src/components/Avatars/Avatar.stories.tsx +7 -9
  279. package/src/components/Avatars/Avatar.tsx +7 -15
  280. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -3
  281. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +4 -5
  282. package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
  283. package/src/components/{Buttons → Button}/Button.stories.tsx +4 -5
  284. package/src/components/{Buttons → Button}/Button.tsx +12 -26
  285. package/src/components/{Buttons → Button}/IconButton.stories.tsx +8 -6
  286. package/src/components/{Buttons → Button}/IconButton.tsx +20 -15
  287. package/src/components/{Buttons → Button}/Toggle.stories.tsx +7 -7
  288. package/src/components/{Buttons → Button}/Toggle.tsx +4 -4
  289. package/src/components/{Buttons → Button}/ToggleGroup.stories.tsx +2 -3
  290. package/src/components/{Buttons → Button}/ToggleGroup.tsx +12 -16
  291. package/src/components/Card/Card.stories.tsx +151 -0
  292. package/src/components/Card/Card.tsx +514 -0
  293. package/src/components/Card/index.ts +5 -0
  294. package/src/components/Carousel/Carousel.tsx +379 -0
  295. package/src/components/Carousel/index.ts +5 -0
  296. package/src/components/Clipboard/CopyButton.tsx +10 -11
  297. package/src/components/DensityProvider/DensityProvider.tsx +1 -1
  298. package/src/components/Dialog/AlertDialog.stories.tsx +68 -0
  299. package/src/components/{Dialogs → Dialog}/AlertDialog.tsx +123 -82
  300. package/src/components/Dialog/Dialog.stories.tsx +177 -0
  301. package/src/components/Dialog/Dialog.tsx +285 -0
  302. package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
  303. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +45 -0
  304. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  305. package/src/components/ErrorFallback/ErrorStack.tsx +114 -0
  306. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  307. package/src/components/ErrorFallback/index.ts +9 -0
  308. package/src/components/Focus/AUDIT.md +43 -0
  309. package/src/components/Focus/Focus.stories.tsx +230 -0
  310. package/src/components/Focus/Focus.tsx +201 -0
  311. package/src/components/Focus/index.ts +5 -0
  312. package/src/components/Icon/Icon.stories.tsx +143 -0
  313. package/src/components/Icon/Icon.tsx +15 -4
  314. package/src/components/Image/Image.stories.tsx +86 -0
  315. package/src/components/Image/Image.tsx +246 -0
  316. package/src/components/Image/index.ts +5 -0
  317. package/src/components/Input/Input.stories.tsx +21 -41
  318. package/src/components/Input/Input.tsx +38 -74
  319. package/src/components/Link/Link.stories.tsx +2 -3
  320. package/src/components/Link/Link.tsx +11 -3
  321. package/src/components/{Lists → List}/List.stories.tsx +31 -35
  322. package/src/components/{Lists → List}/List.tsx +17 -21
  323. package/src/components/{Lists → List}/ListDropIndicator.tsx +7 -8
  324. package/src/components/{Lists → List}/Tree.stories.tsx +6 -7
  325. package/src/components/{Lists → List}/Tree.tsx +0 -1
  326. package/src/components/{Lists → List}/TreeDropIndicator.tsx +6 -6
  327. package/src/components/{Lists → List}/Treegrid.stories.tsx +29 -30
  328. package/src/components/{Lists → List}/Treegrid.tsx +23 -28
  329. package/src/components/Main/Main.stories.tsx +41 -24
  330. package/src/components/Main/Main.tsx +150 -94
  331. package/src/components/MediaPlayer/MediaPlayer.stories.tsx +50 -0
  332. package/src/components/MediaPlayer/MediaPlayer.tsx +153 -0
  333. package/src/components/MediaPlayer/index.ts +5 -0
  334. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +2 -3
  335. package/src/components/{Menus → Menu}/ContextMenu.tsx +9 -33
  336. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +3 -4
  337. package/src/components/{Menus → Menu}/DropdownMenu.tsx +137 -110
  338. package/src/components/Message/Message.stories.tsx +27 -13
  339. package/src/components/Message/Message.tsx +59 -33
  340. package/src/components/Popover/Popover.stories.tsx +8 -9
  341. package/src/components/Popover/Popover.tsx +116 -94
  342. package/src/components/ScrollArea/ScrollArea.stories.tsx +221 -36
  343. package/src/components/ScrollArea/ScrollArea.tsx +97 -79
  344. package/src/components/ScrollArea/index.ts +1 -1
  345. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +91 -0
  346. package/src/components/ScrollContainer/ScrollContainer.tsx +345 -0
  347. package/src/components/ScrollContainer/index.ts +5 -0
  348. package/src/components/Select/Select.stories.tsx +8 -9
  349. package/src/components/Select/Select.tsx +11 -27
  350. package/src/components/Separator/Separator.tsx +5 -8
  351. package/src/components/Skeleton/Skeleton.stories.tsx +51 -0
  352. package/src/components/Skeleton/Skeleton.tsx +26 -0
  353. package/src/components/Skeleton/index.ts +5 -0
  354. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  355. package/src/components/Splitter/Splitter.tsx +127 -0
  356. package/src/components/Splitter/index.ts +5 -0
  357. package/src/components/Status/Status.stories.tsx +21 -18
  358. package/src/components/Status/Status.tsx +10 -7
  359. package/src/components/Tag/Tag.stories.tsx +6 -12
  360. package/src/components/Tag/Tag.tsx +3 -8
  361. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +31 -0
  362. package/src/components/ThemeProvider/ThemeProvider.tsx +10 -10
  363. package/src/components/ThemeProvider/TranslationsProvider.tsx +1 -16
  364. package/src/components/ThemeProvider/index.ts +3 -3
  365. package/src/components/Toast/Toast.stories.tsx +3 -4
  366. package/src/components/Toast/Toast.tsx +22 -41
  367. package/src/components/Toolbar/Toolbar.stories.tsx +4 -7
  368. package/src/components/Toolbar/Toolbar.tsx +188 -13
  369. package/src/components/Tooltip/Tooltip.stories.tsx +21 -20
  370. package/src/components/Tooltip/Tooltip.tsx +54 -51
  371. package/src/components/index.ts +17 -9
  372. package/src/exemplars/generics.stories.tsx +41 -0
  373. package/src/exemplars/slot.stories.tsx +115 -0
  374. package/src/exemplars/tabster.stories.tsx +127 -0
  375. package/src/exemplars/virtualizer.stories.tsx +136 -0
  376. package/src/hooks/index.ts +1 -0
  377. package/src/hooks/useDensityContext.ts +3 -3
  378. package/src/hooks/useElevationContext.ts +1 -1
  379. package/src/hooks/useSafeArea.ts +2 -2
  380. package/src/hooks/useVisualViewport.ts +3 -3
  381. package/src/index.ts +2 -1
  382. package/src/playground/Controls.stories.tsx +3 -10
  383. package/src/playground/Custom.stories.tsx +13 -18
  384. package/src/playground/Typography.stories.tsx +3 -3
  385. package/src/primitives/Column/AUDIT.md +148 -0
  386. package/src/primitives/Column/Column.stories.tsx +181 -0
  387. package/src/primitives/Column/Column.tsx +165 -0
  388. package/src/primitives/Column/index.ts +5 -0
  389. package/src/primitives/Container/Container.stories.tsx +29 -0
  390. package/src/primitives/Container/Container.tsx +19 -0
  391. package/src/primitives/Container/index.ts +5 -0
  392. package/src/primitives/Flex/Flex.stories.tsx +57 -0
  393. package/src/primitives/Flex/Flex.tsx +27 -0
  394. package/src/primitives/Flex/index.ts +5 -0
  395. package/src/primitives/Grid/Grid.stories.tsx +56 -0
  396. package/src/primitives/Grid/Grid.tsx +30 -0
  397. package/src/primitives/Grid/index.ts +5 -0
  398. package/src/primitives/Panel/Panel.stories.tsx +68 -0
  399. package/src/primitives/Panel/Panel.tsx +120 -0
  400. package/src/primitives/Panel/index.ts +5 -0
  401. package/src/primitives/index.ts +9 -0
  402. package/src/testing/Loading.tsx +47 -0
  403. package/src/testing/decorators/index.ts +2 -1
  404. package/src/testing/decorators/withLayout.tsx +67 -0
  405. package/src/testing/decorators/withLayoutVariants.tsx +48 -0
  406. package/src/testing/decorators/withTheme.tsx +26 -20
  407. package/src/testing/index.ts +2 -0
  408. package/src/translations.ts +24 -0
  409. package/src/util/index.ts +2 -2
  410. package/src/util/usePx.ts +1 -0
  411. package/dist/lib/browser/chunk-B7HPXBP2.mjs +0 -4514
  412. package/dist/lib/browser/chunk-B7HPXBP2.mjs.map +0 -7
  413. package/dist/lib/node-esm/chunk-6JCSY5Y7.mjs +0 -4516
  414. package/dist/lib/node-esm/chunk-6JCSY5Y7.mjs.map +0 -7
  415. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  416. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  417. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  418. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  419. package/dist/types/src/components/Buttons/Button.d.ts.map +0 -1
  420. package/dist/types/src/components/Buttons/Button.stories.d.ts.map +0 -1
  421. package/dist/types/src/components/Buttons/IconButton.d.ts.map +0 -1
  422. package/dist/types/src/components/Buttons/IconButton.stories.d.ts.map +0 -1
  423. package/dist/types/src/components/Buttons/Toggle.d.ts.map +0 -1
  424. package/dist/types/src/components/Buttons/Toggle.stories.d.ts +0 -13
  425. package/dist/types/src/components/Buttons/Toggle.stories.d.ts.map +0 -1
  426. package/dist/types/src/components/Buttons/ToggleGroup.d.ts +0 -27
  427. package/dist/types/src/components/Buttons/ToggleGroup.d.ts.map +0 -1
  428. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts.map +0 -1
  429. package/dist/types/src/components/Buttons/index.d.ts.map +0 -1
  430. package/dist/types/src/components/Dialogs/AlertDialog.d.ts +0 -31
  431. package/dist/types/src/components/Dialogs/AlertDialog.d.ts.map +0 -1
  432. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts.map +0 -1
  433. package/dist/types/src/components/Dialogs/Dialog.d.ts +0 -31
  434. package/dist/types/src/components/Dialogs/Dialog.d.ts.map +0 -1
  435. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts +0 -25
  436. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts.map +0 -1
  437. package/dist/types/src/components/Dialogs/index.d.ts.map +0 -1
  438. package/dist/types/src/components/Lists/List.d.ts.map +0 -1
  439. package/dist/types/src/components/Lists/List.stories.d.ts.map +0 -1
  440. package/dist/types/src/components/Lists/ListDropIndicator.d.ts.map +0 -1
  441. package/dist/types/src/components/Lists/Tree.d.ts.map +0 -1
  442. package/dist/types/src/components/Lists/Tree.stories.d.ts.map +0 -1
  443. package/dist/types/src/components/Lists/TreeDropIndicator.d.ts.map +0 -1
  444. package/dist/types/src/components/Lists/Treegrid.d.ts.map +0 -1
  445. package/dist/types/src/components/Lists/Treegrid.stories.d.ts.map +0 -1
  446. package/dist/types/src/components/Lists/index.d.ts.map +0 -1
  447. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  448. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  449. package/dist/types/src/components/Menus/DropdownMenu.d.ts +0 -113
  450. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  451. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  452. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  453. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts +0 -12
  454. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts.map +0 -1
  455. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  456. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  457. package/dist/types/src/util/domino.d.ts +0 -18
  458. package/dist/types/src/util/domino.d.ts.map +0 -1
  459. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
  460. package/src/components/AnchoredOverflow/index.ts +0 -5
  461. package/src/components/Dialogs/AlertDialog.stories.tsx +0 -69
  462. package/src/components/Dialogs/Dialog.stories.tsx +0 -67
  463. package/src/components/Dialogs/Dialog.tsx +0 -159
  464. package/src/testing/decorators/withSurfaceVariantsLayout.tsx +0 -51
  465. package/src/util/ThemedClassName.ts +0 -7
  466. package/src/util/domino.ts +0 -51
  467. /package/dist/types/src/components/{Buttons → Button}/index.d.ts +0 -0
  468. /package/dist/types/src/components/{Dialogs → Dialog}/AlertDialog.stories.d.ts +0 -0
  469. /package/dist/types/src/components/{Dialogs → Dialog}/index.d.ts +0 -0
  470. /package/dist/types/src/components/{Lists → List}/ListDropIndicator.d.ts +0 -0
  471. /package/dist/types/src/components/{Lists → List}/Tree.stories.d.ts +0 -0
  472. /package/dist/types/src/components/{Lists → List}/TreeDropIndicator.d.ts +0 -0
  473. /package/dist/types/src/components/{Lists → List}/Treegrid.stories.d.ts +0 -0
  474. /package/dist/types/src/components/{Lists → List}/index.d.ts +0 -0
  475. /package/dist/types/src/components/{Menus → Menu}/ContextMenu.stories.d.ts +0 -0
  476. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  477. /package/src/components/{Buttons → Button}/index.ts +0 -0
  478. /package/src/components/{Dialogs → Dialog}/index.ts +0 -0
  479. /package/src/components/{Lists → List}/index.ts +0 -0
  480. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -6,10 +6,9 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React from 'react';
7
7
 
8
8
  import { withTheme } from '../../testing';
9
- import { Toggle } from '../Buttons';
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 = {};
@@ -63,18 +62,16 @@ const DefaultStory = (props: StorybookToolbarProps) => {
63
62
  </Toolbar.Button>
64
63
  <Toolbar.Separator />
65
64
  <Toolbar.Button>Test</Toolbar.Button>
66
- <Toolbar.Button>
67
- <Icon icon='ph--arrow-clockwise--regular' />
68
- </Toolbar.Button>
65
+ <Toolbar.IconButton icon='ph--arrow-clockwise--regular' label='Refresh' iconOnly />
69
66
  </Toolbar.Root>
70
67
  );
71
68
  };
72
69
 
73
70
  const meta = {
74
- title: 'ui/react-ui-core/Toolbar',
71
+ title: 'ui/react-ui-core/components/Toolbar',
75
72
  component: Toolbar as any,
76
73
  render: DefaultStory,
77
- decorators: [withTheme],
74
+ decorators: [withTheme()],
78
75
  } satisfies Meta<typeof DefaultStory>;
79
76
 
80
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
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,
@@ -18,20 +25,30 @@ import {
18
25
  Toggle,
19
26
  type ToggleGroupItemProps,
20
27
  type ToggleProps,
21
- } from '../Buttons';
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<ToolbarPrimitive.ToolbarProps> & { layoutManaged?: boolean };
33
+ //
34
+ // Root
35
+ //
36
+
37
+ type ToolbarRootProps = ToolbarPrimitive.ToolbarProps & ToolbarStyleProps;
26
38
 
27
- const ToolbarRoot = forwardRef<HTMLDivElement, ToolbarRootProps>(
28
- ({ classNames, children, layoutManaged, ...props }, forwardedRef) => {
39
+ const ToolbarRoot = composable<HTMLDivElement, ToolbarRootProps>(
40
+ ({ children, density, disabled, layoutManaged, orientation, ...props }, forwardedRef) => {
41
+ const { className, role, ...rest } = composableProps(props);
29
42
  const { tx } = useThemeContext();
43
+
30
44
  return (
31
45
  <ToolbarPrimitive.Root
32
- {...props}
33
- data-arrow-keys={props.orientation === 'vertical' ? 'up down' : 'left right'}
34
- className={tx('toolbar.root', 'toolbar', { layoutManaged }, 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)}
35
52
  ref={forwardedRef}
36
53
  >
37
54
  {children}
@@ -40,6 +57,27 @@ const ToolbarRoot = forwardRef<HTMLDivElement, ToolbarRootProps>(
40
57
  },
41
58
  );
42
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
+
43
81
  type ToolbarButtonProps = ButtonProps;
44
82
 
45
83
  const ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>((props, forwardedRef) => {
@@ -50,12 +88,16 @@ const ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>((props,
50
88
  );
51
89
  });
52
90
 
91
+ //
92
+ // IconButton
93
+ //
94
+
53
95
  type ToolbarIconButtonProps = IconButtonProps;
54
96
 
55
97
  const ToolbarIconButton = forwardRef<HTMLButtonElement, ToolbarIconButtonProps>((props, forwardedRef) => {
56
98
  return (
57
99
  <ToolbarPrimitive.Button asChild>
58
- <IconButton {...props} ref={forwardedRef} />
100
+ <IconButton {...props} noTooltip ref={forwardedRef} />
59
101
  </ToolbarPrimitive.Button>
60
102
  );
61
103
  });
@@ -70,6 +112,10 @@ const ToolbarToggle = forwardRef<HTMLButtonElement, ToolbarToggleProps>((props,
70
112
  );
71
113
  });
72
114
 
115
+ //
116
+ // Link
117
+ //
118
+
73
119
  type ToolbarLinkProps = LinkProps;
74
120
 
75
121
  const ToolbarLink = forwardRef<HTMLAnchorElement, ToolbarLinkProps>((props, forwardedRef) => {
@@ -86,6 +132,10 @@ type ToolbarToggleGroupProps = (
86
132
  ) &
87
133
  ButtonGroupProps;
88
134
 
135
+ //
136
+ // ToggleGroup
137
+ //
138
+
89
139
  const ToolbarToggleGroup = forwardRef<HTMLDivElement, ToolbarToggleGroupProps>(
90
140
  ({ classNames, children, elevation, ...props }, forwardedRef) => {
91
141
  return (
@@ -111,22 +161,38 @@ const ToolbarToggleGroupItem = forwardRef<HTMLButtonElement, ToolbarToggleGroupI
111
161
  type ToolbarToggleGroupIconItemProps = Omit<ToggleGroupItemPrimitiveProps, 'className'> & IconButtonProps;
112
162
 
113
163
  const ToolbarToggleGroupIconItem = forwardRef<HTMLButtonElement, ToolbarToggleGroupIconItemProps>(
114
- ({ variant, density, elevation, classNames, icon, label, iconOnly, ...props }, forwardedRef) => {
164
+ ({ variant, density, elevation, classNames, icon, label, iconOnly, iconClassNames, ...props }, forwardedRef) => {
115
165
  return (
116
166
  <ToolbarPrimitive.ToolbarToggleItem {...props} asChild>
117
- <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
+ />
118
180
  </ToolbarPrimitive.ToolbarToggleItem>
119
181
  );
120
182
  },
121
183
  );
122
184
 
185
+ //
186
+ // Separator
187
+ //
188
+
123
189
  type ToolbarSeparatorProps = SeparatorProps & { variant?: 'gap' | 'line' };
124
190
 
125
191
  const ToolbarSeparator = forwardRef<HTMLDivElement, ToolbarSeparatorProps>(
126
- ({ variant = 'line', ...props }, forwardedRef) => {
192
+ ({ variant = 'gap', ...props }, forwardedRef) => {
127
193
  return variant === 'line' ? (
128
194
  <ToolbarPrimitive.Separator asChild>
129
- <Separator {...props} ref={forwardedRef} />
195
+ <Separator orientation='vertical' {...props} ref={forwardedRef} />
130
196
  </ToolbarPrimitive.Separator>
131
197
  ) : (
132
198
  <ToolbarPrimitive.Separator className='grow' ref={forwardedRef} />
@@ -134,8 +200,109 @@ const ToolbarSeparator = forwardRef<HTMLDivElement, ToolbarSeparatorProps>(
134
200
  },
135
201
  );
136
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
+
137
303
  export const Toolbar = {
138
304
  Root: ToolbarRoot,
305
+ Text: ToolbarText,
139
306
  Button: ToolbarButton,
140
307
  IconButton: ToolbarIconButton,
141
308
  Link: ToolbarLink,
@@ -144,10 +311,14 @@ export const Toolbar = {
144
311
  ToggleGroupItem: ToolbarToggleGroupItem,
145
312
  ToggleGroupIconItem: ToolbarToggleGroupIconItem,
146
313
  Separator: ToolbarSeparator,
314
+ DragHandle: ToolbarDragHandle,
315
+ CloseIconButton: ToolbarCloseIconButton,
316
+ Menu: ToolbarMenu,
147
317
  };
148
318
 
149
319
  export type {
150
320
  ToolbarRootProps,
321
+ ToolbarTextProps,
151
322
  ToolbarButtonProps,
152
323
  ToolbarIconButtonProps,
153
324
  ToolbarLinkProps,
@@ -156,4 +327,8 @@ export type {
156
327
  ToolbarToggleGroupItemProps,
157
328
  ToolbarToggleGroupIconItemProps,
158
329
  ToolbarSeparatorProps,
330
+ ToolbarDragHandleProps,
331
+ ToolbarCloseIconButtonProps,
332
+ ToolbarMenuItem,
333
+ ToolbarMenuProps,
159
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
- import { Button } from '../Buttons';
12
-
11
+ import { Button } from '../Button';
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
  ),
@@ -3,6 +3,7 @@
3
3
  //
4
4
 
5
5
  // This is based upon `@radix-ui/react-tooltip` fetched 17 March 2025 at https://github.com/radix-ui/primitives at commit 6e75e11.
6
+ // TODO(burdon): Replace with https://ui.shadcn.com/docs/components/radix/tooltip
6
7
 
7
8
  import { composeEventHandlers } from '@radix-ui/primitive';
8
9
  import { useComposedRefs } from '@radix-ui/react-compose-refs';
@@ -21,9 +22,8 @@ import { useControllableState } from '@radix-ui/react-use-controllable-state';
21
22
  import * as VisuallyHiddenPrimitive from '@radix-ui/react-visually-hidden';
22
23
  import React, {
23
24
  type ComponentPropsWithoutRef,
24
- type ElementRef,
25
+ type ComponentRef,
25
26
  type FC,
26
- type MutableRefObject,
27
27
  type ReactNode,
28
28
  type RefObject,
29
29
  type SyntheticEvent,
@@ -41,9 +41,9 @@ type TooltipScopedProps<P = {}> = P & { __scopeTooltip?: Scope };
41
41
  const [createTooltipContext, createTooltipScope] = createContextScope('Tooltip', [createPopperScope]);
42
42
  const usePopperScope = createPopperScope();
43
43
 
44
- /* -------------------------------------------------------------------------------------------------
45
- * Tooltip
46
- * ----------------------------------------------------------------------------------------------- */
44
+ //
45
+ // Tooltip
46
+ //
47
47
 
48
48
  const DEFAULT_DELAY_DURATION = 700;
49
49
  const TOOLTIP_OPEN = 'tooltip.open';
@@ -54,19 +54,19 @@ type TooltipContextValue = {
54
54
  open: boolean;
55
55
  stateAttribute: 'closed' | 'delayed-open' | 'instant-open';
56
56
  trigger: TooltipTriggerElement | null;
57
- onTriggerChange(trigger: TooltipTriggerElement | null): void;
57
+ onTriggerChange(trigger: TooltipTriggerElement | null, content?: ReactNode, side?: TooltipSide): void;
58
58
  onTriggerEnter(): void;
59
59
  onTriggerLeave(): void;
60
60
  onOpen(): void;
61
61
  onClose(): void;
62
62
  onPointerInTransitChange(inTransit: boolean): void;
63
- isPointerInTransitRef: MutableRefObject<boolean>;
63
+ isPointerInTransitRef: RefObject<boolean>;
64
64
  disableHoverableContent: boolean;
65
65
  };
66
66
 
67
67
  const [TooltipContextProvider, useTooltipContext] = createTooltipContext<TooltipContextValue>(TOOLTIP_NAME);
68
68
 
69
- interface TooltipProviderProps {
69
+ type TooltipProviderProps = {
70
70
  children?: ReactNode;
71
71
  open?: boolean;
72
72
  defaultOpen?: boolean;
@@ -87,7 +87,7 @@ interface TooltipProviderProps {
87
87
  * @defaultValue 300
88
88
  */
89
89
  skipDelayDuration?: number;
90
- }
90
+ };
91
91
 
92
92
  const TooltipProvider: FC<TooltipProviderProps> = (props: TooltipScopedProps<TooltipProviderProps>) => {
93
93
  const {
@@ -111,15 +111,18 @@ const TooltipProvider: FC<TooltipProviderProps> = (props: TooltipScopedProps<Too
111
111
 
112
112
  const popperScope = usePopperScope(__scopeTooltip);
113
113
  const [trigger, setTrigger] = useState<HTMLButtonElement | null>(null);
114
- const [content, setContent] = useState<string>('');
114
+ const [content, setContent] = useState<ReactNode>(null);
115
115
  const [side, setSide] = useState<TooltipSide | undefined>(undefined);
116
116
  const triggerRef = useRef<HTMLButtonElement | null>(trigger);
117
- const handleTriggerChange = useCallback((nextTrigger: HTMLButtonElement | null) => {
118
- setTrigger(nextTrigger);
119
- triggerRef.current = nextTrigger;
120
- setContent(nextTrigger?.getAttribute('data-tooltip-content') ?? '');
121
- setSide((nextTrigger?.getAttribute('data-tooltip-side') as TooltipSide | null) ?? undefined);
122
- }, []);
117
+ const handleTriggerChange = useCallback(
118
+ (nextTrigger: HTMLButtonElement | null, nextContent?: ReactNode, nextSide?: TooltipSide) => {
119
+ setTrigger(nextTrigger);
120
+ triggerRef.current = nextTrigger;
121
+ setContent(nextContent ?? null);
122
+ setSide(nextSide);
123
+ },
124
+ [],
125
+ );
123
126
  const contentId = useId();
124
127
  const openTimerRef = useRef(0);
125
128
  const wasOpenDelayedRef = useRef(false);
@@ -215,9 +218,9 @@ const TooltipProvider: FC<TooltipProviderProps> = (props: TooltipScopedProps<Too
215
218
  isPointerInTransitRef.current = inTransit;
216
219
  }, [])}
217
220
  >
218
- <TooltipContent side={side} className={tx('tooltip.content', 'tooltip', { elevation })}>
221
+ <TooltipContent side={side} className={tx('tooltip.content', { elevation })}>
219
222
  {content}
220
- <TooltipArrow className={tx('tooltip.arrow', 'tooltip__arrow')} />
223
+ <TooltipArrow className={tx('tooltip.arrow')} />
221
224
  </TooltipContent>
222
225
  <TooltipVirtualTrigger virtualRef={triggerRef as RefObject<HTMLButtonElement>} />
223
226
  {children}
@@ -228,9 +231,9 @@ const TooltipProvider: FC<TooltipProviderProps> = (props: TooltipScopedProps<Too
228
231
 
229
232
  TooltipProvider.displayName = TOOLTIP_NAME;
230
233
 
231
- /* -------------------------------------------------------------------------------------------------
232
- * TooltipVirtualTrigger
233
- * ----------------------------------------------------------------------------------------------- */
234
+ //
235
+ // TooltipVirtualTrigger
236
+ //
234
237
 
235
238
  const TooltipVirtualTrigger = ({
236
239
  virtualRef,
@@ -240,17 +243,17 @@ const TooltipVirtualTrigger = ({
240
243
  return <PopperPrimitive.Anchor asChild {...popperScope} virtualRef={virtualRef} />;
241
244
  };
242
245
 
243
- /* -------------------------------------------------------------------------------------------------
244
- * TooltipTrigger
245
- * ----------------------------------------------------------------------------------------------- */
246
+ //
247
+ // TooltipTrigger
248
+ //
246
249
 
247
250
  const TRIGGER_NAME = 'TooltipTrigger';
248
251
 
249
- type TooltipTriggerElement = ElementRef<typeof Primitive.button>;
252
+ type TooltipTriggerElement = ComponentRef<typeof Primitive.button>;
250
253
  type PrimitiveButtonProps = ComponentPropsWithoutRef<typeof Primitive.button>;
251
- type TooltipTriggerProps = PrimitiveButtonProps &
254
+ type TooltipTriggerProps = Omit<PrimitiveButtonProps, 'content'> &
252
255
  Pick<TooltipProps, 'delayDuration'> & {
253
- content?: string;
256
+ content?: ReactNode;
254
257
  side?: TooltipSide;
255
258
  onInteract?: (event: SyntheticEvent) => void;
256
259
  };
@@ -283,8 +286,6 @@ const TooltipTrigger = forwardRef<TooltipTriggerElement, TooltipTriggerProps>(
283
286
  // commonly anchors and the anchor `type` attribute signifies MIME type.
284
287
  aria-describedby={context.open ? context.contentId : undefined}
285
288
  data-state={context.stateAttribute}
286
- data-tooltip-content={content}
287
- data-tooltip-side={side}
288
289
  {...triggerProps}
289
290
  ref={composedRefs}
290
291
  onPointerMove={composeEventHandlers(props.onPointerMove, (event) => {
@@ -296,7 +297,7 @@ const TooltipTrigger = forwardRef<TooltipTriggerElement, TooltipTriggerProps>(
296
297
  if (event.defaultPrevented) {
297
298
  return;
298
299
  }
299
- context.onTriggerChange(ref.current);
300
+ context.onTriggerChange(ref.current, content, side);
300
301
  context.onTriggerEnter();
301
302
  hasPointerMoveOpenedRef.current = true;
302
303
  }
@@ -322,9 +323,9 @@ const TooltipTrigger = forwardRef<TooltipTriggerElement, TooltipTriggerProps>(
322
323
 
323
324
  TooltipTrigger.displayName = TRIGGER_NAME;
324
325
 
325
- /* -------------------------------------------------------------------------------------------------
326
- * TooltipPortal
327
- * ----------------------------------------------------------------------------------------------- */
326
+ //
327
+ // TooltipPortal
328
+ //
328
329
 
329
330
  const PORTAL_NAME = 'TooltipPortal';
330
331
 
@@ -334,7 +335,7 @@ const [PortalProvider, usePortalContext] = createTooltipContext<PortalContextVal
334
335
  });
335
336
 
336
337
  type PortalProps = ComponentPropsWithoutRef<typeof PortalPrimitive>;
337
- interface TooltipPortalProps {
338
+ type TooltipPortalProps = {
338
339
  children?: ReactNode;
339
340
  /**
340
341
  * Specify a container element to portal the content into.
@@ -345,7 +346,7 @@ interface TooltipPortalProps {
345
346
  * controlling animation with React animation libraries.
346
347
  */
347
348
  forceMount?: true;
348
- }
349
+ };
349
350
 
350
351
  const TooltipPortal: FC<TooltipPortalProps> = (props: TooltipScopedProps<TooltipPortalProps>) => {
351
352
  const { __scopeTooltip, forceMount, children, container } = props;
@@ -363,20 +364,20 @@ const TooltipPortal: FC<TooltipPortalProps> = (props: TooltipScopedProps<Tooltip
363
364
 
364
365
  TooltipPortal.displayName = PORTAL_NAME;
365
366
 
366
- /* -------------------------------------------------------------------------------------------------
367
- * TooltipContent
368
- * ----------------------------------------------------------------------------------------------- */
367
+ //
368
+ // TooltipContent
369
+ //
369
370
 
370
371
  const CONTENT_NAME = 'TooltipContent';
371
372
 
372
373
  type TooltipContentElement = TooltipContentImplElement;
373
- interface TooltipContentProps extends TooltipContentImplProps {
374
+ type TooltipContentProps = TooltipContentImplProps & {
374
375
  /**
375
376
  * Used to force mounting when more control is needed. Useful when
376
377
  * controlling animation with React animation libraries.
377
378
  */
378
379
  forceMount?: true;
379
- }
380
+ };
380
381
 
381
382
  const TooltipContent = forwardRef<TooltipContentElement, TooltipContentProps>(
382
383
  (props: TooltipScopedProps<TooltipContentProps>, forwardedRef) => {
@@ -400,7 +401,7 @@ type Point = { x: number; y: number };
400
401
  type Polygon = Point[];
401
402
 
402
403
  type TooltipContentHoverableElement = TooltipContentImplElement;
403
- interface TooltipContentHoverableProps extends TooltipContentImplProps {}
404
+ type TooltipContentHoverableProps = TooltipContentImplProps;
404
405
 
405
406
  const TooltipContentHoverable = forwardRef<TooltipContentHoverableElement, TooltipContentHoverableProps>(
406
407
  (props: TooltipScopedProps<TooltipContentHoverableProps>, forwardedRef) => {
@@ -479,10 +480,10 @@ const [VisuallyHiddenContentContextProvider, useVisuallyHiddenContentContext] =
479
480
  isInside: false,
480
481
  });
481
482
 
482
- type TooltipContentImplElement = ElementRef<typeof PopperPrimitive.Content>;
483
+ type TooltipContentImplElement = ComponentRef<typeof PopperPrimitive.Content>;
483
484
  type DismissableLayerProps = ComponentPropsWithoutRef<typeof DismissableLayer>;
484
485
  type PopperContentProps = ComponentPropsWithoutRef<typeof PopperPrimitive.Content>;
485
- interface TooltipContentImplProps extends Omit<PopperContentProps, 'onPlaced'> {
486
+ type TooltipContentImplProps = Omit<PopperContentProps, 'onPlaced'> & {
486
487
  /**
487
488
  * A more descriptive label for accessibility purpose
488
489
  */
@@ -498,7 +499,7 @@ interface TooltipContentImplProps extends Omit<PopperContentProps, 'onPlaced'> {
498
499
  * Can be prevented.
499
500
  */
500
501
  onPointerDownOutside?: DismissableLayerProps['onPointerDownOutside'];
501
- }
502
+ };
502
503
 
503
504
  const TooltipContentImpl = forwardRef<TooltipContentImplElement, TooltipContentImplProps>(
504
505
  (props: TooltipScopedProps<TooltipContentImplProps>, forwardedRef) => {
@@ -574,15 +575,15 @@ const TooltipContentImpl = forwardRef<TooltipContentImplElement, TooltipContentI
574
575
 
575
576
  TooltipContent.displayName = CONTENT_NAME;
576
577
 
577
- /* -------------------------------------------------------------------------------------------------
578
- * TooltipArrow
579
- * ----------------------------------------------------------------------------------------------- */
578
+ //
579
+ // TooltipArrow
580
+ //
580
581
 
581
582
  const ARROW_NAME = 'TooltipArrow';
582
583
 
583
- type TooltipArrowElement = ElementRef<typeof PopperPrimitive.Arrow>;
584
+ type TooltipArrowElement = ComponentRef<typeof PopperPrimitive.Arrow>;
584
585
  type PopperArrowProps = ComponentPropsWithoutRef<typeof PopperPrimitive.Arrow>;
585
- interface TooltipArrowProps extends PopperArrowProps {}
586
+ type TooltipArrowProps = PopperArrowProps;
586
587
 
587
588
  const TooltipArrow = forwardRef<TooltipArrowElement, TooltipArrowProps>(
588
589
  (props: TooltipScopedProps<TooltipArrowProps>, forwardedRef) => {
@@ -599,8 +600,6 @@ const TooltipArrow = forwardRef<TooltipArrowElement, TooltipArrowProps>(
599
600
 
600
601
  TooltipArrow.displayName = ARROW_NAME;
601
602
 
602
- /* ----------------------------------------------------------------------------------------------- */
603
-
604
603
  type TooltipSide = NonNullable<TooltipContentProps['side']>;
605
604
 
606
605
  const getExitSideFromRect = (point: Point, rect: DOMRect): TooltipSide => {
@@ -755,6 +754,10 @@ const getHullPresorted = <P extends Point>(points: Readonly<Array<P>>): Array<P>
755
754
  }
756
755
  };
757
756
 
757
+ //
758
+ // Tooltip
759
+ //
760
+
758
761
  export const Tooltip = {
759
762
  Provider: TooltipProvider,
760
763
  Trigger: TooltipTrigger,