@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
@@ -0,0 +1,347 @@
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, { type HTMLAttributes, type PropsWithChildren, createContext, forwardRef, useContext } from 'react';
8
+
9
+ import { composableProps, mx } from '@dxos/ui-theme';
10
+ import { type Density, type SlottableProps } from '@dxos/ui-types';
11
+
12
+ import { useThemeContext } from '../../hooks';
13
+ import { Column } from '../../primitives';
14
+ import { type ThemedClassName } from '../../util';
15
+ import { Button } from '../Button';
16
+ import { Icon, type IconProps } from '../Icon';
17
+ import { Image } from '../Image';
18
+ import { Toolbar, type ToolbarMenuItem, type ToolbarMenuProps, type ToolbarRootProps } from '../Toolbar';
19
+
20
+ //
21
+ // Context
22
+ //
23
+
24
+ type CardContextValue = {
25
+ menuItems?: CardMenuItem<any>[];
26
+ };
27
+
28
+ /** @deprecated Use context for menus. */
29
+ const CardContext = createContext<CardContextValue>({});
30
+
31
+ //
32
+ // Root
33
+ //
34
+
35
+ type CardRootProps = SlottableProps<
36
+ HTMLDivElement,
37
+ {
38
+ id?: string;
39
+ border?: boolean;
40
+ fullWidth?: boolean;
41
+ }
42
+ >;
43
+
44
+ const CardRoot = forwardRef<HTMLDivElement, CardRootProps>(
45
+ ({ children, id, asChild, role, border = true, fullWidth, ...props }, forwardedRef) => {
46
+ const { className, ...rest } = composableProps(props);
47
+ const Comp = asChild ? Slot : Primitive.div;
48
+ const { tx } = useThemeContext();
49
+
50
+ return (
51
+ <Comp
52
+ {...rest}
53
+ {...(id && { 'data-object-id': id })}
54
+ role={role ?? 'group'}
55
+ className={tx('card.root', { border, fullWidth }, className)}
56
+ ref={forwardedRef}
57
+ >
58
+ <Column.Root gutter='rail'>{children}</Column.Root>
59
+ </Comp>
60
+ );
61
+ },
62
+ );
63
+
64
+ //
65
+ // Toolbar
66
+ //
67
+
68
+ type CardToolbarProps = ToolbarRootProps & {
69
+ density?: Density;
70
+ };
71
+
72
+ // TODO(burdon): Roncile name with DialogHeader.
73
+ const CardToolbar = forwardRef<HTMLDivElement, CardToolbarProps>(
74
+ ({ children, classNames, density = 'fine', ...props }, forwardedRef) => {
75
+ const { tx } = useThemeContext();
76
+
77
+ return (
78
+ <Toolbar.Root
79
+ {...props}
80
+ classNames={[tx('card.toolbar', { coarse: density !== 'fine' }), classNames]}
81
+ ref={forwardedRef}
82
+ >
83
+ {children}
84
+ </Toolbar.Root>
85
+ );
86
+ },
87
+ );
88
+
89
+ //
90
+ // Menu (delegated to Toolbar.Menu)
91
+ //
92
+
93
+ type CardMenuItem<T extends any | void = void> = ToolbarMenuItem<T>;
94
+ type CardMenuProps<T extends any | void = void> = ToolbarMenuProps<T>;
95
+
96
+ const CardMenu = <T extends any | void = void>({ context, items }: CardMenuProps<T>) => {
97
+ const { menuItems } = useContext(CardContext) ?? {};
98
+ const combinedItems = [...(items ?? []), ...((menuItems as CardMenuItem<T>[]) ?? [])];
99
+
100
+ return <Toolbar.Menu context={context} items={combinedItems} />;
101
+ };
102
+
103
+ //
104
+ // Title
105
+ //
106
+
107
+ type CardTitleProps = SlottableProps<HTMLDivElement>;
108
+
109
+ const CardTitle = forwardRef<HTMLDivElement, CardTitleProps>(({ children, asChild, role, ...props }, forwardedRef) => {
110
+ const { className, ...rest } = composableProps(props);
111
+ const Comp = asChild ? Slot : Primitive.div;
112
+ const { tx } = useThemeContext();
113
+
114
+ return (
115
+ <Comp {...rest} role={role ?? 'heading'} className={tx('card.title', {}, className)} ref={forwardedRef}>
116
+ {children}
117
+ </Comp>
118
+ );
119
+ });
120
+
121
+ //
122
+ // Content
123
+ //
124
+
125
+ type CardContentProps = SlottableProps<HTMLDivElement>;
126
+
127
+ const CardContent = forwardRef<HTMLDivElement, CardContentProps>(({ children, role, ...props }, forwardedRef) => {
128
+ const { tx } = useThemeContext();
129
+
130
+ return (
131
+ <div {...props} role={role ?? 'none'} className={tx('card.content', {})} ref={forwardedRef}>
132
+ {children}
133
+ </div>
134
+ );
135
+ });
136
+
137
+ //
138
+ // Row
139
+ //
140
+
141
+ type CardRowProps = SlottableProps<HTMLDivElement, { icon?: string }>;
142
+
143
+ const CardRow = forwardRef<HTMLDivElement, CardRowProps>(({ children, role, icon, ...props }, forwardedRef) => {
144
+ const { className, ...rest } = composableProps(props);
145
+ return (
146
+ <Column.Row {...rest} role={role ?? 'none'} classNames={className} ref={forwardedRef}>
147
+ {(icon && <CardIcon classNames='text-subdued' icon={icon} />) || <div />}
148
+ {children}
149
+ <div />
150
+ </Column.Row>
151
+ );
152
+ });
153
+
154
+ //
155
+ // Section
156
+ //
157
+
158
+ type CardSectionProps = SlottableProps<HTMLDivElement>;
159
+
160
+ const CardSection = forwardRef<HTMLDivElement, CardSectionProps>(
161
+ ({ children, asChild, role, ...props }, forwardedRef) => {
162
+ const { className, ...rest } = composableProps(props);
163
+ const Comp = asChild ? Slot : Primitive.div;
164
+
165
+ return (
166
+ <Comp {...rest} role={role ?? 'none'} className={mx('col-span-full', className)} ref={forwardedRef}>
167
+ {children}
168
+ </Comp>
169
+ );
170
+ },
171
+ );
172
+
173
+ //
174
+ // Heading
175
+ //
176
+
177
+ type CardHeadingProps = SlottableProps<HTMLDivElement, { variant?: 'default' | 'subtitle' }>;
178
+
179
+ /**
180
+ * @deprecated Use typography.
181
+ */
182
+ const CardHeading = forwardRef<HTMLDivElement, CardHeadingProps>(
183
+ ({ children, asChild, role, variant = 'default', ...props }, forwardedRef) => {
184
+ const { className, ...rest } = composableProps(props);
185
+ const Comp = asChild ? Slot : Primitive.div;
186
+ const { tx } = useThemeContext();
187
+
188
+ return (
189
+ <Comp
190
+ {...rest}
191
+ role={role ?? 'heading'}
192
+ className={tx('card.heading', { variant }, className)}
193
+ ref={forwardedRef}
194
+ >
195
+ {children}
196
+ </Comp>
197
+ );
198
+ },
199
+ );
200
+
201
+ //
202
+ // Text
203
+ //
204
+
205
+ type CardTextProps = SlottableProps<HTMLDivElement, { truncate?: boolean; variant?: 'default' | 'description' }>;
206
+
207
+ const CardText = forwardRef<HTMLDivElement, CardTextProps>(
208
+ ({ children, asChild, role, truncate, variant = 'default', ...props }, forwardedRef) => {
209
+ const { className, ...rest } = composableProps(props);
210
+ const Comp = asChild ? Slot : Primitive.div;
211
+ const { tx } = useThemeContext();
212
+
213
+ return (
214
+ <Comp {...rest} role={role ?? 'none'} className={tx('card.text', { variant }, className)} ref={forwardedRef}>
215
+ <span className={tx('card.text-span', { variant, truncate })}>{children}</span>
216
+ </Comp>
217
+ );
218
+ },
219
+ );
220
+
221
+ //
222
+ // Poster
223
+ //
224
+
225
+ type CardPosterProps = ThemedClassName<
226
+ {
227
+ alt: string;
228
+ aspect?: 'video' | 'auto';
229
+ } & Partial<{ image: string; icon: string }>
230
+ >;
231
+
232
+ const CardPoster = (props: CardPosterProps) => {
233
+ const { tx } = useThemeContext();
234
+ const aspect = props.aspect === 'auto' ? 'aspect-auto' : 'aspect-video';
235
+ if (props.image) {
236
+ return (
237
+ <div role='none' className='col-span-full mb-1'>
238
+ <Image classNames={[tx('card.poster', {}), aspect, props.classNames]} src={props.image} alt={props.alt} />
239
+ </div>
240
+ );
241
+ }
242
+
243
+ if (props.icon) {
244
+ return (
245
+ <div role='image' className={tx('card.poster-icon', {}, [aspect, props.classNames])} aria-label={props.alt}>
246
+ <Icon icon={props.icon} size={10} />
247
+ </div>
248
+ );
249
+ }
250
+ };
251
+
252
+ //
253
+ // Action
254
+ //
255
+
256
+ type CardActionProps = { icon?: string; label: string; actionIcon?: string; onClick?: () => void };
257
+
258
+ const CardAction = ({ icon, actionIcon = 'ph--arrow-right--regular', label, onClick }: CardActionProps) => {
259
+ const { tx } = useThemeContext();
260
+ return (
261
+ <Button variant='ghost' classNames={tx('card.action', {})} onClick={onClick}>
262
+ {icon ? <CardIcon classNames='text-subdued' icon={icon} /> : <div />}
263
+ <span className={tx('card.action-label', {}, !actionIcon ? 'col-span-2' : undefined)}>{label}</span>
264
+ {actionIcon && <CardIcon icon={actionIcon} />}
265
+ </Button>
266
+ );
267
+ };
268
+
269
+ //
270
+ // Link
271
+ //
272
+
273
+ type CardLinkProps = { label: string; href: string };
274
+
275
+ const CardLink = ({ label, href }: CardLinkProps) => {
276
+ const { tx } = useThemeContext();
277
+ return (
278
+ <a className={tx('card.link', {})} data-variant='ghost' href={href} target='_blank' rel='noreferrer'>
279
+ <CardIcon classNames='text-subdued' icon='ph--link--regular' />
280
+ <span className={tx('card.link-label', {})}>{label}</span>
281
+ <CardIcon classNames='invisible group-hover:visible' icon='ph--arrow-square-out--regular' />
282
+ </a>
283
+ );
284
+ };
285
+
286
+ //
287
+ // Icon
288
+ //
289
+
290
+ const CardIcon = ({ toolbar, ...props }: IconProps & { toolbar?: boolean }) => {
291
+ return (
292
+ <CardIconBlock>
293
+ <Icon {...props} size={toolbar ? 5 : 4} />
294
+ </CardIconBlock>
295
+ );
296
+ };
297
+
298
+ //
299
+ // IconBlock
300
+ //
301
+
302
+ const CardIconBlock = ({
303
+ classNames,
304
+ children,
305
+ role,
306
+ ...props
307
+ }: ThemedClassName<PropsWithChildren<HTMLAttributes<HTMLDivElement>>>) => {
308
+ const { tx } = useThemeContext();
309
+ return (
310
+ <div {...props} role={role ?? 'none'} className={tx('card.icon-block', {}, classNames)}>
311
+ {children}
312
+ </div>
313
+ );
314
+ };
315
+
316
+ //
317
+ // Card
318
+ //
319
+
320
+ export const Card = {
321
+ Root: CardRoot,
322
+
323
+ // Toolbar
324
+ Toolbar: CardToolbar,
325
+ ToolbarIconButton: Toolbar.IconButton,
326
+ ToolbarSeparator: Toolbar.Separator,
327
+ DragHandle: forwardRef<HTMLButtonElement, Parameters<typeof Toolbar.DragHandle>[0]>((props, ref) => (
328
+ <Toolbar.DragHandle testId='card-drag-handle' {...props} ref={ref} />
329
+ )),
330
+ CloseIconButton: Toolbar.CloseIconButton,
331
+ Title: CardTitle,
332
+ Menu: CardMenu,
333
+ Icon: CardIcon,
334
+ IconBlock: CardIconBlock,
335
+
336
+ // Content
337
+ Content: CardContent,
338
+ Row: CardRow,
339
+ Section: CardSection,
340
+ Heading: CardHeading,
341
+ Text: CardText,
342
+ Poster: CardPoster,
343
+ Action: CardAction,
344
+ Link: CardLink,
345
+ };
346
+
347
+ export type { CardContextValue, CardRootProps, CardToolbarProps, CardMenuProps };
@@ -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
  },