@dxos/react-ui 0.8.4-main.9735255 → 0.8.4-main.9be5663bfe

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 (340) hide show
  1. package/dist/lib/browser/{chunk-CEKVHJ27.mjs → chunk-OCVRIJCH.mjs} +184 -110
  2. package/dist/lib/browser/chunk-OCVRIJCH.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +3025 -2078
  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 +73 -37
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/{chunk-2NHEX4AD.mjs → chunk-QUD5P3RU.mjs} +184 -110
  9. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +3025 -2078
  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 +73 -37
  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.map +1 -1
  18. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  19. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  20. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  21. package/dist/types/src/components/Button/Button.d.ts +2 -2
  22. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  23. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -1
  24. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  25. package/dist/types/src/components/Button/IconButton.stories.d.ts +3 -0
  26. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
  27. package/dist/types/src/components/Button/Toggle.d.ts +2 -2
  28. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -1
  29. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
  30. package/dist/types/src/components/Button/ToggleGroup.d.ts +6 -6
  31. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -1
  32. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
  33. package/dist/types/src/components/Card/Card.d.ts +118 -0
  34. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  35. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  36. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  37. package/dist/types/src/components/Card/index.d.ts +2 -0
  38. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  39. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  40. package/dist/types/src/components/Clipboard/index.d.ts +10 -1
  41. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  42. package/dist/types/src/components/Dialog/AlertDialog.d.ts +37 -19
  43. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  44. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  45. package/dist/types/src/components/Dialog/Dialog.d.ts +44 -22
  46. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  47. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +6 -8
  48. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  49. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  50. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  51. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  52. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  53. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +19 -0
  54. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  55. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  56. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  57. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  58. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  59. package/dist/types/src/components/Focus/Focus.d.ts +36 -0
  60. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -0
  61. package/dist/types/src/components/Focus/Focus.stories.d.ts +9 -0
  62. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -0
  63. package/dist/types/src/components/Focus/index.d.ts +2 -0
  64. package/dist/types/src/components/Focus/index.d.ts.map +1 -0
  65. package/dist/types/src/components/Icon/Icon.d.ts +3 -0
  66. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  67. package/dist/types/src/components/Icon/Icon.stories.d.ts +11 -3
  68. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  69. package/dist/types/src/components/Image/Image.d.ts +14 -0
  70. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  71. package/dist/types/src/components/Image/Image.stories.d.ts +33 -0
  72. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  73. package/dist/types/src/components/Image/index.d.ts +2 -0
  74. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  75. package/dist/types/src/components/Input/Input.d.ts +4 -7
  76. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  77. package/dist/types/src/components/Input/Input.stories.d.ts +7 -7
  78. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  79. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  80. package/dist/types/src/components/List/List.d.ts +5 -3
  81. package/dist/types/src/components/List/List.d.ts.map +1 -1
  82. package/dist/types/src/components/List/List.stories.d.ts +3 -1
  83. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  84. package/dist/types/src/components/List/Tree.d.ts.map +1 -1
  85. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
  86. package/dist/types/src/components/List/Treegrid.d.ts +5 -9
  87. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  88. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/Main/Main.d.ts +6 -32
  90. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  91. package/dist/types/src/components/Main/Main.stories.d.ts +1 -5
  92. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  93. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -1
  94. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -1
  95. package/dist/types/src/components/Menu/DropdownMenu.d.ts +51 -50
  96. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
  97. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +14 -1
  98. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
  99. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  100. package/dist/types/src/components/Message/Message.stories.d.ts +4 -5
  101. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  102. package/dist/types/src/components/Popover/Popover.d.ts +32 -23
  103. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  104. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  105. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +26 -28
  106. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  107. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +54 -9
  108. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  109. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +34 -13
  110. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  111. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +9 -5
  112. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  113. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  114. package/dist/types/src/components/Select/Select.stories.d.ts +2 -2
  115. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  116. package/dist/types/src/components/Separator/Separator.d.ts +3 -3
  117. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  118. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  119. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  120. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  121. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  122. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  123. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  124. package/dist/types/src/components/Splitter/Splitter.d.ts +34 -0
  125. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  126. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  127. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  128. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  129. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  130. package/dist/types/src/components/Status/Status.d.ts +3 -4
  131. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  132. package/dist/types/src/components/Status/Status.stories.d.ts +4 -2
  133. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  134. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  135. package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
  136. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  137. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +2 -1
  138. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  139. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts +12 -0
  140. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  141. package/dist/types/src/components/Toast/Toast.d.ts +15 -15
  142. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  143. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  144. package/dist/types/src/components/Toolbar/Toolbar.d.ts +30 -12
  145. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  146. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  147. package/dist/types/src/components/Tooltip/Tooltip.d.ts +9 -9
  148. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  149. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +2 -2
  150. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  151. package/dist/types/src/components/index.d.ts +9 -4
  152. package/dist/types/src/components/index.d.ts.map +1 -1
  153. package/dist/types/src/exemplars/generics.stories.d.ts +19 -0
  154. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  155. package/dist/types/src/exemplars/slot.stories.d.ts +15 -0
  156. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  157. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  158. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  159. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  160. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  161. package/dist/types/src/hooks/index.d.ts +1 -0
  162. package/dist/types/src/hooks/index.d.ts.map +1 -1
  163. package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
  164. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  165. package/dist/types/src/index.d.ts +1 -0
  166. package/dist/types/src/index.d.ts.map +1 -1
  167. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  168. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  169. package/dist/types/src/primitives/Column/Column.d.ts +35 -0
  170. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  171. package/dist/types/src/primitives/Column/Column.stories.d.ts +25 -0
  172. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  173. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  174. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  175. package/dist/types/src/primitives/Container/Container.d.ts +7 -0
  176. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  177. package/dist/types/src/primitives/Container/Container.stories.d.ts +6 -0
  178. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  179. package/dist/types/src/primitives/Container/index.d.ts +2 -0
  180. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  181. package/dist/types/src/primitives/Flex/Flex.d.ts +11 -0
  182. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  183. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  184. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  185. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  186. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  187. package/dist/types/src/primitives/Grid/Grid.d.ts +10 -0
  188. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  189. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  190. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  191. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  192. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  193. package/dist/types/src/primitives/Panel/Panel.d.ts +35 -0
  194. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  195. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  196. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  197. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  198. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  199. package/dist/types/src/primitives/index.d.ts +6 -0
  200. package/dist/types/src/primitives/index.d.ts.map +1 -0
  201. package/dist/types/src/testing/Loading.d.ts +9 -0
  202. package/dist/types/src/testing/Loading.d.ts.map +1 -0
  203. package/dist/types/src/testing/decorators/withLayout.d.ts +1 -1
  204. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  205. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  206. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  207. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  208. package/dist/types/src/testing/index.d.ts +1 -0
  209. package/dist/types/src/testing/index.d.ts.map +1 -1
  210. package/dist/types/src/translations.d.ts +11 -0
  211. package/dist/types/src/translations.d.ts.map +1 -0
  212. package/dist/types/src/util/usePx.d.ts.map +1 -1
  213. package/dist/types/tsconfig.tsbuildinfo +1 -1
  214. package/package.json +27 -22
  215. package/src/components/Avatars/Avatar.stories.tsx +7 -9
  216. package/src/components/Avatars/Avatar.tsx +6 -14
  217. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -3
  218. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +3 -4
  219. package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
  220. package/src/components/Button/Button.stories.tsx +3 -4
  221. package/src/components/Button/Button.tsx +11 -25
  222. package/src/components/Button/IconButton.stories.tsx +8 -6
  223. package/src/components/Button/IconButton.tsx +2 -4
  224. package/src/components/Button/Toggle.stories.tsx +2 -3
  225. package/src/components/Button/Toggle.tsx +4 -4
  226. package/src/components/Button/ToggleGroup.stories.tsx +2 -3
  227. package/src/components/Button/ToggleGroup.tsx +12 -16
  228. package/src/components/Card/Card.stories.tsx +151 -0
  229. package/src/components/Card/Card.tsx +492 -0
  230. package/src/components/Card/index.ts +5 -0
  231. package/src/components/Clipboard/CopyButton.tsx +4 -5
  232. package/src/components/Dialog/AlertDialog.stories.tsx +16 -17
  233. package/src/components/Dialog/AlertDialog.tsx +123 -82
  234. package/src/components/Dialog/Dialog.stories.tsx +100 -20
  235. package/src/components/Dialog/Dialog.tsx +113 -87
  236. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +45 -0
  237. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  238. package/src/components/ErrorFallback/ErrorStack.tsx +114 -0
  239. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  240. package/src/components/ErrorFallback/index.ts +9 -0
  241. package/src/components/Focus/AUDIT.md +43 -0
  242. package/src/components/Focus/Focus.stories.tsx +230 -0
  243. package/src/components/Focus/Focus.tsx +201 -0
  244. package/src/components/Focus/index.ts +5 -0
  245. package/src/components/Icon/Icon.stories.tsx +45 -15
  246. package/src/components/Icon/Icon.tsx +6 -2
  247. package/src/components/Image/Image.stories.tsx +86 -0
  248. package/src/components/Image/Image.tsx +223 -0
  249. package/src/components/Image/index.ts +5 -0
  250. package/src/components/Input/Input.stories.tsx +20 -40
  251. package/src/components/Input/Input.tsx +24 -69
  252. package/src/components/Link/Link.stories.tsx +2 -3
  253. package/src/components/Link/Link.tsx +2 -2
  254. package/src/components/List/List.stories.tsx +15 -23
  255. package/src/components/List/List.tsx +16 -20
  256. package/src/components/List/ListDropIndicator.tsx +7 -7
  257. package/src/components/List/Tree.stories.tsx +5 -6
  258. package/src/components/List/Tree.tsx +0 -1
  259. package/src/components/List/TreeDropIndicator.tsx +6 -6
  260. package/src/components/List/Treegrid.stories.tsx +29 -30
  261. package/src/components/List/Treegrid.tsx +23 -28
  262. package/src/components/Main/Main.stories.tsx +6 -96
  263. package/src/components/Main/Main.tsx +61 -212
  264. package/src/components/Menu/ContextMenu.stories.tsx +2 -3
  265. package/src/components/Menu/ContextMenu.tsx +9 -33
  266. package/src/components/Menu/DropdownMenu.stories.tsx +2 -3
  267. package/src/components/Menu/DropdownMenu.tsx +58 -52
  268. package/src/components/Message/Message.stories.tsx +26 -12
  269. package/src/components/Message/Message.tsx +14 -30
  270. package/src/components/Popover/Popover.stories.tsx +7 -8
  271. package/src/components/Popover/Popover.tsx +62 -59
  272. package/src/components/ScrollArea/ScrollArea.stories.tsx +214 -75
  273. package/src/components/ScrollArea/ScrollArea.tsx +85 -113
  274. package/src/components/ScrollArea/index.ts +1 -1
  275. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +47 -26
  276. package/src/components/ScrollContainer/ScrollContainer.tsx +206 -92
  277. package/src/components/Select/Select.stories.tsx +7 -8
  278. package/src/components/Select/Select.tsx +11 -27
  279. package/src/components/Separator/Separator.tsx +5 -8
  280. package/src/components/Skeleton/Skeleton.stories.tsx +51 -0
  281. package/src/components/Skeleton/Skeleton.tsx +26 -0
  282. package/src/components/Skeleton/index.ts +5 -0
  283. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  284. package/src/components/Splitter/Splitter.tsx +127 -0
  285. package/src/components/Splitter/index.ts +5 -0
  286. package/src/components/Status/Status.stories.tsx +21 -18
  287. package/src/components/Status/Status.tsx +10 -7
  288. package/src/components/Tag/Tag.stories.tsx +4 -10
  289. package/src/components/Tag/Tag.tsx +2 -7
  290. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +31 -0
  291. package/src/components/ThemeProvider/ThemeProvider.tsx +9 -7
  292. package/src/components/Toast/Toast.stories.tsx +2 -3
  293. package/src/components/Toast/Toast.tsx +22 -41
  294. package/src/components/Toolbar/Toolbar.stories.tsx +2 -3
  295. package/src/components/Toolbar/Toolbar.tsx +173 -26
  296. package/src/components/Tooltip/Tooltip.stories.tsx +20 -19
  297. package/src/components/Tooltip/Tooltip.tsx +18 -18
  298. package/src/components/index.ts +10 -5
  299. package/src/exemplars/generics.stories.tsx +41 -0
  300. package/src/exemplars/slot.stories.tsx +117 -0
  301. package/src/exemplars/tabster.stories.tsx +127 -0
  302. package/src/exemplars/virtualizer.stories.tsx +137 -0
  303. package/src/hooks/index.ts +1 -0
  304. package/src/hooks/useDensityContext.ts +2 -2
  305. package/src/index.ts +1 -0
  306. package/src/playground/Controls.stories.tsx +3 -10
  307. package/src/playground/Custom.stories.tsx +15 -18
  308. package/src/playground/Typography.stories.tsx +3 -3
  309. package/src/primitives/Column/AUDIT.md +354 -0
  310. package/src/primitives/Column/Column.stories.tsx +183 -0
  311. package/src/primitives/Column/Column.tsx +169 -0
  312. package/src/primitives/Column/index.ts +5 -0
  313. package/src/primitives/Container/Container.stories.tsx +29 -0
  314. package/src/primitives/Container/Container.tsx +19 -0
  315. package/src/primitives/Container/index.ts +5 -0
  316. package/src/primitives/Flex/Flex.stories.tsx +57 -0
  317. package/src/primitives/Flex/Flex.tsx +27 -0
  318. package/src/primitives/Flex/index.ts +5 -0
  319. package/src/primitives/Grid/Grid.stories.tsx +56 -0
  320. package/src/primitives/Grid/Grid.tsx +30 -0
  321. package/src/primitives/Grid/index.ts +5 -0
  322. package/src/primitives/Panel/Panel.stories.tsx +68 -0
  323. package/src/primitives/Panel/Panel.tsx +120 -0
  324. package/src/primitives/Panel/index.ts +5 -0
  325. package/src/primitives/index.ts +9 -0
  326. package/src/testing/Loading.tsx +47 -0
  327. package/src/testing/decorators/withLayout.tsx +21 -7
  328. package/src/testing/decorators/withLayoutVariants.tsx +18 -21
  329. package/src/testing/decorators/withTheme.tsx +24 -19
  330. package/src/testing/index.ts +2 -0
  331. package/src/translations.ts +19 -0
  332. package/src/util/usePx.ts +1 -0
  333. package/dist/lib/browser/chunk-CEKVHJ27.mjs.map +0 -7
  334. package/dist/lib/node-esm/chunk-2NHEX4AD.mjs.map +0 -7
  335. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  336. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  337. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  338. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  339. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
  340. package/src/components/AnchoredOverflow/index.ts +0 -5
@@ -2,12 +2,18 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import { Primitive } from '@radix-ui/react-primitive';
6
+ import { Slot } from '@radix-ui/react-slot';
5
7
  import type { ToggleGroupItemProps as ToggleGroupItemPrimitiveProps } from '@radix-ui/react-toggle-group';
6
8
  import * as ToolbarPrimitive from '@radix-ui/react-toolbar';
7
- import React, { Fragment, forwardRef } from 'react';
9
+ import React, { forwardRef } from 'react';
10
+ import { useTranslation } from 'react-i18next';
11
+
12
+ import { composable, composableProps, slottable, type ToolbarStyleProps } from '@dxos/ui-theme';
13
+ import { type SlottableProps } from '@dxos/ui-types';
8
14
 
9
15
  import { useThemeContext } from '../../hooks';
10
- import { type ThemedClassName } from '../../util';
16
+ import { translationKey } from '../../translations';
11
17
  import {
12
18
  Button,
13
19
  ButtonGroup,
@@ -20,41 +26,57 @@ import {
20
26
  type ToggleProps,
21
27
  } from '../Button';
22
28
  import { Link, type LinkProps } from '../Link';
29
+ import { DropdownMenu } from '../Menu';
23
30
  import { Separator, type SeparatorProps } from '../Separator';
24
31
 
25
- type ToolbarRootProps = ThemedClassName<
26
- ToolbarPrimitive.ToolbarProps & {
27
- disabled?: boolean;
28
- layoutManaged?: boolean; // TODO(burdon): Replace with Toolbar.Content to allow inner layout management?
29
- textBlockWidth?: boolean;
30
- }
31
- >;
32
-
33
- // TODO(burdon): Implement asChild.
34
- const ToolbarRoot = forwardRef<HTMLDivElement, ToolbarRootProps>(
35
- ({ classNames, children, disabled, layoutManaged, textBlockWidth: textBlockWidthProp, ...props }, forwardedRef) => {
32
+ //
33
+ // Root
34
+ //
35
+
36
+ type ToolbarRootProps = ToolbarPrimitive.ToolbarProps & ToolbarStyleProps;
37
+
38
+ const ToolbarRoot = composable<HTMLDivElement, ToolbarRootProps>(
39
+ ({ children, density, disabled, layoutManaged, orientation, ...props }, forwardedRef) => {
40
+ const { className, role, ...rest } = composableProps(props);
36
41
  const { tx } = useThemeContext();
37
- const InnerRoot = textBlockWidthProp ? 'div' : Fragment;
38
- const innerRootProps = textBlockWidthProp
39
- ? {
40
- role: 'none',
41
- className: tx('toolbar.inner', 'toolbar', { layoutManaged }, classNames),
42
- }
43
- : {};
44
42
 
45
43
  return (
46
44
  <ToolbarPrimitive.Root
47
- {...props}
48
- data-arrow-keys={props.orientation === 'vertical' ? 'up down' : 'left right'}
49
- className={tx('toolbar.root', 'toolbar', { layoutManaged, disabled }, classNames)}
45
+ {...rest}
46
+ // Only pass role when explicitly set; radix provides role="toolbar" by default.
47
+ {...(role !== 'none' && { role })}
48
+ orientation={orientation}
49
+ data-arrow-keys={orientation === 'vertical' ? 'up down' : 'left right'}
50
+ className={tx('toolbar.root', { density, disabled, layoutManaged }, className)}
50
51
  ref={forwardedRef}
51
52
  >
52
- <InnerRoot {...innerRootProps}>{children}</InnerRoot>
53
+ {children}
53
54
  </ToolbarPrimitive.Root>
54
55
  );
55
56
  },
56
57
  );
57
58
 
59
+ //
60
+ // Text
61
+ //
62
+
63
+ type ToolbarTextProps = SlottableProps;
64
+
65
+ const ToolbarText = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
66
+ const { className, ...rest } = composableProps(props);
67
+ const Comp = asChild ? Slot : Primitive.div;
68
+ const { tx } = useThemeContext();
69
+ return (
70
+ <Comp {...rest} className={tx('toolbar.text', {}, className)} ref={forwardedRef}>
71
+ {children}
72
+ </Comp>
73
+ );
74
+ });
75
+
76
+ //
77
+ // Button
78
+ //
79
+
58
80
  type ToolbarButtonProps = ButtonProps;
59
81
 
60
82
  const ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>((props, forwardedRef) => {
@@ -65,6 +87,10 @@ const ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>((props,
65
87
  );
66
88
  });
67
89
 
90
+ //
91
+ // IconButton
92
+ //
93
+
68
94
  type ToolbarIconButtonProps = IconButtonProps;
69
95
 
70
96
  const ToolbarIconButton = forwardRef<HTMLButtonElement, ToolbarIconButtonProps>((props, forwardedRef) => {
@@ -85,6 +111,10 @@ const ToolbarToggle = forwardRef<HTMLButtonElement, ToolbarToggleProps>((props,
85
111
  );
86
112
  });
87
113
 
114
+ //
115
+ // Link
116
+ //
117
+
88
118
  type ToolbarLinkProps = LinkProps;
89
119
 
90
120
  const ToolbarLink = forwardRef<HTMLAnchorElement, ToolbarLinkProps>((props, forwardedRef) => {
@@ -101,6 +131,10 @@ type ToolbarToggleGroupProps = (
101
131
  ) &
102
132
  ButtonGroupProps;
103
133
 
134
+ //
135
+ // ToggleGroup
136
+ //
137
+
104
138
  const ToolbarToggleGroup = forwardRef<HTMLDivElement, ToolbarToggleGroupProps>(
105
139
  ({ classNames, children, elevation, ...props }, forwardedRef) => {
106
140
  return (
@@ -146,13 +180,17 @@ const ToolbarToggleGroupIconItem = forwardRef<HTMLButtonElement, ToolbarToggleGr
146
180
  },
147
181
  );
148
182
 
183
+ //
184
+ // Separator
185
+ //
186
+
149
187
  type ToolbarSeparatorProps = SeparatorProps & { variant?: 'gap' | 'line' };
150
188
 
151
189
  const ToolbarSeparator = forwardRef<HTMLDivElement, ToolbarSeparatorProps>(
152
- ({ variant = 'line', ...props }, forwardedRef) => {
190
+ ({ variant = 'gap', ...props }, forwardedRef) => {
153
191
  return variant === 'line' ? (
154
192
  <ToolbarPrimitive.Separator asChild>
155
- <Separator {...props} ref={forwardedRef} />
193
+ <Separator orientation='vertical' {...props} ref={forwardedRef} />
156
194
  </ToolbarPrimitive.Separator>
157
195
  ) : (
158
196
  <ToolbarPrimitive.Separator className='grow' ref={forwardedRef} />
@@ -160,8 +198,109 @@ const ToolbarSeparator = forwardRef<HTMLDivElement, ToolbarSeparatorProps>(
160
198
  },
161
199
  );
162
200
 
201
+ //
202
+ // DragHandle
203
+ //
204
+
205
+ type ToolbarDragHandleProps = { testId?: string; label?: string };
206
+
207
+ const ToolbarDragHandle = forwardRef<HTMLButtonElement, ToolbarDragHandleProps>(
208
+ ({ testId = 'drag-handle', label }, forwardedRef) => {
209
+ const { t } = useTranslation(translationKey);
210
+ return (
211
+ <ToolbarIconButton
212
+ data-testid={testId}
213
+ tabIndex={-1}
214
+ noTooltip
215
+ iconOnly
216
+ icon='ph--dots-six-vertical--regular'
217
+ variant='ghost'
218
+ label={label ?? t('toolbar-drag-handle.label')}
219
+ classNames='dx-focus-ring-none cursor-pointer'
220
+ disabled={!forwardedRef}
221
+ ref={forwardedRef}
222
+ />
223
+ );
224
+ },
225
+ );
226
+
227
+ //
228
+ // CloseIconButton
229
+ //
230
+
231
+ type ToolbarCloseIconButtonProps = { onClick?: () => void; label?: string };
232
+
233
+ const ToolbarCloseIconButton = forwardRef<HTMLButtonElement, ToolbarCloseIconButtonProps>(
234
+ ({ onClick, label }, forwardedRef) => {
235
+ const { t } = useTranslation(translationKey);
236
+
237
+ return (
238
+ <ToolbarIconButton
239
+ iconOnly
240
+ icon='ph--x--regular'
241
+ variant='ghost'
242
+ label={label ?? t('toolbar-close.label')}
243
+ classNames='cursor-pointer'
244
+ onClick={onClick}
245
+ ref={forwardedRef}
246
+ />
247
+ );
248
+ },
249
+ );
250
+
251
+ //
252
+ // Menu
253
+ //
254
+
255
+ type ToolbarMenuItem<T extends any | void = void> = {
256
+ label: string;
257
+ onClick: (context: T) => void;
258
+ };
259
+
260
+ type ToolbarMenuProps<T extends any | void = void> = {
261
+ context?: T;
262
+ items?: ToolbarMenuItem<T>[];
263
+ };
264
+
265
+ // TODO(burdon): Make slottable.
266
+ const ToolbarMenu = <T extends any | void = void>({ context, items }: ToolbarMenuProps<T>) => {
267
+ const { t } = useTranslation(translationKey);
268
+
269
+ return (
270
+ <DropdownMenu.Root>
271
+ <DropdownMenu.Trigger disabled={!items?.length} asChild>
272
+ <ToolbarIconButton
273
+ iconOnly
274
+ variant='ghost'
275
+ icon='ph--dots-three-vertical--regular'
276
+ label={t('toolbar-menu.label')}
277
+ />
278
+ </DropdownMenu.Trigger>
279
+ {(items?.length ?? 0) > 0 && (
280
+ <DropdownMenu.Portal>
281
+ <DropdownMenu.Content>
282
+ <DropdownMenu.Viewport>
283
+ {items?.map(({ label, onClick: onSelect }, index) => (
284
+ <DropdownMenu.Item key={index} onSelect={() => onSelect(context as T)}>
285
+ {label}
286
+ </DropdownMenu.Item>
287
+ ))}
288
+ </DropdownMenu.Viewport>
289
+ <DropdownMenu.Arrow />
290
+ </DropdownMenu.Content>
291
+ </DropdownMenu.Portal>
292
+ )}
293
+ </DropdownMenu.Root>
294
+ );
295
+ };
296
+
297
+ //
298
+ // Toolbar
299
+ //
300
+
163
301
  export const Toolbar = {
164
302
  Root: ToolbarRoot,
303
+ Text: ToolbarText,
165
304
  Button: ToolbarButton,
166
305
  IconButton: ToolbarIconButton,
167
306
  Link: ToolbarLink,
@@ -170,10 +309,14 @@ export const Toolbar = {
170
309
  ToggleGroupItem: ToolbarToggleGroupItem,
171
310
  ToggleGroupIconItem: ToolbarToggleGroupIconItem,
172
311
  Separator: ToolbarSeparator,
312
+ DragHandle: ToolbarDragHandle,
313
+ CloseIconButton: ToolbarCloseIconButton,
314
+ Menu: ToolbarMenu,
173
315
  };
174
316
 
175
317
  export type {
176
318
  ToolbarRootProps,
319
+ ToolbarTextProps,
177
320
  ToolbarButtonProps,
178
321
  ToolbarIconButtonProps,
179
322
  ToolbarLinkProps,
@@ -182,4 +325,8 @@ export type {
182
325
  ToolbarToggleGroupItemProps,
183
326
  ToolbarToggleGroupIconItemProps,
184
327
  ToolbarSeparatorProps,
328
+ ToolbarDragHandleProps,
329
+ ToolbarCloseIconButtonProps,
330
+ ToolbarMenuItem,
331
+ ToolbarMenuProps,
185
332
  };
@@ -5,35 +5,36 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React from 'react';
7
7
 
8
- import { faker } from '@dxos/random';
8
+ import { random } from '@dxos/random';
9
9
 
10
10
  import { withTheme } from '../../testing';
11
11
  import { Button } from '../Button';
12
-
13
12
  import { Tooltip } from './Tooltip';
14
13
 
15
- type StoryProps = {
14
+ type DefaultStoryProps = {
16
15
  tooltips: { label: string; content: string }[];
17
16
  defaultOpen?: boolean;
18
17
  };
19
18
 
20
- const DefaultStory = ({ tooltips, defaultOpen }: StoryProps) => (
21
- <Tooltip.Provider defaultOpen={defaultOpen}>
22
- <div role='none' className='is-32'>
23
- {tooltips.map(({ label, content }, i) => (
24
- <Tooltip.Trigger asChild key={i} content={content} side='right'>
25
- <Button classNames='block is-full'>{label}</Button>
26
- </Tooltip.Trigger>
27
- ))}
28
- </div>
29
- </Tooltip.Provider>
30
- );
19
+ const DefaultStory = ({ tooltips, defaultOpen }: DefaultStoryProps) => {
20
+ return (
21
+ <Tooltip.Provider defaultOpen={defaultOpen}>
22
+ <div role='none' 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,
@@ -60,13 +60,13 @@ type TooltipContextValue = {
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 {
@@ -215,9 +215,9 @@ const TooltipProvider: FC<TooltipProviderProps> = (props: TooltipScopedProps<Too
215
215
  isPointerInTransitRef.current = inTransit;
216
216
  }, [])}
217
217
  >
218
- <TooltipContent side={side} className={tx('tooltip.content', 'tooltip', { elevation })}>
218
+ <TooltipContent side={side} className={tx('tooltip.content', { elevation })}>
219
219
  {content}
220
- <TooltipArrow className={tx('tooltip.arrow', 'tooltip__arrow')} />
220
+ <TooltipArrow className={tx('tooltip.arrow')} />
221
221
  </TooltipContent>
222
222
  <TooltipVirtualTrigger virtualRef={triggerRef as RefObject<HTMLButtonElement>} />
223
223
  {children}
@@ -246,7 +246,7 @@ const TooltipVirtualTrigger = ({
246
246
 
247
247
  const TRIGGER_NAME = 'TooltipTrigger';
248
248
 
249
- type TooltipTriggerElement = ElementRef<typeof Primitive.button>;
249
+ type TooltipTriggerElement = ComponentRef<typeof Primitive.button>;
250
250
  type PrimitiveButtonProps = ComponentPropsWithoutRef<typeof Primitive.button>;
251
251
  type TooltipTriggerProps = PrimitiveButtonProps &
252
252
  Pick<TooltipProps, 'delayDuration'> & {
@@ -334,7 +334,7 @@ const [PortalProvider, usePortalContext] = createTooltipContext<PortalContextVal
334
334
  });
335
335
 
336
336
  type PortalProps = ComponentPropsWithoutRef<typeof PortalPrimitive>;
337
- interface TooltipPortalProps {
337
+ type TooltipPortalProps = {
338
338
  children?: ReactNode;
339
339
  /**
340
340
  * Specify a container element to portal the content into.
@@ -345,7 +345,7 @@ interface TooltipPortalProps {
345
345
  * controlling animation with React animation libraries.
346
346
  */
347
347
  forceMount?: true;
348
- }
348
+ };
349
349
 
350
350
  const TooltipPortal: FC<TooltipPortalProps> = (props: TooltipScopedProps<TooltipPortalProps>) => {
351
351
  const { __scopeTooltip, forceMount, children, container } = props;
@@ -370,13 +370,13 @@ TooltipPortal.displayName = PORTAL_NAME;
370
370
  const CONTENT_NAME = 'TooltipContent';
371
371
 
372
372
  type TooltipContentElement = TooltipContentImplElement;
373
- interface TooltipContentProps extends TooltipContentImplProps {
373
+ type TooltipContentProps = TooltipContentImplProps & {
374
374
  /**
375
375
  * Used to force mounting when more control is needed. Useful when
376
376
  * controlling animation with React animation libraries.
377
377
  */
378
378
  forceMount?: true;
379
- }
379
+ };
380
380
 
381
381
  const TooltipContent = forwardRef<TooltipContentElement, TooltipContentProps>(
382
382
  (props: TooltipScopedProps<TooltipContentProps>, forwardedRef) => {
@@ -400,7 +400,7 @@ type Point = { x: number; y: number };
400
400
  type Polygon = Point[];
401
401
 
402
402
  type TooltipContentHoverableElement = TooltipContentImplElement;
403
- interface TooltipContentHoverableProps extends TooltipContentImplProps {}
403
+ type TooltipContentHoverableProps = TooltipContentImplProps;
404
404
 
405
405
  const TooltipContentHoverable = forwardRef<TooltipContentHoverableElement, TooltipContentHoverableProps>(
406
406
  (props: TooltipScopedProps<TooltipContentHoverableProps>, forwardedRef) => {
@@ -479,10 +479,10 @@ const [VisuallyHiddenContentContextProvider, useVisuallyHiddenContentContext] =
479
479
  isInside: false,
480
480
  });
481
481
 
482
- type TooltipContentImplElement = ElementRef<typeof PopperPrimitive.Content>;
482
+ type TooltipContentImplElement = ComponentRef<typeof PopperPrimitive.Content>;
483
483
  type DismissableLayerProps = ComponentPropsWithoutRef<typeof DismissableLayer>;
484
484
  type PopperContentProps = ComponentPropsWithoutRef<typeof PopperPrimitive.Content>;
485
- interface TooltipContentImplProps extends Omit<PopperContentProps, 'onPlaced'> {
485
+ type TooltipContentImplProps = Omit<PopperContentProps, 'onPlaced'> & {
486
486
  /**
487
487
  * A more descriptive label for accessibility purpose
488
488
  */
@@ -498,7 +498,7 @@ interface TooltipContentImplProps extends Omit<PopperContentProps, 'onPlaced'> {
498
498
  * Can be prevented.
499
499
  */
500
500
  onPointerDownOutside?: DismissableLayerProps['onPointerDownOutside'];
501
- }
501
+ };
502
502
 
503
503
  const TooltipContentImpl = forwardRef<TooltipContentImplElement, TooltipContentImplProps>(
504
504
  (props: TooltipScopedProps<TooltipContentImplProps>, forwardedRef) => {
@@ -580,9 +580,9 @@ TooltipContent.displayName = CONTENT_NAME;
580
580
 
581
581
  const ARROW_NAME = 'TooltipArrow';
582
582
 
583
- type TooltipArrowElement = ElementRef<typeof PopperPrimitive.Arrow>;
583
+ type TooltipArrowElement = ComponentRef<typeof PopperPrimitive.Arrow>;
584
584
  type PopperArrowProps = ComponentPropsWithoutRef<typeof PopperPrimitive.Arrow>;
585
- interface TooltipArrowProps extends PopperArrowProps {}
585
+ type TooltipArrowProps = PopperArrowProps;
586
586
 
587
587
  const TooltipArrow = forwardRef<TooltipArrowElement, TooltipArrowProps>(
588
588
  (props: TooltipScopedProps<TooltipArrowProps>, forwardedRef) => {
@@ -2,13 +2,20 @@
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
11
  export * from './Button';
12
+ export * from './Card';
9
13
  export * from './Clipboard';
10
14
  export * from './Dialog';
15
+ export * from './ErrorFallback';
16
+ export * from './Focus';
11
17
  export * from './Icon';
18
+ export * from './Image';
12
19
  export * from './Input';
13
20
  export * from './Link';
14
21
  export * from './List';
@@ -21,11 +28,9 @@ export * from './ScrollArea';
21
28
  export * from './ScrollContainer';
22
29
  export * from './Select';
23
30
  export * from './Separator';
31
+ export * from './Skeleton';
32
+ export * from './Splitter';
24
33
  export * from './Tag';
25
34
  export * from './Toast';
26
35
  export * from './Toolbar';
27
36
  export * from './Tooltip';
28
-
29
- export * from './DensityProvider';
30
- export * from './ElevationProvider';
31
- export * from './ThemeProvider';
@@ -0,0 +1,41 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React from 'react';
7
+
8
+ import { slottable } from '@dxos/ui-theme';
9
+
10
+ import { withTheme } from '../testing';
11
+
12
+ /**
13
+ * Generic component pattern using the slottable factory.
14
+ */
15
+ const Component = slottable<HTMLDivElement>(({ children, ...props }, forwardedRef) => {
16
+ return (
17
+ <div {...props} ref={forwardedRef}>
18
+ {children}
19
+ </div>
20
+ );
21
+ });
22
+
23
+ const meta = {
24
+ title: 'ui/react-ui-core/exemplars/generics',
25
+ component: Component,
26
+ render: (props) => <Component {...props} />,
27
+ decorators: [withTheme()],
28
+ parameters: {
29
+ layout: 'centered',
30
+ },
31
+ } satisfies Meta;
32
+
33
+ export default meta;
34
+
35
+ type Story = StoryObj<typeof meta>;
36
+
37
+ export const Default: Story = {
38
+ args: {
39
+ children: 'Hello',
40
+ },
41
+ };
@@ -0,0 +1,117 @@
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, { PropsWithChildren } from 'react';
9
+
10
+ import { composable, composableProps, mx, slottable } from '@dxos/ui-theme';
11
+
12
+ import { withTheme } from '../testing';
13
+ import { ThemedClassName } from '../util';
14
+
15
+ /**
16
+ * Radix-style composition.
17
+ * All Radix primitive parts that render a DOM element accept an asChild prop.
18
+ * When asChild is set to true, Radix will not render a default DOM element,
19
+ * instead cloning the part's child and passing it the props and behavior required to make it functional.
20
+ * https://www.radix-ui.com/primitives/docs/guides/composition
21
+ */
22
+
23
+ const Outer = slottable<HTMLDivElement, { priority?: number }>(
24
+ ({ children, asChild, priority, ...props }, forwardedRef) => {
25
+ const Comp = asChild ? Slot : Primitive.div;
26
+ return (
27
+ <Comp
28
+ {...composableProps<HTMLDivElement>(props, { classNames: 'p-2 border border-red-500 rounded' })}
29
+ ref={forwardedRef}
30
+ >
31
+ {children}
32
+ </Comp>
33
+ );
34
+ },
35
+ );
36
+
37
+ const Middle = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
38
+ const Comp = asChild ? Slot : Primitive.div;
39
+ return (
40
+ <Comp
41
+ {...composableProps<HTMLDivElement>(props, { classNames: 'p-2 border border-red-500 rounded' })}
42
+ ref={forwardedRef}
43
+ >
44
+ {children}
45
+ </Comp>
46
+ );
47
+ });
48
+
49
+ const Leaf = composable<HTMLButtonElement>(({ children, ...props }, forwardedRef) => {
50
+ return (
51
+ <button
52
+ {...composableProps<HTMLButtonElement>(props, { classNames: 'p-2 border border-red-500 rounded' })}
53
+ ref={forwardedRef}
54
+ >
55
+ {children}
56
+ </button>
57
+ );
58
+ });
59
+
60
+ /** This isn't a valid child for a `slottable` component. */
61
+ const Simple = ({ children, classNames }: ThemedClassName<PropsWithChildren>) => (
62
+ <div role='none' className={mx(classNames)}>
63
+ {children}
64
+ </div>
65
+ );
66
+
67
+ const meta = {
68
+ title: 'ui/react-ui-core/exemplars/slot',
69
+ decorators: [withTheme()],
70
+ parameters: {
71
+ layout: 'centered',
72
+ },
73
+ } satisfies Meta;
74
+
75
+ export default meta;
76
+
77
+ type Story = StoryObj<typeof meta>;
78
+
79
+ export const Single: Story = {
80
+ render: () => (
81
+ <Outer asChild role='article' classNames='border-green-500' priority={1}>
82
+ <Leaf>Single asChild (non-compliant — see console)</Leaf>
83
+ </Outer>
84
+ ),
85
+ };
86
+
87
+ export const Nested: Story = {
88
+ render: () => (
89
+ <Outer asChild role='article' classNames='border-blue-500'>
90
+ <Middle asChild>
91
+ <Leaf>Nested asChild</Leaf>
92
+ </Middle>
93
+ </Outer>
94
+ ),
95
+ };
96
+
97
+ export const Inner: Story = {
98
+ render: () => (
99
+ <Outer asChild role='article' classNames='border-orange-500'>
100
+ <Middle asChild>
101
+ <Leaf>
102
+ <div role='none'>Leaf</div>
103
+ </Leaf>
104
+ </Middle>
105
+ </Outer>
106
+ ),
107
+ };
108
+
109
+ export const Error: Story = {
110
+ render: () => (
111
+ <Outer asChild role='none' classNames='p-2 border border-green-500 rounded'>
112
+ <Middle asChild>
113
+ <Simple>Simple</Simple>
114
+ </Middle>
115
+ </Outer>
116
+ ),
117
+ };