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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (496) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/browser/chunk-F3PLXTDA.mjs +1608 -0
  4. package/dist/lib/browser/chunk-F3PLXTDA.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-HFJYTGHU.mjs +43 -0
  6. package/dist/lib/browser/chunk-HFJYTGHU.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +3785 -2451
  8. package/dist/lib/browser/index.mjs.map +4 -4
  9. package/dist/lib/browser/meta.json +1 -1
  10. package/dist/lib/browser/testing/index.mjs +14 -17
  11. package/dist/lib/browser/testing/index.mjs.map +3 -3
  12. package/dist/lib/browser/translations.mjs +9 -0
  13. package/dist/lib/browser/translations.mjs.map +7 -0
  14. package/dist/lib/node-esm/chunk-LLVUYLAM.mjs +1610 -0
  15. package/dist/lib/node-esm/chunk-LLVUYLAM.mjs.map +7 -0
  16. package/dist/lib/node-esm/chunk-OJYUPUCY.mjs +45 -0
  17. package/dist/lib/node-esm/chunk-OJYUPUCY.mjs.map +7 -0
  18. package/dist/lib/node-esm/index.mjs +3785 -2451
  19. package/dist/lib/node-esm/index.mjs.map +4 -4
  20. package/dist/lib/node-esm/meta.json +1 -1
  21. package/dist/lib/node-esm/testing/index.mjs +14 -17
  22. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  23. package/dist/lib/node-esm/translations.mjs +10 -0
  24. package/dist/lib/node-esm/translations.mjs.map +7 -0
  25. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  26. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  27. package/dist/types/src/components/Avatars/Avatar.theme.d.ts +11 -0
  28. package/dist/types/src/components/Avatars/Avatar.theme.d.ts.map +1 -0
  29. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  30. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts +5 -1
  31. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  32. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  33. package/dist/types/src/components/Breadcrumb/Breadcrumb.theme.d.ts +4 -0
  34. package/dist/types/src/components/Breadcrumb/Breadcrumb.theme.d.ts.map +1 -0
  35. package/dist/types/src/components/Button/Button.d.ts +3 -1
  36. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  37. package/dist/types/src/components/Button/Button.stories.d.ts +1 -1
  38. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -1
  39. package/dist/types/src/components/Button/Button.theme.d.ts +11 -0
  40. package/dist/types/src/components/Button/Button.theme.d.ts.map +1 -0
  41. package/dist/types/src/components/Button/IconButton.d.ts +1 -1
  42. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  43. package/dist/types/src/components/Button/IconButton.stories.d.ts +35 -0
  44. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
  45. package/dist/types/src/components/Button/IconButton.theme.d.ts +8 -0
  46. package/dist/types/src/components/Button/IconButton.theme.d.ts.map +1 -0
  47. package/dist/types/src/components/Button/SystemIconButton.d.ts +20 -0
  48. package/dist/types/src/components/Button/SystemIconButton.d.ts.map +1 -0
  49. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
  50. package/dist/types/src/components/Button/ToggleGroup.d.ts +2 -2
  51. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +2 -2
  52. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
  53. package/dist/types/src/components/Button/ToggleIconButton.d.ts +15 -0
  54. package/dist/types/src/components/Button/ToggleIconButton.d.ts.map +1 -0
  55. package/dist/types/src/components/Button/index.d.ts +2 -0
  56. package/dist/types/src/components/Button/index.d.ts.map +1 -1
  57. package/dist/types/src/components/Calendar/Calendar.d.ts +33 -0
  58. package/dist/types/src/components/Calendar/Calendar.d.ts.map +1 -0
  59. package/dist/types/src/components/Calendar/Calendar.stories.d.ts +9 -0
  60. package/dist/types/src/components/Calendar/Calendar.stories.d.ts.map +1 -0
  61. package/dist/types/src/components/Calendar/Calendar.theme.d.ts +4 -0
  62. package/dist/types/src/components/Calendar/Calendar.theme.d.ts.map +1 -0
  63. package/dist/types/src/components/Calendar/index.d.ts +2 -0
  64. package/dist/types/src/components/Calendar/index.d.ts.map +1 -0
  65. package/dist/types/src/components/Card/Card.d.ts +67 -55
  66. package/dist/types/src/components/Card/Card.d.ts.map +1 -1
  67. package/dist/types/src/components/Card/Card.stories.d.ts +2 -1
  68. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -1
  69. package/dist/types/src/components/Card/Card.theme.d.ts +12 -0
  70. package/dist/types/src/components/Card/Card.theme.d.ts.map +1 -0
  71. package/dist/types/src/components/Carousel/Carousel.d.ts +106 -0
  72. package/dist/types/src/components/Carousel/Carousel.d.ts.map +1 -0
  73. package/dist/types/src/components/Carousel/Carousel.stories.d.ts +14 -0
  74. package/dist/types/src/components/Carousel/Carousel.stories.d.ts.map +1 -0
  75. package/dist/types/src/components/Carousel/index.d.ts +2 -0
  76. package/dist/types/src/components/Carousel/index.d.ts.map +1 -0
  77. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  78. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  79. package/dist/types/src/components/Clipboard/index.d.ts +2 -1
  80. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  81. package/dist/types/src/components/Column/Column.d.ts +51 -0
  82. package/dist/types/src/components/Column/Column.d.ts.map +1 -0
  83. package/dist/types/src/components/Column/Column.stories.d.ts.map +1 -0
  84. package/dist/types/src/components/Column/Column.theme.d.ts +17 -0
  85. package/dist/types/src/components/Column/Column.theme.d.ts.map +1 -0
  86. package/dist/types/src/components/Column/index.d.ts +3 -0
  87. package/dist/types/src/components/Column/index.d.ts.map +1 -0
  88. package/dist/types/src/components/Column/withColumn.d.ts +21 -0
  89. package/dist/types/src/components/Column/withColumn.d.ts.map +1 -0
  90. package/dist/types/src/components/DatePicker/DatePicker.d.ts +72 -0
  91. package/dist/types/src/components/DatePicker/DatePicker.d.ts.map +1 -0
  92. package/dist/types/src/components/DatePicker/DatePicker.stories.d.ts +10 -0
  93. package/dist/types/src/components/DatePicker/DatePicker.stories.d.ts.map +1 -0
  94. package/dist/types/src/components/DatePicker/DatePicker.theme.d.ts +6 -0
  95. package/dist/types/src/components/DatePicker/DatePicker.theme.d.ts.map +1 -0
  96. package/dist/types/src/components/DatePicker/index.d.ts +2 -0
  97. package/dist/types/src/components/DatePicker/index.d.ts.map +1 -0
  98. package/dist/types/src/components/Dialog/AlertDialog.d.ts +20 -20
  99. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  100. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  101. package/dist/types/src/components/Dialog/Dialog.d.ts +21 -19
  102. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  103. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  104. package/dist/types/src/components/Dialog/Dialog.theme.d.ts +10 -0
  105. package/dist/types/src/components/Dialog/Dialog.theme.d.ts.map +1 -0
  106. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -1
  107. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -1
  108. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -1
  109. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -1
  110. package/dist/types/src/components/Focus/Focus.d.ts +2 -2
  111. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -1
  112. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -1
  113. package/dist/types/src/components/Focus/Focus.theme.d.ts +6 -0
  114. package/dist/types/src/components/Focus/Focus.theme.d.ts.map +1 -0
  115. package/dist/types/src/components/Icon/Icon.d.ts +1 -0
  116. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  117. package/dist/types/src/components/Icon/Icon.stories.d.ts +1 -1
  118. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  119. package/dist/types/src/components/Icon/Icon.theme.d.ts +11 -0
  120. package/dist/types/src/components/Icon/Icon.theme.d.ts.map +1 -0
  121. package/dist/types/src/components/Icon/IconBlock.d.ts +15 -0
  122. package/dist/types/src/components/Icon/IconBlock.d.ts.map +1 -0
  123. package/dist/types/src/components/Icon/index.d.ts +1 -0
  124. package/dist/types/src/components/Icon/index.d.ts.map +1 -1
  125. package/dist/types/src/components/Image/Image.d.ts +8 -1
  126. package/dist/types/src/components/Image/Image.d.ts.map +1 -1
  127. package/dist/types/src/components/Image/Image.stories.d.ts +3 -2
  128. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -1
  129. package/dist/types/src/components/Input/Input.d.ts +88 -13
  130. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  131. package/dist/types/src/components/Input/Input.stories.d.ts +14 -3
  132. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  133. package/dist/types/src/components/Input/Input.theme.d.ts +115 -0
  134. package/dist/types/src/components/Input/Input.theme.d.ts.map +1 -0
  135. package/dist/types/src/components/Input/SegmentedInput.d.ts +79 -0
  136. package/dist/types/src/components/Input/SegmentedInput.d.ts.map +1 -0
  137. package/dist/types/src/components/Input/constants.d.ts +5 -0
  138. package/dist/types/src/components/Input/constants.d.ts.map +1 -0
  139. package/dist/types/src/components/Input/index.d.ts +2 -0
  140. package/dist/types/src/components/Input/index.d.ts.map +1 -1
  141. package/dist/types/src/components/Link/Link.d.ts.map +1 -1
  142. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  143. package/dist/types/src/components/Link/Link.theme.d.ts +6 -0
  144. package/dist/types/src/components/Link/Link.theme.d.ts.map +1 -0
  145. package/dist/types/src/components/List/List.d.ts +2 -2
  146. package/dist/types/src/components/List/List.d.ts.map +1 -1
  147. package/dist/types/src/components/List/List.stories.d.ts +1 -1
  148. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  149. package/dist/types/src/components/List/List.theme.d.ts +7 -0
  150. package/dist/types/src/components/List/List.theme.d.ts.map +1 -0
  151. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -1
  152. package/dist/types/src/components/List/Tree.d.ts +2 -2
  153. package/dist/types/src/components/List/Tree.d.ts.map +1 -1
  154. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
  155. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -1
  156. package/dist/types/src/components/List/Treegrid.d.ts +2 -2
  157. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  158. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
  159. package/dist/types/src/components/List/Treegrid.theme.d.ts +7 -0
  160. package/dist/types/src/components/List/Treegrid.theme.d.ts.map +1 -0
  161. package/dist/types/src/components/Main/Main.d.ts +9 -5
  162. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  163. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  164. package/dist/types/src/components/Main/Main.theme.d.ts +20 -0
  165. package/dist/types/src/components/Main/Main.theme.d.ts.map +1 -0
  166. package/dist/types/src/components/Main/constants.d.ts +3 -0
  167. package/dist/types/src/components/Main/constants.d.ts.map +1 -0
  168. package/dist/types/src/components/Main/index.d.ts +1 -0
  169. package/dist/types/src/components/Main/index.d.ts.map +1 -1
  170. package/dist/types/src/components/Main/useSwipeToDismiss.d.ts.map +1 -1
  171. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +47 -0
  172. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -0
  173. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts +16 -0
  174. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts.map +1 -0
  175. package/dist/types/src/components/MediaPlayer/index.d.ts +2 -0
  176. package/dist/types/src/components/MediaPlayer/index.d.ts.map +1 -0
  177. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -1
  178. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -1
  179. package/dist/types/src/components/Menu/DropdownMenu.d.ts +11 -3
  180. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
  181. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
  182. package/dist/types/src/components/Menu/Menu.theme.d.ts +7 -0
  183. package/dist/types/src/components/Menu/Menu.theme.d.ts.map +1 -0
  184. package/dist/types/src/components/Message/Message.d.ts +3 -3
  185. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  186. package/dist/types/src/components/Message/Message.stories.d.ts +5 -1
  187. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  188. package/dist/types/src/components/Message/Message.theme.d.ts +7 -0
  189. package/dist/types/src/components/Message/Message.theme.d.ts.map +1 -0
  190. package/dist/types/src/{primitives → components}/Panel/Panel.d.ts +5 -5
  191. package/dist/types/src/components/Panel/Panel.d.ts.map +1 -0
  192. package/dist/types/src/components/Panel/Panel.stories.d.ts.map +1 -0
  193. package/dist/types/src/components/Panel/Panel.theme.d.ts +13 -0
  194. package/dist/types/src/components/Panel/Panel.theme.d.ts.map +1 -0
  195. package/dist/types/src/components/Panel/index.d.ts.map +1 -0
  196. package/dist/types/src/components/Popover/Popover.d.ts +10 -2
  197. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  198. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  199. package/dist/types/src/components/Popover/Popover.theme.d.ts +8 -0
  200. package/dist/types/src/components/Popover/Popover.theme.d.ts.map +1 -0
  201. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +2 -2
  202. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  203. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +2 -2
  204. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  205. package/dist/types/src/components/ScrollArea/ScrollArea.theme.d.ts +17 -0
  206. package/dist/types/src/components/ScrollArea/ScrollArea.theme.d.ts.map +1 -0
  207. package/dist/types/src/components/ScrollArea/index.d.ts +1 -0
  208. package/dist/types/src/components/ScrollArea/index.d.ts.map +1 -1
  209. package/dist/types/src/components/ScrollArea/scrollbar.d.ts +18 -0
  210. package/dist/types/src/components/ScrollArea/scrollbar.d.ts.map +1 -0
  211. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +20 -18
  212. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  213. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  214. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  215. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  216. package/dist/types/src/components/Select/Select.theme.d.ts +6 -0
  217. package/dist/types/src/components/Select/Select.theme.d.ts.map +1 -0
  218. package/dist/types/src/components/Separator/Separator.theme.d.ts +7 -0
  219. package/dist/types/src/components/Separator/Separator.theme.d.ts.map +1 -0
  220. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -1
  221. package/dist/types/src/components/Skeleton/Skeleton.theme.d.ts +6 -0
  222. package/dist/types/src/components/Skeleton/Skeleton.theme.d.ts.map +1 -0
  223. package/dist/types/src/components/Splitter/Splitter.d.ts +6 -8
  224. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -1
  225. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -1
  226. package/dist/types/src/components/Splitter/Splitter.theme.d.ts +4 -0
  227. package/dist/types/src/components/Splitter/Splitter.theme.d.ts.map +1 -0
  228. package/dist/types/src/components/Status/Status.d.ts +1 -1
  229. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  230. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  231. package/dist/types/src/components/Status/Status.theme.d.ts +7 -0
  232. package/dist/types/src/components/Status/Status.theme.d.ts.map +1 -0
  233. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  234. package/dist/types/src/components/Tag/Tag.theme.d.ts +6 -0
  235. package/dist/types/src/components/Tag/Tag.theme.d.ts.map +1 -0
  236. package/dist/types/src/components/Toast/Toast.d.ts +12 -9
  237. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  238. package/dist/types/src/components/Toast/Toast.stories.d.ts +5 -2
  239. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  240. package/dist/types/src/components/Toast/Toast.theme.d.ts +4 -0
  241. package/dist/types/src/components/Toast/Toast.theme.d.ts.map +1 -0
  242. package/dist/types/src/components/Toolbar/Toolbar.d.ts +24 -12
  243. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  244. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  245. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts +8 -0
  246. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts.map +1 -0
  247. package/dist/types/src/components/Tooltip/TextTooltip.d.ts +19 -0
  248. package/dist/types/src/components/Tooltip/TextTooltip.d.ts.map +1 -0
  249. package/dist/types/src/components/Tooltip/Tooltip.d.ts +8 -8
  250. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  251. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  252. package/dist/types/src/components/Tooltip/Tooltip.theme.d.ts +6 -0
  253. package/dist/types/src/components/Tooltip/Tooltip.theme.d.ts.map +1 -0
  254. package/dist/types/src/components/Tooltip/index.d.ts +2 -0
  255. package/dist/types/src/components/Tooltip/index.d.ts.map +1 -1
  256. package/dist/types/src/components/Tooltip/tooltipContent.d.ts +4 -0
  257. package/dist/types/src/components/Tooltip/tooltipContent.d.ts.map +1 -0
  258. package/dist/types/src/components/index.d.ts +7 -4
  259. package/dist/types/src/components/index.d.ts.map +1 -1
  260. package/dist/types/src/exemplars/generics.stories.d.ts +1 -1
  261. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -1
  262. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -1
  263. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -1
  264. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -1
  265. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  266. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  267. package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
  268. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  269. package/dist/types/src/hooks/useSafeCollisionPadding.d.ts.map +1 -1
  270. package/dist/types/src/hooks/useTranslationsContext.d.ts +1 -1
  271. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  272. package/dist/types/src/index.d.ts +1 -0
  273. package/dist/types/src/index.d.ts.map +1 -1
  274. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  275. package/dist/types/src/playground/Custom.stories.d.ts +1 -1
  276. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  277. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  278. package/dist/types/src/primitives/Container/Container.d.ts +1 -1
  279. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -1
  280. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -1
  281. package/dist/types/src/{components → primitives}/DensityProvider/DensityProvider.d.ts.map +1 -1
  282. package/dist/types/src/primitives/DensityProvider/index.d.ts.map +1 -0
  283. package/dist/types/src/{components → primitives}/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  284. package/dist/types/src/primitives/ElevationProvider/index.d.ts.map +1 -0
  285. package/dist/types/src/primitives/Flex/Flex.d.ts +1 -1
  286. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -1
  287. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -1
  288. package/dist/types/src/primitives/Grid/Grid.d.ts +1 -1
  289. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -1
  290. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -1
  291. package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  292. package/dist/types/src/primitives/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  293. package/dist/types/src/primitives/ThemeProvider/TranslationsProvider.d.ts +128 -0
  294. package/dist/types/src/primitives/ThemeProvider/TranslationsProvider.d.ts.map +1 -0
  295. package/dist/types/src/primitives/ThemeProvider/index.d.ts +4 -0
  296. package/dist/types/src/primitives/ThemeProvider/index.d.ts.map +1 -0
  297. package/dist/types/src/primitives/index.d.ts +3 -2
  298. package/dist/types/src/primitives/index.d.ts.map +1 -1
  299. package/dist/types/src/testing/Loading.d.ts.map +1 -1
  300. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  301. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  302. package/dist/types/src/testing/decorators/withTheme.d.ts +5 -1
  303. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  304. package/dist/types/src/theme/bindTheme.d.ts +3 -0
  305. package/dist/types/src/theme/bindTheme.d.ts.map +1 -0
  306. package/dist/types/src/theme/defaultTheme.d.ts +4 -0
  307. package/dist/types/src/theme/defaultTheme.d.ts.map +1 -0
  308. package/dist/types/src/theme/index.d.ts +31 -0
  309. package/dist/types/src/theme/index.d.ts.map +1 -0
  310. package/dist/types/src/translations.d.ts +27 -3
  311. package/dist/types/src/translations.d.ts.map +1 -1
  312. package/dist/types/src/util/index.d.ts +2 -1
  313. package/dist/types/src/util/index.d.ts.map +1 -1
  314. package/dist/types/src/util/mobile.d.ts +5 -0
  315. package/dist/types/src/util/mobile.d.ts.map +1 -0
  316. package/dist/types/src/util/slots.d.ts +57 -0
  317. package/dist/types/src/util/slots.d.ts.map +1 -0
  318. package/dist/types/src/util/usePx.d.ts.map +1 -1
  319. package/dist/types/tsconfig.tsbuildinfo +1 -1
  320. package/package.json +29 -25
  321. package/src/components/Avatars/Avatar.theme.ts +93 -0
  322. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -1
  323. package/src/components/Breadcrumb/Breadcrumb.theme.ts +26 -0
  324. package/src/components/Breadcrumb/Breadcrumb.tsx +14 -2
  325. package/src/components/Button/Button.theme.ts +31 -0
  326. package/src/components/Button/Button.tsx +25 -4
  327. package/src/components/Button/IconButton.stories.tsx +132 -4
  328. package/src/components/Button/IconButton.theme.ts +21 -0
  329. package/src/components/Button/IconButton.tsx +3 -4
  330. package/src/components/Button/SystemIconButton.tsx +153 -0
  331. package/src/components/Button/ToggleIconButton.tsx +32 -0
  332. package/src/components/Button/index.ts +2 -0
  333. package/src/components/Calendar/Calendar.stories.tsx +43 -0
  334. package/src/components/Calendar/Calendar.theme.ts +74 -0
  335. package/src/components/Calendar/Calendar.tsx +196 -0
  336. package/src/components/Calendar/index.ts +5 -0
  337. package/src/components/Card/Card.stories.tsx +109 -46
  338. package/src/components/Card/Card.theme.ts +111 -0
  339. package/src/components/Card/Card.tsx +281 -212
  340. package/src/components/Carousel/Carousel.stories.tsx +47 -0
  341. package/src/components/Carousel/Carousel.tsx +373 -0
  342. package/src/components/Carousel/index.ts +5 -0
  343. package/src/components/Clipboard/CopyButton.tsx +3 -3
  344. package/src/{primitives → components}/Column/Column.stories.tsx +1 -1
  345. package/src/components/Column/Column.theme.ts +76 -0
  346. package/src/{primitives → components}/Column/Column.tsx +38 -2
  347. package/src/{primitives → components}/Column/index.ts +1 -0
  348. package/src/components/Column/withColumn.ts +27 -0
  349. package/src/components/DatePicker/DatePicker.stories.tsx +102 -0
  350. package/src/components/DatePicker/DatePicker.theme.ts +35 -0
  351. package/src/components/DatePicker/DatePicker.tsx +279 -0
  352. package/src/components/DatePicker/index.ts +5 -0
  353. package/src/components/Dialog/AlertDialog.tsx +12 -16
  354. package/src/components/Dialog/Dialog.stories.tsx +2 -2
  355. package/src/components/Dialog/Dialog.theme.ts +61 -0
  356. package/src/components/Dialog/Dialog.tsx +46 -17
  357. package/src/components/ErrorFallback/ErrorFallback.tsx +14 -8
  358. package/src/components/ErrorFallback/ErrorStack.tsx +12 -6
  359. package/src/components/Focus/Focus.theme.ts +32 -0
  360. package/src/components/Focus/Focus.tsx +1 -1
  361. package/src/components/Icon/Icon.theme.ts +45 -0
  362. package/src/components/Icon/Icon.tsx +10 -3
  363. package/src/components/Icon/IconBlock.tsx +38 -0
  364. package/src/components/Icon/index.ts +1 -0
  365. package/src/components/Image/Image.stories.tsx +1 -1
  366. package/src/components/Image/Image.tsx +38 -9
  367. package/src/components/Input/Input.stories.tsx +132 -29
  368. package/src/components/Input/Input.theme.ts +191 -0
  369. package/src/components/Input/Input.tsx +208 -2
  370. package/src/components/Input/SegmentedInput.tsx +454 -0
  371. package/src/components/Input/constants.ts +8 -0
  372. package/src/components/Input/index.ts +2 -0
  373. package/src/components/Link/Link.theme.ts +16 -0
  374. package/src/components/Link/Link.tsx +10 -2
  375. package/src/components/List/List.stories.tsx +1 -1
  376. package/src/components/List/List.theme.ts +47 -0
  377. package/src/components/List/List.tsx +3 -3
  378. package/src/components/List/ListDropIndicator.tsx +1 -2
  379. package/src/components/List/Tree.stories.tsx +1 -1
  380. package/src/components/List/TreeDropIndicator.tsx +3 -3
  381. package/src/components/List/Treegrid.theme.ts +35 -0
  382. package/src/components/List/Treegrid.tsx +3 -4
  383. package/src/components/Main/Main.theme.ts +29 -0
  384. package/src/components/Main/Main.tsx +9 -7
  385. package/src/components/Main/constants.ts +6 -0
  386. package/src/components/Main/index.ts +1 -0
  387. package/src/components/MediaPlayer/MediaPlayer.stories.tsx +50 -0
  388. package/src/components/MediaPlayer/MediaPlayer.tsx +182 -0
  389. package/src/components/MediaPlayer/index.ts +5 -0
  390. package/src/components/Menu/ContextMenu.stories.tsx +0 -3
  391. package/src/components/Menu/DropdownMenu.stories.tsx +0 -3
  392. package/src/components/Menu/DropdownMenu.tsx +15 -15
  393. package/src/components/Menu/Menu.theme.ts +48 -0
  394. package/src/components/Message/Message.stories.tsx +43 -5
  395. package/src/components/Message/Message.theme.ts +34 -0
  396. package/src/components/Message/Message.tsx +76 -16
  397. package/src/{primitives → components}/Panel/Panel.stories.tsx +2 -3
  398. package/src/components/Panel/Panel.theme.ts +41 -0
  399. package/src/{primitives → components}/Panel/Panel.tsx +2 -1
  400. package/src/components/Popover/Popover.theme.ts +40 -0
  401. package/src/components/Popover/Popover.tsx +7 -7
  402. package/src/components/ScrollArea/ScrollArea.stories.tsx +2 -6
  403. package/src/components/ScrollArea/ScrollArea.theme.ts +107 -0
  404. package/src/components/ScrollArea/ScrollArea.tsx +3 -2
  405. package/src/components/ScrollArea/index.ts +1 -0
  406. package/src/components/ScrollArea/scrollbar.ts +21 -0
  407. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +1 -1
  408. package/src/components/ScrollContainer/ScrollContainer.tsx +58 -58
  409. package/src/components/Select/Select.theme.ts +55 -0
  410. package/src/components/Select/Select.tsx +26 -10
  411. package/src/components/Separator/Separator.theme.ts +23 -0
  412. package/src/components/Skeleton/Skeleton.theme.ts +22 -0
  413. package/src/components/Splitter/Splitter.stories.tsx +1 -1
  414. package/src/components/Splitter/Splitter.theme.ts +18 -0
  415. package/src/components/Splitter/Splitter.tsx +10 -15
  416. package/src/components/Status/Status.theme.ts +31 -0
  417. package/src/components/Status/Status.tsx +1 -2
  418. package/src/components/Tag/Tag.theme.ts +22 -0
  419. package/src/components/Toast/Toast.stories.tsx +41 -20
  420. package/src/components/Toast/Toast.theme.ts +50 -0
  421. package/src/components/Toast/Toast.tsx +96 -27
  422. package/src/components/Toolbar/Toolbar.theme.ts +36 -0
  423. package/src/components/Toolbar/Toolbar.tsx +67 -15
  424. package/src/components/Tooltip/TextTooltip.tsx +54 -0
  425. package/src/components/Tooltip/Tooltip.stories.tsx +1 -10
  426. package/src/components/Tooltip/Tooltip.theme.ts +19 -0
  427. package/src/components/Tooltip/Tooltip.tsx +18 -17
  428. package/src/components/Tooltip/index.ts +2 -0
  429. package/src/components/Tooltip/tooltipContent.ts +16 -0
  430. package/src/components/index.ts +7 -5
  431. package/src/exemplars/generics.stories.tsx +1 -2
  432. package/src/exemplars/slot.stories.tsx +5 -6
  433. package/src/exemplars/virtualizer.stories.tsx +0 -1
  434. package/src/hooks/useDensityContext.ts +1 -1
  435. package/src/hooks/useElevationContext.ts +1 -1
  436. package/src/hooks/useThemeContext.ts +1 -1
  437. package/src/hooks/useTranslationsContext.ts +1 -1
  438. package/src/index.ts +1 -0
  439. package/src/playground/Custom.stories.tsx +12 -32
  440. package/src/primitives/Container/Container.tsx +3 -1
  441. package/src/{components → primitives}/DensityProvider/DensityProvider.tsx +1 -1
  442. package/src/primitives/Flex/Flex.tsx +3 -1
  443. package/src/primitives/Grid/Grid.tsx +3 -1
  444. package/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.tsx +1 -1
  445. package/src/{components → primitives}/ThemeProvider/ThemeProvider.tsx +1 -1
  446. package/src/{components → primitives}/ThemeProvider/index.ts +2 -2
  447. package/src/primitives/index.ts +4 -2
  448. package/src/testing/Loading.tsx +2 -1
  449. package/src/testing/decorators/withLayout.tsx +7 -17
  450. package/src/testing/decorators/withLayoutVariants.tsx +1 -1
  451. package/src/testing/decorators/withTheme.tsx +21 -13
  452. package/src/theme/bindTheme.ts +13 -0
  453. package/src/theme/defaultTheme.ts +83 -0
  454. package/src/theme/index.ts +37 -0
  455. package/src/translations.ts +24 -0
  456. package/src/util/index.ts +2 -1
  457. package/src/util/mobile.ts +11 -0
  458. package/src/util/slots.ts +129 -0
  459. package/src/util/usePx.ts +4 -1
  460. package/dist/lib/browser/chunk-OCVRIJCH.mjs +0 -848
  461. package/dist/lib/browser/chunk-OCVRIJCH.mjs.map +0 -7
  462. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs +0 -850
  463. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs.map +0 -7
  464. package/dist/types/src/components/DensityProvider/index.d.ts.map +0 -1
  465. package/dist/types/src/components/ElevationProvider/index.d.ts.map +0 -1
  466. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +0 -1
  467. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +0 -129
  468. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +0 -1
  469. package/dist/types/src/components/ThemeProvider/index.d.ts +0 -4
  470. package/dist/types/src/components/ThemeProvider/index.d.ts.map +0 -1
  471. package/dist/types/src/primitives/Column/Column.d.ts +0 -33
  472. package/dist/types/src/primitives/Column/Column.d.ts.map +0 -1
  473. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +0 -1
  474. package/dist/types/src/primitives/Column/index.d.ts +0 -2
  475. package/dist/types/src/primitives/Column/index.d.ts.map +0 -1
  476. package/dist/types/src/primitives/Panel/Panel.d.ts.map +0 -1
  477. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +0 -1
  478. package/dist/types/src/primitives/Panel/index.d.ts.map +0 -1
  479. package/dist/types/src/util/hasIosKeyboard.d.ts +0 -2
  480. package/dist/types/src/util/hasIosKeyboard.d.ts.map +0 -1
  481. package/src/util/hasIosKeyboard.ts +0 -8
  482. /package/dist/types/src/{primitives → components}/Column/Column.stories.d.ts +0 -0
  483. /package/dist/types/src/{primitives → components}/Panel/Panel.stories.d.ts +0 -0
  484. /package/dist/types/src/{primitives → components}/Panel/index.d.ts +0 -0
  485. /package/dist/types/src/{components → primitives}/DensityProvider/DensityProvider.d.ts +0 -0
  486. /package/dist/types/src/{components → primitives}/DensityProvider/index.d.ts +0 -0
  487. /package/dist/types/src/{components → primitives}/ElevationProvider/ElevationProvider.d.ts +0 -0
  488. /package/dist/types/src/{components → primitives}/ElevationProvider/index.d.ts +0 -0
  489. /package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.d.ts +0 -0
  490. /package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.d.ts +0 -0
  491. /package/src/{primitives → components}/Column/AUDIT.md +0 -0
  492. /package/src/{primitives → components}/Panel/index.ts +0 -0
  493. /package/src/{components → primitives}/DensityProvider/index.ts +0 -0
  494. /package/src/{components → primitives}/ElevationProvider/ElevationProvider.tsx +0 -0
  495. /package/src/{components → primitives}/ElevationProvider/index.ts +0 -0
  496. /package/src/{components → primitives}/ThemeProvider/TranslationsProvider.tsx +0 -0
@@ -0,0 +1,47 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React from 'react';
7
+
8
+ import { withTheme } from '../../testing';
9
+ import { Carousel } from './Carousel';
10
+
11
+ // Stable placeholder images so the story renders without network fixtures.
12
+ const IMAGES = Array.from({ length: 5 }).map((_, index) => `https://placehold.co/640x360?text=Slide+${index + 1}`);
13
+
14
+ type DefaultStoryProps = { count?: number };
15
+
16
+ const DefaultStory = ({ count = IMAGES.length }: DefaultStoryProps) => {
17
+ const images = IMAGES.slice(0, count);
18
+ return (
19
+ <Carousel.Root count={images.length}>
20
+ <Carousel.Content classNames='max-w-[40rem]'>
21
+ <Carousel.Previous />
22
+ <Carousel.Viewport>
23
+ {images.map((src, index) => (
24
+ <Carousel.Slide key={src} index={index} src={src} alt={`Slide ${index + 1}`} />
25
+ ))}
26
+ </Carousel.Viewport>
27
+ <Carousel.Next />
28
+ <Carousel.Indicators />
29
+ <Carousel.Caption>{(index) => `Slide ${index + 1} of ${images.length}`}</Carousel.Caption>
30
+ </Carousel.Content>
31
+ </Carousel.Root>
32
+ );
33
+ };
34
+
35
+ const meta = {
36
+ title: 'ui/react-ui-core/components/Carousel',
37
+ render: DefaultStory,
38
+ decorators: [withTheme()],
39
+ } satisfies Meta<typeof DefaultStory>;
40
+
41
+ export default meta;
42
+
43
+ type Story = StoryObj<typeof meta>;
44
+
45
+ export const Default: Story = {
46
+ args: { count: 5 },
47
+ };
@@ -0,0 +1,373 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { useArrowNavigationGroup } from '@fluentui/react-tabster';
6
+ import { createContext } from '@radix-ui/react-context';
7
+ import React, {
8
+ type KeyboardEvent,
9
+ type PropsWithChildren,
10
+ type ReactNode,
11
+ useCallback,
12
+ useEffect,
13
+ useState,
14
+ } from 'react';
15
+
16
+ import { mx } from '@dxos/ui-theme';
17
+
18
+ import { useTranslation } from '../../primitives';
19
+ import { translationKey } from '../../translations';
20
+ import { type ThemedClassName, composable, composableProps } from '../../util';
21
+ import { IconButton } from '../Button';
22
+ import { MediaPlayer, type MediaKind } from '../MediaPlayer';
23
+
24
+ // TODO(burdon): Move per-element class strings to `@dxos/ui-theme` (theme tokens)
25
+ // so callers can re-theme via the same mechanism the rest of `react-ui` uses.
26
+
27
+ //
28
+ // Context
29
+ //
30
+
31
+ type CarouselContextValue = {
32
+ index: number;
33
+ count: number;
34
+ setIndex: (index: number) => void;
35
+ next: () => void;
36
+ prev: () => void;
37
+ };
38
+
39
+ const CAROUSEL_NAME = 'Carousel';
40
+
41
+ const [CarouselProvider, useCarouselContext] = createContext<CarouselContextValue>(CAROUSEL_NAME);
42
+
43
+ /** Returns the current carousel state. Must be used within {@link Carousel.Root}. */
44
+ export const useCarousel = (): CarouselContextValue => useCarouselContext('useCarousel');
45
+
46
+ //
47
+ // Root
48
+ //
49
+
50
+ export type CarouselRootProps = PropsWithChildren<{
51
+ /** Total number of slides; drives auto-advance and indicator counts. */
52
+ count: number;
53
+ /** Whether to auto-advance slides on mount. Defaults to `false`. */
54
+ autorun?: boolean;
55
+ /** Auto-advance interval in milliseconds. Set 0 to disable. */
56
+ intervalMs?: number;
57
+ defaultIndex?: number;
58
+ }>;
59
+
60
+ const CarouselRoot = ({
61
+ children,
62
+ count,
63
+ autorun = false,
64
+ intervalMs = 5_000,
65
+ defaultIndex = 0,
66
+ }: CarouselRootProps) => {
67
+ const [index, setIndexState] = useState(defaultIndex);
68
+ const [autoAdvance, setAutoAdvance] = useState(autorun);
69
+
70
+ // Reset to first slide if the slide count shrinks below the current index.
71
+ useEffect(() => {
72
+ if (index >= count) {
73
+ setIndexState(0);
74
+ }
75
+ }, [count, index]);
76
+
77
+ // Auto-advance — stops permanently once the user interacts with any control.
78
+ useEffect(() => {
79
+ if (!autoAdvance || count <= 1 || intervalMs <= 0) {
80
+ return;
81
+ }
82
+ const handle = setInterval(() => setIndexState((i) => (i + 1) % count), intervalMs);
83
+ return () => clearInterval(handle);
84
+ }, [autoAdvance, count, intervalMs]);
85
+
86
+ const setIndex = useCallback((next: number) => {
87
+ setAutoAdvance(false);
88
+ setIndexState(next);
89
+ }, []);
90
+ const next = useCallback(() => {
91
+ setAutoAdvance(false);
92
+ setIndexState((i) => (i + 1) % count);
93
+ }, [count]);
94
+ const prev = useCallback(() => {
95
+ setAutoAdvance(false);
96
+ setIndexState((i) => (i - 1 + count) % count);
97
+ }, [count]);
98
+
99
+ if (count === 0) {
100
+ return null;
101
+ }
102
+
103
+ return (
104
+ <CarouselProvider index={index} count={count} setIndex={setIndex} next={next} prev={prev}>
105
+ {children}
106
+ </CarouselProvider>
107
+ );
108
+ };
109
+
110
+ CarouselRoot.displayName = 'Carousel.Root';
111
+
112
+ //
113
+ // Content
114
+ //
115
+
116
+ export type CarouselContentProps = ThemedClassName<PropsWithChildren<{}>>;
117
+
118
+ // `composable` so a parent `<… asChild>` (Slot) is respected — the injected className/ref land on the grid.
119
+ const CarouselContent = composable<HTMLDivElement>(({ children, ...props }, forwardedRef) => (
120
+ // Rows are `[1fr, auto]`: row 1 (Previous|Viewport|Next) stretches when the parent
121
+ // gives the carousel a definite height, and row 2 (Indicators / Caption) sticks to
122
+ // its content height. With no parent height constraint, the `1fr` row simply tracks
123
+ // row-1 content — preserving the existing aspect-video behaviour for unbounded use.
124
+ // TODO(burdon): Move to Carousel.theme.ts
125
+ <div
126
+ {...composableProps(props, {
127
+ classNames:
128
+ 'w-full grid grid-cols-[min-content_1fr_min-content] grid-rows-[minmax(0,1fr)_auto] gap-4 items-center',
129
+ })}
130
+ ref={forwardedRef}
131
+ >
132
+ {children}
133
+ </div>
134
+ ));
135
+
136
+ CarouselContent.displayName = 'Carousel.Content';
137
+
138
+ //
139
+ // Viewport
140
+ //
141
+
142
+ export type CarouselViewportProps = ThemedClassName<PropsWithChildren<{}>>;
143
+
144
+ const CarouselViewport = ({ children, classNames }: CarouselViewportProps) => {
145
+ const { t } = useTranslation(translationKey);
146
+ const { count, next, prev } = useCarousel();
147
+ const handleKeyDown = useCallback(
148
+ (event: KeyboardEvent<HTMLDivElement>) => {
149
+ if (count <= 1) {
150
+ return;
151
+ }
152
+ if (event.key === 'ArrowLeft') {
153
+ event.preventDefault();
154
+ prev();
155
+ } else if (event.key === 'ArrowRight') {
156
+ event.preventDefault();
157
+ next();
158
+ }
159
+ },
160
+ [count, next, prev],
161
+ );
162
+
163
+ return (
164
+ <div
165
+ // TODO(burdon): Move to ui-theme.
166
+ className={mx(
167
+ 'relative w-full aspect-video overflow-hidden',
168
+ 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500',
169
+ classNames,
170
+ )}
171
+ tabIndex={0}
172
+ role='region'
173
+ aria-roledescription='carousel'
174
+ aria-label={t('carousel-viewport.label')}
175
+ onKeyDown={handleKeyDown}
176
+ >
177
+ {children}
178
+ </div>
179
+ );
180
+ };
181
+
182
+ CarouselViewport.displayName = 'Carousel.Viewport';
183
+
184
+ //
185
+ // Slide
186
+ //
187
+
188
+ export type CarouselSlideProps = ThemedClassName<{
189
+ index: number;
190
+ /** Media source URL — rendered via the embedded {@link MediaPlayer}. */
191
+ src: string;
192
+ /** Override media auto-detection (`'video' | 'audio'`). */
193
+ kind?: MediaKind;
194
+ /** Accessible label / `<img alt>` fallback. */
195
+ alt?: string;
196
+ controls?: boolean;
197
+ autoPlay?: boolean;
198
+ loop?: boolean;
199
+ muted?: boolean;
200
+ crossOrigin?: 'anonymous' | 'use-credentials' | '';
201
+ }>;
202
+
203
+ const CarouselSlide = ({
204
+ index,
205
+ classNames,
206
+ src,
207
+ kind,
208
+ alt,
209
+ controls,
210
+ autoPlay,
211
+ loop,
212
+ muted,
213
+ crossOrigin,
214
+ }: CarouselSlideProps) => {
215
+ const { index: active } = useCarousel();
216
+ if (active !== index) {
217
+ return null;
218
+ }
219
+
220
+ return (
221
+ <div className={mx('absolute inset-0 w-full h-full bg-baseSurface', classNames)}>
222
+ <MediaPlayer
223
+ src={src}
224
+ kind={kind}
225
+ alt={alt}
226
+ classNames='w-full h-full'
227
+ controls={controls}
228
+ autoPlay={autoPlay}
229
+ loop={loop}
230
+ muted={muted}
231
+ crossOrigin={crossOrigin}
232
+ />
233
+ </div>
234
+ );
235
+ };
236
+
237
+ CarouselSlide.displayName = 'Carousel.Slide';
238
+
239
+ //
240
+ // Previous / Next
241
+ //
242
+
243
+ export type CarouselButtonProps = ThemedClassName<{}>;
244
+
245
+ const CarouselPrevious = ({ classNames }: CarouselButtonProps) => {
246
+ const { t } = useTranslation(translationKey);
247
+ const { count, prev } = useCarousel();
248
+ if (count <= 1) {
249
+ return <div />;
250
+ }
251
+
252
+ return (
253
+ <IconButton
254
+ classNames={mx('self-center', classNames)}
255
+ square
256
+ variant='ghost'
257
+ icon='ph--caret-left--regular'
258
+ iconOnly
259
+ label={t('carousel-prev.label')}
260
+ onClick={prev}
261
+ />
262
+ );
263
+ };
264
+
265
+ CarouselPrevious.displayName = 'Carousel.Previous';
266
+
267
+ const CarouselNext = ({ classNames }: CarouselButtonProps) => {
268
+ const { t } = useTranslation(translationKey);
269
+ const { count, next } = useCarousel();
270
+ if (count <= 1) {
271
+ return <div />;
272
+ }
273
+
274
+ return (
275
+ <IconButton
276
+ classNames={mx('self-center', classNames)}
277
+ square
278
+ variant='ghost'
279
+ icon='ph--caret-right--regular'
280
+ iconOnly
281
+ label={t('carousel-next.label')}
282
+ onClick={next}
283
+ />
284
+ );
285
+ };
286
+
287
+ CarouselNext.displayName = 'Carousel.Next';
288
+
289
+ //
290
+ // Indicators
291
+ //
292
+
293
+ export type CarouselIndicatorsProps = ThemedClassName<{}>;
294
+
295
+ /** Tab-strip of slide indicators. Sits in the centre column so it matches the viewport's width. */
296
+ const CarouselIndicators = ({ classNames }: CarouselIndicatorsProps) => {
297
+ const { t } = useTranslation(translationKey);
298
+ const { count, index, setIndex } = useCarousel();
299
+ const arrowNavigationAttrs = useArrowNavigationGroup({ axis: 'horizontal', memorizeCurrent: true });
300
+ if (count <= 1) {
301
+ return null;
302
+ }
303
+
304
+ return (
305
+ <div className='col-start-2 overflow-hidden'>
306
+ <div
307
+ {...arrowNavigationAttrs}
308
+ className={mx('flex items-center justify-center', classNames)}
309
+ role='tablist'
310
+ aria-label={t('carousel-indicators.label')}
311
+ >
312
+ {Array.from({ length: count }).map((_, i) => (
313
+ <IconButton
314
+ key={i}
315
+ role='tab'
316
+ aria-selected={i === index}
317
+ classNames={i === index ? 'text-primary-500' : 'text-description'}
318
+ icon={i === index ? 'ph--circle--fill' : 'ph--circle--regular'}
319
+ iconOnly
320
+ label={t('carousel-go-to.label', { index: i + 1 })}
321
+ onClick={() => setIndex(i)}
322
+ onFocus={() => setIndex(i)}
323
+ size={3}
324
+ variant='ghost'
325
+ />
326
+ ))}
327
+ </div>
328
+ </div>
329
+ );
330
+ };
331
+
332
+ CarouselIndicators.displayName = 'Carousel.Indicators';
333
+
334
+ //
335
+ // Caption
336
+ //
337
+
338
+ export type CarouselCaptionProps = ThemedClassName<{
339
+ /** Render prop receiving the active slide index. */
340
+ children: (index: number) => ReactNode;
341
+ }>;
342
+
343
+ /** Caption sized to the viewport's column. */
344
+ const CarouselCaption = ({ children, classNames }: CarouselCaptionProps) => {
345
+ const { index } = useCarousel();
346
+ const content = children(index);
347
+ if (content == null || content === false || content === '') {
348
+ return null;
349
+ }
350
+ return (
351
+ // TODO(burdon): Move to ui-theme.
352
+ <div className='col-start-2'>
353
+ <p className={mx('text-center text-description', classNames)}>{content}</p>
354
+ </div>
355
+ );
356
+ };
357
+
358
+ CarouselCaption.displayName = 'Carousel.Caption';
359
+
360
+ //
361
+ // Carousel
362
+ //
363
+
364
+ export const Carousel = {
365
+ Root: CarouselRoot,
366
+ Content: CarouselContent,
367
+ Viewport: CarouselViewport,
368
+ Slide: CarouselSlide,
369
+ Previous: CarouselPrevious,
370
+ Next: CarouselNext,
371
+ Indicators: CarouselIndicators,
372
+ Caption: CarouselCaption,
373
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './Carousel';
@@ -6,9 +6,9 @@ import React from 'react';
6
6
 
7
7
  import { mx, osTranslations } from '@dxos/ui-theme';
8
8
 
9
+ import { useTranslation } from '../../primitives';
9
10
  import { Button, type ButtonProps, IconButton } from '../Button';
10
11
  import { Icon, type IconProps } from '../Icon';
11
- import { useTranslation } from '../ThemeProvider';
12
12
  import { type TooltipScopedProps, useTooltipContext } from '../Tooltip';
13
13
  import { useClipboard } from './ClipboardProvider';
14
14
 
@@ -30,11 +30,11 @@ export const CopyButton = ({ classNames, value, size = 5, ...props }: CopyButton
30
30
  onClick={() => setTextValue(value)}
31
31
  data-testid='copy-invitation'
32
32
  >
33
- <div role='none' className={mx('flex gap-1 items-center', isCopied && inactiveLabelStyles)}>
33
+ <div className={mx('flex gap-1 items-center', isCopied && inactiveLabelStyles)}>
34
34
  <span className='px-1'>{t('copy.label')}</span>
35
35
  <Icon icon='ph--copy--regular' size={size} />
36
36
  </div>
37
- <div role='none' className={mx('flex gap-1 items-center', !isCopied && inactiveLabelStyles)}>
37
+ <div className={mx('flex gap-1 items-center', !isCopied && inactiveLabelStyles)}>
38
38
  <span className='px-1'>{t('copy-success.label')}</span>
39
39
  <Icon icon='ph--check--regular' size={size} />
40
40
  </div>
@@ -71,7 +71,7 @@ const DefaultStory = () => {
71
71
  };
72
72
 
73
73
  const meta: Meta = {
74
- title: 'ui/react-ui-core/primitives/Column',
74
+ title: 'ui/react-ui-core/components/Column',
75
75
  render: DefaultStory,
76
76
  decorators: [withTheme(), withLayout({ layout: 'column', classNames: 'w-[25rem]' })],
77
77
  parameters: {
@@ -0,0 +1,76 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { mx } from '@dxos/ui-theme';
6
+ import { type ComponentFunction } from '@dxos/ui-types';
7
+
8
+ import { withColumn } from './withColumn';
9
+
10
+ export type ColumnStyleProps = {};
11
+
12
+ export type ColumnBlockStyleProps = {
13
+ /** Trailing gutter (column 3) instead of the default leading gutter (column 1). */
14
+ end?: boolean;
15
+ compact?: boolean;
16
+ /** Constrain to a square (1:1) slot rather than the default rail-item width. */
17
+ square?: boolean;
18
+ };
19
+
20
+ const root: ComponentFunction<ColumnStyleProps> = (_, ...etc) => {
21
+ return mx('dx-column-root grid', ...etc);
22
+ };
23
+
24
+ /**
25
+ * Three-column subgrid row spanning all 3 columns of the parent Column.Root grid.
26
+ * Placement is explicit, not source-order based:
27
+ * - `Column.Block` self-places into column 1 (leading) or column 3 (trailing, `end`) and
28
+ * carries the `dx-gutter` marker class.
29
+ * - Every other (content) child is placed in column 2 via `[&>*:not(.dx-gutter)]`.
30
+ * Class-based placement (rather than `[data-slot=…]`) is used because Tailwind does not
31
+ * generate arbitrary variants that nest a square-bracket attribute selector.
32
+ * Robust to conditional children: a falsy leading slot never shifts content into a gutter.
33
+ * NOTE: Must not use overflow-hidden here since it will clip input focus rings.
34
+ */
35
+ const row: ComponentFunction<ColumnStyleProps> = (_, ...etc) => {
36
+ return mx('col-span-3 grid grid-cols-subgrid', '[&>*:not(.dx-gutter)]:col-start-2', ...etc);
37
+ };
38
+
39
+ /**
40
+ * Gutter slot geometry: a `--dx-rail-item` square that centers its child, so a passive
41
+ * `<Icon>` and an interactive `IconButton` line up to the pixel. Self-places into column 1
42
+ * (default) or column 3 (`end`); the `dx-gutter` marker keeps it out of the content track.
43
+ */
44
+ const block: ComponentFunction<ColumnBlockStyleProps> = ({ end, compact, square }, ...etc) =>
45
+ mx(
46
+ 'dx-gutter grid place-items-center [&>img]:max-w-[1.5rem]',
47
+ end ? 'col-start-3' : 'col-start-1',
48
+ square ? 'aspect-square' : 'w-[var(--dx-rail-item)]',
49
+ compact ? '' : 'h-[var(--dx-rail-item)]',
50
+ ...etc,
51
+ );
52
+
53
+ /**
54
+ * Bleed placement: spans all 3 columns of the parent Column.Root grid (gutter-to-gutter).
55
+ * Use for `ScrollArea`, full-width dividers, tables, or any content that should ignore gutters.
56
+ */
57
+ const bleed: ComponentFunction<ColumnStyleProps> = (_, ...etc) => {
58
+ return mx('col-span-full grid grid-cols-subgrid min-h-0', ...etc);
59
+ };
60
+
61
+ /**
62
+ * Center placement: places the element in column 2 (the central track between gutters) of the
63
+ * parent Column.Root grid. Does NOT use subgrid — placement is explicit on this element only.
64
+ * Safe to nest arbitrary compound components (including those that render `display: contents`).
65
+ */
66
+ const center: ComponentFunction<ColumnStyleProps> = (_, ...etc) => {
67
+ return mx(withColumn.center(), 'min-h-0', ...etc);
68
+ };
69
+
70
+ export const columnTheme = {
71
+ root,
72
+ row,
73
+ block,
74
+ bleed,
75
+ center,
76
+ };
@@ -6,10 +6,10 @@ import { Primitive } from '@radix-ui/react-primitive';
6
6
  import { Slot } from '@radix-ui/react-slot';
7
7
  import React, { type CSSProperties } from 'react';
8
8
 
9
- import { composableProps, slottable } from '@dxos/ui-theme';
10
9
  import { type SlottableProps } from '@dxos/ui-types';
11
10
 
12
11
  import { useThemeContext } from '../../hooks';
12
+ import { composableProps, slottable } from '../../util';
13
13
 
14
14
  //
15
15
  // Root
@@ -57,6 +57,7 @@ const ColumnRoot = slottable<HTMLDivElement, ColumnRootProps>(
57
57
  role={role ?? 'none'}
58
58
  style={
59
59
  {
60
+ ...rest.style,
60
61
  '--gutter': gutterSize,
61
62
  '--dx-col': '2 / span 1',
62
63
  gridTemplateColumns: [gutterSize, 'minmax(0,1fr)', gutterSize].join(' '),
@@ -151,6 +152,40 @@ const ColumnCenter = slottable<HTMLDivElement>(({ children, asChild, ...props },
151
152
 
152
153
  ColumnCenter.displayName = COLUMN_CENTER_NAME;
153
154
 
155
+ //
156
+ // Block
157
+ //
158
+
159
+ const COLUMN_BLOCK_NAME = 'Column.Block';
160
+
161
+ type ColumnBlockProps = SlottableProps<{ end?: boolean; compact?: boolean; square?: boolean }>;
162
+
163
+ /**
164
+ * A gutter slot inside a Column.Row. Sized to `--dx-rail-item` and centers its child so a passive
165
+ * `<Icon>` and an interactive `IconButton` align to the pixel. `end` opts into the trailing gutter
166
+ * (column 3); default is the leading gutter (column 1). Placement is via `data-slot`, so it is
167
+ * robust to conditional rendering and source order.
168
+ */
169
+ const ColumnBlock = slottable<HTMLDivElement, ColumnBlockProps>(
170
+ ({ children, asChild, end, compact, square, ...props }, forwardedRef) => {
171
+ const { tx } = useThemeContext();
172
+ const { className, ...rest } = composableProps(props);
173
+ const Comp = asChild ? Slot : Primitive.div;
174
+ return (
175
+ <Comp
176
+ {...rest}
177
+ data-slot={end ? 'end' : 'start'}
178
+ className={tx('column.block', { end, compact, square }, className)}
179
+ ref={forwardedRef}
180
+ >
181
+ {children}
182
+ </Comp>
183
+ );
184
+ },
185
+ );
186
+
187
+ ColumnBlock.displayName = COLUMN_BLOCK_NAME;
188
+
154
189
  //
155
190
  // Column
156
191
  //
@@ -158,8 +193,9 @@ ColumnCenter.displayName = COLUMN_CENTER_NAME;
158
193
  export const Column = {
159
194
  Root: ColumnRoot,
160
195
  Row: ColumnRow,
196
+ Block: ColumnBlock,
161
197
  Bleed: ColumnBleed,
162
198
  Center: ColumnCenter,
163
199
  };
164
200
 
165
- export type { ColumnRootProps, ColumnRowProps, ColumnBleedProps, ColumnCenterProps };
201
+ export type { ColumnRootProps, ColumnRowProps, ColumnBlockProps, ColumnBleedProps, ColumnCenterProps };
@@ -3,3 +3,4 @@
3
3
  //
4
4
 
5
5
  export * from './Column';
6
+ export * from './withColumn';
@@ -0,0 +1,27 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ /**
6
+ * Column-aware theme utilities.
7
+ * Components apply these in their theme functions to participate in the Column grid
8
+ * without importing Column React components.
9
+ *
10
+ * CSS custom property cascade:
11
+ * - Column.Root sets `--dx-col: 2 / span 1` (center column placement).
12
+ * - ScrollArea.Viewport resets `--dx-col: auto` after consuming `--gutter`.
13
+ * - Components apply `grid-column: var(--dx-col, auto)` to auto-center in Column
14
+ * or do nothing outside Column / inside ScrollArea.
15
+ */
16
+ export const withColumn = {
17
+ /** Centers element in the Column grid via --dx-col. No-op outside Column or inside ScrollArea. */
18
+ center: () => '[grid-column:var(--dx-col,auto)]',
19
+
20
+ /** Propagates the Column grid to children via subgrid. No-op outside Column.
21
+ * Direct children default to center column unless they are a dx-container (ScrollArea). */
22
+ propagate: () =>
23
+ '[.dx-column-root_&]:col-span-full [.dx-column-root_&]:grid [.dx-column-root_&]:grid-cols-subgrid [.dx-column-root_&]:[&>*:not(.dx-container)]:[grid-column:var(--dx-col,auto)]',
24
+
25
+ /** Resets --dx-col after consuming --gutter. Applied by ScrollArea.Viewport. */
26
+ consumed: () => '[--dx-col:auto]',
27
+ };