@dxos/react-ui 0.8.4-main.d05539e30a → 0.8.4-main.d9fc60f731

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 (375) hide show
  1. package/dist/lib/browser/chunk-5SPBSIWS.mjs +33 -0
  2. package/dist/lib/browser/chunk-5SPBSIWS.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-KVJDKHLF.mjs +1613 -0
  4. package/dist/lib/browser/chunk-KVJDKHLF.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +2403 -1562
  6. package/dist/lib/browser/index.mjs.map +4 -4
  7. package/dist/lib/browser/meta.json +1 -1
  8. package/dist/lib/browser/testing/index.mjs +9 -6
  9. package/dist/lib/browser/testing/index.mjs.map +3 -3
  10. package/dist/lib/browser/translations.mjs +1 -1
  11. package/dist/lib/node-esm/chunk-5JYHWJDZ.mjs +1615 -0
  12. package/dist/lib/node-esm/chunk-5JYHWJDZ.mjs.map +7 -0
  13. package/dist/lib/node-esm/{chunk-XCFLA74M.mjs → chunk-FPVTVXND.mjs} +11 -2
  14. package/dist/lib/node-esm/chunk-FPVTVXND.mjs.map +7 -0
  15. package/dist/lib/node-esm/index.mjs +2403 -1562
  16. package/dist/lib/node-esm/index.mjs.map +4 -4
  17. package/dist/lib/node-esm/meta.json +1 -1
  18. package/dist/lib/node-esm/testing/index.mjs +9 -6
  19. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  20. package/dist/lib/node-esm/translations.mjs +1 -1
  21. package/dist/types/src/components/Avatars/Avatar.theme.d.ts +11 -0
  22. package/dist/types/src/components/Avatars/Avatar.theme.d.ts.map +1 -0
  23. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts +5 -1
  24. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  25. package/dist/types/src/components/Breadcrumb/Breadcrumb.theme.d.ts +4 -0
  26. package/dist/types/src/components/Breadcrumb/Breadcrumb.theme.d.ts.map +1 -0
  27. package/dist/types/src/components/Button/Button.d.ts +1 -1
  28. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  29. package/dist/types/src/components/Button/Button.theme.d.ts +11 -0
  30. package/dist/types/src/components/Button/Button.theme.d.ts.map +1 -0
  31. package/dist/types/src/components/Button/IconButton.stories.d.ts +1 -0
  32. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
  33. package/dist/types/src/components/Button/IconButton.theme.d.ts +8 -0
  34. package/dist/types/src/components/Button/IconButton.theme.d.ts.map +1 -0
  35. package/dist/types/src/components/Calendar/Calendar.d.ts +33 -0
  36. package/dist/types/src/components/Calendar/Calendar.d.ts.map +1 -0
  37. package/dist/types/src/components/Calendar/Calendar.stories.d.ts +9 -0
  38. package/dist/types/src/components/Calendar/Calendar.stories.d.ts.map +1 -0
  39. package/dist/types/src/components/Calendar/Calendar.theme.d.ts +4 -0
  40. package/dist/types/src/components/Calendar/Calendar.theme.d.ts.map +1 -0
  41. package/dist/types/src/components/Calendar/index.d.ts +2 -0
  42. package/dist/types/src/components/Calendar/index.d.ts.map +1 -0
  43. package/dist/types/src/components/Card/Card.d.ts +51 -44
  44. package/dist/types/src/components/Card/Card.d.ts.map +1 -1
  45. package/dist/types/src/components/Card/Card.stories.d.ts +1 -0
  46. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -1
  47. package/dist/types/src/components/Card/Card.theme.d.ts +12 -0
  48. package/dist/types/src/components/Card/Card.theme.d.ts.map +1 -0
  49. package/dist/types/src/components/Carousel/Carousel.d.ts +2 -6
  50. package/dist/types/src/components/Carousel/Carousel.d.ts.map +1 -1
  51. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  52. package/dist/types/src/components/Clipboard/index.d.ts +1 -1
  53. package/dist/types/src/{primitives → components}/Column/Column.d.ts.map +1 -1
  54. package/dist/types/src/{primitives → components}/Column/Column.stories.d.ts.map +1 -1
  55. package/dist/types/src/components/Column/Column.theme.d.ts +9 -0
  56. package/dist/types/src/components/Column/Column.theme.d.ts.map +1 -0
  57. package/dist/types/src/components/Column/index.d.ts +3 -0
  58. package/dist/types/src/components/Column/index.d.ts.map +1 -0
  59. package/dist/types/src/components/Column/withColumn.d.ts +21 -0
  60. package/dist/types/src/components/Column/withColumn.d.ts.map +1 -0
  61. package/dist/types/src/components/DatePicker/DatePicker.d.ts +72 -0
  62. package/dist/types/src/components/DatePicker/DatePicker.d.ts.map +1 -0
  63. package/dist/types/src/components/DatePicker/DatePicker.stories.d.ts +10 -0
  64. package/dist/types/src/components/DatePicker/DatePicker.stories.d.ts.map +1 -0
  65. package/dist/types/src/components/DatePicker/DatePicker.theme.d.ts +6 -0
  66. package/dist/types/src/components/DatePicker/DatePicker.theme.d.ts.map +1 -0
  67. package/dist/types/src/components/DatePicker/index.d.ts +2 -0
  68. package/dist/types/src/components/DatePicker/index.d.ts.map +1 -0
  69. package/dist/types/src/components/Dialog/AlertDialog.d.ts +8 -8
  70. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  71. package/dist/types/src/components/Dialog/Dialog.d.ts +9 -7
  72. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  73. package/dist/types/src/components/Dialog/Dialog.theme.d.ts +10 -0
  74. package/dist/types/src/components/Dialog/Dialog.theme.d.ts.map +1 -0
  75. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -1
  76. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -1
  77. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -1
  78. package/dist/types/src/components/Focus/Focus.theme.d.ts +6 -0
  79. package/dist/types/src/components/Focus/Focus.theme.d.ts.map +1 -0
  80. package/dist/types/src/components/Icon/Icon.theme.d.ts +11 -0
  81. package/dist/types/src/components/Icon/Icon.theme.d.ts.map +1 -0
  82. package/dist/types/src/components/Icon/IconBlock.d.ts +15 -0
  83. package/dist/types/src/components/Icon/IconBlock.d.ts.map +1 -0
  84. package/dist/types/src/components/Icon/index.d.ts +1 -0
  85. package/dist/types/src/components/Icon/index.d.ts.map +1 -1
  86. package/dist/types/src/components/Input/Input.d.ts +81 -3
  87. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  88. package/dist/types/src/components/Input/Input.stories.d.ts +14 -3
  89. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  90. package/dist/types/src/components/Input/Input.theme.d.ts +115 -0
  91. package/dist/types/src/components/Input/Input.theme.d.ts.map +1 -0
  92. package/dist/types/src/components/Input/SegmentedInput.d.ts +79 -0
  93. package/dist/types/src/components/Input/SegmentedInput.d.ts.map +1 -0
  94. package/dist/types/src/components/Input/constants.d.ts +2 -0
  95. package/dist/types/src/components/Input/constants.d.ts.map +1 -0
  96. package/dist/types/src/components/Input/index.d.ts +2 -0
  97. package/dist/types/src/components/Input/index.d.ts.map +1 -1
  98. package/dist/types/src/components/Link/Link.theme.d.ts +6 -0
  99. package/dist/types/src/components/Link/Link.theme.d.ts.map +1 -0
  100. package/dist/types/src/components/List/List.d.ts.map +1 -1
  101. package/dist/types/src/components/List/List.theme.d.ts +7 -0
  102. package/dist/types/src/components/List/List.theme.d.ts.map +1 -0
  103. package/dist/types/src/components/List/Treegrid.d.ts +1 -1
  104. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  105. package/dist/types/src/components/List/Treegrid.theme.d.ts +7 -0
  106. package/dist/types/src/components/List/Treegrid.theme.d.ts.map +1 -0
  107. package/dist/types/src/components/Main/Main.d.ts +2 -2
  108. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  109. package/dist/types/src/components/Main/Main.theme.d.ts +20 -0
  110. package/dist/types/src/components/Main/Main.theme.d.ts.map +1 -0
  111. package/dist/types/src/components/Main/constants.d.ts +3 -0
  112. package/dist/types/src/components/Main/constants.d.ts.map +1 -0
  113. package/dist/types/src/components/Main/index.d.ts +1 -0
  114. package/dist/types/src/components/Main/index.d.ts.map +1 -1
  115. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +9 -12
  116. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -1
  117. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts +1 -1
  118. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -1
  119. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
  120. package/dist/types/src/components/Menu/Menu.theme.d.ts +7 -0
  121. package/dist/types/src/components/Menu/Menu.theme.d.ts.map +1 -0
  122. package/dist/types/src/components/Message/Message.d.ts +2 -2
  123. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  124. package/dist/types/src/components/Message/Message.stories.d.ts +5 -1
  125. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  126. package/dist/types/src/components/Message/Message.theme.d.ts +7 -0
  127. package/dist/types/src/components/Message/Message.theme.d.ts.map +1 -0
  128. package/dist/types/src/{primitives → components}/Panel/Panel.d.ts +1 -1
  129. package/dist/types/src/components/Panel/Panel.d.ts.map +1 -0
  130. package/dist/types/src/{primitives → components}/Panel/Panel.stories.d.ts.map +1 -1
  131. package/dist/types/src/components/Panel/Panel.theme.d.ts +13 -0
  132. package/dist/types/src/components/Panel/Panel.theme.d.ts.map +1 -0
  133. package/dist/types/src/components/Panel/index.d.ts.map +1 -0
  134. package/dist/types/src/components/Popover/Popover.theme.d.ts +8 -0
  135. package/dist/types/src/components/Popover/Popover.theme.d.ts.map +1 -0
  136. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  137. package/dist/types/src/components/ScrollArea/ScrollArea.theme.d.ts +17 -0
  138. package/dist/types/src/components/ScrollArea/ScrollArea.theme.d.ts.map +1 -0
  139. package/dist/types/src/components/ScrollArea/index.d.ts +1 -0
  140. package/dist/types/src/components/ScrollArea/index.d.ts.map +1 -1
  141. package/dist/types/src/components/ScrollArea/scrollbar.d.ts +18 -0
  142. package/dist/types/src/components/ScrollArea/scrollbar.d.ts.map +1 -0
  143. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +13 -19
  144. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  145. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  146. package/dist/types/src/components/Select/Select.theme.d.ts +6 -0
  147. package/dist/types/src/components/Select/Select.theme.d.ts.map +1 -0
  148. package/dist/types/src/components/Separator/Separator.theme.d.ts +7 -0
  149. package/dist/types/src/components/Separator/Separator.theme.d.ts.map +1 -0
  150. package/dist/types/src/components/Skeleton/Skeleton.theme.d.ts +6 -0
  151. package/dist/types/src/components/Skeleton/Skeleton.theme.d.ts.map +1 -0
  152. package/dist/types/src/components/Splitter/Splitter.d.ts +3 -5
  153. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -1
  154. package/dist/types/src/components/Splitter/Splitter.theme.d.ts +4 -0
  155. package/dist/types/src/components/Splitter/Splitter.theme.d.ts.map +1 -0
  156. package/dist/types/src/components/Status/Status.d.ts +1 -1
  157. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  158. package/dist/types/src/components/Status/Status.theme.d.ts +7 -0
  159. package/dist/types/src/components/Status/Status.theme.d.ts.map +1 -0
  160. package/dist/types/src/components/Tag/Tag.theme.d.ts +6 -0
  161. package/dist/types/src/components/Tag/Tag.theme.d.ts.map +1 -0
  162. package/dist/types/src/components/Toast/Toast.d.ts +13 -10
  163. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  164. package/dist/types/src/components/Toast/Toast.stories.d.ts +5 -2
  165. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  166. package/dist/types/src/components/Toast/Toast.theme.d.ts +4 -0
  167. package/dist/types/src/components/Toast/Toast.theme.d.ts.map +1 -0
  168. package/dist/types/src/components/Toolbar/Toolbar.d.ts +19 -7
  169. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  170. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts +8 -0
  171. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts.map +1 -0
  172. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  173. package/dist/types/src/components/Tooltip/Tooltip.theme.d.ts +6 -0
  174. package/dist/types/src/components/Tooltip/Tooltip.theme.d.ts.map +1 -0
  175. package/dist/types/src/components/Tooltip/index.d.ts +1 -0
  176. package/dist/types/src/components/Tooltip/index.d.ts.map +1 -1
  177. package/dist/types/src/components/Tooltip/tooltipContent.d.ts +4 -0
  178. package/dist/types/src/components/Tooltip/tooltipContent.d.ts.map +1 -0
  179. package/dist/types/src/components/index.d.ts +5 -4
  180. package/dist/types/src/components/index.d.ts.map +1 -1
  181. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -1
  182. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -1
  183. package/dist/types/src/hooks/useTranslationsContext.d.ts +1 -1
  184. package/dist/types/src/index.d.ts +1 -0
  185. package/dist/types/src/index.d.ts.map +1 -1
  186. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  187. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -1
  188. package/dist/types/src/{components → primitives}/DensityProvider/DensityProvider.d.ts.map +1 -1
  189. package/dist/types/src/primitives/DensityProvider/index.d.ts.map +1 -0
  190. package/dist/types/src/{components → primitives}/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  191. package/dist/types/src/primitives/ElevationProvider/index.d.ts.map +1 -0
  192. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -1
  193. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -1
  194. package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  195. package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -1
  196. package/dist/types/src/{components → primitives}/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  197. package/dist/types/src/{components → primitives}/ThemeProvider/index.d.ts +1 -1
  198. package/dist/types/src/primitives/ThemeProvider/index.d.ts.map +1 -0
  199. package/dist/types/src/primitives/index.d.ts +3 -2
  200. package/dist/types/src/primitives/index.d.ts.map +1 -1
  201. package/dist/types/src/testing/decorators/withTheme.d.ts +5 -1
  202. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  203. package/dist/types/src/theme/bindTheme.d.ts +3 -0
  204. package/dist/types/src/theme/bindTheme.d.ts.map +1 -0
  205. package/dist/types/src/theme/defaultTheme.d.ts +4 -0
  206. package/dist/types/src/theme/defaultTheme.d.ts.map +1 -0
  207. package/dist/types/src/theme/index.d.ts +31 -0
  208. package/dist/types/src/theme/index.d.ts.map +1 -0
  209. package/dist/types/src/translations.d.ts +9 -0
  210. package/dist/types/src/translations.d.ts.map +1 -1
  211. package/dist/types/src/util/index.d.ts +2 -1
  212. package/dist/types/src/util/index.d.ts.map +1 -1
  213. package/dist/types/src/util/mobile.d.ts +5 -0
  214. package/dist/types/src/util/mobile.d.ts.map +1 -0
  215. package/dist/types/src/util/slots.d.ts +57 -0
  216. package/dist/types/src/util/slots.d.ts.map +1 -0
  217. package/dist/types/src/util/usePx.d.ts.map +1 -1
  218. package/dist/types/tsconfig.tsbuildinfo +1 -1
  219. package/package.json +19 -17
  220. package/src/components/Avatars/Avatar.theme.ts +93 -0
  221. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -1
  222. package/src/components/Breadcrumb/Breadcrumb.theme.ts +26 -0
  223. package/src/components/Breadcrumb/Breadcrumb.tsx +14 -2
  224. package/src/components/Button/Button.theme.ts +31 -0
  225. package/src/components/Button/Button.tsx +1 -1
  226. package/src/components/Button/IconButton.stories.tsx +50 -2
  227. package/src/components/Button/IconButton.theme.ts +21 -0
  228. package/src/components/Calendar/Calendar.stories.tsx +43 -0
  229. package/src/components/Calendar/Calendar.theme.ts +74 -0
  230. package/src/components/Calendar/Calendar.tsx +196 -0
  231. package/src/components/Calendar/index.ts +5 -0
  232. package/src/components/Card/Card.stories.tsx +40 -19
  233. package/src/components/Card/Card.theme.ts +93 -0
  234. package/src/components/Card/Card.tsx +121 -147
  235. package/src/components/Carousel/Carousel.tsx +2 -10
  236. package/src/components/Clipboard/CopyButton.tsx +1 -1
  237. package/src/{primitives → components}/Column/Column.stories.tsx +1 -1
  238. package/src/components/Column/Column.theme.ts +48 -0
  239. package/src/{primitives → components}/Column/Column.tsx +2 -1
  240. package/src/{primitives → components}/Column/index.ts +1 -0
  241. package/src/components/Column/withColumn.ts +27 -0
  242. package/src/components/DatePicker/DatePicker.stories.tsx +102 -0
  243. package/src/components/DatePicker/DatePicker.theme.ts +35 -0
  244. package/src/components/DatePicker/DatePicker.tsx +279 -0
  245. package/src/components/DatePicker/index.ts +5 -0
  246. package/src/components/Dialog/AlertDialog.tsx +12 -13
  247. package/src/components/Dialog/Dialog.stories.tsx +2 -2
  248. package/src/components/Dialog/Dialog.theme.ts +61 -0
  249. package/src/components/Dialog/Dialog.tsx +46 -17
  250. package/src/components/ErrorFallback/ErrorFallback.tsx +14 -8
  251. package/src/components/ErrorFallback/ErrorStack.tsx +12 -6
  252. package/src/components/Focus/Focus.theme.ts +32 -0
  253. package/src/components/Focus/Focus.tsx +1 -1
  254. package/src/components/Icon/Icon.theme.ts +45 -0
  255. package/src/components/Icon/IconBlock.tsx +38 -0
  256. package/src/components/Icon/index.ts +1 -0
  257. package/src/components/Image/Image.stories.tsx +1 -1
  258. package/src/components/Input/Input.stories.tsx +132 -29
  259. package/src/components/Input/Input.theme.ts +191 -0
  260. package/src/components/Input/Input.tsx +207 -2
  261. package/src/components/Input/SegmentedInput.tsx +454 -0
  262. package/src/components/Input/constants.ts +5 -0
  263. package/src/components/Input/index.ts +2 -0
  264. package/src/components/Link/Link.theme.ts +16 -0
  265. package/src/components/List/List.theme.ts +47 -0
  266. package/src/components/List/List.tsx +2 -2
  267. package/src/components/List/ListDropIndicator.tsx +1 -1
  268. package/src/components/List/TreeDropIndicator.tsx +3 -3
  269. package/src/components/List/Treegrid.theme.ts +35 -0
  270. package/src/components/List/Treegrid.tsx +3 -4
  271. package/src/components/Main/Main.theme.ts +29 -0
  272. package/src/components/Main/Main.tsx +9 -7
  273. package/src/components/Main/constants.ts +6 -0
  274. package/src/components/Main/index.ts +1 -0
  275. package/src/components/MediaPlayer/MediaPlayer.tsx +61 -36
  276. package/src/components/Menu/ContextMenu.stories.tsx +0 -3
  277. package/src/components/Menu/DropdownMenu.stories.tsx +0 -3
  278. package/src/components/Menu/DropdownMenu.tsx +15 -15
  279. package/src/components/Menu/Menu.theme.ts +48 -0
  280. package/src/components/Message/Message.stories.tsx +42 -4
  281. package/src/components/Message/Message.theme.ts +44 -0
  282. package/src/components/Message/Message.tsx +63 -20
  283. package/src/{primitives → components}/Panel/Panel.stories.tsx +2 -3
  284. package/src/components/Panel/Panel.theme.ts +42 -0
  285. package/src/{primitives → components}/Panel/Panel.tsx +2 -1
  286. package/src/components/Popover/Popover.theme.ts +40 -0
  287. package/src/components/Popover/Popover.tsx +7 -7
  288. package/src/components/ScrollArea/ScrollArea.stories.tsx +1 -1
  289. package/src/components/ScrollArea/ScrollArea.theme.ts +107 -0
  290. package/src/components/ScrollArea/ScrollArea.tsx +3 -2
  291. package/src/components/ScrollArea/index.ts +1 -0
  292. package/src/components/ScrollArea/scrollbar.ts +21 -0
  293. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +1 -1
  294. package/src/components/ScrollContainer/ScrollContainer.tsx +57 -55
  295. package/src/components/Select/Select.theme.ts +55 -0
  296. package/src/components/Select/Select.tsx +26 -10
  297. package/src/components/Separator/Separator.theme.ts +23 -0
  298. package/src/components/Skeleton/Skeleton.theme.ts +22 -0
  299. package/src/components/Splitter/Splitter.stories.tsx +1 -1
  300. package/src/components/Splitter/Splitter.theme.ts +18 -0
  301. package/src/components/Splitter/Splitter.tsx +10 -15
  302. package/src/components/Status/Status.theme.ts +31 -0
  303. package/src/components/Status/Status.tsx +1 -2
  304. package/src/components/Tag/Tag.theme.ts +22 -0
  305. package/src/components/Toast/Toast.stories.tsx +41 -20
  306. package/src/components/Toast/Toast.theme.ts +56 -0
  307. package/src/components/Toast/Toast.tsx +95 -27
  308. package/src/components/Toolbar/Toolbar.theme.ts +36 -0
  309. package/src/components/Toolbar/Toolbar.tsx +63 -13
  310. package/src/components/Tooltip/Tooltip.stories.tsx +0 -9
  311. package/src/components/Tooltip/Tooltip.theme.ts +19 -0
  312. package/src/components/Tooltip/Tooltip.tsx +4 -4
  313. package/src/components/Tooltip/index.ts +1 -0
  314. package/src/components/Tooltip/tooltipContent.ts +16 -0
  315. package/src/components/index.ts +5 -5
  316. package/src/exemplars/generics.stories.tsx +1 -2
  317. package/src/exemplars/slot.stories.tsx +2 -1
  318. package/src/hooks/useDensityContext.ts +1 -1
  319. package/src/hooks/useElevationContext.ts +1 -1
  320. package/src/hooks/useThemeContext.ts +1 -1
  321. package/src/hooks/useTranslationsContext.ts +1 -1
  322. package/src/index.ts +1 -0
  323. package/src/playground/Custom.stories.tsx +12 -32
  324. package/src/primitives/Container/Container.tsx +3 -1
  325. package/src/{components → primitives}/DensityProvider/DensityProvider.tsx +1 -1
  326. package/src/primitives/Flex/Flex.tsx +3 -1
  327. package/src/primitives/Grid/Grid.tsx +3 -1
  328. package/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.tsx +1 -1
  329. package/src/{components → primitives}/ThemeProvider/ThemeProvider.tsx +1 -1
  330. package/src/{components → primitives}/ThemeProvider/index.ts +1 -1
  331. package/src/primitives/index.ts +4 -2
  332. package/src/testing/decorators/withLayoutVariants.tsx +1 -1
  333. package/src/testing/decorators/withTheme.tsx +21 -13
  334. package/src/theme/bindTheme.ts +13 -0
  335. package/src/theme/defaultTheme.ts +83 -0
  336. package/src/theme/index.ts +37 -0
  337. package/src/translations.ts +9 -0
  338. package/src/util/index.ts +2 -1
  339. package/src/util/mobile.ts +11 -0
  340. package/src/util/slots.ts +129 -0
  341. package/src/util/usePx.ts +4 -1
  342. package/dist/lib/browser/chunk-A5QCIG5R.mjs +0 -24
  343. package/dist/lib/browser/chunk-A5QCIG5R.mjs.map +0 -7
  344. package/dist/lib/browser/chunk-LY5XDQR5.mjs +0 -846
  345. package/dist/lib/browser/chunk-LY5XDQR5.mjs.map +0 -7
  346. package/dist/lib/node-esm/chunk-NGKLIKP3.mjs +0 -848
  347. package/dist/lib/node-esm/chunk-NGKLIKP3.mjs.map +0 -7
  348. package/dist/lib/node-esm/chunk-XCFLA74M.mjs.map +0 -7
  349. package/dist/types/src/components/DensityProvider/index.d.ts.map +0 -1
  350. package/dist/types/src/components/ElevationProvider/index.d.ts.map +0 -1
  351. package/dist/types/src/components/ThemeProvider/index.d.ts.map +0 -1
  352. package/dist/types/src/primitives/Column/index.d.ts +0 -2
  353. package/dist/types/src/primitives/Column/index.d.ts.map +0 -1
  354. package/dist/types/src/primitives/Panel/Panel.d.ts.map +0 -1
  355. package/dist/types/src/primitives/Panel/index.d.ts.map +0 -1
  356. package/dist/types/src/util/hasIosKeyboard.d.ts +0 -2
  357. package/dist/types/src/util/hasIosKeyboard.d.ts.map +0 -1
  358. package/src/util/hasIosKeyboard.ts +0 -8
  359. /package/dist/types/src/{primitives → components}/Column/Column.d.ts +0 -0
  360. /package/dist/types/src/{primitives → components}/Column/Column.stories.d.ts +0 -0
  361. /package/dist/types/src/{primitives → components}/Panel/Panel.stories.d.ts +0 -0
  362. /package/dist/types/src/{primitives → components}/Panel/index.d.ts +0 -0
  363. /package/dist/types/src/{components → primitives}/DensityProvider/DensityProvider.d.ts +0 -0
  364. /package/dist/types/src/{components → primitives}/DensityProvider/index.d.ts +0 -0
  365. /package/dist/types/src/{components → primitives}/ElevationProvider/ElevationProvider.d.ts +0 -0
  366. /package/dist/types/src/{components → primitives}/ElevationProvider/index.d.ts +0 -0
  367. /package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.d.ts +0 -0
  368. /package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.d.ts +0 -0
  369. /package/dist/types/src/{components → primitives}/ThemeProvider/TranslationsProvider.d.ts +0 -0
  370. /package/src/{primitives → components}/Column/AUDIT.md +0 -0
  371. /package/src/{primitives → components}/Panel/index.ts +0 -0
  372. /package/src/{components → primitives}/DensityProvider/index.ts +0 -0
  373. /package/src/{components → primitives}/ElevationProvider/ElevationProvider.tsx +0 -0
  374. /package/src/{components → primitives}/ElevationProvider/index.ts +0 -0
  375. /package/src/{components → primitives}/ThemeProvider/TranslationsProvider.tsx +0 -0
@@ -5,47 +5,26 @@
5
5
  import { Primitive } from '@radix-ui/react-primitive';
6
6
  import { Slot } from '@radix-ui/react-slot';
7
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';
8
+ import React, { CSSProperties, JSX, MouseEventHandler, type ReactNode, forwardRef, useId, useMemo } from 'react';
9
+
10
+ import { iconSize } from '@dxos/ui-theme';
19
11
  import { type Density } from '@dxos/ui-types';
20
12
 
21
13
  import { useThemeContext } from '../../hooks';
22
- import { Column } from '../../primitives';
14
+ import { composable, composableProps, slottable } from '../../util';
23
15
  import { type ThemedClassName } from '../../util';
24
16
  import { Button } from '../Button';
25
- import { Icon, type IconProps } from '../Icon';
17
+ import { Column } from '../Column';
18
+ import { Icon, IconBlock, type IconBlockProps, type IconProps } from '../Icon';
26
19
  import { Image } from '../Image';
27
20
  import {
28
21
  Toolbar,
29
- ToolbarCloseIconButtonProps,
22
+ type ToolbarActionIconButtonProps,
30
23
  ToolbarDragHandleProps,
31
- type ToolbarMenuItem,
32
24
  type ToolbarMenuProps,
33
25
  type ToolbarRootProps,
34
26
  } from '../Toolbar';
35
27
 
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
28
  //
50
29
  // Root
51
30
  //
@@ -83,7 +62,7 @@ const CardRoot = composable<HTMLDivElement, CardRootProps>(
83
62
  return (
84
63
  <Column.Root
85
64
  asChild
86
- gutter={density === 'coarse' ? 'lg' : 'md'}
65
+ gutter={density === 'lg' ? 'lg' : density === 'sm' || density === 'xs' ? 'sm' : 'md'}
87
66
  classNames={tx('card.root', { border, fullWidth }, className)}
88
67
  role={role ?? 'group'}
89
68
  >
@@ -98,24 +77,29 @@ const CardRoot = composable<HTMLDivElement, CardRootProps>(
98
77
  CardRoot.displayName = CARD_ROOT_NAME;
99
78
 
100
79
  //
101
- // Toolbar
80
+ // Header
102
81
  //
103
82
 
104
- const CARD_TOOLBAR_NAME = 'Card.Toolbar';
83
+ const CARD_HEADER_NAME = 'Card.Header';
105
84
 
106
- type CardToolbarProps = ToolbarRootProps;
85
+ type CardHeaderProps = ToolbarRootProps;
107
86
 
108
- const CardToolbar = composable<HTMLDivElement, CardToolbarProps>(({ children, classNames, ...props }, forwardedRef) => {
87
+ /**
88
+ * Top "header" slot of a Card. Despite the name, this renders as an ARIA
89
+ * toolbar (`role="toolbar"`) so its action children get keyboard navigation
90
+ * for free — `<header>` is allowed to contain a toolbar.
91
+ */
92
+ const CardHeader = composable<HTMLDivElement, CardHeaderProps>(({ children, classNames, ...props }, forwardedRef) => {
109
93
  const { tx } = useThemeContext();
110
94
 
111
95
  return (
112
- <Toolbar.Root {...props} style={iconSize(5)} classNames={[tx('card.toolbar', {}), classNames]} ref={forwardedRef}>
96
+ <Toolbar.Root {...props} style={iconSize(5)} classNames={[tx('card.header', {}), classNames]} ref={forwardedRef}>
113
97
  {children}
114
98
  </Toolbar.Root>
115
99
  );
116
100
  });
117
101
 
118
- CardToolbar.displayName = CARD_TOOLBAR_NAME;
102
+ CardHeader.displayName = CARD_HEADER_NAME;
119
103
 
120
104
  //
121
105
  // DragHandle
@@ -127,7 +111,7 @@ type CardDragHandleProps = ToolbarDragHandleProps;
127
111
 
128
112
  const CardDragHandle = forwardRef<HTMLButtonElement, CardDragHandleProps>((props, forwardedRef) => {
129
113
  return (
130
- <CardIconBlock padding>
114
+ <CardIconBlock>
131
115
  <Toolbar.DragHandle {...props} ref={forwardedRef} />
132
116
  </CardIconBlock>
133
117
  );
@@ -136,22 +120,22 @@ const CardDragHandle = forwardRef<HTMLButtonElement, CardDragHandleProps>((props
136
120
  CardDragHandle.displayName = CARD_DRAG_HANDLE_NAME;
137
121
 
138
122
  //
139
- // CloseIconButton
123
+ // ActionIconButton
140
124
  //
141
125
 
142
- const CARD_CLOSE_ICON_BUTTON_NAME = 'Card.CloseIconButton';
126
+ const CARD_ACTION_ICON_BUTTON_NAME = 'Card.ActionIconButton';
143
127
 
144
- type CloseIconButtonProps = ToolbarCloseIconButtonProps;
128
+ type CardActionIconButtonProps = ToolbarActionIconButtonProps;
145
129
 
146
- const CloseIconButton = forwardRef<HTMLButtonElement, CloseIconButtonProps>((props, forwardedRef) => {
130
+ const CardActionIconButton = forwardRef<HTMLButtonElement, CardActionIconButtonProps>((props, forwardedRef) => {
147
131
  return (
148
- <CardIconBlock padding>
149
- <Toolbar.CloseIconButton {...props} ref={forwardedRef} />
132
+ <CardIconBlock>
133
+ <Toolbar.ActionIconButton {...props} ref={forwardedRef} />
150
134
  </CardIconBlock>
151
135
  );
152
136
  });
153
137
 
154
- CloseIconButton.displayName = CARD_CLOSE_ICON_BUTTON_NAME;
138
+ CardActionIconButton.displayName = CARD_ACTION_ICON_BUTTON_NAME;
155
139
 
156
140
  //
157
141
  // Menu
@@ -159,22 +143,17 @@ CloseIconButton.displayName = CARD_CLOSE_ICON_BUTTON_NAME;
159
143
 
160
144
  const CARD_MENU_NAME = 'Card.Menu';
161
145
 
162
- type CardMenuItem<T extends any | void = void> = ToolbarMenuItem<T>;
163
-
164
146
  type CardMenuProps<T extends any | void = void> = ToolbarMenuProps<T>;
165
147
 
166
- const CardMenu = <T extends any | void = void>({ context, items, ...props }: CardMenuProps<T>) => {
167
- const { menuItems } = useContext(CardContext) ?? {};
168
- const combinedItems = [...(items ?? []), ...((menuItems as CardMenuItem<T>[]) ?? [])];
169
-
148
+ function CardMenu<T extends any | void = void>({ context, items, ...props }: CardMenuProps<T>) {
170
149
  return (
171
- <CardIconBlock padding>
172
- <Toolbar.Menu {...props} context={context} items={combinedItems} />
150
+ <CardIconBlock>
151
+ <Toolbar.Menu {...props} context={context} items={items ?? []} />
173
152
  </CardIconBlock>
174
153
  );
175
- };
154
+ }
176
155
 
177
- (CardMenu as any).displayName = CARD_MENU_NAME;
156
+ CardMenu.displayName = CARD_MENU_NAME;
178
157
 
179
158
  //
180
159
  // Icon
@@ -182,15 +161,15 @@ const CardMenu = <T extends any | void = void>({ context, items, ...props }: Car
182
161
 
183
162
  const CARD_ICON_NAME = 'Card.Icon';
184
163
 
185
- const CardIcon = (props: IconProps) => {
164
+ function CardIcon(props: IconProps) {
186
165
  return (
187
166
  <CardIconBlock>
188
167
  <Icon {...props} />
189
168
  </CardIconBlock>
190
169
  );
191
- };
170
+ }
192
171
 
193
- (CardIcon as any).displayName = CARD_ICON_NAME;
172
+ CardIcon.displayName = CARD_ICON_NAME;
194
173
 
195
174
  //
196
175
  // IconBlock
@@ -198,17 +177,9 @@ const CardIcon = (props: IconProps) => {
198
177
 
199
178
  const CARD_ICON_BLOCK_NAME = 'Card.IconBlock';
200
179
 
201
- const CardIconBlock = forwardRef<HTMLDivElement, ThemedClassName<PropsWithChildren<{ padding?: boolean }>>>(
202
- ({ classNames, children, padding, ...props }, forwardedRef) => {
203
- const { tx } = useThemeContext();
204
-
205
- return (
206
- <div {...props} className={tx('card.icon-block', { padding }, classNames)} ref={forwardedRef}>
207
- {children}
208
- </div>
209
- );
210
- },
211
- );
180
+ const CardIconBlock = forwardRef<HTMLDivElement, IconBlockProps>((props, forwardedRef) => {
181
+ return <IconBlock {...props} ref={forwardedRef} />;
182
+ });
212
183
 
213
184
  CardIconBlock.displayName = CARD_ICON_BLOCK_NAME;
214
185
 
@@ -233,48 +204,24 @@ const CardTitle = slottable<HTMLDivElement>(({ children, asChild, ...props }, fo
233
204
  CardTitle.displayName = CARD_TITLE_NAME;
234
205
 
235
206
  //
236
- // Content
237
- //
238
-
239
- const CARD_CONTENT_NAME = 'Card.Content';
240
-
241
- const CardContent = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
242
- const { className, ...rest } = composableProps(props);
243
- const Comp = asChild ? Slot : Primitive.div;
244
- const { tx } = useThemeContext();
245
-
246
- return (
247
- <Comp {...rest} className={tx('card.content', {}, className)} ref={forwardedRef}>
248
- {children}
249
- </Comp>
250
- );
251
- });
252
-
253
- CardContent.displayName = CARD_CONTENT_NAME;
254
-
255
- //
256
- // Row
207
+ // Body
257
208
  //
258
209
 
259
- const CARD_ROW_NAME = 'Card.Row';
260
-
261
- type CardRowProps = { icon?: string; fullWidth?: boolean };
210
+ const CARD_BODY_NAME = 'Card.Body';
262
211
 
263
- // TODO(burdon): fullWidth should mean no columns.
264
- const CardRow = slottable<HTMLDivElement, CardRowProps>(({ children, asChild, icon, ...props }, forwardedRef) => {
212
+ const CardBody = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
265
213
  const { className, ...rest } = composableProps(props);
266
214
  const Comp = asChild ? Slot : Primitive.div;
267
215
  const { tx } = useThemeContext();
268
216
 
269
217
  return (
270
- <Comp {...rest} className={tx('card.row', {}, className)} ref={forwardedRef}>
271
- {(icon && <CardIcon classNames='text-subdued' icon={icon} size={4} />) || <div />}
218
+ <Comp {...rest} className={tx('card.body', {}, className)} ref={forwardedRef}>
272
219
  {children}
273
220
  </Comp>
274
221
  );
275
222
  });
276
223
 
277
- CardRow.displayName = CARD_ROW_NAME;
224
+ CardBody.displayName = CARD_BODY_NAME;
278
225
 
279
226
  //
280
227
  // Section
@@ -282,53 +229,81 @@ CardRow.displayName = CARD_ROW_NAME;
282
229
 
283
230
  const CARD_SECTION_NAME = 'Card.Section';
284
231
 
232
+ type CardSectionProps = { title?: ReactNode };
233
+
285
234
  /**
286
- * @deprecated Merge with Card.Row fullWidth
235
+ * A labeled grouping of card content. `display: contents` keeps children aligned
236
+ * to the Card's column grid (like `Card.Body`); when `title` is provided,
237
+ * renders a subheading row at the top and exposes the group with
238
+ * `role='group' aria-labelledby=…` for screen readers.
287
239
  */
288
- const CardSection = slottable<HTMLDivElement>(({ children, asChild, role, ...props }, forwardedRef) => {
289
- const { className, ...rest } = composableProps(props);
290
- const Comp = asChild ? Slot : Primitive.div;
240
+ const CardSection = slottable<HTMLDivElement, CardSectionProps>(
241
+ ({ children, asChild, title, role, ...props }, forwardedRef) => {
242
+ const { className, ...rest } = composableProps(props);
243
+ const Comp = asChild ? Slot : Primitive.div;
244
+ const { tx } = useThemeContext();
245
+ const titleId = useId();
291
246
 
292
- return (
293
- <Comp {...rest} role={role ?? 'none'} className={mx('col-span-full', className)} ref={forwardedRef}>
294
- {children}
295
- </Comp>
296
- );
297
- });
247
+ return (
248
+ <Comp
249
+ {...rest}
250
+ role={role ?? (title ? 'group' : 'none')}
251
+ aria-labelledby={title ? titleId : undefined}
252
+ className={tx('card.section', {}, className)}
253
+ ref={forwardedRef}
254
+ >
255
+ {title && (
256
+ <div id={titleId} className={tx('card.section-title', {})}>
257
+ {title}
258
+ </div>
259
+ )}
260
+ {children}
261
+ </Comp>
262
+ );
263
+ },
264
+ );
298
265
 
299
266
  CardSection.displayName = CARD_SECTION_NAME;
300
267
 
301
268
  //
302
- // Heading
269
+ // Row
303
270
  //
304
271
 
305
- const CARD_HEADING_NAME = 'Card.Heading';
272
+ const CARD_ROW_NAME = 'Card.Row';
306
273
 
307
- type CardHeadingProps = { variant?: 'default' | 'subtitle' };
274
+ type CardRowProps = { icon?: string | JSX.Element; fullWidth?: boolean };
308
275
 
309
276
  /**
310
- * @deprecated Use typography.
277
+ * A row inside a Card.
278
+ * - Default: spans all 3 columns and establishes a subgrid so children align to the Card's columns.
279
+ * An optional `icon` lands in the first column; when omitted, the first column is left empty.
280
+ * - `fullWidth`: spans all columns without a subgrid — children do their own internal layout.
281
+ * The `icon` prop is ignored in this mode.
311
282
  */
312
- const CardHeading = slottable<HTMLDivElement, CardHeadingProps>(
313
- ({ children, asChild, role, variant = 'default', ...props }, forwardedRef) => {
283
+ const CardRow = slottable<HTMLDivElement, CardRowProps>(
284
+ ({ children, asChild, icon: iconProp, fullWidth, ...props }, forwardedRef) => {
285
+ const { tx } = useThemeContext();
314
286
  const { className, ...rest } = composableProps(props);
315
287
  const Comp = asChild ? Slot : Primitive.div;
316
- const { tx } = useThemeContext();
288
+ const icon =
289
+ typeof iconProp === 'string' ? (
290
+ <CardIcon classNames='text-subdued' icon={iconProp as string} size={4} />
291
+ ) : iconProp ? (
292
+ iconProp
293
+ ) : (
294
+ <div />
295
+ );
317
296
 
318
297
  return (
319
- <Comp
320
- {...rest}
321
- role={role ?? 'heading'}
322
- className={tx('card.heading', { variant }, className)}
323
- ref={forwardedRef}
324
- >
298
+ <Comp {...rest} className={tx('card.row', { fullWidth }, className)} ref={forwardedRef}>
299
+ {!fullWidth && icon}
325
300
  {children}
326
301
  </Comp>
327
302
  );
328
303
  },
329
304
  );
330
305
 
331
- CardHeading.displayName = CARD_HEADING_NAME;
306
+ CardRow.displayName = CARD_ROW_NAME;
332
307
 
333
308
  //
334
309
  // Text
@@ -340,9 +315,9 @@ type CardTextProps = { truncate?: boolean; variant?: 'default' | 'description' }
340
315
 
341
316
  const CardText = slottable<HTMLDivElement, CardTextProps>(
342
317
  ({ children, asChild, role, truncate, variant = 'default', ...props }, forwardedRef) => {
318
+ const { tx } = useThemeContext();
343
319
  const { className, ...rest } = composableProps(props);
344
320
  const Comp = asChild ? Slot : Primitive.div;
345
- const { tx } = useThemeContext();
346
321
 
347
322
  return (
348
323
  <Comp {...rest} role={role ?? 'none'} className={tx('card.text', { variant }, className)} ref={forwardedRef}>
@@ -360,13 +335,13 @@ CardText.displayName = CARD_TEXT_NAME;
360
335
 
361
336
  const CARD_HTML_NAME = 'Card.Html';
362
337
 
363
- type CardHtmlProps = { html: string; variant?: 'default' | 'description' };
338
+ type CardHtmlProps = { html?: string; variant?: 'default' | 'description' };
364
339
 
365
340
  /**
366
341
  * Renders sanitized HTML content inside a card text slot.
367
342
  * Uses DOMPurify to prevent XSS from untrusted markup (e.g. RSS feed content).
368
343
  */
369
- const CardHtml = ({ html, variant = 'default', ...props }: CardHtmlProps & ThemedClassName<object>) => {
344
+ function CardHtml({ html = '', variant = 'default', ...props }: CardHtmlProps & ThemedClassName<object>) {
370
345
  const { tx } = useThemeContext();
371
346
  const sanitized = useMemo(() => DOMPurify.sanitize(html), [html]);
372
347
 
@@ -378,9 +353,9 @@ const CardHtml = ({ html, variant = 'default', ...props }: CardHtmlProps & Theme
378
353
  dangerouslySetInnerHTML={{ __html: sanitized }}
379
354
  />
380
355
  );
381
- };
356
+ }
382
357
 
383
- (CardHtml as any).displayName = CARD_HTML_NAME;
358
+ CardHtml.displayName = CARD_HTML_NAME;
384
359
 
385
360
  //
386
361
  // Poster
@@ -402,7 +377,7 @@ type CardPosterProps = ThemedClassName<
402
377
  } & Partial<{ image: string; icon: string }>
403
378
  >;
404
379
 
405
- const CardPoster = (props: CardPosterProps) => {
380
+ function CardPoster(props: CardPosterProps) {
406
381
  const { tx } = useThemeContext();
407
382
  const aspect = props.aspect === 'auto' ? 'aspect-auto' : 'aspect-video';
408
383
 
@@ -426,9 +401,9 @@ const CardPoster = (props: CardPosterProps) => {
426
401
  </div>
427
402
  );
428
403
  }
429
- };
404
+ }
430
405
 
431
- (CardPoster as any).displayName = CARD_POSTER_NAME;
406
+ CardPoster.displayName = CARD_POSTER_NAME;
432
407
 
433
408
  //
434
409
  // Action
@@ -438,7 +413,7 @@ const CARD_ACTION_NAME = 'Card.Action';
438
413
 
439
414
  type CardActionProps = { icon?: string; label: string; actionIcon?: string; onClick?: () => void };
440
415
 
441
- const CardAction = ({ icon, actionIcon = 'ph--arrow-right--regular', label, onClick }: CardActionProps) => {
416
+ function CardAction({ icon, actionIcon = 'ph--arrow-right--regular', label, onClick }: CardActionProps) {
442
417
  const { tx } = useThemeContext();
443
418
  return (
444
419
  <Button variant='ghost' classNames={tx('card.action', {})} onClick={onClick}>
@@ -447,9 +422,9 @@ const CardAction = ({ icon, actionIcon = 'ph--arrow-right--regular', label, onCl
447
422
  {actionIcon && <CardIcon icon={actionIcon} size={4} />}
448
423
  </Button>
449
424
  );
450
- };
425
+ }
451
426
 
452
- (CardAction as any).displayName = CARD_ACTION_NAME;
427
+ CardAction.displayName = CARD_ACTION_NAME;
453
428
 
454
429
  //
455
430
  // Link
@@ -459,7 +434,7 @@ const CARD_LINK_NAME = 'Card.Link';
459
434
 
460
435
  type CardLinkProps = { label: string; href: string };
461
436
 
462
- const CardLink = ({ label, href }: CardLinkProps) => {
437
+ function CardLink({ label, href }: CardLinkProps) {
463
438
  const { tx } = useThemeContext();
464
439
  return (
465
440
  <a className={tx('card.link', {})} data-variant='ghost' href={href} target='_blank' rel='noreferrer'>
@@ -468,9 +443,9 @@ const CardLink = ({ label, href }: CardLinkProps) => {
468
443
  <CardIcon classNames='invisible group-hover:visible' icon='ph--arrow-square-out--regular' />
469
444
  </a>
470
445
  );
471
- };
446
+ }
472
447
 
473
- (CardLink as any).displayName = CARD_LINK_NAME;
448
+ CardLink.displayName = CARD_LINK_NAME;
474
449
 
475
450
  //
476
451
  // Card
@@ -479,24 +454,23 @@ const CardLink = ({ label, href }: CardLinkProps) => {
479
454
  export const Card = {
480
455
  Root: CardRoot,
481
456
 
482
- // Toolbar
483
- Toolbar: CardToolbar,
484
- ToolbarIconButton: Toolbar.IconButton,
485
- ToolbarSeparator: Toolbar.Separator,
457
+ // Header
458
+ Header: CardHeader,
486
459
 
487
- // Toolbar blocks
460
+ // Header parts
488
461
  IconBlock: CardIconBlock,
489
462
  DragHandle: CardDragHandle,
490
- CloseIconButton: CloseIconButton,
463
+ ActionIconButton: CardActionIconButton,
491
464
  Menu: CardMenu,
492
465
  Icon: CardIcon,
493
466
  Title: CardTitle,
494
467
 
495
- // Content
496
- Content: CardContent,
497
- Row: CardRow,
468
+ // Body
469
+ Body: CardBody,
498
470
  Section: CardSection,
499
- Heading: CardHeading,
471
+ Row: CardRow,
472
+
473
+ // Body parts
500
474
  Text: CardText,
501
475
  Html: CardHtml,
502
476
  Poster: CardPoster,
@@ -505,10 +479,10 @@ export const Card = {
505
479
  };
506
480
 
507
481
  export type {
508
- CardContextValue,
509
482
  CardRootProps,
510
- CardToolbarProps,
483
+ CardHeaderProps,
511
484
  CardDragHandleProps,
512
- CloseIconButtonProps,
485
+ CardActionIconButtonProps,
513
486
  CardMenuProps,
487
+ CardSectionProps,
514
488
  };
@@ -17,11 +17,11 @@ import React, {
17
17
 
18
18
  import { mx } from '@dxos/ui-theme';
19
19
 
20
+ import { useTranslation } from '../../primitives';
20
21
  import { translationKey } from '../../translations';
21
22
  import { type ThemedClassName } from '../../util';
22
23
  import { IconButton } from '../Button';
23
24
  import { MediaPlayer, type MediaKind } from '../MediaPlayer';
24
- import { useTranslation } from '../ThemeProvider';
25
25
 
26
26
  // TODO(burdon): Move per-element class strings to `@dxos/ui-theme` (theme tokens)
27
27
  // so callers can re-theme via the same mechanism the rest of `react-ui` uses.
@@ -119,7 +119,7 @@ const CarouselRoot = ({
119
119
  * its content height. With no parent height constraint, the `1fr` row simply tracks
120
120
  * row-1 content — preserving the existing aspect-video behaviour for unbounded use.
121
121
  */}
122
- {/* TODO(burdon): Move to ui-theme. */}
122
+ {/* TODO(burdon): Move to Carousel.theme.ts */}
123
123
  <div
124
124
  className={mx(
125
125
  'w-full grid grid-cols-[min-content_1fr_min-content] grid-rows-[minmax(0,1fr)_auto] gap-4 items-center',
@@ -192,10 +192,6 @@ export type CarouselSlideProps = ThemedClassName<{
192
192
  kind?: MediaKind;
193
193
  /** Accessible label / `<img alt>` fallback. */
194
194
  alt?: string;
195
- /** Class names forwarded to the inner `<img>` when MediaPlayer resolves to an image. */
196
- imgClassNames?: string;
197
- /** Class names forwarded to the inner `<video>` / `<audio>` / `<iframe>`. */
198
- mediaClassNames?: string;
199
195
  controls?: boolean;
200
196
  autoPlay?: boolean;
201
197
  loop?: boolean;
@@ -209,8 +205,6 @@ const CarouselSlide = ({
209
205
  src,
210
206
  kind,
211
207
  alt,
212
- imgClassNames,
213
- mediaClassNames,
214
208
  controls,
215
209
  autoPlay,
216
210
  loop,
@@ -229,8 +223,6 @@ const CarouselSlide = ({
229
223
  kind={kind}
230
224
  alt={alt}
231
225
  classNames='w-full h-full'
232
- imgClassNames={mx('object-cover', imgClassNames)}
233
- mediaClassNames={mediaClassNames}
234
226
  controls={controls}
235
227
  autoPlay={autoPlay}
236
228
  loop={loop}
@@ -6,9 +6,9 @@ import React from 'react';
6
6
 
7
7
  import { mx, osTranslations } from '@dxos/ui-theme';
8
8
 
9
+ import { useTranslation } from '../../primitives';
9
10
  import { Button, type ButtonProps, IconButton } from '../Button';
10
11
  import { Icon, type IconProps } from '../Icon';
11
- import { useTranslation } from '../ThemeProvider';
12
12
  import { type TooltipScopedProps, useTooltipContext } from '../Tooltip';
13
13
  import { useClipboard } from './ClipboardProvider';
14
14
 
@@ -71,7 +71,7 @@ const DefaultStory = () => {
71
71
  };
72
72
 
73
73
  const meta: Meta = {
74
- title: 'ui/react-ui-core/primitives/Column',
74
+ title: 'ui/react-ui-core/components/Column',
75
75
  render: DefaultStory,
76
76
  decorators: [withTheme(), withLayout({ layout: 'column', classNames: 'w-[25rem]' })],
77
77
  parameters: {
@@ -0,0 +1,48 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { mx } from '@dxos/ui-theme';
6
+ import { type ComponentFunction } from '@dxos/ui-types';
7
+
8
+ import { withColumn } from './withColumn';
9
+
10
+ export type ColumnStyleProps = {};
11
+
12
+ const root: ComponentFunction<ColumnStyleProps> = (_, ...etc) => {
13
+ return mx('dx-column-root grid', ...etc);
14
+ };
15
+
16
+ /**
17
+ * Three-column icon-slot row: spans all 3 columns of the parent Column.Root grid.
18
+ * Uses CSS subgrid to inherit column sizing from the parent Column.
19
+ * Children map to: [col-1: icon/slot] [col-2: content] [col-3: icon/action].
20
+ * NOTE: Must not use overflow-hidden here since it will clip input focus rings.
21
+ */
22
+ const row: ComponentFunction<ColumnStyleProps> = (_, ...etc) => {
23
+ return mx('col-span-3 grid grid-cols-subgrid', ...etc);
24
+ };
25
+
26
+ /**
27
+ * Bleed placement: spans all 3 columns of the parent Column.Root grid (gutter-to-gutter).
28
+ * Use for `ScrollArea`, full-width dividers, tables, or any content that should ignore gutters.
29
+ */
30
+ const bleed: ComponentFunction<ColumnStyleProps> = (_, ...etc) => {
31
+ return mx('col-span-full grid grid-cols-subgrid min-h-0', ...etc);
32
+ };
33
+
34
+ /**
35
+ * Center placement: places the element in column 2 (the central track between gutters) of the
36
+ * parent Column.Root grid. Does NOT use subgrid — placement is explicit on this element only.
37
+ * Safe to nest arbitrary compound components (including those that render `display: contents`).
38
+ */
39
+ const center: ComponentFunction<ColumnStyleProps> = (_, ...etc) => {
40
+ return mx(withColumn.center(), 'min-h-0', ...etc);
41
+ };
42
+
43
+ export const columnTheme = {
44
+ root,
45
+ row,
46
+ bleed,
47
+ center,
48
+ };
@@ -6,10 +6,10 @@ import { Primitive } from '@radix-ui/react-primitive';
6
6
  import { Slot } from '@radix-ui/react-slot';
7
7
  import React, { type CSSProperties } from 'react';
8
8
 
9
- import { composableProps, slottable } from '@dxos/ui-theme';
10
9
  import { type SlottableProps } from '@dxos/ui-types';
11
10
 
12
11
  import { useThemeContext } from '../../hooks';
12
+ import { composableProps, slottable } from '../../util';
13
13
 
14
14
  //
15
15
  // Root
@@ -57,6 +57,7 @@ const ColumnRoot = slottable<HTMLDivElement, ColumnRootProps>(
57
57
  role={role ?? 'none'}
58
58
  style={
59
59
  {
60
+ ...rest.style,
60
61
  '--gutter': gutterSize,
61
62
  '--dx-col': '2 / span 1',
62
63
  gridTemplateColumns: [gutterSize, 'minmax(0,1fr)', gutterSize].join(' '),
@@ -3,3 +3,4 @@
3
3
  //
4
4
 
5
5
  export * from './Column';
6
+ export * from './withColumn';