@dxos/react-ui 0.8.4-main.69d29f4 → 0.8.4-main.6fa680abb7

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 (271) hide show
  1. package/dist/lib/browser/{chunk-CEKVHJ27.mjs → chunk-2FKSMWNY.mjs} +117 -117
  2. package/dist/lib/browser/chunk-2FKSMWNY.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +2804 -1957
  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 +56 -32
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/{chunk-2NHEX4AD.mjs → chunk-ZNBLTSHI.mjs} +117 -117
  9. package/dist/lib/node-esm/chunk-ZNBLTSHI.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +2804 -1957
  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 +56 -32
  14. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  15. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  16. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  17. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  18. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  19. package/dist/types/src/components/Card/Card.d.ts +107 -0
  20. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  21. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  22. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  23. package/dist/types/src/components/Card/index.d.ts +2 -0
  24. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  25. package/dist/types/src/components/Dialog/AlertDialog.d.ts +12 -3
  26. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  27. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  28. package/dist/types/src/components/Dialog/Dialog.d.ts +11 -4
  29. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  30. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +3 -6
  31. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  32. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  33. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  34. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  35. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  36. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +8 -0
  37. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  38. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  39. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  40. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  41. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  42. package/dist/types/src/components/Image/Image.d.ts +14 -0
  43. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  44. package/dist/types/src/components/Image/Image.stories.d.ts +33 -0
  45. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  46. package/dist/types/src/components/Image/index.d.ts +2 -0
  47. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  48. package/dist/types/src/components/Input/Input.d.ts +2 -5
  49. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  50. package/dist/types/src/components/Input/Input.stories.d.ts +7 -7
  51. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  52. package/dist/types/src/components/List/List.d.ts.map +1 -1
  53. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  54. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  55. package/dist/types/src/components/Main/Main.d.ts +9 -10
  56. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  57. package/dist/types/src/components/Main/Main.stories.d.ts +0 -3
  58. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  59. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -1
  60. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  61. package/dist/types/src/components/Message/Message.stories.d.ts +2 -3
  62. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  63. package/dist/types/src/components/Popover/Popover.d.ts +1 -0
  64. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  65. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +21 -26
  66. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  67. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +41 -9
  68. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  69. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  70. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +6 -1
  71. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  72. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  73. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  74. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  75. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  76. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  77. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  78. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  79. package/dist/types/src/components/Splitter/Splitter.d.ts +32 -0
  80. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  81. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  82. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  83. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  84. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  85. package/dist/types/src/components/Status/Status.stories.d.ts +4 -2
  86. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  87. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  88. package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
  89. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  90. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +1 -0
  91. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  92. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts +12 -0
  93. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  94. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  95. package/dist/types/src/components/Toolbar/Toolbar.d.ts +33 -7
  96. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  97. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  98. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  99. package/dist/types/src/components/index.d.ts +8 -4
  100. package/dist/types/src/components/index.d.ts.map +1 -1
  101. package/dist/types/src/exemplars/generics.stories.d.ts +18 -0
  102. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  103. package/dist/types/src/exemplars/slot.stories.d.ts +14 -0
  104. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  105. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  106. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  107. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  108. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  109. package/dist/types/src/index.d.ts +1 -0
  110. package/dist/types/src/index.d.ts.map +1 -1
  111. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  112. package/dist/types/src/primitives/Column/Column.d.ts +26 -0
  113. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  114. package/dist/types/src/primitives/Column/Column.stories.d.ts +6 -0
  115. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  116. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  117. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  118. package/dist/types/src/primitives/Container/Container.d.ts +8 -0
  119. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  120. package/dist/types/src/primitives/Container/Container.stories.d.ts +6 -0
  121. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  122. package/dist/types/src/primitives/Container/index.d.ts +2 -0
  123. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  124. package/dist/types/src/primitives/Flex/Flex.d.ts +13 -0
  125. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  126. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  127. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  128. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  129. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  130. package/dist/types/src/primitives/Grid/Grid.d.ts +15 -0
  131. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  132. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  133. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  134. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  135. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  136. package/dist/types/src/primitives/Panel/Panel.d.ts +26 -0
  137. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  138. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  139. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  140. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  141. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  142. package/dist/types/src/primitives/index.d.ts +6 -0
  143. package/dist/types/src/primitives/index.d.ts.map +1 -0
  144. package/dist/types/src/testing/Loading.d.ts +9 -0
  145. package/dist/types/src/testing/Loading.d.ts.map +1 -0
  146. package/dist/types/src/testing/decorators/withLayout.d.ts +1 -1
  147. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  148. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  149. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  150. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  151. package/dist/types/src/testing/index.d.ts +1 -0
  152. package/dist/types/src/testing/index.d.ts.map +1 -1
  153. package/dist/types/src/translations.d.ts +11 -0
  154. package/dist/types/src/translations.d.ts.map +1 -0
  155. package/dist/types/tsconfig.tsbuildinfo +1 -1
  156. package/package.json +25 -21
  157. package/src/components/Avatars/Avatar.stories.tsx +5 -6
  158. package/src/components/Avatars/Avatar.tsx +5 -12
  159. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -2
  160. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +3 -3
  161. package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
  162. package/src/components/Button/Button.stories.tsx +3 -3
  163. package/src/components/Button/Button.tsx +6 -12
  164. package/src/components/Button/IconButton.stories.tsx +4 -4
  165. package/src/components/Button/IconButton.tsx +1 -1
  166. package/src/components/Button/Toggle.stories.tsx +2 -2
  167. package/src/components/Button/ToggleGroup.stories.tsx +2 -2
  168. package/src/components/Card/Card.stories.tsx +151 -0
  169. package/src/components/Card/Card.tsx +347 -0
  170. package/src/components/Card/index.ts +5 -0
  171. package/src/components/Clipboard/CopyButton.tsx +3 -3
  172. package/src/components/Dialog/AlertDialog.stories.tsx +15 -15
  173. package/src/components/Dialog/AlertDialog.tsx +116 -16
  174. package/src/components/Dialog/Dialog.stories.tsx +40 -15
  175. package/src/components/Dialog/Dialog.tsx +75 -45
  176. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +50 -0
  177. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  178. package/src/components/ErrorFallback/ErrorStack.tsx +80 -0
  179. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  180. package/src/components/ErrorFallback/index.ts +9 -0
  181. package/src/components/Icon/Icon.stories.tsx +2 -2
  182. package/src/components/Icon/Icon.tsx +1 -1
  183. package/src/components/Image/Image.stories.tsx +86 -0
  184. package/src/components/Image/Image.tsx +223 -0
  185. package/src/components/Image/index.ts +5 -0
  186. package/src/components/Input/Input.stories.tsx +20 -39
  187. package/src/components/Input/Input.tsx +20 -65
  188. package/src/components/Link/Link.stories.tsx +2 -2
  189. package/src/components/Link/Link.tsx +2 -2
  190. package/src/components/List/List.stories.tsx +15 -22
  191. package/src/components/List/List.tsx +11 -16
  192. package/src/components/List/ListDropIndicator.tsx +7 -7
  193. package/src/components/List/Tree.stories.tsx +4 -4
  194. package/src/components/List/TreeDropIndicator.tsx +6 -6
  195. package/src/components/List/Treegrid.stories.tsx +3 -3
  196. package/src/components/List/Treegrid.tsx +10 -15
  197. package/src/components/Main/Main.stories.tsx +41 -23
  198. package/src/components/Main/Main.tsx +138 -81
  199. package/src/components/Menu/ContextMenu.stories.tsx +2 -2
  200. package/src/components/Menu/ContextMenu.tsx +9 -33
  201. package/src/components/Menu/DropdownMenu.stories.tsx +2 -2
  202. package/src/components/Menu/DropdownMenu.tsx +10 -10
  203. package/src/components/Message/Message.stories.tsx +25 -10
  204. package/src/components/Message/Message.tsx +17 -29
  205. package/src/components/Popover/Popover.stories.tsx +4 -4
  206. package/src/components/Popover/Popover.tsx +23 -20
  207. package/src/components/ScrollArea/ScrollArea.stories.tsx +152 -76
  208. package/src/components/ScrollArea/ScrollArea.tsx +72 -116
  209. package/src/components/ScrollArea/index.ts +1 -1
  210. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +41 -22
  211. package/src/components/ScrollContainer/ScrollContainer.tsx +18 -13
  212. package/src/components/Select/Select.stories.tsx +2 -2
  213. package/src/components/Select/Select.tsx +11 -27
  214. package/src/components/Separator/Separator.tsx +1 -1
  215. package/src/components/Skeleton/Skeleton.stories.tsx +52 -0
  216. package/src/components/Skeleton/Skeleton.tsx +26 -0
  217. package/src/components/Skeleton/index.ts +5 -0
  218. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  219. package/src/components/Splitter/Splitter.tsx +126 -0
  220. package/src/components/Splitter/index.ts +5 -0
  221. package/src/components/Status/Status.stories.tsx +21 -17
  222. package/src/components/Status/Status.tsx +2 -2
  223. package/src/components/Tag/Tag.stories.tsx +4 -9
  224. package/src/components/Tag/Tag.tsx +2 -7
  225. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +32 -0
  226. package/src/components/ThemeProvider/ThemeProvider.tsx +4 -3
  227. package/src/components/Toast/Toast.stories.tsx +2 -2
  228. package/src/components/Toast/Toast.tsx +10 -14
  229. package/src/components/Toolbar/Toolbar.stories.tsx +2 -2
  230. package/src/components/Toolbar/Toolbar.tsx +174 -12
  231. package/src/components/Tooltip/Tooltip.stories.tsx +15 -13
  232. package/src/components/Tooltip/Tooltip.tsx +3 -2
  233. package/src/components/index.ts +9 -5
  234. package/src/exemplars/generics.stories.tsx +49 -0
  235. package/src/exemplars/slot.stories.tsx +107 -0
  236. package/src/exemplars/tabster.stories.tsx +127 -0
  237. package/src/exemplars/virtualizer.stories.tsx +137 -0
  238. package/src/index.ts +1 -0
  239. package/src/playground/Controls.stories.tsx +3 -10
  240. package/src/playground/Custom.stories.tsx +10 -10
  241. package/src/playground/Typography.stories.tsx +3 -3
  242. package/src/primitives/Column/Column.stories.tsx +78 -0
  243. package/src/primitives/Column/Column.tsx +134 -0
  244. package/src/primitives/Column/index.ts +5 -0
  245. package/src/primitives/Container/Container.stories.tsx +30 -0
  246. package/src/primitives/Container/Container.tsx +22 -0
  247. package/src/primitives/Container/index.ts +5 -0
  248. package/src/primitives/Flex/Flex.stories.tsx +58 -0
  249. package/src/primitives/Flex/Flex.tsx +29 -0
  250. package/src/primitives/Flex/index.ts +5 -0
  251. package/src/primitives/Grid/Grid.stories.tsx +57 -0
  252. package/src/primitives/Grid/Grid.tsx +35 -0
  253. package/src/primitives/Grid/index.ts +5 -0
  254. package/src/primitives/Panel/Panel.stories.tsx +67 -0
  255. package/src/primitives/Panel/Panel.tsx +119 -0
  256. package/src/primitives/Panel/index.ts +5 -0
  257. package/src/primitives/index.ts +9 -0
  258. package/src/testing/Loading.tsx +26 -0
  259. package/src/testing/decorators/withLayout.tsx +21 -7
  260. package/src/testing/decorators/withLayoutVariants.tsx +18 -21
  261. package/src/testing/decorators/withTheme.tsx +19 -17
  262. package/src/testing/index.ts +2 -0
  263. package/src/translations.ts +19 -0
  264. package/dist/lib/browser/chunk-CEKVHJ27.mjs.map +0 -7
  265. package/dist/lib/node-esm/chunk-2NHEX4AD.mjs.map +0 -7
  266. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  267. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  268. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  269. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  270. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
  271. package/src/components/AnchoredOverflow/index.ts +0 -5
@@ -214,11 +214,11 @@ type DropdownMenuViewportProps = ThemedClassName<ComponentPropsWithRef<typeof Pr
214
214
  const DropdownMenuViewport = forwardRef<HTMLDivElement, DropdownMenuViewportProps>(
215
215
  ({ classNames, asChild, children, ...props }, forwardedRef) => {
216
216
  const { tx } = useThemeContext();
217
- const Root = asChild ? Slot : Primitive.div;
217
+ const Comp = asChild ? Slot : Primitive.div;
218
218
  return (
219
- <Root {...props} className={tx('menu.viewport', 'menu__viewport', {}, classNames)} ref={forwardedRef}>
219
+ <Comp {...props} className={tx('menu.viewport', {}, classNames)} ref={forwardedRef}>
220
220
  {children}
221
- </Root>
221
+ </Comp>
222
222
  );
223
223
  },
224
224
  );
@@ -283,7 +283,7 @@ const DropdownMenuContent = forwardRef<DropdownMenuContentElement, DropdownMenuC
283
283
  }
284
284
  })}
285
285
  data-arrow-keys='up down'
286
- className={tx('menu.content', 'menu', { elevation }, classNames)}
286
+ className={tx('menu.content', { elevation }, classNames)}
287
287
  style={{
288
288
  ...props.style,
289
289
  // re-namespace exposed content custom properties
@@ -341,7 +341,7 @@ const DropdownMenuGroupLabel = forwardRef<DropdownMenuLabelElement, DropdownMenu
341
341
  <MenuPrimitive.Label
342
342
  {...menuScope}
343
343
  {...labelProps}
344
- className={tx('menu.groupLabel', 'menu__group__label', {}, classNames)}
344
+ className={tx('menu.groupLabel', {}, classNames)}
345
345
  ref={forwardedRef}
346
346
  />
347
347
  );
@@ -369,7 +369,7 @@ const DropdownMenuItem = forwardRef<DropdownMenuItemElement, DropdownMenuItemPro
369
369
  <MenuPrimitive.Item
370
370
  {...menuScope}
371
371
  {...itemProps}
372
- className={tx('menu.item', 'menu__item', {}, classNames)}
372
+ className={tx('menu.item', {}, classNames)}
373
373
  ref={forwardedRef}
374
374
  />
375
375
  );
@@ -397,7 +397,7 @@ const DropdownMenuCheckboxItem = forwardRef<DropdownMenuCheckboxItemElement, Dro
397
397
  <MenuPrimitive.CheckboxItem
398
398
  {...menuScope}
399
399
  {...checkboxItemProps}
400
- className={tx('menu.item', 'menu__item--checkbox', {}, classNames)}
400
+ className={tx('menu.item', {}, classNames)}
401
401
  ref={forwardedRef}
402
402
  />
403
403
  );
@@ -445,7 +445,7 @@ const DropdownMenuRadioItem = forwardRef<DropdownMenuRadioItemElement, DropdownM
445
445
  <MenuPrimitive.Item
446
446
  {...menuScope}
447
447
  {...itemProps}
448
- className={tx('menu.item', 'menu__item', {}, classNames)}
448
+ className={tx('menu.item', {}, classNames)}
449
449
  ref={forwardedRef}
450
450
  />
451
451
  );
@@ -493,7 +493,7 @@ const DropdownMenuSeparator = forwardRef<DropdownMenuSeparatorElement, DropdownM
493
493
  <MenuPrimitive.Separator
494
494
  {...menuScope}
495
495
  {...separatorProps}
496
- className={tx('menu.separator', 'menu__item', {}, classNames)}
496
+ className={tx('menu.separator', {}, classNames)}
497
497
  ref={forwardedRef}
498
498
  />
499
499
  );
@@ -521,7 +521,7 @@ const DropdownMenuArrow = forwardRef<DropdownMenuArrowElement, DropdownMenuArrow
521
521
  <MenuPrimitive.Arrow
522
522
  {...menuScope}
523
523
  {...arrowProps}
524
- className={tx('menu.arrow', 'menu__arrow', {}, classNames)}
524
+ className={tx('menu.arrow', {}, classNames)}
525
525
  ref={forwardedRef}
526
526
  />
527
527
  );
@@ -5,11 +5,14 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React from 'react';
7
7
 
8
+ import { faker } from '@dxos/random';
8
9
  import { type MessageValence } from '@dxos/ui-types';
9
10
 
10
11
  import { withTheme } from '../../testing';
11
12
 
12
- import { Callout } from './Message';
13
+ import { Message } from './Message';
14
+
15
+ faker.seed(123);
13
16
 
14
17
  type StoryProps = {
15
18
  valence: MessageValence;
@@ -18,18 +21,22 @@ type StoryProps = {
18
21
  };
19
22
 
20
23
  const DefaultStory = ({ valence, title, body }: StoryProps) => (
21
- <Callout.Root valence={valence}>
22
- {title && <Callout.Title>{title}</Callout.Title>}
23
- {body && <Callout.Content>{body}</Callout.Content>}
24
- </Callout.Root>
24
+ <div className='w-[30rem]'>
25
+ <Message.Root valence={valence}>
26
+ {title && <Message.Title>{title}</Message.Title>}
27
+ {body && <Message.Content>{body}</Message.Content>}
28
+ </Message.Root>
29
+ </div>
25
30
  );
26
31
 
27
32
  const meta = {
28
- title: 'ui/react-ui-core/Callout',
29
- component: Callout.Root as any,
33
+ title: 'ui/react-ui-core/components/Message',
34
+ component: Message.Root as any,
30
35
  render: DefaultStory,
31
- decorators: [withTheme],
32
- parameters: { chromatic: { disableSnapshot: false } },
36
+ decorators: [withTheme()],
37
+ parameters: {
38
+ layout: 'centered',
39
+ },
33
40
  argTypes: {
34
41
  valence: {
35
42
  control: 'select',
@@ -46,6 +53,14 @@ export const Default: Story = {
46
53
  args: {
47
54
  valence: 'neutral',
48
55
  title: 'Alert title',
49
- body: 'Alert content',
56
+ body: faker.lorem.paragraphs(1),
57
+ },
58
+ };
59
+
60
+ export const Error: Story = {
61
+ args: {
62
+ valence: 'error',
63
+ title: 'Error title',
64
+ body: faker.lorem.paragraphs(1),
50
65
  },
51
66
  };
@@ -58,20 +58,20 @@ const MessageRoot = forwardRef<HTMLDivElement, MessageRootProps>(
58
58
  const titleId = useId('message__title', propsTitleId);
59
59
  const descriptionId = useId('message__description', propsDescriptionId);
60
60
  const elevation = useElevationContext(propsElevation);
61
- const Root = asChild ? Slot : Primitive.div;
61
+ const Comp = asChild ? Slot : Primitive.div;
62
62
 
63
63
  return (
64
64
  <MessageProvider {...{ titleId, descriptionId, valence }}>
65
- <Root
65
+ <Comp
66
66
  role={valence === 'neutral' ? 'paragraph' : 'alert'}
67
67
  {...props}
68
- className={tx('message.root', 'message', { valence, elevation }, classNames)}
68
+ className={tx('message.root', { valence, elevation }, classNames)}
69
69
  aria-labelledby={titleId}
70
70
  aria-describedby={descriptionId}
71
71
  ref={forwardedRef}
72
72
  >
73
73
  {children}
74
- </Root>
74
+ </Comp>
75
75
  </MessageProvider>
76
76
  );
77
77
  },
@@ -91,27 +91,20 @@ type MessageTitleProps = Omit<ThemedClassName<ComponentPropsWithRef<typeof Primi
91
91
  const MESSAGE_TITLE_NAME = 'MessageTitle';
92
92
 
93
93
  const MessageTitle = forwardRef<HTMLHeadingElement, MessageTitleProps>(
94
- ({ asChild, classNames, children, icon, ...props }, forwardedRef) => {
94
+ ({ asChild, classNames, children, icon: iconProp, ...props }, forwardedRef) => {
95
95
  const { tx } = useThemeContext();
96
96
  const { titleId, valence } = useMessageContext(MESSAGE_TITLE_NAME);
97
- const Root = asChild ? Slot : Primitive.h2;
98
-
97
+ const Comp = asChild ? Slot : Primitive.h2;
98
+ const icon = iconProp ?? messageIcons[valence];
99
99
  return (
100
- <Root
101
- {...props}
102
- className={tx('message.title', 'message__title', {}, classNames)}
103
- id={titleId}
104
- ref={forwardedRef}
105
- >
106
- {!icon && valence === 'neutral' ? null : (
107
- <Icon
108
- size={5}
109
- icon={icon ?? messageIcons[valence]}
110
- classNames={tx('message.icon', 'message__icon', { valence })}
111
- />
100
+ <Comp {...props} className={tx('message.header', {}, classNames)} id={titleId} ref={forwardedRef}>
101
+ {!icon && valence === 'neutral' ? (
102
+ <div />
103
+ ) : (
104
+ <Icon size={5} icon={icon} classNames={tx('message.icon', { valence })} />
112
105
  )}
113
- <span>{children}</span>
114
- </Root>
106
+ <span className={tx('message.title', {}, classNames)}>{children}</span>
107
+ </Comp>
115
108
  );
116
109
  },
117
110
  );
@@ -132,16 +125,11 @@ const MessageContent = forwardRef<HTMLParagraphElement, MessageContentProps>(
132
125
  ({ asChild, classNames, children, ...props }, forwardedRef) => {
133
126
  const { tx } = useThemeContext();
134
127
  const { descriptionId } = useMessageContext(MESSAGE_CONTENT_NAME);
135
- const Root = asChild ? Slot : Primitive.p;
128
+ const Comp = asChild ? Slot : Primitive.p;
136
129
  return (
137
- <Root
138
- {...props}
139
- className={tx('message.content', 'message__content', {}, classNames)}
140
- id={descriptionId}
141
- ref={forwardedRef}
142
- >
130
+ <Comp {...props} className={tx('message.content', {}, classNames)} id={descriptionId} ref={forwardedRef}>
143
131
  {children}
144
- </Root>
132
+ </Comp>
145
133
  );
146
134
  },
147
135
  );
@@ -20,7 +20,7 @@ const DefaultStory = ({ openTrigger, children }: PropsWithChildren<{ openTrigger
20
20
  <Popover.Trigger asChild>{openTrigger}</Popover.Trigger>
21
21
  <Popover.Content>
22
22
  <Popover.Viewport>
23
- <p className='pli-2 plb-1 min-is-[18rem] max-is-[38rem]'>{children}</p>
23
+ <p className='px-2 py-1 min-w-[18rem] max-w-[38rem]'>{children}</p>
24
24
  </Popover.Viewport>
25
25
  <Popover.Arrow />
26
26
  </Popover.Content>
@@ -29,10 +29,10 @@ const DefaultStory = ({ openTrigger, children }: PropsWithChildren<{ openTrigger
29
29
  };
30
30
 
31
31
  const meta = {
32
- title: 'ui/react-ui-core/Popover',
32
+ title: 'ui/react-ui-core/components/Popover',
33
33
  component: Popover.Root,
34
34
  render: DefaultStory,
35
- decorators: [withTheme],
35
+ decorators: [withTheme()],
36
36
  } satisfies Meta<typeof DefaultStory>;
37
37
 
38
38
  export default meta;
@@ -59,7 +59,7 @@ export const VirtualTrigger = {
59
59
  <Popover.VirtualTrigger virtualRef={buttonRef} />
60
60
  <Popover.Content>
61
61
  <Popover.Viewport>
62
- <p className='pli-2 plb-1 min-is-[18rem] max-is-[38rem]'>{faker.lorem.paragraphs(3)}</p>
62
+ <p className='px-2 py-1 min-w-[18rem] max-w-[38rem]'>{faker.lorem.paragraphs(3)}</p>
63
63
  </Popover.Viewport>
64
64
  <Popover.Arrow />
65
65
  </Popover.Content>
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- // This is based upon `@radix-ui/react-popover` fetched 25 Oct 2024 at https://github.com/radix-ui/primitives at commit 374c7d7.
5
+ // This is based upon `@radix-ui/react-popover` fetched Oct 25, 2024 at https://github.com/radix-ui/primitives at commit 374c7d7.
6
6
 
7
7
  import { composeEventHandlers } from '@radix-ui/primitive';
8
8
  import { useComposedRefs } from '@radix-ui/react-compose-refs';
@@ -23,9 +23,9 @@ import { hideOthers } from 'aria-hidden';
23
23
  import React, {
24
24
  type ComponentPropsWithRef,
25
25
  type ComponentPropsWithoutRef,
26
+ type ComponentRef,
26
27
  type ElementRef,
27
28
  type FC,
28
- type MutableRefObject,
29
29
  type ReactNode,
30
30
  type RefObject,
31
31
  forwardRef,
@@ -52,7 +52,7 @@ const [createPopoverContext, createPopoverScope] = createContextScope(POPOVER_NA
52
52
  const usePopperScope = createPopperScope();
53
53
 
54
54
  type PopoverContextValue = {
55
- triggerRef: MutableRefObject<HTMLButtonElement>;
55
+ triggerRef: RefObject<HTMLButtonElement>;
56
56
  contentId: string;
57
57
  open: boolean;
58
58
  onOpenChange(open: boolean): void;
@@ -93,7 +93,7 @@ const PopoverRoot: FC<PopoverRootProps> = (props: ScopedProps<PopoverRootProps>)
93
93
  <PopoverProvider
94
94
  scope={__scopePopover}
95
95
  contentId={useId()}
96
- triggerRef={triggerRef as MutableRefObject<HTMLButtonElement>}
96
+ triggerRef={triggerRef as RefObject<HTMLButtonElement>}
97
97
  open={open}
98
98
  onOpenChange={setOpen}
99
99
  onOpenToggle={useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen])}
@@ -116,7 +116,7 @@ PopoverRoot.displayName = POPOVER_NAME;
116
116
 
117
117
  const ANCHOR_NAME = 'PopoverAnchor';
118
118
 
119
- type PopoverAnchorElement = ElementRef<typeof PopperPrimitive.Anchor>;
119
+ type PopoverAnchorElement = ComponentRef<typeof PopperPrimitive.Anchor>;
120
120
  type PopperAnchorProps = ComponentPropsWithoutRef<typeof PopperPrimitive.Anchor>;
121
121
  interface PopoverAnchorProps extends PopperAnchorProps {}
122
122
 
@@ -146,17 +146,20 @@ const TRIGGER_NAME = 'PopoverTrigger';
146
146
 
147
147
  type PopoverTriggerElement = ElementRef<typeof Primitive.button>;
148
148
  type PrimitiveButtonProps = ComponentPropsWithoutRef<typeof Primitive.button>;
149
- interface PopoverTriggerProps extends PrimitiveButtonProps {}
149
+ interface PopoverTriggerProps extends PrimitiveButtonProps {
150
+ asChild?: boolean;
151
+ }
150
152
 
151
153
  const PopoverTrigger = forwardRef<PopoverTriggerElement, PopoverTriggerProps>(
152
154
  (props: ScopedProps<PopoverTriggerProps>, forwardedRef) => {
153
- const { __scopePopover, ...triggerProps } = props;
155
+ const { __scopePopover, asChild, ...triggerProps } = props;
154
156
  const context = usePopoverContext(TRIGGER_NAME, __scopePopover);
155
157
  const popperScope = usePopperScope(__scopePopover);
156
158
  const composedTriggerRef = useComposedRefs(forwardedRef, context.triggerRef);
159
+ const Comp = asChild ? Slot : Primitive.button;
157
160
 
158
161
  const trigger = (
159
- <Primitive.button
162
+ <Comp
160
163
  type='button'
161
164
  aria-haspopup='dialog'
162
165
  aria-expanded={context.open}
@@ -280,8 +283,10 @@ const PopoverContent = forwardRef<PopoverContentTypeElement, PopoverContentProps
280
283
  PopoverContent.displayName = CONTENT_NAME;
281
284
 
282
285
  type PopoverContentTypeElement = PopoverContentImplElement;
283
- export interface PopoverContentTypeProps
284
- extends Omit<PopoverContentImplProps, 'trapFocus' | 'disableOutsidePointerEvents'> {}
286
+ export interface PopoverContentTypeProps extends Omit<
287
+ PopoverContentImplProps,
288
+ 'trapFocus' | 'disableOutsidePointerEvents'
289
+ > {}
285
290
 
286
291
  const PopoverContentModal = forwardRef<PopoverContentTypeElement, PopoverContentTypeProps>(
287
292
  (props: ScopedProps<PopoverContentTypeProps>, forwardedRef) => {
@@ -303,8 +308,7 @@ const PopoverContentModal = forwardRef<PopoverContentTypeElement, PopoverContent
303
308
  <PopoverContentImpl
304
309
  {...props}
305
310
  ref={composedRefs}
306
- // we make sure we're not trapping once it's been closed
307
- // (closed !== unmounted when animating out)
311
+ // Make sure we're not trapping once it's been closed (closed !== unmounted when animating out).
308
312
  trapFocus={context.open}
309
313
  disableOutsidePointerEvents
310
314
  onCloseAutoFocus={composeEventHandlers(props.onCloseAutoFocus, (event) => {
@@ -399,8 +403,7 @@ type DismissableLayerProps = ComponentPropsWithoutRef<typeof DismissableLayer>;
399
403
  type PopperContentProps = ThemedClassName<ComponentPropsWithoutRef<typeof PopperPrimitive.Content>>;
400
404
 
401
405
  interface PopoverContentImplProps
402
- extends Omit<PopperContentProps, 'onPlaced'>,
403
- Omit<DismissableLayerProps, 'onDismiss'> {
406
+ extends Omit<PopperContentProps, 'onPlaced'>, Omit<DismissableLayerProps, 'onDismiss'> {
404
407
  /**
405
408
  * Whether focus should be trapped within the `Popover`
406
409
  * (default: false)
@@ -485,7 +488,7 @@ const PopoverContentImpl = forwardRef<PopoverContentImplElement, PopoverContentI
485
488
  {...contentProps}
486
489
  collisionPadding={safeCollisionPadding}
487
490
  collisionBoundary={computedCollisionBoundary}
488
- className={tx('popover.content', 'popover', { elevation }, classNames)}
491
+ className={tx('popover.content', { elevation }, classNames)}
489
492
  ref={forwardedRef}
490
493
  style={{
491
494
  ...contentProps.style,
@@ -550,7 +553,7 @@ const PopoverArrow = forwardRef<PopoverArrowElement, PopoverArrowProps>(
550
553
  <PopperPrimitive.Arrow
551
554
  {...popperScope}
552
555
  {...arrowProps}
553
- className={tx('popover.arrow', 'popover__arrow', {}, classNames)}
556
+ className={tx('popover.arrow', {}, classNames)}
554
557
  ref={forwardedRef}
555
558
  />
556
559
  );
@@ -572,15 +575,15 @@ type PopoverViewportProps = ThemedClassName<ComponentPropsWithRef<typeof Primiti
572
575
  const PopoverViewport = forwardRef<HTMLDivElement, PopoverViewportProps>(
573
576
  ({ classNames, asChild, constrainInline = true, constrainBlock = true, children, ...props }, forwardedRef) => {
574
577
  const { tx } = useThemeContext();
575
- const Root = asChild ? Slot : Primitive.div;
578
+ const Comp = asChild ? Slot : Primitive.div;
576
579
  return (
577
- <Root
580
+ <Comp
578
581
  {...props}
579
- className={tx('popover.viewport', 'popover__viewport', { constrainInline, constrainBlock }, classNames)}
582
+ className={tx('popover.viewport', { constrainInline, constrainBlock }, classNames)}
580
583
  ref={forwardedRef}
581
584
  >
582
585
  {children}
583
- </Root>
586
+ </Comp>
584
587
  );
585
588
  },
586
589
  );
@@ -1,101 +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/ui-theme';
8
+ import { mx } from '@dxos/ui-theme';
10
9
 
11
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
- };
14
+ faker.seed(123);
35
15
 
36
- const meta = {
37
- title: 'ui/react-ui-core/ScrollArea',
38
- component: ScrollArea as any,
39
- render: DefaultStory,
40
- decorators: [withTheme, withLayout({ layout: 'fullscreen' })],
16
+ export default {
17
+ title: 'ui/react-ui-core/components/ScrollArea',
18
+ component: ScrollArea,
19
+ decorators: [withTheme()],
41
20
  parameters: {
42
- layout: 'fullscreen',
21
+ layout: 'centered',
43
22
  },
44
- } satisfies Meta<typeof DefaultStory>;
23
+ };
45
24
 
46
- export default meta;
25
+ const Column = () => (
26
+ <div>
27
+ {Array.from({ length: 50 }).map((_, index) => (
28
+ <div key={index} className='px-1 text-sm cursor-pointer hover:bg-hover-surface'>
29
+ Item {index + 1}
30
+ </div>
31
+ ))}
32
+ </div>
33
+ );
47
34
 
48
- type Story = StoryObj<typeof meta>;
35
+ const Row = () => (
36
+ <div className='flex gap-2 w-max'>
37
+ {Array.from({ length: 50 }).map((_, index) => (
38
+ <div
39
+ key={index}
40
+ className='shrink-0 h-20 w-20 cursor-pointer border border-separator rounded-md flex items-center justify-center text-sm hover:bg-hover-surface'
41
+ >
42
+ {index + 1}
43
+ </div>
44
+ ))}
45
+ </div>
46
+ );
49
47
 
50
- export const Default: Story = {
51
- args: {
52
- children: faker.lorem.paragraphs(5),
53
- },
48
+ export const Vertical = {
49
+ render: () => (
50
+ <div className='h-72 w-48 p-2 border border-separator rounded-md'>
51
+ <ScrollArea.Root orientation='vertical' padding>
52
+ <ScrollArea.Viewport>
53
+ <Column />
54
+ </ScrollArea.Viewport>
55
+ </ScrollArea.Root>
56
+ </div>
57
+ ),
54
58
  };
55
59
 
56
- export const NestedScrollAreas: Story = {
57
- render: () => {
58
- const columns = Array.from({ length: 3 }).map((_, index) => ({
59
- id: String(index),
60
- itemCount: 20,
61
- }));
60
+ export const VerticalThin = {
61
+ render: () => (
62
+ <div className='h-72 w-48 p-2 border border-separator rounded-md'>
63
+ <ScrollArea.Root orientation='vertical' padding thin>
64
+ <ScrollArea.Viewport>
65
+ <Column />
66
+ </ScrollArea.Viewport>
67
+ </ScrollArea.Root>
68
+ </div>
69
+ ),
70
+ };
62
71
 
63
- return (
64
- <div className='p-4 bs-full is-full overflow-hidden'>
65
- <div className='flex bs-full is-full overflow-hidden border border-sky-500'>
66
- <ScrollArea.Root>
67
- <ScrollArea.Viewport>
68
- <div className='flex gap-4 p-3 bs-full overflow-hidden'>
69
- {columns.map((column) => (
70
- <div key={column.id} className='flex flex-col gap-1 bs-full overflow-hidden is-[300px]'>
71
- <div className='flex shrink-0 p-2 border border-separator'>Column {column.id}</div>
72
- <ScrollArea.Expander classNames='border border-rose-500'>
73
- <ScrollArea.Root>
74
- <ScrollArea.Viewport>
75
- <div className='flex flex-col p-3 space-y-2'>
76
- {Array.from({ length: column.itemCount }, (_, i) => (
77
- <div key={i} className={`p-3 border border-separator rounded-sm`}>
78
- Item {i + 1}
79
- </div>
80
- ))}
81
- </div>
82
- </ScrollArea.Viewport>
83
- <ScrollArea.Scrollbar orientation='vertical'>
84
- <ScrollArea.Thumb />
85
- </ScrollArea.Scrollbar>
86
- </ScrollArea.Root>
87
- </ScrollArea.Expander>
88
- <div className={`p-2 border border-separator`}>Footer</div>
72
+ export const Horizontal = {
73
+ render: () => (
74
+ <div className='w-96 p-2 border border-separator rounded-md'>
75
+ <ScrollArea.Root orientation='horizontal' padding>
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='w-96 p-2 border border-separator rounded-md'>
87
+ <ScrollArea.Root orientation='horizontal' padding 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='h-96 w-96 p-2 border border-separator rounded-md'>
99
+ <ScrollArea.Root orientation='all' padding>
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 h-20 w-20 flex items-center justify-center text-sm border border-separator font-mono'
108
+ >
109
+ [{colIndex}:{rowIndex}]
89
110
  </div>
90
111
  ))}
91
112
  </div>
92
- </ScrollArea.Viewport>
93
- <ScrollArea.Scrollbar orientation='horizontal'>
94
- <ScrollArea.Thumb />
95
- </ScrollArea.Scrollbar>
96
- </ScrollArea.Root>
97
- </div>
98
- </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 h-full w-[16rem] grid grid-rows-[min-content_1fr_min-content] border border-separator'
140
+ >
141
+ <header className='flex shrink-0 p-2 border-b border-separator'>Column {column.id}</header>
142
+ <ScrollArea.Root thin orientation='vertical'>
143
+ <ScrollArea.Viewport classNames='py-2 px-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-xs`}>
146
+ Item {i + 1}
147
+ </div>
148
+ ))}
149
+ </ScrollArea.Viewport>
150
+ </ScrollArea.Root>
151
+ <footer className={`p-2 text-subdued border-t border-separator`}>{column.count}</footer>
152
+ </section>
153
+ ))}
154
+ </ScrollArea.Viewport>
155
+ </ScrollArea.Root>
99
156
  );
100
157
  },
101
158
  };
159
+
160
+ export const NativeScroll = {
161
+ render: () => (
162
+ <div className='group h-48 w-48 border border-separator'>
163
+ <div
164
+ className={mx(
165
+ 'group h-full w-full overflow-y-scroll',
166
+ '[&::-webkit-scrollbar]:w-3',
167
+ '[&::-webkit-scrollbar-thumb]:rounded-none',
168
+ '[&::-webkit-scrollbar-track]:bg-scrollbar-track',
169
+ '[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumbSubdued',
170
+ 'group-hover:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb',
171
+ )}
172
+ >
173
+ <Column />
174
+ </div>
175
+ </div>
176
+ ),
177
+ };