@dxos/react-ui 0.8.4-main.fffef41 → 0.8.4-staging.ac66bdf99f

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 (382) hide show
  1. package/dist/lib/browser/chunk-OCVRIJCH.mjs +848 -0
  2. package/dist/lib/browser/chunk-OCVRIJCH.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +4111 -67
  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 +88 -64
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs +850 -0
  9. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +4111 -67
  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 +88 -64
  14. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  15. package/dist/types/src/components/Avatars/Avatar.d.ts +1 -1
  16. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  17. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  18. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  19. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  20. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  21. package/dist/types/src/components/Button/Button.d.ts +3 -3
  22. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  23. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -1
  24. package/dist/types/src/components/Button/IconButton.d.ts +2 -1
  25. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  26. package/dist/types/src/components/Button/IconButton.stories.d.ts +3 -0
  27. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
  28. package/dist/types/src/components/Button/Toggle.d.ts +2 -2
  29. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -1
  30. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
  31. package/dist/types/src/components/Button/ToggleGroup.d.ts +10 -10
  32. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -1
  33. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +4 -4
  34. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
  35. package/dist/types/src/components/Card/Card.d.ts +120 -0
  36. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  37. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  38. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  39. package/dist/types/src/components/Card/index.d.ts +2 -0
  40. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  41. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  42. package/dist/types/src/components/Clipboard/index.d.ts +10 -1
  43. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  44. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  45. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  46. package/dist/types/src/components/Dialog/AlertDialog.d.ts +39 -19
  47. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  48. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  49. package/dist/types/src/components/Dialog/Dialog.d.ts +54 -21
  50. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  51. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +10 -10
  52. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  53. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  54. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  55. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  56. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  57. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  58. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  59. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +19 -0
  60. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  61. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  62. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  63. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  64. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  65. package/dist/types/src/components/Focus/Focus.d.ts +36 -0
  66. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -0
  67. package/dist/types/src/components/Focus/Focus.stories.d.ts +9 -0
  68. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -0
  69. package/dist/types/src/components/Focus/index.d.ts +2 -0
  70. package/dist/types/src/components/Focus/index.d.ts.map +1 -0
  71. package/dist/types/src/components/Icon/Icon.d.ts +4 -1
  72. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  73. package/dist/types/src/components/Icon/Icon.stories.d.ts +11 -3
  74. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  75. package/dist/types/src/components/Image/Image.d.ts +14 -0
  76. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  77. package/dist/types/src/components/Image/Image.stories.d.ts +33 -0
  78. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  79. package/dist/types/src/components/Image/index.d.ts +2 -0
  80. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  81. package/dist/types/src/components/Input/Input.d.ts +7 -7
  82. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  83. package/dist/types/src/components/Input/Input.stories.d.ts +8 -8
  84. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  85. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  86. package/dist/types/src/components/List/List.d.ts +6 -4
  87. package/dist/types/src/components/List/List.d.ts.map +1 -1
  88. package/dist/types/src/components/List/List.stories.d.ts +3 -1
  89. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  90. package/dist/types/src/components/List/Tree.d.ts.map +1 -1
  91. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
  92. package/dist/types/src/components/List/Treegrid.d.ts +5 -9
  93. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  94. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
  95. package/dist/types/src/components/Main/Main.d.ts +9 -10
  96. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  97. package/dist/types/src/components/Main/Main.stories.d.ts +0 -3
  98. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  99. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  100. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  101. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  102. package/dist/types/src/components/{Menus → Menu}/DropdownMenu.d.ts +52 -51
  103. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  104. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +28 -0
  105. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  106. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  107. package/dist/types/src/components/Message/Message.d.ts +1 -1
  108. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  109. package/dist/types/src/components/Message/Message.stories.d.ts +5 -6
  110. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  111. package/dist/types/src/components/Popover/Popover.d.ts +33 -24
  112. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  113. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  114. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +27 -27
  115. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  116. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +57 -8
  117. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  118. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +37 -14
  119. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  120. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +10 -5
  121. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  122. package/dist/types/src/components/Select/Select.d.ts +9 -9
  123. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  124. package/dist/types/src/components/Select/Select.stories.d.ts +2 -2
  125. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  126. package/dist/types/src/components/Separator/Separator.d.ts +4 -4
  127. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  128. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  129. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  130. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  131. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  132. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  133. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  134. package/dist/types/src/components/Splitter/Splitter.d.ts +34 -0
  135. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  136. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  137. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  138. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  139. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  140. package/dist/types/src/components/Status/Status.d.ts +3 -4
  141. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  142. package/dist/types/src/components/Status/Status.stories.d.ts +4 -2
  143. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  144. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  145. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  146. package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
  147. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  148. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +3 -3
  149. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  150. package/dist/types/src/components/{Menus/DropdownMenu.stories.d.ts → ThemeProvider/ThemeProvider.stories.d.ts} +2 -5
  151. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  152. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
  153. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  154. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  155. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  156. package/dist/types/src/components/Toast/Toast.d.ts +19 -19
  157. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  158. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  159. package/dist/types/src/components/Toolbar/Toolbar.d.ts +36 -18
  160. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  161. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  162. package/dist/types/src/components/Tooltip/Tooltip.d.ts +9 -9
  163. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  164. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +2 -2
  165. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  166. package/dist/types/src/components/index.d.ts +10 -5
  167. package/dist/types/src/components/index.d.ts.map +1 -1
  168. package/dist/types/src/exemplars/generics.stories.d.ts +19 -0
  169. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  170. package/dist/types/src/exemplars/slot.stories.d.ts +15 -0
  171. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  172. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  173. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  174. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  175. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  176. package/dist/types/src/hooks/index.d.ts +1 -0
  177. package/dist/types/src/hooks/index.d.ts.map +1 -1
  178. package/dist/types/src/hooks/useDensityContext.d.ts +2 -2
  179. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  180. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  181. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  182. package/dist/types/src/index.d.ts +2 -1
  183. package/dist/types/src/index.d.ts.map +1 -1
  184. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  185. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  186. package/dist/types/src/primitives/Column/Column.d.ts +33 -0
  187. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  188. package/dist/types/src/primitives/Column/Column.stories.d.ts +25 -0
  189. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  190. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  191. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  192. package/dist/types/src/primitives/Container/Container.d.ts +7 -0
  193. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  194. package/dist/types/src/primitives/Container/Container.stories.d.ts +6 -0
  195. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  196. package/dist/types/src/primitives/Container/index.d.ts +2 -0
  197. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  198. package/dist/types/src/primitives/Flex/Flex.d.ts +11 -0
  199. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  200. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  201. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  202. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  203. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  204. package/dist/types/src/primitives/Grid/Grid.d.ts +10 -0
  205. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  206. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  207. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  208. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  209. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  210. package/dist/types/src/primitives/Panel/Panel.d.ts +35 -0
  211. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  212. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  213. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  214. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  215. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  216. package/dist/types/src/primitives/index.d.ts +6 -0
  217. package/dist/types/src/primitives/index.d.ts.map +1 -0
  218. package/dist/types/src/testing/Loading.d.ts +9 -0
  219. package/dist/types/src/testing/Loading.d.ts.map +1 -0
  220. package/dist/types/src/testing/decorators/withLayout.d.ts +3 -3
  221. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  222. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +1 -1
  223. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  224. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  225. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  226. package/dist/types/src/testing/index.d.ts +1 -0
  227. package/dist/types/src/testing/index.d.ts.map +1 -1
  228. package/dist/types/src/translations.d.ts +11 -0
  229. package/dist/types/src/translations.d.ts.map +1 -0
  230. package/dist/types/src/util/index.d.ts +1 -2
  231. package/dist/types/src/util/index.d.ts.map +1 -1
  232. package/dist/types/src/util/usePx.d.ts.map +1 -1
  233. package/dist/types/tsconfig.tsbuildinfo +1 -1
  234. package/package.json +42 -32
  235. package/src/components/Avatars/Avatar.stories.tsx +7 -9
  236. package/src/components/Avatars/Avatar.tsx +7 -15
  237. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -3
  238. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +3 -4
  239. package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
  240. package/src/components/Button/Button.stories.tsx +3 -4
  241. package/src/components/Button/Button.tsx +12 -26
  242. package/src/components/Button/IconButton.stories.tsx +8 -6
  243. package/src/components/Button/IconButton.tsx +9 -6
  244. package/src/components/Button/Toggle.stories.tsx +2 -3
  245. package/src/components/Button/Toggle.tsx +4 -4
  246. package/src/components/Button/ToggleGroup.stories.tsx +2 -3
  247. package/src/components/Button/ToggleGroup.tsx +12 -16
  248. package/src/components/Card/Card.stories.tsx +151 -0
  249. package/src/components/Card/Card.tsx +493 -0
  250. package/src/components/Card/index.ts +5 -0
  251. package/src/components/Clipboard/CopyButton.tsx +7 -8
  252. package/src/components/DensityProvider/DensityProvider.tsx +1 -1
  253. package/src/components/Dialog/AlertDialog.stories.tsx +16 -17
  254. package/src/components/Dialog/AlertDialog.tsx +123 -82
  255. package/src/components/Dialog/Dialog.stories.tsx +138 -28
  256. package/src/components/Dialog/Dialog.tsx +197 -71
  257. package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
  258. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +45 -0
  259. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  260. package/src/components/ErrorFallback/ErrorStack.tsx +114 -0
  261. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  262. package/src/components/ErrorFallback/index.ts +9 -0
  263. package/src/components/Focus/AUDIT.md +43 -0
  264. package/src/components/Focus/Focus.stories.tsx +230 -0
  265. package/src/components/Focus/Focus.tsx +201 -0
  266. package/src/components/Focus/index.ts +5 -0
  267. package/src/components/Icon/Icon.stories.tsx +45 -15
  268. package/src/components/Icon/Icon.tsx +7 -3
  269. package/src/components/Image/Image.stories.tsx +86 -0
  270. package/src/components/Image/Image.tsx +223 -0
  271. package/src/components/Image/index.ts +5 -0
  272. package/src/components/Input/Input.stories.tsx +21 -41
  273. package/src/components/Input/Input.tsx +38 -74
  274. package/src/components/Link/Link.stories.tsx +2 -3
  275. package/src/components/Link/Link.tsx +2 -2
  276. package/src/components/List/List.stories.tsx +30 -34
  277. package/src/components/List/List.tsx +17 -21
  278. package/src/components/List/ListDropIndicator.tsx +7 -7
  279. package/src/components/List/Tree.stories.tsx +5 -6
  280. package/src/components/List/Tree.tsx +0 -1
  281. package/src/components/List/TreeDropIndicator.tsx +6 -6
  282. package/src/components/List/Treegrid.stories.tsx +29 -30
  283. package/src/components/List/Treegrid.tsx +23 -28
  284. package/src/components/Main/Main.stories.tsx +41 -24
  285. package/src/components/Main/Main.tsx +139 -83
  286. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +2 -3
  287. package/src/components/{Menus → Menu}/ContextMenu.tsx +9 -33
  288. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +2 -3
  289. package/src/components/{Menus → Menu}/DropdownMenu.tsx +115 -107
  290. package/src/components/Message/Message.stories.tsx +27 -13
  291. package/src/components/Message/Message.tsx +43 -34
  292. package/src/components/Popover/Popover.stories.tsx +7 -8
  293. package/src/components/Popover/Popover.tsx +97 -92
  294. package/src/components/ScrollArea/ScrollArea.stories.tsx +223 -34
  295. package/src/components/ScrollArea/ScrollArea.tsx +97 -79
  296. package/src/components/ScrollArea/index.ts +1 -1
  297. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +47 -25
  298. package/src/components/ScrollContainer/ScrollContainer.tsx +225 -109
  299. package/src/components/Select/Select.stories.tsx +7 -8
  300. package/src/components/Select/Select.tsx +11 -27
  301. package/src/components/Separator/Separator.tsx +5 -8
  302. package/src/components/Skeleton/Skeleton.stories.tsx +51 -0
  303. package/src/components/Skeleton/Skeleton.tsx +26 -0
  304. package/src/components/Skeleton/index.ts +5 -0
  305. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  306. package/src/components/Splitter/Splitter.tsx +127 -0
  307. package/src/components/Splitter/index.ts +5 -0
  308. package/src/components/Status/Status.stories.tsx +21 -18
  309. package/src/components/Status/Status.tsx +10 -7
  310. package/src/components/Tag/Tag.stories.tsx +6 -12
  311. package/src/components/Tag/Tag.tsx +3 -8
  312. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +31 -0
  313. package/src/components/ThemeProvider/ThemeProvider.tsx +10 -10
  314. package/src/components/ThemeProvider/TranslationsProvider.tsx +1 -16
  315. package/src/components/ThemeProvider/index.ts +3 -3
  316. package/src/components/Toast/Toast.stories.tsx +2 -3
  317. package/src/components/Toast/Toast.tsx +22 -41
  318. package/src/components/Toolbar/Toolbar.stories.tsx +2 -3
  319. package/src/components/Toolbar/Toolbar.tsx +185 -23
  320. package/src/components/Tooltip/Tooltip.stories.tsx +20 -19
  321. package/src/components/Tooltip/Tooltip.tsx +40 -38
  322. package/src/components/index.ts +11 -6
  323. package/src/exemplars/generics.stories.tsx +41 -0
  324. package/src/exemplars/slot.stories.tsx +117 -0
  325. package/src/exemplars/tabster.stories.tsx +127 -0
  326. package/src/exemplars/virtualizer.stories.tsx +137 -0
  327. package/src/hooks/index.ts +1 -0
  328. package/src/hooks/useDensityContext.ts +3 -3
  329. package/src/hooks/useElevationContext.ts +1 -1
  330. package/src/index.ts +2 -1
  331. package/src/playground/Controls.stories.tsx +3 -10
  332. package/src/playground/Custom.stories.tsx +15 -18
  333. package/src/playground/Typography.stories.tsx +3 -3
  334. package/src/primitives/Column/AUDIT.md +148 -0
  335. package/src/primitives/Column/Column.stories.tsx +181 -0
  336. package/src/primitives/Column/Column.tsx +165 -0
  337. package/src/primitives/Column/index.ts +5 -0
  338. package/src/primitives/Container/Container.stories.tsx +29 -0
  339. package/src/primitives/Container/Container.tsx +19 -0
  340. package/src/primitives/Container/index.ts +5 -0
  341. package/src/primitives/Flex/Flex.stories.tsx +57 -0
  342. package/src/primitives/Flex/Flex.tsx +27 -0
  343. package/src/primitives/Flex/index.ts +5 -0
  344. package/src/primitives/Grid/Grid.stories.tsx +56 -0
  345. package/src/primitives/Grid/Grid.tsx +30 -0
  346. package/src/primitives/Grid/index.ts +5 -0
  347. package/src/primitives/Panel/Panel.stories.tsx +68 -0
  348. package/src/primitives/Panel/Panel.tsx +120 -0
  349. package/src/primitives/Panel/index.ts +5 -0
  350. package/src/primitives/index.ts +9 -0
  351. package/src/testing/Loading.tsx +47 -0
  352. package/src/testing/decorators/withLayout.tsx +39 -18
  353. package/src/testing/decorators/withLayoutVariants.tsx +20 -23
  354. package/src/testing/decorators/withTheme.tsx +26 -20
  355. package/src/testing/index.ts +2 -0
  356. package/src/translations.ts +19 -0
  357. package/src/util/index.ts +2 -2
  358. package/src/util/usePx.ts +1 -0
  359. package/dist/lib/browser/chunk-N5GDJTT2.mjs +0 -4707
  360. package/dist/lib/browser/chunk-N5GDJTT2.mjs.map +0 -7
  361. package/dist/lib/node-esm/chunk-SP7VQH72.mjs +0 -4709
  362. package/dist/lib/node-esm/chunk-SP7VQH72.mjs.map +0 -7
  363. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  364. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  365. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  366. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  367. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  368. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  369. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  370. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  371. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  372. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  373. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  374. package/dist/types/src/util/domino.d.ts +0 -18
  375. package/dist/types/src/util/domino.d.ts.map +0 -1
  376. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
  377. package/src/components/AnchoredOverflow/index.ts +0 -5
  378. package/src/util/ThemedClassName.ts +0 -7
  379. package/src/util/domino.ts +0 -53
  380. /package/dist/types/src/components/{Menus → Menu}/ContextMenu.stories.d.ts +0 -0
  381. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  382. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -2,27 +2,29 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { useState } from '@preact-signals/safe-react/react';
6
5
  import { createContext } from '@radix-ui/react-context';
7
6
  import React, {
8
- type HTMLAttributes,
9
7
  type PropsWithChildren,
8
+ type RefObject,
10
9
  forwardRef,
11
10
  useCallback,
12
11
  useEffect,
13
12
  useImperativeHandle,
14
13
  useMemo,
15
14
  useRef,
15
+ useState,
16
16
  } from 'react';
17
17
 
18
- // TODO(burdon): Move these deps to @dxos/dom-util.
19
18
  import { addEventListener, combine } from '@dxos/async';
20
19
  import { invariant } from '@dxos/invariant';
21
- import { useForwardedRef } from '@dxos/react-hooks';
22
- import { mx } from '@dxos/react-ui-theme';
20
+ import { useMergeRefs } from '@dxos/react-hooks';
21
+ import { composable, composableProps, slottable } from '@dxos/ui-theme';
22
+ import { mx } from '@dxos/ui-theme';
23
+ import { type SlottableProps } from '@dxos/ui-types';
23
24
 
24
25
  import { type ThemedClassName } from '../../util';
25
26
  import { IconButton } from '../Button';
27
+ import { ScrollArea, type ScrollAreaRootProps } from '../ScrollArea';
26
28
 
27
29
  const isBottom = (el: HTMLElement | null) => {
28
30
  return !!(el && el.scrollHeight - el.scrollTop === el.clientHeight);
@@ -35,9 +37,15 @@ export interface ScrollController {
35
37
  }
36
38
 
37
39
  type ScrollContainerContextValue = {
38
- scrollToBottom: (behavior?: ScrollBehavior) => void;
39
40
  controller?: ScrollController;
40
41
  pinned?: boolean;
42
+ overflow?: boolean;
43
+ /** Called by Viewport to register/unregister the scroll element. */
44
+ setViewport: (el: HTMLDivElement | null) => void;
45
+ /** Called by Viewport on wheel events to update pinned state. */
46
+ setPinned: (value: boolean) => void;
47
+ /** Called by Viewport on scroll events to update overflow state. */
48
+ setOverflow: (value: boolean) => void;
41
49
  };
42
50
 
43
51
  const [ScrollContainerProvider, useScrollContainerContext] =
@@ -47,147 +55,251 @@ const [ScrollContainerProvider, useScrollContainerContext] =
47
55
  // Root
48
56
  //
49
57
 
50
- type RootProps = ThemedClassName<
51
- PropsWithChildren<{
52
- pin?: boolean;
53
- fade?: boolean;
54
- }>
55
- >;
58
+ type RootProps = PropsWithChildren<{
59
+ pin?: boolean;
60
+ behavior?: ScrollBehavior;
61
+ }>;
56
62
 
57
63
  /**
58
- * Scroll container that automatically scrolls to the bottom when new content is added.
64
+ * Headless scroll container that provides context for scroll state.
65
+ * Render ScrollContainer.Content and ScrollContainer.Viewport as children.
59
66
  */
60
- const Root = forwardRef<ScrollController, RootProps>(({ children, classNames, pin, fade }, forwardedRef) => {
61
- const scrollerRef = useRef<HTMLDivElement>(null);
62
- const autoScrollRef = useRef(false);
63
- const [overflow, setOverflow] = useState(false);
64
- const [pinned, setPinned] = useState(pin);
65
-
66
- const timeoutRef = useRef<NodeJS.Timeout>(undefined);
67
- const scrollToBottom = useCallback((behavior: ScrollBehavior = 'instant') => {
68
- if (scrollerRef.current) {
69
- // Temporarily hide scrollbar to prevent flicker.
70
- autoScrollRef.current = true;
71
- scrollerRef.current.classList.add('scrollbar-none');
72
- scrollerRef.current.scrollTo({
73
- top: scrollerRef.current.scrollHeight,
74
- behavior,
75
- });
76
-
77
- clearTimeout(timeoutRef.current);
78
- if (behavior !== 'instant') {
79
- timeoutRef.current = setTimeout(() => {
80
- scrollerRef.current?.classList.remove('scrollbar-none');
81
- autoScrollRef.current = false;
82
- }, 500);
83
- }
84
- setPinned(true);
85
- }
86
- }, []);
87
-
88
- const controller = useMemo(
89
- () => ({
90
- viewport: scrollerRef.current,
91
- scrollToTop: () => {
92
- invariant(scrollerRef.current);
93
- scrollerRef.current.scrollTo({ top: 0, behavior: 'smooth' });
94
- setPinned(false);
95
- },
96
- scrollToBottom: () => {
97
- scrollToBottom('smooth');
67
+ const Root = forwardRef<ScrollController, RootProps>(
68
+ ({ children, pin, behavior: behaviorProp = 'smooth' }, forwardedRef) => {
69
+ const scrollerRef = useRef<HTMLDivElement | null>(null);
70
+ const autoScrollRef = useRef(false);
71
+ const [pinned, setPinned] = useState(pin);
72
+ const [overflow, setOverflow] = useState(false);
73
+
74
+ const timeoutRef = useRef<NodeJS.Timeout>(undefined);
75
+ const scrollToBottom = useCallback(
76
+ (behavior: ScrollBehavior = behaviorProp) => {
77
+ if (scrollerRef.current) {
78
+ if (behavior !== 'instant') {
79
+ // Temporarily hide scrollbar to prevent flickering during smooth scroll.
80
+ // For instant scrolling we skip this — there's no animation to hide,
81
+ // and adding the class changes element size which re-fires the ResizeObserver.
82
+ autoScrollRef.current = true;
83
+ scrollerRef.current.classList.add('scrollbar-none');
84
+ clearTimeout(timeoutRef.current);
85
+ timeoutRef.current = setTimeout(() => {
86
+ scrollerRef.current?.classList.remove('scrollbar-none');
87
+ autoScrollRef.current = false;
88
+ }, 500);
89
+ }
90
+
91
+ scrollerRef.current.scrollTo({
92
+ top: scrollerRef.current.scrollHeight,
93
+ behavior,
94
+ });
95
+
96
+ setPinned(true);
97
+ }
98
98
  },
99
- }),
100
- [scrollToBottom, scrollerRef.current],
101
- );
99
+ [behaviorProp],
100
+ );
101
+
102
+ const controller = useMemo<ScrollController>(
103
+ () => ({
104
+ get viewport() {
105
+ return scrollerRef.current;
106
+ },
107
+ scrollToTop: () => {
108
+ invariant(scrollerRef.current);
109
+ scrollerRef.current.scrollTo({ top: 0, behavior: 'smooth' });
110
+ setPinned(false);
111
+ },
112
+ scrollToBottom: (behavior = 'smooth' as ScrollBehavior) => {
113
+ scrollToBottom(behavior);
114
+ },
115
+ }),
116
+ [scrollToBottom],
117
+ );
118
+
119
+ // Scroll controller imperative ref.
120
+ useImperativeHandle(forwardedRef, () => controller, [controller]);
121
+
122
+ // Called by Viewport when the scroll element mounts/unmounts.
123
+ const setViewport = useCallback((el: HTMLDivElement | null) => {
124
+ scrollerRef.current = el;
125
+ }, []);
126
+
127
+ return (
128
+ <ScrollContainerProvider
129
+ pinned={pinned}
130
+ overflow={overflow}
131
+ controller={controller}
132
+ setViewport={setViewport}
133
+ setPinned={setPinned}
134
+ setOverflow={setOverflow}
135
+ >
136
+ {children}
137
+ </ScrollContainerProvider>
138
+ );
139
+ },
140
+ );
141
+
142
+ Root.displayName = 'ScrollContainer.Root';
102
143
 
103
- // Scroll controller imperative ref.
104
- useImperativeHandle(forwardedRef, () => controller, [controller]);
144
+ //
145
+ // Content
146
+ //
147
+
148
+ type ContentProps = Pick<ScrollAreaRootProps, 'thin' | 'padding' | 'centered'>;
149
+
150
+ /**
151
+ * Composable wrapper around ScrollArea.Root.
152
+ * Provides the DOM structure for the scroll container.
153
+ */
154
+ const Content = composable<HTMLDivElement, ContentProps>(
155
+ ({ children, thin, padding, centered, ...props }, forwardedRef) => {
156
+ return (
157
+ <ScrollArea.Root
158
+ {...composableProps(props, { classNames: 'relative' })}
159
+ thin={thin}
160
+ padding={padding}
161
+ centered={centered}
162
+ ref={forwardedRef}
163
+ >
164
+ {children}
165
+ </ScrollArea.Root>
166
+ );
167
+ },
168
+ );
169
+
170
+ Content.displayName = 'ScrollContainer.Content';
105
171
 
106
- // Listen for scroll events.
172
+ //
173
+ // Viewport
174
+ //
175
+
176
+ const VIEWPORT_NAME = 'ScrollContainer.Viewport';
177
+
178
+ type ViewportProps = SlottableProps;
179
+
180
+ const Viewport = slottable<HTMLDivElement, ViewportProps>(({ children, asChild, ...props }, forwardedRef) => {
181
+ const scrollerRef = useRef<HTMLDivElement>(null);
182
+ const mergedRef = useMergeRefs([forwardedRef, scrollerRef]);
183
+ const { setViewport, setPinned, setOverflow } = useScrollContainerContext(VIEWPORT_NAME);
184
+
185
+ // Register the scroll element with Root and set up wheel/scroll listeners.
107
186
  useEffect(() => {
108
- if (!scrollerRef.current) {
187
+ const el = scrollerRef.current;
188
+ if (!el) {
109
189
  return;
110
190
  }
111
191
 
192
+ setViewport(el);
193
+
112
194
  return combine(
113
- // Check if user scrolls.
114
- addEventListener(scrollerRef.current, 'wheel', () => {
115
- setPinned(isBottom(scrollerRef.current));
116
- }),
117
- // Check if scrolls.
118
- addEventListener(scrollerRef.current, 'scroll', () => {
119
- setOverflow((scrollerRef.current?.scrollTop ?? 0) > 0);
120
- }),
195
+ addEventListener(el, 'wheel', () => setPinned(isBottom(el))),
196
+ addEventListener(el, 'scroll', () => setOverflow((el.scrollTop ?? 0) > 0)),
197
+ () => setViewport(null),
121
198
  );
122
- }, []);
199
+ }, [setViewport, setPinned, setOverflow]);
123
200
 
124
201
  return (
125
- <ScrollContainerProvider pinned={pinned} controller={controller} scrollToBottom={scrollToBottom}>
126
- <div className='relative grid flex-1 min-bs-0 overflow-hidden'>
127
- {fade && (
128
- <div
129
- role='none'
130
- data-visible={overflow}
131
- className={mx(
132
- // NOTE: Gradients may not be visible with dark reader extensions.
133
- 'z-10 absolute block-start-0 inset-inline-0 bs-24 is-full',
134
- 'opacity-0 duration-200 transition-opacity data-[visible="true"]:opacity-100',
135
- 'bg-gradient-to-b from-[--surface-bg] to-transparent pointer-events-none',
136
- )}
137
- />
138
- )}
139
- <div className={mx('flex flex-col min-bs-0 overflow-y-auto scrollbar-thin', classNames)} ref={scrollerRef}>
140
- {children}
141
- </div>
142
- </div>
143
- </ScrollContainerProvider>
202
+ <>
203
+ <ScrollArea.Viewport asChild={asChild} {...composableProps(props)} ref={mergedRef}>
204
+ {children}
205
+ </ScrollArea.Viewport>
206
+ <PinEffect scrollerRef={scrollerRef} />
207
+ </>
144
208
  );
145
209
  });
146
210
 
147
- Root.displayName = 'ScrollContainer.Root';
211
+ Viewport.displayName = VIEWPORT_NAME;
148
212
 
149
- //
150
- // Viewport
151
- //
152
-
153
- type ViewportProps = ThemedClassName<PropsWithChildren<Omit<HTMLAttributes<HTMLDivElement>, 'className'>>>;
213
+ /**
214
+ * Isolated component that consumes pinned/controller from context.
215
+ * Kept separate so that Viewport does not re-render when pinned changes.
216
+ */
217
+ const PIN_EFFECT_NAME = 'ScrollContainer.PinEffect';
154
218
 
155
- const Viewport = forwardRef<HTMLDivElement, ViewportProps>(({ classNames, children, ...props }, forwardedRef) => {
156
- const contentRef = useForwardedRef(forwardedRef);
157
- const { pinned, scrollToBottom } = useScrollContainerContext(Viewport.displayName!);
219
+ const PinEffect = ({ scrollerRef }: { scrollerRef: RefObject<HTMLDivElement | null> }) => {
220
+ const { pinned, controller } = useScrollContainerContext(PIN_EFFECT_NAME);
158
221
 
222
+ // Pin scroll to bottom when content changes.
159
223
  useEffect(() => {
160
- if (!pinned || !contentRef.current) {
224
+ const viewport = scrollerRef.current;
225
+ if (!pinned || !viewport) {
161
226
  return;
162
227
  }
163
228
 
164
- // Setup resize observer to detect content changes.
165
- const resizeObserver = new ResizeObserver(() => scrollToBottom());
166
- scrollToBottom('instant');
229
+ // Scroll instantly so we don't visually jump while content is being added.
230
+ controller?.scrollToBottom('instant');
231
+
232
+ // Setup resize observer on content children to detect size changes (e.g. streaming).
233
+ // We observe children rather than the viewport itself, because the viewport's size
234
+ // stays fixed — only its content grows.
235
+ // Use instant scroll in the callback — smooth scrolling adds/removes the
236
+ // scrollbar-none class, which changes the element size and re-fires the
237
+ // observer, creating an infinite loop.
238
+ const resizeObserver = new ResizeObserver(() => controller?.scrollToBottom('smooth'));
239
+ Array.from(viewport.children).forEach((child) => {
240
+ resizeObserver.observe(child);
241
+ });
242
+
243
+ // Watch for added/removed children.
244
+ const mutationObserver = new MutationObserver((mutations) => {
245
+ mutations.forEach((mutation) => {
246
+ mutation.addedNodes.forEach((node) => {
247
+ if (node instanceof Element) {
248
+ resizeObserver.observe(node);
249
+ }
250
+ });
251
+ });
252
+
253
+ controller?.scrollToBottom('smooth');
254
+ });
255
+ mutationObserver.observe(viewport, { childList: true });
167
256
 
168
- resizeObserver.observe(contentRef.current);
169
257
  return () => {
170
258
  resizeObserver.disconnect();
259
+ mutationObserver.disconnect();
171
260
  };
172
- }, [pinned, scrollToBottom]);
261
+ }, [pinned, controller, scrollerRef]);
262
+
263
+ return null;
264
+ };
265
+
266
+ //
267
+ // Fade
268
+ //
269
+
270
+ const FADE_NAME = 'ScrollContainer.Fade';
271
+
272
+ type FadeProps = {};
273
+
274
+ const Fade = () => {
275
+ const { overflow } = useScrollContainerContext(FADE_NAME);
173
276
 
174
277
  return (
175
- <div className={mx('is-full', classNames)} {...props} ref={contentRef}>
176
- {children}
177
- </div>
278
+ <div
279
+ role='none'
280
+ data-visible={overflow}
281
+ className={mx(
282
+ // NOTE: Gradients may not be visible with dark reader extensions.
283
+ 'z-10 absolute top-0 inset-x-0 h-24 w-full',
284
+ 'opacity-0 duration-200 transition-opacity data-[visible="true"]:opacity-100',
285
+ 'bg-gradient-to-b from-(--surface-bg) to-transparent pointer-events-none',
286
+ )}
287
+ />
178
288
  );
179
- });
289
+ };
180
290
 
181
- Viewport.displayName = 'ScrollContainer.Viewport';
291
+ Fade.displayName = FADE_NAME;
182
292
 
183
293
  //
184
294
  // ScrollDownButton
185
295
  //
186
296
 
297
+ const SCROLL_DOWN_BUTTON_NAME = 'ScrollContainer.ScrollDownButton';
298
+
187
299
  type ScrollDownButtonProps = ThemedClassName;
188
300
 
189
301
  const ScrollDownButton = ({ classNames }: ScrollDownButtonProps) => {
190
- const { pinned, scrollToBottom } = useScrollContainerContext(ScrollDownButton.displayName!);
302
+ const { pinned, controller } = useScrollContainerContext(SCROLL_DOWN_BUTTON_NAME);
191
303
 
192
304
  return (
193
305
  <div
@@ -204,13 +316,13 @@ const ScrollDownButton = ({ classNames }: ScrollDownButtonProps) => {
204
316
  iconOnly
205
317
  size={4}
206
318
  label='Scroll down'
207
- onClick={() => scrollToBottom()}
319
+ onClick={() => controller?.scrollToBottom()}
208
320
  />
209
321
  </div>
210
322
  );
211
323
  };
212
324
 
213
- ScrollDownButton.displayName = 'ScrollContainer.ScrollDownButton';
325
+ ScrollDownButton.displayName = SCROLL_DOWN_BUTTON_NAME;
214
326
 
215
327
  //
216
328
  // ScrollContainer
@@ -220,12 +332,16 @@ export { useScrollContainerContext };
220
332
 
221
333
  export const ScrollContainer = {
222
334
  Root,
335
+ Content,
223
336
  Viewport,
337
+ Fade,
224
338
  ScrollDownButton,
225
339
  };
226
340
 
227
341
  export type {
228
342
  RootProps as ScrollContainerRootProps,
343
+ ContentProps as ScrollContainerContentProps,
229
344
  ViewportProps as ScrollContainerViewportProps,
345
+ FadeProps as ScrollContainerFadeProps,
230
346
  ScrollDownButtonProps as ScrollContainerScrollDownButtonProps,
231
347
  };
@@ -5,20 +5,19 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React, { useState } from 'react';
7
7
 
8
- import { faker } from '@dxos/random';
8
+ import { random } from '@dxos/random';
9
9
 
10
10
  import { withTheme } from '../../testing';
11
11
  import { withLayoutVariants } from '../../testing';
12
-
13
12
  import { Select } from './Select';
14
13
 
15
- faker.seed(1234);
14
+ random.seed(1234);
16
15
 
17
16
  type ItemProps = { id: string; text: string };
18
17
 
19
- type StoryProps = { items: ItemProps[] };
18
+ type DefaultStoryProps = { items: ItemProps[] };
20
19
 
21
- const DefaultStory = ({ items = [] }: StoryProps) => {
20
+ const DefaultStory = ({ items = [] }: DefaultStoryProps) => {
22
21
  const [value, setValue] = useState<string>();
23
22
  return (
24
23
  <Select.Root value={value} onValueChange={setValue}>
@@ -42,9 +41,9 @@ const DefaultStory = ({ items = [] }: StoryProps) => {
42
41
  };
43
42
 
44
43
  const meta = {
45
- title: 'ui/react-ui-core/Select',
44
+ title: 'ui/react-ui-core/components/Select',
46
45
  render: DefaultStory,
47
- decorators: [withTheme, withLayoutVariants()],
46
+ decorators: [withTheme(), withLayoutVariants()],
48
47
  } satisfies Meta<typeof DefaultStory>;
49
48
 
50
49
  export default meta;
@@ -53,6 +52,6 @@ type Story = StoryObj<typeof meta>;
53
52
 
54
53
  export const Default: Story = {
55
54
  args: {
56
- items: Array.from({ length: 16 }).map((_, i) => ({ id: `item-${i}`, text: faker.lorem.word() })),
55
+ items: Array.from({ length: 16 }).map((_, i) => ({ id: `item-${i}`, text: random.lorem.word() })),
57
56
  },
58
57
  };
@@ -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='is-1 flex-1' />
42
+ <span className='w-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' />}
@@ -111,11 +111,7 @@ const SelectViewport = forwardRef<HTMLDivElement, SelectViewportProps>(
111
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 is-1' />
157
+ <span className='grow w-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 = {
@@ -1,25 +1,22 @@
1
1
  //
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
- import {
5
- Separator as SeparatorPrimitive,
6
- type SeparatorProps as SeparatorPrimitiveProps,
7
- } from '@radix-ui/react-separator';
4
+ import * as SeparatorPrimitive from '@radix-ui/react-separator';
8
5
  import React, { forwardRef } from 'react';
9
6
 
10
7
  import { useThemeContext } from '../../hooks';
11
8
  import { type ThemedClassName } from '../../util';
12
9
 
13
- type SeparatorProps = ThemedClassName<SeparatorPrimitiveProps> & { subdued?: boolean };
10
+ type SeparatorProps = ThemedClassName<SeparatorPrimitive.SeparatorProps> & { subdued?: boolean };
14
11
 
15
12
  const Separator = forwardRef<HTMLDivElement, SeparatorProps>(
16
13
  ({ classNames, orientation = 'horizontal', subdued, ...props }, forwardedRef) => {
17
14
  const { tx } = useThemeContext();
18
15
  return (
19
- <SeparatorPrimitive
20
- orientation={orientation}
16
+ <SeparatorPrimitive.Root
21
17
  {...props}
22
- className={tx('separator.root', 'separator', { orientation, subdued }, classNames)}
18
+ orientation={orientation}
19
+ className={tx('separator.root', { orientation, subdued }, classNames)}
23
20
  ref={forwardedRef}
24
21
  />
25
22
  );
@@ -0,0 +1,51 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { withTheme } from '../../testing';
8
+ import { Skeleton } from './Skeleton';
9
+
10
+ export default {
11
+ title: 'ui/react-ui-core/components/Skeleton',
12
+ component: Skeleton,
13
+ decorators: [withTheme()],
14
+ parameters: {
15
+ layout: 'centered',
16
+ },
17
+ };
18
+
19
+ export const Default = {
20
+ render: () => (
21
+ <div className='flex flex-col gap-4 p-4 border border-separator rounded-xs'>
22
+ <div className='flex w-fit items-center gap-4'>
23
+ <Skeleton classNames='size-10 shrink-0 rounded-full' />
24
+ <div className='grid gap-2'>
25
+ <Skeleton classNames='h-4 w-[150px]' />
26
+ <Skeleton classNames='h-4 w-[100px]' />
27
+ </div>
28
+ </div>
29
+ </div>
30
+ ),
31
+ };
32
+
33
+ export const Card = {
34
+ render: () => (
35
+ <div className='flex flex-col gap-3 w-96 p-4 border border-separator rounded-xs'>
36
+ <div className='flex items-center gap-3'>
37
+ <Skeleton variant='circle' classNames='h-12 w-12 rounded-full' />
38
+ <div className='flex flex-col gap-2 flex-1'>
39
+ <Skeleton classNames='h-4 w-24' />
40
+ <Skeleton classNames='h-3 w-32' />
41
+ </div>
42
+ </div>
43
+ <Skeleton classNames='h-32 w-full rounded-sm' />
44
+ <div className='flex flex-col gap-2'>
45
+ <Skeleton classNames='h-3 w-full' />
46
+ <Skeleton classNames='h-3 w-5/6' />
47
+ <Skeleton classNames='h-3 w-4/6' />
48
+ </div>
49
+ </div>
50
+ ),
51
+ };