@dxos/react-ui 0.8.4-main.bc674ce → 0.8.4-main.bcb3aa67d6

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 (324) hide show
  1. package/dist/lib/browser/{chunk-CEKVHJ27.mjs → chunk-LUPEFGHJ.mjs} +119 -117
  2. package/dist/lib/browser/chunk-LUPEFGHJ.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +3084 -2081
  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 +59 -36
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/{chunk-2NHEX4AD.mjs → chunk-EQOBFLZC.mjs} +119 -117
  9. package/dist/lib/node-esm/chunk-EQOBFLZC.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +3084 -2081
  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 +59 -36
  14. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  15. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  16. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  17. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  18. package/dist/types/src/components/Button/Button.d.ts +2 -2
  19. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  20. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  21. package/dist/types/src/components/Button/IconButton.stories.d.ts +3 -0
  22. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
  23. package/dist/types/src/components/Button/Toggle.d.ts +2 -2
  24. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -1
  25. package/dist/types/src/components/Button/ToggleGroup.d.ts +6 -6
  26. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -1
  27. package/dist/types/src/components/Card/Card.d.ts +150 -0
  28. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  29. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  30. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  31. package/dist/types/src/components/Card/index.d.ts +2 -0
  32. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  33. package/dist/types/src/components/Clipboard/index.d.ts +10 -1
  34. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  35. package/dist/types/src/components/Dialog/AlertDialog.d.ts +41 -19
  36. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  37. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  38. package/dist/types/src/components/Dialog/Dialog.d.ts +48 -22
  39. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  40. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +6 -8
  41. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  42. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  43. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  44. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  45. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  46. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +8 -0
  47. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  48. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  49. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  50. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  51. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  52. package/dist/types/src/components/Focus/Focus.d.ts +44 -0
  53. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -0
  54. package/dist/types/src/components/Focus/Focus.stories.d.ts +9 -0
  55. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -0
  56. package/dist/types/src/components/Focus/index.d.ts +2 -0
  57. package/dist/types/src/components/Focus/index.d.ts.map +1 -0
  58. package/dist/types/src/components/Icon/Icon.d.ts +3 -0
  59. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  60. package/dist/types/src/components/Icon/Icon.stories.d.ts +11 -3
  61. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  62. package/dist/types/src/components/Image/Image.d.ts +14 -0
  63. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  64. package/dist/types/src/components/Image/Image.stories.d.ts +33 -0
  65. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  66. package/dist/types/src/components/Image/index.d.ts +2 -0
  67. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  68. package/dist/types/src/components/Input/Input.d.ts +4 -7
  69. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  70. package/dist/types/src/components/Input/Input.stories.d.ts +7 -7
  71. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  72. package/dist/types/src/components/List/List.d.ts +9 -3
  73. package/dist/types/src/components/List/List.d.ts.map +1 -1
  74. package/dist/types/src/components/List/List.stories.d.ts +8 -2
  75. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  76. package/dist/types/src/components/List/Treegrid.d.ts +9 -9
  77. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  78. package/dist/types/src/components/Main/Main.d.ts +6 -32
  79. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  80. package/dist/types/src/components/Main/Main.stories.d.ts +1 -5
  81. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  82. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -1
  83. package/dist/types/src/components/Menu/DropdownMenu.d.ts +51 -50
  84. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
  85. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +14 -1
  86. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
  87. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  88. package/dist/types/src/components/Message/Message.stories.d.ts +4 -5
  89. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  90. package/dist/types/src/components/Popover/Popover.d.ts +32 -23
  91. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  92. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +31 -25
  93. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  94. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +62 -9
  95. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  96. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +45 -12
  97. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  98. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +9 -5
  99. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  100. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  101. package/dist/types/src/components/Select/Select.stories.d.ts +2 -2
  102. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  103. package/dist/types/src/components/Separator/Separator.d.ts +3 -3
  104. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  105. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  106. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  107. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  108. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  109. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  110. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  111. package/dist/types/src/components/Splitter/Splitter.d.ts +37 -0
  112. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  113. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  114. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  115. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  116. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  117. package/dist/types/src/components/Status/Status.d.ts +3 -4
  118. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  119. package/dist/types/src/components/Status/Status.stories.d.ts +4 -2
  120. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  121. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  122. package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
  123. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  124. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +2 -1
  125. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  126. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts +12 -0
  127. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  128. package/dist/types/src/components/Toast/Toast.d.ts +15 -15
  129. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  130. package/dist/types/src/components/Toolbar/Toolbar.d.ts +37 -11
  131. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  132. package/dist/types/src/components/Tooltip/Tooltip.d.ts +9 -9
  133. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  134. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +2 -2
  135. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  136. package/dist/types/src/components/index.d.ts +9 -4
  137. package/dist/types/src/components/index.d.ts.map +1 -1
  138. package/dist/types/src/exemplars/generics.stories.d.ts +23 -0
  139. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  140. package/dist/types/src/exemplars/slot.stories.d.ts +15 -0
  141. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  142. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  143. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  144. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  145. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  146. package/dist/types/src/hooks/index.d.ts +1 -0
  147. package/dist/types/src/hooks/index.d.ts.map +1 -1
  148. package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
  149. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  150. package/dist/types/src/index.d.ts +1 -0
  151. package/dist/types/src/index.d.ts.map +1 -1
  152. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  153. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  154. package/dist/types/src/primitives/Column/Column.d.ts +51 -0
  155. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  156. package/dist/types/src/primitives/Column/Column.stories.d.ts +25 -0
  157. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  158. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  159. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  160. package/dist/types/src/primitives/Container/Container.d.ts +11 -0
  161. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  162. package/dist/types/src/primitives/Container/Container.stories.d.ts +6 -0
  163. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  164. package/dist/types/src/primitives/Container/index.d.ts +2 -0
  165. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  166. package/dist/types/src/primitives/Flex/Flex.d.ts +15 -0
  167. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  168. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  169. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  170. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  171. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  172. package/dist/types/src/primitives/Grid/Grid.d.ts +14 -0
  173. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  174. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  175. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  176. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  177. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  178. package/dist/types/src/primitives/Panel/Panel.d.ts +46 -0
  179. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  180. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  181. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  182. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  183. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  184. package/dist/types/src/primitives/index.d.ts +6 -0
  185. package/dist/types/src/primitives/index.d.ts.map +1 -0
  186. package/dist/types/src/testing/Loading.d.ts +9 -0
  187. package/dist/types/src/testing/Loading.d.ts.map +1 -0
  188. package/dist/types/src/testing/decorators/withLayout.d.ts +1 -1
  189. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  190. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  191. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  192. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  193. package/dist/types/src/testing/index.d.ts +1 -0
  194. package/dist/types/src/testing/index.d.ts.map +1 -1
  195. package/dist/types/src/translations.d.ts +11 -0
  196. package/dist/types/src/translations.d.ts.map +1 -0
  197. package/dist/types/src/util/usePx.d.ts.map +1 -1
  198. package/dist/types/tsconfig.tsbuildinfo +1 -1
  199. package/package.json +27 -22
  200. package/src/components/Avatars/Avatar.stories.tsx +7 -8
  201. package/src/components/Avatars/Avatar.tsx +5 -12
  202. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -2
  203. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +3 -3
  204. package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
  205. package/src/components/Button/Button.stories.tsx +3 -3
  206. package/src/components/Button/Button.tsx +11 -25
  207. package/src/components/Button/IconButton.stories.tsx +8 -5
  208. package/src/components/Button/IconButton.tsx +2 -3
  209. package/src/components/Button/Toggle.stories.tsx +2 -2
  210. package/src/components/Button/Toggle.tsx +4 -4
  211. package/src/components/Button/ToggleGroup.stories.tsx +2 -2
  212. package/src/components/Button/ToggleGroup.tsx +12 -16
  213. package/src/components/Card/Card.stories.tsx +151 -0
  214. package/src/components/Card/Card.tsx +492 -0
  215. package/src/components/Card/index.ts +5 -0
  216. package/src/components/Clipboard/CopyButton.tsx +4 -4
  217. package/src/components/Dialog/AlertDialog.stories.tsx +16 -16
  218. package/src/components/Dialog/AlertDialog.tsx +124 -82
  219. package/src/components/Dialog/Dialog.stories.tsx +98 -17
  220. package/src/components/Dialog/Dialog.tsx +113 -87
  221. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +50 -0
  222. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  223. package/src/components/ErrorFallback/ErrorStack.tsx +80 -0
  224. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  225. package/src/components/ErrorFallback/index.ts +9 -0
  226. package/src/components/Focus/AUDIT.md +43 -0
  227. package/src/components/Focus/Focus.stories.tsx +230 -0
  228. package/src/components/Focus/Focus.tsx +201 -0
  229. package/src/components/Focus/index.ts +5 -0
  230. package/src/components/Icon/Icon.stories.tsx +45 -14
  231. package/src/components/Icon/Icon.tsx +6 -2
  232. package/src/components/Image/Image.stories.tsx +86 -0
  233. package/src/components/Image/Image.tsx +223 -0
  234. package/src/components/Image/index.ts +5 -0
  235. package/src/components/Input/Input.stories.tsx +20 -39
  236. package/src/components/Input/Input.tsx +24 -69
  237. package/src/components/Link/Link.stories.tsx +2 -2
  238. package/src/components/Link/Link.tsx +2 -2
  239. package/src/components/List/List.stories.tsx +15 -22
  240. package/src/components/List/List.tsx +16 -19
  241. package/src/components/List/ListDropIndicator.tsx +7 -7
  242. package/src/components/List/Tree.stories.tsx +5 -5
  243. package/src/components/List/TreeDropIndicator.tsx +6 -6
  244. package/src/components/List/Treegrid.stories.tsx +6 -6
  245. package/src/components/List/Treegrid.tsx +23 -28
  246. package/src/components/Main/Main.stories.tsx +6 -95
  247. package/src/components/Main/Main.tsx +61 -211
  248. package/src/components/Menu/ContextMenu.stories.tsx +2 -2
  249. package/src/components/Menu/ContextMenu.tsx +9 -33
  250. package/src/components/Menu/DropdownMenu.stories.tsx +2 -2
  251. package/src/components/Menu/DropdownMenu.tsx +58 -52
  252. package/src/components/Message/Message.stories.tsx +27 -12
  253. package/src/components/Message/Message.tsx +14 -30
  254. package/src/components/Popover/Popover.stories.tsx +4 -4
  255. package/src/components/Popover/Popover.tsx +62 -59
  256. package/src/components/ScrollArea/ScrollArea.stories.tsx +213 -73
  257. package/src/components/ScrollArea/ScrollArea.tsx +85 -113
  258. package/src/components/ScrollArea/index.ts +1 -1
  259. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +45 -23
  260. package/src/components/ScrollContainer/ScrollContainer.tsx +206 -92
  261. package/src/components/Select/Select.stories.tsx +4 -4
  262. package/src/components/Select/Select.tsx +11 -27
  263. package/src/components/Separator/Separator.tsx +5 -8
  264. package/src/components/Skeleton/Skeleton.stories.tsx +52 -0
  265. package/src/components/Skeleton/Skeleton.tsx +26 -0
  266. package/src/components/Skeleton/index.ts +5 -0
  267. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  268. package/src/components/Splitter/Splitter.tsx +139 -0
  269. package/src/components/Splitter/index.ts +5 -0
  270. package/src/components/Status/Status.stories.tsx +21 -17
  271. package/src/components/Status/Status.tsx +10 -7
  272. package/src/components/Tag/Tag.stories.tsx +4 -9
  273. package/src/components/Tag/Tag.tsx +2 -7
  274. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +32 -0
  275. package/src/components/ThemeProvider/ThemeProvider.tsx +9 -6
  276. package/src/components/Toast/Toast.stories.tsx +2 -2
  277. package/src/components/Toast/Toast.tsx +22 -41
  278. package/src/components/Toolbar/Toolbar.stories.tsx +2 -2
  279. package/src/components/Toolbar/Toolbar.tsx +174 -26
  280. package/src/components/Tooltip/Tooltip.stories.tsx +16 -14
  281. package/src/components/Tooltip/Tooltip.tsx +18 -18
  282. package/src/components/index.ts +10 -5
  283. package/src/exemplars/generics.stories.tsx +41 -0
  284. package/src/exemplars/slot.stories.tsx +117 -0
  285. package/src/exemplars/tabster.stories.tsx +127 -0
  286. package/src/exemplars/virtualizer.stories.tsx +137 -0
  287. package/src/hooks/index.ts +1 -0
  288. package/src/hooks/useDensityContext.ts +2 -2
  289. package/src/index.ts +1 -0
  290. package/src/playground/Controls.stories.tsx +3 -10
  291. package/src/playground/Custom.stories.tsx +11 -21
  292. package/src/playground/Typography.stories.tsx +3 -3
  293. package/src/primitives/Column/AUDIT.md +354 -0
  294. package/src/primitives/Column/Column.stories.tsx +183 -0
  295. package/src/primitives/Column/Column.tsx +169 -0
  296. package/src/primitives/Column/index.ts +5 -0
  297. package/src/primitives/Container/Container.stories.tsx +30 -0
  298. package/src/primitives/Container/Container.tsx +19 -0
  299. package/src/primitives/Container/index.ts +5 -0
  300. package/src/primitives/Flex/Flex.stories.tsx +58 -0
  301. package/src/primitives/Flex/Flex.tsx +27 -0
  302. package/src/primitives/Flex/index.ts +5 -0
  303. package/src/primitives/Grid/Grid.stories.tsx +57 -0
  304. package/src/primitives/Grid/Grid.tsx +30 -0
  305. package/src/primitives/Grid/index.ts +5 -0
  306. package/src/primitives/Panel/Panel.stories.tsx +69 -0
  307. package/src/primitives/Panel/Panel.tsx +114 -0
  308. package/src/primitives/Panel/index.ts +5 -0
  309. package/src/primitives/index.ts +9 -0
  310. package/src/testing/Loading.tsx +26 -0
  311. package/src/testing/decorators/withLayout.tsx +21 -7
  312. package/src/testing/decorators/withLayoutVariants.tsx +18 -21
  313. package/src/testing/decorators/withTheme.tsx +24 -19
  314. package/src/testing/index.ts +2 -0
  315. package/src/translations.ts +19 -0
  316. package/src/util/usePx.ts +1 -0
  317. package/dist/lib/browser/chunk-CEKVHJ27.mjs.map +0 -7
  318. package/dist/lib/node-esm/chunk-2NHEX4AD.mjs.map +0 -7
  319. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  320. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  321. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  322. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  323. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
  324. package/src/components/AnchoredOverflow/index.ts +0 -5
@@ -2,12 +2,19 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import { Primitive } from '@radix-ui/react-primitive';
6
+ import { Slot } from '@radix-ui/react-slot';
5
7
  import type { ToggleGroupItemProps as ToggleGroupItemPrimitiveProps } from '@radix-ui/react-toggle-group';
6
8
  import * as ToolbarPrimitive from '@radix-ui/react-toolbar';
7
- import React, { Fragment, forwardRef } from 'react';
9
+ import React, { forwardRef } from 'react';
10
+ import { useTranslation } from 'react-i18next';
11
+
12
+ import { composable, composableProps, slottable, type ToolbarStyleProps } from '@dxos/ui-theme';
13
+ import { type SlottableProps } from '@dxos/ui-types';
8
14
 
9
15
  import { useThemeContext } from '../../hooks';
10
- import { type ThemedClassName } from '../../util';
16
+ import { translationKey } from '../../translations';
17
+
11
18
  import {
12
19
  Button,
13
20
  ButtonGroup,
@@ -20,41 +27,57 @@ import {
20
27
  type ToggleProps,
21
28
  } from '../Button';
22
29
  import { Link, type LinkProps } from '../Link';
30
+ import { DropdownMenu } from '../Menu';
23
31
  import { Separator, type SeparatorProps } from '../Separator';
24
32
 
25
- type ToolbarRootProps = ThemedClassName<
26
- ToolbarPrimitive.ToolbarProps & {
27
- 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) => {
33
+ //
34
+ // Root
35
+ //
36
+
37
+ type ToolbarRootProps = ToolbarPrimitive.ToolbarProps & ToolbarStyleProps;
38
+
39
+ const ToolbarRoot = composable<HTMLDivElement, ToolbarRootProps>(
40
+ ({ children, density, disabled, layoutManaged, orientation, ...props }, forwardedRef) => {
41
+ const { className, role, ...rest } = composableProps(props);
36
42
  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
43
 
45
44
  return (
46
45
  <ToolbarPrimitive.Root
47
- {...props}
48
- data-arrow-keys={props.orientation === 'vertical' ? 'up down' : 'left right'}
49
- className={tx('toolbar.root', 'toolbar', { layoutManaged, disabled }, classNames)}
46
+ {...rest}
47
+ // Only pass role when explicitly set; radix provides role="toolbar" by default.
48
+ {...(role !== 'none' && { role })}
49
+ orientation={orientation}
50
+ data-arrow-keys={orientation === 'vertical' ? 'up down' : 'left right'}
51
+ className={tx('toolbar.root', { density, disabled, layoutManaged }, className)}
50
52
  ref={forwardedRef}
51
53
  >
52
- <InnerRoot {...innerRootProps}>{children}</InnerRoot>
54
+ {children}
53
55
  </ToolbarPrimitive.Root>
54
56
  );
55
57
  },
56
58
  );
57
59
 
60
+ //
61
+ // Text
62
+ //
63
+
64
+ type ToolbarTextProps = SlottableProps;
65
+
66
+ const ToolbarText = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
67
+ const { className, ...rest } = composableProps(props);
68
+ const Comp = asChild ? Slot : Primitive.div;
69
+ const { tx } = useThemeContext();
70
+ return (
71
+ <Comp {...rest} className={tx('toolbar.text', {}, className)} ref={forwardedRef}>
72
+ {children}
73
+ </Comp>
74
+ );
75
+ });
76
+
77
+ //
78
+ // Button
79
+ //
80
+
58
81
  type ToolbarButtonProps = ButtonProps;
59
82
 
60
83
  const ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>((props, forwardedRef) => {
@@ -65,6 +88,10 @@ const ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>((props,
65
88
  );
66
89
  });
67
90
 
91
+ //
92
+ // IconButton
93
+ //
94
+
68
95
  type ToolbarIconButtonProps = IconButtonProps;
69
96
 
70
97
  const ToolbarIconButton = forwardRef<HTMLButtonElement, ToolbarIconButtonProps>((props, forwardedRef) => {
@@ -85,6 +112,10 @@ const ToolbarToggle = forwardRef<HTMLButtonElement, ToolbarToggleProps>((props,
85
112
  );
86
113
  });
87
114
 
115
+ //
116
+ // Link
117
+ //
118
+
88
119
  type ToolbarLinkProps = LinkProps;
89
120
 
90
121
  const ToolbarLink = forwardRef<HTMLAnchorElement, ToolbarLinkProps>((props, forwardedRef) => {
@@ -101,6 +132,10 @@ type ToolbarToggleGroupProps = (
101
132
  ) &
102
133
  ButtonGroupProps;
103
134
 
135
+ //
136
+ // ToggleGroup
137
+ //
138
+
104
139
  const ToolbarToggleGroup = forwardRef<HTMLDivElement, ToolbarToggleGroupProps>(
105
140
  ({ classNames, children, elevation, ...props }, forwardedRef) => {
106
141
  return (
@@ -146,13 +181,17 @@ const ToolbarToggleGroupIconItem = forwardRef<HTMLButtonElement, ToolbarToggleGr
146
181
  },
147
182
  );
148
183
 
184
+ //
185
+ // Separator
186
+ //
187
+
149
188
  type ToolbarSeparatorProps = SeparatorProps & { variant?: 'gap' | 'line' };
150
189
 
151
190
  const ToolbarSeparator = forwardRef<HTMLDivElement, ToolbarSeparatorProps>(
152
- ({ variant = 'line', ...props }, forwardedRef) => {
191
+ ({ variant = 'gap', ...props }, forwardedRef) => {
153
192
  return variant === 'line' ? (
154
193
  <ToolbarPrimitive.Separator asChild>
155
- <Separator {...props} ref={forwardedRef} />
194
+ <Separator orientation='vertical' {...props} ref={forwardedRef} />
156
195
  </ToolbarPrimitive.Separator>
157
196
  ) : (
158
197
  <ToolbarPrimitive.Separator className='grow' ref={forwardedRef} />
@@ -160,8 +199,109 @@ const ToolbarSeparator = forwardRef<HTMLDivElement, ToolbarSeparatorProps>(
160
199
  },
161
200
  );
162
201
 
202
+ //
203
+ // DragHandle
204
+ //
205
+
206
+ type ToolbarDragHandleProps = { testId?: string; label?: string };
207
+
208
+ const ToolbarDragHandle = forwardRef<HTMLButtonElement, ToolbarDragHandleProps>(
209
+ ({ testId = 'drag-handle', label }, forwardedRef) => {
210
+ const { t } = useTranslation(translationKey);
211
+ return (
212
+ <ToolbarIconButton
213
+ data-testid={testId}
214
+ tabIndex={-1}
215
+ noTooltip
216
+ iconOnly
217
+ icon='ph--dots-six-vertical--regular'
218
+ variant='ghost'
219
+ label={label ?? t('toolbar-drag-handle.label')}
220
+ classNames='dx-focus-ring-none cursor-pointer'
221
+ disabled={!forwardedRef}
222
+ ref={forwardedRef}
223
+ />
224
+ );
225
+ },
226
+ );
227
+
228
+ //
229
+ // CloseIconButton
230
+ //
231
+
232
+ type ToolbarCloseIconButtonProps = { onClick?: () => void; label?: string };
233
+
234
+ const ToolbarCloseIconButton = forwardRef<HTMLButtonElement, ToolbarCloseIconButtonProps>(
235
+ ({ onClick, label }, forwardedRef) => {
236
+ const { t } = useTranslation(translationKey);
237
+
238
+ return (
239
+ <ToolbarIconButton
240
+ iconOnly
241
+ icon='ph--x--regular'
242
+ variant='ghost'
243
+ label={label ?? t('toolbar-close.label')}
244
+ classNames='cursor-pointer'
245
+ onClick={onClick}
246
+ ref={forwardedRef}
247
+ />
248
+ );
249
+ },
250
+ );
251
+
252
+ //
253
+ // Menu
254
+ //
255
+
256
+ type ToolbarMenuItem<T extends any | void = void> = {
257
+ label: string;
258
+ onClick: (context: T) => void;
259
+ };
260
+
261
+ type ToolbarMenuProps<T extends any | void = void> = {
262
+ context?: T;
263
+ items?: ToolbarMenuItem<T>[];
264
+ };
265
+
266
+ // TODO(burdon): Make slottable.
267
+ const ToolbarMenu = <T extends any | void = void>({ context, items }: ToolbarMenuProps<T>) => {
268
+ const { t } = useTranslation(translationKey);
269
+
270
+ return (
271
+ <DropdownMenu.Root>
272
+ <DropdownMenu.Trigger disabled={!items?.length} asChild>
273
+ <ToolbarIconButton
274
+ iconOnly
275
+ variant='ghost'
276
+ icon='ph--dots-three-vertical--regular'
277
+ label={t('toolbar-menu.label')}
278
+ />
279
+ </DropdownMenu.Trigger>
280
+ {(items?.length ?? 0) > 0 && (
281
+ <DropdownMenu.Portal>
282
+ <DropdownMenu.Content>
283
+ <DropdownMenu.Viewport>
284
+ {items?.map(({ label, onClick: onSelect }, index) => (
285
+ <DropdownMenu.Item key={index} onSelect={() => onSelect(context as T)}>
286
+ {label}
287
+ </DropdownMenu.Item>
288
+ ))}
289
+ </DropdownMenu.Viewport>
290
+ <DropdownMenu.Arrow />
291
+ </DropdownMenu.Content>
292
+ </DropdownMenu.Portal>
293
+ )}
294
+ </DropdownMenu.Root>
295
+ );
296
+ };
297
+
298
+ //
299
+ // Toolbar
300
+ //
301
+
163
302
  export const Toolbar = {
164
303
  Root: ToolbarRoot,
304
+ Text: ToolbarText,
165
305
  Button: ToolbarButton,
166
306
  IconButton: ToolbarIconButton,
167
307
  Link: ToolbarLink,
@@ -170,10 +310,14 @@ export const Toolbar = {
170
310
  ToggleGroupItem: ToolbarToggleGroupItem,
171
311
  ToggleGroupIconItem: ToolbarToggleGroupIconItem,
172
312
  Separator: ToolbarSeparator,
313
+ DragHandle: ToolbarDragHandle,
314
+ CloseIconButton: ToolbarCloseIconButton,
315
+ Menu: ToolbarMenu,
173
316
  };
174
317
 
175
318
  export type {
176
319
  ToolbarRootProps,
320
+ ToolbarTextProps,
177
321
  ToolbarButtonProps,
178
322
  ToolbarIconButtonProps,
179
323
  ToolbarLinkProps,
@@ -182,4 +326,8 @@ export type {
182
326
  ToolbarToggleGroupItemProps,
183
327
  ToolbarToggleGroupIconItemProps,
184
328
  ToolbarSeparatorProps,
329
+ ToolbarDragHandleProps,
330
+ ToolbarCloseIconButtonProps,
331
+ ToolbarMenuItem,
332
+ ToolbarMenuProps,
185
333
  };
@@ -12,28 +12,30 @@ import { Button } from '../Button';
12
12
 
13
13
  import { Tooltip } from './Tooltip';
14
14
 
15
- type StoryProps = {
15
+ type DefaultStoryProps = {
16
16
  tooltips: { label: string; content: string }[];
17
17
  defaultOpen?: boolean;
18
18
  };
19
19
 
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
- );
20
+ const DefaultStory = ({ tooltips, defaultOpen }: DefaultStoryProps) => {
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
+ };
31
33
 
32
34
  const meta = {
33
- title: 'ui/react-ui-core/Tooltip',
35
+ title: 'ui/react-ui-core/components/Tooltip',
34
36
  component: Tooltip as any,
35
37
  render: DefaultStory,
36
- decorators: [withTheme],
38
+ decorators: [withTheme()],
37
39
  } satisfies Meta<typeof DefaultStory>;
38
40
 
39
41
  export default meta;
@@ -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
+ };