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

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 (293) hide show
  1. package/dist/lib/browser/{chunk-CEKVHJ27.mjs → chunk-EJSGYGYH.mjs} +117 -117
  2. package/dist/lib/browser/chunk-EJSGYGYH.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +2747 -1997
  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-B7MXDDMJ.mjs} +117 -117
  9. package/dist/lib/node-esm/chunk-B7MXDDMJ.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +2747 -1997
  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 +2 -2
  19. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  20. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  21. package/dist/types/src/components/Button/Toggle.d.ts +2 -2
  22. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -1
  23. package/dist/types/src/components/Button/ToggleGroup.d.ts +6 -6
  24. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -1
  25. package/dist/types/src/components/Card/Card.d.ts +107 -0
  26. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  27. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  28. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  29. package/dist/types/src/components/Card/index.d.ts +2 -0
  30. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  31. package/dist/types/src/components/Clipboard/index.d.ts +10 -1
  32. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  33. package/dist/types/src/components/Dialog/AlertDialog.d.ts +26 -17
  34. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  35. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  36. package/dist/types/src/components/Dialog/Dialog.d.ts +25 -18
  37. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  38. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +3 -6
  39. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  40. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  41. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  42. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  43. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  44. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +8 -0
  45. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  46. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  47. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  48. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  49. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  50. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  51. package/dist/types/src/components/Image/Image.d.ts +14 -0
  52. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  53. package/dist/types/src/components/Image/Image.stories.d.ts +33 -0
  54. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  55. package/dist/types/src/components/Image/index.d.ts +2 -0
  56. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  57. package/dist/types/src/components/Input/Input.d.ts +4 -7
  58. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  59. package/dist/types/src/components/Input/Input.stories.d.ts +7 -7
  60. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  61. package/dist/types/src/components/List/List.d.ts.map +1 -1
  62. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  63. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  64. package/dist/types/src/components/Main/Main.d.ts +6 -32
  65. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  66. package/dist/types/src/components/Main/Main.stories.d.ts +1 -5
  67. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  68. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -1
  69. package/dist/types/src/components/Menu/DropdownMenu.d.ts +51 -49
  70. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
  71. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +6 -1
  72. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
  73. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  74. package/dist/types/src/components/Message/Message.stories.d.ts +2 -3
  75. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  76. package/dist/types/src/components/Popover/Popover.d.ts +28 -22
  77. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  78. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +21 -26
  79. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  80. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +41 -9
  81. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  82. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  83. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +6 -1
  84. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  85. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  86. package/dist/types/src/components/Separator/Separator.d.ts +3 -3
  87. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  88. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  89. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  90. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  91. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  92. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  93. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  94. package/dist/types/src/components/Splitter/Splitter.d.ts +32 -0
  95. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  96. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  97. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  98. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  99. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  100. package/dist/types/src/components/Status/Status.stories.d.ts +4 -2
  101. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  102. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  103. package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
  104. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  105. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +1 -0
  106. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  107. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts +12 -0
  108. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  109. package/dist/types/src/components/Toast/Toast.d.ts +15 -15
  110. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  111. package/dist/types/src/components/Toolbar/Toolbar.d.ts +33 -11
  112. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  113. package/dist/types/src/components/Tooltip/Tooltip.d.ts +9 -9
  114. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  115. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  116. package/dist/types/src/components/index.d.ts +8 -4
  117. package/dist/types/src/components/index.d.ts.map +1 -1
  118. package/dist/types/src/exemplars/generics.stories.d.ts +18 -0
  119. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  120. package/dist/types/src/exemplars/slot.stories.d.ts +14 -0
  121. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  122. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  123. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  124. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  125. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  126. package/dist/types/src/hooks/index.d.ts +1 -0
  127. package/dist/types/src/hooks/index.d.ts.map +1 -1
  128. package/dist/types/src/index.d.ts +1 -0
  129. package/dist/types/src/index.d.ts.map +1 -1
  130. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  131. package/dist/types/src/primitives/Column/Column.d.ts +26 -0
  132. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  133. package/dist/types/src/primitives/Column/Column.stories.d.ts +6 -0
  134. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  135. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  136. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  137. package/dist/types/src/primitives/Container/Container.d.ts +8 -0
  138. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  139. package/dist/types/src/primitives/Container/Container.stories.d.ts +6 -0
  140. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  141. package/dist/types/src/primitives/Container/index.d.ts +2 -0
  142. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  143. package/dist/types/src/primitives/Flex/Flex.d.ts +13 -0
  144. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  145. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  146. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  147. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  148. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  149. package/dist/types/src/primitives/Grid/Grid.d.ts +15 -0
  150. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  151. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  152. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  153. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  154. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  155. package/dist/types/src/primitives/Panel/Panel.d.ts +26 -0
  156. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  157. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  158. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  159. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  160. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  161. package/dist/types/src/primitives/index.d.ts +6 -0
  162. package/dist/types/src/primitives/index.d.ts.map +1 -0
  163. package/dist/types/src/testing/Loading.d.ts +9 -0
  164. package/dist/types/src/testing/Loading.d.ts.map +1 -0
  165. package/dist/types/src/testing/decorators/withLayout.d.ts +1 -1
  166. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  167. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  168. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  169. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  170. package/dist/types/src/testing/index.d.ts +1 -0
  171. package/dist/types/src/testing/index.d.ts.map +1 -1
  172. package/dist/types/src/translations.d.ts +11 -0
  173. package/dist/types/src/translations.d.ts.map +1 -0
  174. package/dist/types/tsconfig.tsbuildinfo +1 -1
  175. package/package.json +25 -21
  176. package/src/components/Avatars/Avatar.stories.tsx +5 -6
  177. package/src/components/Avatars/Avatar.tsx +5 -12
  178. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -2
  179. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +3 -3
  180. package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
  181. package/src/components/Button/Button.stories.tsx +3 -3
  182. package/src/components/Button/Button.tsx +8 -14
  183. package/src/components/Button/IconButton.stories.tsx +4 -4
  184. package/src/components/Button/IconButton.tsx +2 -3
  185. package/src/components/Button/Toggle.stories.tsx +2 -2
  186. package/src/components/Button/Toggle.tsx +4 -4
  187. package/src/components/Button/ToggleGroup.stories.tsx +2 -2
  188. package/src/components/Button/ToggleGroup.tsx +12 -16
  189. package/src/components/Card/Card.stories.tsx +151 -0
  190. package/src/components/Card/Card.tsx +390 -0
  191. package/src/components/Card/index.ts +5 -0
  192. package/src/components/Clipboard/CopyButton.tsx +3 -3
  193. package/src/components/Dialog/AlertDialog.stories.tsx +15 -15
  194. package/src/components/Dialog/AlertDialog.tsx +137 -54
  195. package/src/components/Dialog/Dialog.stories.tsx +40 -15
  196. package/src/components/Dialog/Dialog.tsx +94 -78
  197. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +50 -0
  198. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  199. package/src/components/ErrorFallback/ErrorStack.tsx +80 -0
  200. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  201. package/src/components/ErrorFallback/index.ts +9 -0
  202. package/src/components/Icon/Icon.stories.tsx +2 -2
  203. package/src/components/Icon/Icon.tsx +3 -2
  204. package/src/components/Image/Image.stories.tsx +86 -0
  205. package/src/components/Image/Image.tsx +223 -0
  206. package/src/components/Image/index.ts +5 -0
  207. package/src/components/Input/Input.stories.tsx +20 -39
  208. package/src/components/Input/Input.tsx +24 -69
  209. package/src/components/Link/Link.stories.tsx +2 -2
  210. package/src/components/Link/Link.tsx +2 -2
  211. package/src/components/List/List.stories.tsx +15 -22
  212. package/src/components/List/List.tsx +11 -16
  213. package/src/components/List/ListDropIndicator.tsx +7 -7
  214. package/src/components/List/Tree.stories.tsx +4 -4
  215. package/src/components/List/TreeDropIndicator.tsx +6 -6
  216. package/src/components/List/Treegrid.stories.tsx +3 -3
  217. package/src/components/List/Treegrid.tsx +10 -15
  218. package/src/components/Main/Main.stories.tsx +6 -95
  219. package/src/components/Main/Main.tsx +61 -211
  220. package/src/components/Menu/ContextMenu.stories.tsx +2 -2
  221. package/src/components/Menu/ContextMenu.tsx +9 -33
  222. package/src/components/Menu/DropdownMenu.stories.tsx +2 -2
  223. package/src/components/Menu/DropdownMenu.tsx +56 -50
  224. package/src/components/Message/Message.stories.tsx +25 -10
  225. package/src/components/Message/Message.tsx +17 -29
  226. package/src/components/Popover/Popover.stories.tsx +4 -4
  227. package/src/components/Popover/Popover.tsx +61 -58
  228. package/src/components/ScrollArea/ScrollArea.stories.tsx +152 -76
  229. package/src/components/ScrollArea/ScrollArea.tsx +72 -116
  230. package/src/components/ScrollArea/index.ts +1 -1
  231. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +41 -22
  232. package/src/components/ScrollContainer/ScrollContainer.tsx +18 -13
  233. package/src/components/Select/Select.stories.tsx +2 -2
  234. package/src/components/Select/Select.tsx +11 -27
  235. package/src/components/Separator/Separator.tsx +5 -8
  236. package/src/components/Skeleton/Skeleton.stories.tsx +52 -0
  237. package/src/components/Skeleton/Skeleton.tsx +26 -0
  238. package/src/components/Skeleton/index.ts +5 -0
  239. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  240. package/src/components/Splitter/Splitter.tsx +126 -0
  241. package/src/components/Splitter/index.ts +5 -0
  242. package/src/components/Status/Status.stories.tsx +21 -17
  243. package/src/components/Status/Status.tsx +2 -2
  244. package/src/components/Tag/Tag.stories.tsx +4 -9
  245. package/src/components/Tag/Tag.tsx +2 -7
  246. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +32 -0
  247. package/src/components/ThemeProvider/ThemeProvider.tsx +4 -3
  248. package/src/components/Toast/Toast.stories.tsx +2 -2
  249. package/src/components/Toast/Toast.tsx +22 -41
  250. package/src/components/Toolbar/Toolbar.stories.tsx +2 -2
  251. package/src/components/Toolbar/Toolbar.tsx +166 -21
  252. package/src/components/Tooltip/Tooltip.stories.tsx +15 -13
  253. package/src/components/Tooltip/Tooltip.tsx +18 -18
  254. package/src/components/index.ts +9 -5
  255. package/src/exemplars/generics.stories.tsx +49 -0
  256. package/src/exemplars/slot.stories.tsx +107 -0
  257. package/src/exemplars/tabster.stories.tsx +127 -0
  258. package/src/exemplars/virtualizer.stories.tsx +137 -0
  259. package/src/hooks/index.ts +1 -0
  260. package/src/index.ts +1 -0
  261. package/src/playground/Controls.stories.tsx +3 -10
  262. package/src/playground/Custom.stories.tsx +11 -11
  263. package/src/playground/Typography.stories.tsx +3 -3
  264. package/src/primitives/Column/Column.stories.tsx +78 -0
  265. package/src/primitives/Column/Column.tsx +133 -0
  266. package/src/primitives/Column/index.ts +5 -0
  267. package/src/primitives/Container/Container.stories.tsx +30 -0
  268. package/src/primitives/Container/Container.tsx +22 -0
  269. package/src/primitives/Container/index.ts +5 -0
  270. package/src/primitives/Flex/Flex.stories.tsx +58 -0
  271. package/src/primitives/Flex/Flex.tsx +29 -0
  272. package/src/primitives/Flex/index.ts +5 -0
  273. package/src/primitives/Grid/Grid.stories.tsx +57 -0
  274. package/src/primitives/Grid/Grid.tsx +35 -0
  275. package/src/primitives/Grid/index.ts +5 -0
  276. package/src/primitives/Panel/Panel.stories.tsx +67 -0
  277. package/src/primitives/Panel/Panel.tsx +119 -0
  278. package/src/primitives/Panel/index.ts +5 -0
  279. package/src/primitives/index.ts +9 -0
  280. package/src/testing/Loading.tsx +26 -0
  281. package/src/testing/decorators/withLayout.tsx +21 -7
  282. package/src/testing/decorators/withLayoutVariants.tsx +18 -21
  283. package/src/testing/decorators/withTheme.tsx +19 -17
  284. package/src/testing/index.ts +2 -0
  285. package/src/translations.ts +19 -0
  286. package/dist/lib/browser/chunk-CEKVHJ27.mjs.map +0 -7
  287. package/dist/lib/node-esm/chunk-2NHEX4AD.mjs.map +0 -7
  288. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  289. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  290. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  291. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  292. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
  293. package/src/components/AnchoredOverflow/index.ts +0 -5
@@ -0,0 +1,151 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useRef } from 'react';
7
+
8
+ import { faker } from '@dxos/random';
9
+ import { Icon } from '@dxos/react-ui';
10
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
11
+
12
+ import { Card } from './Card';
13
+
14
+ faker.seed(0);
15
+
16
+ type StoryProps = {
17
+ title: string;
18
+ description?: string;
19
+ image?: string;
20
+ fullWidth?: boolean;
21
+ };
22
+
23
+ const DefaultStory = ({ title, description, image, fullWidth }: StoryProps) => {
24
+ const handleRef = useRef<HTMLButtonElement>(null);
25
+ console.log(title);
26
+ return (
27
+ <Card.Root fullWidth={fullWidth}>
28
+ <Card.Toolbar>
29
+ <Card.DragHandle ref={handleRef} />
30
+ <Card.Title>{title}</Card.Title>
31
+ <Card.CloseIconButton onClick={() => console.log('close')} />
32
+ </Card.Toolbar>
33
+ <Card.Content>
34
+ <Card.Poster alt='Card.Poster' image={image} />
35
+ <Card.Row icon='ph--dot-outline--regular'>
36
+ <Card.Heading>Card.Heading</Card.Heading>
37
+ </Card.Row>
38
+ <Card.Row icon='ph--dot-outline--regular'>
39
+ <Card.Text>Card.Text (default)</Card.Text>
40
+ </Card.Row>
41
+ <Card.Row icon='ph--dot-outline--regular'>
42
+ <Card.Text variant='description'>
43
+ Card.Text (description)
44
+ <br />
45
+ {description}
46
+ </Card.Text>
47
+ </Card.Row>
48
+ <Card.Row icon='ph--dot-outline--regular'>
49
+ <Card.Heading variant='subtitle'>Card.Heading (subtitle)</Card.Heading>
50
+ </Card.Row>
51
+ <Card.Action label='Card.Action' onClick={() => console.log('action')} />
52
+ <Card.Link label='Card.Link' href='https://dxos.org' />
53
+ </Card.Content>
54
+ </Card.Root>
55
+ );
56
+ };
57
+
58
+ const meta = {
59
+ title: 'ui/react-ui-core/components/Card',
60
+ render: DefaultStory,
61
+ decorators: [withTheme(), withLayout({ layout: 'centered', classNames: 'grid w-[30rem] place-items-center' })],
62
+ } satisfies Meta<typeof DefaultStory>;
63
+
64
+ export default meta;
65
+
66
+ type Story = StoryObj<typeof meta>;
67
+
68
+ const image = faker.image.url();
69
+
70
+ export const Default: Story = {
71
+ args: {
72
+ title: faker.commerce.productName(),
73
+ description: faker.lorem.paragraph(3),
74
+ image,
75
+ },
76
+ };
77
+
78
+ export const FullWidth: Story = {
79
+ args: {
80
+ title: faker.commerce.productName(),
81
+ description: faker.lorem.paragraph(3),
82
+ image,
83
+ fullWidth: true,
84
+ },
85
+ };
86
+
87
+ export const Simple: Story = {
88
+ args: {
89
+ title: faker.commerce.productName(),
90
+ },
91
+ render: ({ title }) => {
92
+ const handleRef = useRef<HTMLButtonElement>(null);
93
+ return (
94
+ <Card.Root>
95
+ <Card.Toolbar>
96
+ <Card.DragHandle ref={handleRef} />
97
+ <Card.Title>{title}</Card.Title>
98
+ <Card.CloseIconButton onClick={() => console.log('close')} />
99
+ </Card.Toolbar>
100
+ </Card.Root>
101
+ );
102
+ },
103
+ };
104
+
105
+ export const Description: Story = {
106
+ args: {
107
+ title: faker.commerce.productName(),
108
+ description: faker.lorem.paragraph(3),
109
+ },
110
+ render: ({ title, description }) => {
111
+ const handleRef = useRef<HTMLButtonElement>(null);
112
+ return (
113
+ <Card.Root>
114
+ <Card.Toolbar>
115
+ <Card.DragHandle ref={handleRef} />
116
+ <Card.Title>{title}</Card.Title>
117
+ <Card.CloseIconButton onClick={() => console.log('close')} />
118
+ </Card.Toolbar>
119
+ <Card.Content>
120
+ <Card.Row>
121
+ <Card.Text variant='description'>{description}</Card.Text>
122
+ </Card.Row>
123
+ </Card.Content>
124
+ </Card.Root>
125
+ );
126
+ },
127
+ };
128
+
129
+ export const Mock = () => (
130
+ <div className='grid grid-cols-[2rem_1fr_2rem] w-full dx-card-min-width dx-card-max-width border border-separator rounded-xs'>
131
+ <div className='grid grid-cols-subgrid col-span-full'>
132
+ <div role='none' className='grid h-[var(--dx-rail-item)] w-[var(--dx-rail-item)] place-items-center'>
133
+ <Icon icon='ph--dots-six-vertical--regular' />
134
+ </div>
135
+ <div className='p-1 whitespace-normal break-words text-description items-center'>
136
+ This line is very very long and it should wrap.
137
+ </div>
138
+ <div role='none' className='grid h-[var(--dx-rail-item)] w-[var(--dx-rail-item)] place-items-center'>
139
+ <Icon icon='ph--x--regular' />
140
+ </div>
141
+ </div>
142
+ <div className='grid grid-cols-subgrid col-span-3'>
143
+ <div role='none' className='grid h-[var(--dx-rail-item)] w-[var(--dx-rail-item)] place-items-center'>
144
+ <Icon icon='ph--dots-six-vertical--regular' />
145
+ </div>
146
+ <div className='p-1 text-description items-center col-span-2'>
147
+ This line is very very long and it should wrap.
148
+ </div>
149
+ </div>
150
+ </div>
151
+ );
@@ -0,0 +1,390 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Primitive } from '@radix-ui/react-primitive';
6
+ import { Slot } from '@radix-ui/react-slot';
7
+ import React, {
8
+ CSSProperties,
9
+ type HTMLAttributes,
10
+ type PropsWithChildren,
11
+ createContext,
12
+ forwardRef,
13
+ useContext,
14
+ } from 'react';
15
+
16
+ import { composableProps, largeIconSize, mx } from '@dxos/ui-theme';
17
+ import { type Density, type SlottableProps } from '@dxos/ui-types';
18
+
19
+ import { useThemeContext } from '../../hooks';
20
+ import { Column } from '../../primitives';
21
+ import { type ThemedClassName } from '../../util';
22
+ import { Button } from '../Button';
23
+ import { Icon, type IconProps } from '../Icon';
24
+ import { Image } from '../Image';
25
+ import {
26
+ Toolbar,
27
+ ToolbarCloseIconButtonProps,
28
+ ToolbarDragHandleProps,
29
+ type ToolbarMenuItem,
30
+ type ToolbarMenuProps,
31
+ type ToolbarRootProps,
32
+ } from '../Toolbar';
33
+
34
+ //
35
+ // Context
36
+ //
37
+
38
+ type CardContextValue = {
39
+ menuItems?: CardMenuItem<any>[];
40
+ };
41
+
42
+ /** @deprecated Use context for menus. */
43
+ const CardContext = createContext<CardContextValue>({});
44
+
45
+ //
46
+ // Root
47
+ //
48
+
49
+ type CardRootProps = SlottableProps<
50
+ HTMLDivElement,
51
+ {
52
+ id?: string;
53
+ border?: boolean;
54
+ fullWidth?: boolean;
55
+ density?: Density;
56
+ }
57
+ >;
58
+
59
+ const CardRoot = forwardRef<HTMLDivElement, CardRootProps>(
60
+ ({ children, id, asChild, role, border = true, fullWidth, density, ...props }, forwardedRef) => {
61
+ const { className, ...rest } = composableProps(props);
62
+ const Comp = asChild ? Slot : Primitive.div;
63
+ const { tx } = useThemeContext();
64
+
65
+ return (
66
+ <Comp
67
+ {...rest}
68
+ {...(id && { 'data-object-id': id })}
69
+ role={role ?? 'group'}
70
+ className={tx('card.root', { border, fullWidth }, className)}
71
+ ref={forwardedRef}
72
+ >
73
+ <Column.Root gutter={density === 'coarse' ? 'lg' : 'md'}>{children}</Column.Root>
74
+ </Comp>
75
+ );
76
+ },
77
+ );
78
+
79
+ //
80
+ // Toolbar
81
+ //
82
+
83
+ type CardToolbarProps = ToolbarRootProps;
84
+
85
+ const CardToolbar = forwardRef<HTMLDivElement, CardToolbarProps>(({ children, classNames, ...props }, forwardedRef) => {
86
+ const { tx } = useThemeContext();
87
+
88
+ return (
89
+ <Toolbar.Root {...props} style={largeIconSize} classNames={[tx('card.toolbar', {}), classNames]} ref={forwardedRef}>
90
+ {children}
91
+ </Toolbar.Root>
92
+ );
93
+ });
94
+
95
+ //
96
+ // DragHandle
97
+ //
98
+
99
+ type CardDragHandleProps = ToolbarDragHandleProps;
100
+
101
+ const CardDragHandle = forwardRef<HTMLButtonElement, CardDragHandleProps>((props, forwardedRef) => {
102
+ return (
103
+ <CardIconBlock>
104
+ <Toolbar.DragHandle {...props} testId='card-drag-handle' ref={forwardedRef} />
105
+ </CardIconBlock>
106
+ );
107
+ });
108
+
109
+ //
110
+ // CloseIconButton
111
+ //
112
+
113
+ type CloseIconButtonProps = ToolbarCloseIconButtonProps;
114
+
115
+ const CloseIconButton = forwardRef<HTMLButtonElement, CloseIconButtonProps>((props, forwardedRef) => {
116
+ return (
117
+ <CardIconBlock>
118
+ <Toolbar.CloseIconButton {...props} ref={forwardedRef} />
119
+ </CardIconBlock>
120
+ );
121
+ });
122
+
123
+ //
124
+ // Menu
125
+ //
126
+
127
+ type CardMenuItem<T extends any | void = void> = ToolbarMenuItem<T>;
128
+
129
+ type CardMenuProps<T extends any | void = void> = ToolbarMenuProps<T>;
130
+
131
+ const CardMenu = <T extends any | void = void>({ context, items, ...props }: CardMenuProps<T>) => {
132
+ const { menuItems } = useContext(CardContext) ?? {};
133
+ const combinedItems = [...(items ?? []), ...((menuItems as CardMenuItem<T>[]) ?? [])];
134
+
135
+ return (
136
+ <CardIconBlock>
137
+ <Toolbar.Menu {...props} context={context} items={combinedItems} />
138
+ </CardIconBlock>
139
+ );
140
+ };
141
+
142
+ //
143
+ // Icon
144
+ //
145
+
146
+ const CardIcon = (props: IconProps) => {
147
+ return (
148
+ <CardIconBlock>
149
+ <Icon {...props} />
150
+ </CardIconBlock>
151
+ );
152
+ };
153
+
154
+ //
155
+ // IconBlock
156
+ //
157
+
158
+ const CardIconBlock = forwardRef<HTMLDivElement, ThemedClassName<PropsWithChildren>>(
159
+ ({ classNames, children, ...props }, forwardedRef) => {
160
+ const { tx } = useThemeContext();
161
+ return (
162
+ <div {...props} role='none' className={tx('card.icon-block', {}, classNames)} ref={forwardedRef}>
163
+ {children}
164
+ </div>
165
+ );
166
+ },
167
+ );
168
+
169
+ //
170
+ // Title
171
+ //
172
+
173
+ type CardTitleProps = SlottableProps<HTMLDivElement>;
174
+
175
+ const CardTitle = forwardRef<HTMLDivElement, CardTitleProps>(({ children, asChild, role, ...props }, forwardedRef) => {
176
+ const { className, ...rest } = composableProps(props);
177
+ const Comp = asChild ? Slot : Primitive.div;
178
+ const { tx } = useThemeContext();
179
+
180
+ return (
181
+ <Comp {...rest} role={role ?? 'heading'} className={tx('card.title', {}, className)} ref={forwardedRef}>
182
+ {children}
183
+ </Comp>
184
+ );
185
+ });
186
+
187
+ //
188
+ // Content
189
+ //
190
+
191
+ type CardContentProps = SlottableProps<HTMLDivElement>;
192
+
193
+ const CardContent = forwardRef<HTMLDivElement, CardContentProps>(({ children, role, ...props }, forwardedRef) => {
194
+ const { tx } = useThemeContext();
195
+
196
+ return (
197
+ <div {...props} role={role ?? 'none'} className={tx('card.content', {})} ref={forwardedRef}>
198
+ {children}
199
+ </div>
200
+ );
201
+ });
202
+
203
+ //
204
+ // Row
205
+ //
206
+
207
+ type CardRowProps = SlottableProps<HTMLDivElement, { icon?: string }>;
208
+
209
+ const CardRow = forwardRef<HTMLDivElement, CardRowProps>(({ children, role, icon, ...props }, forwardedRef) => {
210
+ const { className, ...rest } = composableProps(props);
211
+ return (
212
+ <Column.Row {...rest} role={role ?? 'none'} classNames={className} ref={forwardedRef}>
213
+ {(icon && <CardIcon classNames='text-subdued' icon={icon} />) || <div />}
214
+ {children}
215
+ <div />
216
+ </Column.Row>
217
+ );
218
+ });
219
+
220
+ //
221
+ // Section
222
+ //
223
+
224
+ type CardSectionProps = SlottableProps<HTMLDivElement>;
225
+
226
+ const CardSection = forwardRef<HTMLDivElement, CardSectionProps>(
227
+ ({ children, asChild, role, ...props }, forwardedRef) => {
228
+ const { className, ...rest } = composableProps(props);
229
+ const Comp = asChild ? Slot : Primitive.div;
230
+
231
+ return (
232
+ <Comp {...rest} role={role ?? 'none'} className={mx('col-span-full', className)} ref={forwardedRef}>
233
+ {children}
234
+ </Comp>
235
+ );
236
+ },
237
+ );
238
+
239
+ //
240
+ // Heading
241
+ //
242
+
243
+ type CardHeadingProps = SlottableProps<HTMLDivElement, { variant?: 'default' | 'subtitle' }>;
244
+
245
+ /**
246
+ * @deprecated Use typography.
247
+ */
248
+ const CardHeading = forwardRef<HTMLDivElement, CardHeadingProps>(
249
+ ({ children, asChild, role, variant = 'default', ...props }, forwardedRef) => {
250
+ const { className, ...rest } = composableProps(props);
251
+ const Comp = asChild ? Slot : Primitive.div;
252
+ const { tx } = useThemeContext();
253
+
254
+ return (
255
+ <Comp
256
+ {...rest}
257
+ role={role ?? 'heading'}
258
+ className={tx('card.heading', { variant }, className)}
259
+ ref={forwardedRef}
260
+ >
261
+ {children}
262
+ </Comp>
263
+ );
264
+ },
265
+ );
266
+
267
+ //
268
+ // Text
269
+ //
270
+
271
+ type CardTextProps = SlottableProps<HTMLDivElement, { truncate?: boolean; variant?: 'default' | 'description' }>;
272
+
273
+ const CardText = forwardRef<HTMLDivElement, CardTextProps>(
274
+ ({ children, asChild, role, truncate, variant = 'default', ...props }, forwardedRef) => {
275
+ const { className, ...rest } = composableProps(props);
276
+ const Comp = asChild ? Slot : Primitive.div;
277
+ const { tx } = useThemeContext();
278
+
279
+ return (
280
+ <Comp {...rest} role={role ?? 'none'} className={tx('card.text', { variant }, className)} ref={forwardedRef}>
281
+ <span className={tx('card.text-span', { variant, truncate })}>{children}</span>
282
+ </Comp>
283
+ );
284
+ },
285
+ );
286
+
287
+ //
288
+ // Poster
289
+ //
290
+
291
+ type CardPosterProps = ThemedClassName<
292
+ {
293
+ alt: string;
294
+ aspect?: 'video' | 'auto';
295
+ } & Partial<{ image: string; icon: string }>
296
+ >;
297
+
298
+ const CardPoster = (props: CardPosterProps) => {
299
+ const { tx } = useThemeContext();
300
+ const aspect = props.aspect === 'auto' ? 'aspect-auto' : 'aspect-video';
301
+ if (props.image) {
302
+ return (
303
+ <div role='none' className='col-span-full mb-1'>
304
+ <Image classNames={[tx('card.poster', {}), aspect, props.classNames]} src={props.image} alt={props.alt} />
305
+ </div>
306
+ );
307
+ }
308
+
309
+ if (props.icon) {
310
+ return (
311
+ <div role='image' className={tx('card.poster-icon', {}, [aspect, props.classNames])} aria-label={props.alt}>
312
+ <Icon icon={props.icon} size={10} />
313
+ </div>
314
+ );
315
+ }
316
+ };
317
+
318
+ //
319
+ // Action
320
+ //
321
+
322
+ type CardActionProps = { icon?: string; label: string; actionIcon?: string; onClick?: () => void };
323
+
324
+ const CardAction = ({ icon, actionIcon = 'ph--arrow-right--regular', label, onClick }: CardActionProps) => {
325
+ const { tx } = useThemeContext();
326
+ return (
327
+ <Button variant='ghost' classNames={tx('card.action', {})} onClick={onClick}>
328
+ {icon ? <CardIcon classNames='text-subdued' icon={icon} /> : <div />}
329
+ <span className={tx('card.action-label', {}, !actionIcon ? 'col-span-2' : undefined)}>{label}</span>
330
+ {actionIcon && <CardIcon icon={actionIcon} />}
331
+ </Button>
332
+ );
333
+ };
334
+
335
+ //
336
+ // Link
337
+ //
338
+
339
+ type CardLinkProps = { label: string; href: string };
340
+
341
+ const CardLink = ({ label, href }: CardLinkProps) => {
342
+ const { tx } = useThemeContext();
343
+ return (
344
+ <a className={tx('card.link', {})} data-variant='ghost' href={href} target='_blank' rel='noreferrer'>
345
+ <CardIcon classNames='text-subdued' icon='ph--link--regular' />
346
+ <span className={tx('card.link-label', {})}>{label}</span>
347
+ <CardIcon classNames='invisible group-hover:visible' icon='ph--arrow-square-out--regular' />
348
+ </a>
349
+ );
350
+ };
351
+
352
+ //
353
+ // Card
354
+ //
355
+
356
+ export const Card = {
357
+ Root: CardRoot,
358
+
359
+ // Toolbar
360
+ Toolbar: CardToolbar,
361
+ ToolbarIconButton: Toolbar.IconButton,
362
+ ToolbarSeparator: Toolbar.Separator,
363
+
364
+ // Toolbar blocks
365
+ IconBlock: CardIconBlock,
366
+ DragHandle: CardDragHandle,
367
+ CloseIconButton: CloseIconButton,
368
+ Menu: CardMenu,
369
+ Icon: CardIcon,
370
+ Title: CardTitle,
371
+
372
+ // Content
373
+ Content: CardContent,
374
+ Row: CardRow,
375
+ Section: CardSection,
376
+ Heading: CardHeading,
377
+ Text: CardText,
378
+ Poster: CardPoster,
379
+ Action: CardAction,
380
+ Link: CardLink,
381
+ };
382
+
383
+ export type {
384
+ CardContextValue,
385
+ CardRootProps,
386
+ CardToolbarProps,
387
+ CardDragHandleProps,
388
+ CloseIconButtonProps,
389
+ CardMenuProps,
390
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ export * from './Card';
@@ -18,7 +18,7 @@ export type CopyButtonProps = ButtonProps &
18
18
  value: string;
19
19
  };
20
20
 
21
- const inactiveLabelStyles = 'invisible bs-px -mbe-px overflow-hidden';
21
+ const inactiveLabelStyles = 'invisible h-px -mb-px overflow-hidden';
22
22
 
23
23
  export const CopyButton = ({ classNames, value, size = 5, ...props }: CopyButtonProps) => {
24
24
  const { t } = useTranslation(osTranslations);
@@ -32,11 +32,11 @@ export const CopyButton = ({ classNames, value, size = 5, ...props }: CopyButton
32
32
  data-testid='copy-invitation'
33
33
  >
34
34
  <div role='none' className={mx('flex gap-1 items-center', isCopied && inactiveLabelStyles)}>
35
- <span className='pli-1'>{t('copy label')}</span>
35
+ <span className='px-1'>{t('copy label')}</span>
36
36
  <Icon icon='ph--copy--regular' size={size} />
37
37
  </div>
38
38
  <div role='none' className={mx('flex gap-1 items-center', !isCopied && inactiveLabelStyles)}>
39
- <span className='pli-1'>{t('copy success label')}</span>
39
+ <span className='px-1'>{t('copy success label')}</span>
40
40
  <Icon icon='ph--check--regular' size={size} />
41
41
  </div>
42
42
  </Button>
@@ -5,22 +5,22 @@
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';
9
+
8
10
  import { withTheme } from '../../testing';
9
11
  import { Button } from '../Button';
10
- import { Toolbar } from '../Toolbar';
11
12
 
12
13
  import { AlertDialog } from './AlertDialog';
13
14
 
14
15
  type StoryProps = Partial<{
15
16
  title: string;
16
17
  description: string;
17
- body: string;
18
18
  openTrigger: string;
19
19
  cancelTrigger: string;
20
20
  actionTrigger: string;
21
21
  }>;
22
22
 
23
- const DefaultStory = ({ title, description, body, openTrigger, cancelTrigger, actionTrigger }: StoryProps) => {
23
+ const DefaultStory = ({ title, description, openTrigger, cancelTrigger, actionTrigger }: StoryProps) => {
24
24
  return (
25
25
  <AlertDialog.Root defaultOpen>
26
26
  <AlertDialog.Trigger asChild>
@@ -28,18 +28,19 @@ const DefaultStory = ({ title, description, body, openTrigger, cancelTrigger, ac
28
28
  </AlertDialog.Trigger>
29
29
  <AlertDialog.Overlay>
30
30
  <AlertDialog.Content>
31
- <AlertDialog.Title>{title}</AlertDialog.Title>
32
- <AlertDialog.Description>{description}</AlertDialog.Description>
33
- <p className='mbs-2 mbe-8'>{body}</p>
34
- <Toolbar.Root>
31
+ <AlertDialog.Body>
32
+ <AlertDialog.Title>{title}</AlertDialog.Title>
33
+ <AlertDialog.Description>{description}</AlertDialog.Description>
34
+ </AlertDialog.Body>
35
+ <AlertDialog.ActionBar>
35
36
  <div className='grow' />
36
37
  <AlertDialog.Cancel asChild>
37
- <Toolbar.Button>{cancelTrigger}</Toolbar.Button>
38
+ <Button>{cancelTrigger}</Button>
38
39
  </AlertDialog.Cancel>
39
40
  <AlertDialog.Action asChild>
40
- <Toolbar.Button variant='primary'>{actionTrigger}</Toolbar.Button>
41
+ <Button variant='primary'>{actionTrigger}</Button>
41
42
  </AlertDialog.Action>
42
- </Toolbar.Root>
43
+ </AlertDialog.ActionBar>
43
44
  </AlertDialog.Content>
44
45
  </AlertDialog.Overlay>
45
46
  </AlertDialog.Root>
@@ -47,10 +48,10 @@ const DefaultStory = ({ title, description, body, openTrigger, cancelTrigger, ac
47
48
  };
48
49
 
49
50
  const meta = {
50
- title: 'ui/react-ui-core/AlertDialog',
51
+ title: 'ui/react-ui-core/components/AlertDialog',
51
52
  component: AlertDialog.Root as any,
52
53
  render: DefaultStory as any,
53
- decorators: [withTheme],
54
+ decorators: [withTheme()],
54
55
  } satisfies Meta<typeof DefaultStory>;
55
56
 
56
57
  export default meta;
@@ -59,10 +60,9 @@ type Story = StoryObj<typeof meta>;
59
60
 
60
61
  export const Default: Story = {
61
62
  args: {
62
- title: 'AlertDialog title',
63
+ title: faker.lorem.sentence(3),
64
+ description: faker.lorem.paragraph(1),
63
65
  openTrigger: 'Open AlertDialog',
64
- description: 'AlertDialog description',
65
- body: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.',
66
66
  cancelTrigger: 'Cancel',
67
67
  actionTrigger: 'Action',
68
68
  },