@dxos/react-ui 0.8.4-main.d05673bc65 → 0.8.4-main.dfabb4ec29

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 (290) hide show
  1. package/dist/lib/browser/{chunk-2FKSMWNY.mjs → chunk-BDBC6H6V.mjs} +79 -5
  2. package/dist/lib/browser/chunk-BDBC6H6V.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +949 -758
  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 +30 -24
  7. package/dist/lib/browser/testing/index.mjs.map +3 -3
  8. package/dist/lib/browser/translations.mjs +18 -0
  9. package/dist/lib/browser/translations.mjs.map +7 -0
  10. package/dist/lib/node-esm/{chunk-ZNBLTSHI.mjs → chunk-3JSJK2ZY.mjs} +79 -5
  11. package/dist/lib/node-esm/chunk-3JSJK2ZY.mjs.map +7 -0
  12. package/dist/lib/node-esm/index.mjs +949 -758
  13. package/dist/lib/node-esm/index.mjs.map +4 -4
  14. package/dist/lib/node-esm/meta.json +1 -1
  15. package/dist/lib/node-esm/testing/index.mjs +30 -24
  16. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  17. package/dist/lib/node-esm/translations.mjs +20 -0
  18. package/dist/lib/node-esm/translations.mjs.map +7 -0
  19. package/dist/types/src/components/Avatars/Avatar.d.ts +1 -1
  20. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  21. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  22. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  23. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  24. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  25. package/dist/types/src/components/Button/Button.d.ts +2 -2
  26. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  27. package/dist/types/src/components/Button/Button.stories.d.ts +1 -1
  28. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -1
  29. package/dist/types/src/components/Button/IconButton.d.ts +1 -0
  30. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  31. package/dist/types/src/components/Button/IconButton.stories.d.ts +3 -0
  32. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
  33. package/dist/types/src/components/Button/Toggle.d.ts +2 -2
  34. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -1
  35. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
  36. package/dist/types/src/components/Button/ToggleGroup.d.ts +6 -6
  37. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -1
  38. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +2 -2
  39. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
  40. package/dist/types/src/components/Card/Card.d.ts +68 -51
  41. package/dist/types/src/components/Card/Card.d.ts.map +1 -1
  42. package/dist/types/src/components/Card/Card.stories.d.ts +2 -2
  43. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -1
  44. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  45. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  46. package/dist/types/src/components/Clipboard/index.d.ts +10 -1
  47. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  48. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  49. package/dist/types/src/components/Dialog/AlertDialog.d.ts +42 -31
  50. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  51. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  52. package/dist/types/src/components/Dialog/Dialog.d.ts +47 -30
  53. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  54. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +3 -2
  55. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  56. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  57. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -1
  58. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -1
  59. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +14 -3
  60. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -1
  61. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -1
  62. package/dist/types/src/components/Focus/Focus.d.ts +36 -0
  63. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -0
  64. package/dist/types/src/components/Focus/Focus.stories.d.ts +9 -0
  65. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -0
  66. package/dist/types/src/components/Focus/index.d.ts +2 -0
  67. package/dist/types/src/components/Focus/index.d.ts.map +1 -0
  68. package/dist/types/src/components/Icon/Icon.d.ts +4 -0
  69. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  70. package/dist/types/src/components/Icon/Icon.stories.d.ts +11 -3
  71. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  72. package/dist/types/src/components/Image/Image.d.ts +2 -1
  73. package/dist/types/src/components/Image/Image.d.ts.map +1 -1
  74. package/dist/types/src/components/Image/Image.stories.d.ts +3 -2
  75. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -1
  76. package/dist/types/src/components/Input/Input.d.ts +14 -17
  77. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  78. package/dist/types/src/components/Input/Input.stories.d.ts +3 -3
  79. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  80. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  81. package/dist/types/src/components/List/List.d.ts +5 -3
  82. package/dist/types/src/components/List/List.d.ts.map +1 -1
  83. package/dist/types/src/components/List/List.stories.d.ts +3 -1
  84. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  85. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -1
  86. package/dist/types/src/components/List/Tree.d.ts +2 -2
  87. package/dist/types/src/components/List/Tree.d.ts.map +1 -1
  88. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -1
  90. package/dist/types/src/components/List/Treegrid.d.ts +5 -9
  91. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  92. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
  93. package/dist/types/src/components/Main/Main.d.ts +7 -3
  94. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  95. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  96. package/dist/types/src/components/Main/useSwipeToDismiss.d.ts.map +1 -1
  97. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -1
  98. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -1
  99. package/dist/types/src/components/Menu/DropdownMenu.d.ts +58 -49
  100. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
  101. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +14 -1
  102. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
  103. package/dist/types/src/components/Message/Message.d.ts +1 -1
  104. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  105. package/dist/types/src/components/Message/Message.stories.d.ts +2 -2
  106. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  107. package/dist/types/src/components/Popover/Popover.d.ts +38 -22
  108. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  109. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  110. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +12 -9
  111. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  112. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +18 -5
  113. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  114. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +42 -13
  115. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  116. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +5 -6
  117. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  118. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  119. package/dist/types/src/components/Select/Select.stories.d.ts +2 -2
  120. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  121. package/dist/types/src/components/Separator/Separator.d.ts +3 -3
  122. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  123. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -1
  124. package/dist/types/src/components/Splitter/Splitter.d.ts +19 -17
  125. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -1
  126. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -1
  127. package/dist/types/src/components/Status/Status.d.ts +3 -4
  128. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  129. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  130. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  131. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +1 -1
  132. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  133. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts +1 -1
  134. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -1
  135. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +54 -55
  136. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  137. package/dist/types/src/components/ThemeProvider/index.d.ts +1 -1
  138. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  139. package/dist/types/src/components/Toast/Toast.d.ts +16 -16
  140. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  141. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  142. package/dist/types/src/components/Toolbar/Toolbar.d.ts +11 -19
  143. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  144. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  145. package/dist/types/src/components/Tooltip/Tooltip.d.ts +10 -10
  146. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  147. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +2 -2
  148. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  149. package/dist/types/src/components/index.d.ts +1 -0
  150. package/dist/types/src/components/index.d.ts.map +1 -1
  151. package/dist/types/src/exemplars/generics.stories.d.ts +6 -5
  152. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -1
  153. package/dist/types/src/exemplars/slot.stories.d.ts +1 -0
  154. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -1
  155. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -1
  156. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -1
  157. package/dist/types/src/hooks/index.d.ts +1 -0
  158. package/dist/types/src/hooks/index.d.ts.map +1 -1
  159. package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
  160. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  161. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  162. package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
  163. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  164. package/dist/types/src/hooks/useSafeCollisionPadding.d.ts.map +1 -1
  165. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  166. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  167. package/dist/types/src/playground/Custom.stories.d.ts +1 -1
  168. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  169. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  170. package/dist/types/src/primitives/Column/Column.d.ts +21 -14
  171. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -1
  172. package/dist/types/src/primitives/Column/Column.stories.d.ts +19 -0
  173. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -1
  174. package/dist/types/src/primitives/Container/Container.d.ts +4 -5
  175. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -1
  176. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -1
  177. package/dist/types/src/primitives/Flex/Flex.d.ts +5 -7
  178. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -1
  179. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -1
  180. package/dist/types/src/primitives/Grid/Grid.d.ts +3 -8
  181. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -1
  182. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -1
  183. package/dist/types/src/primitives/Panel/Panel.d.ts +24 -15
  184. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -1
  185. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -1
  186. package/dist/types/src/testing/Loading.d.ts.map +1 -1
  187. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  188. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  189. package/dist/types/src/testing/decorators/withTheme.d.ts +1 -1
  190. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  191. package/dist/types/src/translations.d.ts +3 -3
  192. package/dist/types/src/translations.d.ts.map +1 -1
  193. package/dist/types/src/util/usePx.d.ts.map +1 -1
  194. package/dist/types/tsconfig.tsbuildinfo +1 -1
  195. package/package.json +28 -25
  196. package/src/components/Avatars/Avatar.stories.tsx +2 -3
  197. package/src/components/Avatars/Avatar.tsx +1 -2
  198. package/src/components/Avatars/AvatarGroup.stories.tsx +0 -1
  199. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -2
  200. package/src/components/Button/Button.stories.tsx +0 -1
  201. package/src/components/Button/Button.tsx +5 -13
  202. package/src/components/Button/IconButton.stories.tsx +6 -4
  203. package/src/components/Button/IconButton.tsx +3 -4
  204. package/src/components/Button/Toggle.stories.tsx +0 -1
  205. package/src/components/Button/Toggle.tsx +4 -4
  206. package/src/components/Button/ToggleGroup.stories.tsx +0 -1
  207. package/src/components/Button/ToggleGroup.tsx +12 -16
  208. package/src/components/Card/Card.stories.tsx +15 -15
  209. package/src/components/Card/Card.tsx +280 -115
  210. package/src/components/Clipboard/CopyButton.tsx +5 -6
  211. package/src/components/Dialog/AlertDialog.stories.tsx +5 -6
  212. package/src/components/Dialog/AlertDialog.tsx +67 -126
  213. package/src/components/Dialog/Dialog.stories.tsx +64 -9
  214. package/src/components/Dialog/Dialog.tsx +84 -88
  215. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +3 -8
  216. package/src/components/ErrorFallback/ErrorStack.tsx +36 -2
  217. package/src/components/Focus/AUDIT.md +43 -0
  218. package/src/components/Focus/Focus.stories.tsx +230 -0
  219. package/src/components/Focus/Focus.tsx +201 -0
  220. package/src/components/Focus/index.ts +5 -0
  221. package/src/components/Icon/Icon.stories.tsx +43 -13
  222. package/src/components/Icon/Icon.tsx +14 -3
  223. package/src/components/Image/Image.stories.tsx +3 -3
  224. package/src/components/Image/Image.tsx +31 -8
  225. package/src/components/Input/Input.stories.tsx +3 -4
  226. package/src/components/Input/Input.tsx +7 -7
  227. package/src/components/Link/Link.stories.tsx +0 -1
  228. package/src/components/List/List.stories.tsx +1 -2
  229. package/src/components/List/List.tsx +7 -6
  230. package/src/components/List/ListDropIndicator.tsx +0 -1
  231. package/src/components/List/Tree.stories.tsx +2 -3
  232. package/src/components/List/Tree.tsx +0 -1
  233. package/src/components/List/Treegrid.stories.tsx +26 -27
  234. package/src/components/List/Treegrid.tsx +14 -14
  235. package/src/components/Main/Main.stories.tsx +0 -1
  236. package/src/components/Main/Main.tsx +1 -2
  237. package/src/components/Menu/ContextMenu.stories.tsx +0 -1
  238. package/src/components/Menu/DropdownMenu.stories.tsx +0 -1
  239. package/src/components/Menu/DropdownMenu.tsx +48 -42
  240. package/src/components/Message/Message.stories.tsx +7 -8
  241. package/src/components/Message/Message.tsx +23 -10
  242. package/src/components/Popover/Popover.stories.tsx +4 -5
  243. package/src/components/Popover/Popover.tsx +42 -42
  244. package/src/components/ScrollArea/ScrollArea.stories.tsx +89 -30
  245. package/src/components/ScrollArea/ScrollArea.tsx +39 -23
  246. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +20 -18
  247. package/src/components/ScrollContainer/ScrollContainer.tsx +199 -92
  248. package/src/components/Select/Select.stories.tsx +5 -6
  249. package/src/components/Separator/Separator.tsx +4 -7
  250. package/src/components/Skeleton/Skeleton.stories.tsx +0 -1
  251. package/src/components/Splitter/Splitter.stories.tsx +29 -29
  252. package/src/components/Splitter/Splitter.tsx +35 -34
  253. package/src/components/Status/Status.stories.tsx +0 -1
  254. package/src/components/Status/Status.tsx +8 -5
  255. package/src/components/Tag/Tag.stories.tsx +0 -1
  256. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +0 -1
  257. package/src/components/ThemeProvider/ThemeProvider.tsx +5 -4
  258. package/src/components/ThemeProvider/index.ts +1 -1
  259. package/src/components/Toast/Toast.stories.tsx +0 -1
  260. package/src/components/Toast/Toast.tsx +16 -31
  261. package/src/components/Toolbar/Toolbar.stories.tsx +0 -1
  262. package/src/components/Toolbar/Toolbar.tsx +21 -35
  263. package/src/components/Tooltip/Tooltip.stories.tsx +7 -8
  264. package/src/components/Tooltip/Tooltip.tsx +15 -16
  265. package/src/components/index.ts +1 -0
  266. package/src/exemplars/generics.stories.tsx +7 -15
  267. package/src/exemplars/slot.stories.tsx +65 -57
  268. package/src/exemplars/tabster.stories.tsx +1 -1
  269. package/src/exemplars/virtualizer.stories.tsx +4 -5
  270. package/src/hooks/index.ts +1 -0
  271. package/src/hooks/useDensityContext.ts +2 -2
  272. package/src/playground/Custom.stories.tsx +6 -9
  273. package/src/primitives/Column/AUDIT.md +148 -0
  274. package/src/primitives/Column/Column.stories.tsx +122 -19
  275. package/src/primitives/Column/Column.tsx +73 -42
  276. package/src/primitives/Container/Container.stories.tsx +0 -1
  277. package/src/primitives/Container/Container.tsx +5 -8
  278. package/src/primitives/Flex/Flex.stories.tsx +0 -1
  279. package/src/primitives/Flex/Flex.tsx +10 -12
  280. package/src/primitives/Grid/Grid.stories.tsx +0 -1
  281. package/src/primitives/Grid/Grid.tsx +4 -9
  282. package/src/primitives/Panel/Panel.stories.tsx +9 -8
  283. package/src/primitives/Panel/Panel.tsx +64 -63
  284. package/src/testing/Loading.tsx +25 -4
  285. package/src/testing/decorators/withLayout.tsx +7 -17
  286. package/src/testing/decorators/withTheme.tsx +10 -7
  287. package/src/translations.ts +3 -3
  288. package/src/util/usePx.ts +1 -0
  289. package/dist/lib/browser/chunk-2FKSMWNY.mjs.map +0 -7
  290. package/dist/lib/node-esm/chunk-ZNBLTSHI.mjs.map +0 -7
@@ -4,10 +4,19 @@
4
4
 
5
5
  import { Primitive } from '@radix-ui/react-primitive';
6
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';
7
+ import DOMPurify from 'dompurify';
8
+ import React, {
9
+ CSSProperties,
10
+ MouseEventHandler,
11
+ type PropsWithChildren,
12
+ createContext,
13
+ forwardRef,
14
+ useContext,
15
+ useMemo,
16
+ } from 'react';
17
+
18
+ import { composable, composableProps, iconSize, mx, slottable } from '@dxos/ui-theme';
19
+ import { type Density } from '@dxos/ui-types';
11
20
 
12
21
  import { useThemeContext } from '../../hooks';
13
22
  import { Column } from '../../primitives';
@@ -15,12 +24,21 @@ import { type ThemedClassName } from '../../util';
15
24
  import { Button } from '../Button';
16
25
  import { Icon, type IconProps } from '../Icon';
17
26
  import { Image } from '../Image';
18
- import { Toolbar, type ToolbarMenuItem, type ToolbarMenuProps, type ToolbarRootProps } from '../Toolbar';
27
+ import {
28
+ Toolbar,
29
+ ToolbarCloseIconButtonProps,
30
+ ToolbarDragHandleProps,
31
+ type ToolbarMenuItem,
32
+ type ToolbarMenuProps,
33
+ type ToolbarRootProps,
34
+ } from '../Toolbar';
19
35
 
20
36
  //
21
37
  // Context
22
38
  //
23
39
 
40
+ const CARD_NAME = 'Card';
41
+
24
42
  type CardContextValue = {
25
43
  menuItems?: CardMenuItem<any>[];
26
44
  };
@@ -32,154 +50,264 @@ const CardContext = createContext<CardContextValue>({});
32
50
  // Root
33
51
  //
34
52
 
35
- type CardRootProps = SlottableProps<
36
- HTMLDivElement,
37
- {
38
- id?: string;
39
- border?: boolean;
40
- fullWidth?: boolean;
41
- }
42
- >;
53
+ const CARD_ROOT_NAME = 'Card.Root';
43
54
 
44
- const CardRoot = forwardRef<HTMLDivElement, CardRootProps>(
45
- ({ children, id, asChild, role, border = true, fullWidth, ...props }, forwardedRef) => {
55
+ type CardRootProps = {
56
+ id?: string;
57
+ border?: boolean;
58
+ fullWidth?: boolean;
59
+ density?: Density;
60
+ style?: CSSProperties;
61
+ tabIndex?: number;
62
+ onClick?: MouseEventHandler<HTMLDivElement>;
63
+ 'data-selected'?: boolean;
64
+ 'data-testid'?: string;
65
+ };
66
+
67
+ // `Card.Root` does not support `asChild`. The Column grid is the root element
68
+ // (one `<div>` carrying both the `dx-card` and `dx-column-root` classes
69
+ // instead of the previous outer-card + inner-column pair), so caller-provided
70
+ // HTML attributes — `onClick`, `tabIndex`, `style`, `data-*`, `grid-template-rows`
71
+ // overrides via `classNames` — land directly on the grid container. Slot-parents
72
+ // (`Focus.Item asChild`, `Mosaic.Tile asChild`, etc.) continue to work because
73
+ // `composable()` preserves the COMPOSABLE marker that slottable parents check
74
+ // before warning, and Radix `Slot` merges the parent's props onto the inner
75
+ // `<div>` exactly the way `slottable`'s `Slot`/`Primitive.div` branch did.
76
+ const CardRoot = composable<HTMLDivElement, CardRootProps>(
77
+ ({ children, id, role, border = true, fullWidth, density, ...props }, forwardedRef) => {
46
78
  const { className, ...rest } = composableProps(props);
47
- const Comp = asChild ? Slot : Primitive.div;
48
79
  const { tx } = useThemeContext();
49
80
 
50
81
  return (
51
- <Comp
52
- {...rest}
53
- {...(id && { 'data-object-id': id })}
82
+ <Column.Root
83
+ asChild
84
+ gutter={density === 'coarse' ? 'lg' : 'md'}
85
+ classNames={tx('card.root', { border, fullWidth }, className)}
54
86
  role={role ?? 'group'}
55
- className={tx('card.root', { border, fullWidth }, className)}
56
- ref={forwardedRef}
57
87
  >
58
- <Column.Root gutter='rail'>{children}</Column.Root>
59
- </Comp>
88
+ <div {...rest} {...(id && { 'data-object-id': id })} ref={forwardedRef}>
89
+ {children}
90
+ </div>
91
+ </Column.Root>
60
92
  );
61
93
  },
62
94
  );
63
95
 
96
+ CardRoot.displayName = CARD_ROOT_NAME;
97
+
64
98
  //
65
99
  // Toolbar
66
100
  //
67
101
 
68
- type CardToolbarProps = ToolbarRootProps & {
69
- density?: Density;
70
- };
102
+ const CARD_TOOLBAR_NAME = 'Card.Toolbar';
71
103
 
72
- // TODO(burdon): Roncile name with DialogHeader.
73
- const CardToolbar = forwardRef<HTMLDivElement, CardToolbarProps>(
74
- ({ children, classNames, density = 'fine', ...props }, forwardedRef) => {
75
- const { tx } = useThemeContext();
104
+ type CardToolbarProps = ToolbarRootProps;
76
105
 
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
- );
106
+ const CardToolbar = composable<HTMLDivElement, CardToolbarProps>(({ children, classNames, ...props }, forwardedRef) => {
107
+ const { tx } = useThemeContext();
108
+
109
+ return (
110
+ <Toolbar.Root {...props} style={iconSize(5)} classNames={[tx('card.toolbar', {}), classNames]} ref={forwardedRef}>
111
+ {children}
112
+ </Toolbar.Root>
113
+ );
114
+ });
115
+
116
+ CardToolbar.displayName = CARD_TOOLBAR_NAME;
117
+
118
+ //
119
+ // DragHandle
120
+ //
121
+
122
+ const CARD_DRAG_HANDLE_NAME = 'Card.DragHandle';
123
+
124
+ type CardDragHandleProps = ToolbarDragHandleProps;
125
+
126
+ const CardDragHandle = forwardRef<HTMLButtonElement, CardDragHandleProps>((props, forwardedRef) => {
127
+ return (
128
+ <CardIconBlock padding>
129
+ <Toolbar.DragHandle {...props} ref={forwardedRef} />
130
+ </CardIconBlock>
131
+ );
132
+ });
133
+
134
+ CardDragHandle.displayName = CARD_DRAG_HANDLE_NAME;
88
135
 
89
136
  //
90
- // Menu (delegated to Toolbar.Menu)
137
+ // CloseIconButton
91
138
  //
92
139
 
140
+ const CARD_CLOSE_ICON_BUTTON_NAME = 'Card.CloseIconButton';
141
+
142
+ type CloseIconButtonProps = ToolbarCloseIconButtonProps;
143
+
144
+ const CloseIconButton = forwardRef<HTMLButtonElement, CloseIconButtonProps>((props, forwardedRef) => {
145
+ return (
146
+ <CardIconBlock padding>
147
+ <Toolbar.CloseIconButton {...props} ref={forwardedRef} />
148
+ </CardIconBlock>
149
+ );
150
+ });
151
+
152
+ CloseIconButton.displayName = CARD_CLOSE_ICON_BUTTON_NAME;
153
+
154
+ //
155
+ // Menu
156
+ //
157
+
158
+ const CARD_MENU_NAME = 'Card.Menu';
159
+
93
160
  type CardMenuItem<T extends any | void = void> = ToolbarMenuItem<T>;
161
+
94
162
  type CardMenuProps<T extends any | void = void> = ToolbarMenuProps<T>;
95
163
 
96
- const CardMenu = <T extends any | void = void>({ context, items }: CardMenuProps<T>) => {
164
+ const CardMenu = <T extends any | void = void>({ context, items, ...props }: CardMenuProps<T>) => {
97
165
  const { menuItems } = useContext(CardContext) ?? {};
98
166
  const combinedItems = [...(items ?? []), ...((menuItems as CardMenuItem<T>[]) ?? [])];
99
167
 
100
- return <Toolbar.Menu context={context} items={combinedItems} />;
168
+ return (
169
+ <CardIconBlock padding>
170
+ <Toolbar.Menu {...props} context={context} items={combinedItems} />
171
+ </CardIconBlock>
172
+ );
173
+ };
174
+
175
+ (CardMenu as any).displayName = CARD_MENU_NAME;
176
+
177
+ //
178
+ // Icon
179
+ //
180
+
181
+ const CARD_ICON_NAME = 'Card.Icon';
182
+
183
+ const CardIcon = (props: IconProps) => {
184
+ return (
185
+ <CardIconBlock>
186
+ <Icon {...props} />
187
+ </CardIconBlock>
188
+ );
101
189
  };
102
190
 
191
+ (CardIcon as any).displayName = CARD_ICON_NAME;
192
+
193
+ //
194
+ // IconBlock
195
+ //
196
+
197
+ const CARD_ICON_BLOCK_NAME = 'Card.IconBlock';
198
+
199
+ const CardIconBlock = forwardRef<HTMLDivElement, ThemedClassName<PropsWithChildren<{ padding?: boolean }>>>(
200
+ ({ classNames, children, padding, ...props }, forwardedRef) => {
201
+ const { tx } = useThemeContext();
202
+
203
+ return (
204
+ <div {...props} className={tx('card.icon-block', { padding }, classNames)} ref={forwardedRef}>
205
+ {children}
206
+ </div>
207
+ );
208
+ },
209
+ );
210
+
211
+ CardIconBlock.displayName = CARD_ICON_BLOCK_NAME;
212
+
103
213
  //
104
214
  // Title
105
215
  //
106
216
 
107
- type CardTitleProps = SlottableProps<HTMLDivElement>;
217
+ const CARD_TITLE_NAME = 'Card.Title';
108
218
 
109
- const CardTitle = forwardRef<HTMLDivElement, CardTitleProps>(({ children, asChild, role, ...props }, forwardedRef) => {
110
- const { className, ...rest } = composableProps(props);
111
- const Comp = asChild ? Slot : Primitive.div;
219
+ const CardTitle = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
112
220
  const { tx } = useThemeContext();
221
+ const { className, ...rest } = composableProps(props, { role: 'heading' });
222
+ const Comp = asChild ? Slot : Primitive.div;
113
223
 
114
224
  return (
115
- <Comp {...rest} role={role ?? 'heading'} className={tx('card.title', {}, className)} ref={forwardedRef}>
225
+ <Comp {...rest} className={tx('card.title', {}, className)} ref={forwardedRef}>
116
226
  {children}
117
227
  </Comp>
118
228
  );
119
229
  });
120
230
 
231
+ CardTitle.displayName = CARD_TITLE_NAME;
232
+
121
233
  //
122
234
  // Content
123
235
  //
124
236
 
125
- type CardContentProps = SlottableProps<HTMLDivElement>;
237
+ const CARD_CONTENT_NAME = 'Card.Content';
126
238
 
127
- const CardContent = forwardRef<HTMLDivElement, CardContentProps>(({ children, role, ...props }, forwardedRef) => {
239
+ const CardContent = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
240
+ const { className, ...rest } = composableProps(props);
241
+ const Comp = asChild ? Slot : Primitive.div;
128
242
  const { tx } = useThemeContext();
129
243
 
130
244
  return (
131
- <div {...props} role={role ?? 'none'} className={tx('card.content', {})} ref={forwardedRef}>
245
+ <Comp {...rest} className={tx('card.content', {}, className)} ref={forwardedRef}>
132
246
  {children}
133
- </div>
247
+ </Comp>
134
248
  );
135
249
  });
136
250
 
251
+ CardContent.displayName = CARD_CONTENT_NAME;
252
+
137
253
  //
138
254
  // Row
139
255
  //
140
256
 
141
- type CardRowProps = SlottableProps<HTMLDivElement, { icon?: string }>;
257
+ const CARD_ROW_NAME = 'Card.Row';
258
+
259
+ type CardRowProps = { icon?: string; fullWidth?: boolean };
142
260
 
143
- const CardRow = forwardRef<HTMLDivElement, CardRowProps>(({ children, role, icon, ...props }, forwardedRef) => {
261
+ // TODO(burdon): fullWidth should mean no columns.
262
+ const CardRow = slottable<HTMLDivElement, CardRowProps>(({ children, asChild, icon, ...props }, forwardedRef) => {
144
263
  const { className, ...rest } = composableProps(props);
264
+ const Comp = asChild ? Slot : Primitive.div;
265
+ const { tx } = useThemeContext();
266
+
145
267
  return (
146
- <Column.Row {...rest} role={role ?? 'none'} classNames={className} ref={forwardedRef}>
147
- {(icon && <CardIcon classNames='text-subdued' icon={icon} />) || <div />}
268
+ <Comp {...rest} className={tx('card.row', {}, className)} ref={forwardedRef}>
269
+ {(icon && <CardIcon classNames='text-subdued' icon={icon} size={4} />) || <div />}
148
270
  {children}
149
- <div />
150
- </Column.Row>
271
+ </Comp>
151
272
  );
152
273
  });
153
274
 
275
+ CardRow.displayName = CARD_ROW_NAME;
276
+
154
277
  //
155
278
  // Section
156
279
  //
157
280
 
158
- type CardSectionProps = SlottableProps<HTMLDivElement>;
281
+ const CARD_SECTION_NAME = 'Card.Section';
159
282
 
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;
283
+ /**
284
+ * @deprecated Merge with Card.Row fullWidth
285
+ */
286
+ const CardSection = slottable<HTMLDivElement>(({ children, asChild, role, ...props }, forwardedRef) => {
287
+ const { className, ...rest } = composableProps(props);
288
+ const Comp = asChild ? Slot : Primitive.div;
164
289
 
165
- return (
166
- <Comp {...rest} role={role ?? 'none'} className={mx('col-span-full', className)} ref={forwardedRef}>
167
- {children}
168
- </Comp>
169
- );
170
- },
171
- );
290
+ return (
291
+ <Comp {...rest} role={role ?? 'none'} className={mx('col-span-full', className)} ref={forwardedRef}>
292
+ {children}
293
+ </Comp>
294
+ );
295
+ });
296
+
297
+ CardSection.displayName = CARD_SECTION_NAME;
172
298
 
173
299
  //
174
300
  // Heading
175
301
  //
176
302
 
177
- type CardHeadingProps = SlottableProps<HTMLDivElement, { variant?: 'default' | 'subtitle' }>;
303
+ const CARD_HEADING_NAME = 'Card.Heading';
304
+
305
+ type CardHeadingProps = { variant?: 'default' | 'subtitle' };
178
306
 
179
307
  /**
180
308
  * @deprecated Use typography.
181
309
  */
182
- const CardHeading = forwardRef<HTMLDivElement, CardHeadingProps>(
310
+ const CardHeading = slottable<HTMLDivElement, CardHeadingProps>(
183
311
  ({ children, asChild, role, variant = 'default', ...props }, forwardedRef) => {
184
312
  const { className, ...rest } = composableProps(props);
185
313
  const Comp = asChild ? Slot : Primitive.div;
@@ -198,13 +326,17 @@ const CardHeading = forwardRef<HTMLDivElement, CardHeadingProps>(
198
326
  },
199
327
  );
200
328
 
329
+ CardHeading.displayName = CARD_HEADING_NAME;
330
+
201
331
  //
202
332
  // Text
203
333
  //
204
334
 
205
- type CardTextProps = SlottableProps<HTMLDivElement, { truncate?: boolean; variant?: 'default' | 'description' }>;
335
+ const CARD_TEXT_NAME = 'Card.Text';
336
+
337
+ type CardTextProps = { truncate?: boolean; variant?: 'default' | 'description' };
206
338
 
207
- const CardText = forwardRef<HTMLDivElement, CardTextProps>(
339
+ const CardText = slottable<HTMLDivElement, CardTextProps>(
208
340
  ({ children, asChild, role, truncate, variant = 'default', ...props }, forwardedRef) => {
209
341
  const { className, ...rest } = composableProps(props);
210
342
  const Comp = asChild ? Slot : Primitive.div;
@@ -218,24 +350,69 @@ const CardText = forwardRef<HTMLDivElement, CardTextProps>(
218
350
  },
219
351
  );
220
352
 
353
+ CardText.displayName = CARD_TEXT_NAME;
354
+
355
+ //
356
+ // Html
357
+ //
358
+
359
+ const CARD_HTML_NAME = 'Card.Html';
360
+
361
+ type CardHtmlProps = { html: string; variant?: 'default' | 'description' };
362
+
363
+ /**
364
+ * Renders sanitized HTML content inside a card text slot.
365
+ * Uses DOMPurify to prevent XSS from untrusted markup (e.g. RSS feed content).
366
+ */
367
+ const CardHtml = ({ html, variant = 'default', ...props }: CardHtmlProps & ThemedClassName<object>) => {
368
+ const { tx } = useThemeContext();
369
+ const sanitized = useMemo(() => DOMPurify.sanitize(html), [html]);
370
+
371
+ return (
372
+ <div
373
+ {...props}
374
+ className={tx('card.text', { variant })}
375
+ // eslint-disable-next-line react/no-danger
376
+ dangerouslySetInnerHTML={{ __html: sanitized }}
377
+ />
378
+ );
379
+ };
380
+
381
+ (CardHtml as any).displayName = CARD_HTML_NAME;
382
+
221
383
  //
222
384
  // Poster
223
385
  //
224
386
 
387
+ const CARD_POSTER_NAME = 'Card.Poster';
388
+
225
389
  type CardPosterProps = ThemedClassName<
226
390
  {
227
391
  alt: string;
228
392
  aspect?: 'video' | 'auto';
393
+ /**
394
+ * How the image fills the poster box. `'contain'` (default) preserves
395
+ * aspect ratio and may letterbox; `'cover'` fills the box edge-to-edge,
396
+ * cropping as needed. Forwarded to the underlying `Image`'s
397
+ * `object-fit`.
398
+ */
399
+ fit?: 'contain' | 'cover';
229
400
  } & Partial<{ image: string; icon: string }>
230
401
  >;
231
402
 
232
403
  const CardPoster = (props: CardPosterProps) => {
233
404
  const { tx } = useThemeContext();
234
405
  const aspect = props.aspect === 'auto' ? 'aspect-auto' : 'aspect-video';
406
+
235
407
  if (props.image) {
236
408
  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} />
409
+ <div className='col-span-full'>
410
+ <Image
411
+ classNames={[tx('card.poster', {}), aspect, props.classNames]}
412
+ src={props.image}
413
+ alt={props.alt}
414
+ fit={props.fit}
415
+ />
239
416
  </div>
240
417
  );
241
418
  }
@@ -249,27 +426,35 @@ const CardPoster = (props: CardPosterProps) => {
249
426
  }
250
427
  };
251
428
 
429
+ (CardPoster as any).displayName = CARD_POSTER_NAME;
430
+
252
431
  //
253
432
  // Action
254
433
  //
255
434
 
435
+ const CARD_ACTION_NAME = 'Card.Action';
436
+
256
437
  type CardActionProps = { icon?: string; label: string; actionIcon?: string; onClick?: () => void };
257
438
 
258
439
  const CardAction = ({ icon, actionIcon = 'ph--arrow-right--regular', label, onClick }: CardActionProps) => {
259
440
  const { tx } = useThemeContext();
260
441
  return (
261
442
  <Button variant='ghost' classNames={tx('card.action', {})} onClick={onClick}>
262
- {icon ? <CardIcon classNames='text-subdued' icon={icon} /> : <div />}
443
+ {icon ? <CardIcon classNames='text-subdued' icon={icon} size={4} /> : <div />}
263
444
  <span className={tx('card.action-label', {}, !actionIcon ? 'col-span-2' : undefined)}>{label}</span>
264
- {actionIcon && <CardIcon icon={actionIcon} />}
445
+ {actionIcon && <CardIcon icon={actionIcon} size={4} />}
265
446
  </Button>
266
447
  );
267
448
  };
268
449
 
450
+ (CardAction as any).displayName = CARD_ACTION_NAME;
451
+
269
452
  //
270
453
  // Link
271
454
  //
272
455
 
456
+ const CARD_LINK_NAME = 'Card.Link';
457
+
273
458
  type CardLinkProps = { label: string; href: string };
274
459
 
275
460
  const CardLink = ({ label, href }: CardLinkProps) => {
@@ -283,35 +468,7 @@ const CardLink = ({ label, href }: CardLinkProps) => {
283
468
  );
284
469
  };
285
470
 
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
- };
471
+ (CardLink as any).displayName = CARD_LINK_NAME;
315
472
 
316
473
  //
317
474
  // Card
@@ -324,14 +481,14 @@ export const Card = {
324
481
  Toolbar: CardToolbar,
325
482
  ToolbarIconButton: Toolbar.IconButton,
326
483
  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,
484
+
485
+ // Toolbar blocks
486
+ IconBlock: CardIconBlock,
487
+ DragHandle: CardDragHandle,
488
+ CloseIconButton: CloseIconButton,
332
489
  Menu: CardMenu,
333
490
  Icon: CardIcon,
334
- IconBlock: CardIconBlock,
491
+ Title: CardTitle,
335
492
 
336
493
  // Content
337
494
  Content: CardContent,
@@ -339,9 +496,17 @@ export const Card = {
339
496
  Section: CardSection,
340
497
  Heading: CardHeading,
341
498
  Text: CardText,
499
+ Html: CardHtml,
342
500
  Poster: CardPoster,
343
501
  Action: CardAction,
344
502
  Link: CardLink,
345
503
  };
346
504
 
347
- export type { CardContextValue, CardRootProps, CardToolbarProps, CardMenuProps };
505
+ export type {
506
+ CardContextValue,
507
+ CardRootProps,
508
+ CardToolbarProps,
509
+ CardDragHandleProps,
510
+ CloseIconButtonProps,
511
+ CardMenuProps,
512
+ };
@@ -10,7 +10,6 @@ import { Button, type ButtonProps, IconButton } from '../Button';
10
10
  import { Icon, type IconProps } from '../Icon';
11
11
  import { useTranslation } from '../ThemeProvider';
12
12
  import { type TooltipScopedProps, useTooltipContext } from '../Tooltip';
13
-
14
13
  import { useClipboard } from './ClipboardProvider';
15
14
 
16
15
  export type CopyButtonProps = ButtonProps &
@@ -31,12 +30,12 @@ export const CopyButton = ({ classNames, value, size = 5, ...props }: CopyButton
31
30
  onClick={() => setTextValue(value)}
32
31
  data-testid='copy-invitation'
33
32
  >
34
- <div role='none' className={mx('flex gap-1 items-center', isCopied && inactiveLabelStyles)}>
35
- <span className='px-1'>{t('copy label')}</span>
33
+ <div className={mx('flex gap-1 items-center', isCopied && inactiveLabelStyles)}>
34
+ <span className='px-1'>{t('copy.label')}</span>
36
35
  <Icon icon='ph--copy--regular' size={size} />
37
36
  </div>
38
- <div role='none' className={mx('flex gap-1 items-center', !isCopied && inactiveLabelStyles)}>
39
- <span className='px-1'>{t('copy success label')}</span>
37
+ <div className={mx('flex gap-1 items-center', !isCopied && inactiveLabelStyles)}>
38
+ <span className='px-1'>{t('copy-success.label')}</span>
40
39
  <Icon icon='ph--check--regular' size={size} />
41
40
  </div>
42
41
  </Button>
@@ -58,7 +57,7 @@ export const CopyButtonIconOnly = ({
58
57
  const { t } = useTranslation(osTranslations);
59
58
  const { textValue, setTextValue } = useClipboard();
60
59
  const isCopied = textValue === value;
61
- const label = isCopied ? t('copy success label') : (props.label ?? t('copy label'));
60
+ const label = isCopied ? t('copy-success.label') : (props.label ?? t('copy.label'));
62
61
  const { onOpen } = useTooltipContext('CopyButton', __scopeTooltip);
63
62
  return (
64
63
  <IconButton
@@ -5,14 +5,13 @@
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
+ import { random } from '@dxos/random';
9
9
 
10
10
  import { withTheme } from '../../testing';
11
11
  import { Button } from '../Button';
12
-
13
12
  import { AlertDialog } from './AlertDialog';
14
13
 
15
- type StoryProps = Partial<{
14
+ type DefaultStoryProps = Partial<{
16
15
  title: string;
17
16
  description: string;
18
17
  openTrigger: string;
@@ -20,7 +19,7 @@ type StoryProps = Partial<{
20
19
  actionTrigger: string;
21
20
  }>;
22
21
 
23
- const DefaultStory = ({ title, description, openTrigger, cancelTrigger, actionTrigger }: StoryProps) => {
22
+ const DefaultStory = ({ title, description, openTrigger, cancelTrigger, actionTrigger }: DefaultStoryProps) => {
24
23
  return (
25
24
  <AlertDialog.Root defaultOpen>
26
25
  <AlertDialog.Trigger asChild>
@@ -60,8 +59,8 @@ type Story = StoryObj<typeof meta>;
60
59
 
61
60
  export const Default: Story = {
62
61
  args: {
63
- title: faker.lorem.sentence(3),
64
- description: faker.lorem.paragraph(1),
62
+ title: random.lorem.sentence(3),
63
+ description: random.lorem.paragraph(1),
65
64
  openTrigger: 'Open AlertDialog',
66
65
  cancelTrigger: 'Cancel',
67
66
  actionTrigger: 'Action',