@dxos/react-ui 0.8.4-main.c1de068 → 0.8.4-main.c85a9c8dae

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 (433) hide show
  1. package/dist/lib/browser/chunk-2FKSMWNY.mjs +774 -0
  2. package/dist/lib/browser/chunk-2FKSMWNY.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +3931 -61
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +82 -60
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/chunk-ZNBLTSHI.mjs +776 -0
  9. package/dist/lib/node-esm/chunk-ZNBLTSHI.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +3931 -61
  11. package/dist/lib/node-esm/index.mjs.map +4 -4
  12. package/dist/lib/node-esm/meta.json +1 -1
  13. package/dist/lib/node-esm/testing/index.mjs +82 -60
  14. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  15. package/dist/types/src/components/Avatars/Avatar.d.ts +1 -1
  16. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  17. package/dist/types/src/components/Avatars/Avatar.stories.d.ts +5 -31
  18. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  19. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts +5 -11
  20. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  21. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts +1 -1
  22. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  23. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts +8 -20
  24. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  25. package/dist/types/src/components/{Buttons → Button}/Button.d.ts +2 -2
  26. package/dist/types/src/components/Button/Button.d.ts.map +1 -0
  27. package/dist/types/src/components/Button/Button.stories.d.ts +17 -0
  28. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -0
  29. package/dist/types/src/components/{Buttons → Button}/IconButton.d.ts +4 -4
  30. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -0
  31. package/dist/types/src/components/Button/IconButton.stories.d.ts +13 -0
  32. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -0
  33. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -0
  34. package/dist/types/src/components/Button/Toggle.stories.d.ts +16 -0
  35. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -0
  36. package/dist/types/src/components/Button/ToggleGroup.d.ts +27 -0
  37. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -0
  38. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +27 -0
  39. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -0
  40. package/dist/types/src/components/Button/index.d.ts.map +1 -0
  41. package/dist/types/src/components/Card/Card.d.ts +121 -0
  42. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  43. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  44. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  45. package/dist/types/src/components/Card/index.d.ts +2 -0
  46. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  47. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  48. package/dist/types/src/components/Clipboard/CopyButton.d.ts +1 -1
  49. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  50. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  51. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  52. package/dist/types/src/components/{Dialogs → Dialog}/AlertDialog.d.ts +13 -4
  53. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -0
  54. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts +11 -0
  55. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -0
  56. package/dist/types/src/components/Dialog/Dialog.d.ts +47 -0
  57. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -0
  58. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +24 -0
  59. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -0
  60. package/dist/types/src/components/Dialog/index.d.ts.map +1 -0
  61. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  62. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  63. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  64. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  65. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  66. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  67. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +8 -0
  68. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  69. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  70. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  71. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  72. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  73. package/dist/types/src/components/Icon/Icon.d.ts +2 -2
  74. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  75. package/dist/types/src/components/Icon/Icon.stories.d.ts +17 -0
  76. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -0
  77. package/dist/types/src/components/Image/Image.d.ts +14 -0
  78. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  79. package/dist/types/src/components/Image/Image.stories.d.ts +33 -0
  80. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  81. package/dist/types/src/components/Image/index.d.ts +2 -0
  82. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  83. package/dist/types/src/components/Input/Input.d.ts +6 -8
  84. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  85. package/dist/types/src/components/Input/Input.stories.d.ts +17 -18
  86. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  87. package/dist/types/src/components/Link/Link.stories.d.ts +8 -8
  88. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/{Lists → List}/List.d.ts +3 -3
  90. package/dist/types/src/components/List/List.d.ts.map +1 -0
  91. package/dist/types/src/components/List/List.stories.d.ts +14 -0
  92. package/dist/types/src/components/List/List.stories.d.ts.map +1 -0
  93. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -0
  94. package/dist/types/src/components/{Lists → List}/Tree.d.ts +1 -1
  95. package/dist/types/src/components/List/Tree.d.ts.map +1 -0
  96. package/dist/types/src/components/List/Tree.stories.d.ts +15 -0
  97. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -0
  98. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -0
  99. package/dist/types/src/components/{Lists → List}/Treegrid.d.ts +1 -1
  100. package/dist/types/src/components/{Lists → List}/Treegrid.d.ts.map +1 -1
  101. package/dist/types/src/components/List/Treegrid.stories.d.ts +12 -0
  102. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -0
  103. package/dist/types/src/components/List/index.d.ts.map +1 -0
  104. package/dist/types/src/components/Main/Main.d.ts +18 -28
  105. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  106. package/dist/types/src/components/Main/Main.stories.d.ts +6 -10
  107. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  108. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  109. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  110. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts +12 -0
  111. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  112. package/dist/types/src/components/{Menus → Menu}/DropdownMenu.d.ts +8 -8
  113. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  114. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +15 -0
  115. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  116. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  117. package/dist/types/src/components/Message/Message.d.ts +1 -1
  118. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  119. package/dist/types/src/components/Message/Message.stories.d.ts +10 -20
  120. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  121. package/dist/types/src/components/Popover/Popover.d.ts +4 -3
  122. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  123. package/dist/types/src/components/Popover/Popover.stories.d.ts +6 -34
  124. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  125. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +25 -26
  126. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  127. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +37 -25
  128. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  129. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +39 -0
  130. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -0
  131. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +24 -0
  132. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -0
  133. package/dist/types/src/components/ScrollContainer/index.d.ts +2 -0
  134. package/dist/types/src/components/ScrollContainer/index.d.ts.map +1 -0
  135. package/dist/types/src/components/Select/Select.d.ts +10 -10
  136. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  137. package/dist/types/src/components/Select/Select.stories.d.ts +4 -9
  138. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  139. package/dist/types/src/components/Separator/Separator.d.ts +1 -1
  140. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  141. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  142. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  143. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  144. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  145. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  146. package/dist/types/src/components/Splitter/Splitter.d.ts +36 -0
  147. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  148. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  149. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  150. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  151. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  152. package/dist/types/src/components/Status/Status.stories.d.ts +6 -10
  153. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  154. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  155. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  156. package/dist/types/src/components/Tag/Tag.stories.d.ts +8 -13
  157. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  158. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +3 -3
  159. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  160. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts +12 -0
  161. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  162. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
  163. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  164. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  165. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  166. package/dist/types/src/components/Toast/Toast.d.ts +5 -5
  167. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  168. package/dist/types/src/components/Toast/Toast.stories.d.ts +6 -44
  169. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  170. package/dist/types/src/components/Toolbar/Toolbar.d.ts +47 -19
  171. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  172. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +6 -50
  173. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  174. package/dist/types/src/components/Tooltip/Tooltip.d.ts +2 -4
  175. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  176. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +8 -61
  177. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  178. package/dist/types/src/components/index.d.ts +13 -8
  179. package/dist/types/src/components/index.d.ts.map +1 -1
  180. package/dist/types/src/exemplars/generics.stories.d.ts +18 -0
  181. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  182. package/dist/types/src/exemplars/slot.stories.d.ts +14 -0
  183. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  184. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  185. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  186. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  187. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  188. package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
  189. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  190. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  191. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  192. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  193. package/dist/types/src/hooks/useVisualViewport.d.ts +2 -2
  194. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  195. package/dist/types/src/index.d.ts +2 -1
  196. package/dist/types/src/index.d.ts.map +1 -1
  197. package/dist/types/src/playground/Controls.stories.d.ts +5 -9
  198. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  199. package/dist/types/src/playground/Custom.stories.d.ts +12 -4
  200. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  201. package/dist/types/src/playground/Typography.stories.d.ts +5 -11
  202. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  203. package/dist/types/src/primitives/Column/Column.d.ts +32 -0
  204. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  205. package/dist/types/src/primitives/Column/Column.stories.d.ts +6 -0
  206. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  207. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  208. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  209. package/dist/types/src/primitives/Flex/Flex.d.ts +8 -0
  210. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  211. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  212. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  213. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  214. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  215. package/dist/types/src/primitives/Grid/Grid.d.ts +9 -0
  216. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  217. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  218. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  219. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  220. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  221. package/dist/types/src/primitives/Panel/Panel.d.ts +34 -0
  222. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  223. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  224. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  225. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  226. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  227. package/dist/types/src/primitives/index.d.ts +5 -0
  228. package/dist/types/src/primitives/index.d.ts.map +1 -0
  229. package/dist/types/src/testing/decorators/index.d.ts +2 -1
  230. package/dist/types/src/testing/decorators/index.d.ts.map +1 -1
  231. package/dist/types/src/testing/decorators/withLayout.d.ts +15 -0
  232. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -0
  233. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +12 -0
  234. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -0
  235. package/dist/types/src/testing/decorators/withTheme.d.ts +5 -1
  236. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  237. package/dist/types/src/translations.d.ts +11 -0
  238. package/dist/types/src/translations.d.ts.map +1 -0
  239. package/dist/types/src/util/index.d.ts +2 -1
  240. package/dist/types/src/util/index.d.ts.map +1 -1
  241. package/dist/types/src/util/usePx.d.ts +8 -0
  242. package/dist/types/src/util/usePx.d.ts.map +1 -0
  243. package/dist/types/tsconfig.tsbuildinfo +1 -1
  244. package/package.json +43 -31
  245. package/src/components/Avatars/Avatar.stories.tsx +24 -16
  246. package/src/components/Avatars/Avatar.tsx +9 -16
  247. package/src/components/Avatars/AvatarGroup.stories.tsx +12 -8
  248. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +20 -15
  249. package/src/components/Breadcrumb/Breadcrumb.tsx +12 -38
  250. package/src/components/{Buttons → Button}/Button.stories.tsx +10 -11
  251. package/src/components/{Buttons → Button}/Button.tsx +7 -13
  252. package/src/components/{Buttons → Button}/IconButton.stories.tsx +15 -12
  253. package/src/components/{Buttons → Button}/IconButton.tsx +23 -16
  254. package/src/components/Button/Toggle.stories.tsx +37 -0
  255. package/src/components/{Buttons → Button}/ToggleGroup.stories.tsx +12 -9
  256. package/src/components/{Buttons → Button}/ToggleGroup.tsx +17 -4
  257. package/src/components/Card/Card.stories.tsx +151 -0
  258. package/src/components/Card/Card.tsx +352 -0
  259. package/src/components/Card/index.ts +5 -0
  260. package/src/components/Clipboard/ClipboardProvider.tsx +1 -1
  261. package/src/components/Clipboard/CopyButton.tsx +9 -8
  262. package/src/components/DensityProvider/DensityProvider.tsx +2 -2
  263. package/src/components/Dialog/AlertDialog.stories.tsx +69 -0
  264. package/src/components/{Dialogs → Dialog}/AlertDialog.tsx +128 -28
  265. package/src/components/Dialog/Dialog.stories.tsx +122 -0
  266. package/src/components/{Dialogs → Dialog}/Dialog.tsx +190 -60
  267. package/src/components/ElevationProvider/ElevationProvider.tsx +2 -2
  268. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +50 -0
  269. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  270. package/src/components/ErrorFallback/ErrorStack.tsx +80 -0
  271. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  272. package/src/components/ErrorFallback/index.ts +9 -0
  273. package/src/components/Icon/Icon.stories.tsx +113 -0
  274. package/src/components/Icon/Icon.tsx +3 -3
  275. package/src/components/Image/Image.stories.tsx +86 -0
  276. package/src/components/Image/Image.tsx +223 -0
  277. package/src/components/Image/index.ts +5 -0
  278. package/src/components/Input/Input.stories.tsx +28 -49
  279. package/src/components/Input/Input.tsx +46 -82
  280. package/src/components/Link/Link.stories.tsx +12 -8
  281. package/src/components/Link/Link.tsx +2 -2
  282. package/src/components/{Lists → List}/List.stories.tsx +44 -45
  283. package/src/components/{Lists → List}/List.tsx +27 -28
  284. package/src/components/{Lists → List}/ListDropIndicator.tsx +7 -7
  285. package/src/components/{Lists → List}/Tree.stories.tsx +15 -12
  286. package/src/components/{Lists → List}/Tree.tsx +4 -3
  287. package/src/components/{Lists → List}/TreeDropIndicator.tsx +7 -7
  288. package/src/components/{Lists → List}/Treegrid.stories.tsx +15 -9
  289. package/src/components/{Lists → List}/Treegrid.tsx +67 -31
  290. package/src/components/Main/Main.stories.tsx +53 -27
  291. package/src/components/Main/Main.tsx +176 -104
  292. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +13 -10
  293. package/src/components/{Menus → Menu}/ContextMenu.tsx +10 -33
  294. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +14 -11
  295. package/src/components/{Menus → Menu}/DropdownMenu.tsx +111 -80
  296. package/src/components/Message/Message.stories.tsx +35 -16
  297. package/src/components/Message/Message.tsx +46 -33
  298. package/src/components/Popover/Popover.stories.tsx +16 -13
  299. package/src/components/Popover/Popover.tsx +86 -64
  300. package/src/components/ScrollArea/ScrollArea.stories.tsx +163 -34
  301. package/src/components/ScrollArea/ScrollArea.tsx +84 -82
  302. package/src/components/ScrollArea/index.ts +1 -1
  303. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +89 -0
  304. package/src/components/ScrollContainer/ScrollContainer.tsx +238 -0
  305. package/src/components/ScrollContainer/index.ts +5 -0
  306. package/src/components/Select/Select.stories.tsx +15 -12
  307. package/src/components/Select/Select.tsx +16 -31
  308. package/src/components/Separator/Separator.tsx +1 -1
  309. package/src/components/Skeleton/Skeleton.stories.tsx +52 -0
  310. package/src/components/Skeleton/Skeleton.tsx +26 -0
  311. package/src/components/Skeleton/index.ts +5 -0
  312. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  313. package/src/components/Splitter/Splitter.tsx +138 -0
  314. package/src/components/Splitter/index.ts +5 -0
  315. package/src/components/Status/Status.stories.tsx +30 -23
  316. package/src/components/Status/Status.tsx +2 -2
  317. package/src/components/Tag/Tag.stories.tsx +17 -13
  318. package/src/components/Tag/Tag.tsx +3 -8
  319. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +32 -0
  320. package/src/components/ThemeProvider/ThemeProvider.tsx +7 -7
  321. package/src/components/ThemeProvider/TranslationsProvider.tsx +3 -18
  322. package/src/components/ThemeProvider/index.ts +3 -3
  323. package/src/components/Toast/Toast.stories.tsx +14 -11
  324. package/src/components/Toast/Toast.tsx +19 -23
  325. package/src/components/Toolbar/Toolbar.stories.tsx +16 -14
  326. package/src/components/Toolbar/Toolbar.tsx +199 -11
  327. package/src/components/Tooltip/Tooltip.stories.tsx +31 -25
  328. package/src/components/Tooltip/Tooltip.tsx +30 -26
  329. package/src/components/index.ts +14 -9
  330. package/src/exemplars/generics.stories.tsx +49 -0
  331. package/src/exemplars/slot.stories.tsx +119 -0
  332. package/src/exemplars/tabster.stories.tsx +127 -0
  333. package/src/exemplars/virtualizer.stories.tsx +137 -0
  334. package/src/hooks/useDensityContext.ts +1 -1
  335. package/src/hooks/useElevationContext.ts +1 -1
  336. package/src/hooks/useSafeArea.ts +3 -2
  337. package/src/hooks/useVisualViewport.ts +4 -4
  338. package/src/index.ts +2 -1
  339. package/src/playground/Controls.stories.tsx +12 -15
  340. package/src/playground/Custom.stories.tsx +15 -26
  341. package/src/playground/Typography.stories.tsx +11 -9
  342. package/src/primitives/Column/Column.stories.tsx +72 -0
  343. package/src/primitives/Column/Column.tsx +156 -0
  344. package/src/primitives/Column/index.ts +5 -0
  345. package/src/primitives/Flex/Flex.stories.tsx +58 -0
  346. package/src/primitives/Flex/Flex.tsx +27 -0
  347. package/src/primitives/Flex/index.ts +5 -0
  348. package/src/primitives/Grid/Grid.stories.tsx +57 -0
  349. package/src/primitives/Grid/Grid.tsx +43 -0
  350. package/src/primitives/Grid/index.ts +5 -0
  351. package/src/primitives/Panel/Panel.stories.tsx +67 -0
  352. package/src/primitives/Panel/Panel.tsx +137 -0
  353. package/src/primitives/Panel/index.ts +5 -0
  354. package/src/primitives/index.ts +8 -0
  355. package/src/testing/decorators/index.ts +2 -1
  356. package/src/testing/decorators/withLayout.tsx +77 -0
  357. package/src/testing/decorators/withLayoutVariants.tsx +48 -0
  358. package/src/testing/decorators/withTheme.tsx +34 -0
  359. package/src/translations.ts +19 -0
  360. package/src/util/index.ts +3 -1
  361. package/src/util/usePx.ts +61 -0
  362. package/dist/lib/browser/chunk-2COVUP44.mjs +0 -4373
  363. package/dist/lib/browser/chunk-2COVUP44.mjs.map +0 -7
  364. package/dist/lib/node-esm/chunk-GHXHND5V.mjs +0 -4375
  365. package/dist/lib/node-esm/chunk-GHXHND5V.mjs.map +0 -7
  366. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  367. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  368. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  369. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  370. package/dist/types/src/components/Buttons/Button.d.ts.map +0 -1
  371. package/dist/types/src/components/Buttons/Button.stories.d.ts +0 -12
  372. package/dist/types/src/components/Buttons/Button.stories.d.ts.map +0 -1
  373. package/dist/types/src/components/Buttons/IconButton.d.ts.map +0 -1
  374. package/dist/types/src/components/Buttons/IconButton.stories.d.ts +0 -22
  375. package/dist/types/src/components/Buttons/IconButton.stories.d.ts.map +0 -1
  376. package/dist/types/src/components/Buttons/Toggle.d.ts.map +0 -1
  377. package/dist/types/src/components/Buttons/Toggle.stories.d.ts +0 -19
  378. package/dist/types/src/components/Buttons/Toggle.stories.d.ts.map +0 -1
  379. package/dist/types/src/components/Buttons/ToggleGroup.d.ts +0 -28
  380. package/dist/types/src/components/Buttons/ToggleGroup.d.ts.map +0 -1
  381. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts +0 -39
  382. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts.map +0 -1
  383. package/dist/types/src/components/Buttons/index.d.ts.map +0 -1
  384. package/dist/types/src/components/Dialogs/AlertDialog.d.ts.map +0 -1
  385. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts +0 -43
  386. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts.map +0 -1
  387. package/dist/types/src/components/Dialogs/Dialog.d.ts +0 -31
  388. package/dist/types/src/components/Dialogs/Dialog.d.ts.map +0 -1
  389. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts +0 -48
  390. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts.map +0 -1
  391. package/dist/types/src/components/Dialogs/index.d.ts.map +0 -1
  392. package/dist/types/src/components/Lists/List.d.ts.map +0 -1
  393. package/dist/types/src/components/Lists/List.stories.d.ts +0 -37
  394. package/dist/types/src/components/Lists/List.stories.d.ts.map +0 -1
  395. package/dist/types/src/components/Lists/ListDropIndicator.d.ts.map +0 -1
  396. package/dist/types/src/components/Lists/Tree.d.ts.map +0 -1
  397. package/dist/types/src/components/Lists/Tree.stories.d.ts +0 -41
  398. package/dist/types/src/components/Lists/Tree.stories.d.ts.map +0 -1
  399. package/dist/types/src/components/Lists/TreeDropIndicator.d.ts.map +0 -1
  400. package/dist/types/src/components/Lists/Treegrid.stories.d.ts +0 -10
  401. package/dist/types/src/components/Lists/Treegrid.stories.d.ts.map +0 -1
  402. package/dist/types/src/components/Lists/index.d.ts.map +0 -1
  403. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  404. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts +0 -50
  405. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  406. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  407. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts +0 -50
  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/testing/decorators/withSurfaceVariantsLayout.d.ts +0 -12
  411. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts.map +0 -1
  412. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  413. package/dist/types/src/util/ThemedClassName.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/components/Buttons/Toggle.stories.tsx +0 -33
  417. package/src/components/Dialogs/AlertDialog.stories.tsx +0 -66
  418. package/src/components/Dialogs/Dialog.stories.tsx +0 -65
  419. package/src/testing/decorators/withSurfaceVariantsLayout.tsx +0 -51
  420. package/src/testing/decorators/withTheme.ts +0 -25
  421. package/src/util/ThemedClassName.ts +0 -7
  422. /package/dist/types/src/components/{Buttons → Button}/Toggle.d.ts +0 -0
  423. /package/dist/types/src/components/{Buttons → Button}/index.d.ts +0 -0
  424. /package/dist/types/src/components/{Dialogs → Dialog}/index.d.ts +0 -0
  425. /package/dist/types/src/components/{Lists → List}/ListDropIndicator.d.ts +0 -0
  426. /package/dist/types/src/components/{Lists → List}/TreeDropIndicator.d.ts +0 -0
  427. /package/dist/types/src/components/{Lists → List}/index.d.ts +0 -0
  428. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  429. /package/src/components/{Buttons → Button}/Toggle.tsx +0 -0
  430. /package/src/components/{Buttons → Button}/index.ts +0 -0
  431. /package/src/components/{Dialogs → Dialog}/index.ts +0 -0
  432. /package/src/components/{Lists → List}/index.ts +0 -0
  433. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -2,41 +2,47 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React from 'react';
7
7
 
8
8
  import { faker } from '@dxos/random';
9
9
 
10
- import { Tooltip } from './Tooltip';
11
10
  import { withTheme } from '../../testing';
12
- import { Button } from '../Buttons';
11
+ import { Button } from '../Button';
12
+
13
+ import { Tooltip } from './Tooltip';
13
14
 
14
15
  type StoryProps = {
15
16
  tooltips: { label: string; content: string }[];
16
17
  defaultOpen?: boolean;
17
18
  };
18
19
 
19
- const DefaultStory = ({ tooltips, defaultOpen }: StoryProps) => (
20
- <Tooltip.Provider defaultOpen={defaultOpen}>
21
- <div role='none' className='is-32'>
22
- {tooltips.map(({ label, content }, i) => (
23
- <Tooltip.Trigger asChild key={i} content={content} side='right'>
24
- <Button classNames='block is-full'>{label}</Button>
25
- </Tooltip.Trigger>
26
- ))}
27
- </div>
28
- </Tooltip.Provider>
29
- );
20
+ const DefaultStory = ({ tooltips, defaultOpen }: StoryProps) => {
21
+ return (
22
+ <Tooltip.Provider defaultOpen={defaultOpen}>
23
+ <div role='none' className='w-32'>
24
+ {tooltips.map(({ label, content }, i) => (
25
+ <Tooltip.Trigger asChild key={i} content={content} side='right'>
26
+ <Button classNames='block w-full'>{label}</Button>
27
+ </Tooltip.Trigger>
28
+ ))}
29
+ </div>
30
+ </Tooltip.Provider>
31
+ );
32
+ };
30
33
 
31
- export default {
32
- title: 'ui/react-ui-core/Tooltip',
33
- component: Tooltip,
34
+ const meta = {
35
+ title: 'ui/react-ui-core/components/Tooltip',
36
+ component: Tooltip as any,
34
37
  render: DefaultStory,
35
- decorators: [withTheme],
36
- parameters: { chromatic: { disableSnapshot: false } },
37
- };
38
+ decorators: [withTheme()],
39
+ } satisfies Meta<typeof DefaultStory>;
40
+
41
+ export default meta;
42
+
43
+ type Story = StoryObj<typeof meta>;
38
44
 
39
- export const Default = {
45
+ export const Default: Story = {
40
46
  args: {
41
47
  tooltips: [
42
48
  {
@@ -50,9 +56,9 @@ export const Default = {
50
56
  },
51
57
  };
52
58
 
53
- export const DefaultOpen = {
59
+ export const DefaultOpen: Story = {
54
60
  args: {
55
- defaultOption: true,
61
+ defaultOpen: true,
56
62
  tooltips: [
57
63
  {
58
64
  label: 'Tooltip trigger',
@@ -65,9 +71,9 @@ export const DefaultOpen = {
65
71
  },
66
72
  };
67
73
 
68
- export const StressTest = {
74
+ export const StressTest: Story = {
69
75
  args: {
70
- defaultOption: true,
76
+ defaultOpen: true,
71
77
  tooltips: faker.helpers.multiple(
72
78
  () => ({
73
79
  label: faker.lorem.words(2),
@@ -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';
@@ -11,7 +12,7 @@ import type { Scope } from '@radix-ui/react-context';
11
12
  import { DismissableLayer } from '@radix-ui/react-dismissable-layer';
12
13
  import { useId } from '@radix-ui/react-id';
13
14
  import * as PopperPrimitive from '@radix-ui/react-popper';
14
- import { createPopperScope, type PopperAnchorProps } from '@radix-ui/react-popper';
15
+ import { type PopperAnchorProps, createPopperScope } from '@radix-ui/react-popper';
15
16
  import { Portal as PortalPrimitive } from '@radix-ui/react-portal';
16
17
  import { Presence } from '@radix-ui/react-presence';
17
18
  import { Primitive } from '@radix-ui/react-primitive';
@@ -23,10 +24,11 @@ import React, {
23
24
  type ComponentPropsWithoutRef,
24
25
  type ElementRef,
25
26
  type FC,
26
- type SyntheticEvent,
27
- forwardRef,
28
27
  type MutableRefObject,
29
28
  type ReactNode,
29
+ type RefObject,
30
+ type SyntheticEvent,
31
+ forwardRef,
30
32
  useCallback,
31
33
  useEffect,
32
34
  useMemo,
@@ -40,9 +42,9 @@ type TooltipScopedProps<P = {}> = P & { __scopeTooltip?: Scope };
40
42
  const [createTooltipContext, createTooltipScope] = createContextScope('Tooltip', [createPopperScope]);
41
43
  const usePopperScope = createPopperScope();
42
44
 
43
- /* -------------------------------------------------------------------------------------------------
44
- * Tooltip
45
- * ----------------------------------------------------------------------------------------------- */
45
+ //
46
+ // Tooltip
47
+ //
46
48
 
47
49
  const DEFAULT_DELAY_DURATION = 700;
48
50
  const TOOLTIP_OPEN = 'tooltip.open';
@@ -214,11 +216,11 @@ const TooltipProvider: FC<TooltipProviderProps> = (props: TooltipScopedProps<Too
214
216
  isPointerInTransitRef.current = inTransit;
215
217
  }, [])}
216
218
  >
217
- <TooltipContent side={side} className={tx('tooltip.content', 'tooltip', { elevation })}>
219
+ <TooltipContent side={side} className={tx('tooltip.content', { elevation })}>
218
220
  {content}
219
- <TooltipArrow className={tx('tooltip.arrow', 'tooltip__arrow')} />
221
+ <TooltipArrow className={tx('tooltip.arrow')} />
220
222
  </TooltipContent>
221
- <TooltipVirtualTrigger virtualRef={triggerRef} />
223
+ <TooltipVirtualTrigger virtualRef={triggerRef as RefObject<HTMLButtonElement>} />
222
224
  {children}
223
225
  </TooltipContextProvider>
224
226
  </PopperPrimitive.Root>
@@ -227,9 +229,9 @@ const TooltipProvider: FC<TooltipProviderProps> = (props: TooltipScopedProps<Too
227
229
 
228
230
  TooltipProvider.displayName = TOOLTIP_NAME;
229
231
 
230
- /* -------------------------------------------------------------------------------------------------
231
- * TooltipVirtualTrigger
232
- * ----------------------------------------------------------------------------------------------- */
232
+ //
233
+ // TooltipVirtualTrigger
234
+ //
233
235
 
234
236
  const TooltipVirtualTrigger = ({
235
237
  virtualRef,
@@ -239,9 +241,9 @@ const TooltipVirtualTrigger = ({
239
241
  return <PopperPrimitive.Anchor asChild {...popperScope} virtualRef={virtualRef} />;
240
242
  };
241
243
 
242
- /* -------------------------------------------------------------------------------------------------
243
- * TooltipTrigger
244
- * ----------------------------------------------------------------------------------------------- */
244
+ //
245
+ // TooltipTrigger
246
+ //
245
247
 
246
248
  const TRIGGER_NAME = 'TooltipTrigger';
247
249
 
@@ -321,9 +323,9 @@ const TooltipTrigger = forwardRef<TooltipTriggerElement, TooltipTriggerProps>(
321
323
 
322
324
  TooltipTrigger.displayName = TRIGGER_NAME;
323
325
 
324
- /* -------------------------------------------------------------------------------------------------
325
- * TooltipPortal
326
- * ----------------------------------------------------------------------------------------------- */
326
+ //
327
+ // TooltipPortal
328
+ //
327
329
 
328
330
  const PORTAL_NAME = 'TooltipPortal';
329
331
 
@@ -362,9 +364,9 @@ const TooltipPortal: FC<TooltipPortalProps> = (props: TooltipScopedProps<Tooltip
362
364
 
363
365
  TooltipPortal.displayName = PORTAL_NAME;
364
366
 
365
- /* -------------------------------------------------------------------------------------------------
366
- * TooltipContent
367
- * ----------------------------------------------------------------------------------------------- */
367
+ //
368
+ // TooltipContent
369
+ //
368
370
 
369
371
  const CONTENT_NAME = 'TooltipContent';
370
372
 
@@ -573,9 +575,9 @@ const TooltipContentImpl = forwardRef<TooltipContentImplElement, TooltipContentI
573
575
 
574
576
  TooltipContent.displayName = CONTENT_NAME;
575
577
 
576
- /* -------------------------------------------------------------------------------------------------
577
- * TooltipArrow
578
- * ----------------------------------------------------------------------------------------------- */
578
+ //
579
+ // TooltipArrow
580
+ //
579
581
 
580
582
  const ARROW_NAME = 'TooltipArrow';
581
583
 
@@ -598,8 +600,6 @@ const TooltipArrow = forwardRef<TooltipArrowElement, TooltipArrowProps>(
598
600
 
599
601
  TooltipArrow.displayName = ARROW_NAME;
600
602
 
601
- /* ----------------------------------------------------------------------------------------------- */
602
-
603
603
  type TooltipSide = NonNullable<TooltipContentProps['side']>;
604
604
 
605
605
  const getExitSideFromRect = (point: Point, rect: DOMRect): TooltipSide => {
@@ -754,6 +754,10 @@ const getHullPresorted = <P extends Point>(points: Readonly<Array<P>>): Array<P>
754
754
  }
755
755
  };
756
756
 
757
+ //
758
+ // Tooltip
759
+ //
760
+
757
761
  export const Tooltip = {
758
762
  Provider: TooltipProvider,
759
763
  Trigger: TooltipTrigger,
@@ -2,29 +2,34 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- export * from './AnchoredOverflow';
5
+ export * from './DensityProvider';
6
+ export * from './ElevationProvider';
7
+ export * from './ThemeProvider';
8
+
6
9
  export * from './Avatars';
7
10
  export * from './Breadcrumb';
8
- export * from './Buttons';
11
+ export * from './Button';
12
+ export * from './Card';
9
13
  export * from './Clipboard';
10
- export * from './Dialogs';
14
+ export * from './Dialog';
15
+ export * from './ErrorFallback';
11
16
  export * from './Icon';
17
+ export * from './Image';
12
18
  export * from './Input';
13
19
  export * from './Link';
14
- export * from './Lists';
20
+ export * from './List';
15
21
  export * from './Main';
16
- export * from './Menus';
22
+ export * from './Menu';
17
23
  export * from './Message';
18
24
  export * from './Popover';
19
25
  export * from './Status';
20
26
  export * from './ScrollArea';
27
+ export * from './ScrollContainer';
21
28
  export * from './Select';
22
29
  export * from './Separator';
30
+ export * from './Skeleton';
31
+ export * from './Splitter';
23
32
  export * from './Tag';
24
33
  export * from './Toast';
25
34
  export * from './Toolbar';
26
35
  export * from './Tooltip';
27
-
28
- export * from './DensityProvider';
29
- export * from './ElevationProvider';
30
- export * from './ThemeProvider';
@@ -0,0 +1,49 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { type ReactElement, type Ref, forwardRef } from 'react';
7
+
8
+ import { type SlottableProps } from '@dxos/ui-types';
9
+
10
+ import { withTheme } from '../testing';
11
+
12
+ const ComponentInner = forwardRef<HTMLDivElement, ComponentProps>(({ children, ...props }, forwardedRef) => {
13
+ return (
14
+ <div {...props} ref={forwardedRef}>
15
+ {children}
16
+ </div>
17
+ );
18
+ });
19
+
20
+ ComponentInner.displayName = 'Component';
21
+
22
+ /**
23
+ * Generic component pattern.
24
+ */
25
+ type ComponentProps<P extends HTMLElement = any> = SlottableProps<P>;
26
+
27
+ const Component = ComponentInner as <P extends HTMLElement>(
28
+ props: SlottableProps<P> & { ref?: Ref<P> },
29
+ ) => ReactElement;
30
+
31
+ const meta = {
32
+ title: 'ui/react-ui-core/exemplars/generics',
33
+ component: Component,
34
+ render: (props) => <Component<HTMLDivElement> {...props} />,
35
+ decorators: [withTheme()],
36
+ parameters: {
37
+ layout: 'centered',
38
+ },
39
+ } satisfies Meta;
40
+
41
+ export default meta;
42
+
43
+ type Story = StoryObj<typeof meta>;
44
+
45
+ export const Default: Story = {
46
+ args: {
47
+ children: 'Hello',
48
+ },
49
+ };
@@ -0,0 +1,119 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { Primitive } from '@radix-ui/react-primitive';
6
+ import { Slot } from '@radix-ui/react-slot';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
+ import React, { type PropsWithChildren, forwardRef } from 'react';
9
+
10
+ import { useComposableProps } from '@dxos/ui-theme';
11
+ import { type ComposableProps, type SlottableProps, type ThemedClassName } from '@dxos/ui-types';
12
+
13
+ import { withTheme } from '../testing';
14
+
15
+ /**
16
+ * Composition
17
+ *
18
+ * All Radix primitive parts that render a DOM element accept an asChild prop.
19
+ * When asChild is set to true, Radix will not render a default DOM element, instead cloning the part's child and passing it the props and behavior required to make it functional.
20
+ * https://www.radix-ui.com/primitives/docs/guides/composition
21
+ */
22
+
23
+ // Outer primitive (like Tooltip.Trigger or Focus.Group).
24
+ const Outer = forwardRef<HTMLDivElement, SlottableProps<HTMLDivElement>>(
25
+ ({ children, asChild, ...props }, forwardedRef) => {
26
+ const { className, ...rest } = useComposableProps(props);
27
+ const Comp = asChild ? Slot : Primitive.div;
28
+ return (
29
+ <Comp {...rest} className={className} data-outer='true' ref={forwardedRef}>
30
+ {children}
31
+ </Comp>
32
+ );
33
+ },
34
+ );
35
+
36
+ // Middle primitive (like Dialog.Trigger or Mosaic.Cell).
37
+ const Middle = forwardRef<HTMLDivElement, SlottableProps<HTMLDivElement>>(
38
+ ({ children, asChild, ...props }, forwardedRef) => {
39
+ const { className, ...rest } = useComposableProps(props);
40
+ const Comp = asChild ? Slot : Primitive.div;
41
+ return (
42
+ <Comp {...rest} className={className} data-middle='true' ref={forwardedRef}>
43
+ {children}
44
+ </Comp>
45
+ );
46
+ },
47
+ );
48
+
49
+ // Leaf component (like Card.Root).
50
+ const Leaf = forwardRef<HTMLButtonElement, ComposableProps<PropsWithChildren>>(
51
+ ({ children, ...props }, forwardedRef) => {
52
+ const { className, ...rest } = useComposableProps(props);
53
+ return (
54
+ <button {...rest} className={className} ref={forwardedRef}>
55
+ {children}
56
+ </button>
57
+ );
58
+ },
59
+ );
60
+
61
+ // Test 1: Single asChild.
62
+ const TestSingle = (props: ThemedClassName<{ role?: string }>) => {
63
+ const { className, ...rest } = useComposableProps(props);
64
+ return (
65
+ <Outer asChild {...rest} className={className}>
66
+ <Leaf>Single asChild</Leaf>
67
+ </Outer>
68
+ );
69
+ };
70
+
71
+ // Test 2: Nested asChild.
72
+ const TestNested = (props: ThemedClassName<{ role?: string }>) => {
73
+ const { className, ...rest } = useComposableProps(props);
74
+ return (
75
+ <Outer asChild {...rest} className={className}>
76
+ <Middle asChild>
77
+ <Leaf>Nested asChild</Leaf>
78
+ </Middle>
79
+ </Outer>
80
+ );
81
+ };
82
+
83
+ // Test 3: Complex.
84
+ const TestInner = (props: ThemedClassName<{ role?: string }>) => {
85
+ const { className, ...rest } = useComposableProps(props);
86
+ return (
87
+ <Outer asChild {...rest} className={className}>
88
+ <Middle asChild>
89
+ <Leaf>
90
+ <div role='none'>Leaf</div>
91
+ </Leaf>
92
+ </Middle>
93
+ </Outer>
94
+ );
95
+ };
96
+
97
+ const meta = {
98
+ title: 'ui/react-ui-core/exemplars/slot',
99
+ decorators: [withTheme()],
100
+ parameters: {
101
+ layout: 'centered',
102
+ },
103
+ } satisfies Meta;
104
+
105
+ export default meta;
106
+
107
+ type Story = StoryObj<typeof meta>;
108
+
109
+ export const Single: Story = {
110
+ render: () => <TestSingle role='listitem' classNames='border-red-500' />,
111
+ };
112
+
113
+ export const Nested: Story = {
114
+ render: () => <TestNested role='listitem' classNames='border-green-500' />,
115
+ };
116
+
117
+ export const Inner: Story = {
118
+ render: () => <TestInner role='listitem' classNames='border-blue-500' />,
119
+ };
@@ -0,0 +1,127 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import {
6
+ useArrowNavigationGroup,
7
+ useFocusFinders,
8
+ useFocusableGroup,
9
+ useMergedTabsterAttributes_unstable,
10
+ } from '@fluentui/react-tabster';
11
+ import { type Decorator, type Meta, type StoryObj } from '@storybook/react-vite';
12
+ import React, { forwardRef, useEffect, useMemo, useRef } from 'react';
13
+ import { createTabster, disposeTabster } from 'tabster';
14
+
15
+ import { Input, ScrollArea } from '@dxos/react-ui';
16
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
17
+ import { mx } from '@dxos/ui-theme';
18
+
19
+ // TODO(burdon): Factor out styles (incl. tabster debugging).
20
+ // TODO(burdon): Implement horizontal movement between columns when column is selected.
21
+ // TODO(burdon): Prevent tab out of app.
22
+
23
+ const border =
24
+ 'rounded-xs outline-hidden border border-subdued-separator focus:border-primary-500 focus-within:border-rose-500';
25
+
26
+ const Board = forwardRef<HTMLDivElement, { columns: string[][] }>(({ columns }, ref) => {
27
+ const arrowNavigationAttrs = useArrowNavigationGroup({ axis: 'horizontal', memorizeCurrent: true, tabbable: true });
28
+
29
+ return (
30
+ <div ref={ref} tabIndex={0} {...arrowNavigationAttrs} className='flex h-full w-full overflow-hidden'>
31
+ <div className={mx('flex h-full overflow-x-auto p-4 gap-4')}>
32
+ {columns.map((column) => (
33
+ <Column key={column[0]} items={column} />
34
+ ))}
35
+ </div>
36
+ </div>
37
+ );
38
+ });
39
+
40
+ const Column = forwardRef<HTMLDivElement, { items: string[] }>(({ items }, ref) => {
41
+ const focusableGroupAttrs = useFocusableGroup({ tabBehavior: 'limited' });
42
+ const arrowNavigationAttrs = useArrowNavigationGroup({ axis: 'vertical', memorizeCurrent: true });
43
+ const tabsterAttrs = useMergedTabsterAttributes_unstable(focusableGroupAttrs, arrowNavigationAttrs);
44
+
45
+ return (
46
+ <ScrollArea.Root tabIndex={0} orientation='vertical' classNames={mx('w-[25rem]', border)}>
47
+ <ScrollArea.Viewport {...tabsterAttrs} classNames='p-4 gap-4' ref={ref}>
48
+ {items.map((item) => (
49
+ <Item key={item} value={item} />
50
+ ))}
51
+ </ScrollArea.Viewport>
52
+ </ScrollArea.Root>
53
+ );
54
+ });
55
+
56
+ const Item = forwardRef<HTMLDivElement, { value: string }>(({ value }, ref) => {
57
+ const focusableGroupAttrs = useFocusableGroup();
58
+
59
+ return (
60
+ <div
61
+ ref={ref}
62
+ tabIndex={0}
63
+ {...focusableGroupAttrs}
64
+ className={mx('flex shrink-0 w-full gap-4 p-4 items-center', border)}
65
+ >
66
+ <Input.Root>
67
+ <Input.Checkbox />
68
+ </Input.Root>
69
+ <Input.Root>
70
+ <Input.TextInput defaultValue={value} />
71
+ </Input.Root>
72
+ </div>
73
+ );
74
+ });
75
+
76
+ const DefaultStory = () => {
77
+ const columns = useMemo(() => {
78
+ return [['A1', 'A2', 'A3'], ['B1'], ['C1', 'C2', 'C3', 'C4', 'C5', 'C6'], ['D1', 'D2']];
79
+ }, []);
80
+
81
+ const ref = useRef<HTMLDivElement>(null);
82
+ const { findFirstFocusable } = useFocusFinders();
83
+ useEffect(() => {
84
+ if (ref.current) {
85
+ findFirstFocusable(ref.current)?.focus();
86
+ }
87
+ }, []);
88
+
89
+ return <Board columns={columns} ref={ref} />;
90
+ };
91
+
92
+ // TODO(burdon): This doesn't seem to be necessary or recongized; memoization doesn't work.
93
+ const withTabster: Decorator = (Story) => {
94
+ useEffect(() => {
95
+ const tabster = createTabster(window, {
96
+ autoRoot: {},
97
+ // TODO(burdon): Not called.
98
+ // checkUncontrolledCompletely: (el) => {
99
+ // console.log(el);
100
+ // return true;
101
+ // },
102
+ });
103
+
104
+ return () => {
105
+ disposeTabster(tabster);
106
+ };
107
+ }, []);
108
+
109
+ return <Story />;
110
+ };
111
+
112
+ const meta: Meta<typeof DefaultStory> = {
113
+ title: 'ui/react-ui-core/exemplars/tabster',
114
+ component: DefaultStory,
115
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' }), withTabster],
116
+ parameters: {
117
+ layout: 'fullscreen',
118
+ },
119
+ };
120
+
121
+ export default meta;
122
+
123
+ type Story = StoryObj<typeof meta>;
124
+
125
+ export const Default: Story = {
126
+ args: {},
127
+ };