@dxos/react-ui 0.8.4-staging.ac66bdf99f → 0.9.0

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 (482) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/browser/chunk-5SPBSIWS.mjs +33 -0
  4. package/dist/lib/browser/chunk-5SPBSIWS.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-7JFD5ZHZ.mjs +1612 -0
  6. package/dist/lib/browser/chunk-7JFD5ZHZ.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +3039 -1891
  8. package/dist/lib/browser/index.mjs.map +4 -4
  9. package/dist/lib/browser/meta.json +1 -1
  10. package/dist/lib/browser/testing/index.mjs +10 -13
  11. package/dist/lib/browser/testing/index.mjs.map +3 -3
  12. package/dist/lib/browser/translations.mjs +9 -0
  13. package/dist/lib/browser/translations.mjs.map +7 -0
  14. package/dist/lib/node-esm/chunk-FPVTVXND.mjs +35 -0
  15. package/dist/lib/node-esm/chunk-FPVTVXND.mjs.map +7 -0
  16. package/dist/lib/node-esm/chunk-TTEL2FP2.mjs +1614 -0
  17. package/dist/lib/node-esm/chunk-TTEL2FP2.mjs.map +7 -0
  18. package/dist/lib/node-esm/index.mjs +3039 -1891
  19. package/dist/lib/node-esm/index.mjs.map +4 -4
  20. package/dist/lib/node-esm/meta.json +1 -1
  21. package/dist/lib/node-esm/testing/index.mjs +10 -13
  22. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  23. package/dist/lib/node-esm/translations.mjs +10 -0
  24. package/dist/lib/node-esm/translations.mjs.map +7 -0
  25. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  26. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  27. package/dist/types/src/components/Avatars/Avatar.theme.d.ts +11 -0
  28. package/dist/types/src/components/Avatars/Avatar.theme.d.ts.map +1 -0
  29. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  30. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts +5 -1
  31. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  32. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  33. package/dist/types/src/components/Breadcrumb/Breadcrumb.theme.d.ts +4 -0
  34. package/dist/types/src/components/Breadcrumb/Breadcrumb.theme.d.ts.map +1 -0
  35. package/dist/types/src/components/Button/Button.d.ts +1 -1
  36. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  37. package/dist/types/src/components/Button/Button.stories.d.ts +1 -1
  38. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -1
  39. package/dist/types/src/components/Button/Button.theme.d.ts +11 -0
  40. package/dist/types/src/components/Button/Button.theme.d.ts.map +1 -0
  41. package/dist/types/src/components/Button/IconButton.d.ts +1 -0
  42. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  43. package/dist/types/src/components/Button/IconButton.stories.d.ts +1 -0
  44. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
  45. package/dist/types/src/components/Button/IconButton.theme.d.ts +8 -0
  46. package/dist/types/src/components/Button/IconButton.theme.d.ts.map +1 -0
  47. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
  48. package/dist/types/src/components/Button/ToggleGroup.d.ts +2 -2
  49. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +2 -2
  50. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
  51. package/dist/types/src/components/Calendar/Calendar.d.ts +33 -0
  52. package/dist/types/src/components/Calendar/Calendar.d.ts.map +1 -0
  53. package/dist/types/src/components/Calendar/Calendar.stories.d.ts +9 -0
  54. package/dist/types/src/components/Calendar/Calendar.stories.d.ts.map +1 -0
  55. package/dist/types/src/components/Calendar/Calendar.theme.d.ts +4 -0
  56. package/dist/types/src/components/Calendar/Calendar.theme.d.ts.map +1 -0
  57. package/dist/types/src/components/Calendar/index.d.ts +2 -0
  58. package/dist/types/src/components/Calendar/index.d.ts.map +1 -0
  59. package/dist/types/src/components/Card/Card.d.ts +63 -57
  60. package/dist/types/src/components/Card/Card.d.ts.map +1 -1
  61. package/dist/types/src/components/Card/Card.stories.d.ts +1 -0
  62. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -1
  63. package/dist/types/src/components/Card/Card.theme.d.ts +12 -0
  64. package/dist/types/src/components/Card/Card.theme.d.ts.map +1 -0
  65. package/dist/types/src/components/Carousel/Carousel.d.ts +106 -0
  66. package/dist/types/src/components/Carousel/Carousel.d.ts.map +1 -0
  67. package/dist/types/src/components/Carousel/Carousel.stories.d.ts +14 -0
  68. package/dist/types/src/components/Carousel/Carousel.stories.d.ts.map +1 -0
  69. package/dist/types/src/components/Carousel/index.d.ts +2 -0
  70. package/dist/types/src/components/Carousel/index.d.ts.map +1 -0
  71. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  72. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  73. package/dist/types/src/components/Clipboard/index.d.ts +1 -1
  74. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  75. package/dist/types/src/{primitives → components}/Column/Column.d.ts +4 -4
  76. package/dist/types/src/components/Column/Column.d.ts.map +1 -0
  77. package/dist/types/src/components/Column/Column.stories.d.ts.map +1 -0
  78. package/dist/types/src/components/Column/Column.theme.d.ts +9 -0
  79. package/dist/types/src/components/Column/Column.theme.d.ts.map +1 -0
  80. package/dist/types/src/components/Column/index.d.ts +3 -0
  81. package/dist/types/src/components/Column/index.d.ts.map +1 -0
  82. package/dist/types/src/components/Column/withColumn.d.ts +21 -0
  83. package/dist/types/src/components/Column/withColumn.d.ts.map +1 -0
  84. package/dist/types/src/components/DatePicker/DatePicker.d.ts +72 -0
  85. package/dist/types/src/components/DatePicker/DatePicker.d.ts.map +1 -0
  86. package/dist/types/src/components/DatePicker/DatePicker.stories.d.ts +10 -0
  87. package/dist/types/src/components/DatePicker/DatePicker.stories.d.ts.map +1 -0
  88. package/dist/types/src/components/DatePicker/DatePicker.theme.d.ts +6 -0
  89. package/dist/types/src/components/DatePicker/DatePicker.theme.d.ts.map +1 -0
  90. package/dist/types/src/components/DatePicker/index.d.ts +2 -0
  91. package/dist/types/src/components/DatePicker/index.d.ts.map +1 -0
  92. package/dist/types/src/components/Dialog/AlertDialog.d.ts +20 -20
  93. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  94. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  95. package/dist/types/src/components/Dialog/Dialog.d.ts +21 -19
  96. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  97. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  98. package/dist/types/src/components/Dialog/Dialog.theme.d.ts +10 -0
  99. package/dist/types/src/components/Dialog/Dialog.theme.d.ts.map +1 -0
  100. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -1
  101. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -1
  102. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -1
  103. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -1
  104. package/dist/types/src/components/Focus/Focus.d.ts +2 -2
  105. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -1
  106. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -1
  107. package/dist/types/src/components/Focus/Focus.theme.d.ts +6 -0
  108. package/dist/types/src/components/Focus/Focus.theme.d.ts.map +1 -0
  109. package/dist/types/src/components/Icon/Icon.d.ts +1 -0
  110. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  111. package/dist/types/src/components/Icon/Icon.stories.d.ts +1 -1
  112. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  113. package/dist/types/src/components/Icon/Icon.theme.d.ts +11 -0
  114. package/dist/types/src/components/Icon/Icon.theme.d.ts.map +1 -0
  115. package/dist/types/src/components/Icon/IconBlock.d.ts +15 -0
  116. package/dist/types/src/components/Icon/IconBlock.d.ts.map +1 -0
  117. package/dist/types/src/components/Icon/index.d.ts +1 -0
  118. package/dist/types/src/components/Icon/index.d.ts.map +1 -1
  119. package/dist/types/src/components/Image/Image.d.ts +8 -1
  120. package/dist/types/src/components/Image/Image.d.ts.map +1 -1
  121. package/dist/types/src/components/Image/Image.stories.d.ts +3 -2
  122. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -1
  123. package/dist/types/src/components/Input/Input.d.ts +88 -13
  124. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  125. package/dist/types/src/components/Input/Input.stories.d.ts +14 -3
  126. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  127. package/dist/types/src/components/Input/Input.theme.d.ts +115 -0
  128. package/dist/types/src/components/Input/Input.theme.d.ts.map +1 -0
  129. package/dist/types/src/components/Input/SegmentedInput.d.ts +79 -0
  130. package/dist/types/src/components/Input/SegmentedInput.d.ts.map +1 -0
  131. package/dist/types/src/components/Input/constants.d.ts +2 -0
  132. package/dist/types/src/components/Input/constants.d.ts.map +1 -0
  133. package/dist/types/src/components/Input/index.d.ts +2 -0
  134. package/dist/types/src/components/Input/index.d.ts.map +1 -1
  135. package/dist/types/src/components/Link/Link.d.ts.map +1 -1
  136. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  137. package/dist/types/src/components/Link/Link.theme.d.ts +6 -0
  138. package/dist/types/src/components/Link/Link.theme.d.ts.map +1 -0
  139. package/dist/types/src/components/List/List.d.ts +2 -2
  140. package/dist/types/src/components/List/List.d.ts.map +1 -1
  141. package/dist/types/src/components/List/List.stories.d.ts +1 -1
  142. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  143. package/dist/types/src/components/List/List.theme.d.ts +7 -0
  144. package/dist/types/src/components/List/List.theme.d.ts.map +1 -0
  145. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -1
  146. package/dist/types/src/components/List/Tree.d.ts +2 -2
  147. package/dist/types/src/components/List/Tree.d.ts.map +1 -1
  148. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
  149. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -1
  150. package/dist/types/src/components/List/Treegrid.d.ts +2 -2
  151. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  152. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
  153. package/dist/types/src/components/List/Treegrid.theme.d.ts +7 -0
  154. package/dist/types/src/components/List/Treegrid.theme.d.ts.map +1 -0
  155. package/dist/types/src/components/Main/Main.d.ts +9 -5
  156. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  157. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  158. package/dist/types/src/components/Main/Main.theme.d.ts +20 -0
  159. package/dist/types/src/components/Main/Main.theme.d.ts.map +1 -0
  160. package/dist/types/src/components/Main/constants.d.ts +3 -0
  161. package/dist/types/src/components/Main/constants.d.ts.map +1 -0
  162. package/dist/types/src/components/Main/index.d.ts +1 -0
  163. package/dist/types/src/components/Main/index.d.ts.map +1 -1
  164. package/dist/types/src/components/Main/useSwipeToDismiss.d.ts.map +1 -1
  165. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +47 -0
  166. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -0
  167. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts +16 -0
  168. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts.map +1 -0
  169. package/dist/types/src/components/MediaPlayer/index.d.ts +2 -0
  170. package/dist/types/src/components/MediaPlayer/index.d.ts.map +1 -0
  171. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -1
  172. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -1
  173. package/dist/types/src/components/Menu/DropdownMenu.d.ts +11 -3
  174. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
  175. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
  176. package/dist/types/src/components/Menu/Menu.theme.d.ts +7 -0
  177. package/dist/types/src/components/Menu/Menu.theme.d.ts.map +1 -0
  178. package/dist/types/src/components/Message/Message.d.ts +3 -3
  179. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  180. package/dist/types/src/components/Message/Message.stories.d.ts +5 -1
  181. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  182. package/dist/types/src/components/Message/Message.theme.d.ts +7 -0
  183. package/dist/types/src/components/Message/Message.theme.d.ts.map +1 -0
  184. package/dist/types/src/{primitives → components}/Panel/Panel.d.ts +5 -5
  185. package/dist/types/src/components/Panel/Panel.d.ts.map +1 -0
  186. package/dist/types/src/components/Panel/Panel.stories.d.ts.map +1 -0
  187. package/dist/types/src/components/Panel/Panel.theme.d.ts +13 -0
  188. package/dist/types/src/components/Panel/Panel.theme.d.ts.map +1 -0
  189. package/dist/types/src/components/Panel/index.d.ts.map +1 -0
  190. package/dist/types/src/components/Popover/Popover.d.ts +10 -2
  191. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  192. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  193. package/dist/types/src/components/Popover/Popover.theme.d.ts +8 -0
  194. package/dist/types/src/components/Popover/Popover.theme.d.ts.map +1 -0
  195. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +2 -2
  196. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  197. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +2 -2
  198. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  199. package/dist/types/src/components/ScrollArea/ScrollArea.theme.d.ts +17 -0
  200. package/dist/types/src/components/ScrollArea/ScrollArea.theme.d.ts.map +1 -0
  201. package/dist/types/src/components/ScrollArea/index.d.ts +1 -0
  202. package/dist/types/src/components/ScrollArea/index.d.ts.map +1 -1
  203. package/dist/types/src/components/ScrollArea/scrollbar.d.ts +18 -0
  204. package/dist/types/src/components/ScrollArea/scrollbar.d.ts.map +1 -0
  205. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +20 -18
  206. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  207. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  208. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  209. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  210. package/dist/types/src/components/Select/Select.theme.d.ts +6 -0
  211. package/dist/types/src/components/Select/Select.theme.d.ts.map +1 -0
  212. package/dist/types/src/components/Separator/Separator.theme.d.ts +7 -0
  213. package/dist/types/src/components/Separator/Separator.theme.d.ts.map +1 -0
  214. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -1
  215. package/dist/types/src/components/Skeleton/Skeleton.theme.d.ts +6 -0
  216. package/dist/types/src/components/Skeleton/Skeleton.theme.d.ts.map +1 -0
  217. package/dist/types/src/components/Splitter/Splitter.d.ts +6 -8
  218. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -1
  219. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -1
  220. package/dist/types/src/components/Splitter/Splitter.theme.d.ts +4 -0
  221. package/dist/types/src/components/Splitter/Splitter.theme.d.ts.map +1 -0
  222. package/dist/types/src/components/Status/Status.d.ts +1 -1
  223. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  224. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  225. package/dist/types/src/components/Status/Status.theme.d.ts +7 -0
  226. package/dist/types/src/components/Status/Status.theme.d.ts.map +1 -0
  227. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  228. package/dist/types/src/components/Tag/Tag.theme.d.ts +6 -0
  229. package/dist/types/src/components/Tag/Tag.theme.d.ts.map +1 -0
  230. package/dist/types/src/components/Toast/Toast.d.ts +12 -9
  231. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  232. package/dist/types/src/components/Toast/Toast.stories.d.ts +5 -2
  233. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  234. package/dist/types/src/components/Toast/Toast.theme.d.ts +4 -0
  235. package/dist/types/src/components/Toast/Toast.theme.d.ts.map +1 -0
  236. package/dist/types/src/components/Toolbar/Toolbar.d.ts +24 -12
  237. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  238. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  239. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts +8 -0
  240. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts.map +1 -0
  241. package/dist/types/src/components/Tooltip/Tooltip.d.ts +8 -8
  242. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  243. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  244. package/dist/types/src/components/Tooltip/Tooltip.theme.d.ts +6 -0
  245. package/dist/types/src/components/Tooltip/Tooltip.theme.d.ts.map +1 -0
  246. package/dist/types/src/components/Tooltip/index.d.ts +1 -0
  247. package/dist/types/src/components/Tooltip/index.d.ts.map +1 -1
  248. package/dist/types/src/components/Tooltip/tooltipContent.d.ts +4 -0
  249. package/dist/types/src/components/Tooltip/tooltipContent.d.ts.map +1 -0
  250. package/dist/types/src/components/index.d.ts +7 -4
  251. package/dist/types/src/components/index.d.ts.map +1 -1
  252. package/dist/types/src/exemplars/generics.stories.d.ts +1 -1
  253. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -1
  254. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -1
  255. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -1
  256. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -1
  257. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  258. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  259. package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
  260. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  261. package/dist/types/src/hooks/useSafeCollisionPadding.d.ts.map +1 -1
  262. package/dist/types/src/hooks/useTranslationsContext.d.ts +1 -1
  263. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  264. package/dist/types/src/index.d.ts +1 -0
  265. package/dist/types/src/index.d.ts.map +1 -1
  266. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  267. package/dist/types/src/playground/Custom.stories.d.ts +1 -1
  268. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  269. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  270. package/dist/types/src/primitives/Container/Container.d.ts +1 -1
  271. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -1
  272. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -1
  273. package/dist/types/src/{components → primitives}/DensityProvider/DensityProvider.d.ts.map +1 -1
  274. package/dist/types/src/primitives/DensityProvider/index.d.ts.map +1 -0
  275. package/dist/types/src/{components → primitives}/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  276. package/dist/types/src/primitives/ElevationProvider/index.d.ts.map +1 -0
  277. package/dist/types/src/primitives/Flex/Flex.d.ts +1 -1
  278. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -1
  279. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -1
  280. package/dist/types/src/primitives/Grid/Grid.d.ts +1 -1
  281. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -1
  282. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -1
  283. package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  284. package/dist/types/src/primitives/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  285. package/dist/types/src/primitives/ThemeProvider/TranslationsProvider.d.ts +128 -0
  286. package/dist/types/src/primitives/ThemeProvider/TranslationsProvider.d.ts.map +1 -0
  287. package/dist/types/src/primitives/ThemeProvider/index.d.ts +4 -0
  288. package/dist/types/src/primitives/ThemeProvider/index.d.ts.map +1 -0
  289. package/dist/types/src/primitives/index.d.ts +3 -2
  290. package/dist/types/src/primitives/index.d.ts.map +1 -1
  291. package/dist/types/src/testing/Loading.d.ts.map +1 -1
  292. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  293. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  294. package/dist/types/src/testing/decorators/withTheme.d.ts +5 -1
  295. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  296. package/dist/types/src/theme/bindTheme.d.ts +3 -0
  297. package/dist/types/src/theme/bindTheme.d.ts.map +1 -0
  298. package/dist/types/src/theme/defaultTheme.d.ts +4 -0
  299. package/dist/types/src/theme/defaultTheme.d.ts.map +1 -0
  300. package/dist/types/src/theme/index.d.ts +31 -0
  301. package/dist/types/src/theme/index.d.ts.map +1 -0
  302. package/dist/types/src/translations.d.ts +17 -3
  303. package/dist/types/src/translations.d.ts.map +1 -1
  304. package/dist/types/src/util/index.d.ts +2 -1
  305. package/dist/types/src/util/index.d.ts.map +1 -1
  306. package/dist/types/src/util/mobile.d.ts +5 -0
  307. package/dist/types/src/util/mobile.d.ts.map +1 -0
  308. package/dist/types/src/util/slots.d.ts +57 -0
  309. package/dist/types/src/util/slots.d.ts.map +1 -0
  310. package/dist/types/src/util/usePx.d.ts.map +1 -1
  311. package/dist/types/tsconfig.tsbuildinfo +1 -1
  312. package/package.json +29 -25
  313. package/src/components/Avatars/Avatar.theme.ts +93 -0
  314. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -1
  315. package/src/components/Breadcrumb/Breadcrumb.theme.ts +26 -0
  316. package/src/components/Breadcrumb/Breadcrumb.tsx +14 -2
  317. package/src/components/Button/Button.theme.ts +31 -0
  318. package/src/components/Button/Button.tsx +2 -2
  319. package/src/components/Button/IconButton.stories.tsx +51 -3
  320. package/src/components/Button/IconButton.theme.ts +21 -0
  321. package/src/components/Button/IconButton.tsx +3 -2
  322. package/src/components/Calendar/Calendar.stories.tsx +43 -0
  323. package/src/components/Calendar/Calendar.theme.ts +74 -0
  324. package/src/components/Calendar/Calendar.tsx +196 -0
  325. package/src/components/Calendar/index.ts +5 -0
  326. package/src/components/Card/Card.stories.tsx +43 -22
  327. package/src/components/Card/Card.theme.ts +93 -0
  328. package/src/components/Card/Card.tsx +161 -169
  329. package/src/components/Carousel/Carousel.stories.tsx +47 -0
  330. package/src/components/Carousel/Carousel.tsx +373 -0
  331. package/src/components/Carousel/index.ts +5 -0
  332. package/src/components/Clipboard/CopyButton.tsx +3 -3
  333. package/src/{primitives → components}/Column/Column.stories.tsx +1 -1
  334. package/src/components/Column/Column.theme.ts +48 -0
  335. package/src/{primitives → components}/Column/Column.tsx +2 -1
  336. package/src/{primitives → components}/Column/index.ts +1 -0
  337. package/src/components/Column/withColumn.ts +27 -0
  338. package/src/components/DatePicker/DatePicker.stories.tsx +102 -0
  339. package/src/components/DatePicker/DatePicker.theme.ts +35 -0
  340. package/src/components/DatePicker/DatePicker.tsx +279 -0
  341. package/src/components/DatePicker/index.ts +5 -0
  342. package/src/components/Dialog/AlertDialog.tsx +12 -16
  343. package/src/components/Dialog/Dialog.stories.tsx +2 -2
  344. package/src/components/Dialog/Dialog.theme.ts +61 -0
  345. package/src/components/Dialog/Dialog.tsx +46 -17
  346. package/src/components/ErrorFallback/ErrorFallback.tsx +14 -8
  347. package/src/components/ErrorFallback/ErrorStack.tsx +12 -6
  348. package/src/components/Focus/Focus.theme.ts +32 -0
  349. package/src/components/Focus/Focus.tsx +1 -1
  350. package/src/components/Icon/Icon.theme.ts +45 -0
  351. package/src/components/Icon/Icon.tsx +10 -3
  352. package/src/components/Icon/IconBlock.tsx +38 -0
  353. package/src/components/Icon/index.ts +1 -0
  354. package/src/components/Image/Image.stories.tsx +1 -1
  355. package/src/components/Image/Image.tsx +38 -9
  356. package/src/components/Input/Input.stories.tsx +132 -29
  357. package/src/components/Input/Input.theme.ts +191 -0
  358. package/src/components/Input/Input.tsx +208 -2
  359. package/src/components/Input/SegmentedInput.tsx +454 -0
  360. package/src/components/Input/constants.ts +5 -0
  361. package/src/components/Input/index.ts +2 -0
  362. package/src/components/Link/Link.theme.ts +16 -0
  363. package/src/components/Link/Link.tsx +10 -2
  364. package/src/components/List/List.stories.tsx +1 -1
  365. package/src/components/List/List.theme.ts +47 -0
  366. package/src/components/List/List.tsx +3 -3
  367. package/src/components/List/ListDropIndicator.tsx +1 -2
  368. package/src/components/List/Tree.stories.tsx +1 -1
  369. package/src/components/List/TreeDropIndicator.tsx +3 -3
  370. package/src/components/List/Treegrid.theme.ts +35 -0
  371. package/src/components/List/Treegrid.tsx +3 -4
  372. package/src/components/Main/Main.theme.ts +29 -0
  373. package/src/components/Main/Main.tsx +9 -7
  374. package/src/components/Main/constants.ts +6 -0
  375. package/src/components/Main/index.ts +1 -0
  376. package/src/components/MediaPlayer/MediaPlayer.stories.tsx +50 -0
  377. package/src/components/MediaPlayer/MediaPlayer.tsx +182 -0
  378. package/src/components/MediaPlayer/index.ts +5 -0
  379. package/src/components/Menu/ContextMenu.stories.tsx +0 -3
  380. package/src/components/Menu/DropdownMenu.stories.tsx +0 -3
  381. package/src/components/Menu/DropdownMenu.tsx +15 -15
  382. package/src/components/Menu/Menu.theme.ts +48 -0
  383. package/src/components/Message/Message.stories.tsx +43 -5
  384. package/src/components/Message/Message.theme.ts +44 -0
  385. package/src/components/Message/Message.tsx +76 -16
  386. package/src/{primitives → components}/Panel/Panel.stories.tsx +2 -3
  387. package/src/components/Panel/Panel.theme.ts +41 -0
  388. package/src/{primitives → components}/Panel/Panel.tsx +2 -1
  389. package/src/components/Popover/Popover.theme.ts +40 -0
  390. package/src/components/Popover/Popover.tsx +7 -7
  391. package/src/components/ScrollArea/ScrollArea.stories.tsx +2 -6
  392. package/src/components/ScrollArea/ScrollArea.theme.ts +107 -0
  393. package/src/components/ScrollArea/ScrollArea.tsx +3 -2
  394. package/src/components/ScrollArea/index.ts +1 -0
  395. package/src/components/ScrollArea/scrollbar.ts +21 -0
  396. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +1 -1
  397. package/src/components/ScrollContainer/ScrollContainer.tsx +58 -58
  398. package/src/components/Select/Select.theme.ts +55 -0
  399. package/src/components/Select/Select.tsx +26 -10
  400. package/src/components/Separator/Separator.theme.ts +23 -0
  401. package/src/components/Skeleton/Skeleton.theme.ts +22 -0
  402. package/src/components/Splitter/Splitter.stories.tsx +1 -1
  403. package/src/components/Splitter/Splitter.theme.ts +18 -0
  404. package/src/components/Splitter/Splitter.tsx +10 -15
  405. package/src/components/Status/Status.theme.ts +31 -0
  406. package/src/components/Status/Status.tsx +1 -2
  407. package/src/components/Tag/Tag.theme.ts +22 -0
  408. package/src/components/Toast/Toast.stories.tsx +41 -20
  409. package/src/components/Toast/Toast.theme.ts +56 -0
  410. package/src/components/Toast/Toast.tsx +95 -27
  411. package/src/components/Toolbar/Toolbar.theme.ts +36 -0
  412. package/src/components/Toolbar/Toolbar.tsx +67 -15
  413. package/src/components/Tooltip/Tooltip.stories.tsx +1 -10
  414. package/src/components/Tooltip/Tooltip.theme.ts +19 -0
  415. package/src/components/Tooltip/Tooltip.tsx +18 -17
  416. package/src/components/Tooltip/index.ts +1 -0
  417. package/src/components/Tooltip/tooltipContent.ts +16 -0
  418. package/src/components/index.ts +7 -5
  419. package/src/exemplars/generics.stories.tsx +1 -2
  420. package/src/exemplars/slot.stories.tsx +5 -6
  421. package/src/exemplars/virtualizer.stories.tsx +0 -1
  422. package/src/hooks/useDensityContext.ts +1 -1
  423. package/src/hooks/useElevationContext.ts +1 -1
  424. package/src/hooks/useThemeContext.ts +1 -1
  425. package/src/hooks/useTranslationsContext.ts +1 -1
  426. package/src/index.ts +1 -0
  427. package/src/playground/Custom.stories.tsx +12 -32
  428. package/src/primitives/Container/Container.tsx +3 -1
  429. package/src/{components → primitives}/DensityProvider/DensityProvider.tsx +1 -1
  430. package/src/primitives/Flex/Flex.tsx +3 -1
  431. package/src/primitives/Grid/Grid.tsx +3 -1
  432. package/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.tsx +1 -1
  433. package/src/{components → primitives}/ThemeProvider/ThemeProvider.tsx +1 -1
  434. package/src/{components → primitives}/ThemeProvider/index.ts +2 -2
  435. package/src/primitives/index.ts +4 -2
  436. package/src/testing/decorators/withLayout.tsx +7 -17
  437. package/src/testing/decorators/withLayoutVariants.tsx +1 -1
  438. package/src/testing/decorators/withTheme.tsx +21 -13
  439. package/src/theme/bindTheme.ts +13 -0
  440. package/src/theme/defaultTheme.ts +83 -0
  441. package/src/theme/index.ts +37 -0
  442. package/src/translations.ts +14 -0
  443. package/src/util/index.ts +2 -1
  444. package/src/util/mobile.ts +11 -0
  445. package/src/util/slots.ts +129 -0
  446. package/src/util/usePx.ts +4 -1
  447. package/dist/lib/browser/chunk-OCVRIJCH.mjs +0 -848
  448. package/dist/lib/browser/chunk-OCVRIJCH.mjs.map +0 -7
  449. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs +0 -850
  450. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs.map +0 -7
  451. package/dist/types/src/components/DensityProvider/index.d.ts.map +0 -1
  452. package/dist/types/src/components/ElevationProvider/index.d.ts.map +0 -1
  453. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +0 -1
  454. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +0 -129
  455. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +0 -1
  456. package/dist/types/src/components/ThemeProvider/index.d.ts +0 -4
  457. package/dist/types/src/components/ThemeProvider/index.d.ts.map +0 -1
  458. package/dist/types/src/primitives/Column/Column.d.ts.map +0 -1
  459. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +0 -1
  460. package/dist/types/src/primitives/Column/index.d.ts +0 -2
  461. package/dist/types/src/primitives/Column/index.d.ts.map +0 -1
  462. package/dist/types/src/primitives/Panel/Panel.d.ts.map +0 -1
  463. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +0 -1
  464. package/dist/types/src/primitives/Panel/index.d.ts.map +0 -1
  465. package/dist/types/src/util/hasIosKeyboard.d.ts +0 -2
  466. package/dist/types/src/util/hasIosKeyboard.d.ts.map +0 -1
  467. package/src/util/hasIosKeyboard.ts +0 -8
  468. /package/dist/types/src/{primitives → components}/Column/Column.stories.d.ts +0 -0
  469. /package/dist/types/src/{primitives → components}/Panel/Panel.stories.d.ts +0 -0
  470. /package/dist/types/src/{primitives → components}/Panel/index.d.ts +0 -0
  471. /package/dist/types/src/{components → primitives}/DensityProvider/DensityProvider.d.ts +0 -0
  472. /package/dist/types/src/{components → primitives}/DensityProvider/index.d.ts +0 -0
  473. /package/dist/types/src/{components → primitives}/ElevationProvider/ElevationProvider.d.ts +0 -0
  474. /package/dist/types/src/{components → primitives}/ElevationProvider/index.d.ts +0 -0
  475. /package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.d.ts +0 -0
  476. /package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.d.ts +0 -0
  477. /package/src/{primitives → components}/Column/AUDIT.md +0 -0
  478. /package/src/{primitives → components}/Panel/index.ts +0 -0
  479. /package/src/{components → primitives}/DensityProvider/index.ts +0 -0
  480. /package/src/{components → primitives}/ElevationProvider/ElevationProvider.tsx +0 -0
  481. /package/src/{components → primitives}/ElevationProvider/index.ts +0 -0
  482. /package/src/{components → primitives}/ThemeProvider/TranslationsProvider.tsx +0 -0
@@ -5,54 +5,33 @@
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';
26
- import { Image } from '../Image';
17
+ import { Column } from '../Column';
18
+ import { Icon, IconBlock, type IconBlockProps, type IconProps } from '../Icon';
19
+ import { Image, type ImageProps } 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
  //
52
31
 
53
32
  const CARD_ROOT_NAME = 'Card.Root';
54
33
 
55
- type CardRootOwnProps = {
34
+ type CardRootProps = {
56
35
  id?: string;
57
36
  border?: boolean;
58
37
  fullWidth?: boolean;
@@ -64,24 +43,33 @@ type CardRootOwnProps = {
64
43
  'data-testid'?: string;
65
44
  };
66
45
 
67
- type CardRootProps = CardRootOwnProps;
68
-
69
- const CardRoot = slottable<HTMLDivElement, CardRootOwnProps>(
70
- ({ children, id, asChild, role, border = true, fullWidth, density, ...props }, forwardedRef) => {
46
+ /**
47
+ * `Card.Root` does not support `asChild`. The Column grid is the root element
48
+ * (one `<div>` carrying both the `dx-card` and `dx-column-root` classes
49
+ * instead of the previous outer-card + inner-column pair), so caller-provided
50
+ * HTML attributes — `onClick`, `tabIndex`, `style`, `data-*`, `grid-template-rows`
51
+ * overrides via `classNames` — land directly on the grid container.
52
+ * Slot-parents (`Focus.Item asChild`, `Mosaic.Tile asChild`, etc.) continue to
53
+ * work because `composable()` preserves the COMPOSABLE marker that slottable parents
54
+ * check before warning, and Radix `Slot` merges the parent's props onto the inner
55
+ * `<div>` exactly the way `slottable`'s `Slot`/`Primitive.div` branch did.
56
+ */
57
+ const CardRoot = composable<HTMLDivElement, CardRootProps>(
58
+ ({ children, id, role, border = true, fullWidth, density, ...props }, forwardedRef) => {
71
59
  const { className, ...rest } = composableProps(props);
72
- const Comp = asChild ? Slot : Primitive.div;
73
60
  const { tx } = useThemeContext();
74
61
 
75
62
  return (
76
- <Comp
77
- {...rest}
78
- {...(id && { 'data-object-id': id })}
63
+ <Column.Root
64
+ asChild
65
+ gutter={density === 'lg' ? 'lg' : density === 'sm' || density === 'xs' ? 'sm' : 'md'}
66
+ classNames={tx('card.root', { border, fullWidth }, className)}
79
67
  role={role ?? 'group'}
80
- className={tx('card.root', { border, fullWidth }, className)}
81
- ref={forwardedRef}
82
68
  >
83
- <Column.Root gutter={density === 'coarse' ? 'lg' : 'md'}>{children}</Column.Root>
84
- </Comp>
69
+ <div {...rest} {...(id && { 'data-object-id': id })} ref={forwardedRef}>
70
+ {children}
71
+ </div>
72
+ </Column.Root>
85
73
  );
86
74
  },
87
75
  );
@@ -89,24 +77,29 @@ const CardRoot = slottable<HTMLDivElement, CardRootOwnProps>(
89
77
  CardRoot.displayName = CARD_ROOT_NAME;
90
78
 
91
79
  //
92
- // Toolbar
80
+ // Header
93
81
  //
94
82
 
95
- const CARD_TOOLBAR_NAME = 'Card.Toolbar';
83
+ const CARD_HEADER_NAME = 'Card.Header';
96
84
 
97
- type CardToolbarProps = ToolbarRootProps;
85
+ type CardHeaderProps = ToolbarRootProps;
98
86
 
99
- 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) => {
100
93
  const { tx } = useThemeContext();
101
94
 
102
95
  return (
103
- <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}>
104
97
  {children}
105
98
  </Toolbar.Root>
106
99
  );
107
100
  });
108
101
 
109
- CardToolbar.displayName = CARD_TOOLBAR_NAME;
102
+ CardHeader.displayName = CARD_HEADER_NAME;
110
103
 
111
104
  //
112
105
  // DragHandle
@@ -118,7 +111,7 @@ type CardDragHandleProps = ToolbarDragHandleProps;
118
111
 
119
112
  const CardDragHandle = forwardRef<HTMLButtonElement, CardDragHandleProps>((props, forwardedRef) => {
120
113
  return (
121
- <CardIconBlock padding>
114
+ <CardIconBlock>
122
115
  <Toolbar.DragHandle {...props} ref={forwardedRef} />
123
116
  </CardIconBlock>
124
117
  );
@@ -127,22 +120,22 @@ const CardDragHandle = forwardRef<HTMLButtonElement, CardDragHandleProps>((props
127
120
  CardDragHandle.displayName = CARD_DRAG_HANDLE_NAME;
128
121
 
129
122
  //
130
- // CloseIconButton
123
+ // ActionIconButton
131
124
  //
132
125
 
133
- const CARD_CLOSE_ICON_BUTTON_NAME = 'Card.CloseIconButton';
126
+ const CARD_ACTION_ICON_BUTTON_NAME = 'Card.ActionIconButton';
134
127
 
135
- type CloseIconButtonProps = ToolbarCloseIconButtonProps;
128
+ type CardActionIconButtonProps = ToolbarActionIconButtonProps;
136
129
 
137
- const CloseIconButton = forwardRef<HTMLButtonElement, CloseIconButtonProps>((props, forwardedRef) => {
130
+ const CardActionIconButton = forwardRef<HTMLButtonElement, CardActionIconButtonProps>((props, forwardedRef) => {
138
131
  return (
139
- <CardIconBlock padding>
140
- <Toolbar.CloseIconButton {...props} ref={forwardedRef} />
132
+ <CardIconBlock>
133
+ <Toolbar.ActionIconButton {...props} ref={forwardedRef} />
141
134
  </CardIconBlock>
142
135
  );
143
136
  });
144
137
 
145
- CloseIconButton.displayName = CARD_CLOSE_ICON_BUTTON_NAME;
138
+ CardActionIconButton.displayName = CARD_ACTION_ICON_BUTTON_NAME;
146
139
 
147
140
  //
148
141
  // Menu
@@ -150,22 +143,17 @@ CloseIconButton.displayName = CARD_CLOSE_ICON_BUTTON_NAME;
150
143
 
151
144
  const CARD_MENU_NAME = 'Card.Menu';
152
145
 
153
- type CardMenuItem<T extends any | void = void> = ToolbarMenuItem<T>;
154
-
155
146
  type CardMenuProps<T extends any | void = void> = ToolbarMenuProps<T>;
156
147
 
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
-
148
+ function CardMenu<T extends any | void = void>({ context, items, ...props }: CardMenuProps<T>) {
161
149
  return (
162
- <CardIconBlock padding>
163
- <Toolbar.Menu {...props} context={context} items={combinedItems} />
150
+ <CardIconBlock>
151
+ <Toolbar.Menu {...props} context={context} items={items ?? []} />
164
152
  </CardIconBlock>
165
153
  );
166
- };
154
+ }
167
155
 
168
- (CardMenu as any).displayName = CARD_MENU_NAME;
156
+ CardMenu.displayName = CARD_MENU_NAME;
169
157
 
170
158
  //
171
159
  // Icon
@@ -173,15 +161,15 @@ const CardMenu = <T extends any | void = void>({ context, items, ...props }: Car
173
161
 
174
162
  const CARD_ICON_NAME = 'Card.Icon';
175
163
 
176
- const CardIcon = (props: IconProps) => {
164
+ function CardIcon(props: IconProps) {
177
165
  return (
178
166
  <CardIconBlock>
179
167
  <Icon {...props} />
180
168
  </CardIconBlock>
181
169
  );
182
- };
170
+ }
183
171
 
184
- (CardIcon as any).displayName = CARD_ICON_NAME;
172
+ CardIcon.displayName = CARD_ICON_NAME;
185
173
 
186
174
  //
187
175
  // IconBlock
@@ -189,17 +177,9 @@ const CardIcon = (props: IconProps) => {
189
177
 
190
178
  const CARD_ICON_BLOCK_NAME = 'Card.IconBlock';
191
179
 
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
- );
180
+ const CardIconBlock = forwardRef<HTMLDivElement, IconBlockProps>((props, forwardedRef) => {
181
+ return <IconBlock {...props} ref={forwardedRef} />;
182
+ });
203
183
 
204
184
  CardIconBlock.displayName = CARD_ICON_BLOCK_NAME;
205
185
 
@@ -224,47 +204,24 @@ const CardTitle = slottable<HTMLDivElement>(({ children, asChild, ...props }, fo
224
204
  CardTitle.displayName = CARD_TITLE_NAME;
225
205
 
226
206
  //
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
207
+ // Body
248
208
  //
249
209
 
250
- const CARD_ROW_NAME = 'Card.Row';
251
-
252
- type CardRowProps = { icon?: string; fullWidth?: boolean };
210
+ const CARD_BODY_NAME = 'Card.Body';
253
211
 
254
- const CardRow = slottable<HTMLDivElement, CardRowProps>(({ children, asChild, icon, ...props }, forwardedRef) => {
212
+ const CardBody = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
255
213
  const { className, ...rest } = composableProps(props);
256
214
  const Comp = asChild ? Slot : Primitive.div;
257
215
  const { tx } = useThemeContext();
258
216
 
259
217
  return (
260
- <Comp {...rest} className={tx('card.row', {}, className)} ref={forwardedRef}>
261
- {(icon && <CardIcon classNames='text-subdued' icon={icon} size={4} />) || <div />}
218
+ <Comp {...rest} className={tx('card.body', {}, className)} ref={forwardedRef}>
262
219
  {children}
263
220
  </Comp>
264
221
  );
265
222
  });
266
223
 
267
- CardRow.displayName = CARD_ROW_NAME;
224
+ CardBody.displayName = CARD_BODY_NAME;
268
225
 
269
226
  //
270
227
  // Section
@@ -272,53 +229,81 @@ CardRow.displayName = CARD_ROW_NAME;
272
229
 
273
230
  const CARD_SECTION_NAME = 'Card.Section';
274
231
 
232
+ type CardSectionProps = { title?: ReactNode };
233
+
275
234
  /**
276
- * @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.
277
239
  */
278
- const CardSection = slottable<HTMLDivElement>(({ children, asChild, role, ...props }, forwardedRef) => {
279
- const { className, ...rest } = composableProps(props);
280
- 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();
281
246
 
282
- return (
283
- <Comp {...rest} role={role ?? 'none'} className={mx('col-span-full', className)} ref={forwardedRef}>
284
- {children}
285
- </Comp>
286
- );
287
- });
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
+ );
288
265
 
289
266
  CardSection.displayName = CARD_SECTION_NAME;
290
267
 
291
268
  //
292
- // Heading
269
+ // Row
293
270
  //
294
271
 
295
- const CARD_HEADING_NAME = 'Card.Heading';
272
+ const CARD_ROW_NAME = 'Card.Row';
296
273
 
297
- type CardHeadingProps = { variant?: 'default' | 'subtitle' };
274
+ type CardRowProps = { icon?: string | JSX.Element; fullWidth?: boolean };
298
275
 
299
276
  /**
300
- * @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.
301
282
  */
302
- const CardHeading = slottable<HTMLDivElement, CardHeadingProps>(
303
- ({ 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();
304
286
  const { className, ...rest } = composableProps(props);
305
287
  const Comp = asChild ? Slot : Primitive.div;
306
- 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
+ );
307
296
 
308
297
  return (
309
- <Comp
310
- {...rest}
311
- role={role ?? 'heading'}
312
- className={tx('card.heading', { variant }, className)}
313
- ref={forwardedRef}
314
- >
298
+ <Comp {...rest} className={tx('card.row', { fullWidth }, className)} ref={forwardedRef}>
299
+ {!fullWidth && icon}
315
300
  {children}
316
301
  </Comp>
317
302
  );
318
303
  },
319
304
  );
320
305
 
321
- CardHeading.displayName = CARD_HEADING_NAME;
306
+ CardRow.displayName = CARD_ROW_NAME;
322
307
 
323
308
  //
324
309
  // Text
@@ -326,13 +311,19 @@ CardHeading.displayName = CARD_HEADING_NAME;
326
311
 
327
312
  const CARD_TEXT_NAME = 'Card.Text';
328
313
 
329
- type CardTextProps = { truncate?: boolean; variant?: 'default' | 'description' };
314
+ // `onClick` is opted in explicitly: `ComposableProps` deliberately excludes event handlers, but the
315
+ // part spreads rest props onto its element, so the handler is forwarded at runtime.
316
+ type CardTextProps = {
317
+ truncate?: boolean;
318
+ variant?: 'default' | 'description';
319
+ onClick?: MouseEventHandler<HTMLDivElement>;
320
+ };
330
321
 
331
322
  const CardText = slottable<HTMLDivElement, CardTextProps>(
332
323
  ({ children, asChild, role, truncate, variant = 'default', ...props }, forwardedRef) => {
324
+ const { tx } = useThemeContext();
333
325
  const { className, ...rest } = composableProps(props);
334
326
  const Comp = asChild ? Slot : Primitive.div;
335
- const { tx } = useThemeContext();
336
327
 
337
328
  return (
338
329
  <Comp {...rest} role={role ?? 'none'} className={tx('card.text', { variant }, className)} ref={forwardedRef}>
@@ -350,28 +341,27 @@ CardText.displayName = CARD_TEXT_NAME;
350
341
 
351
342
  const CARD_HTML_NAME = 'Card.Html';
352
343
 
353
- type CardHtmlProps = { html: string; variant?: 'default' | 'description' };
344
+ type CardHtmlProps = { html?: string; variant?: 'default' | 'description' };
354
345
 
355
346
  /**
356
347
  * Renders sanitized HTML content inside a card text slot.
357
348
  * Uses DOMPurify to prevent XSS from untrusted markup (e.g. RSS feed content).
358
349
  */
359
- const CardHtml = ({ html, variant = 'default', ...props }: CardHtmlProps & ThemedClassName<object>) => {
350
+ function CardHtml({ html = '', variant = 'default', ...props }: CardHtmlProps & ThemedClassName<object>) {
360
351
  const { tx } = useThemeContext();
361
352
  const sanitized = useMemo(() => DOMPurify.sanitize(html), [html]);
362
353
 
363
354
  return (
364
355
  <div
365
356
  {...props}
366
- role='none'
367
357
  className={tx('card.text', { variant })}
368
358
  // eslint-disable-next-line react/no-danger
369
359
  dangerouslySetInnerHTML={{ __html: sanitized }}
370
360
  />
371
361
  );
372
- };
362
+ }
373
363
 
374
- (CardHtml as any).displayName = CARD_HTML_NAME;
364
+ CardHtml.displayName = CARD_HTML_NAME;
375
365
 
376
366
  //
377
367
  // Poster
@@ -383,31 +373,34 @@ type CardPosterProps = ThemedClassName<
383
373
  {
384
374
  alt: string;
385
375
  aspect?: 'video' | 'auto';
386
- } & Partial<{ image: string; icon: string }>
376
+ } & Partial<{ image: string; icon: string }> &
377
+ // The image-rendering props (`fit`, `crossOrigin`, color-extraction options) are forwarded to
378
+ // the underlying `Image`. `src`/`alt`/`classNames` are owned by the poster.
379
+ Omit<ImageProps, 'src' | 'alt' | 'classNames'>
387
380
  >;
388
381
 
389
- const CardPoster = (props: CardPosterProps) => {
382
+ function CardPoster({ classNames, alt, aspect: aspectProp, image, icon, ...imageProps }: CardPosterProps) {
390
383
  const { tx } = useThemeContext();
391
- const aspect = props.aspect === 'auto' ? 'aspect-auto' : 'aspect-video';
384
+ const aspect = aspectProp === 'auto' ? 'aspect-auto' : 'aspect-video';
392
385
 
393
- if (props.image) {
386
+ if (image) {
394
387
  return (
395
- <div role='none' className='col-span-full'>
396
- <Image classNames={[tx('card.poster', {}), aspect, props.classNames]} src={props.image} alt={props.alt} />
388
+ <div className='col-span-full'>
389
+ <Image classNames={[tx('card.poster', {}), aspect, classNames]} src={image} alt={alt} {...imageProps} />
397
390
  </div>
398
391
  );
399
392
  }
400
393
 
401
- if (props.icon) {
394
+ if (icon) {
402
395
  return (
403
- <div role='image' className={tx('card.poster-icon', {}, [aspect, props.classNames])} aria-label={props.alt}>
404
- <Icon icon={props.icon} size={10} />
396
+ <div role='image' className={tx('card.poster-icon', {}, [aspect, classNames])} aria-label={alt}>
397
+ <Icon icon={icon} size={10} />
405
398
  </div>
406
399
  );
407
400
  }
408
- };
401
+ }
409
402
 
410
- (CardPoster as any).displayName = CARD_POSTER_NAME;
403
+ CardPoster.displayName = CARD_POSTER_NAME;
411
404
 
412
405
  //
413
406
  // Action
@@ -417,7 +410,7 @@ const CARD_ACTION_NAME = 'Card.Action';
417
410
 
418
411
  type CardActionProps = { icon?: string; label: string; actionIcon?: string; onClick?: () => void };
419
412
 
420
- const CardAction = ({ icon, actionIcon = 'ph--arrow-right--regular', label, onClick }: CardActionProps) => {
413
+ function CardAction({ icon, actionIcon = 'ph--arrow-right--regular', label, onClick }: CardActionProps) {
421
414
  const { tx } = useThemeContext();
422
415
  return (
423
416
  <Button variant='ghost' classNames={tx('card.action', {})} onClick={onClick}>
@@ -426,9 +419,9 @@ const CardAction = ({ icon, actionIcon = 'ph--arrow-right--regular', label, onCl
426
419
  {actionIcon && <CardIcon icon={actionIcon} size={4} />}
427
420
  </Button>
428
421
  );
429
- };
422
+ }
430
423
 
431
- (CardAction as any).displayName = CARD_ACTION_NAME;
424
+ CardAction.displayName = CARD_ACTION_NAME;
432
425
 
433
426
  //
434
427
  // Link
@@ -438,7 +431,7 @@ const CARD_LINK_NAME = 'Card.Link';
438
431
 
439
432
  type CardLinkProps = { label: string; href: string };
440
433
 
441
- const CardLink = ({ label, href }: CardLinkProps) => {
434
+ function CardLink({ label, href }: CardLinkProps) {
442
435
  const { tx } = useThemeContext();
443
436
  return (
444
437
  <a className={tx('card.link', {})} data-variant='ghost' href={href} target='_blank' rel='noreferrer'>
@@ -447,9 +440,9 @@ const CardLink = ({ label, href }: CardLinkProps) => {
447
440
  <CardIcon classNames='invisible group-hover:visible' icon='ph--arrow-square-out--regular' />
448
441
  </a>
449
442
  );
450
- };
443
+ }
451
444
 
452
- (CardLink as any).displayName = CARD_LINK_NAME;
445
+ CardLink.displayName = CARD_LINK_NAME;
453
446
 
454
447
  //
455
448
  // Card
@@ -458,24 +451,23 @@ const CardLink = ({ label, href }: CardLinkProps) => {
458
451
  export const Card = {
459
452
  Root: CardRoot,
460
453
 
461
- // Toolbar
462
- Toolbar: CardToolbar,
463
- ToolbarIconButton: Toolbar.IconButton,
464
- ToolbarSeparator: Toolbar.Separator,
454
+ // Header
455
+ Header: CardHeader,
465
456
 
466
- // Toolbar blocks
457
+ // Header parts
467
458
  IconBlock: CardIconBlock,
468
459
  DragHandle: CardDragHandle,
469
- CloseIconButton: CloseIconButton,
460
+ ActionIconButton: CardActionIconButton,
470
461
  Menu: CardMenu,
471
462
  Icon: CardIcon,
472
463
  Title: CardTitle,
473
464
 
474
- // Content
475
- Content: CardContent,
476
- Row: CardRow,
465
+ // Body
466
+ Body: CardBody,
477
467
  Section: CardSection,
478
- Heading: CardHeading,
468
+ Row: CardRow,
469
+
470
+ // Body parts
479
471
  Text: CardText,
480
472
  Html: CardHtml,
481
473
  Poster: CardPoster,
@@ -484,10 +476,10 @@ export const Card = {
484
476
  };
485
477
 
486
478
  export type {
487
- CardContextValue,
488
479
  CardRootProps,
489
- CardToolbarProps,
480
+ CardHeaderProps,
490
481
  CardDragHandleProps,
491
- CloseIconButtonProps,
482
+ CardActionIconButtonProps,
492
483
  CardMenuProps,
484
+ CardSectionProps,
493
485
  };
@@ -0,0 +1,47 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React from 'react';
7
+
8
+ import { withTheme } from '../../testing';
9
+ import { Carousel } from './Carousel';
10
+
11
+ // Stable placeholder images so the story renders without network fixtures.
12
+ const IMAGES = Array.from({ length: 5 }).map((_, index) => `https://placehold.co/640x360?text=Slide+${index + 1}`);
13
+
14
+ type DefaultStoryProps = { count?: number };
15
+
16
+ const DefaultStory = ({ count = IMAGES.length }: DefaultStoryProps) => {
17
+ const images = IMAGES.slice(0, count);
18
+ return (
19
+ <Carousel.Root count={images.length}>
20
+ <Carousel.Content classNames='max-w-[40rem]'>
21
+ <Carousel.Previous />
22
+ <Carousel.Viewport>
23
+ {images.map((src, index) => (
24
+ <Carousel.Slide key={src} index={index} src={src} alt={`Slide ${index + 1}`} />
25
+ ))}
26
+ </Carousel.Viewport>
27
+ <Carousel.Next />
28
+ <Carousel.Indicators />
29
+ <Carousel.Caption>{(index) => `Slide ${index + 1} of ${images.length}`}</Carousel.Caption>
30
+ </Carousel.Content>
31
+ </Carousel.Root>
32
+ );
33
+ };
34
+
35
+ const meta = {
36
+ title: 'ui/react-ui-core/components/Carousel',
37
+ render: DefaultStory,
38
+ decorators: [withTheme()],
39
+ } satisfies Meta<typeof DefaultStory>;
40
+
41
+ export default meta;
42
+
43
+ type Story = StoryObj<typeof meta>;
44
+
45
+ export const Default: Story = {
46
+ args: { count: 5 },
47
+ };