@dxos/react-ui 0.8.4-staging.ac66bdf99f → 0.9.1-main.c7dcc2e112

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 (496) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/browser/chunk-F3PLXTDA.mjs +1608 -0
  4. package/dist/lib/browser/chunk-F3PLXTDA.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-HFJYTGHU.mjs +43 -0
  6. package/dist/lib/browser/chunk-HFJYTGHU.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +3785 -2451
  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 +14 -17
  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-LLVUYLAM.mjs +1610 -0
  15. package/dist/lib/node-esm/chunk-LLVUYLAM.mjs.map +7 -0
  16. package/dist/lib/node-esm/chunk-OJYUPUCY.mjs +45 -0
  17. package/dist/lib/node-esm/chunk-OJYUPUCY.mjs.map +7 -0
  18. package/dist/lib/node-esm/index.mjs +3785 -2451
  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 +14 -17
  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 +3 -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 -1
  42. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  43. package/dist/types/src/components/Button/IconButton.stories.d.ts +35 -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/SystemIconButton.d.ts +20 -0
  48. package/dist/types/src/components/Button/SystemIconButton.d.ts.map +1 -0
  49. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
  50. package/dist/types/src/components/Button/ToggleGroup.d.ts +2 -2
  51. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +2 -2
  52. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
  53. package/dist/types/src/components/Button/ToggleIconButton.d.ts +15 -0
  54. package/dist/types/src/components/Button/ToggleIconButton.d.ts.map +1 -0
  55. package/dist/types/src/components/Button/index.d.ts +2 -0
  56. package/dist/types/src/components/Button/index.d.ts.map +1 -1
  57. package/dist/types/src/components/Calendar/Calendar.d.ts +33 -0
  58. package/dist/types/src/components/Calendar/Calendar.d.ts.map +1 -0
  59. package/dist/types/src/components/Calendar/Calendar.stories.d.ts +9 -0
  60. package/dist/types/src/components/Calendar/Calendar.stories.d.ts.map +1 -0
  61. package/dist/types/src/components/Calendar/Calendar.theme.d.ts +4 -0
  62. package/dist/types/src/components/Calendar/Calendar.theme.d.ts.map +1 -0
  63. package/dist/types/src/components/Calendar/index.d.ts +2 -0
  64. package/dist/types/src/components/Calendar/index.d.ts.map +1 -0
  65. package/dist/types/src/components/Card/Card.d.ts +67 -55
  66. package/dist/types/src/components/Card/Card.d.ts.map +1 -1
  67. package/dist/types/src/components/Card/Card.stories.d.ts +2 -1
  68. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -1
  69. package/dist/types/src/components/Card/Card.theme.d.ts +12 -0
  70. package/dist/types/src/components/Card/Card.theme.d.ts.map +1 -0
  71. package/dist/types/src/components/Carousel/Carousel.d.ts +106 -0
  72. package/dist/types/src/components/Carousel/Carousel.d.ts.map +1 -0
  73. package/dist/types/src/components/Carousel/Carousel.stories.d.ts +14 -0
  74. package/dist/types/src/components/Carousel/Carousel.stories.d.ts.map +1 -0
  75. package/dist/types/src/components/Carousel/index.d.ts +2 -0
  76. package/dist/types/src/components/Carousel/index.d.ts.map +1 -0
  77. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  78. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  79. package/dist/types/src/components/Clipboard/index.d.ts +2 -1
  80. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  81. package/dist/types/src/components/Column/Column.d.ts +51 -0
  82. package/dist/types/src/components/Column/Column.d.ts.map +1 -0
  83. package/dist/types/src/components/Column/Column.stories.d.ts.map +1 -0
  84. package/dist/types/src/components/Column/Column.theme.d.ts +17 -0
  85. package/dist/types/src/components/Column/Column.theme.d.ts.map +1 -0
  86. package/dist/types/src/components/Column/index.d.ts +3 -0
  87. package/dist/types/src/components/Column/index.d.ts.map +1 -0
  88. package/dist/types/src/components/Column/withColumn.d.ts +21 -0
  89. package/dist/types/src/components/Column/withColumn.d.ts.map +1 -0
  90. package/dist/types/src/components/DatePicker/DatePicker.d.ts +72 -0
  91. package/dist/types/src/components/DatePicker/DatePicker.d.ts.map +1 -0
  92. package/dist/types/src/components/DatePicker/DatePicker.stories.d.ts +10 -0
  93. package/dist/types/src/components/DatePicker/DatePicker.stories.d.ts.map +1 -0
  94. package/dist/types/src/components/DatePicker/DatePicker.theme.d.ts +6 -0
  95. package/dist/types/src/components/DatePicker/DatePicker.theme.d.ts.map +1 -0
  96. package/dist/types/src/components/DatePicker/index.d.ts +2 -0
  97. package/dist/types/src/components/DatePicker/index.d.ts.map +1 -0
  98. package/dist/types/src/components/Dialog/AlertDialog.d.ts +20 -20
  99. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  100. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  101. package/dist/types/src/components/Dialog/Dialog.d.ts +21 -19
  102. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  103. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  104. package/dist/types/src/components/Dialog/Dialog.theme.d.ts +10 -0
  105. package/dist/types/src/components/Dialog/Dialog.theme.d.ts.map +1 -0
  106. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -1
  107. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -1
  108. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -1
  109. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -1
  110. package/dist/types/src/components/Focus/Focus.d.ts +2 -2
  111. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -1
  112. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -1
  113. package/dist/types/src/components/Focus/Focus.theme.d.ts +6 -0
  114. package/dist/types/src/components/Focus/Focus.theme.d.ts.map +1 -0
  115. package/dist/types/src/components/Icon/Icon.d.ts +1 -0
  116. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  117. package/dist/types/src/components/Icon/Icon.stories.d.ts +1 -1
  118. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  119. package/dist/types/src/components/Icon/Icon.theme.d.ts +11 -0
  120. package/dist/types/src/components/Icon/Icon.theme.d.ts.map +1 -0
  121. package/dist/types/src/components/Icon/IconBlock.d.ts +15 -0
  122. package/dist/types/src/components/Icon/IconBlock.d.ts.map +1 -0
  123. package/dist/types/src/components/Icon/index.d.ts +1 -0
  124. package/dist/types/src/components/Icon/index.d.ts.map +1 -1
  125. package/dist/types/src/components/Image/Image.d.ts +8 -1
  126. package/dist/types/src/components/Image/Image.d.ts.map +1 -1
  127. package/dist/types/src/components/Image/Image.stories.d.ts +3 -2
  128. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -1
  129. package/dist/types/src/components/Input/Input.d.ts +88 -13
  130. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  131. package/dist/types/src/components/Input/Input.stories.d.ts +14 -3
  132. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  133. package/dist/types/src/components/Input/Input.theme.d.ts +115 -0
  134. package/dist/types/src/components/Input/Input.theme.d.ts.map +1 -0
  135. package/dist/types/src/components/Input/SegmentedInput.d.ts +79 -0
  136. package/dist/types/src/components/Input/SegmentedInput.d.ts.map +1 -0
  137. package/dist/types/src/components/Input/constants.d.ts +5 -0
  138. package/dist/types/src/components/Input/constants.d.ts.map +1 -0
  139. package/dist/types/src/components/Input/index.d.ts +2 -0
  140. package/dist/types/src/components/Input/index.d.ts.map +1 -1
  141. package/dist/types/src/components/Link/Link.d.ts.map +1 -1
  142. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  143. package/dist/types/src/components/Link/Link.theme.d.ts +6 -0
  144. package/dist/types/src/components/Link/Link.theme.d.ts.map +1 -0
  145. package/dist/types/src/components/List/List.d.ts +2 -2
  146. package/dist/types/src/components/List/List.d.ts.map +1 -1
  147. package/dist/types/src/components/List/List.stories.d.ts +1 -1
  148. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  149. package/dist/types/src/components/List/List.theme.d.ts +7 -0
  150. package/dist/types/src/components/List/List.theme.d.ts.map +1 -0
  151. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -1
  152. package/dist/types/src/components/List/Tree.d.ts +2 -2
  153. package/dist/types/src/components/List/Tree.d.ts.map +1 -1
  154. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
  155. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -1
  156. package/dist/types/src/components/List/Treegrid.d.ts +2 -2
  157. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  158. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
  159. package/dist/types/src/components/List/Treegrid.theme.d.ts +7 -0
  160. package/dist/types/src/components/List/Treegrid.theme.d.ts.map +1 -0
  161. package/dist/types/src/components/Main/Main.d.ts +9 -5
  162. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  163. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  164. package/dist/types/src/components/Main/Main.theme.d.ts +20 -0
  165. package/dist/types/src/components/Main/Main.theme.d.ts.map +1 -0
  166. package/dist/types/src/components/Main/constants.d.ts +3 -0
  167. package/dist/types/src/components/Main/constants.d.ts.map +1 -0
  168. package/dist/types/src/components/Main/index.d.ts +1 -0
  169. package/dist/types/src/components/Main/index.d.ts.map +1 -1
  170. package/dist/types/src/components/Main/useSwipeToDismiss.d.ts.map +1 -1
  171. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +47 -0
  172. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -0
  173. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts +16 -0
  174. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts.map +1 -0
  175. package/dist/types/src/components/MediaPlayer/index.d.ts +2 -0
  176. package/dist/types/src/components/MediaPlayer/index.d.ts.map +1 -0
  177. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -1
  178. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -1
  179. package/dist/types/src/components/Menu/DropdownMenu.d.ts +11 -3
  180. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
  181. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
  182. package/dist/types/src/components/Menu/Menu.theme.d.ts +7 -0
  183. package/dist/types/src/components/Menu/Menu.theme.d.ts.map +1 -0
  184. package/dist/types/src/components/Message/Message.d.ts +3 -3
  185. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  186. package/dist/types/src/components/Message/Message.stories.d.ts +5 -1
  187. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  188. package/dist/types/src/components/Message/Message.theme.d.ts +7 -0
  189. package/dist/types/src/components/Message/Message.theme.d.ts.map +1 -0
  190. package/dist/types/src/{primitives → components}/Panel/Panel.d.ts +5 -5
  191. package/dist/types/src/components/Panel/Panel.d.ts.map +1 -0
  192. package/dist/types/src/components/Panel/Panel.stories.d.ts.map +1 -0
  193. package/dist/types/src/components/Panel/Panel.theme.d.ts +13 -0
  194. package/dist/types/src/components/Panel/Panel.theme.d.ts.map +1 -0
  195. package/dist/types/src/components/Panel/index.d.ts.map +1 -0
  196. package/dist/types/src/components/Popover/Popover.d.ts +10 -2
  197. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  198. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  199. package/dist/types/src/components/Popover/Popover.theme.d.ts +8 -0
  200. package/dist/types/src/components/Popover/Popover.theme.d.ts.map +1 -0
  201. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +2 -2
  202. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  203. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +2 -2
  204. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  205. package/dist/types/src/components/ScrollArea/ScrollArea.theme.d.ts +17 -0
  206. package/dist/types/src/components/ScrollArea/ScrollArea.theme.d.ts.map +1 -0
  207. package/dist/types/src/components/ScrollArea/index.d.ts +1 -0
  208. package/dist/types/src/components/ScrollArea/index.d.ts.map +1 -1
  209. package/dist/types/src/components/ScrollArea/scrollbar.d.ts +18 -0
  210. package/dist/types/src/components/ScrollArea/scrollbar.d.ts.map +1 -0
  211. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +20 -18
  212. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  213. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  214. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  215. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  216. package/dist/types/src/components/Select/Select.theme.d.ts +6 -0
  217. package/dist/types/src/components/Select/Select.theme.d.ts.map +1 -0
  218. package/dist/types/src/components/Separator/Separator.theme.d.ts +7 -0
  219. package/dist/types/src/components/Separator/Separator.theme.d.ts.map +1 -0
  220. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -1
  221. package/dist/types/src/components/Skeleton/Skeleton.theme.d.ts +6 -0
  222. package/dist/types/src/components/Skeleton/Skeleton.theme.d.ts.map +1 -0
  223. package/dist/types/src/components/Splitter/Splitter.d.ts +6 -8
  224. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -1
  225. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -1
  226. package/dist/types/src/components/Splitter/Splitter.theme.d.ts +4 -0
  227. package/dist/types/src/components/Splitter/Splitter.theme.d.ts.map +1 -0
  228. package/dist/types/src/components/Status/Status.d.ts +1 -1
  229. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  230. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  231. package/dist/types/src/components/Status/Status.theme.d.ts +7 -0
  232. package/dist/types/src/components/Status/Status.theme.d.ts.map +1 -0
  233. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  234. package/dist/types/src/components/Tag/Tag.theme.d.ts +6 -0
  235. package/dist/types/src/components/Tag/Tag.theme.d.ts.map +1 -0
  236. package/dist/types/src/components/Toast/Toast.d.ts +12 -9
  237. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  238. package/dist/types/src/components/Toast/Toast.stories.d.ts +5 -2
  239. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  240. package/dist/types/src/components/Toast/Toast.theme.d.ts +4 -0
  241. package/dist/types/src/components/Toast/Toast.theme.d.ts.map +1 -0
  242. package/dist/types/src/components/Toolbar/Toolbar.d.ts +24 -12
  243. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  244. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  245. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts +8 -0
  246. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts.map +1 -0
  247. package/dist/types/src/components/Tooltip/TextTooltip.d.ts +19 -0
  248. package/dist/types/src/components/Tooltip/TextTooltip.d.ts.map +1 -0
  249. package/dist/types/src/components/Tooltip/Tooltip.d.ts +8 -8
  250. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  251. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  252. package/dist/types/src/components/Tooltip/Tooltip.theme.d.ts +6 -0
  253. package/dist/types/src/components/Tooltip/Tooltip.theme.d.ts.map +1 -0
  254. package/dist/types/src/components/Tooltip/index.d.ts +2 -0
  255. package/dist/types/src/components/Tooltip/index.d.ts.map +1 -1
  256. package/dist/types/src/components/Tooltip/tooltipContent.d.ts +4 -0
  257. package/dist/types/src/components/Tooltip/tooltipContent.d.ts.map +1 -0
  258. package/dist/types/src/components/index.d.ts +7 -4
  259. package/dist/types/src/components/index.d.ts.map +1 -1
  260. package/dist/types/src/exemplars/generics.stories.d.ts +1 -1
  261. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -1
  262. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -1
  263. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -1
  264. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -1
  265. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  266. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  267. package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
  268. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  269. package/dist/types/src/hooks/useSafeCollisionPadding.d.ts.map +1 -1
  270. package/dist/types/src/hooks/useTranslationsContext.d.ts +1 -1
  271. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  272. package/dist/types/src/index.d.ts +1 -0
  273. package/dist/types/src/index.d.ts.map +1 -1
  274. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  275. package/dist/types/src/playground/Custom.stories.d.ts +1 -1
  276. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  277. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  278. package/dist/types/src/primitives/Container/Container.d.ts +1 -1
  279. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -1
  280. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -1
  281. package/dist/types/src/{components → primitives}/DensityProvider/DensityProvider.d.ts.map +1 -1
  282. package/dist/types/src/primitives/DensityProvider/index.d.ts.map +1 -0
  283. package/dist/types/src/{components → primitives}/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  284. package/dist/types/src/primitives/ElevationProvider/index.d.ts.map +1 -0
  285. package/dist/types/src/primitives/Flex/Flex.d.ts +1 -1
  286. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -1
  287. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -1
  288. package/dist/types/src/primitives/Grid/Grid.d.ts +1 -1
  289. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -1
  290. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -1
  291. package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  292. package/dist/types/src/primitives/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  293. package/dist/types/src/primitives/ThemeProvider/TranslationsProvider.d.ts +128 -0
  294. package/dist/types/src/primitives/ThemeProvider/TranslationsProvider.d.ts.map +1 -0
  295. package/dist/types/src/primitives/ThemeProvider/index.d.ts +4 -0
  296. package/dist/types/src/primitives/ThemeProvider/index.d.ts.map +1 -0
  297. package/dist/types/src/primitives/index.d.ts +3 -2
  298. package/dist/types/src/primitives/index.d.ts.map +1 -1
  299. package/dist/types/src/testing/Loading.d.ts.map +1 -1
  300. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  301. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  302. package/dist/types/src/testing/decorators/withTheme.d.ts +5 -1
  303. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  304. package/dist/types/src/theme/bindTheme.d.ts +3 -0
  305. package/dist/types/src/theme/bindTheme.d.ts.map +1 -0
  306. package/dist/types/src/theme/defaultTheme.d.ts +4 -0
  307. package/dist/types/src/theme/defaultTheme.d.ts.map +1 -0
  308. package/dist/types/src/theme/index.d.ts +31 -0
  309. package/dist/types/src/theme/index.d.ts.map +1 -0
  310. package/dist/types/src/translations.d.ts +27 -3
  311. package/dist/types/src/translations.d.ts.map +1 -1
  312. package/dist/types/src/util/index.d.ts +2 -1
  313. package/dist/types/src/util/index.d.ts.map +1 -1
  314. package/dist/types/src/util/mobile.d.ts +5 -0
  315. package/dist/types/src/util/mobile.d.ts.map +1 -0
  316. package/dist/types/src/util/slots.d.ts +57 -0
  317. package/dist/types/src/util/slots.d.ts.map +1 -0
  318. package/dist/types/src/util/usePx.d.ts.map +1 -1
  319. package/dist/types/tsconfig.tsbuildinfo +1 -1
  320. package/package.json +29 -25
  321. package/src/components/Avatars/Avatar.theme.ts +93 -0
  322. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -1
  323. package/src/components/Breadcrumb/Breadcrumb.theme.ts +26 -0
  324. package/src/components/Breadcrumb/Breadcrumb.tsx +14 -2
  325. package/src/components/Button/Button.theme.ts +31 -0
  326. package/src/components/Button/Button.tsx +25 -4
  327. package/src/components/Button/IconButton.stories.tsx +132 -4
  328. package/src/components/Button/IconButton.theme.ts +21 -0
  329. package/src/components/Button/IconButton.tsx +3 -4
  330. package/src/components/Button/SystemIconButton.tsx +153 -0
  331. package/src/components/Button/ToggleIconButton.tsx +32 -0
  332. package/src/components/Button/index.ts +2 -0
  333. package/src/components/Calendar/Calendar.stories.tsx +43 -0
  334. package/src/components/Calendar/Calendar.theme.ts +74 -0
  335. package/src/components/Calendar/Calendar.tsx +196 -0
  336. package/src/components/Calendar/index.ts +5 -0
  337. package/src/components/Card/Card.stories.tsx +109 -46
  338. package/src/components/Card/Card.theme.ts +111 -0
  339. package/src/components/Card/Card.tsx +281 -212
  340. package/src/components/Carousel/Carousel.stories.tsx +47 -0
  341. package/src/components/Carousel/Carousel.tsx +373 -0
  342. package/src/components/Carousel/index.ts +5 -0
  343. package/src/components/Clipboard/CopyButton.tsx +3 -3
  344. package/src/{primitives → components}/Column/Column.stories.tsx +1 -1
  345. package/src/components/Column/Column.theme.ts +76 -0
  346. package/src/{primitives → components}/Column/Column.tsx +38 -2
  347. package/src/{primitives → components}/Column/index.ts +1 -0
  348. package/src/components/Column/withColumn.ts +27 -0
  349. package/src/components/DatePicker/DatePicker.stories.tsx +102 -0
  350. package/src/components/DatePicker/DatePicker.theme.ts +35 -0
  351. package/src/components/DatePicker/DatePicker.tsx +279 -0
  352. package/src/components/DatePicker/index.ts +5 -0
  353. package/src/components/Dialog/AlertDialog.tsx +12 -16
  354. package/src/components/Dialog/Dialog.stories.tsx +2 -2
  355. package/src/components/Dialog/Dialog.theme.ts +61 -0
  356. package/src/components/Dialog/Dialog.tsx +46 -17
  357. package/src/components/ErrorFallback/ErrorFallback.tsx +14 -8
  358. package/src/components/ErrorFallback/ErrorStack.tsx +12 -6
  359. package/src/components/Focus/Focus.theme.ts +32 -0
  360. package/src/components/Focus/Focus.tsx +1 -1
  361. package/src/components/Icon/Icon.theme.ts +45 -0
  362. package/src/components/Icon/Icon.tsx +10 -3
  363. package/src/components/Icon/IconBlock.tsx +38 -0
  364. package/src/components/Icon/index.ts +1 -0
  365. package/src/components/Image/Image.stories.tsx +1 -1
  366. package/src/components/Image/Image.tsx +38 -9
  367. package/src/components/Input/Input.stories.tsx +132 -29
  368. package/src/components/Input/Input.theme.ts +191 -0
  369. package/src/components/Input/Input.tsx +208 -2
  370. package/src/components/Input/SegmentedInput.tsx +454 -0
  371. package/src/components/Input/constants.ts +8 -0
  372. package/src/components/Input/index.ts +2 -0
  373. package/src/components/Link/Link.theme.ts +16 -0
  374. package/src/components/Link/Link.tsx +10 -2
  375. package/src/components/List/List.stories.tsx +1 -1
  376. package/src/components/List/List.theme.ts +47 -0
  377. package/src/components/List/List.tsx +3 -3
  378. package/src/components/List/ListDropIndicator.tsx +1 -2
  379. package/src/components/List/Tree.stories.tsx +1 -1
  380. package/src/components/List/TreeDropIndicator.tsx +3 -3
  381. package/src/components/List/Treegrid.theme.ts +35 -0
  382. package/src/components/List/Treegrid.tsx +3 -4
  383. package/src/components/Main/Main.theme.ts +29 -0
  384. package/src/components/Main/Main.tsx +9 -7
  385. package/src/components/Main/constants.ts +6 -0
  386. package/src/components/Main/index.ts +1 -0
  387. package/src/components/MediaPlayer/MediaPlayer.stories.tsx +50 -0
  388. package/src/components/MediaPlayer/MediaPlayer.tsx +182 -0
  389. package/src/components/MediaPlayer/index.ts +5 -0
  390. package/src/components/Menu/ContextMenu.stories.tsx +0 -3
  391. package/src/components/Menu/DropdownMenu.stories.tsx +0 -3
  392. package/src/components/Menu/DropdownMenu.tsx +15 -15
  393. package/src/components/Menu/Menu.theme.ts +48 -0
  394. package/src/components/Message/Message.stories.tsx +43 -5
  395. package/src/components/Message/Message.theme.ts +34 -0
  396. package/src/components/Message/Message.tsx +76 -16
  397. package/src/{primitives → components}/Panel/Panel.stories.tsx +2 -3
  398. package/src/components/Panel/Panel.theme.ts +41 -0
  399. package/src/{primitives → components}/Panel/Panel.tsx +2 -1
  400. package/src/components/Popover/Popover.theme.ts +40 -0
  401. package/src/components/Popover/Popover.tsx +7 -7
  402. package/src/components/ScrollArea/ScrollArea.stories.tsx +2 -6
  403. package/src/components/ScrollArea/ScrollArea.theme.ts +107 -0
  404. package/src/components/ScrollArea/ScrollArea.tsx +3 -2
  405. package/src/components/ScrollArea/index.ts +1 -0
  406. package/src/components/ScrollArea/scrollbar.ts +21 -0
  407. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +1 -1
  408. package/src/components/ScrollContainer/ScrollContainer.tsx +58 -58
  409. package/src/components/Select/Select.theme.ts +55 -0
  410. package/src/components/Select/Select.tsx +26 -10
  411. package/src/components/Separator/Separator.theme.ts +23 -0
  412. package/src/components/Skeleton/Skeleton.theme.ts +22 -0
  413. package/src/components/Splitter/Splitter.stories.tsx +1 -1
  414. package/src/components/Splitter/Splitter.theme.ts +18 -0
  415. package/src/components/Splitter/Splitter.tsx +10 -15
  416. package/src/components/Status/Status.theme.ts +31 -0
  417. package/src/components/Status/Status.tsx +1 -2
  418. package/src/components/Tag/Tag.theme.ts +22 -0
  419. package/src/components/Toast/Toast.stories.tsx +41 -20
  420. package/src/components/Toast/Toast.theme.ts +50 -0
  421. package/src/components/Toast/Toast.tsx +96 -27
  422. package/src/components/Toolbar/Toolbar.theme.ts +36 -0
  423. package/src/components/Toolbar/Toolbar.tsx +67 -15
  424. package/src/components/Tooltip/TextTooltip.tsx +54 -0
  425. package/src/components/Tooltip/Tooltip.stories.tsx +1 -10
  426. package/src/components/Tooltip/Tooltip.theme.ts +19 -0
  427. package/src/components/Tooltip/Tooltip.tsx +18 -17
  428. package/src/components/Tooltip/index.ts +2 -0
  429. package/src/components/Tooltip/tooltipContent.ts +16 -0
  430. package/src/components/index.ts +7 -5
  431. package/src/exemplars/generics.stories.tsx +1 -2
  432. package/src/exemplars/slot.stories.tsx +5 -6
  433. package/src/exemplars/virtualizer.stories.tsx +0 -1
  434. package/src/hooks/useDensityContext.ts +1 -1
  435. package/src/hooks/useElevationContext.ts +1 -1
  436. package/src/hooks/useThemeContext.ts +1 -1
  437. package/src/hooks/useTranslationsContext.ts +1 -1
  438. package/src/index.ts +1 -0
  439. package/src/playground/Custom.stories.tsx +12 -32
  440. package/src/primitives/Container/Container.tsx +3 -1
  441. package/src/{components → primitives}/DensityProvider/DensityProvider.tsx +1 -1
  442. package/src/primitives/Flex/Flex.tsx +3 -1
  443. package/src/primitives/Grid/Grid.tsx +3 -1
  444. package/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.tsx +1 -1
  445. package/src/{components → primitives}/ThemeProvider/ThemeProvider.tsx +1 -1
  446. package/src/{components → primitives}/ThemeProvider/index.ts +2 -2
  447. package/src/primitives/index.ts +4 -2
  448. package/src/testing/Loading.tsx +2 -1
  449. package/src/testing/decorators/withLayout.tsx +7 -17
  450. package/src/testing/decorators/withLayoutVariants.tsx +1 -1
  451. package/src/testing/decorators/withTheme.tsx +21 -13
  452. package/src/theme/bindTheme.ts +13 -0
  453. package/src/theme/defaultTheme.ts +83 -0
  454. package/src/theme/index.ts +37 -0
  455. package/src/translations.ts +24 -0
  456. package/src/util/index.ts +2 -1
  457. package/src/util/mobile.ts +11 -0
  458. package/src/util/slots.ts +129 -0
  459. package/src/util/usePx.ts +4 -1
  460. package/dist/lib/browser/chunk-OCVRIJCH.mjs +0 -848
  461. package/dist/lib/browser/chunk-OCVRIJCH.mjs.map +0 -7
  462. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs +0 -850
  463. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs.map +0 -7
  464. package/dist/types/src/components/DensityProvider/index.d.ts.map +0 -1
  465. package/dist/types/src/components/ElevationProvider/index.d.ts.map +0 -1
  466. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +0 -1
  467. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +0 -129
  468. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +0 -1
  469. package/dist/types/src/components/ThemeProvider/index.d.ts +0 -4
  470. package/dist/types/src/components/ThemeProvider/index.d.ts.map +0 -1
  471. package/dist/types/src/primitives/Column/Column.d.ts +0 -33
  472. package/dist/types/src/primitives/Column/Column.d.ts.map +0 -1
  473. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +0 -1
  474. package/dist/types/src/primitives/Column/index.d.ts +0 -2
  475. package/dist/types/src/primitives/Column/index.d.ts.map +0 -1
  476. package/dist/types/src/primitives/Panel/Panel.d.ts.map +0 -1
  477. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +0 -1
  478. package/dist/types/src/primitives/Panel/index.d.ts.map +0 -1
  479. package/dist/types/src/util/hasIosKeyboard.d.ts +0 -2
  480. package/dist/types/src/util/hasIosKeyboard.d.ts.map +0 -1
  481. package/src/util/hasIosKeyboard.ts +0 -8
  482. /package/dist/types/src/{primitives → components}/Column/Column.stories.d.ts +0 -0
  483. /package/dist/types/src/{primitives → components}/Panel/Panel.stories.d.ts +0 -0
  484. /package/dist/types/src/{primitives → components}/Panel/index.d.ts +0 -0
  485. /package/dist/types/src/{components → primitives}/DensityProvider/DensityProvider.d.ts +0 -0
  486. /package/dist/types/src/{components → primitives}/DensityProvider/index.d.ts +0 -0
  487. /package/dist/types/src/{components → primitives}/ElevationProvider/ElevationProvider.d.ts +0 -0
  488. /package/dist/types/src/{components → primitives}/ElevationProvider/index.d.ts +0 -0
  489. /package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.d.ts +0 -0
  490. /package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.d.ts +0 -0
  491. /package/src/{primitives → components}/Column/AUDIT.md +0 -0
  492. /package/src/{primitives → components}/Panel/index.ts +0 -0
  493. /package/src/{components → primitives}/DensityProvider/index.ts +0 -0
  494. /package/src/{components → primitives}/ElevationProvider/ElevationProvider.tsx +0 -0
  495. /package/src/{components → primitives}/ElevationProvider/index.ts +0 -0
  496. /package/src/{components → primitives}/ThemeProvider/TranslationsProvider.tsx +0 -0
@@ -5,46 +5,23 @@
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';
19
- import { type Density } from '@dxos/ui-types';
8
+ import React, { CSSProperties, MouseEventHandler, type ReactNode, forwardRef, useId, useMemo } from 'react';
9
+ import { useTranslation } from 'react-i18next';
20
10
 
21
- import { useThemeContext } from '../../hooks';
22
- import { Column } from '../../primitives';
23
- import { type ThemedClassName } from '../../util';
24
- import { Button } from '../Button';
25
- import { Icon, type IconProps } from '../Icon';
26
- import { Image } from '../Image';
27
- import {
28
- Toolbar,
29
- ToolbarCloseIconButtonProps,
30
- ToolbarDragHandleProps,
31
- type ToolbarMenuItem,
32
- type ToolbarMenuProps,
33
- type ToolbarRootProps,
34
- } from '../Toolbar';
35
-
36
- //
37
- // Context
38
- //
11
+ import { iconSize } from '@dxos/ui-theme';
12
+ import { type Density, type SlottableProps } from '@dxos/ui-types';
39
13
 
40
- const CARD_NAME = 'Card';
14
+ import { translationKey } from '#translations';
41
15
 
42
- type CardContextValue = {
43
- menuItems?: CardMenuItem<any>[];
44
- };
45
-
46
- /** @deprecated Use context for menus. */
47
- const CardContext = createContext<CardContextValue>({});
16
+ import { useThemeContext } from '../../hooks';
17
+ import { composable, composableProps, slottable } from '../../util';
18
+ import { type ThemedClassName } from '../../util';
19
+ import { Button, IconButton } from '../Button';
20
+ import { Column } from '../Column';
21
+ import { Icon } from '../Icon';
22
+ import { Image, type ImageProps } from '../Image';
23
+ import { DropdownMenu } from '../Menu';
24
+ import { type ToolbarActionIconButtonProps, type ToolbarDragHandleProps, type ToolbarMenuProps } from '../Toolbar';
48
25
 
49
26
  //
50
27
  // Root
@@ -52,7 +29,7 @@ const CardContext = createContext<CardContextValue>({});
52
29
 
53
30
  const CARD_ROOT_NAME = 'Card.Root';
54
31
 
55
- type CardRootOwnProps = {
32
+ type CardRootProps = {
56
33
  id?: string;
57
34
  border?: boolean;
58
35
  fullWidth?: boolean;
@@ -64,24 +41,33 @@ type CardRootOwnProps = {
64
41
  'data-testid'?: string;
65
42
  };
66
43
 
67
- type CardRootProps = CardRootOwnProps;
68
-
69
- const CardRoot = slottable<HTMLDivElement, CardRootOwnProps>(
70
- ({ children, id, asChild, role, border = true, fullWidth, density, ...props }, forwardedRef) => {
44
+ /**
45
+ * `Card.Root` does not support `asChild`. The Column grid is the root element
46
+ * (one `<div>` carrying both the `dx-card` and `dx-column-root` classes
47
+ * instead of the previous outer-card + inner-column pair), so caller-provided
48
+ * HTML attributes — `onClick`, `tabIndex`, `style`, `data-*`, `grid-template-rows`
49
+ * overrides via `classNames` — land directly on the grid container.
50
+ * Slot-parents (`Focus.Item asChild`, `Mosaic.Tile asChild`, etc.) continue to
51
+ * work because `composable()` preserves the COMPOSABLE marker that slottable parents
52
+ * check before warning, and Radix `Slot` merges the parent's props onto the inner
53
+ * `<div>` exactly the way `slottable`'s `Slot`/`Primitive.div` branch did.
54
+ */
55
+ const CardRoot = composable<HTMLDivElement, CardRootProps>(
56
+ ({ children, id, role, border = true, fullWidth, density, ...props }, forwardedRef) => {
71
57
  const { className, ...rest } = composableProps(props);
72
- const Comp = asChild ? Slot : Primitive.div;
73
58
  const { tx } = useThemeContext();
74
59
 
75
60
  return (
76
- <Comp
77
- {...rest}
78
- {...(id && { 'data-object-id': id })}
61
+ <Column.Root
62
+ asChild
63
+ gutter={density === 'lg' ? 'lg' : density === 'sm' || density === 'xs' ? 'sm' : 'md'}
64
+ classNames={tx('card.root', { border, fullWidth }, className)}
79
65
  role={role ?? 'group'}
80
- className={tx('card.root', { border, fullWidth }, className)}
81
- ref={forwardedRef}
82
66
  >
83
- <Column.Root gutter={density === 'coarse' ? 'lg' : 'md'}>{children}</Column.Root>
84
- </Comp>
67
+ <div {...rest} {...(id && { 'data-object-id': id })} ref={forwardedRef}>
68
+ {children}
69
+ </div>
70
+ </Column.Root>
85
71
  );
86
72
  },
87
73
  );
@@ -89,24 +75,41 @@ const CardRoot = slottable<HTMLDivElement, CardRootOwnProps>(
89
75
  CardRoot.displayName = CARD_ROOT_NAME;
90
76
 
91
77
  //
92
- // Toolbar
78
+ // Header
93
79
  //
94
80
 
95
- const CARD_TOOLBAR_NAME = 'Card.Toolbar';
81
+ const CARD_HEADER_NAME = 'Card.Header';
96
82
 
97
- type CardToolbarProps = ToolbarRootProps;
83
+ type CardHeaderProps = SlottableProps;
98
84
 
99
- const CardToolbar = composable<HTMLDivElement, CardToolbarProps>(({ children, classNames, ...props }, forwardedRef) => {
100
- const { tx } = useThemeContext();
85
+ /**
86
+ * Top header row of a Card. Renders as a `<header>` and shares `Card.Row`'s subgrid +
87
+ * `data-slot` layout: `Card.Block` children land in the gutters, anonymous children
88
+ * (e.g. `Card.Title`) in the center. Sets `--icon-size` 5 — header icons are larger than
89
+ * row icons (which use 4). Not a toolbar: most headers carry 0–1 controls, so `role="toolbar"`
90
+ * was inaccurate; controls are reached by normal tab order.
91
+ */
92
+ const CardHeader = slottable<HTMLDivElement, CardHeaderProps>(
93
+ ({ children, asChild, style, ...props }, forwardedRef) => {
94
+ const { tx } = useThemeContext();
95
+ const { className, ...rest } = composableProps(props);
96
+ // `@radix-ui/react-primitive` has no `header` node; the intrinsic element handles asChild via Slot.
97
+ const Comp = asChild ? Slot : 'header';
101
98
 
102
- return (
103
- <Toolbar.Root {...props} style={iconSize(5)} classNames={[tx('card.toolbar', {}), classNames]} ref={forwardedRef}>
104
- {children}
105
- </Toolbar.Root>
106
- );
107
- });
99
+ return (
100
+ <Comp
101
+ {...rest}
102
+ style={{ ...iconSize(5), ...style }}
103
+ className={tx('card.header', {}, className)}
104
+ ref={forwardedRef}
105
+ >
106
+ {children}
107
+ </Comp>
108
+ );
109
+ },
110
+ );
108
111
 
109
- CardToolbar.displayName = CARD_TOOLBAR_NAME;
112
+ CardHeader.displayName = CARD_HEADER_NAME;
110
113
 
111
114
  //
112
115
  // DragHandle
@@ -116,33 +119,62 @@ const CARD_DRAG_HANDLE_NAME = 'Card.DragHandle';
116
119
 
117
120
  type CardDragHandleProps = ToolbarDragHandleProps;
118
121
 
119
- const CardDragHandle = forwardRef<HTMLButtonElement, CardDragHandleProps>((props, forwardedRef) => {
120
- return (
121
- <CardIconBlock padding>
122
- <Toolbar.DragHandle {...props} ref={forwardedRef} />
123
- </CardIconBlock>
124
- );
125
- });
122
+ const CardDragHandle = forwardRef<HTMLButtonElement, CardDragHandleProps>(
123
+ ({ testId = 'drag-handle', label }, forwardedRef) => {
124
+ const { t } = useTranslation(translationKey);
125
+ return (
126
+ <CardBlock>
127
+ <IconButton
128
+ data-testid={testId}
129
+ tabIndex={-1}
130
+ noTooltip
131
+ iconOnly
132
+ icon='ph--dots-six-vertical--regular'
133
+ variant='ghost'
134
+ label={label ?? t('toolbar-drag-handle.label')}
135
+ classNames='dx-focus-ring-none cursor-pointer text-base-fg'
136
+ disabled={!forwardedRef}
137
+ ref={forwardedRef}
138
+ />
139
+ </CardBlock>
140
+ );
141
+ },
142
+ );
126
143
 
127
144
  CardDragHandle.displayName = CARD_DRAG_HANDLE_NAME;
128
145
 
129
146
  //
130
- // CloseIconButton
147
+ // ActionIconButton
131
148
  //
132
149
 
133
- const CARD_CLOSE_ICON_BUTTON_NAME = 'Card.CloseIconButton';
150
+ const CARD_ACTION_ICON_BUTTON_NAME = 'Card.ActionIconButton';
134
151
 
135
- type CloseIconButtonProps = ToolbarCloseIconButtonProps;
152
+ type CardActionIconButtonProps = ToolbarActionIconButtonProps;
136
153
 
137
- const CloseIconButton = forwardRef<HTMLButtonElement, CloseIconButtonProps>((props, forwardedRef) => {
138
- return (
139
- <CardIconBlock padding>
140
- <Toolbar.CloseIconButton {...props} ref={forwardedRef} />
141
- </CardIconBlock>
142
- );
143
- });
154
+ const CARD_ACTION_ICONS = { close: 'ph--x--regular', delete: 'ph--trash--regular' } as const;
155
+
156
+ const CARD_ACTION_LABEL_KEYS = { close: 'toolbar-close.label', delete: 'toolbar-delete.label' } as const;
157
+
158
+ const CardActionIconButton = forwardRef<HTMLButtonElement, CardActionIconButtonProps>(
159
+ ({ action, onClick, label }, forwardedRef) => {
160
+ const { t } = useTranslation(translationKey);
161
+ return (
162
+ <CardBlock end>
163
+ <IconButton
164
+ iconOnly
165
+ icon={CARD_ACTION_ICONS[action]}
166
+ variant='ghost'
167
+ label={label ?? t(CARD_ACTION_LABEL_KEYS[action])}
168
+ classNames='cursor-pointer'
169
+ onClick={onClick}
170
+ ref={forwardedRef}
171
+ />
172
+ </CardBlock>
173
+ );
174
+ },
175
+ );
144
176
 
145
- CloseIconButton.displayName = CARD_CLOSE_ICON_BUTTON_NAME;
177
+ CardActionIconButton.displayName = CARD_ACTION_ICON_BUTTON_NAME;
146
178
 
147
179
  //
148
180
  // Menu
@@ -150,58 +182,69 @@ CloseIconButton.displayName = CARD_CLOSE_ICON_BUTTON_NAME;
150
182
 
151
183
  const CARD_MENU_NAME = 'Card.Menu';
152
184
 
153
- type CardMenuItem<T extends any | void = void> = ToolbarMenuItem<T>;
154
-
155
185
  type CardMenuProps<T extends any | void = void> = ToolbarMenuProps<T>;
156
186
 
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
-
187
+ function CardMenu<T extends any | void = void>({ context, items }: CardMenuProps<T>) {
188
+ const { t } = useTranslation(translationKey);
161
189
  return (
162
- <CardIconBlock padding>
163
- <Toolbar.Menu {...props} context={context} items={combinedItems} />
164
- </CardIconBlock>
190
+ <CardBlock end>
191
+ <DropdownMenu.Root>
192
+ <DropdownMenu.Trigger disabled={!items?.length} asChild>
193
+ <IconButton
194
+ iconOnly
195
+ variant='ghost'
196
+ icon='ph--dots-three-vertical--regular'
197
+ label={t('toolbar-menu.label')}
198
+ />
199
+ </DropdownMenu.Trigger>
200
+ {(items?.length ?? 0) > 0 && (
201
+ <DropdownMenu.Portal>
202
+ <DropdownMenu.Content>
203
+ <DropdownMenu.Viewport>
204
+ {items?.map(({ label, onClick: onSelect }, index) => (
205
+ // `context` is the generic payload threaded to each handler; the cast is the
206
+ // generic boundary (T may be `void`, so `context` is typed `T | undefined`).
207
+ <DropdownMenu.Item key={index} onSelect={() => onSelect(context as T)}>
208
+ {label}
209
+ </DropdownMenu.Item>
210
+ ))}
211
+ </DropdownMenu.Viewport>
212
+ <DropdownMenu.Arrow />
213
+ </DropdownMenu.Content>
214
+ </DropdownMenu.Portal>
215
+ )}
216
+ </DropdownMenu.Root>
217
+ </CardBlock>
165
218
  );
166
- };
219
+ }
167
220
 
168
- (CardMenu as any).displayName = CARD_MENU_NAME;
221
+ CardMenu.displayName = CARD_MENU_NAME;
169
222
 
170
223
  //
171
- // Icon
224
+ // Block
172
225
  //
173
226
 
174
- const CARD_ICON_NAME = 'Card.Icon';
227
+ const CARD_BLOCK_NAME = 'Card.Block';
175
228
 
176
- const CardIcon = (props: IconProps) => {
177
- return (
178
- <CardIconBlock>
179
- <Icon {...props} />
180
- </CardIconBlock>
181
- );
182
- };
229
+ type CardBlockProps = SlottableProps<{ end?: boolean; compact?: boolean; square?: boolean }>;
183
230
 
184
- (CardIcon as any).displayName = CARD_ICON_NAME;
185
-
186
- //
187
- // IconBlock
188
- //
189
-
190
- const CARD_ICON_BLOCK_NAME = 'Card.IconBlock';
191
-
192
- const CardIconBlock = forwardRef<HTMLDivElement, ThemedClassName<PropsWithChildren<{ padding?: boolean }>>>(
193
- ({ classNames, children, padding, ...props }, forwardedRef) => {
194
- const { tx } = useThemeContext();
231
+ /**
232
+ * Leading (default) or trailing (`end`) gutter slot of a Card row/header. Sized to the
233
+ * rail-item square so a passive `<Icon>` aligns with an `IconButton`. Defaults text color to
234
+ * `subdued` so a decorative `<Icon>` child needs no styling; interactive children set their own.
235
+ */
236
+ const CardBlock = composable<HTMLDivElement, CardBlockProps>(({ children, ...props }, forwardedRef) => {
237
+ const { tx } = useThemeContext();
238
+ const { className, ...rest } = composableProps(props);
195
239
 
196
- return (
197
- <div {...props} role='none' className={tx('card.icon-block', { padding }, classNames)} ref={forwardedRef}>
198
- {children}
199
- </div>
200
- );
201
- },
202
- );
240
+ return (
241
+ <Column.Block {...rest} classNames={tx('card.block', {}, className)} ref={forwardedRef}>
242
+ {children}
243
+ </Column.Block>
244
+ );
245
+ });
203
246
 
204
- CardIconBlock.displayName = CARD_ICON_BLOCK_NAME;
247
+ CardBlock.displayName = CARD_BLOCK_NAME;
205
248
 
206
249
  //
207
250
  // Title
@@ -224,47 +267,24 @@ const CardTitle = slottable<HTMLDivElement>(({ children, asChild, ...props }, fo
224
267
  CardTitle.displayName = CARD_TITLE_NAME;
225
268
 
226
269
  //
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
270
+ // Body
248
271
  //
249
272
 
250
- const CARD_ROW_NAME = 'Card.Row';
251
-
252
- type CardRowProps = { icon?: string; fullWidth?: boolean };
273
+ const CARD_BODY_NAME = 'Card.Body';
253
274
 
254
- const CardRow = slottable<HTMLDivElement, CardRowProps>(({ children, asChild, icon, ...props }, forwardedRef) => {
275
+ const CardBody = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
255
276
  const { className, ...rest } = composableProps(props);
256
277
  const Comp = asChild ? Slot : Primitive.div;
257
278
  const { tx } = useThemeContext();
258
279
 
259
280
  return (
260
- <Comp {...rest} className={tx('card.row', {}, className)} ref={forwardedRef}>
261
- {(icon && <CardIcon classNames='text-subdued' icon={icon} size={4} />) || <div />}
281
+ <Comp {...rest} className={tx('card.body', {}, className)} ref={forwardedRef}>
262
282
  {children}
263
283
  </Comp>
264
284
  );
265
285
  });
266
286
 
267
- CardRow.displayName = CARD_ROW_NAME;
287
+ CardBody.displayName = CARD_BODY_NAME;
268
288
 
269
289
  //
270
290
  // Section
@@ -272,44 +292,68 @@ CardRow.displayName = CARD_ROW_NAME;
272
292
 
273
293
  const CARD_SECTION_NAME = 'Card.Section';
274
294
 
295
+ type CardSectionProps = { title?: ReactNode };
296
+
275
297
  /**
276
- * @deprecated Merge with Card.Row fullWidth
298
+ * A labeled grouping of card content. `display: contents` keeps children aligned
299
+ * to the Card's column grid (like `Card.Body`); when `title` is provided,
300
+ * renders a subheading row at the top and exposes the group with
301
+ * `role='group' aria-labelledby=…` for screen readers.
277
302
  */
278
- const CardSection = slottable<HTMLDivElement>(({ children, asChild, role, ...props }, forwardedRef) => {
279
- const { className, ...rest } = composableProps(props);
280
- const Comp = asChild ? Slot : Primitive.div;
303
+ const CardSection = slottable<HTMLDivElement, CardSectionProps>(
304
+ ({ children, asChild, title, role, ...props }, forwardedRef) => {
305
+ const { className, ...rest } = composableProps(props);
306
+ const Comp = asChild ? Slot : Primitive.div;
307
+ const { tx } = useThemeContext();
308
+ const titleId = useId();
281
309
 
282
- return (
283
- <Comp {...rest} role={role ?? 'none'} className={mx('col-span-full', className)} ref={forwardedRef}>
284
- {children}
285
- </Comp>
286
- );
287
- });
310
+ return (
311
+ <Comp
312
+ {...rest}
313
+ role={role ?? (title ? 'group' : 'none')}
314
+ aria-labelledby={title ? titleId : undefined}
315
+ className={tx('card.section', {}, className)}
316
+ ref={forwardedRef}
317
+ >
318
+ {title && (
319
+ <div id={titleId} className={tx('card.section-title', {})}>
320
+ {title}
321
+ </div>
322
+ )}
323
+ {children}
324
+ </Comp>
325
+ );
326
+ },
327
+ );
288
328
 
289
329
  CardSection.displayName = CARD_SECTION_NAME;
290
330
 
291
331
  //
292
- // Heading
332
+ // Row
293
333
  //
294
334
 
295
- const CARD_HEADING_NAME = 'Card.Heading';
335
+ const CARD_ROW_NAME = 'Card.Row';
296
336
 
297
- type CardHeadingProps = { variant?: 'default' | 'subtitle' };
337
+ type CardRowProps = { fullWidth?: boolean };
298
338
 
299
339
  /**
300
- * @deprecated Use typography.
340
+ * A row inside a Card.
341
+ * - Default: spans all 3 columns as a subgrid; children align via `data-slot` — `Card.Block`
342
+ * lands in the gutters (start/end), anonymous children in the center. Sets `--icon-size` 4.
343
+ * - `fullWidth`: spans all columns without a subgrid — children do their own internal layout;
344
+ * `Card.Block` placement is inert in this mode.
301
345
  */
302
- const CardHeading = slottable<HTMLDivElement, CardHeadingProps>(
303
- ({ children, asChild, role, variant = 'default', ...props }, forwardedRef) => {
346
+ const CardRow = slottable<HTMLDivElement, CardRowProps>(
347
+ ({ children, asChild, fullWidth, style, ...props }, forwardedRef) => {
348
+ const { tx } = useThemeContext();
304
349
  const { className, ...rest } = composableProps(props);
305
350
  const Comp = asChild ? Slot : Primitive.div;
306
- const { tx } = useThemeContext();
307
351
 
308
352
  return (
309
353
  <Comp
310
354
  {...rest}
311
- role={role ?? 'heading'}
312
- className={tx('card.heading', { variant }, className)}
355
+ style={{ ...iconSize(4), ...style }}
356
+ className={tx('card.row', { fullWidth }, className)}
313
357
  ref={forwardedRef}
314
358
  >
315
359
  {children}
@@ -318,7 +362,7 @@ const CardHeading = slottable<HTMLDivElement, CardHeadingProps>(
318
362
  },
319
363
  );
320
364
 
321
- CardHeading.displayName = CARD_HEADING_NAME;
365
+ CardRow.displayName = CARD_ROW_NAME;
322
366
 
323
367
  //
324
368
  // Text
@@ -326,13 +370,19 @@ CardHeading.displayName = CARD_HEADING_NAME;
326
370
 
327
371
  const CARD_TEXT_NAME = 'Card.Text';
328
372
 
329
- type CardTextProps = { truncate?: boolean; variant?: 'default' | 'description' };
373
+ // `onClick` is opted in explicitly: `ComposableProps` deliberately excludes event handlers, but the
374
+ // part spreads rest props onto its element, so the handler is forwarded at runtime.
375
+ type CardTextProps = {
376
+ truncate?: boolean;
377
+ variant?: 'default' | 'description';
378
+ onClick?: MouseEventHandler<HTMLDivElement>;
379
+ };
330
380
 
331
381
  const CardText = slottable<HTMLDivElement, CardTextProps>(
332
382
  ({ children, asChild, role, truncate, variant = 'default', ...props }, forwardedRef) => {
383
+ const { tx } = useThemeContext();
333
384
  const { className, ...rest } = composableProps(props);
334
385
  const Comp = asChild ? Slot : Primitive.div;
335
- const { tx } = useThemeContext();
336
386
 
337
387
  return (
338
388
  <Comp {...rest} role={role ?? 'none'} className={tx('card.text', { variant }, className)} ref={forwardedRef}>
@@ -350,28 +400,27 @@ CardText.displayName = CARD_TEXT_NAME;
350
400
 
351
401
  const CARD_HTML_NAME = 'Card.Html';
352
402
 
353
- type CardHtmlProps = { html: string; variant?: 'default' | 'description' };
403
+ type CardHtmlProps = { html?: string; variant?: 'default' | 'description' };
354
404
 
355
405
  /**
356
406
  * Renders sanitized HTML content inside a card text slot.
357
407
  * Uses DOMPurify to prevent XSS from untrusted markup (e.g. RSS feed content).
358
408
  */
359
- const CardHtml = ({ html, variant = 'default', ...props }: CardHtmlProps & ThemedClassName<object>) => {
409
+ function CardHtml({ html = '', variant = 'default', ...props }: CardHtmlProps & ThemedClassName<object>) {
360
410
  const { tx } = useThemeContext();
361
411
  const sanitized = useMemo(() => DOMPurify.sanitize(html), [html]);
362
412
 
363
413
  return (
364
414
  <div
365
415
  {...props}
366
- role='none'
367
416
  className={tx('card.text', { variant })}
368
417
  // eslint-disable-next-line react/no-danger
369
418
  dangerouslySetInnerHTML={{ __html: sanitized }}
370
419
  />
371
420
  );
372
- };
421
+ }
373
422
 
374
- (CardHtml as any).displayName = CARD_HTML_NAME;
423
+ CardHtml.displayName = CARD_HTML_NAME;
375
424
 
376
425
  //
377
426
  // Poster
@@ -383,31 +432,40 @@ type CardPosterProps = ThemedClassName<
383
432
  {
384
433
  alt: string;
385
434
  aspect?: 'video' | 'auto';
386
- } & Partial<{ image: string; icon: string }>
435
+ } & Partial<{ image: string; icon: string }> &
436
+ // The image-rendering props (`fit`, `crossOrigin`, color-extraction options) are forwarded to
437
+ // the underlying `Image`. `src`/`alt`/`classNames` are owned by the poster.
438
+ Omit<ImageProps, 'src' | 'alt' | 'classNames'>
387
439
  >;
388
440
 
389
- const CardPoster = (props: CardPosterProps) => {
441
+ function CardPoster({
442
+ classNames,
443
+ alt,
444
+ aspect: aspectProp,
445
+ image,
446
+ icon,
447
+ fit = 'cover',
448
+ ...imageProps
449
+ }: CardPosterProps) {
390
450
  const { tx } = useThemeContext();
391
- const aspect = props.aspect === 'auto' ? 'aspect-auto' : 'aspect-video';
451
+ const aspect = aspectProp === 'auto' ? 'aspect-auto' : 'aspect-video';
392
452
 
393
- if (props.image) {
453
+ if (image) {
394
454
  return (
395
- <div role='none' className='col-span-full'>
396
- <Image classNames={[tx('card.poster', {}), aspect, props.classNames]} src={props.image} alt={props.alt} />
397
- </div>
455
+ <Image classNames={[tx('card.poster', {}), aspect, classNames]} src={image} alt={alt} fit={fit} {...imageProps} />
398
456
  );
399
457
  }
400
458
 
401
- if (props.icon) {
459
+ if (icon) {
402
460
  return (
403
- <div role='image' className={tx('card.poster-icon', {}, [aspect, props.classNames])} aria-label={props.alt}>
404
- <Icon icon={props.icon} size={10} />
461
+ <div role='image' className={tx('card.poster-icon', {}, [aspect, classNames])} aria-label={alt}>
462
+ <Icon icon={icon} size={10} />
405
463
  </div>
406
464
  );
407
465
  }
408
- };
466
+ }
409
467
 
410
- (CardPoster as any).displayName = CARD_POSTER_NAME;
468
+ CardPoster.displayName = CARD_POSTER_NAME;
411
469
 
412
470
  //
413
471
  // Action
@@ -417,18 +475,26 @@ const CARD_ACTION_NAME = 'Card.Action';
417
475
 
418
476
  type CardActionProps = { icon?: string; label: string; actionIcon?: string; onClick?: () => void };
419
477
 
420
- const CardAction = ({ icon, actionIcon = 'ph--arrow-right--regular', label, onClick }: CardActionProps) => {
478
+ function CardAction({ icon, actionIcon = 'ph--arrow-right--regular', label, onClick }: CardActionProps) {
421
479
  const { tx } = useThemeContext();
422
480
  return (
423
481
  <Button variant='ghost' classNames={tx('card.action', {})} onClick={onClick}>
424
- {icon ? <CardIcon classNames='text-subdued' icon={icon} size={4} /> : <div />}
425
- <span className={tx('card.action-label', {}, !actionIcon ? 'col-span-2' : undefined)}>{label}</span>
426
- {actionIcon && <CardIcon icon={actionIcon} size={4} />}
482
+ {icon && (
483
+ <CardBlock>
484
+ <Icon icon={icon} size={4} />
485
+ </CardBlock>
486
+ )}
487
+ <span className={tx('card.action-label', {})}>{label}</span>
488
+ {actionIcon && (
489
+ <CardBlock end>
490
+ <Icon icon={actionIcon} size={4} />
491
+ </CardBlock>
492
+ )}
427
493
  </Button>
428
494
  );
429
- };
495
+ }
430
496
 
431
- (CardAction as any).displayName = CARD_ACTION_NAME;
497
+ CardAction.displayName = CARD_ACTION_NAME;
432
498
 
433
499
  //
434
500
  // Link
@@ -438,18 +504,22 @@ const CARD_LINK_NAME = 'Card.Link';
438
504
 
439
505
  type CardLinkProps = { label: string; href: string };
440
506
 
441
- const CardLink = ({ label, href }: CardLinkProps) => {
507
+ function CardLink({ label, href }: CardLinkProps) {
442
508
  const { tx } = useThemeContext();
443
509
  return (
444
510
  <a className={tx('card.link', {})} data-variant='ghost' href={href} target='_blank' rel='noreferrer'>
445
- <CardIcon classNames='text-subdued' icon='ph--link--regular' />
511
+ <CardBlock>
512
+ <Icon icon='ph--link--regular' size={4} />
513
+ </CardBlock>
446
514
  <span className={tx('card.link-label', {})}>{label}</span>
447
- <CardIcon classNames='invisible group-hover:visible' icon='ph--arrow-square-out--regular' />
515
+ <CardBlock end classNames='invisible group-hover:visible'>
516
+ <Icon icon='ph--arrow-square-out--regular' size={4} />
517
+ </CardBlock>
448
518
  </a>
449
519
  );
450
- };
520
+ }
451
521
 
452
- (CardLink as any).displayName = CARD_LINK_NAME;
522
+ CardLink.displayName = CARD_LINK_NAME;
453
523
 
454
524
  //
455
525
  // Card
@@ -458,24 +528,22 @@ const CardLink = ({ label, href }: CardLinkProps) => {
458
528
  export const Card = {
459
529
  Root: CardRoot,
460
530
 
461
- // Toolbar
462
- Toolbar: CardToolbar,
463
- ToolbarIconButton: Toolbar.IconButton,
464
- ToolbarSeparator: Toolbar.Separator,
531
+ // Header
532
+ Header: CardHeader,
465
533
 
466
- // Toolbar blocks
467
- IconBlock: CardIconBlock,
534
+ // Header / row parts
535
+ Block: CardBlock,
468
536
  DragHandle: CardDragHandle,
469
- CloseIconButton: CloseIconButton,
537
+ ActionIconButton: CardActionIconButton,
470
538
  Menu: CardMenu,
471
- Icon: CardIcon,
472
539
  Title: CardTitle,
473
540
 
474
- // Content
475
- Content: CardContent,
476
- Row: CardRow,
541
+ // Body
542
+ Body: CardBody,
477
543
  Section: CardSection,
478
- Heading: CardHeading,
544
+ Row: CardRow,
545
+
546
+ // Body parts
479
547
  Text: CardText,
480
548
  Html: CardHtml,
481
549
  Poster: CardPoster,
@@ -484,10 +552,11 @@ export const Card = {
484
552
  };
485
553
 
486
554
  export type {
487
- CardContextValue,
488
555
  CardRootProps,
489
- CardToolbarProps,
556
+ CardHeaderProps,
557
+ CardBlockProps,
490
558
  CardDragHandleProps,
491
- CloseIconButtonProps,
559
+ CardActionIconButtonProps,
492
560
  CardMenuProps,
561
+ CardSectionProps,
493
562
  };