@dxos/react-ui 0.8.4-main.c85a9c8dae → 0.8.4-main.cb12b3f963

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