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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (482) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/browser/chunk-5SPBSIWS.mjs +33 -0
  4. package/dist/lib/browser/chunk-5SPBSIWS.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-7JFD5ZHZ.mjs +1612 -0
  6. package/dist/lib/browser/chunk-7JFD5ZHZ.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +3039 -1891
  8. package/dist/lib/browser/index.mjs.map +4 -4
  9. package/dist/lib/browser/meta.json +1 -1
  10. package/dist/lib/browser/testing/index.mjs +10 -13
  11. package/dist/lib/browser/testing/index.mjs.map +3 -3
  12. package/dist/lib/browser/translations.mjs +9 -0
  13. package/dist/lib/browser/translations.mjs.map +7 -0
  14. package/dist/lib/node-esm/chunk-FPVTVXND.mjs +35 -0
  15. package/dist/lib/node-esm/chunk-FPVTVXND.mjs.map +7 -0
  16. package/dist/lib/node-esm/chunk-TTEL2FP2.mjs +1614 -0
  17. package/dist/lib/node-esm/chunk-TTEL2FP2.mjs.map +7 -0
  18. package/dist/lib/node-esm/index.mjs +3039 -1891
  19. package/dist/lib/node-esm/index.mjs.map +4 -4
  20. package/dist/lib/node-esm/meta.json +1 -1
  21. package/dist/lib/node-esm/testing/index.mjs +10 -13
  22. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  23. package/dist/lib/node-esm/translations.mjs +10 -0
  24. package/dist/lib/node-esm/translations.mjs.map +7 -0
  25. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  26. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  27. package/dist/types/src/components/Avatars/Avatar.theme.d.ts +11 -0
  28. package/dist/types/src/components/Avatars/Avatar.theme.d.ts.map +1 -0
  29. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  30. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts +5 -1
  31. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  32. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  33. package/dist/types/src/components/Breadcrumb/Breadcrumb.theme.d.ts +4 -0
  34. package/dist/types/src/components/Breadcrumb/Breadcrumb.theme.d.ts.map +1 -0
  35. package/dist/types/src/components/Button/Button.d.ts +1 -1
  36. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  37. package/dist/types/src/components/Button/Button.stories.d.ts +1 -1
  38. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -1
  39. package/dist/types/src/components/Button/Button.theme.d.ts +11 -0
  40. package/dist/types/src/components/Button/Button.theme.d.ts.map +1 -0
  41. package/dist/types/src/components/Button/IconButton.d.ts +1 -0
  42. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  43. package/dist/types/src/components/Button/IconButton.stories.d.ts +1 -0
  44. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
  45. package/dist/types/src/components/Button/IconButton.theme.d.ts +8 -0
  46. package/dist/types/src/components/Button/IconButton.theme.d.ts.map +1 -0
  47. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
  48. package/dist/types/src/components/Button/ToggleGroup.d.ts +2 -2
  49. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +2 -2
  50. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
  51. package/dist/types/src/components/Calendar/Calendar.d.ts +33 -0
  52. package/dist/types/src/components/Calendar/Calendar.d.ts.map +1 -0
  53. package/dist/types/src/components/Calendar/Calendar.stories.d.ts +9 -0
  54. package/dist/types/src/components/Calendar/Calendar.stories.d.ts.map +1 -0
  55. package/dist/types/src/components/Calendar/Calendar.theme.d.ts +4 -0
  56. package/dist/types/src/components/Calendar/Calendar.theme.d.ts.map +1 -0
  57. package/dist/types/src/components/Calendar/index.d.ts +2 -0
  58. package/dist/types/src/components/Calendar/index.d.ts.map +1 -0
  59. package/dist/types/src/components/Card/Card.d.ts +63 -57
  60. package/dist/types/src/components/Card/Card.d.ts.map +1 -1
  61. package/dist/types/src/components/Card/Card.stories.d.ts +1 -0
  62. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -1
  63. package/dist/types/src/components/Card/Card.theme.d.ts +12 -0
  64. package/dist/types/src/components/Card/Card.theme.d.ts.map +1 -0
  65. package/dist/types/src/components/Carousel/Carousel.d.ts +106 -0
  66. package/dist/types/src/components/Carousel/Carousel.d.ts.map +1 -0
  67. package/dist/types/src/components/Carousel/Carousel.stories.d.ts +14 -0
  68. package/dist/types/src/components/Carousel/Carousel.stories.d.ts.map +1 -0
  69. package/dist/types/src/components/Carousel/index.d.ts +2 -0
  70. package/dist/types/src/components/Carousel/index.d.ts.map +1 -0
  71. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  72. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  73. package/dist/types/src/components/Clipboard/index.d.ts +1 -1
  74. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  75. package/dist/types/src/{primitives → components}/Column/Column.d.ts +4 -4
  76. package/dist/types/src/components/Column/Column.d.ts.map +1 -0
  77. package/dist/types/src/components/Column/Column.stories.d.ts.map +1 -0
  78. package/dist/types/src/components/Column/Column.theme.d.ts +9 -0
  79. package/dist/types/src/components/Column/Column.theme.d.ts.map +1 -0
  80. package/dist/types/src/components/Column/index.d.ts +3 -0
  81. package/dist/types/src/components/Column/index.d.ts.map +1 -0
  82. package/dist/types/src/components/Column/withColumn.d.ts +21 -0
  83. package/dist/types/src/components/Column/withColumn.d.ts.map +1 -0
  84. package/dist/types/src/components/DatePicker/DatePicker.d.ts +72 -0
  85. package/dist/types/src/components/DatePicker/DatePicker.d.ts.map +1 -0
  86. package/dist/types/src/components/DatePicker/DatePicker.stories.d.ts +10 -0
  87. package/dist/types/src/components/DatePicker/DatePicker.stories.d.ts.map +1 -0
  88. package/dist/types/src/components/DatePicker/DatePicker.theme.d.ts +6 -0
  89. package/dist/types/src/components/DatePicker/DatePicker.theme.d.ts.map +1 -0
  90. package/dist/types/src/components/DatePicker/index.d.ts +2 -0
  91. package/dist/types/src/components/DatePicker/index.d.ts.map +1 -0
  92. package/dist/types/src/components/Dialog/AlertDialog.d.ts +20 -20
  93. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  94. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  95. package/dist/types/src/components/Dialog/Dialog.d.ts +21 -19
  96. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  97. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  98. package/dist/types/src/components/Dialog/Dialog.theme.d.ts +10 -0
  99. package/dist/types/src/components/Dialog/Dialog.theme.d.ts.map +1 -0
  100. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -1
  101. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -1
  102. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -1
  103. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -1
  104. package/dist/types/src/components/Focus/Focus.d.ts +2 -2
  105. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -1
  106. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -1
  107. package/dist/types/src/components/Focus/Focus.theme.d.ts +6 -0
  108. package/dist/types/src/components/Focus/Focus.theme.d.ts.map +1 -0
  109. package/dist/types/src/components/Icon/Icon.d.ts +1 -0
  110. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  111. package/dist/types/src/components/Icon/Icon.stories.d.ts +1 -1
  112. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  113. package/dist/types/src/components/Icon/Icon.theme.d.ts +11 -0
  114. package/dist/types/src/components/Icon/Icon.theme.d.ts.map +1 -0
  115. package/dist/types/src/components/Icon/IconBlock.d.ts +15 -0
  116. package/dist/types/src/components/Icon/IconBlock.d.ts.map +1 -0
  117. package/dist/types/src/components/Icon/index.d.ts +1 -0
  118. package/dist/types/src/components/Icon/index.d.ts.map +1 -1
  119. package/dist/types/src/components/Image/Image.d.ts +8 -1
  120. package/dist/types/src/components/Image/Image.d.ts.map +1 -1
  121. package/dist/types/src/components/Image/Image.stories.d.ts +3 -2
  122. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -1
  123. package/dist/types/src/components/Input/Input.d.ts +88 -13
  124. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  125. package/dist/types/src/components/Input/Input.stories.d.ts +14 -3
  126. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  127. package/dist/types/src/components/Input/Input.theme.d.ts +115 -0
  128. package/dist/types/src/components/Input/Input.theme.d.ts.map +1 -0
  129. package/dist/types/src/components/Input/SegmentedInput.d.ts +79 -0
  130. package/dist/types/src/components/Input/SegmentedInput.d.ts.map +1 -0
  131. package/dist/types/src/components/Input/constants.d.ts +2 -0
  132. package/dist/types/src/components/Input/constants.d.ts.map +1 -0
  133. package/dist/types/src/components/Input/index.d.ts +2 -0
  134. package/dist/types/src/components/Input/index.d.ts.map +1 -1
  135. package/dist/types/src/components/Link/Link.d.ts.map +1 -1
  136. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  137. package/dist/types/src/components/Link/Link.theme.d.ts +6 -0
  138. package/dist/types/src/components/Link/Link.theme.d.ts.map +1 -0
  139. package/dist/types/src/components/List/List.d.ts +2 -2
  140. package/dist/types/src/components/List/List.d.ts.map +1 -1
  141. package/dist/types/src/components/List/List.stories.d.ts +1 -1
  142. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  143. package/dist/types/src/components/List/List.theme.d.ts +7 -0
  144. package/dist/types/src/components/List/List.theme.d.ts.map +1 -0
  145. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -1
  146. package/dist/types/src/components/List/Tree.d.ts +2 -2
  147. package/dist/types/src/components/List/Tree.d.ts.map +1 -1
  148. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
  149. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -1
  150. package/dist/types/src/components/List/Treegrid.d.ts +2 -2
  151. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  152. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
  153. package/dist/types/src/components/List/Treegrid.theme.d.ts +7 -0
  154. package/dist/types/src/components/List/Treegrid.theme.d.ts.map +1 -0
  155. package/dist/types/src/components/Main/Main.d.ts +9 -5
  156. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  157. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  158. package/dist/types/src/components/Main/Main.theme.d.ts +20 -0
  159. package/dist/types/src/components/Main/Main.theme.d.ts.map +1 -0
  160. package/dist/types/src/components/Main/constants.d.ts +3 -0
  161. package/dist/types/src/components/Main/constants.d.ts.map +1 -0
  162. package/dist/types/src/components/Main/index.d.ts +1 -0
  163. package/dist/types/src/components/Main/index.d.ts.map +1 -1
  164. package/dist/types/src/components/Main/useSwipeToDismiss.d.ts.map +1 -1
  165. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +47 -0
  166. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -0
  167. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts +16 -0
  168. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts.map +1 -0
  169. package/dist/types/src/components/MediaPlayer/index.d.ts +2 -0
  170. package/dist/types/src/components/MediaPlayer/index.d.ts.map +1 -0
  171. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -1
  172. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -1
  173. package/dist/types/src/components/Menu/DropdownMenu.d.ts +11 -3
  174. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
  175. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
  176. package/dist/types/src/components/Menu/Menu.theme.d.ts +7 -0
  177. package/dist/types/src/components/Menu/Menu.theme.d.ts.map +1 -0
  178. package/dist/types/src/components/Message/Message.d.ts +3 -3
  179. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  180. package/dist/types/src/components/Message/Message.stories.d.ts +5 -1
  181. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  182. package/dist/types/src/components/Message/Message.theme.d.ts +7 -0
  183. package/dist/types/src/components/Message/Message.theme.d.ts.map +1 -0
  184. package/dist/types/src/{primitives → components}/Panel/Panel.d.ts +5 -5
  185. package/dist/types/src/components/Panel/Panel.d.ts.map +1 -0
  186. package/dist/types/src/components/Panel/Panel.stories.d.ts.map +1 -0
  187. package/dist/types/src/components/Panel/Panel.theme.d.ts +13 -0
  188. package/dist/types/src/components/Panel/Panel.theme.d.ts.map +1 -0
  189. package/dist/types/src/components/Panel/index.d.ts.map +1 -0
  190. package/dist/types/src/components/Popover/Popover.d.ts +10 -2
  191. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  192. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  193. package/dist/types/src/components/Popover/Popover.theme.d.ts +8 -0
  194. package/dist/types/src/components/Popover/Popover.theme.d.ts.map +1 -0
  195. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +2 -2
  196. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  197. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +2 -2
  198. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  199. package/dist/types/src/components/ScrollArea/ScrollArea.theme.d.ts +17 -0
  200. package/dist/types/src/components/ScrollArea/ScrollArea.theme.d.ts.map +1 -0
  201. package/dist/types/src/components/ScrollArea/index.d.ts +1 -0
  202. package/dist/types/src/components/ScrollArea/index.d.ts.map +1 -1
  203. package/dist/types/src/components/ScrollArea/scrollbar.d.ts +18 -0
  204. package/dist/types/src/components/ScrollArea/scrollbar.d.ts.map +1 -0
  205. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +20 -18
  206. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  207. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  208. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  209. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  210. package/dist/types/src/components/Select/Select.theme.d.ts +6 -0
  211. package/dist/types/src/components/Select/Select.theme.d.ts.map +1 -0
  212. package/dist/types/src/components/Separator/Separator.theme.d.ts +7 -0
  213. package/dist/types/src/components/Separator/Separator.theme.d.ts.map +1 -0
  214. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -1
  215. package/dist/types/src/components/Skeleton/Skeleton.theme.d.ts +6 -0
  216. package/dist/types/src/components/Skeleton/Skeleton.theme.d.ts.map +1 -0
  217. package/dist/types/src/components/Splitter/Splitter.d.ts +6 -8
  218. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -1
  219. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -1
  220. package/dist/types/src/components/Splitter/Splitter.theme.d.ts +4 -0
  221. package/dist/types/src/components/Splitter/Splitter.theme.d.ts.map +1 -0
  222. package/dist/types/src/components/Status/Status.d.ts +1 -1
  223. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  224. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  225. package/dist/types/src/components/Status/Status.theme.d.ts +7 -0
  226. package/dist/types/src/components/Status/Status.theme.d.ts.map +1 -0
  227. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  228. package/dist/types/src/components/Tag/Tag.theme.d.ts +6 -0
  229. package/dist/types/src/components/Tag/Tag.theme.d.ts.map +1 -0
  230. package/dist/types/src/components/Toast/Toast.d.ts +12 -9
  231. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  232. package/dist/types/src/components/Toast/Toast.stories.d.ts +5 -2
  233. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  234. package/dist/types/src/components/Toast/Toast.theme.d.ts +4 -0
  235. package/dist/types/src/components/Toast/Toast.theme.d.ts.map +1 -0
  236. package/dist/types/src/components/Toolbar/Toolbar.d.ts +24 -12
  237. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  238. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  239. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts +8 -0
  240. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts.map +1 -0
  241. package/dist/types/src/components/Tooltip/Tooltip.d.ts +8 -8
  242. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  243. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  244. package/dist/types/src/components/Tooltip/Tooltip.theme.d.ts +6 -0
  245. package/dist/types/src/components/Tooltip/Tooltip.theme.d.ts.map +1 -0
  246. package/dist/types/src/components/Tooltip/index.d.ts +1 -0
  247. package/dist/types/src/components/Tooltip/index.d.ts.map +1 -1
  248. package/dist/types/src/components/Tooltip/tooltipContent.d.ts +4 -0
  249. package/dist/types/src/components/Tooltip/tooltipContent.d.ts.map +1 -0
  250. package/dist/types/src/components/index.d.ts +7 -4
  251. package/dist/types/src/components/index.d.ts.map +1 -1
  252. package/dist/types/src/exemplars/generics.stories.d.ts +1 -1
  253. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -1
  254. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -1
  255. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -1
  256. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -1
  257. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  258. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  259. package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
  260. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  261. package/dist/types/src/hooks/useSafeCollisionPadding.d.ts.map +1 -1
  262. package/dist/types/src/hooks/useTranslationsContext.d.ts +1 -1
  263. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  264. package/dist/types/src/index.d.ts +1 -0
  265. package/dist/types/src/index.d.ts.map +1 -1
  266. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  267. package/dist/types/src/playground/Custom.stories.d.ts +1 -1
  268. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  269. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  270. package/dist/types/src/primitives/Container/Container.d.ts +1 -1
  271. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -1
  272. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -1
  273. package/dist/types/src/{components → primitives}/DensityProvider/DensityProvider.d.ts.map +1 -1
  274. package/dist/types/src/primitives/DensityProvider/index.d.ts.map +1 -0
  275. package/dist/types/src/{components → primitives}/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  276. package/dist/types/src/primitives/ElevationProvider/index.d.ts.map +1 -0
  277. package/dist/types/src/primitives/Flex/Flex.d.ts +1 -1
  278. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -1
  279. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -1
  280. package/dist/types/src/primitives/Grid/Grid.d.ts +1 -1
  281. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -1
  282. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -1
  283. package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  284. package/dist/types/src/primitives/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  285. package/dist/types/src/primitives/ThemeProvider/TranslationsProvider.d.ts +128 -0
  286. package/dist/types/src/primitives/ThemeProvider/TranslationsProvider.d.ts.map +1 -0
  287. package/dist/types/src/primitives/ThemeProvider/index.d.ts +4 -0
  288. package/dist/types/src/primitives/ThemeProvider/index.d.ts.map +1 -0
  289. package/dist/types/src/primitives/index.d.ts +3 -2
  290. package/dist/types/src/primitives/index.d.ts.map +1 -1
  291. package/dist/types/src/testing/Loading.d.ts.map +1 -1
  292. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  293. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  294. package/dist/types/src/testing/decorators/withTheme.d.ts +5 -1
  295. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  296. package/dist/types/src/theme/bindTheme.d.ts +3 -0
  297. package/dist/types/src/theme/bindTheme.d.ts.map +1 -0
  298. package/dist/types/src/theme/defaultTheme.d.ts +4 -0
  299. package/dist/types/src/theme/defaultTheme.d.ts.map +1 -0
  300. package/dist/types/src/theme/index.d.ts +31 -0
  301. package/dist/types/src/theme/index.d.ts.map +1 -0
  302. package/dist/types/src/translations.d.ts +17 -3
  303. package/dist/types/src/translations.d.ts.map +1 -1
  304. package/dist/types/src/util/index.d.ts +2 -1
  305. package/dist/types/src/util/index.d.ts.map +1 -1
  306. package/dist/types/src/util/mobile.d.ts +5 -0
  307. package/dist/types/src/util/mobile.d.ts.map +1 -0
  308. package/dist/types/src/util/slots.d.ts +57 -0
  309. package/dist/types/src/util/slots.d.ts.map +1 -0
  310. package/dist/types/src/util/usePx.d.ts.map +1 -1
  311. package/dist/types/tsconfig.tsbuildinfo +1 -1
  312. package/package.json +29 -25
  313. package/src/components/Avatars/Avatar.theme.ts +93 -0
  314. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -1
  315. package/src/components/Breadcrumb/Breadcrumb.theme.ts +26 -0
  316. package/src/components/Breadcrumb/Breadcrumb.tsx +14 -2
  317. package/src/components/Button/Button.theme.ts +31 -0
  318. package/src/components/Button/Button.tsx +2 -2
  319. package/src/components/Button/IconButton.stories.tsx +51 -3
  320. package/src/components/Button/IconButton.theme.ts +21 -0
  321. package/src/components/Button/IconButton.tsx +3 -2
  322. package/src/components/Calendar/Calendar.stories.tsx +43 -0
  323. package/src/components/Calendar/Calendar.theme.ts +74 -0
  324. package/src/components/Calendar/Calendar.tsx +196 -0
  325. package/src/components/Calendar/index.ts +5 -0
  326. package/src/components/Card/Card.stories.tsx +43 -22
  327. package/src/components/Card/Card.theme.ts +93 -0
  328. package/src/components/Card/Card.tsx +161 -169
  329. package/src/components/Carousel/Carousel.stories.tsx +47 -0
  330. package/src/components/Carousel/Carousel.tsx +373 -0
  331. package/src/components/Carousel/index.ts +5 -0
  332. package/src/components/Clipboard/CopyButton.tsx +3 -3
  333. package/src/{primitives → components}/Column/Column.stories.tsx +1 -1
  334. package/src/components/Column/Column.theme.ts +48 -0
  335. package/src/{primitives → components}/Column/Column.tsx +2 -1
  336. package/src/{primitives → components}/Column/index.ts +1 -0
  337. package/src/components/Column/withColumn.ts +27 -0
  338. package/src/components/DatePicker/DatePicker.stories.tsx +102 -0
  339. package/src/components/DatePicker/DatePicker.theme.ts +35 -0
  340. package/src/components/DatePicker/DatePicker.tsx +279 -0
  341. package/src/components/DatePicker/index.ts +5 -0
  342. package/src/components/Dialog/AlertDialog.tsx +12 -16
  343. package/src/components/Dialog/Dialog.stories.tsx +2 -2
  344. package/src/components/Dialog/Dialog.theme.ts +61 -0
  345. package/src/components/Dialog/Dialog.tsx +46 -17
  346. package/src/components/ErrorFallback/ErrorFallback.tsx +14 -8
  347. package/src/components/ErrorFallback/ErrorStack.tsx +12 -6
  348. package/src/components/Focus/Focus.theme.ts +32 -0
  349. package/src/components/Focus/Focus.tsx +1 -1
  350. package/src/components/Icon/Icon.theme.ts +45 -0
  351. package/src/components/Icon/Icon.tsx +10 -3
  352. package/src/components/Icon/IconBlock.tsx +38 -0
  353. package/src/components/Icon/index.ts +1 -0
  354. package/src/components/Image/Image.stories.tsx +1 -1
  355. package/src/components/Image/Image.tsx +38 -9
  356. package/src/components/Input/Input.stories.tsx +132 -29
  357. package/src/components/Input/Input.theme.ts +191 -0
  358. package/src/components/Input/Input.tsx +208 -2
  359. package/src/components/Input/SegmentedInput.tsx +454 -0
  360. package/src/components/Input/constants.ts +5 -0
  361. package/src/components/Input/index.ts +2 -0
  362. package/src/components/Link/Link.theme.ts +16 -0
  363. package/src/components/Link/Link.tsx +10 -2
  364. package/src/components/List/List.stories.tsx +1 -1
  365. package/src/components/List/List.theme.ts +47 -0
  366. package/src/components/List/List.tsx +3 -3
  367. package/src/components/List/ListDropIndicator.tsx +1 -2
  368. package/src/components/List/Tree.stories.tsx +1 -1
  369. package/src/components/List/TreeDropIndicator.tsx +3 -3
  370. package/src/components/List/Treegrid.theme.ts +35 -0
  371. package/src/components/List/Treegrid.tsx +3 -4
  372. package/src/components/Main/Main.theme.ts +29 -0
  373. package/src/components/Main/Main.tsx +9 -7
  374. package/src/components/Main/constants.ts +6 -0
  375. package/src/components/Main/index.ts +1 -0
  376. package/src/components/MediaPlayer/MediaPlayer.stories.tsx +50 -0
  377. package/src/components/MediaPlayer/MediaPlayer.tsx +182 -0
  378. package/src/components/MediaPlayer/index.ts +5 -0
  379. package/src/components/Menu/ContextMenu.stories.tsx +0 -3
  380. package/src/components/Menu/DropdownMenu.stories.tsx +0 -3
  381. package/src/components/Menu/DropdownMenu.tsx +15 -15
  382. package/src/components/Menu/Menu.theme.ts +48 -0
  383. package/src/components/Message/Message.stories.tsx +43 -5
  384. package/src/components/Message/Message.theme.ts +44 -0
  385. package/src/components/Message/Message.tsx +76 -16
  386. package/src/{primitives → components}/Panel/Panel.stories.tsx +2 -3
  387. package/src/components/Panel/Panel.theme.ts +41 -0
  388. package/src/{primitives → components}/Panel/Panel.tsx +2 -1
  389. package/src/components/Popover/Popover.theme.ts +40 -0
  390. package/src/components/Popover/Popover.tsx +7 -7
  391. package/src/components/ScrollArea/ScrollArea.stories.tsx +2 -6
  392. package/src/components/ScrollArea/ScrollArea.theme.ts +107 -0
  393. package/src/components/ScrollArea/ScrollArea.tsx +3 -2
  394. package/src/components/ScrollArea/index.ts +1 -0
  395. package/src/components/ScrollArea/scrollbar.ts +21 -0
  396. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +1 -1
  397. package/src/components/ScrollContainer/ScrollContainer.tsx +58 -58
  398. package/src/components/Select/Select.theme.ts +55 -0
  399. package/src/components/Select/Select.tsx +26 -10
  400. package/src/components/Separator/Separator.theme.ts +23 -0
  401. package/src/components/Skeleton/Skeleton.theme.ts +22 -0
  402. package/src/components/Splitter/Splitter.stories.tsx +1 -1
  403. package/src/components/Splitter/Splitter.theme.ts +18 -0
  404. package/src/components/Splitter/Splitter.tsx +10 -15
  405. package/src/components/Status/Status.theme.ts +31 -0
  406. package/src/components/Status/Status.tsx +1 -2
  407. package/src/components/Tag/Tag.theme.ts +22 -0
  408. package/src/components/Toast/Toast.stories.tsx +41 -20
  409. package/src/components/Toast/Toast.theme.ts +56 -0
  410. package/src/components/Toast/Toast.tsx +95 -27
  411. package/src/components/Toolbar/Toolbar.theme.ts +36 -0
  412. package/src/components/Toolbar/Toolbar.tsx +67 -15
  413. package/src/components/Tooltip/Tooltip.stories.tsx +1 -10
  414. package/src/components/Tooltip/Tooltip.theme.ts +19 -0
  415. package/src/components/Tooltip/Tooltip.tsx +18 -17
  416. package/src/components/Tooltip/index.ts +1 -0
  417. package/src/components/Tooltip/tooltipContent.ts +16 -0
  418. package/src/components/index.ts +7 -5
  419. package/src/exemplars/generics.stories.tsx +1 -2
  420. package/src/exemplars/slot.stories.tsx +5 -6
  421. package/src/exemplars/virtualizer.stories.tsx +0 -1
  422. package/src/hooks/useDensityContext.ts +1 -1
  423. package/src/hooks/useElevationContext.ts +1 -1
  424. package/src/hooks/useThemeContext.ts +1 -1
  425. package/src/hooks/useTranslationsContext.ts +1 -1
  426. package/src/index.ts +1 -0
  427. package/src/playground/Custom.stories.tsx +12 -32
  428. package/src/primitives/Container/Container.tsx +3 -1
  429. package/src/{components → primitives}/DensityProvider/DensityProvider.tsx +1 -1
  430. package/src/primitives/Flex/Flex.tsx +3 -1
  431. package/src/primitives/Grid/Grid.tsx +3 -1
  432. package/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.tsx +1 -1
  433. package/src/{components → primitives}/ThemeProvider/ThemeProvider.tsx +1 -1
  434. package/src/{components → primitives}/ThemeProvider/index.ts +2 -2
  435. package/src/primitives/index.ts +4 -2
  436. package/src/testing/decorators/withLayout.tsx +7 -17
  437. package/src/testing/decorators/withLayoutVariants.tsx +1 -1
  438. package/src/testing/decorators/withTheme.tsx +21 -13
  439. package/src/theme/bindTheme.ts +13 -0
  440. package/src/theme/defaultTheme.ts +83 -0
  441. package/src/theme/index.ts +37 -0
  442. package/src/translations.ts +14 -0
  443. package/src/util/index.ts +2 -1
  444. package/src/util/mobile.ts +11 -0
  445. package/src/util/slots.ts +129 -0
  446. package/src/util/usePx.ts +4 -1
  447. package/dist/lib/browser/chunk-OCVRIJCH.mjs +0 -848
  448. package/dist/lib/browser/chunk-OCVRIJCH.mjs.map +0 -7
  449. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs +0 -850
  450. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs.map +0 -7
  451. package/dist/types/src/components/DensityProvider/index.d.ts.map +0 -1
  452. package/dist/types/src/components/ElevationProvider/index.d.ts.map +0 -1
  453. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +0 -1
  454. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +0 -129
  455. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +0 -1
  456. package/dist/types/src/components/ThemeProvider/index.d.ts +0 -4
  457. package/dist/types/src/components/ThemeProvider/index.d.ts.map +0 -1
  458. package/dist/types/src/primitives/Column/Column.d.ts.map +0 -1
  459. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +0 -1
  460. package/dist/types/src/primitives/Column/index.d.ts +0 -2
  461. package/dist/types/src/primitives/Column/index.d.ts.map +0 -1
  462. package/dist/types/src/primitives/Panel/Panel.d.ts.map +0 -1
  463. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +0 -1
  464. package/dist/types/src/primitives/Panel/index.d.ts.map +0 -1
  465. package/dist/types/src/util/hasIosKeyboard.d.ts +0 -2
  466. package/dist/types/src/util/hasIosKeyboard.d.ts.map +0 -1
  467. package/src/util/hasIosKeyboard.ts +0 -8
  468. /package/dist/types/src/{primitives → components}/Column/Column.stories.d.ts +0 -0
  469. /package/dist/types/src/{primitives → components}/Panel/Panel.stories.d.ts +0 -0
  470. /package/dist/types/src/{primitives → components}/Panel/index.d.ts +0 -0
  471. /package/dist/types/src/{components → primitives}/DensityProvider/DensityProvider.d.ts +0 -0
  472. /package/dist/types/src/{components → primitives}/DensityProvider/index.d.ts +0 -0
  473. /package/dist/types/src/{components → primitives}/ElevationProvider/ElevationProvider.d.ts +0 -0
  474. /package/dist/types/src/{components → primitives}/ElevationProvider/index.d.ts +0 -0
  475. /package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.d.ts +0 -0
  476. /package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.d.ts +0 -0
  477. /package/src/{primitives → components}/Column/AUDIT.md +0 -0
  478. /package/src/{primitives → components}/Panel/index.ts +0 -0
  479. /package/src/{components → primitives}/DensityProvider/index.ts +0 -0
  480. /package/src/{components → primitives}/ElevationProvider/ElevationProvider.tsx +0 -0
  481. /package/src/{components → primitives}/ElevationProvider/index.ts +0 -0
  482. /package/src/{components → primitives}/ThemeProvider/TranslationsProvider.tsx +0 -0
@@ -15,14 +15,13 @@ import React, {
15
15
  useCallback,
16
16
  } from 'react';
17
17
 
18
- import { composable, composableProps } from '@dxos/ui-theme';
19
-
20
18
  import { useThemeContext } from '../../hooks';
19
+ import { composable, composableProps } from '../../util';
21
20
  import { type ThemedClassName } from '../../util';
22
21
 
23
22
  // TODO(thure): https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/treegrid_role
24
23
 
25
- const TREEGRID_ROW_NAME = 'TreegridRow';
24
+ const TREEGRID_ROW_NAME = 'Treegrid.Row';
26
25
 
27
26
  type TreegridRowScopedProps<P> = P & { __treegridRowScope?: Scope };
28
27
 
@@ -41,7 +40,7 @@ export const TREEGRID_PATH_SEPARATOR = '~';
41
40
  export const TREEGRID_PARENT_OF_SEPARATOR = ' ';
42
41
 
43
42
  type TreegridRootProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.div>> & {
44
- gridTemplateColumns: CSSProperties['gridTemplateColumns'];
43
+ gridTemplateColumns?: CSSProperties['gridTemplateColumns'];
45
44
  asChild?: boolean;
46
45
  };
47
46
 
@@ -0,0 +1,29 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { mx } from '@dxos/ui-theme';
6
+ import { type ComponentFunction } from '@dxos/ui-types';
7
+
8
+ import { mainPaddingTransitions } from './constants';
9
+
10
+ const padding = 'dx-main-content-padding';
11
+
12
+ export type MainStyleProps = Partial<{
13
+ bounce: boolean;
14
+ handlesFocus: boolean;
15
+ }>;
16
+
17
+ const content: ComponentFunction<MainStyleProps> = ({ bounce }, ...etc) =>
18
+ mx(padding, mainPaddingTransitions, bounce && 'dx-main-bounce-layout', 'dx-focus-ring-main', ...etc);
19
+
20
+ const sidebar: ComponentFunction<MainStyleProps> = (_, ...etc) =>
21
+ mx('dx-main-sidebar', 'dx-focus-ring-inset-over-all', ...etc);
22
+
23
+ const overlay: ComponentFunction<MainStyleProps> = (_, ...etc) => mx('dx-main-overlay', ...etc);
24
+
25
+ export const mainTheme = {
26
+ content,
27
+ sidebar,
28
+ overlay,
29
+ };
@@ -25,18 +25,20 @@ import React, {
25
25
  import { addEventListener } from '@dxos/async';
26
26
  import { log } from '@dxos/log';
27
27
  import { useForwardedRef, useMediaQuery } from '@dxos/react-hooks';
28
- import { type MainStyleProps, osTranslations } from '@dxos/ui-theme';
28
+ import { osTranslations } from '@dxos/ui-theme';
29
29
 
30
30
  import { useThemeContext } from '../../hooks';
31
+ import { type Label, toLocalizedString, useTranslation } from '../../primitives';
32
+ import { type MainStyleProps } from '../../theme';
31
33
  import { type ThemedClassName } from '../../util';
32
- import { type Label, toLocalizedString, useTranslation } from '../ThemeProvider';
33
34
  import { useSwipeToDismiss } from './useSwipeToDismiss';
34
35
 
35
36
  const MAIN_NAME = 'Main';
36
- const MAIN_ROOT_NAME = 'MainRoot';
37
- const MAIN_OVERLAY_NAME = 'MainOverlay';
38
- const NAVIGATION_SIDEBAR_NAME = 'NavigationSidebar';
39
- const COMPLEMENTARY_SIDEBAR_NAME = 'ComplementarySidebar';
37
+ const MAIN_ROOT_NAME = 'Main.Root';
38
+ const MAIN_OVERLAY_NAME = 'Main.Overlay';
39
+ const MAIN_CONTENT_NAME = 'Main.Content';
40
+ const NAVIGATION_SIDEBAR_NAME = 'Main.NavigationSidebar';
41
+ const COMPLEMENTARY_SIDEBAR_NAME = 'Main.ComplementarySidebar';
40
42
 
41
43
  const handleOpenAutoFocus = (event: Event) => {
42
44
  !document.body.hasAttribute('data-w-keyboard') && event.preventDefault();
@@ -412,7 +414,7 @@ const MainContent = forwardRef<HTMLDivElement, MainContentProps>(
412
414
  },
413
415
  );
414
416
 
415
- MainContent.displayName = MAIN_NAME;
417
+ MainContent.displayName = MAIN_CONTENT_NAME;
416
418
 
417
419
  //
418
420
  // Main
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ export const mainPaddingTransitions = 'dx-main-content-padding-transitions';
6
+ export const mainIntrinsicSize = 'dx-main-intrinsic-size';
@@ -3,3 +3,4 @@
3
3
  //
4
4
 
5
5
  export * from './Main';
6
+ export * from './constants';
@@ -0,0 +1,50 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+
7
+ import { withTheme } from '@dxos/react-ui/testing';
8
+
9
+ import { MediaPlayer } from './MediaPlayer';
10
+
11
+ const meta = {
12
+ title: 'ui/react-ui-core/components/MediaPlayer',
13
+ component: MediaPlayer,
14
+ decorators: [withTheme()],
15
+ parameters: { layout: 'centered' },
16
+ } satisfies Meta<typeof MediaPlayer>;
17
+
18
+ export default meta;
19
+
20
+ type Story = StoryObj<typeof meta>;
21
+
22
+ export const Video: Story = {
23
+ args: {
24
+ // TODO(burdon): CORS issue.
25
+ src: 'https://customer-5rxcjpyab08avpmn.cloudflarestream.com/f58459bcdf3a6f3e93644a4e0f39b22a/downloads/default.mp4',
26
+ classNames: 'max-w-[640px]',
27
+ },
28
+ };
29
+
30
+ export const Audio: Story = {
31
+ args: {
32
+ src: 'https://commondatastorage.googleapis.com/codeskulptor-demos/DDR_assets/Kangaroo_MusiQue_-_The_Neverwritten_Role_Playing_Game.mp3',
33
+ classNames: 'min-w-[480px]',
34
+ },
35
+ };
36
+
37
+ export const ExplicitKind: Story = {
38
+ args: {
39
+ src: 'https://commondatastorage.googleapis.com/codeskulptor-demos/DDR_assets/Kangaroo_MusiQue_-_The_Neverwritten_Role_Playing_Game.mp3',
40
+ kind: 'audio',
41
+ classNames: 'min-w-[480px]',
42
+ },
43
+ };
44
+
45
+ export const Streaming: Story = {
46
+ args: {
47
+ src: 'https://customer-5rxcjpyab08avpmn.cloudflarestream.com/f58459bcdf3a6f3e93644a4e0f39b22a/iframe?poster=https%3A%2F%2Fcustomer-5rxcjpyab08avpmn.cloudflarestream.com%2Ff58459bcdf3a6f3e93644a4e0f39b22a%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600',
48
+ classNames: 'min-w-[480px]',
49
+ },
50
+ };
@@ -0,0 +1,182 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React, { useState } from 'react';
6
+
7
+ import { mx } from '@dxos/ui-theme';
8
+
9
+ import { type ThemedClassName } from '../../util';
10
+
11
+ export type MediaKind = 'video' | 'audio';
12
+
13
+ export type MediaFit = 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';
14
+
15
+ /** Static map to keep Tailwind's class scanner happy (no dynamic `object-${fit}`). */
16
+ const FIT_CLASS: Record<MediaFit, string> = {
17
+ cover: 'object-cover',
18
+ contain: 'object-contain',
19
+ fill: 'object-fill',
20
+ none: 'object-none',
21
+ 'scale-down': 'object-scale-down',
22
+ };
23
+
24
+ const VIDEO_EXTENSIONS = ['.mp4', '.webm', '.ogv', '.mov', '.m4v'];
25
+ const AUDIO_EXTENSIONS = ['.mp3', '.wav', '.ogg', '.m4a', '.aac', '.flac'];
26
+
27
+ /** iframe sandbox flags compatible with typical oEmbed-style players. */
28
+ const DEFAULT_IFRAME_SANDBOX = 'allow-scripts allow-same-origin allow-presentation';
29
+
30
+ /**
31
+ * Best-effort detection of `video` vs `audio` from a media URL.
32
+ * Inspects the pathname's extension (ignoring query/hash). Returns `undefined`
33
+ * when the URL doesn't look like a recognised media file — callers should
34
+ * default to 'video' or render a fallback (e.g. iframe / img).
35
+ */
36
+ export const detectMediaKind = (src: string): MediaKind | undefined => {
37
+ // Strip query and hash, then take the last path segment's extension.
38
+ const pathname = src.split(/[?#]/, 1)[0]!;
39
+ const lower = pathname.toLowerCase();
40
+ if (VIDEO_EXTENSIONS.some((extension) => lower.endsWith(extension))) {
41
+ return 'video';
42
+ }
43
+ if (AUDIO_EXTENSIONS.some((extension) => lower.endsWith(extension))) {
44
+ return 'audio';
45
+ }
46
+
47
+ return undefined;
48
+ };
49
+
50
+ /**
51
+ * Heuristic match for URLs that should render as native `<video>` / `<audio>`
52
+ * (i.e. URLs ending in a recognised media extension).
53
+ *
54
+ * NB: Cloudflare Stream embed URLs serve an HTML player page, **not** a media
55
+ * stream, so they cannot be loaded via `<video>`. Those are detected by
56
+ * {@link isCloudflareStreamEmbed} and rendered via `<iframe>` instead.
57
+ */
58
+ export const isEmbedUrl = (src: string): boolean => detectMediaKind(src) !== undefined;
59
+
60
+ /**
61
+ * Match Cloudflare Stream `/iframe` embed URLs of the form
62
+ * `https://customer-<code>.cloudflarestream.com/<32-hex-uid>/iframe[?…]`.
63
+ */
64
+ const CLOUDFLARE_STREAM_IFRAME_PATTERN =
65
+ /^https:\/\/[a-z0-9-]+\.cloudflarestream\.com\/[a-f0-9]{32}\/iframe(?:[/?#]|$)/i;
66
+
67
+ const isCloudflareStreamEmbed = (src: string): boolean => CLOUDFLARE_STREAM_IFRAME_PATTERN.test(src);
68
+
69
+ export type MediaPlayerProps = ThemedClassName<{
70
+ src: string;
71
+ alt?: string;
72
+ /** Override auto-detection. When omitted, `detectMediaKind(src)` is used and falls back to 'video'. */
73
+ kind?: MediaKind;
74
+ controls?: boolean;
75
+ autoPlay?: boolean;
76
+ loop?: boolean;
77
+ muted?: boolean;
78
+ /**
79
+ * CORS mode for `<video>`/`<audio>`. Omitted by default — plain playback needs no CORS, and
80
+ * forcing it breaks sources whose response/redirect lacks `access-control-allow-origin` (e.g.
81
+ * Cloudflare Stream's signed MP4 redirect). Set 'anonymous' only when reading frames into a canvas.
82
+ */
83
+ crossOrigin?: 'anonymous' | 'use-credentials' | '';
84
+ /** CSS `object-fit` for `<img>` and `<video>`. Ignored for `<iframe>`/`<audio>`. Defaults to 'cover'. */
85
+ fit?: MediaFit;
86
+ }>;
87
+
88
+ /**
89
+ * Renders a media URL using the appropriate element:
90
+ * - Direct media URLs (mp4, mp3, …) → native `<video>` / `<audio>`.
91
+ * - Cloudflare Stream `/iframe` embed URLs → `<iframe>`.
92
+ * - Everything else → `<img>` that hides itself on load failure (broken images
93
+ * are common in feeds and the placeholder is uglier than nothing).
94
+ */
95
+ export const MediaPlayer = ({
96
+ classNames,
97
+ src,
98
+ kind,
99
+ controls = true,
100
+ autoPlay = false,
101
+ loop = false,
102
+ muted = false,
103
+ alt,
104
+ crossOrigin,
105
+ fit = 'cover',
106
+ }: MediaPlayerProps) => {
107
+ const fitClass = FIT_CLASS[fit];
108
+ if (isEmbedUrl(src)) {
109
+ const resolved = kind ?? detectMediaKind(src) ?? 'video';
110
+ if (resolved === 'audio') {
111
+ return (
112
+ <audio
113
+ className={mx('w-full', classNames)}
114
+ src={src}
115
+ controls={controls}
116
+ autoPlay={autoPlay}
117
+ loop={loop}
118
+ muted={muted}
119
+ crossOrigin={crossOrigin}
120
+ aria-label={alt}
121
+ />
122
+ );
123
+ }
124
+
125
+ return (
126
+ <video
127
+ className={mx('max-w-full max-h-full aspect-video', fitClass, classNames)}
128
+ src={src}
129
+ controls={controls}
130
+ autoPlay={autoPlay}
131
+ loop={loop}
132
+ muted={muted}
133
+ crossOrigin={crossOrigin}
134
+ aria-label={alt}
135
+ />
136
+ );
137
+ }
138
+
139
+ if (isCloudflareStreamEmbed(src)) {
140
+ return <IframePlayer key={src} classNames={classNames} src={src} alt={alt} />;
141
+ }
142
+
143
+ return (
144
+ <img
145
+ className={mx(fitClass, classNames)}
146
+ src={src}
147
+ alt={alt ?? ''}
148
+ loading='lazy'
149
+ onError={(event) => {
150
+ event.currentTarget.style.display = 'none';
151
+ }}
152
+ />
153
+ );
154
+ };
155
+
156
+ type IframePlayerProps = ThemedClassName<{
157
+ src: string;
158
+ alt?: string;
159
+ }>;
160
+
161
+ const IframePlayer = ({ src, alt, classNames }: IframePlayerProps) => {
162
+ const [loaded, setLoaded] = useState(false);
163
+ return (
164
+ <div className={mx('relative bg-baseSurface', classNames)}>
165
+ <iframe
166
+ src={src}
167
+ title={alt ?? 'Embedded media'}
168
+ loading='lazy'
169
+ className={mx(
170
+ 'border-none w-full h-full transition-opacity duration-150',
171
+ loaded ? 'opacity-100' : 'opacity-0',
172
+ )}
173
+ style={{ colorScheme: 'dark' }}
174
+ sandbox={DEFAULT_IFRAME_SANDBOX}
175
+ referrerPolicy='no-referrer'
176
+ allow='accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;'
177
+ allowFullScreen
178
+ onLoad={() => setLoaded(true)}
179
+ />
180
+ </div>
181
+ );
182
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './MediaPlayer';
@@ -103,7 +103,4 @@ type Story = StoryObj<typeof meta>;
103
103
 
104
104
  export const Default: Story = {
105
105
  args: {},
106
- parameters: {
107
- chromatic: { delay: 1600 },
108
- },
109
106
  };
@@ -103,9 +103,6 @@ type Story = StoryObj<typeof meta>;
103
103
 
104
104
  export const Default: Story = {
105
105
  args: {},
106
- parameters: {
107
- chromatic: { delay: 1600 },
108
- },
109
106
  };
110
107
 
111
108
  export const VirtualTrigger = {
@@ -107,7 +107,7 @@ DropdownMenuRoot.displayName = DROPDOWN_MENU_NAME;
107
107
  // DropdownMenuTrigger
108
108
  //
109
109
 
110
- const TRIGGER_NAME = 'DropdownMenuTrigger';
110
+ const TRIGGER_NAME = 'DropdownMenu.Trigger';
111
111
 
112
112
  type DropdownMenuTriggerElement = ComponentRef<typeof Primitive.button>;
113
113
  type PrimitiveButtonProps = ComponentPropsWithoutRef<typeof Primitive.button>;
@@ -172,7 +172,7 @@ DropdownMenuTrigger.displayName = TRIGGER_NAME;
172
172
  // DropdownMenuVirtualTrigger
173
173
  //
174
174
 
175
- const VIRTUAL_TRIGGER_NAME = 'DropdownMenuVirtualTrigger';
175
+ const VIRTUAL_TRIGGER_NAME = 'DropdownMenu.VirtualTrigger';
176
176
 
177
177
  type DropdownMenuVirtualTriggerProps = {
178
178
  virtualRef: RefObject<DropdownMenuTriggerElement | null>;
@@ -196,7 +196,7 @@ DropdownMenuVirtualTrigger.displayName = VIRTUAL_TRIGGER_NAME;
196
196
  // DropdownMenuPortal
197
197
  //
198
198
 
199
- const PORTAL_NAME = 'DropdownMenuPortal';
199
+ const PORTAL_NAME = 'DropdownMenu.Portal';
200
200
 
201
201
  type MenuPortalProps = ComponentPropsWithoutRef<typeof MenuPrimitive.Portal>;
202
202
  type DropdownMenuPortalProps = MenuPortalProps;
@@ -233,7 +233,7 @@ const DropdownMenuViewport = forwardRef<HTMLDivElement, DropdownMenuViewportProp
233
233
  // DropdownMenuContent
234
234
  //
235
235
 
236
- const CONTENT_NAME = 'DropdownMenuContent';
236
+ const CONTENT_NAME = 'DropdownMenu.Content';
237
237
 
238
238
  type DropdownMenuContentElement = ComponentRef<typeof MenuPrimitive.Content>;
239
239
  type MenuContentProps = ThemedClassName<ComponentPropsWithoutRef<typeof MenuPrimitive.Content>>;
@@ -312,7 +312,7 @@ DropdownMenuContent.displayName = CONTENT_NAME;
312
312
  // DropdownMenuGroup
313
313
  //
314
314
 
315
- const GROUP_NAME = 'DropdownMenuGroup';
315
+ const GROUP_NAME = 'DropdownMenu.Group';
316
316
 
317
317
  type DropdownMenuGroupElement = ComponentRef<typeof MenuPrimitive.Group>;
318
318
  type MenuGroupProps = ComponentPropsWithoutRef<typeof MenuPrimitive.Group>;
@@ -332,7 +332,7 @@ DropdownMenuGroup.displayName = GROUP_NAME;
332
332
  // DropdownMenuLabel
333
333
  //
334
334
 
335
- const LABEL_NAME = 'DropdownMenuLabel';
335
+ const LABEL_NAME = 'DropdownMenu.Label';
336
336
 
337
337
  type DropdownMenuLabelElement = ComponentRef<typeof MenuPrimitive.Label>;
338
338
  type MenuLabelProps = ThemedClassName<ComponentPropsWithoutRef<typeof MenuPrimitive.Label>>;
@@ -360,7 +360,7 @@ DropdownMenuGroupLabel.displayName = LABEL_NAME;
360
360
  // DropdownMenuItem
361
361
  //
362
362
 
363
- const ITEM_NAME = 'DropdownMenuItem';
363
+ const ITEM_NAME = 'DropdownMenu.Item';
364
364
 
365
365
  type DropdownMenuItemElement = ComponentRef<typeof MenuPrimitive.Item>;
366
366
  type MenuItemProps = ThemedClassName<ComponentPropsWithoutRef<typeof MenuPrimitive.Item>>;
@@ -388,7 +388,7 @@ DropdownMenuItem.displayName = ITEM_NAME;
388
388
  // DropdownMenuCheckboxItem
389
389
  //
390
390
 
391
- const CHECKBOX_ITEM_NAME = 'DropdownMenuCheckboxItem';
391
+ const CHECKBOX_ITEM_NAME = 'DropdownMenu.CheckboxItem';
392
392
 
393
393
  type DropdownMenuCheckboxItemElement = ComponentRef<typeof MenuPrimitive.CheckboxItem>;
394
394
  type MenuCheckboxItemProps = ThemedClassName<ComponentPropsWithoutRef<typeof MenuPrimitive.CheckboxItem>>;
@@ -416,7 +416,7 @@ DropdownMenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;
416
416
  // DropdownMenuRadioGroup
417
417
  //
418
418
 
419
- const RADIO_GROUP_NAME = 'DropdownMenuRadioGroup';
419
+ const RADIO_GROUP_NAME = 'DropdownMenu.RadioGroup';
420
420
 
421
421
  type DropdownMenuRadioGroupElement = ComponentRef<typeof MenuPrimitive.RadioGroup>;
422
422
  type MenuRadioGroupProps = ComponentPropsWithoutRef<typeof MenuPrimitive.RadioGroup>;
@@ -436,7 +436,7 @@ DropdownMenuRadioGroup.displayName = RADIO_GROUP_NAME;
436
436
  // DropdownMenuRadioItem
437
437
  //
438
438
 
439
- const RADIO_ITEM_NAME = 'DropdownMenuRadioItem';
439
+ const RADIO_ITEM_NAME = 'DropdownMenu.RadioItem';
440
440
 
441
441
  type DropdownMenuRadioItemElement = ComponentRef<typeof MenuPrimitive.RadioItem>;
442
442
  type MenuRadioItemProps = ComponentPropsWithoutRef<typeof MenuPrimitive.RadioItem>;
@@ -464,7 +464,7 @@ DropdownMenuRadioItem.displayName = RADIO_ITEM_NAME;
464
464
  // DropdownMenuItemIndicator
465
465
  //
466
466
 
467
- const INDICATOR_NAME = 'DropdownMenuItemIndicator';
467
+ const INDICATOR_NAME = 'DropdownMenu.ItemIndicator';
468
468
 
469
469
  type DropdownMenuItemIndicatorElement = ComponentRef<typeof MenuPrimitive.ItemIndicator>;
470
470
  type MenuItemIndicatorProps = ComponentPropsWithoutRef<typeof MenuPrimitive.ItemIndicator>;
@@ -484,7 +484,7 @@ DropdownMenuItemIndicator.displayName = INDICATOR_NAME;
484
484
  // DropdownMenuSeparator
485
485
  //
486
486
 
487
- const SEPARATOR_NAME = 'DropdownMenuSeparator';
487
+ const SEPARATOR_NAME = 'DropdownMenu.Separator';
488
488
 
489
489
  type DropdownMenuSeparatorElement = ComponentRef<typeof MenuPrimitive.Separator>;
490
490
  type MenuSeparatorProps = ThemedClassName<ComponentPropsWithoutRef<typeof MenuPrimitive.Separator>>;
@@ -512,7 +512,7 @@ DropdownMenuSeparator.displayName = SEPARATOR_NAME;
512
512
  // DropdownMenuArrow
513
513
  //
514
514
 
515
- const ARROW_NAME = 'DropdownMenuArrow';
515
+ const ARROW_NAME = 'DropdownMenu.Arrow';
516
516
 
517
517
  type DropdownMenuArrowElement = ComponentRef<typeof MenuPrimitive.Arrow>;
518
518
  type MenuArrowProps = ThemedClassName<ComponentPropsWithoutRef<typeof MenuPrimitive.Arrow>>;
@@ -567,7 +567,7 @@ const DropdownMenuSub: FC<DropdownMenuSubProps> = (props: ScopedProps<DropdownMe
567
567
  // DropdownMenuSubTrigger
568
568
  //
569
569
 
570
- const SUB_TRIGGER_NAME = 'DropdownMenuSubTrigger';
570
+ const SUB_TRIGGER_NAME = 'DropdownMenu.SubTrigger';
571
571
 
572
572
  type DropdownMenuSubTriggerElement = ComponentRef<typeof MenuPrimitive.SubTrigger>;
573
573
  type MenuSubTriggerProps = ComponentPropsWithoutRef<typeof MenuPrimitive.SubTrigger>;
@@ -587,7 +587,7 @@ DropdownMenuSubTrigger.displayName = SUB_TRIGGER_NAME;
587
587
  // DropdownMenuSubContent
588
588
  //
589
589
 
590
- const SUB_CONTENT_NAME = 'DropdownMenuSubContent';
590
+ const SUB_CONTENT_NAME = 'DropdownMenu.SubContent';
591
591
 
592
592
  type DropdownMenuSubContentElement = ComponentRef<typeof MenuPrimitive.Content>;
593
593
  type MenuSubContentProps = ComponentPropsWithoutRef<typeof MenuPrimitive.SubContent>;
@@ -0,0 +1,48 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { dataDisabled } from '@dxos/ui-theme';
6
+ import { mx, surfaceShadow, surfaceZIndex } from '@dxos/ui-theme';
7
+ import { type ComponentFunction, type Elevation, type Theme } from '@dxos/ui-types';
8
+
9
+ export type MenuStyleProps = Partial<{
10
+ constrainBlockSize: boolean;
11
+ elevation: Elevation;
12
+ }>;
13
+
14
+ const content: ComponentFunction<MenuStyleProps> = ({ elevation }, ...etc) =>
15
+ mx(
16
+ 'dx-popover-surface w-48 rounded-sm md:w-56 border border-separator',
17
+ surfaceZIndex({ elevation, level: 'menu' }),
18
+ surfaceShadow({ elevation: 'positioned' }),
19
+ ...etc,
20
+ );
21
+
22
+ const viewport: ComponentFunction<MenuStyleProps> = (_props, ...etc) =>
23
+ mx('rounded-sm p-1 max-h-[var(--radix-dropdown-menu-content-available-height)] overflow-y-auto', ...etc);
24
+
25
+ const item: ComponentFunction<MenuStyleProps> = (_props, ...etc) =>
26
+ mx(
27
+ 'flex cursor-pointer select-none items-center gap-2 rounded-xs px-2 py-2 text-sm',
28
+ 'hover:bg-hover-surface data-[highlighted]:bg-hover-surface',
29
+ 'dx-focus-subdued',
30
+ dataDisabled,
31
+ ...etc,
32
+ );
33
+
34
+ const separator: ComponentFunction<MenuStyleProps> = (_props, ...etc) => mx('my-1 mx-2 h-px bg-separator', ...etc);
35
+
36
+ const groupLabel: ComponentFunction<MenuStyleProps> = (_props, ...etc) =>
37
+ mx('text-description', 'select-none px-2 py-2', ...etc);
38
+
39
+ const arrow: ComponentFunction<MenuStyleProps> = (_props, ...etc) => mx('fill-separator', ...etc);
40
+
41
+ export const menuTheme: Theme<MenuStyleProps> = {
42
+ content,
43
+ viewport,
44
+ item,
45
+ separator,
46
+ groupLabel,
47
+ arrow,
48
+ };
@@ -9,6 +9,7 @@ import { random } from '@dxos/random';
9
9
  import { type MessageValence } from '@dxos/ui-types';
10
10
 
11
11
  import { withTheme } from '../../testing';
12
+ import { Button } from '../Button';
12
13
  import { Message } from './Message';
13
14
 
14
15
  random.seed(123);
@@ -17,13 +18,21 @@ type DefaultStoryProps = {
17
18
  valence: MessageValence;
18
19
  title: string;
19
20
  body: string;
21
+ button?: boolean;
20
22
  };
21
23
 
22
- const DefaultStory = ({ valence, title, body }: DefaultStoryProps) => (
24
+ const DefaultStory = ({ valence, title, body, button }: DefaultStoryProps) => (
23
25
  <div className='w-[30rem]'>
24
26
  <Message.Root valence={valence}>
25
- {title && <Message.Title>{title}</Message.Title>}
26
- {body && <Message.Content>{body}</Message.Content>}
27
+ {title && <Message.Title onClose={() => console.log('close')}>{title}</Message.Title>}
28
+ {body && (
29
+ <Message.Content asChild classNames='gap-2'>
30
+ <div>
31
+ <p>{body}</p>
32
+ {button && <Button>Test</Button>}
33
+ </div>
34
+ </Message.Content>
35
+ )}
27
36
  </Message.Root>
28
37
  </div>
29
38
  );
@@ -51,15 +60,44 @@ type Story = StoryObj<typeof meta>;
51
60
  export const Default: Story = {
52
61
  args: {
53
62
  valence: 'neutral',
54
- title: 'Alert title',
63
+ title: 'Default',
55
64
  body: random.lorem.paragraphs(1),
65
+ button: true,
66
+ },
67
+ };
68
+
69
+ export const Success: Story = {
70
+ args: {
71
+ valence: 'success',
72
+ title: 'Success',
73
+ body: random.lorem.paragraphs(1),
74
+ button: true,
75
+ },
76
+ };
77
+
78
+ export const Info: Story = {
79
+ args: {
80
+ valence: 'info',
81
+ title: 'Info',
82
+ body: random.lorem.paragraphs(1),
83
+ button: true,
84
+ },
85
+ };
86
+
87
+ export const Warning: Story = {
88
+ args: {
89
+ valence: 'warning',
90
+ title: 'Warning',
91
+ body: random.lorem.paragraphs(1),
92
+ button: true,
56
93
  },
57
94
  };
58
95
 
59
96
  export const Error: Story = {
60
97
  args: {
61
98
  valence: 'error',
62
- title: 'Error title',
99
+ title: 'Error',
63
100
  body: random.lorem.paragraphs(1),
101
+ button: true,
64
102
  },
65
103
  };
@@ -0,0 +1,44 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { mx, messageValence } from '@dxos/ui-theme';
6
+ import { type ComponentFunction, type Elevation, type MessageValence, type Theme } from '@dxos/ui-types';
7
+
8
+ export type MessageStyleProps = {
9
+ valence?: MessageValence;
10
+ elevation?: Elevation;
11
+ };
12
+
13
+ const root: ComponentFunction<MessageStyleProps> = ({ valence }, etc) => {
14
+ return mx('p-1 rounded-sm', messageValence(valence), etc);
15
+ };
16
+
17
+ const header: ComponentFunction<MessageStyleProps> = (_, etc) => {
18
+ return mx('items-center', etc);
19
+ };
20
+
21
+ const title: ComponentFunction<MessageStyleProps> = (_, etc) => {
22
+ return mx('col-start-2 overflow-hidden truncate', etc);
23
+ };
24
+
25
+ const icon: ComponentFunction<MessageStyleProps> = (_, etc) => {
26
+ return mx('col-start-1 grid place-items-center', etc);
27
+ };
28
+
29
+ const close: ComponentFunction<MessageStyleProps> = (_, etc) => {
30
+ return mx('col-start-3', etc);
31
+ };
32
+
33
+ const content: ComponentFunction<MessageStyleProps> = (_, etc) => {
34
+ return mx('col-start-2 flex flex-col first:font-medium pb-1.5', etc);
35
+ };
36
+
37
+ export const messageTheme: Theme<MessageStyleProps> = {
38
+ root,
39
+ header,
40
+ icon,
41
+ title,
42
+ close,
43
+ content,
44
+ };