@dxos/react-ui 0.8.4-main.3c1ae3b → 0.8.4-main.3eb6e50203

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 (242) 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 +3198 -66
  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 +34 -45
  7. package/dist/lib/browser/testing/index.mjs.map +3 -3
  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 +3198 -66
  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 +34 -45
  14. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  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/Button/Button.d.ts +1 -1
  20. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  21. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  22. package/dist/types/src/components/Button/ToggleGroup.d.ts +4 -4
  23. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +4 -4
  24. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  25. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  26. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  27. package/dist/types/src/components/Dialog/Dialog.d.ts +23 -8
  28. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  29. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +7 -5
  30. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  31. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  32. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  33. package/dist/types/src/components/Icon/Icon.d.ts +1 -1
  34. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  35. package/dist/types/src/components/Input/Input.d.ts +1 -1
  36. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  37. package/dist/types/src/components/Input/Input.stories.d.ts +2 -2
  38. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  39. package/dist/types/src/components/List/List.d.ts +1 -1
  40. package/dist/types/src/components/List/List.d.ts.map +1 -1
  41. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  42. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  43. package/dist/types/src/components/Main/Main.d.ts +8 -9
  44. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  45. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  46. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  47. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  48. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  49. package/dist/types/src/components/{Menus → Menu}/DropdownMenu.d.ts +1 -1
  50. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  51. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  52. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  53. package/dist/types/src/components/Message/Message.d.ts +1 -1
  54. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  55. package/dist/types/src/components/Message/Message.stories.d.ts +1 -1
  56. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  57. package/dist/types/src/components/Popover/Popover.d.ts +1 -1
  58. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  59. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +25 -26
  60. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  61. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +46 -8
  62. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  63. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +2 -2
  64. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  65. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +1 -1
  66. package/dist/types/src/components/Select/Select.d.ts +9 -9
  67. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  68. package/dist/types/src/components/Separator/Separator.d.ts +1 -1
  69. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  70. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  71. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  72. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  73. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  74. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  75. package/dist/types/src/components/Splitter/Splitter.d.ts +26 -0
  76. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  77. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  78. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  79. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  80. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  81. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  82. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  83. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +2 -2
  84. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  85. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
  86. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  87. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  88. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  89. package/dist/types/src/components/Toast/Toast.d.ts +4 -4
  90. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  91. package/dist/types/src/components/Toolbar/Toolbar.d.ts +13 -12
  92. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  93. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  94. package/dist/types/src/components/index.d.ts +3 -1
  95. package/dist/types/src/components/index.d.ts.map +1 -1
  96. package/dist/types/src/exemplars/generics.stories.d.ts +17 -0
  97. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  98. package/dist/types/src/exemplars/slot.stories.d.ts +14 -0
  99. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  100. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  101. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  102. package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
  103. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  104. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  105. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  106. package/dist/types/src/index.d.ts +2 -1
  107. package/dist/types/src/index.d.ts.map +1 -1
  108. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  109. package/dist/types/src/primitives/Container/Container.d.ts +23 -0
  110. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  111. package/dist/types/src/primitives/Container/Container.stories.d.ts +11 -0
  112. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  113. package/dist/types/src/primitives/Container/Layout.d.ts +18 -0
  114. package/dist/types/src/primitives/Container/Layout.d.ts.map +1 -0
  115. package/dist/types/src/primitives/Container/Layout.stories.d.ts +10 -0
  116. package/dist/types/src/primitives/Container/Layout.stories.d.ts.map +1 -0
  117. package/dist/types/src/primitives/Container/index.d.ts +3 -0
  118. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  119. package/dist/types/src/primitives/Flex/Flex.d.ts +8 -0
  120. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  121. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  122. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  123. package/dist/types/src/primitives/index.d.ts +3 -0
  124. package/dist/types/src/primitives/index.d.ts.map +1 -0
  125. package/dist/types/src/testing/decorators/withLayout.d.ts +3 -3
  126. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  127. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +1 -1
  128. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  129. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  130. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  131. package/dist/types/src/util/index.d.ts +1 -2
  132. package/dist/types/src/util/index.d.ts.map +1 -1
  133. package/dist/types/tsconfig.tsbuildinfo +1 -1
  134. package/package.json +37 -32
  135. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +10 -12
  136. package/src/components/Avatars/Avatar.stories.tsx +4 -4
  137. package/src/components/Avatars/Avatar.tsx +3 -10
  138. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -2
  139. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +2 -2
  140. package/src/components/Breadcrumb/Breadcrumb.tsx +5 -31
  141. package/src/components/Button/Button.stories.tsx +2 -2
  142. package/src/components/Button/Button.tsx +2 -8
  143. package/src/components/Button/IconButton.stories.tsx +2 -2
  144. package/src/components/Button/IconButton.tsx +5 -2
  145. package/src/components/Button/Toggle.stories.tsx +2 -2
  146. package/src/components/Button/ToggleGroup.stories.tsx +2 -2
  147. package/src/components/Clipboard/CopyButton.tsx +3 -3
  148. package/src/components/DensityProvider/DensityProvider.tsx +1 -1
  149. package/src/components/Dialog/AlertDialog.stories.tsx +2 -2
  150. package/src/components/Dialog/AlertDialog.tsx +3 -8
  151. package/src/components/Dialog/Dialog.stories.tsx +57 -23
  152. package/src/components/Dialog/Dialog.tsx +162 -43
  153. package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
  154. package/src/components/Icon/Icon.stories.tsx +3 -3
  155. package/src/components/Icon/Icon.tsx +2 -2
  156. package/src/components/Input/Input.stories.tsx +12 -11
  157. package/src/components/Input/Input.tsx +12 -27
  158. package/src/components/Link/Link.stories.tsx +2 -2
  159. package/src/components/Link/Link.tsx +1 -1
  160. package/src/components/List/List.stories.tsx +18 -14
  161. package/src/components/List/List.tsx +8 -14
  162. package/src/components/List/Tree.stories.tsx +2 -2
  163. package/src/components/List/Treegrid.stories.tsx +2 -2
  164. package/src/components/List/Treegrid.tsx +4 -9
  165. package/src/components/Main/Main.stories.tsx +41 -20
  166. package/src/components/Main/Main.tsx +128 -71
  167. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +2 -2
  168. package/src/components/{Menus → Menu}/ContextMenu.tsx +7 -31
  169. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +2 -2
  170. package/src/components/{Menus → Menu}/DropdownMenu.tsx +65 -63
  171. package/src/components/Message/Message.stories.tsx +3 -3
  172. package/src/components/Message/Message.tsx +32 -23
  173. package/src/components/Popover/Popover.stories.tsx +2 -2
  174. package/src/components/Popover/Popover.tsx +38 -36
  175. package/src/components/ScrollArea/ScrollArea.stories.tsx +166 -40
  176. package/src/components/ScrollArea/ScrollArea.tsx +80 -82
  177. package/src/components/ScrollArea/index.ts +1 -1
  178. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +2 -2
  179. package/src/components/ScrollContainer/ScrollContainer.tsx +14 -9
  180. package/src/components/Select/Select.stories.tsx +2 -2
  181. package/src/components/Select/Select.tsx +9 -25
  182. package/src/components/Separator/Separator.tsx +1 -1
  183. package/src/components/Skeleton/Skeleton.stories.tsx +52 -0
  184. package/src/components/Skeleton/Skeleton.tsx +26 -0
  185. package/src/components/Skeleton/index.ts +5 -0
  186. package/src/components/Splitter/Splitter.stories.tsx +73 -0
  187. package/src/components/Splitter/Splitter.tsx +123 -0
  188. package/src/components/Splitter/index.ts +5 -0
  189. package/src/components/Status/Status.stories.tsx +2 -2
  190. package/src/components/Status/Status.tsx +2 -2
  191. package/src/components/Tag/Tag.stories.tsx +4 -4
  192. package/src/components/Tag/Tag.tsx +2 -7
  193. package/src/components/ThemeProvider/ThemeProvider.tsx +3 -4
  194. package/src/components/ThemeProvider/TranslationsProvider.tsx +1 -16
  195. package/src/components/ThemeProvider/index.ts +3 -3
  196. package/src/components/Toast/Toast.stories.tsx +2 -2
  197. package/src/components/Toast/Toast.tsx +6 -10
  198. package/src/components/Toolbar/Toolbar.stories.tsx +2 -2
  199. package/src/components/Toolbar/Toolbar.tsx +31 -12
  200. package/src/components/Tooltip/Tooltip.stories.tsx +2 -2
  201. package/src/components/Tooltip/Tooltip.tsx +24 -22
  202. package/src/components/index.ts +3 -1
  203. package/src/exemplars/generics.stories.tsx +44 -0
  204. package/src/exemplars/slot.stories.tsx +108 -0
  205. package/src/exemplars/tabster.stories.tsx +127 -0
  206. package/src/hooks/useDensityContext.ts +1 -1
  207. package/src/hooks/useElevationContext.ts +1 -1
  208. package/src/index.ts +2 -1
  209. package/src/playground/Controls.stories.tsx +3 -4
  210. package/src/playground/Custom.stories.tsx +2 -2
  211. package/src/playground/Typography.stories.tsx +2 -2
  212. package/src/primitives/Container/Container.stories.tsx +67 -0
  213. package/src/primitives/Container/Container.tsx +79 -0
  214. package/src/primitives/Container/Layout.stories.tsx +57 -0
  215. package/src/primitives/Container/Layout.tsx +61 -0
  216. package/src/primitives/Container/index.ts +6 -0
  217. package/src/primitives/Flex/Flex.tsx +26 -0
  218. package/src/primitives/Flex/index.ts +5 -0
  219. package/src/primitives/index.ts +6 -0
  220. package/src/testing/decorators/withLayout.tsx +22 -15
  221. package/src/testing/decorators/withLayoutVariants.tsx +2 -2
  222. package/src/testing/decorators/withTheme.tsx +21 -18
  223. package/src/util/index.ts +2 -2
  224. package/dist/lib/browser/chunk-BFCXP6YC.mjs +0 -4710
  225. package/dist/lib/browser/chunk-BFCXP6YC.mjs.map +0 -7
  226. package/dist/lib/node-esm/chunk-F4Z46DD6.mjs +0 -4712
  227. package/dist/lib/node-esm/chunk-F4Z46DD6.mjs.map +0 -7
  228. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  229. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  230. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  231. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  232. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  233. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  234. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  235. package/dist/types/src/util/domino.d.ts +0 -18
  236. package/dist/types/src/util/domino.d.ts.map +0 -1
  237. package/src/util/ThemedClassName.ts +0 -7
  238. package/src/util/domino.ts +0 -53
  239. /package/dist/types/src/components/{Menus → Menu}/ContextMenu.stories.d.ts +0 -0
  240. /package/dist/types/src/components/{Menus → Menu}/DropdownMenu.stories.d.ts +0 -0
  241. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  242. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -41,9 +41,9 @@ import { useElevationContext, useThemeContext } from '../../hooks';
41
41
  import { useSafeCollisionPadding } from '../../hooks/useSafeCollisionPadding';
42
42
  import { type ThemedClassName } from '../../util';
43
43
 
44
- /* -------------------------------------------------------------------------------------------------
45
- * Popover
46
- * ----------------------------------------------------------------------------------------------- */
44
+ //
45
+ // Context
46
+ //
47
47
 
48
48
  const POPOVER_NAME = 'Popover';
49
49
 
@@ -65,6 +65,10 @@ type PopoverContextValue = {
65
65
 
66
66
  const [PopoverProvider, usePopoverContext] = createPopoverContext<PopoverContextValue>(POPOVER_NAME);
67
67
 
68
+ //
69
+ // PopoverRoot
70
+ //
71
+
68
72
  interface PopoverRootProps {
69
73
  children?: ReactNode;
70
74
  open?: boolean;
@@ -106,9 +110,9 @@ const PopoverRoot: FC<PopoverRootProps> = (props: ScopedProps<PopoverRootProps>)
106
110
 
107
111
  PopoverRoot.displayName = POPOVER_NAME;
108
112
 
109
- /* -------------------------------------------------------------------------------------------------
110
- * PopoverAnchor
111
- * ----------------------------------------------------------------------------------------------- */
113
+ //
114
+ // PopoverAnchor
115
+ //
112
116
 
113
117
  const ANCHOR_NAME = 'PopoverAnchor';
114
118
 
@@ -134,9 +138,9 @@ const PopoverAnchor = forwardRef<PopoverAnchorElement, PopoverAnchorProps>(
134
138
 
135
139
  PopoverAnchor.displayName = ANCHOR_NAME;
136
140
 
137
- /* -------------------------------------------------------------------------------------------------
138
- * PopoverTrigger
139
- * ----------------------------------------------------------------------------------------------- */
141
+ //
142
+ // PopoverTrigger
143
+ //
140
144
 
141
145
  const TRIGGER_NAME = 'PopoverTrigger';
142
146
 
@@ -176,9 +180,9 @@ const PopoverTrigger = forwardRef<PopoverTriggerElement, PopoverTriggerProps>(
176
180
 
177
181
  PopoverTrigger.displayName = TRIGGER_NAME;
178
182
 
179
- /* -------------------------------------------------------------------------------------------------
180
- * PopoverVirtualTrigger
181
- * ----------------------------------------------------------------------------------------------- */
183
+ //
184
+ // PopoverVirtualTrigger
185
+ //
182
186
 
183
187
  const VIRTUAL_TRIGGER_NAME = 'PopoverVirtualTrigger';
184
188
 
@@ -200,9 +204,9 @@ const PopoverVirtualTrigger = (props: ScopedProps<PopoverVirtualTriggerProps>) =
200
204
 
201
205
  PopoverVirtualTrigger.displayName = VIRTUAL_TRIGGER_NAME;
202
206
 
203
- /* -------------------------------------------------------------------------------------------------
204
- * PopoverPortal
205
- * ----------------------------------------------------------------------------------------------- */
207
+ //
208
+ // PopoverPortal
209
+ //
206
210
 
207
211
  const PORTAL_NAME = 'PopoverPortal';
208
212
 
@@ -241,9 +245,9 @@ const PopoverPortal: FC<PopoverPortalProps> = (props: ScopedProps<PopoverPortalP
241
245
 
242
246
  PopoverPortal.displayName = PORTAL_NAME;
243
247
 
244
- /* -------------------------------------------------------------------------------------------------
245
- * PopoverContent
246
- * ----------------------------------------------------------------------------------------------- */
248
+ //
249
+ // PopoverContent
250
+ //
247
251
 
248
252
  const CONTENT_NAME = 'PopoverContent';
249
253
 
@@ -275,8 +279,6 @@ const PopoverContent = forwardRef<PopoverContentTypeElement, PopoverContentProps
275
279
 
276
280
  PopoverContent.displayName = CONTENT_NAME;
277
281
 
278
- /* ----------------------------------------------------------------------------------------------- */
279
-
280
282
  type PopoverContentTypeElement = PopoverContentImplElement;
281
283
  export interface PopoverContentTypeProps
282
284
  extends Omit<PopoverContentImplProps, 'trapFocus' | 'disableOutsidePointerEvents'> {}
@@ -391,8 +393,6 @@ const PopoverContentNonModal = forwardRef<PopoverContentTypeElement, PopoverCont
391
393
  },
392
394
  );
393
395
 
394
- /* ----------------------------------------------------------------------------------------------- */
395
-
396
396
  type PopoverContentImplElement = ElementRef<typeof PopperPrimitive.Content>;
397
397
  type FocusScopeProps = ComponentPropsWithoutRef<typeof FocusScope>;
398
398
  type DismissableLayerProps = ComponentPropsWithoutRef<typeof DismissableLayer>;
@@ -485,7 +485,7 @@ const PopoverContentImpl = forwardRef<PopoverContentImplElement, PopoverContentI
485
485
  {...contentProps}
486
486
  collisionPadding={safeCollisionPadding}
487
487
  collisionBoundary={computedCollisionBoundary}
488
- className={tx('popover.content', 'popover', { elevation }, classNames)}
488
+ className={tx('popover.content', { elevation }, classNames)}
489
489
  ref={forwardedRef}
490
490
  style={{
491
491
  ...contentProps.style,
@@ -505,9 +505,9 @@ const PopoverContentImpl = forwardRef<PopoverContentImplElement, PopoverContentI
505
505
  },
506
506
  );
507
507
 
508
- /* -------------------------------------------------------------------------------------------------
509
- * PopoverClose
510
- * ----------------------------------------------------------------------------------------------- */
508
+ //
509
+ // PopoverClose
510
+ //
511
511
 
512
512
  const CLOSE_NAME = 'PopoverClose';
513
513
 
@@ -531,9 +531,9 @@ const PopoverClose = forwardRef<PopoverCloseElement, PopoverCloseProps>(
531
531
 
532
532
  PopoverClose.displayName = CLOSE_NAME;
533
533
 
534
- /* -------------------------------------------------------------------------------------------------
535
- * PopoverArrow
536
- * ----------------------------------------------------------------------------------------------- */
534
+ //
535
+ // PopoverArrow
536
+ //
537
537
 
538
538
  const ARROW_NAME = 'PopoverArrow';
539
539
 
@@ -550,7 +550,7 @@ const PopoverArrow = forwardRef<PopoverArrowElement, PopoverArrowProps>(
550
550
  <PopperPrimitive.Arrow
551
551
  {...popperScope}
552
552
  {...arrowProps}
553
- className={tx('popover.arrow', 'popover__arrow', {}, classNames)}
553
+ className={tx('popover.arrow', {}, classNames)}
554
554
  ref={forwardedRef}
555
555
  />
556
556
  );
@@ -559,9 +559,9 @@ const PopoverArrow = forwardRef<PopoverArrowElement, PopoverArrowProps>(
559
559
 
560
560
  PopoverArrow.displayName = ARROW_NAME;
561
561
 
562
- /* -------------------------------------------------------------------------------------------------
563
- * PopoverViewport
564
- * ----------------------------------------------------------------------------------------------- */
562
+ //
563
+ // PopoverViewport
564
+ //
565
565
 
566
566
  type PopoverViewportProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.div>> & {
567
567
  asChild?: boolean;
@@ -576,7 +576,7 @@ const PopoverViewport = forwardRef<HTMLDivElement, PopoverViewportProps>(
576
576
  return (
577
577
  <Root
578
578
  {...props}
579
- className={tx('popover.viewport', 'popover__viewport', { constrainInline, constrainBlock }, classNames)}
579
+ className={tx('popover.viewport', { constrainInline, constrainBlock }, classNames)}
580
580
  ref={forwardedRef}
581
581
  >
582
582
  {children}
@@ -585,12 +585,14 @@ const PopoverViewport = forwardRef<HTMLDivElement, PopoverViewportProps>(
585
585
  },
586
586
  );
587
587
 
588
- /* ----------------------------------------------------------------------------------------------- */
589
-
590
588
  const getState = (open: boolean) => (open ? 'open' : 'closed');
591
589
 
592
590
  type PopoverContentInteractOutsideEvent = Parameters<NonNullable<PopoverContentProps['onInteractOutside']>>[0];
593
591
 
592
+ //
593
+ // Popver
594
+ //
595
+
594
596
  export const Popover = {
595
597
  Root: PopoverRoot,
596
598
  Anchor: PopoverAnchor,
@@ -1,51 +1,177 @@
1
1
  //
2
- // Copyright 2023 DXOS.org
2
+ // Copyright 2026 DXOS.org
3
3
  //
4
4
 
5
- import { type Meta, type StoryObj } from '@storybook/react-vite';
6
- import React, { type PropsWithChildren } from 'react';
5
+ import React, { useMemo } from 'react';
7
6
 
8
7
  import { faker } from '@dxos/random';
9
- import { activeSurface, surfaceShadow } from '@dxos/react-ui-theme';
8
+ import { mx } from '@dxos/ui-theme';
10
9
 
11
- import { withTheme } from '../../testing';
10
+ import { withLayout, withTheme } from '../../testing';
12
11
 
13
12
  import { ScrollArea } from './ScrollArea';
14
13
 
15
- faker.seed(1234);
16
-
17
- const DefaultStory = ({ children }: PropsWithChildren<{}>) => {
18
- return (
19
- <ScrollArea.Root
20
- classNames={['is-[300px] bs-[400px] rounded', activeSurface, surfaceShadow({ elevation: 'positioned' })]}
21
- >
22
- <ScrollArea.Viewport classNames='rounded p-4'>
23
- <p>{children}</p>
24
- </ScrollArea.Viewport>
25
- <ScrollArea.Scrollbar orientation='horizontal'>
26
- <ScrollArea.Thumb />
27
- </ScrollArea.Scrollbar>
28
- <ScrollArea.Scrollbar orientation='vertical'>
29
- <ScrollArea.Thumb />
30
- </ScrollArea.Scrollbar>
31
- <ScrollArea.Corner />
32
- </ScrollArea.Root>
33
- );
34
- };
35
-
36
- const meta = {
37
- title: 'ui/react-ui-core/ScrollArea',
38
- component: ScrollArea as any,
39
- render: DefaultStory,
40
- decorators: [withTheme],
41
- } satisfies Meta<typeof DefaultStory>;
42
-
43
- export default meta;
44
-
45
- type Story = StoryObj<typeof meta>;
46
-
47
- export const Default: Story = {
48
- args: {
49
- children: faker.lorem.paragraphs(5),
14
+ faker.seed(123);
15
+
16
+ export default {
17
+ title: 'ui/react-ui-core/components/ScrollArea',
18
+ component: ScrollArea,
19
+ decorators: [withTheme()],
20
+ parameters: {
21
+ layout: 'centered',
50
22
  },
51
23
  };
24
+
25
+ const Column = () => (
26
+ <div>
27
+ {Array.from({ length: 50 }).map((_, index) => (
28
+ <div key={index} className='text-sm'>
29
+ Item {index + 1}
30
+ </div>
31
+ ))}
32
+ </div>
33
+ );
34
+
35
+ const Row = () => (
36
+ <div className='flex gap-2 is-max'>
37
+ {Array.from({ length: 50 }).map((_, index) => (
38
+ <div
39
+ key={index}
40
+ className='shrink-0 bs-20 is-20 border border-separator rounded-md flex items-center justify-center text-sm'
41
+ >
42
+ {index + 1}
43
+ </div>
44
+ ))}
45
+ </div>
46
+ );
47
+
48
+ export const Vertical = {
49
+ render: () => (
50
+ <div className='bs-72 is-48 p-2 border border-separator rounded-md'>
51
+ <ScrollArea.Root orientation='vertical'>
52
+ <ScrollArea.Viewport>
53
+ <Column />
54
+ </ScrollArea.Viewport>
55
+ </ScrollArea.Root>
56
+ </div>
57
+ ),
58
+ };
59
+
60
+ export const VerticalThin = {
61
+ render: () => (
62
+ <div className='bs-72 is-48 p-2 border border-separator rounded-md'>
63
+ <ScrollArea.Root orientation='vertical' thin>
64
+ <ScrollArea.Viewport>
65
+ <Column />
66
+ </ScrollArea.Viewport>
67
+ </ScrollArea.Root>
68
+ </div>
69
+ ),
70
+ };
71
+
72
+ export const Horizontal = {
73
+ render: () => (
74
+ <div className='is-96 p-2 border border-separator rounded-md'>
75
+ <ScrollArea.Root orientation='horizontal'>
76
+ <ScrollArea.Viewport>
77
+ <Row />
78
+ </ScrollArea.Viewport>
79
+ </ScrollArea.Root>
80
+ </div>
81
+ ),
82
+ };
83
+
84
+ export const HorizontalThin = {
85
+ render: () => (
86
+ <div className='is-96 p-2 border border-separator rounded-md'>
87
+ <ScrollArea.Root orientation='horizontal' thin>
88
+ <ScrollArea.Viewport>
89
+ <Row />
90
+ </ScrollArea.Viewport>
91
+ </ScrollArea.Root>
92
+ </div>
93
+ ),
94
+ };
95
+
96
+ export const Both = {
97
+ render: () => (
98
+ <div className='bs-72 is-96 p-2 border border-separator rounded-md'>
99
+ <ScrollArea.Root thin orientation='all'>
100
+ <ScrollArea.Viewport>
101
+ <div className='flex flex-col gap-2'>
102
+ {Array.from({ length: 50 }).map((_, rowIndex) => (
103
+ <div key={rowIndex} className='flex gap-2'>
104
+ {Array.from({ length: 50 }).map((_, colIndex) => (
105
+ <div
106
+ key={colIndex}
107
+ className='shrink-0 bs-20 is-20 flex items-center justify-center text-sm border border-separator font-mono'
108
+ >
109
+ [{colIndex}:{rowIndex}]
110
+ </div>
111
+ ))}
112
+ </div>
113
+ ))}
114
+ </div>
115
+ </ScrollArea.Viewport>
116
+ </ScrollArea.Root>
117
+ </div>
118
+ ),
119
+ };
120
+
121
+ export const NestedScrollAreas = {
122
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
123
+ render: () => {
124
+ const columns = useMemo(
125
+ () =>
126
+ Array.from({ length: 8 }).map((_, index) => ({
127
+ id: String(index),
128
+ count: faker.number.int({ min: 5, max: 20 }),
129
+ })),
130
+ [],
131
+ );
132
+
133
+ return (
134
+ <ScrollArea.Root thin orientation='horizontal'>
135
+ <ScrollArea.Viewport classNames='gap-4'>
136
+ {columns.map((column) => (
137
+ <section
138
+ key={column.id}
139
+ className='shrink-0 bs-full is-[16rem] grid grid-rows-[min-content_1fr_min-content] border border-separator'
140
+ >
141
+ <header className='flex shrink-0 p-2 border-be border-separator'>Column {column.id}</header>
142
+ <ScrollArea.Root thin orientation='vertical'>
143
+ <ScrollArea.Viewport classNames='plb-2 pli-2 gap-2'>
144
+ {Array.from({ length: column.count }, (_, i) => (
145
+ <div key={i} role='listitem' className={`shrink-0 p-2 text-sm border border-separator rounded-sm`}>
146
+ Item {i + 1}
147
+ </div>
148
+ ))}
149
+ </ScrollArea.Viewport>
150
+ </ScrollArea.Root>
151
+ <footer className={`p-2 text-subdued border-bs border-separator`}>{column.count}</footer>
152
+ </section>
153
+ ))}
154
+ </ScrollArea.Viewport>
155
+ </ScrollArea.Root>
156
+ );
157
+ },
158
+ };
159
+
160
+ export const NativeScroll = {
161
+ render: () => (
162
+ <div className='group bs-48 is-48 border border-separator'>
163
+ <div
164
+ className={mx(
165
+ 'group bs-full is-full overflow-y-scroll',
166
+ '[&::-webkit-scrollbar]:is-3',
167
+ '[&::-webkit-scrollbar-thumb]:rounded-none',
168
+ '[&::-webkit-scrollbar-track]:bg-scrollbarTrack',
169
+ '[&::-webkit-scrollbar-thumb]:bg-scrollbarThumbSubdued',
170
+ 'group-hover:[&::-webkit-scrollbar-thumb]:bg-scrollbarThumb',
171
+ )}
172
+ >
173
+ <Column />
174
+ </div>
175
+ </div>
176
+ ),
177
+ };
@@ -1,111 +1,109 @@
1
1
  //
2
- // Copyright 2023 DXOS.org
2
+ // Copyright 2026 DXOS.org
3
3
  //
4
4
 
5
- import {
6
- Corner as ScrollAreaPrimitiveCorner,
7
- type ScrollAreaCornerProps as ScrollAreaPrimitiveCornerProps,
8
- Root as ScrollAreaPrimitiveRoot,
9
- type ScrollAreaProps as ScrollAreaPrimitiveRootProps,
10
- Scrollbar as ScrollAreaPrimitiveScrollbar,
11
- type ScrollAreaScrollbarProps as ScrollAreaPrimitiveScrollbarProps,
12
- Thumb as ScrollAreaPrimitiveThumb,
13
- type ScrollAreaThumbProps as ScrollAreaPrimitiveThumbProps,
14
- Viewport as ScrollAreaPrimitiveViewport,
15
- type ScrollAreaViewportProps as ScrollAreaPrimitiveViewportProps,
16
- } from '@radix-ui/react-scroll-area';
17
- import React, { forwardRef } from 'react';
5
+ import { createContext } from '@radix-ui/react-context';
6
+ import React, { type HTMLAttributes, forwardRef } from 'react';
7
+
8
+ import { type AllowedAxis, type SlottableProps, type ThemedClassName } from '@dxos/ui-types';
18
9
 
19
10
  import { useThemeContext } from '../../hooks';
20
- import { type ThemedClassName } from '../../util';
21
11
 
22
- type ScrollAreaVariant = 'coarse' | 'fine';
12
+ //
13
+ // Context
14
+ //
23
15
 
24
- type ScrollAreaRootProps = ThemedClassName<ScrollAreaPrimitiveRootProps>;
16
+ const SCROLLAREA_NAME = 'ScrollArea';
17
+
18
+ type ScrollAreaContextType = {
19
+ /** Orientation of scrollbars. */
20
+ orientation: AllowedAxis;
21
+ /** Hide scrollbars when not scrolling. */
22
+ autoHide: boolean;
23
+ /** Apply padding to opposite side of scrollbar. */
24
+ margin?: boolean;
25
+ /** Apply padding. */
26
+ padding: boolean;
27
+ /** Use thin scrollbars. */
28
+ thin: boolean;
29
+ /** Enable snap scrolling. */
30
+ snap: boolean;
31
+ };
32
+
33
+ const [ScrollAreaProvider, useScrollAreaContext] = createContext<ScrollAreaContextType>(SCROLLAREA_NAME);
34
+
35
+ //
36
+ // Root
37
+ //
38
+
39
+ const SCROLLAREA_ROOT_NAME = 'ScrollArea.Root';
40
+
41
+ type ScrollAreaRootProps = SlottableProps<HTMLDivElement> & Partial<ScrollAreaContextType>;
25
42
 
26
43
  /**
27
- * @deprecated
44
+ * ScrollArea provides native scrollbars with custom styling.
28
45
  */
29
- const ScrollAreaRoot = forwardRef<HTMLDivElement, ScrollAreaRootProps>(({ classNames, ...props }, forwardedRef) => {
30
- const { tx } = useThemeContext();
31
- return (
32
- <ScrollAreaPrimitiveRoot
33
- {...props}
34
- className={tx('scrollArea.root', 'scroll-area', {}, classNames)}
35
- ref={forwardedRef}
36
- />
37
- );
38
- });
39
-
40
- type ScrollAreaViewportProps = ThemedClassName<ScrollAreaPrimitiveViewportProps>;
41
-
42
- const ScrollAreaViewport = forwardRef<HTMLDivElement, ScrollAreaViewportProps>(
43
- ({ classNames, ...props }, forwardedRef) => {
46
+ const ScrollAreaRoot = forwardRef<HTMLDivElement, ScrollAreaRootProps>(
47
+ (
48
+ {
49
+ className,
50
+ classNames,
51
+ children,
52
+ orientation = 'vertical',
53
+ autoHide = true,
54
+ margin = false,
55
+ padding = false,
56
+ thin = false,
57
+ snap = false,
58
+ ...props
59
+ },
60
+ forwardedRef,
61
+ ) => {
44
62
  const { tx } = useThemeContext();
63
+ const options = { orientation, autoHide, margin, padding, thin, snap };
64
+
45
65
  return (
46
- <ScrollAreaPrimitiveViewport
47
- {...props}
48
- className={tx('scrollArea.viewport', 'scroll-area', {}, classNames)}
49
- ref={forwardedRef}
50
- />
66
+ <ScrollAreaProvider {...options}>
67
+ <div {...props} className={tx('scrollArea.root', options, [className, classNames])} ref={forwardedRef}>
68
+ {children}
69
+ </div>
70
+ </ScrollAreaProvider>
51
71
  );
52
72
  },
53
73
  );
54
74
 
55
- type ScrollAreaScrollbarProps = ThemedClassName<ScrollAreaPrimitiveScrollbarProps> & { variant?: ScrollAreaVariant };
75
+ ScrollAreaRoot.displayName = SCROLLAREA_ROOT_NAME;
76
+
77
+ //
78
+ // Viewport
79
+ //
80
+
81
+ const SCROLLAREA_VIEWPORT_NAME = 'ScrollArea.Viewport';
82
+
83
+ type ScrollAreaViewportProps = ThemedClassName<HTMLAttributes<HTMLDivElement>>;
56
84
 
57
- const ScrollAreaScrollbar = forwardRef<HTMLDivElement, ScrollAreaScrollbarProps>(
58
- ({ classNames, variant = 'fine', ...props }, forwardedRef) => {
85
+ const ScrollAreaViewport = forwardRef<HTMLDivElement, ScrollAreaViewportProps>(
86
+ ({ classNames, children, ...props }, forwardedRef) => {
59
87
  const { tx } = useThemeContext();
88
+ const options = useScrollAreaContext(SCROLLAREA_VIEWPORT_NAME);
89
+
60
90
  return (
61
- <ScrollAreaPrimitiveScrollbar
62
- data-variant={variant}
63
- {...props}
64
- className={tx('scrollArea.scrollbar', 'scroll-area__scrollbar', {}, classNames)}
65
- ref={forwardedRef}
66
- />
91
+ <div {...props} className={tx('scrollArea.viewport', options, classNames)} ref={forwardedRef}>
92
+ {children}
93
+ </div>
67
94
  );
68
95
  },
69
96
  );
70
97
 
71
- type ScrollAreaThumbProps = ThemedClassName<ScrollAreaPrimitiveThumbProps>;
72
-
73
- const ScrollAreaThumb = forwardRef<HTMLDivElement, ScrollAreaThumbProps>(({ classNames, ...props }, forwardedRef) => {
74
- const { tx } = useThemeContext();
75
- return (
76
- <ScrollAreaPrimitiveThumb
77
- {...props}
78
- className={tx('scrollArea.thumb', 'scroll-area__thumb', {}, classNames)}
79
- ref={forwardedRef}
80
- />
81
- );
82
- });
83
-
84
- type ScrollAreaCornerProps = ThemedClassName<ScrollAreaPrimitiveCornerProps>;
85
-
86
- const ScrollAreaCorner = forwardRef<HTMLDivElement, ScrollAreaCornerProps>(({ classNames, ...props }, forwardedRef) => {
87
- const { tx } = useThemeContext();
88
- return (
89
- <ScrollAreaPrimitiveCorner
90
- {...props}
91
- className={tx('scrollArea.corner', 'scroll-area__corner', {}, classNames)}
92
- ref={forwardedRef}
93
- />
94
- );
95
- });
98
+ ScrollAreaViewport.displayName = SCROLLAREA_VIEWPORT_NAME;
99
+
100
+ //
101
+ // ScrollArea
102
+ //
96
103
 
97
104
  export const ScrollArea = {
98
105
  Root: ScrollAreaRoot,
99
106
  Viewport: ScrollAreaViewport,
100
- Scrollbar: ScrollAreaScrollbar,
101
- Thumb: ScrollAreaThumb,
102
- Corner: ScrollAreaCorner,
103
107
  };
104
108
 
105
- export type {
106
- ScrollAreaRootProps,
107
- ScrollAreaViewportProps,
108
- ScrollAreaScrollbarProps,
109
- ScrollAreaThumbProps,
110
- ScrollAreaCornerProps,
111
- };
109
+ export type { ScrollAreaRootProps, ScrollAreaViewportProps };
@@ -1,5 +1,5 @@
1
1
  //
2
- // Copyright 2023 DXOS.org
2
+ // Copyright 2026 DXOS.org
3
3
  //
4
4
 
5
5
  export * from './ScrollArea';
@@ -52,10 +52,10 @@ const DefaultStory = (props: ScrollContainerRootProps) => {
52
52
  };
53
53
 
54
54
  const meta = {
55
- title: 'ui/react-ui-core/ScrollContainer',
55
+ title: 'ui/react-ui-core/components/ScrollContainer',
56
56
  component: ScrollContainer.Root,
57
57
  render: DefaultStory,
58
- decorators: [withTheme, withLayout({ container: 'column', classNames: 'is-[30rem]' })],
58
+ decorators: [withTheme(), withLayout({ layout: 'column', classNames: 'is-[30rem]' })],
59
59
  } satisfies Meta<typeof DefaultStory>;
60
60
 
61
61
  export default meta;