@dxos/react-ui 0.8.4-main.72ec0f3 → 0.8.4-main.74a063c4e0

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 (383) hide show
  1. package/dist/lib/browser/chunk-KRSEIVRM.mjs +776 -0
  2. package/dist/lib/browser/chunk-KRSEIVRM.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +4157 -67
  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 +74 -63
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/chunk-ENYC4TYH.mjs +778 -0
  9. package/dist/lib/node-esm/chunk-ENYC4TYH.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +4157 -67
  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 +74 -63
  14. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  15. package/dist/types/src/components/Avatars/Avatar.d.ts +1 -1
  16. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  17. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  18. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  19. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  20. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  21. package/dist/types/src/components/Button/Button.d.ts +3 -3
  22. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  23. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -1
  24. package/dist/types/src/components/Button/IconButton.d.ts +2 -1
  25. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  26. package/dist/types/src/components/Button/IconButton.stories.d.ts +3 -0
  27. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
  28. package/dist/types/src/components/Button/Toggle.d.ts +2 -2
  29. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -1
  30. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
  31. package/dist/types/src/components/Button/ToggleGroup.d.ts +10 -10
  32. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -1
  33. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +4 -4
  34. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
  35. package/dist/types/src/components/Card/Card.d.ts +150 -0
  36. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  37. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  38. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  39. package/dist/types/src/components/Card/index.d.ts +2 -0
  40. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  41. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  42. package/dist/types/src/components/Clipboard/index.d.ts +10 -1
  43. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  44. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  45. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  46. package/dist/types/src/components/Dialog/AlertDialog.d.ts +41 -19
  47. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  48. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  49. package/dist/types/src/components/Dialog/Dialog.d.ts +56 -21
  50. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  51. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +10 -10
  52. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  53. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  54. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  55. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  56. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  57. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  58. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  59. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +8 -0
  60. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  61. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  62. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  63. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  64. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  65. package/dist/types/src/components/Focus/Focus.d.ts +44 -0
  66. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -0
  67. package/dist/types/src/components/Focus/Focus.stories.d.ts +9 -0
  68. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -0
  69. package/dist/types/src/components/Focus/index.d.ts +2 -0
  70. package/dist/types/src/components/Focus/index.d.ts.map +1 -0
  71. package/dist/types/src/components/Icon/Icon.d.ts +4 -1
  72. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  73. package/dist/types/src/components/Icon/Icon.stories.d.ts +11 -3
  74. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  75. package/dist/types/src/components/Image/Image.d.ts +14 -0
  76. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  77. package/dist/types/src/components/Image/Image.stories.d.ts +33 -0
  78. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  79. package/dist/types/src/components/Image/index.d.ts +2 -0
  80. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  81. package/dist/types/src/components/Input/Input.d.ts +7 -7
  82. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  83. package/dist/types/src/components/Input/Input.stories.d.ts +8 -8
  84. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  85. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  86. package/dist/types/src/components/List/List.d.ts +10 -4
  87. package/dist/types/src/components/List/List.d.ts.map +1 -1
  88. package/dist/types/src/components/List/List.stories.d.ts +8 -2
  89. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  90. package/dist/types/src/components/List/Tree.d.ts.map +1 -1
  91. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
  92. package/dist/types/src/components/List/Treegrid.d.ts +9 -9
  93. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  94. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
  95. package/dist/types/src/components/Main/Main.d.ts +9 -10
  96. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  97. package/dist/types/src/components/Main/Main.stories.d.ts +0 -3
  98. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  99. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  100. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  101. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  102. package/dist/types/src/components/Menu/DropdownMenu.d.ts +113 -0
  103. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  104. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +28 -0
  105. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  106. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  107. package/dist/types/src/components/Message/Message.d.ts +1 -1
  108. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  109. package/dist/types/src/components/Message/Message.stories.d.ts +5 -6
  110. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  111. package/dist/types/src/components/Popover/Popover.d.ts +33 -24
  112. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  113. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  114. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +32 -24
  115. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  116. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +65 -8
  117. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  118. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +48 -13
  119. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  120. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +10 -5
  121. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  122. package/dist/types/src/components/Select/Select.d.ts +9 -9
  123. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  124. package/dist/types/src/components/Select/Select.stories.d.ts +2 -2
  125. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  126. package/dist/types/src/components/Separator/Separator.d.ts +4 -4
  127. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  128. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  129. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  130. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  131. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  132. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  133. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  134. package/dist/types/src/components/Splitter/Splitter.d.ts +42 -0
  135. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  136. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  137. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  138. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  139. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  140. package/dist/types/src/components/Status/Status.d.ts +3 -4
  141. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  142. package/dist/types/src/components/Status/Status.stories.d.ts +4 -2
  143. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  144. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  145. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  146. package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
  147. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  148. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +3 -3
  149. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  150. package/dist/types/src/components/{Menus/DropdownMenu.stories.d.ts → ThemeProvider/ThemeProvider.stories.d.ts} +2 -5
  151. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  152. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
  153. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  154. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  155. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  156. package/dist/types/src/components/Toast/Toast.d.ts +19 -19
  157. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  158. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  159. package/dist/types/src/components/Toolbar/Toolbar.d.ts +43 -17
  160. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  161. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  162. package/dist/types/src/components/Tooltip/Tooltip.d.ts +9 -9
  163. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  164. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +2 -2
  165. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  166. package/dist/types/src/components/index.d.ts +10 -5
  167. package/dist/types/src/components/index.d.ts.map +1 -1
  168. package/dist/types/src/exemplars/generics.stories.d.ts +23 -0
  169. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  170. package/dist/types/src/exemplars/slot.stories.d.ts +15 -0
  171. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  172. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  173. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  174. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  175. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  176. package/dist/types/src/hooks/index.d.ts +1 -0
  177. package/dist/types/src/hooks/index.d.ts.map +1 -1
  178. package/dist/types/src/hooks/useDensityContext.d.ts +2 -2
  179. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  180. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  181. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  182. package/dist/types/src/index.d.ts +2 -1
  183. package/dist/types/src/index.d.ts.map +1 -1
  184. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  185. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  186. package/dist/types/src/primitives/Column/Column.d.ts +51 -0
  187. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  188. package/dist/types/src/primitives/Column/Column.stories.d.ts +25 -0
  189. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  190. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  191. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  192. package/dist/types/src/primitives/Container/Container.d.ts +11 -0
  193. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  194. package/dist/types/src/primitives/Container/Container.stories.d.ts +6 -0
  195. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  196. package/dist/types/src/primitives/Container/index.d.ts +2 -0
  197. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  198. package/dist/types/src/primitives/Flex/Flex.d.ts +15 -0
  199. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  200. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  201. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  202. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  203. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  204. package/dist/types/src/primitives/Grid/Grid.d.ts +14 -0
  205. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  206. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  207. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  208. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  209. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  210. package/dist/types/src/primitives/Panel/Panel.d.ts +51 -0
  211. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  212. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  213. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  214. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  215. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  216. package/dist/types/src/primitives/index.d.ts +6 -0
  217. package/dist/types/src/primitives/index.d.ts.map +1 -0
  218. package/dist/types/src/testing/Loading.d.ts +9 -0
  219. package/dist/types/src/testing/Loading.d.ts.map +1 -0
  220. package/dist/types/src/testing/decorators/withLayout.d.ts +3 -3
  221. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  222. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +1 -1
  223. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  224. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  225. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  226. package/dist/types/src/testing/index.d.ts +1 -0
  227. package/dist/types/src/testing/index.d.ts.map +1 -1
  228. package/dist/types/src/translations.d.ts +11 -0
  229. package/dist/types/src/translations.d.ts.map +1 -0
  230. package/dist/types/src/util/index.d.ts +1 -2
  231. package/dist/types/src/util/index.d.ts.map +1 -1
  232. package/dist/types/src/util/usePx.d.ts.map +1 -1
  233. package/dist/types/tsconfig.tsbuildinfo +1 -1
  234. package/package.json +42 -32
  235. package/src/components/Avatars/Avatar.stories.tsx +7 -9
  236. package/src/components/Avatars/Avatar.tsx +7 -15
  237. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -3
  238. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +3 -4
  239. package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
  240. package/src/components/Button/Button.stories.tsx +3 -4
  241. package/src/components/Button/Button.tsx +12 -26
  242. package/src/components/Button/IconButton.stories.tsx +8 -6
  243. package/src/components/Button/IconButton.tsx +9 -6
  244. package/src/components/Button/Toggle.stories.tsx +2 -3
  245. package/src/components/Button/Toggle.tsx +4 -4
  246. package/src/components/Button/ToggleGroup.stories.tsx +2 -3
  247. package/src/components/Button/ToggleGroup.tsx +12 -16
  248. package/src/components/Card/Card.stories.tsx +151 -0
  249. package/src/components/Card/Card.tsx +492 -0
  250. package/src/components/Card/index.ts +5 -0
  251. package/src/components/Clipboard/CopyButton.tsx +7 -8
  252. package/src/components/DensityProvider/DensityProvider.tsx +1 -1
  253. package/src/components/Dialog/AlertDialog.stories.tsx +16 -17
  254. package/src/components/Dialog/AlertDialog.tsx +123 -82
  255. package/src/components/Dialog/Dialog.stories.tsx +138 -28
  256. package/src/components/Dialog/Dialog.tsx +197 -71
  257. package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
  258. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +45 -0
  259. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  260. package/src/components/ErrorFallback/ErrorStack.tsx +80 -0
  261. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  262. package/src/components/ErrorFallback/index.ts +9 -0
  263. package/src/components/Focus/AUDIT.md +43 -0
  264. package/src/components/Focus/Focus.stories.tsx +230 -0
  265. package/src/components/Focus/Focus.tsx +201 -0
  266. package/src/components/Focus/index.ts +5 -0
  267. package/src/components/Icon/Icon.stories.tsx +45 -15
  268. package/src/components/Icon/Icon.tsx +7 -3
  269. package/src/components/Image/Image.stories.tsx +86 -0
  270. package/src/components/Image/Image.tsx +223 -0
  271. package/src/components/Image/index.ts +5 -0
  272. package/src/components/Input/Input.stories.tsx +21 -41
  273. package/src/components/Input/Input.tsx +36 -72
  274. package/src/components/Link/Link.stories.tsx +2 -3
  275. package/src/components/Link/Link.tsx +2 -2
  276. package/src/components/List/List.stories.tsx +30 -34
  277. package/src/components/List/List.tsx +17 -21
  278. package/src/components/List/ListDropIndicator.tsx +7 -7
  279. package/src/components/List/Tree.stories.tsx +5 -6
  280. package/src/components/List/Tree.tsx +0 -1
  281. package/src/components/List/TreeDropIndicator.tsx +6 -6
  282. package/src/components/List/Treegrid.stories.tsx +29 -30
  283. package/src/components/List/Treegrid.tsx +23 -28
  284. package/src/components/Main/Main.stories.tsx +41 -24
  285. package/src/components/Main/Main.tsx +139 -83
  286. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +2 -3
  287. package/src/components/{Menus → Menu}/ContextMenu.tsx +9 -33
  288. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +2 -3
  289. package/src/components/{Menus → Menu}/DropdownMenu.tsx +119 -109
  290. package/src/components/Message/Message.stories.tsx +27 -13
  291. package/src/components/Message/Message.tsx +43 -34
  292. package/src/components/Popover/Popover.stories.tsx +7 -8
  293. package/src/components/Popover/Popover.tsx +97 -92
  294. package/src/components/ScrollArea/ScrollArea.stories.tsx +223 -34
  295. package/src/components/ScrollArea/ScrollArea.tsx +97 -79
  296. package/src/components/ScrollArea/index.ts +1 -1
  297. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +47 -25
  298. package/src/components/ScrollContainer/ScrollContainer.tsx +225 -109
  299. package/src/components/Select/Select.stories.tsx +7 -8
  300. package/src/components/Select/Select.tsx +11 -27
  301. package/src/components/Separator/Separator.tsx +5 -8
  302. package/src/components/Skeleton/Skeleton.stories.tsx +51 -0
  303. package/src/components/Skeleton/Skeleton.tsx +26 -0
  304. package/src/components/Skeleton/index.ts +5 -0
  305. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  306. package/src/components/Splitter/Splitter.tsx +127 -0
  307. package/src/components/Splitter/index.ts +5 -0
  308. package/src/components/Status/Status.stories.tsx +21 -18
  309. package/src/components/Status/Status.tsx +10 -7
  310. package/src/components/Tag/Tag.stories.tsx +6 -12
  311. package/src/components/Tag/Tag.tsx +3 -8
  312. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +31 -0
  313. package/src/components/ThemeProvider/ThemeProvider.tsx +10 -10
  314. package/src/components/ThemeProvider/TranslationsProvider.tsx +1 -16
  315. package/src/components/ThemeProvider/index.ts +3 -3
  316. package/src/components/Toast/Toast.stories.tsx +2 -3
  317. package/src/components/Toast/Toast.tsx +22 -41
  318. package/src/components/Toolbar/Toolbar.stories.tsx +2 -3
  319. package/src/components/Toolbar/Toolbar.tsx +185 -23
  320. package/src/components/Tooltip/Tooltip.stories.tsx +20 -19
  321. package/src/components/Tooltip/Tooltip.tsx +40 -38
  322. package/src/components/index.ts +11 -6
  323. package/src/exemplars/generics.stories.tsx +41 -0
  324. package/src/exemplars/slot.stories.tsx +117 -0
  325. package/src/exemplars/tabster.stories.tsx +127 -0
  326. package/src/exemplars/virtualizer.stories.tsx +137 -0
  327. package/src/hooks/index.ts +1 -0
  328. package/src/hooks/useDensityContext.ts +3 -3
  329. package/src/hooks/useElevationContext.ts +1 -1
  330. package/src/index.ts +2 -1
  331. package/src/playground/Controls.stories.tsx +3 -10
  332. package/src/playground/Custom.stories.tsx +11 -21
  333. package/src/playground/Typography.stories.tsx +3 -3
  334. package/src/primitives/Column/AUDIT.md +354 -0
  335. package/src/primitives/Column/Column.stories.tsx +182 -0
  336. package/src/primitives/Column/Column.tsx +169 -0
  337. package/src/primitives/Column/index.ts +5 -0
  338. package/src/primitives/Container/Container.stories.tsx +29 -0
  339. package/src/primitives/Container/Container.tsx +19 -0
  340. package/src/primitives/Container/index.ts +5 -0
  341. package/src/primitives/Flex/Flex.stories.tsx +57 -0
  342. package/src/primitives/Flex/Flex.tsx +27 -0
  343. package/src/primitives/Flex/index.ts +5 -0
  344. package/src/primitives/Grid/Grid.stories.tsx +56 -0
  345. package/src/primitives/Grid/Grid.tsx +30 -0
  346. package/src/primitives/Grid/index.ts +5 -0
  347. package/src/primitives/Panel/Panel.stories.tsx +68 -0
  348. package/src/primitives/Panel/Panel.tsx +120 -0
  349. package/src/primitives/Panel/index.ts +5 -0
  350. package/src/primitives/index.ts +9 -0
  351. package/src/testing/Loading.tsx +27 -0
  352. package/src/testing/decorators/withLayout.tsx +39 -18
  353. package/src/testing/decorators/withLayoutVariants.tsx +20 -23
  354. package/src/testing/decorators/withTheme.tsx +26 -20
  355. package/src/testing/index.ts +2 -0
  356. package/src/translations.ts +19 -0
  357. package/src/util/index.ts +2 -2
  358. package/src/util/usePx.ts +1 -0
  359. package/dist/lib/browser/chunk-53MI2QCM.mjs +0 -4707
  360. package/dist/lib/browser/chunk-53MI2QCM.mjs.map +0 -7
  361. package/dist/lib/node-esm/chunk-ID67AFFF.mjs +0 -4709
  362. package/dist/lib/node-esm/chunk-ID67AFFF.mjs.map +0 -7
  363. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  364. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  365. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  366. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  367. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  368. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  369. package/dist/types/src/components/Menus/DropdownMenu.d.ts +0 -113
  370. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  371. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  372. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  373. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  374. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  375. package/dist/types/src/util/domino.d.ts +0 -18
  376. package/dist/types/src/util/domino.d.ts.map +0 -1
  377. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
  378. package/src/components/AnchoredOverflow/index.ts +0 -5
  379. package/src/util/ThemedClassName.ts +0 -7
  380. package/src/util/domino.ts +0 -53
  381. /package/dist/types/src/components/{Menus → Menu}/ContextMenu.stories.d.ts +0 -0
  382. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  383. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -2,50 +2,46 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import {
6
- ToggleGroupItem as ToggleGroupItemPrimitive,
7
- type ToggleGroupItemProps as ToggleGroupItemPrimitiveProps,
8
- type ToggleGroupMultipleProps,
9
- ToggleGroup as ToggleGroupPrimitive,
10
- type ToggleGroupSingleProps,
11
- } from '@radix-ui/react-toggle-group';
5
+ import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';
12
6
  import React, { forwardRef } from 'react';
13
7
 
14
8
  import { Button, ButtonGroup, type ButtonGroupProps, type ButtonProps } from './Button';
15
9
  import { IconButton, type IconButtonProps } from './IconButton';
16
10
 
17
- type ToggleGroupProps = Omit<ToggleGroupSingleProps, 'className'> | Omit<ToggleGroupMultipleProps, 'className'>;
11
+ type ToggleGroupProps =
12
+ | Omit<ToggleGroupPrimitive.ToggleGroupSingleProps, 'className'>
13
+ | Omit<ToggleGroupPrimitive.ToggleGroupMultipleProps, 'className'>;
18
14
 
19
15
  const ToggleGroup = forwardRef<HTMLDivElement, ToggleGroupProps & ButtonGroupProps>(
20
16
  ({ classNames, children, ...props }, forwardedRef) => {
21
17
  return (
22
- <ToggleGroupPrimitive {...props} asChild>
18
+ <ToggleGroupPrimitive.Root {...props} asChild>
23
19
  <ButtonGroup {...{ classNames, children }} ref={forwardedRef} />
24
- </ToggleGroupPrimitive>
20
+ </ToggleGroupPrimitive.Root>
25
21
  );
26
22
  },
27
23
  );
28
24
 
29
- type ToggleGroupItemProps = Omit<ToggleGroupItemPrimitiveProps, 'className'> & ButtonProps;
25
+ type ToggleGroupItemProps = Omit<ToggleGroupPrimitive.ToggleGroupItemProps, 'className'> & ButtonProps;
30
26
 
31
27
  const ToggleGroupItem = forwardRef<HTMLButtonElement, ToggleGroupItemProps>(
32
28
  ({ variant, elevation, density, classNames, children, ...props }, forwardedRef) => {
33
29
  return (
34
- <ToggleGroupItemPrimitive {...props} asChild>
30
+ <ToggleGroupPrimitive.Item {...props} asChild>
35
31
  <Button {...{ variant, elevation, density, classNames, children }} ref={forwardedRef} />
36
- </ToggleGroupItemPrimitive>
32
+ </ToggleGroupPrimitive.Item>
37
33
  );
38
34
  },
39
35
  );
40
36
 
41
- type ToggleGroupIconItemProps = Omit<ToggleGroupItemPrimitiveProps, 'className'> & IconButtonProps;
37
+ type ToggleGroupIconItemProps = Omit<ToggleGroupPrimitive.ToggleGroupItemProps, 'className'> & IconButtonProps;
42
38
 
43
39
  const ToggleGroupIconItem = forwardRef<HTMLButtonElement, ToggleGroupIconItemProps>(
44
40
  ({ variant, label, icon, size, elevation, density, classNames, ...props }, forwardedRef) => {
45
41
  return (
46
- <ToggleGroupItemPrimitive {...props} asChild>
42
+ <ToggleGroupPrimitive.Item {...props} asChild>
47
43
  <IconButton {...{ variant, elevation, density, classNames, label, icon, size }} ref={forwardedRef} />
48
- </ToggleGroupItemPrimitive>
44
+ </ToggleGroupPrimitive.Item>
49
45
  );
50
46
  },
51
47
  );
@@ -0,0 +1,151 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useRef } from 'react';
7
+
8
+ import { random } from '@dxos/random';
9
+ import { Icon } from '@dxos/react-ui';
10
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
11
+
12
+ import { Card } from './Card';
13
+
14
+ random.seed(0);
15
+
16
+ type DefaultStoryProps = {
17
+ title: string;
18
+ description?: string;
19
+ image?: string;
20
+ fullWidth?: boolean;
21
+ };
22
+
23
+ const DefaultStory = ({ title, description, image, fullWidth }: DefaultStoryProps) => {
24
+ const handleRef = useRef<HTMLButtonElement>(null);
25
+ console.log(title);
26
+ return (
27
+ <Card.Root fullWidth={fullWidth}>
28
+ <Card.Toolbar>
29
+ <Card.DragHandle ref={handleRef} />
30
+ <Card.Title>{title}</Card.Title>
31
+ <Card.CloseIconButton onClick={() => console.log('close')} />
32
+ </Card.Toolbar>
33
+ <Card.Content>
34
+ <Card.Poster alt='Card.Poster' image={image} />
35
+ <Card.Row icon='ph--dot-outline--regular'>
36
+ <Card.Heading>Card.Heading</Card.Heading>
37
+ </Card.Row>
38
+ <Card.Row icon='ph--dot-outline--regular'>
39
+ <Card.Text>Card.Text (default)</Card.Text>
40
+ </Card.Row>
41
+ <Card.Row icon='ph--dot-outline--regular'>
42
+ <Card.Text variant='description'>
43
+ Card.Text (description)
44
+ <br />
45
+ {description}
46
+ </Card.Text>
47
+ </Card.Row>
48
+ <Card.Row icon='ph--dot-outline--regular'>
49
+ <Card.Heading variant='subtitle'>Card.Heading (subtitle)</Card.Heading>
50
+ </Card.Row>
51
+ <Card.Action label='Card.Action' onClick={() => console.log('action')} />
52
+ <Card.Link label='Card.Link' href='https://dxos.org' />
53
+ </Card.Content>
54
+ </Card.Root>
55
+ );
56
+ };
57
+
58
+ const meta = {
59
+ title: 'ui/react-ui-core/components/Card',
60
+ render: DefaultStory,
61
+ decorators: [withTheme(), withLayout({ layout: 'centered', classNames: 'grid w-[30rem] place-items-center' })],
62
+ } satisfies Meta<typeof DefaultStory>;
63
+
64
+ export default meta;
65
+
66
+ type Story = StoryObj<typeof meta>;
67
+
68
+ const image = random.image.url();
69
+
70
+ export const Default: Story = {
71
+ args: {
72
+ title: random.commerce.productName(),
73
+ description: random.lorem.paragraph(3),
74
+ image,
75
+ },
76
+ };
77
+
78
+ export const FullWidth: Story = {
79
+ args: {
80
+ title: random.commerce.productName(),
81
+ description: random.lorem.paragraph(3),
82
+ image,
83
+ fullWidth: true,
84
+ },
85
+ };
86
+
87
+ export const Simple: Story = {
88
+ args: {
89
+ title: random.commerce.productName(),
90
+ },
91
+ render: ({ title }) => {
92
+ const handleRef = useRef<HTMLButtonElement>(null);
93
+ return (
94
+ <Card.Root>
95
+ <Card.Toolbar>
96
+ <Card.DragHandle ref={handleRef} />
97
+ <Card.Title>{title}</Card.Title>
98
+ <Card.CloseIconButton onClick={() => console.log('close')} />
99
+ </Card.Toolbar>
100
+ </Card.Root>
101
+ );
102
+ },
103
+ };
104
+
105
+ export const Description: Story = {
106
+ args: {
107
+ title: random.commerce.productName(),
108
+ description: random.lorem.paragraph(3),
109
+ },
110
+ render: ({ title, description }) => {
111
+ const handleRef = useRef<HTMLButtonElement>(null);
112
+ return (
113
+ <Card.Root>
114
+ <Card.Toolbar>
115
+ <Card.DragHandle ref={handleRef} />
116
+ <Card.Title>{title}</Card.Title>
117
+ <Card.CloseIconButton onClick={() => console.log('close')} />
118
+ </Card.Toolbar>
119
+ <Card.Content>
120
+ <Card.Row>
121
+ <Card.Text variant='description'>{description}</Card.Text>
122
+ </Card.Row>
123
+ </Card.Content>
124
+ </Card.Root>
125
+ );
126
+ },
127
+ };
128
+
129
+ export const Mock = () => (
130
+ <div className='grid grid-cols-[2rem_1fr_2rem] w-full dx-card-min-width dx-card-max-width border border-separator rounded-xs'>
131
+ <div className='grid grid-cols-subgrid col-span-full'>
132
+ <div role='none' className='grid h-[var(--dx-rail-item)] w-[var(--dx-rail-item)] place-items-center'>
133
+ <Icon icon='ph--dots-six-vertical--regular' />
134
+ </div>
135
+ <div className='p-1 whitespace-normal break-words text-description items-center'>
136
+ This line is very very long and it should wrap.
137
+ </div>
138
+ <div role='none' className='grid h-[var(--dx-rail-item)] w-[var(--dx-rail-item)] place-items-center'>
139
+ <Icon icon='ph--x--regular' />
140
+ </div>
141
+ </div>
142
+ <div className='grid grid-cols-subgrid col-span-3'>
143
+ <div role='none' className='grid h-[var(--dx-rail-item)] w-[var(--dx-rail-item)] place-items-center'>
144
+ <Icon icon='ph--dots-six-vertical--regular' />
145
+ </div>
146
+ <div className='p-1 text-description items-center col-span-2'>
147
+ This line is very very long and it should wrap.
148
+ </div>
149
+ </div>
150
+ </div>
151
+ );
@@ -0,0 +1,492 @@
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 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';
20
+
21
+ import { useThemeContext } from '../../hooks';
22
+ import { Column } from '../../primitives';
23
+ import { type ThemedClassName } from '../../util';
24
+ import { Button } from '../Button';
25
+ import { Icon, type IconProps } from '../Icon';
26
+ import { Image } from '../Image';
27
+ import {
28
+ Toolbar,
29
+ ToolbarCloseIconButtonProps,
30
+ ToolbarDragHandleProps,
31
+ type ToolbarMenuItem,
32
+ type ToolbarMenuProps,
33
+ type ToolbarRootProps,
34
+ } from '../Toolbar';
35
+
36
+ //
37
+ // Context
38
+ //
39
+
40
+ const CARD_NAME = 'Card';
41
+
42
+ type CardContextValue = {
43
+ menuItems?: CardMenuItem<any>[];
44
+ };
45
+
46
+ /** @deprecated Use context for menus. */
47
+ const CardContext = createContext<CardContextValue>({});
48
+
49
+ //
50
+ // Root
51
+ //
52
+
53
+ const CARD_ROOT_NAME = 'Card.Root';
54
+
55
+ type CardRootOwnProps = {
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
+ 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);
72
+ const Comp = asChild ? Slot : Primitive.div;
73
+ const { tx } = useThemeContext();
74
+
75
+ return (
76
+ <Comp
77
+ {...rest}
78
+ {...(id && { 'data-object-id': id })}
79
+ role={role ?? 'group'}
80
+ className={tx('card.root', { border, fullWidth }, className)}
81
+ ref={forwardedRef}
82
+ >
83
+ <Column.Root gutter={density === 'coarse' ? 'lg' : 'md'}>{children}</Column.Root>
84
+ </Comp>
85
+ );
86
+ },
87
+ );
88
+
89
+ CardRoot.displayName = CARD_ROOT_NAME;
90
+
91
+ //
92
+ // Toolbar
93
+ //
94
+
95
+ const CARD_TOOLBAR_NAME = 'Card.Toolbar';
96
+
97
+ type CardToolbarProps = ToolbarRootProps;
98
+
99
+ const CardToolbar = composable<HTMLDivElement, CardToolbarProps>(({ children, classNames, ...props }, forwardedRef) => {
100
+ const { tx } = useThemeContext();
101
+
102
+ return (
103
+ <Toolbar.Root {...props} style={iconSize(5)} classNames={[tx('card.toolbar', {}), classNames]} ref={forwardedRef}>
104
+ {children}
105
+ </Toolbar.Root>
106
+ );
107
+ });
108
+
109
+ CardToolbar.displayName = CARD_TOOLBAR_NAME;
110
+
111
+ //
112
+ // DragHandle
113
+ //
114
+
115
+ const CARD_DRAG_HANDLE_NAME = 'Card.DragHandle';
116
+
117
+ type CardDragHandleProps = ToolbarDragHandleProps;
118
+
119
+ const CardDragHandle = forwardRef<HTMLButtonElement, CardDragHandleProps>((props, forwardedRef) => {
120
+ return (
121
+ <CardIconBlock padding>
122
+ <Toolbar.DragHandle {...props} ref={forwardedRef} />
123
+ </CardIconBlock>
124
+ );
125
+ });
126
+
127
+ CardDragHandle.displayName = CARD_DRAG_HANDLE_NAME;
128
+
129
+ //
130
+ // CloseIconButton
131
+ //
132
+
133
+ const CARD_CLOSE_ICON_BUTTON_NAME = 'Card.CloseIconButton';
134
+
135
+ type CloseIconButtonProps = ToolbarCloseIconButtonProps;
136
+
137
+ const CloseIconButton = forwardRef<HTMLButtonElement, CloseIconButtonProps>((props, forwardedRef) => {
138
+ return (
139
+ <CardIconBlock padding>
140
+ <Toolbar.CloseIconButton {...props} ref={forwardedRef} />
141
+ </CardIconBlock>
142
+ );
143
+ });
144
+
145
+ CloseIconButton.displayName = CARD_CLOSE_ICON_BUTTON_NAME;
146
+
147
+ //
148
+ // Menu
149
+ //
150
+
151
+ const CARD_MENU_NAME = 'Card.Menu';
152
+
153
+ type CardMenuItem<T extends any | void = void> = ToolbarMenuItem<T>;
154
+
155
+ type CardMenuProps<T extends any | void = void> = ToolbarMenuProps<T>;
156
+
157
+ const CardMenu = <T extends any | void = void>({ context, items, ...props }: CardMenuProps<T>) => {
158
+ const { menuItems } = useContext(CardContext) ?? {};
159
+ const combinedItems = [...(items ?? []), ...((menuItems as CardMenuItem<T>[]) ?? [])];
160
+
161
+ return (
162
+ <CardIconBlock padding>
163
+ <Toolbar.Menu {...props} context={context} items={combinedItems} />
164
+ </CardIconBlock>
165
+ );
166
+ };
167
+
168
+ (CardMenu as any).displayName = CARD_MENU_NAME;
169
+
170
+ //
171
+ // Icon
172
+ //
173
+
174
+ const CARD_ICON_NAME = 'Card.Icon';
175
+
176
+ const CardIcon = (props: IconProps) => {
177
+ return (
178
+ <CardIconBlock>
179
+ <Icon {...props} />
180
+ </CardIconBlock>
181
+ );
182
+ };
183
+
184
+ (CardIcon as any).displayName = CARD_ICON_NAME;
185
+
186
+ //
187
+ // IconBlock
188
+ //
189
+
190
+ const CARD_ICON_BLOCK_NAME = 'Card.IconBlock';
191
+
192
+ const CardIconBlock = forwardRef<HTMLDivElement, ThemedClassName<PropsWithChildren<{ padding?: boolean }>>>(
193
+ ({ classNames, children, padding, ...props }, forwardedRef) => {
194
+ const { tx } = useThemeContext();
195
+
196
+ return (
197
+ <div {...props} role='none' className={tx('card.icon-block', { padding }, classNames)} ref={forwardedRef}>
198
+ {children}
199
+ </div>
200
+ );
201
+ },
202
+ );
203
+
204
+ CardIconBlock.displayName = CARD_ICON_BLOCK_NAME;
205
+
206
+ //
207
+ // Title
208
+ //
209
+
210
+ const CARD_TITLE_NAME = 'Card.Title';
211
+
212
+ const CardTitle = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
213
+ const { tx } = useThemeContext();
214
+ const { className, ...rest } = composableProps(props, { role: 'heading' });
215
+ const Comp = asChild ? Slot : Primitive.div;
216
+
217
+ return (
218
+ <Comp {...rest} className={tx('card.title', {}, className)} ref={forwardedRef}>
219
+ {children}
220
+ </Comp>
221
+ );
222
+ });
223
+
224
+ CardTitle.displayName = CARD_TITLE_NAME;
225
+
226
+ //
227
+ // Content
228
+ //
229
+
230
+ const CARD_CONTENT_NAME = 'Card.Content';
231
+
232
+ const CardContent = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
233
+ const { className, ...rest } = composableProps(props);
234
+ const Comp = asChild ? Slot : Primitive.div;
235
+ const { tx } = useThemeContext();
236
+
237
+ return (
238
+ <Comp {...rest} className={tx('card.content', {}, className)} ref={forwardedRef}>
239
+ {children}
240
+ </Comp>
241
+ );
242
+ });
243
+
244
+ CardContent.displayName = CARD_CONTENT_NAME;
245
+
246
+ //
247
+ // Row
248
+ //
249
+
250
+ const CARD_ROW_NAME = 'Card.Row';
251
+
252
+ type CardRowProps = { icon?: string; fullWidth?: boolean };
253
+
254
+ const CardRow = composable<HTMLDivElement, CardRowProps>(({ children, icon, ...props }, forwardedRef) => {
255
+ const { className, ...rest } = composableProps(props);
256
+ const { tx } = useThemeContext();
257
+
258
+ return (
259
+ <Column.Row {...rest} className={tx('card.row', {}, className)} ref={forwardedRef}>
260
+ {(icon && <CardIcon classNames='text-subdued' icon={icon} size={4} />) || <div />}
261
+ {children}
262
+ </Column.Row>
263
+ );
264
+ });
265
+
266
+ CardRow.displayName = CARD_ROW_NAME;
267
+
268
+ //
269
+ // Section
270
+ //
271
+
272
+ const CARD_SECTION_NAME = 'Card.Section';
273
+
274
+ /**
275
+ * @deprecated Merge with Card.Row fullWidth
276
+ */
277
+ const CardSection = slottable<HTMLDivElement>(({ children, asChild, role, ...props }, forwardedRef) => {
278
+ const { className, ...rest } = composableProps(props);
279
+ const Comp = asChild ? Slot : Primitive.div;
280
+
281
+ return (
282
+ <Comp {...rest} role={role ?? 'none'} className={mx('col-span-full', className)} ref={forwardedRef}>
283
+ {children}
284
+ </Comp>
285
+ );
286
+ });
287
+
288
+ CardSection.displayName = CARD_SECTION_NAME;
289
+
290
+ //
291
+ // Heading
292
+ //
293
+
294
+ const CARD_HEADING_NAME = 'Card.Heading';
295
+
296
+ type CardHeadingProps = { variant?: 'default' | 'subtitle' };
297
+
298
+ /**
299
+ * @deprecated Use typography.
300
+ */
301
+ const CardHeading = slottable<HTMLDivElement, CardHeadingProps>(
302
+ ({ children, asChild, role, variant = 'default', ...props }, forwardedRef) => {
303
+ const { className, ...rest } = composableProps(props);
304
+ const Comp = asChild ? Slot : Primitive.div;
305
+ const { tx } = useThemeContext();
306
+
307
+ return (
308
+ <Comp
309
+ {...rest}
310
+ role={role ?? 'heading'}
311
+ className={tx('card.heading', { variant }, className)}
312
+ ref={forwardedRef}
313
+ >
314
+ {children}
315
+ </Comp>
316
+ );
317
+ },
318
+ );
319
+
320
+ CardHeading.displayName = CARD_HEADING_NAME;
321
+
322
+ //
323
+ // Text
324
+ //
325
+
326
+ const CARD_TEXT_NAME = 'Card.Text';
327
+
328
+ type CardTextProps = { truncate?: boolean; variant?: 'default' | 'description' };
329
+
330
+ const CardText = slottable<HTMLDivElement, CardTextProps>(
331
+ ({ children, asChild, role, truncate, variant = 'default', ...props }, forwardedRef) => {
332
+ const { className, ...rest } = composableProps(props);
333
+ const Comp = asChild ? Slot : Primitive.div;
334
+ const { tx } = useThemeContext();
335
+
336
+ return (
337
+ <Comp {...rest} role={role ?? 'none'} className={tx('card.text', { variant }, className)} ref={forwardedRef}>
338
+ <span className={tx('card.text-span', { variant, truncate })}>{children}</span>
339
+ </Comp>
340
+ );
341
+ },
342
+ );
343
+
344
+ CardText.displayName = CARD_TEXT_NAME;
345
+
346
+ //
347
+ // Html
348
+ //
349
+
350
+ const CARD_HTML_NAME = 'Card.Html';
351
+
352
+ type CardHtmlProps = { html: string; variant?: 'default' | 'description' };
353
+
354
+ /**
355
+ * Renders sanitized HTML content inside a card text slot.
356
+ * Uses DOMPurify to prevent XSS from untrusted markup (e.g. RSS feed content).
357
+ */
358
+ const CardHtml = ({ html, variant = 'default', ...props }: CardHtmlProps & ThemedClassName<object>) => {
359
+ const { tx } = useThemeContext();
360
+ const sanitized = useMemo(() => DOMPurify.sanitize(html), [html]);
361
+
362
+ return (
363
+ <div
364
+ {...props}
365
+ role='none'
366
+ className={tx('card.text', { variant })}
367
+ // eslint-disable-next-line react/no-danger
368
+ dangerouslySetInnerHTML={{ __html: sanitized }}
369
+ />
370
+ );
371
+ };
372
+
373
+ (CardHtml as any).displayName = CARD_HTML_NAME;
374
+
375
+ //
376
+ // Poster
377
+ //
378
+
379
+ const CARD_POSTER_NAME = 'Card.Poster';
380
+
381
+ type CardPosterProps = ThemedClassName<
382
+ {
383
+ alt: string;
384
+ aspect?: 'video' | 'auto';
385
+ } & Partial<{ image: string; icon: string }>
386
+ >;
387
+
388
+ const CardPoster = (props: CardPosterProps) => {
389
+ const { tx } = useThemeContext();
390
+ const aspect = props.aspect === 'auto' ? 'aspect-auto' : 'aspect-video';
391
+
392
+ if (props.image) {
393
+ return (
394
+ <div role='none' className='col-span-full mb-1'>
395
+ <Image classNames={[tx('card.poster', {}), aspect, props.classNames]} src={props.image} alt={props.alt} />
396
+ </div>
397
+ );
398
+ }
399
+
400
+ if (props.icon) {
401
+ return (
402
+ <div role='image' className={tx('card.poster-icon', {}, [aspect, props.classNames])} aria-label={props.alt}>
403
+ <Icon icon={props.icon} size={10} />
404
+ </div>
405
+ );
406
+ }
407
+ };
408
+
409
+ (CardPoster as any).displayName = CARD_POSTER_NAME;
410
+
411
+ //
412
+ // Action
413
+ //
414
+
415
+ const CARD_ACTION_NAME = 'Card.Action';
416
+
417
+ type CardActionProps = { icon?: string; label: string; actionIcon?: string; onClick?: () => void };
418
+
419
+ const CardAction = ({ icon, actionIcon = 'ph--arrow-right--regular', label, onClick }: CardActionProps) => {
420
+ const { tx } = useThemeContext();
421
+ return (
422
+ <Button variant='ghost' classNames={tx('card.action', {})} onClick={onClick}>
423
+ {icon ? <CardIcon classNames='text-subdued' icon={icon} size={4} /> : <div />}
424
+ <span className={tx('card.action-label', {}, !actionIcon ? 'col-span-2' : undefined)}>{label}</span>
425
+ {actionIcon && <CardIcon icon={actionIcon} size={4} />}
426
+ </Button>
427
+ );
428
+ };
429
+
430
+ (CardAction as any).displayName = CARD_ACTION_NAME;
431
+
432
+ //
433
+ // Link
434
+ //
435
+
436
+ const CARD_LINK_NAME = 'Card.Link';
437
+
438
+ type CardLinkProps = { label: string; href: string };
439
+
440
+ const CardLink = ({ label, href }: CardLinkProps) => {
441
+ const { tx } = useThemeContext();
442
+ return (
443
+ <a className={tx('card.link', {})} data-variant='ghost' href={href} target='_blank' rel='noreferrer'>
444
+ <CardIcon classNames='text-subdued' icon='ph--link--regular' />
445
+ <span className={tx('card.link-label', {})}>{label}</span>
446
+ <CardIcon classNames='invisible group-hover:visible' icon='ph--arrow-square-out--regular' />
447
+ </a>
448
+ );
449
+ };
450
+
451
+ (CardLink as any).displayName = CARD_LINK_NAME;
452
+
453
+ //
454
+ // Card
455
+ //
456
+
457
+ export const Card = {
458
+ Root: CardRoot,
459
+
460
+ // Toolbar
461
+ Toolbar: CardToolbar,
462
+ ToolbarIconButton: Toolbar.IconButton,
463
+ ToolbarSeparator: Toolbar.Separator,
464
+
465
+ // Toolbar blocks
466
+ IconBlock: CardIconBlock,
467
+ DragHandle: CardDragHandle,
468
+ CloseIconButton: CloseIconButton,
469
+ Menu: CardMenu,
470
+ Icon: CardIcon,
471
+ Title: CardTitle,
472
+
473
+ // Content
474
+ Content: CardContent,
475
+ Row: CardRow,
476
+ Section: CardSection,
477
+ Heading: CardHeading,
478
+ Text: CardText,
479
+ Html: CardHtml,
480
+ Poster: CardPoster,
481
+ Action: CardAction,
482
+ Link: CardLink,
483
+ };
484
+
485
+ export type {
486
+ CardContextValue,
487
+ CardRootProps,
488
+ CardToolbarProps,
489
+ CardDragHandleProps,
490
+ CloseIconButtonProps,
491
+ CardMenuProps,
492
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ export * from './Card';