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

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