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

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