@dxos/react-ui 0.8.4-main.406dc2a → 0.8.4-main.52d7546f51

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 (323) hide show
  1. package/dist/lib/browser/chunk-6DTBPJE4.mjs +774 -0
  2. package/dist/lib/browser/chunk-6DTBPJE4.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +3200 -64
  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 +37 -48
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/chunk-JKHQSGNU.mjs +776 -0
  9. package/dist/lib/node-esm/chunk-JKHQSGNU.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +3200 -64
  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 +37 -48
  14. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  15. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +7 -0
  16. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +1 -1
  17. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  18. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  19. package/dist/types/src/components/{Buttons → Button}/Button.d.ts +1 -1
  20. package/dist/types/src/components/Button/Button.d.ts.map +1 -0
  21. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -0
  22. package/dist/types/src/components/{Buttons → Button}/IconButton.d.ts +2 -2
  23. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -0
  24. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -0
  25. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -0
  26. package/dist/types/src/components/Button/Toggle.stories.d.ts +16 -0
  27. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -0
  28. package/dist/types/src/components/{Buttons → Button}/ToggleGroup.d.ts +4 -4
  29. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -0
  30. package/dist/types/src/components/{Buttons → Button}/ToggleGroup.stories.d.ts +4 -4
  31. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -0
  32. package/dist/types/src/components/Button/index.d.ts.map +1 -0
  33. package/dist/types/src/components/Clipboard/CopyButton.d.ts +1 -1
  34. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  35. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  36. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  37. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -0
  38. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -0
  39. package/dist/types/src/components/Dialog/Dialog.d.ts +46 -0
  40. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -0
  41. package/dist/types/src/components/{Dialogs → Dialog}/Dialog.stories.d.ts +7 -5
  42. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -0
  43. package/dist/types/src/components/Dialog/index.d.ts.map +1 -0
  44. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  45. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  46. package/dist/types/src/components/Icon/Icon.d.ts +1 -1
  47. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  48. package/dist/types/src/components/Icon/Icon.stories.d.ts +17 -0
  49. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -0
  50. package/dist/types/src/components/Input/Input.d.ts +5 -2
  51. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  52. package/dist/types/src/components/Input/Input.stories.d.ts +2 -2
  53. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  54. package/dist/types/src/components/{Lists → List}/List.d.ts +1 -1
  55. package/dist/types/src/components/List/List.d.ts.map +1 -0
  56. package/dist/types/src/components/List/List.stories.d.ts.map +1 -0
  57. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -0
  58. package/dist/types/src/components/List/Tree.d.ts.map +1 -0
  59. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -0
  60. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -0
  61. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -0
  62. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -0
  63. package/dist/types/src/components/List/index.d.ts.map +1 -0
  64. package/dist/types/src/components/Main/Main.d.ts +16 -17
  65. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  66. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  67. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  68. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  69. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  70. package/dist/types/src/components/{Menus → Menu}/DropdownMenu.d.ts +3 -4
  71. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  72. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  73. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  74. package/dist/types/src/components/Message/Message.d.ts +1 -1
  75. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  76. package/dist/types/src/components/Message/Message.stories.d.ts +1 -1
  77. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  78. package/dist/types/src/components/Popover/Popover.d.ts +1 -1
  79. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  80. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +25 -26
  81. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  82. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +46 -8
  83. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  84. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +39 -0
  85. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -0
  86. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +19 -0
  87. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -0
  88. package/dist/types/src/components/ScrollContainer/index.d.ts +2 -0
  89. package/dist/types/src/components/ScrollContainer/index.d.ts.map +1 -0
  90. package/dist/types/src/components/Select/Select.d.ts +10 -10
  91. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  92. package/dist/types/src/components/Separator/Separator.d.ts +1 -1
  93. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  94. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  95. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  96. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  97. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  98. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  99. package/dist/types/src/components/Splitter/Splitter.d.ts +26 -0
  100. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  101. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  102. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  103. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  104. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  105. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  106. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  107. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +2 -2
  108. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  109. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
  110. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  111. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  112. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  113. package/dist/types/src/components/Toast/Toast.d.ts +4 -4
  114. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  115. package/dist/types/src/components/Toolbar/Toolbar.d.ts +14 -11
  116. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  117. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  118. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  119. package/dist/types/src/components/index.d.ts +7 -4
  120. package/dist/types/src/components/index.d.ts.map +1 -1
  121. package/dist/types/src/exemplars/generics.stories.d.ts +17 -0
  122. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  123. package/dist/types/src/exemplars/slot.stories.d.ts +14 -0
  124. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  125. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  126. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  127. package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
  128. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  129. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  130. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  131. package/dist/types/src/index.d.ts +2 -1
  132. package/dist/types/src/index.d.ts.map +1 -1
  133. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  134. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  135. package/dist/types/src/primitives/Container/Container.d.ts +23 -0
  136. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  137. package/dist/types/src/primitives/Container/Container.stories.d.ts +11 -0
  138. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  139. package/dist/types/src/primitives/Container/Layout.d.ts +18 -0
  140. package/dist/types/src/primitives/Container/Layout.d.ts.map +1 -0
  141. package/dist/types/src/primitives/Container/Layout.stories.d.ts +10 -0
  142. package/dist/types/src/primitives/Container/Layout.stories.d.ts.map +1 -0
  143. package/dist/types/src/primitives/Container/index.d.ts +3 -0
  144. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  145. package/dist/types/src/primitives/Flex/Flex.d.ts +8 -0
  146. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  147. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  148. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  149. package/dist/types/src/primitives/index.d.ts +3 -0
  150. package/dist/types/src/primitives/index.d.ts.map +1 -0
  151. package/dist/types/src/testing/decorators/index.d.ts +1 -1
  152. package/dist/types/src/testing/decorators/index.d.ts.map +1 -1
  153. package/dist/types/src/testing/decorators/withLayout.d.ts +3 -3
  154. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  155. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +12 -0
  156. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -0
  157. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  158. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  159. package/dist/types/src/util/index.d.ts +1 -2
  160. package/dist/types/src/util/index.d.ts.map +1 -1
  161. package/dist/types/tsconfig.tsbuildinfo +1 -1
  162. package/package.json +38 -30
  163. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +10 -12
  164. package/src/components/Avatars/Avatar.stories.tsx +4 -4
  165. package/src/components/Avatars/Avatar.tsx +3 -10
  166. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -2
  167. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +3 -3
  168. package/src/components/Breadcrumb/Breadcrumb.tsx +5 -31
  169. package/src/components/{Buttons → Button}/Button.stories.tsx +3 -3
  170. package/src/components/{Buttons → Button}/Button.tsx +2 -8
  171. package/src/components/{Buttons → Button}/IconButton.stories.tsx +2 -2
  172. package/src/components/{Buttons → Button}/IconButton.tsx +20 -14
  173. package/src/components/{Buttons → Button}/Toggle.stories.tsx +7 -6
  174. package/src/components/{Buttons → Button}/ToggleGroup.stories.tsx +2 -2
  175. package/src/components/Clipboard/CopyButton.tsx +4 -4
  176. package/src/components/DensityProvider/DensityProvider.tsx +1 -1
  177. package/src/components/{Dialogs → Dialog}/AlertDialog.stories.tsx +3 -3
  178. package/src/components/{Dialogs → Dialog}/AlertDialog.tsx +3 -8
  179. package/src/components/Dialog/Dialog.stories.tsx +101 -0
  180. package/src/components/{Dialogs → Dialog}/Dialog.tsx +171 -46
  181. package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
  182. package/src/components/Icon/Icon.stories.tsx +113 -0
  183. package/src/components/Icon/Icon.tsx +3 -3
  184. package/src/components/Input/Input.stories.tsx +12 -11
  185. package/src/components/Input/Input.tsx +23 -29
  186. package/src/components/Link/Link.stories.tsx +2 -2
  187. package/src/components/Link/Link.tsx +1 -1
  188. package/src/components/{Lists → List}/List.stories.tsx +19 -15
  189. package/src/components/{Lists → List}/List.tsx +8 -14
  190. package/src/components/{Lists → List}/ListDropIndicator.tsx +1 -1
  191. package/src/components/{Lists → List}/Tree.stories.tsx +2 -2
  192. package/src/components/{Lists → List}/Treegrid.stories.tsx +2 -2
  193. package/src/components/{Lists → List}/Treegrid.tsx +4 -9
  194. package/src/components/Main/Main.stories.tsx +41 -20
  195. package/src/components/Main/Main.tsx +139 -82
  196. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +2 -2
  197. package/src/components/{Menus → Menu}/ContextMenu.tsx +7 -31
  198. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +3 -3
  199. package/src/components/{Menus → Menu}/DropdownMenu.tsx +87 -66
  200. package/src/components/Message/Message.stories.tsx +3 -3
  201. package/src/components/Message/Message.tsx +34 -23
  202. package/src/components/Popover/Popover.stories.tsx +3 -3
  203. package/src/components/Popover/Popover.tsx +55 -36
  204. package/src/components/ScrollArea/ScrollArea.stories.tsx +166 -40
  205. package/src/components/ScrollArea/ScrollArea.tsx +80 -82
  206. package/src/components/ScrollArea/index.ts +1 -1
  207. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +70 -0
  208. package/src/components/ScrollContainer/ScrollContainer.tsx +238 -0
  209. package/src/components/ScrollContainer/index.ts +5 -0
  210. package/src/components/Select/Select.stories.tsx +3 -3
  211. package/src/components/Select/Select.tsx +13 -29
  212. package/src/components/Separator/Separator.tsx +1 -1
  213. package/src/components/Skeleton/Skeleton.stories.tsx +52 -0
  214. package/src/components/Skeleton/Skeleton.tsx +26 -0
  215. package/src/components/Skeleton/index.ts +5 -0
  216. package/src/components/Splitter/Splitter.stories.tsx +73 -0
  217. package/src/components/Splitter/Splitter.tsx +123 -0
  218. package/src/components/Splitter/index.ts +5 -0
  219. package/src/components/Status/Status.stories.tsx +2 -2
  220. package/src/components/Status/Status.tsx +2 -2
  221. package/src/components/Tag/Tag.stories.tsx +4 -4
  222. package/src/components/Tag/Tag.tsx +2 -7
  223. package/src/components/ThemeProvider/ThemeProvider.tsx +3 -4
  224. package/src/components/ThemeProvider/TranslationsProvider.tsx +1 -16
  225. package/src/components/ThemeProvider/index.ts +3 -3
  226. package/src/components/Toast/Toast.stories.tsx +3 -3
  227. package/src/components/Toast/Toast.tsx +6 -10
  228. package/src/components/Toolbar/Toolbar.stories.tsx +4 -6
  229. package/src/components/Toolbar/Toolbar.tsx +32 -12
  230. package/src/components/Tooltip/Tooltip.stories.tsx +3 -3
  231. package/src/components/Tooltip/Tooltip.tsx +24 -22
  232. package/src/components/index.ts +7 -4
  233. package/src/exemplars/generics.stories.tsx +44 -0
  234. package/src/exemplars/slot.stories.tsx +108 -0
  235. package/src/exemplars/tabster.stories.tsx +127 -0
  236. package/src/hooks/useDensityContext.ts +1 -1
  237. package/src/hooks/useElevationContext.ts +1 -1
  238. package/src/index.ts +2 -1
  239. package/src/playground/Controls.stories.tsx +3 -4
  240. package/src/playground/Custom.stories.tsx +8 -10
  241. package/src/playground/Typography.stories.tsx +2 -2
  242. package/src/primitives/Container/Container.stories.tsx +67 -0
  243. package/src/primitives/Container/Container.tsx +79 -0
  244. package/src/primitives/Container/Layout.stories.tsx +57 -0
  245. package/src/primitives/Container/Layout.tsx +61 -0
  246. package/src/primitives/Container/index.ts +6 -0
  247. package/src/primitives/Flex/Flex.tsx +26 -0
  248. package/src/primitives/Flex/index.ts +5 -0
  249. package/src/primitives/index.ts +6 -0
  250. package/src/testing/decorators/index.ts +1 -1
  251. package/src/testing/decorators/withLayout.tsx +22 -15
  252. package/src/testing/decorators/{withSurfaceVariantsLayout.tsx → withLayoutVariants.tsx} +5 -5
  253. package/src/testing/decorators/withTheme.tsx +21 -18
  254. package/src/util/index.ts +2 -2
  255. package/dist/lib/browser/chunk-KX5JDELJ.mjs +0 -4521
  256. package/dist/lib/browser/chunk-KX5JDELJ.mjs.map +0 -7
  257. package/dist/lib/node-esm/chunk-3HDQYL5S.mjs +0 -4523
  258. package/dist/lib/node-esm/chunk-3HDQYL5S.mjs.map +0 -7
  259. package/dist/types/src/components/Buttons/Button.d.ts.map +0 -1
  260. package/dist/types/src/components/Buttons/Button.stories.d.ts.map +0 -1
  261. package/dist/types/src/components/Buttons/IconButton.d.ts.map +0 -1
  262. package/dist/types/src/components/Buttons/IconButton.stories.d.ts.map +0 -1
  263. package/dist/types/src/components/Buttons/Toggle.d.ts.map +0 -1
  264. package/dist/types/src/components/Buttons/Toggle.stories.d.ts +0 -13
  265. package/dist/types/src/components/Buttons/Toggle.stories.d.ts.map +0 -1
  266. package/dist/types/src/components/Buttons/ToggleGroup.d.ts.map +0 -1
  267. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts.map +0 -1
  268. package/dist/types/src/components/Buttons/index.d.ts.map +0 -1
  269. package/dist/types/src/components/Dialogs/AlertDialog.d.ts.map +0 -1
  270. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts.map +0 -1
  271. package/dist/types/src/components/Dialogs/Dialog.d.ts +0 -31
  272. package/dist/types/src/components/Dialogs/Dialog.d.ts.map +0 -1
  273. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts.map +0 -1
  274. package/dist/types/src/components/Dialogs/index.d.ts.map +0 -1
  275. package/dist/types/src/components/Lists/List.d.ts.map +0 -1
  276. package/dist/types/src/components/Lists/List.stories.d.ts.map +0 -1
  277. package/dist/types/src/components/Lists/ListDropIndicator.d.ts.map +0 -1
  278. package/dist/types/src/components/Lists/Tree.d.ts.map +0 -1
  279. package/dist/types/src/components/Lists/Tree.stories.d.ts.map +0 -1
  280. package/dist/types/src/components/Lists/TreeDropIndicator.d.ts.map +0 -1
  281. package/dist/types/src/components/Lists/Treegrid.d.ts.map +0 -1
  282. package/dist/types/src/components/Lists/Treegrid.stories.d.ts.map +0 -1
  283. package/dist/types/src/components/Lists/index.d.ts.map +0 -1
  284. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  285. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  286. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  287. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  288. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  289. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts +0 -12
  290. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts.map +0 -1
  291. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  292. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  293. package/dist/types/src/util/domino.d.ts +0 -18
  294. package/dist/types/src/util/domino.d.ts.map +0 -1
  295. package/src/components/Dialogs/Dialog.stories.tsx +0 -67
  296. package/src/util/ThemedClassName.ts +0 -7
  297. package/src/util/domino.ts +0 -53
  298. /package/dist/types/src/components/{Buttons → Button}/Button.stories.d.ts +0 -0
  299. /package/dist/types/src/components/{Buttons → Button}/IconButton.stories.d.ts +0 -0
  300. /package/dist/types/src/components/{Buttons → Button}/Toggle.d.ts +0 -0
  301. /package/dist/types/src/components/{Buttons → Button}/index.d.ts +0 -0
  302. /package/dist/types/src/components/{Dialogs → Dialog}/AlertDialog.d.ts +0 -0
  303. /package/dist/types/src/components/{Dialogs → Dialog}/AlertDialog.stories.d.ts +0 -0
  304. /package/dist/types/src/components/{Dialogs → Dialog}/index.d.ts +0 -0
  305. /package/dist/types/src/components/{Lists → List}/List.stories.d.ts +0 -0
  306. /package/dist/types/src/components/{Lists → List}/ListDropIndicator.d.ts +0 -0
  307. /package/dist/types/src/components/{Lists → List}/Tree.d.ts +0 -0
  308. /package/dist/types/src/components/{Lists → List}/Tree.stories.d.ts +0 -0
  309. /package/dist/types/src/components/{Lists → List}/TreeDropIndicator.d.ts +0 -0
  310. /package/dist/types/src/components/{Lists → List}/Treegrid.d.ts +0 -0
  311. /package/dist/types/src/components/{Lists → List}/Treegrid.stories.d.ts +0 -0
  312. /package/dist/types/src/components/{Lists → List}/index.d.ts +0 -0
  313. /package/dist/types/src/components/{Menus → Menu}/ContextMenu.stories.d.ts +0 -0
  314. /package/dist/types/src/components/{Menus → Menu}/DropdownMenu.stories.d.ts +0 -0
  315. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  316. /package/src/components/{Buttons → Button}/Toggle.tsx +0 -0
  317. /package/src/components/{Buttons → Button}/ToggleGroup.tsx +0 -0
  318. /package/src/components/{Buttons → Button}/index.ts +0 -0
  319. /package/src/components/{Dialogs → Dialog}/index.ts +0 -0
  320. /package/src/components/{Lists → List}/Tree.tsx +0 -0
  321. /package/src/components/{Lists → List}/TreeDropIndicator.tsx +0 -0
  322. /package/src/components/{Lists → List}/index.ts +0 -0
  323. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -0,0 +1,70 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useEffect, useRef, useState } from 'react';
7
+
8
+ import { faker } from '@dxos/random';
9
+
10
+ import { withLayout, withTheme } from '../../testing';
11
+ import { Button } from '../Button';
12
+ import { Toolbar } from '../Toolbar';
13
+
14
+ import { ScrollContainer, type ScrollContainerRootProps, type ScrollController } from './ScrollContainer';
15
+
16
+ const DefaultStory = (props: ScrollContainerRootProps) => {
17
+ const [lines, setLines] = useState<string[]>([]);
18
+ const [running, setRunning] = useState(true);
19
+ const scroller = useRef<ScrollController>(null);
20
+ useEffect(() => {
21
+ if (!running) {
22
+ return;
23
+ }
24
+
25
+ const i = setInterval(() => {
26
+ setLines((lines) => [...lines, faker.lorem.paragraph()]);
27
+ }, 500);
28
+
29
+ return () => clearInterval(i);
30
+ }, [running]);
31
+
32
+ return (
33
+ <div className='flex flex-col bs-full overflow-hidden'>
34
+ <Toolbar.Root>
35
+ <Button onClick={() => setRunning((running) => !running)}>{running ? 'Stop' : 'Start'}</Button>
36
+ <Button onClick={() => scroller.current?.scrollToBottom()}>Scroll to bottom</Button>
37
+ <div className='flex-1' />
38
+ <div>{lines.length}</div>
39
+ </Toolbar.Root>
40
+ <ScrollContainer.Root {...props} ref={scroller}>
41
+ <ScrollContainer.Viewport>
42
+ {lines.map((line, index) => (
43
+ <div key={index} className='p-2'>
44
+ {line}
45
+ </div>
46
+ ))}
47
+ </ScrollContainer.Viewport>
48
+ <ScrollContainer.ScrollDownButton />
49
+ </ScrollContainer.Root>
50
+ </div>
51
+ );
52
+ };
53
+
54
+ const meta = {
55
+ title: 'ui/react-ui-core/components/ScrollContainer',
56
+ component: ScrollContainer.Root,
57
+ render: DefaultStory,
58
+ decorators: [withTheme(), withLayout({ layout: 'column', classNames: 'is-[30rem]' })],
59
+ } satisfies Meta<typeof DefaultStory>;
60
+
61
+ export default meta;
62
+
63
+ type Story = StoryObj<typeof meta>;
64
+
65
+ export const Default: Story = {
66
+ args: {
67
+ pin: true,
68
+ fade: true,
69
+ },
70
+ };
@@ -0,0 +1,238 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { createContext } from '@radix-ui/react-context';
6
+ import React, {
7
+ type HTMLAttributes,
8
+ type PropsWithChildren,
9
+ forwardRef,
10
+ useCallback,
11
+ useEffect,
12
+ useImperativeHandle,
13
+ useMemo,
14
+ useRef,
15
+ useState,
16
+ } from 'react';
17
+
18
+ // TODO(burdon): Move these deps to @dxos/dom-util.
19
+ import { addEventListener, combine } from '@dxos/async';
20
+ import { invariant } from '@dxos/invariant';
21
+ import { useForwardedRef } from '@dxos/react-hooks';
22
+ import { mx } from '@dxos/ui-theme';
23
+
24
+ import { type ThemedClassName } from '../../util';
25
+ import { IconButton } from '../Button';
26
+ import { ScrollArea } from '../ScrollArea';
27
+
28
+ const isBottom = (el: HTMLElement | null) => {
29
+ return !!(el && el.scrollHeight - el.scrollTop === el.clientHeight);
30
+ };
31
+
32
+ export interface ScrollController {
33
+ viewport: HTMLDivElement | null;
34
+ scrollToTop: (behavior?: ScrollBehavior) => void;
35
+ scrollToBottom: (behavior?: ScrollBehavior) => void;
36
+ }
37
+
38
+ type ScrollContainerContextValue = {
39
+ scrollToBottom: (behavior?: ScrollBehavior) => void;
40
+ controller?: ScrollController;
41
+ pinned?: boolean;
42
+ };
43
+
44
+ const [ScrollContainerProvider, useScrollContainerContext] =
45
+ createContext<ScrollContainerContextValue>('ScrollContainer');
46
+
47
+ //
48
+ // Root
49
+ //
50
+
51
+ type RootProps = ThemedClassName<
52
+ PropsWithChildren<{
53
+ pin?: boolean;
54
+ fade?: boolean;
55
+ behavior?: ScrollBehavior;
56
+ }>
57
+ >;
58
+
59
+ /**
60
+ * Scroll container that automatically scrolls to the bottom when new content is added.
61
+ */
62
+ const Root = forwardRef<ScrollController, RootProps>(
63
+ ({ children, classNames, pin, fade, behavior: behaviorProp = 'smooth' }, forwardedRef) => {
64
+ const scrollerRef = useRef<HTMLDivElement>(null);
65
+ const autoScrollRef = useRef(false);
66
+ const [overflow, setOverflow] = useState(false);
67
+ const [pinned, setPinned] = useState(pin);
68
+
69
+ const timeoutRef = useRef<NodeJS.Timeout>(undefined);
70
+ const scrollToBottom = useCallback((behavior: ScrollBehavior = behaviorProp) => {
71
+ if (scrollerRef.current) {
72
+ // Temporarily hide scrollbar to prevent flicker.
73
+ autoScrollRef.current = true;
74
+ scrollerRef.current.classList.add('scrollbar-none');
75
+ scrollerRef.current.scrollTo({
76
+ top: scrollerRef.current.scrollHeight,
77
+ behavior,
78
+ });
79
+
80
+ clearTimeout(timeoutRef.current);
81
+ if (behavior !== 'instant') {
82
+ timeoutRef.current = setTimeout(() => {
83
+ scrollerRef.current?.classList.remove('scrollbar-none');
84
+ autoScrollRef.current = false;
85
+ }, 500);
86
+ }
87
+ setPinned(true);
88
+ }
89
+ }, []);
90
+
91
+ const controller = useMemo(
92
+ () => ({
93
+ viewport: scrollerRef.current,
94
+ scrollToTop: () => {
95
+ invariant(scrollerRef.current);
96
+ scrollerRef.current.scrollTo({ top: 0, behavior: 'smooth' });
97
+ setPinned(false);
98
+ },
99
+ scrollToBottom: () => {
100
+ scrollToBottom('smooth');
101
+ },
102
+ }),
103
+ [scrollToBottom, scrollerRef.current],
104
+ );
105
+
106
+ // Scroll controller imperative ref.
107
+ useImperativeHandle(forwardedRef, () => controller, [controller]);
108
+
109
+ // Listen for scroll events.
110
+ useEffect(() => {
111
+ if (!scrollerRef.current) {
112
+ return;
113
+ }
114
+
115
+ return combine(
116
+ // Check if user scrolls.
117
+ addEventListener(scrollerRef.current, 'wheel', () => {
118
+ setPinned(isBottom(scrollerRef.current));
119
+ }),
120
+ // Check if scrolls.
121
+ addEventListener(scrollerRef.current, 'scroll', () => {
122
+ setOverflow((scrollerRef.current?.scrollTop ?? 0) > 0);
123
+ }),
124
+ );
125
+ }, []);
126
+
127
+ return (
128
+ <ScrollContainerProvider pinned={pinned} controller={controller} scrollToBottom={scrollToBottom}>
129
+ <div className='relative grid flex-1 min-bs-0 overflow-hidden'>
130
+ {fade && (
131
+ <div
132
+ role='none'
133
+ data-visible={overflow}
134
+ className={mx(
135
+ // NOTE: Gradients may not be visible with dark reader extensions.
136
+ 'z-10 absolute block-start-0 inset-inline-0 bs-24 is-full',
137
+ 'opacity-0 duration-200 transition-opacity data-[visible="true"]:opacity-100',
138
+ 'bg-gradient-to-b from-[--surface-bg] to-transparent pointer-events-none',
139
+ )}
140
+ />
141
+ )}
142
+ <ScrollArea.Root classNames={mx('min-bs-0', classNames)} ref={scrollerRef} thin>
143
+ <ScrollArea.Viewport>{children}</ScrollArea.Viewport>
144
+ </ScrollArea.Root>
145
+ </div>
146
+ </ScrollContainerProvider>
147
+ );
148
+ },
149
+ );
150
+
151
+ Root.displayName = 'ScrollContainer.Root';
152
+
153
+ //
154
+ // Viewport
155
+ //
156
+
157
+ const VIEWPORT_NAME = 'ScrollContainer.Viewport';
158
+
159
+ type ViewportProps = ThemedClassName<PropsWithChildren<Omit<HTMLAttributes<HTMLDivElement>, 'className'>>>;
160
+
161
+ const Viewport = forwardRef<HTMLDivElement, ViewportProps>(({ classNames, children, ...props }, forwardedRef) => {
162
+ const contentRef = useForwardedRef(forwardedRef);
163
+ const { pinned, scrollToBottom } = useScrollContainerContext(VIEWPORT_NAME);
164
+
165
+ useEffect(() => {
166
+ if (!pinned || !contentRef.current) {
167
+ return;
168
+ }
169
+
170
+ // Scroll instantly otherwise it might move while we're scrolling.
171
+ scrollToBottom();
172
+
173
+ // Setup resize observer to detect content changes.
174
+ const resizeObserver = new ResizeObserver(() => scrollToBottom());
175
+ resizeObserver.observe(contentRef.current);
176
+ return () => resizeObserver.disconnect();
177
+ }, [pinned, scrollToBottom]);
178
+
179
+ return (
180
+ <div className={mx('is-full', classNames)} {...props} ref={contentRef}>
181
+ {children}
182
+ </div>
183
+ );
184
+ });
185
+
186
+ Viewport.displayName = VIEWPORT_NAME;
187
+
188
+ //
189
+ // ScrollDownButton
190
+ //
191
+
192
+ const SCROLL_DOWN_BUTTON_NAME = 'ScrollContainer.ScrollDownButton';
193
+
194
+ type ScrollDownButtonProps = ThemedClassName;
195
+
196
+ const ScrollDownButton = ({ classNames }: ScrollDownButtonProps) => {
197
+ const { pinned, scrollToBottom } = useScrollContainerContext(SCROLL_DOWN_BUTTON_NAME);
198
+
199
+ return (
200
+ <div
201
+ role='none'
202
+ className={mx(
203
+ 'absolute bottom-2 right-4 opacity-100 transition-opacity duration-300',
204
+ pinned && 'opacity-0',
205
+ classNames,
206
+ )}
207
+ >
208
+ <IconButton
209
+ variant='primary'
210
+ icon='ph--arrow-down--regular'
211
+ iconOnly
212
+ size={4}
213
+ label='Scroll down'
214
+ onClick={() => scrollToBottom()}
215
+ />
216
+ </div>
217
+ );
218
+ };
219
+
220
+ ScrollDownButton.displayName = SCROLL_DOWN_BUTTON_NAME;
221
+
222
+ //
223
+ // ScrollContainer
224
+ //
225
+
226
+ export { useScrollContainerContext };
227
+
228
+ export const ScrollContainer = {
229
+ Root,
230
+ Viewport,
231
+ ScrollDownButton,
232
+ };
233
+
234
+ export type {
235
+ RootProps as ScrollContainerRootProps,
236
+ ViewportProps as ScrollContainerViewportProps,
237
+ ScrollDownButtonProps as ScrollContainerScrollDownButtonProps,
238
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './ScrollContainer';
@@ -8,7 +8,7 @@ import React, { useState } from 'react';
8
8
  import { faker } from '@dxos/random';
9
9
 
10
10
  import { withTheme } from '../../testing';
11
- import { withSurfaceVariantsLayout } from '../../testing';
11
+ import { withLayoutVariants } from '../../testing';
12
12
 
13
13
  import { Select } from './Select';
14
14
 
@@ -42,9 +42,9 @@ const DefaultStory = ({ items = [] }: StoryProps) => {
42
42
  };
43
43
 
44
44
  const meta = {
45
- title: 'ui/react-ui-core/Select',
45
+ title: 'ui/react-ui-core/components/Select',
46
46
  render: DefaultStory,
47
- decorators: [withTheme, withSurfaceVariantsLayout()],
47
+ decorators: [withTheme(), withLayoutVariants()],
48
48
  } satisfies Meta<typeof DefaultStory>;
49
49
 
50
50
  export default meta;
@@ -8,7 +8,7 @@ import React, { forwardRef } from 'react';
8
8
  import { useElevationContext, useThemeContext } from '../../hooks';
9
9
  import { useSafeCollisionPadding } from '../../hooks/useSafeCollisionPadding';
10
10
  import { type ThemedClassName } from '../../util';
11
- import { Button, type ButtonProps } from '../Buttons';
11
+ import { Button, type ButtonProps } from '../Button';
12
12
  import { Icon } from '../Icon';
13
13
 
14
14
  type SelectRootProps = SelectPrimitive.SelectProps;
@@ -39,7 +39,7 @@ const SelectTriggerButton = forwardRef<HTMLButtonElement, SelectTriggerButtonPro
39
39
  <SelectPrimitive.Trigger asChild ref={forwardedRef}>
40
40
  <Button {...props}>
41
41
  <SelectPrimitive.Value placeholder={placeholder}>{children}</SelectPrimitive.Value>
42
- <span className='w-1 flex-1' />
42
+ <span className='is-1 flex-1' />
43
43
  <SelectPrimitive.Icon asChild>
44
44
  <Icon size={3} icon='ph--caret-down--bold' />
45
45
  </SelectPrimitive.Icon>
@@ -61,7 +61,7 @@ const SelectContent = forwardRef<HTMLDivElement, SelectContentProps>(
61
61
  {...props}
62
62
  data-arrow-keys='up down'
63
63
  collisionPadding={safeCollisionPadding}
64
- className={tx('select.content', 'select__content', { elevation }, classNames)}
64
+ className={tx('select.content', { elevation }, classNames)}
65
65
  position='popper'
66
66
  ref={forwardedRef}
67
67
  >
@@ -79,7 +79,7 @@ const SelectScrollUpButton = forwardRef<HTMLDivElement, SelectScrollUpButtonProp
79
79
  return (
80
80
  <SelectPrimitive.SelectScrollUpButton
81
81
  {...props}
82
- className={tx('select.scrollButton', 'select__scroll-button--up', {}, classNames)}
82
+ className={tx('select.scrollButton', {}, classNames)}
83
83
  ref={forwardedRef}
84
84
  >
85
85
  {children ?? <Icon size={3} icon='ph--caret-up--bold' />}
@@ -96,7 +96,7 @@ const SelectScrollDownButton = forwardRef<HTMLDivElement, SelectScrollDownButton
96
96
  return (
97
97
  <SelectPrimitive.SelectScrollDownButton
98
98
  {...props}
99
- className={tx('select.scrollButton', 'select__scroll-button--down', {}, classNames)}
99
+ className={tx('select.scrollButton', {}, classNames)}
100
100
  ref={forwardedRef}
101
101
  >
102
102
  {children ?? <Icon size={3} icon='ph--caret-down--bold' />}
@@ -108,14 +108,10 @@ const SelectScrollDownButton = forwardRef<HTMLDivElement, SelectScrollDownButton
108
108
  type SelectViewportProps = ThemedClassName<SelectPrimitive.SelectViewportProps>;
109
109
 
110
110
  const SelectViewport = forwardRef<HTMLDivElement, SelectViewportProps>(
111
- ({ classNames, asChild, children, ...props }, forwardedRef) => {
111
+ ({ classNames, children, ...props }, forwardedRef) => {
112
112
  const { tx } = useThemeContext();
113
113
  return (
114
- <SelectPrimitive.SelectViewport
115
- {...props}
116
- className={tx('select.viewport', 'select__viewport', {}, classNames)}
117
- ref={forwardedRef}
118
- >
114
+ <SelectPrimitive.SelectViewport {...props} className={tx('select.viewport', {}, classNames)} ref={forwardedRef}>
119
115
  {children}
120
116
  </SelectPrimitive.SelectViewport>
121
117
  );
@@ -126,7 +122,7 @@ type SelectItemProps = ThemedClassName<SelectPrimitive.SelectItemProps>;
126
122
 
127
123
  const SelectItem = forwardRef<HTMLDivElement, SelectItemProps>(({ classNames, ...props }, forwardedRef) => {
128
124
  const { tx } = useThemeContext();
129
- return <SelectPrimitive.Item {...props} className={tx('select.item', 'option', {}, classNames)} ref={forwardedRef} />;
125
+ return <SelectPrimitive.Item {...props} className={tx('select.item', {}, classNames)} ref={forwardedRef} />;
130
126
  });
131
127
 
132
128
  type SelectItemTextProps = SelectPrimitive.SelectItemTextProps;
@@ -141,7 +137,7 @@ const SelectItemIndicator = forwardRef<HTMLDivElement, SelectItemIndicatorProps>
141
137
  return (
142
138
  <SelectPrimitive.ItemIndicator
143
139
  {...props}
144
- className={tx('select.itemIndicator', 'option__indicator', {}, classNames)}
140
+ className={tx('select.itemIndicator', {}, classNames)}
145
141
  ref={forwardedRef}
146
142
  >
147
143
  {children}
@@ -156,9 +152,9 @@ type SelectOptionProps = SelectItemProps;
156
152
  const SelectOption = forwardRef<HTMLDivElement, SelectItemProps>(({ children, classNames, ...props }, forwardedRef) => {
157
153
  const { tx } = useThemeContext();
158
154
  return (
159
- <SelectPrimitive.Item {...props} className={tx('select.item', 'option', {}, classNames)} ref={forwardedRef}>
155
+ <SelectPrimitive.Item {...props} className={tx('select.item', {}, classNames)} ref={forwardedRef}>
160
156
  <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
161
- <span className='grow w-1' />
157
+ <span className='grow is-1' />
162
158
  {/* <SelectPrimitive.ItemIndicator className={tx('select.itemIndicator', 'option__indicator', {})}> */}
163
159
  <Icon icon='ph--check--regular' />
164
160
  {/* </SelectPrimitive.ItemIndicator> */}
@@ -178,26 +174,14 @@ type SelectSeparatorProps = ThemedClassName<SelectPrimitive.SelectSeparatorProps
178
174
 
179
175
  const SelectSeparator = forwardRef<HTMLDivElement, SelectSeparatorProps>(({ classNames, ...props }, forwardedRef) => {
180
176
  const { tx } = useThemeContext();
181
- return (
182
- <SelectPrimitive.Separator
183
- {...props}
184
- className={tx('select.separator', 'select__separator', {}, classNames)}
185
- ref={forwardedRef}
186
- />
187
- );
177
+ return <SelectPrimitive.Separator {...props} className={tx('select.separator', {}, classNames)} ref={forwardedRef} />;
188
178
  });
189
179
 
190
180
  type SelectArrowProps = ThemedClassName<SelectPrimitive.SelectArrowProps>;
191
181
 
192
182
  const SelectArrow = forwardRef<SVGSVGElement, SelectArrowProps>(({ classNames, ...props }, forwardedRef) => {
193
183
  const { tx } = useThemeContext();
194
- return (
195
- <SelectPrimitive.Arrow
196
- {...props}
197
- className={tx('select.arrow', 'select__arrow', {}, classNames)}
198
- ref={forwardedRef}
199
- />
200
- );
184
+ return <SelectPrimitive.Arrow {...props} className={tx('select.arrow', {}, classNames)} ref={forwardedRef} />;
201
185
  });
202
186
 
203
187
  export const Select = {
@@ -19,7 +19,7 @@ const Separator = forwardRef<HTMLDivElement, SeparatorProps>(
19
19
  <SeparatorPrimitive
20
20
  orientation={orientation}
21
21
  {...props}
22
- className={tx('separator.root', 'separator', { orientation, subdued }, classNames)}
22
+ className={tx('separator.root', { orientation, subdued }, classNames)}
23
23
  ref={forwardedRef}
24
24
  />
25
25
  );
@@ -0,0 +1,52 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { withTheme } from '../../testing';
8
+
9
+ import { Skeleton } from './Skeleton';
10
+
11
+ export default {
12
+ title: 'ui/react-ui-core/components/Skeleton',
13
+ component: Skeleton,
14
+ decorators: [withTheme()],
15
+ parameters: {
16
+ layout: 'centered',
17
+ },
18
+ };
19
+
20
+ export const Default = {
21
+ render: () => (
22
+ <div className='flex flex-col gap-4 p-4 border border-separator rounded-sm'>
23
+ <div className='flex is-fit items-center gap-4'>
24
+ <Skeleton classNames='size-10 shrink-0 rounded-full' />
25
+ <div className='grid gap-2'>
26
+ <Skeleton classNames='bs-4 is-[150px]' />
27
+ <Skeleton classNames='bs-4 is-[100px]' />
28
+ </div>
29
+ </div>
30
+ </div>
31
+ ),
32
+ };
33
+
34
+ export const Card = {
35
+ render: () => (
36
+ <div className='flex flex-col gap-3 is-96 p-4 border border-separator rounded-sm'>
37
+ <div className='flex items-center gap-3'>
38
+ <Skeleton variant='circle' classNames='bs-12 is-12 rounded-full' />
39
+ <div className='flex flex-col gap-2 flex-1'>
40
+ <Skeleton classNames='bs-4 is-24' />
41
+ <Skeleton classNames='bs-3 is-32' />
42
+ </div>
43
+ </div>
44
+ <Skeleton classNames='bs-32 is-full rounded' />
45
+ <div className='flex flex-col gap-2'>
46
+ <Skeleton classNames='bs-3 is-full' />
47
+ <Skeleton classNames='bs-3 is-5/6' />
48
+ <Skeleton classNames='bs-3 is-4/6' />
49
+ </div>
50
+ </div>
51
+ ),
52
+ };
@@ -0,0 +1,26 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import React, { type ComponentPropsWithRef, forwardRef } from 'react';
6
+
7
+ import { useThemeContext } from '../../hooks';
8
+ import { type ThemedClassName } from '../../util';
9
+
10
+ type SkeletonProps = ThemedClassName<ComponentPropsWithRef<'div'>> & {
11
+ variant?: 'default' | 'circle' | 'text';
12
+ };
13
+
14
+ /**
15
+ * A skeleton loading component that displays a placeholder while content is loading.
16
+ */
17
+ const Skeleton = forwardRef<HTMLDivElement, SkeletonProps>(
18
+ ({ classNames, variant = 'default', ...props }, forwardedRef) => {
19
+ const { tx } = useThemeContext();
20
+ return <div {...props} className={tx('skeleton.root', { variant }, classNames)} ref={forwardedRef} />;
21
+ },
22
+ );
23
+
24
+ export { Skeleton };
25
+
26
+ export type { SkeletonProps };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export * from './Skeleton';
@@ -0,0 +1,73 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useState } from 'react';
7
+
8
+ import { Layout } from '../../primitives';
9
+ import { withLayout, withTheme } from '../../testing';
10
+ import { ScrollArea } from '../ScrollArea';
11
+ import { Toolbar } from '../Toolbar';
12
+
13
+ import { Splitter, type SplitterRootProps } from './Splitter';
14
+
15
+ const Panel = ({ label }: { label: string }) => {
16
+ return (
17
+ <Layout.Main toolbar>
18
+ <Toolbar.Root>{label}</Toolbar.Root>
19
+ <ScrollArea.Root orientation='vertical'>
20
+ <ScrollArea.Viewport>
21
+ {Array.from({ length: 100 }).map((_, i) => (
22
+ <div key={i} className='p-1'>
23
+ {label}-{i}
24
+ </div>
25
+ ))}
26
+ </ScrollArea.Viewport>
27
+ </ScrollArea.Root>
28
+ </Layout.Main>
29
+ );
30
+ };
31
+
32
+ const DefaultStory = (props: SplitterRootProps) => {
33
+ const [mode, setMode] = useState(props.mode ?? 'both');
34
+
35
+ return (
36
+ <div className='grid grid-rows-[min-content_1fr] bs-full overflow-hidden'>
37
+ <Toolbar.Root>
38
+ <Toolbar.Button onClick={() => setMode('upper')}>A</Toolbar.Button>
39
+ <Toolbar.Button onClick={() => setMode('both')}>A + B</Toolbar.Button>
40
+ <Toolbar.Button onClick={() => setMode('lower')}>B</Toolbar.Button>
41
+ </Toolbar.Root>
42
+ <Splitter.Root mode={mode} ratio={props.ratio} classNames='divide-y divide-subduedSeparator'>
43
+ <Splitter.Panel position='upper'>
44
+ <Panel label='A' />
45
+ </Splitter.Panel>
46
+ <Splitter.Panel position='lower'>
47
+ <Panel label='B' />
48
+ </Splitter.Panel>
49
+ </Splitter.Root>
50
+ </div>
51
+ );
52
+ };
53
+
54
+ const meta: Meta<SplitterRootProps> = {
55
+ title: 'ui/react-ui-core/components/Splitter',
56
+ component: Splitter.Root,
57
+ render: DefaultStory,
58
+ decorators: [withTheme(), withLayout({ layout: 'column' })],
59
+ parameters: {
60
+ layout: 'fullscreen',
61
+ },
62
+ };
63
+
64
+ export default meta;
65
+
66
+ type Story = StoryObj<SplitterRootProps>;
67
+
68
+ export const Default: Story = {
69
+ args: {
70
+ mode: 'both',
71
+ ratio: 0.5,
72
+ },
73
+ };