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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (375) hide show
  1. package/dist/lib/browser/chunk-5SPBSIWS.mjs +33 -0
  2. package/dist/lib/browser/chunk-5SPBSIWS.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-KVJDKHLF.mjs +1613 -0
  4. package/dist/lib/browser/chunk-KVJDKHLF.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +2403 -1562
  6. package/dist/lib/browser/index.mjs.map +4 -4
  7. package/dist/lib/browser/meta.json +1 -1
  8. package/dist/lib/browser/testing/index.mjs +9 -6
  9. package/dist/lib/browser/testing/index.mjs.map +3 -3
  10. package/dist/lib/browser/translations.mjs +1 -1
  11. package/dist/lib/node-esm/chunk-5JYHWJDZ.mjs +1615 -0
  12. package/dist/lib/node-esm/chunk-5JYHWJDZ.mjs.map +7 -0
  13. package/dist/lib/node-esm/{chunk-XCFLA74M.mjs → chunk-FPVTVXND.mjs} +11 -2
  14. package/dist/lib/node-esm/chunk-FPVTVXND.mjs.map +7 -0
  15. package/dist/lib/node-esm/index.mjs +2403 -1562
  16. package/dist/lib/node-esm/index.mjs.map +4 -4
  17. package/dist/lib/node-esm/meta.json +1 -1
  18. package/dist/lib/node-esm/testing/index.mjs +9 -6
  19. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  20. package/dist/lib/node-esm/translations.mjs +1 -1
  21. package/dist/types/src/components/Avatars/Avatar.theme.d.ts +11 -0
  22. package/dist/types/src/components/Avatars/Avatar.theme.d.ts.map +1 -0
  23. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts +5 -1
  24. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  25. package/dist/types/src/components/Breadcrumb/Breadcrumb.theme.d.ts +4 -0
  26. package/dist/types/src/components/Breadcrumb/Breadcrumb.theme.d.ts.map +1 -0
  27. package/dist/types/src/components/Button/Button.d.ts +1 -1
  28. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  29. package/dist/types/src/components/Button/Button.theme.d.ts +11 -0
  30. package/dist/types/src/components/Button/Button.theme.d.ts.map +1 -0
  31. package/dist/types/src/components/Button/IconButton.stories.d.ts +1 -0
  32. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
  33. package/dist/types/src/components/Button/IconButton.theme.d.ts +8 -0
  34. package/dist/types/src/components/Button/IconButton.theme.d.ts.map +1 -0
  35. package/dist/types/src/components/Calendar/Calendar.d.ts +33 -0
  36. package/dist/types/src/components/Calendar/Calendar.d.ts.map +1 -0
  37. package/dist/types/src/components/Calendar/Calendar.stories.d.ts +9 -0
  38. package/dist/types/src/components/Calendar/Calendar.stories.d.ts.map +1 -0
  39. package/dist/types/src/components/Calendar/Calendar.theme.d.ts +4 -0
  40. package/dist/types/src/components/Calendar/Calendar.theme.d.ts.map +1 -0
  41. package/dist/types/src/components/Calendar/index.d.ts +2 -0
  42. package/dist/types/src/components/Calendar/index.d.ts.map +1 -0
  43. package/dist/types/src/components/Card/Card.d.ts +51 -44
  44. package/dist/types/src/components/Card/Card.d.ts.map +1 -1
  45. package/dist/types/src/components/Card/Card.stories.d.ts +1 -0
  46. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -1
  47. package/dist/types/src/components/Card/Card.theme.d.ts +12 -0
  48. package/dist/types/src/components/Card/Card.theme.d.ts.map +1 -0
  49. package/dist/types/src/components/Carousel/Carousel.d.ts +2 -6
  50. package/dist/types/src/components/Carousel/Carousel.d.ts.map +1 -1
  51. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  52. package/dist/types/src/components/Clipboard/index.d.ts +1 -1
  53. package/dist/types/src/{primitives → components}/Column/Column.d.ts.map +1 -1
  54. package/dist/types/src/{primitives → components}/Column/Column.stories.d.ts.map +1 -1
  55. package/dist/types/src/components/Column/Column.theme.d.ts +9 -0
  56. package/dist/types/src/components/Column/Column.theme.d.ts.map +1 -0
  57. package/dist/types/src/components/Column/index.d.ts +3 -0
  58. package/dist/types/src/components/Column/index.d.ts.map +1 -0
  59. package/dist/types/src/components/Column/withColumn.d.ts +21 -0
  60. package/dist/types/src/components/Column/withColumn.d.ts.map +1 -0
  61. package/dist/types/src/components/DatePicker/DatePicker.d.ts +72 -0
  62. package/dist/types/src/components/DatePicker/DatePicker.d.ts.map +1 -0
  63. package/dist/types/src/components/DatePicker/DatePicker.stories.d.ts +10 -0
  64. package/dist/types/src/components/DatePicker/DatePicker.stories.d.ts.map +1 -0
  65. package/dist/types/src/components/DatePicker/DatePicker.theme.d.ts +6 -0
  66. package/dist/types/src/components/DatePicker/DatePicker.theme.d.ts.map +1 -0
  67. package/dist/types/src/components/DatePicker/index.d.ts +2 -0
  68. package/dist/types/src/components/DatePicker/index.d.ts.map +1 -0
  69. package/dist/types/src/components/Dialog/AlertDialog.d.ts +8 -8
  70. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  71. package/dist/types/src/components/Dialog/Dialog.d.ts +9 -7
  72. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  73. package/dist/types/src/components/Dialog/Dialog.theme.d.ts +10 -0
  74. package/dist/types/src/components/Dialog/Dialog.theme.d.ts.map +1 -0
  75. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -1
  76. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -1
  77. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -1
  78. package/dist/types/src/components/Focus/Focus.theme.d.ts +6 -0
  79. package/dist/types/src/components/Focus/Focus.theme.d.ts.map +1 -0
  80. package/dist/types/src/components/Icon/Icon.theme.d.ts +11 -0
  81. package/dist/types/src/components/Icon/Icon.theme.d.ts.map +1 -0
  82. package/dist/types/src/components/Icon/IconBlock.d.ts +15 -0
  83. package/dist/types/src/components/Icon/IconBlock.d.ts.map +1 -0
  84. package/dist/types/src/components/Icon/index.d.ts +1 -0
  85. package/dist/types/src/components/Icon/index.d.ts.map +1 -1
  86. package/dist/types/src/components/Input/Input.d.ts +81 -3
  87. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  88. package/dist/types/src/components/Input/Input.stories.d.ts +14 -3
  89. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  90. package/dist/types/src/components/Input/Input.theme.d.ts +115 -0
  91. package/dist/types/src/components/Input/Input.theme.d.ts.map +1 -0
  92. package/dist/types/src/components/Input/SegmentedInput.d.ts +79 -0
  93. package/dist/types/src/components/Input/SegmentedInput.d.ts.map +1 -0
  94. package/dist/types/src/components/Input/constants.d.ts +2 -0
  95. package/dist/types/src/components/Input/constants.d.ts.map +1 -0
  96. package/dist/types/src/components/Input/index.d.ts +2 -0
  97. package/dist/types/src/components/Input/index.d.ts.map +1 -1
  98. package/dist/types/src/components/Link/Link.theme.d.ts +6 -0
  99. package/dist/types/src/components/Link/Link.theme.d.ts.map +1 -0
  100. package/dist/types/src/components/List/List.d.ts.map +1 -1
  101. package/dist/types/src/components/List/List.theme.d.ts +7 -0
  102. package/dist/types/src/components/List/List.theme.d.ts.map +1 -0
  103. package/dist/types/src/components/List/Treegrid.d.ts +1 -1
  104. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  105. package/dist/types/src/components/List/Treegrid.theme.d.ts +7 -0
  106. package/dist/types/src/components/List/Treegrid.theme.d.ts.map +1 -0
  107. package/dist/types/src/components/Main/Main.d.ts +2 -2
  108. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  109. package/dist/types/src/components/Main/Main.theme.d.ts +20 -0
  110. package/dist/types/src/components/Main/Main.theme.d.ts.map +1 -0
  111. package/dist/types/src/components/Main/constants.d.ts +3 -0
  112. package/dist/types/src/components/Main/constants.d.ts.map +1 -0
  113. package/dist/types/src/components/Main/index.d.ts +1 -0
  114. package/dist/types/src/components/Main/index.d.ts.map +1 -1
  115. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +9 -12
  116. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -1
  117. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts +1 -1
  118. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -1
  119. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
  120. package/dist/types/src/components/Menu/Menu.theme.d.ts +7 -0
  121. package/dist/types/src/components/Menu/Menu.theme.d.ts.map +1 -0
  122. package/dist/types/src/components/Message/Message.d.ts +2 -2
  123. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  124. package/dist/types/src/components/Message/Message.stories.d.ts +5 -1
  125. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  126. package/dist/types/src/components/Message/Message.theme.d.ts +7 -0
  127. package/dist/types/src/components/Message/Message.theme.d.ts.map +1 -0
  128. package/dist/types/src/{primitives → components}/Panel/Panel.d.ts +1 -1
  129. package/dist/types/src/components/Panel/Panel.d.ts.map +1 -0
  130. package/dist/types/src/{primitives → components}/Panel/Panel.stories.d.ts.map +1 -1
  131. package/dist/types/src/components/Panel/Panel.theme.d.ts +13 -0
  132. package/dist/types/src/components/Panel/Panel.theme.d.ts.map +1 -0
  133. package/dist/types/src/components/Panel/index.d.ts.map +1 -0
  134. package/dist/types/src/components/Popover/Popover.theme.d.ts +8 -0
  135. package/dist/types/src/components/Popover/Popover.theme.d.ts.map +1 -0
  136. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  137. package/dist/types/src/components/ScrollArea/ScrollArea.theme.d.ts +17 -0
  138. package/dist/types/src/components/ScrollArea/ScrollArea.theme.d.ts.map +1 -0
  139. package/dist/types/src/components/ScrollArea/index.d.ts +1 -0
  140. package/dist/types/src/components/ScrollArea/index.d.ts.map +1 -1
  141. package/dist/types/src/components/ScrollArea/scrollbar.d.ts +18 -0
  142. package/dist/types/src/components/ScrollArea/scrollbar.d.ts.map +1 -0
  143. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +13 -19
  144. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  145. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  146. package/dist/types/src/components/Select/Select.theme.d.ts +6 -0
  147. package/dist/types/src/components/Select/Select.theme.d.ts.map +1 -0
  148. package/dist/types/src/components/Separator/Separator.theme.d.ts +7 -0
  149. package/dist/types/src/components/Separator/Separator.theme.d.ts.map +1 -0
  150. package/dist/types/src/components/Skeleton/Skeleton.theme.d.ts +6 -0
  151. package/dist/types/src/components/Skeleton/Skeleton.theme.d.ts.map +1 -0
  152. package/dist/types/src/components/Splitter/Splitter.d.ts +3 -5
  153. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -1
  154. package/dist/types/src/components/Splitter/Splitter.theme.d.ts +4 -0
  155. package/dist/types/src/components/Splitter/Splitter.theme.d.ts.map +1 -0
  156. package/dist/types/src/components/Status/Status.d.ts +1 -1
  157. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  158. package/dist/types/src/components/Status/Status.theme.d.ts +7 -0
  159. package/dist/types/src/components/Status/Status.theme.d.ts.map +1 -0
  160. package/dist/types/src/components/Tag/Tag.theme.d.ts +6 -0
  161. package/dist/types/src/components/Tag/Tag.theme.d.ts.map +1 -0
  162. package/dist/types/src/components/Toast/Toast.d.ts +13 -10
  163. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  164. package/dist/types/src/components/Toast/Toast.stories.d.ts +5 -2
  165. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  166. package/dist/types/src/components/Toast/Toast.theme.d.ts +4 -0
  167. package/dist/types/src/components/Toast/Toast.theme.d.ts.map +1 -0
  168. package/dist/types/src/components/Toolbar/Toolbar.d.ts +19 -7
  169. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  170. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts +8 -0
  171. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts.map +1 -0
  172. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  173. package/dist/types/src/components/Tooltip/Tooltip.theme.d.ts +6 -0
  174. package/dist/types/src/components/Tooltip/Tooltip.theme.d.ts.map +1 -0
  175. package/dist/types/src/components/Tooltip/index.d.ts +1 -0
  176. package/dist/types/src/components/Tooltip/index.d.ts.map +1 -1
  177. package/dist/types/src/components/Tooltip/tooltipContent.d.ts +4 -0
  178. package/dist/types/src/components/Tooltip/tooltipContent.d.ts.map +1 -0
  179. package/dist/types/src/components/index.d.ts +5 -4
  180. package/dist/types/src/components/index.d.ts.map +1 -1
  181. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -1
  182. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -1
  183. package/dist/types/src/hooks/useTranslationsContext.d.ts +1 -1
  184. package/dist/types/src/index.d.ts +1 -0
  185. package/dist/types/src/index.d.ts.map +1 -1
  186. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  187. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -1
  188. package/dist/types/src/{components → primitives}/DensityProvider/DensityProvider.d.ts.map +1 -1
  189. package/dist/types/src/primitives/DensityProvider/index.d.ts.map +1 -0
  190. package/dist/types/src/{components → primitives}/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  191. package/dist/types/src/primitives/ElevationProvider/index.d.ts.map +1 -0
  192. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -1
  193. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -1
  194. package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  195. package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -1
  196. package/dist/types/src/{components → primitives}/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  197. package/dist/types/src/{components → primitives}/ThemeProvider/index.d.ts +1 -1
  198. package/dist/types/src/primitives/ThemeProvider/index.d.ts.map +1 -0
  199. package/dist/types/src/primitives/index.d.ts +3 -2
  200. package/dist/types/src/primitives/index.d.ts.map +1 -1
  201. package/dist/types/src/testing/decorators/withTheme.d.ts +5 -1
  202. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  203. package/dist/types/src/theme/bindTheme.d.ts +3 -0
  204. package/dist/types/src/theme/bindTheme.d.ts.map +1 -0
  205. package/dist/types/src/theme/defaultTheme.d.ts +4 -0
  206. package/dist/types/src/theme/defaultTheme.d.ts.map +1 -0
  207. package/dist/types/src/theme/index.d.ts +31 -0
  208. package/dist/types/src/theme/index.d.ts.map +1 -0
  209. package/dist/types/src/translations.d.ts +9 -0
  210. package/dist/types/src/translations.d.ts.map +1 -1
  211. package/dist/types/src/util/index.d.ts +2 -1
  212. package/dist/types/src/util/index.d.ts.map +1 -1
  213. package/dist/types/src/util/mobile.d.ts +5 -0
  214. package/dist/types/src/util/mobile.d.ts.map +1 -0
  215. package/dist/types/src/util/slots.d.ts +57 -0
  216. package/dist/types/src/util/slots.d.ts.map +1 -0
  217. package/dist/types/src/util/usePx.d.ts.map +1 -1
  218. package/dist/types/tsconfig.tsbuildinfo +1 -1
  219. package/package.json +19 -17
  220. package/src/components/Avatars/Avatar.theme.ts +93 -0
  221. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -1
  222. package/src/components/Breadcrumb/Breadcrumb.theme.ts +26 -0
  223. package/src/components/Breadcrumb/Breadcrumb.tsx +14 -2
  224. package/src/components/Button/Button.theme.ts +31 -0
  225. package/src/components/Button/Button.tsx +1 -1
  226. package/src/components/Button/IconButton.stories.tsx +50 -2
  227. package/src/components/Button/IconButton.theme.ts +21 -0
  228. package/src/components/Calendar/Calendar.stories.tsx +43 -0
  229. package/src/components/Calendar/Calendar.theme.ts +74 -0
  230. package/src/components/Calendar/Calendar.tsx +196 -0
  231. package/src/components/Calendar/index.ts +5 -0
  232. package/src/components/Card/Card.stories.tsx +40 -19
  233. package/src/components/Card/Card.theme.ts +93 -0
  234. package/src/components/Card/Card.tsx +121 -147
  235. package/src/components/Carousel/Carousel.tsx +2 -10
  236. package/src/components/Clipboard/CopyButton.tsx +1 -1
  237. package/src/{primitives → components}/Column/Column.stories.tsx +1 -1
  238. package/src/components/Column/Column.theme.ts +48 -0
  239. package/src/{primitives → components}/Column/Column.tsx +2 -1
  240. package/src/{primitives → components}/Column/index.ts +1 -0
  241. package/src/components/Column/withColumn.ts +27 -0
  242. package/src/components/DatePicker/DatePicker.stories.tsx +102 -0
  243. package/src/components/DatePicker/DatePicker.theme.ts +35 -0
  244. package/src/components/DatePicker/DatePicker.tsx +279 -0
  245. package/src/components/DatePicker/index.ts +5 -0
  246. package/src/components/Dialog/AlertDialog.tsx +12 -13
  247. package/src/components/Dialog/Dialog.stories.tsx +2 -2
  248. package/src/components/Dialog/Dialog.theme.ts +61 -0
  249. package/src/components/Dialog/Dialog.tsx +46 -17
  250. package/src/components/ErrorFallback/ErrorFallback.tsx +14 -8
  251. package/src/components/ErrorFallback/ErrorStack.tsx +12 -6
  252. package/src/components/Focus/Focus.theme.ts +32 -0
  253. package/src/components/Focus/Focus.tsx +1 -1
  254. package/src/components/Icon/Icon.theme.ts +45 -0
  255. package/src/components/Icon/IconBlock.tsx +38 -0
  256. package/src/components/Icon/index.ts +1 -0
  257. package/src/components/Image/Image.stories.tsx +1 -1
  258. package/src/components/Input/Input.stories.tsx +132 -29
  259. package/src/components/Input/Input.theme.ts +191 -0
  260. package/src/components/Input/Input.tsx +207 -2
  261. package/src/components/Input/SegmentedInput.tsx +454 -0
  262. package/src/components/Input/constants.ts +5 -0
  263. package/src/components/Input/index.ts +2 -0
  264. package/src/components/Link/Link.theme.ts +16 -0
  265. package/src/components/List/List.theme.ts +47 -0
  266. package/src/components/List/List.tsx +2 -2
  267. package/src/components/List/ListDropIndicator.tsx +1 -1
  268. package/src/components/List/TreeDropIndicator.tsx +3 -3
  269. package/src/components/List/Treegrid.theme.ts +35 -0
  270. package/src/components/List/Treegrid.tsx +3 -4
  271. package/src/components/Main/Main.theme.ts +29 -0
  272. package/src/components/Main/Main.tsx +9 -7
  273. package/src/components/Main/constants.ts +6 -0
  274. package/src/components/Main/index.ts +1 -0
  275. package/src/components/MediaPlayer/MediaPlayer.tsx +61 -36
  276. package/src/components/Menu/ContextMenu.stories.tsx +0 -3
  277. package/src/components/Menu/DropdownMenu.stories.tsx +0 -3
  278. package/src/components/Menu/DropdownMenu.tsx +15 -15
  279. package/src/components/Menu/Menu.theme.ts +48 -0
  280. package/src/components/Message/Message.stories.tsx +42 -4
  281. package/src/components/Message/Message.theme.ts +44 -0
  282. package/src/components/Message/Message.tsx +63 -20
  283. package/src/{primitives → components}/Panel/Panel.stories.tsx +2 -3
  284. package/src/components/Panel/Panel.theme.ts +42 -0
  285. package/src/{primitives → components}/Panel/Panel.tsx +2 -1
  286. package/src/components/Popover/Popover.theme.ts +40 -0
  287. package/src/components/Popover/Popover.tsx +7 -7
  288. package/src/components/ScrollArea/ScrollArea.stories.tsx +1 -1
  289. package/src/components/ScrollArea/ScrollArea.theme.ts +107 -0
  290. package/src/components/ScrollArea/ScrollArea.tsx +3 -2
  291. package/src/components/ScrollArea/index.ts +1 -0
  292. package/src/components/ScrollArea/scrollbar.ts +21 -0
  293. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +1 -1
  294. package/src/components/ScrollContainer/ScrollContainer.tsx +57 -55
  295. package/src/components/Select/Select.theme.ts +55 -0
  296. package/src/components/Select/Select.tsx +26 -10
  297. package/src/components/Separator/Separator.theme.ts +23 -0
  298. package/src/components/Skeleton/Skeleton.theme.ts +22 -0
  299. package/src/components/Splitter/Splitter.stories.tsx +1 -1
  300. package/src/components/Splitter/Splitter.theme.ts +18 -0
  301. package/src/components/Splitter/Splitter.tsx +10 -15
  302. package/src/components/Status/Status.theme.ts +31 -0
  303. package/src/components/Status/Status.tsx +1 -2
  304. package/src/components/Tag/Tag.theme.ts +22 -0
  305. package/src/components/Toast/Toast.stories.tsx +41 -20
  306. package/src/components/Toast/Toast.theme.ts +56 -0
  307. package/src/components/Toast/Toast.tsx +95 -27
  308. package/src/components/Toolbar/Toolbar.theme.ts +36 -0
  309. package/src/components/Toolbar/Toolbar.tsx +63 -13
  310. package/src/components/Tooltip/Tooltip.stories.tsx +0 -9
  311. package/src/components/Tooltip/Tooltip.theme.ts +19 -0
  312. package/src/components/Tooltip/Tooltip.tsx +4 -4
  313. package/src/components/Tooltip/index.ts +1 -0
  314. package/src/components/Tooltip/tooltipContent.ts +16 -0
  315. package/src/components/index.ts +5 -5
  316. package/src/exemplars/generics.stories.tsx +1 -2
  317. package/src/exemplars/slot.stories.tsx +2 -1
  318. package/src/hooks/useDensityContext.ts +1 -1
  319. package/src/hooks/useElevationContext.ts +1 -1
  320. package/src/hooks/useThemeContext.ts +1 -1
  321. package/src/hooks/useTranslationsContext.ts +1 -1
  322. package/src/index.ts +1 -0
  323. package/src/playground/Custom.stories.tsx +12 -32
  324. package/src/primitives/Container/Container.tsx +3 -1
  325. package/src/{components → primitives}/DensityProvider/DensityProvider.tsx +1 -1
  326. package/src/primitives/Flex/Flex.tsx +3 -1
  327. package/src/primitives/Grid/Grid.tsx +3 -1
  328. package/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.tsx +1 -1
  329. package/src/{components → primitives}/ThemeProvider/ThemeProvider.tsx +1 -1
  330. package/src/{components → primitives}/ThemeProvider/index.ts +1 -1
  331. package/src/primitives/index.ts +4 -2
  332. package/src/testing/decorators/withLayoutVariants.tsx +1 -1
  333. package/src/testing/decorators/withTheme.tsx +21 -13
  334. package/src/theme/bindTheme.ts +13 -0
  335. package/src/theme/defaultTheme.ts +83 -0
  336. package/src/theme/index.ts +37 -0
  337. package/src/translations.ts +9 -0
  338. package/src/util/index.ts +2 -1
  339. package/src/util/mobile.ts +11 -0
  340. package/src/util/slots.ts +129 -0
  341. package/src/util/usePx.ts +4 -1
  342. package/dist/lib/browser/chunk-A5QCIG5R.mjs +0 -24
  343. package/dist/lib/browser/chunk-A5QCIG5R.mjs.map +0 -7
  344. package/dist/lib/browser/chunk-LY5XDQR5.mjs +0 -846
  345. package/dist/lib/browser/chunk-LY5XDQR5.mjs.map +0 -7
  346. package/dist/lib/node-esm/chunk-NGKLIKP3.mjs +0 -848
  347. package/dist/lib/node-esm/chunk-NGKLIKP3.mjs.map +0 -7
  348. package/dist/lib/node-esm/chunk-XCFLA74M.mjs.map +0 -7
  349. package/dist/types/src/components/DensityProvider/index.d.ts.map +0 -1
  350. package/dist/types/src/components/ElevationProvider/index.d.ts.map +0 -1
  351. package/dist/types/src/components/ThemeProvider/index.d.ts.map +0 -1
  352. package/dist/types/src/primitives/Column/index.d.ts +0 -2
  353. package/dist/types/src/primitives/Column/index.d.ts.map +0 -1
  354. package/dist/types/src/primitives/Panel/Panel.d.ts.map +0 -1
  355. package/dist/types/src/primitives/Panel/index.d.ts.map +0 -1
  356. package/dist/types/src/util/hasIosKeyboard.d.ts +0 -2
  357. package/dist/types/src/util/hasIosKeyboard.d.ts.map +0 -1
  358. package/src/util/hasIosKeyboard.ts +0 -8
  359. /package/dist/types/src/{primitives → components}/Column/Column.d.ts +0 -0
  360. /package/dist/types/src/{primitives → components}/Column/Column.stories.d.ts +0 -0
  361. /package/dist/types/src/{primitives → components}/Panel/Panel.stories.d.ts +0 -0
  362. /package/dist/types/src/{primitives → components}/Panel/index.d.ts +0 -0
  363. /package/dist/types/src/{components → primitives}/DensityProvider/DensityProvider.d.ts +0 -0
  364. /package/dist/types/src/{components → primitives}/DensityProvider/index.d.ts +0 -0
  365. /package/dist/types/src/{components → primitives}/ElevationProvider/ElevationProvider.d.ts +0 -0
  366. /package/dist/types/src/{components → primitives}/ElevationProvider/index.d.ts +0 -0
  367. /package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.d.ts +0 -0
  368. /package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.d.ts +0 -0
  369. /package/dist/types/src/{components → primitives}/ThemeProvider/TranslationsProvider.d.ts +0 -0
  370. /package/src/{primitives → components}/Column/AUDIT.md +0 -0
  371. /package/src/{primitives → components}/Panel/index.ts +0 -0
  372. /package/src/{components → primitives}/DensityProvider/index.ts +0 -0
  373. /package/src/{components → primitives}/ElevationProvider/ElevationProvider.tsx +0 -0
  374. /package/src/{components → primitives}/ElevationProvider/index.ts +0 -0
  375. /package/src/{components → primitives}/ThemeProvider/TranslationsProvider.tsx +0 -0
@@ -5,7 +5,7 @@
5
5
  import { createContext } from '@radix-ui/react-context';
6
6
  import { Primitive } from '@radix-ui/react-primitive';
7
7
  import { Slot } from '@radix-ui/react-slot';
8
- import React, { type ComponentPropsWithRef, forwardRef } from 'react';
8
+ import React, { type CSSProperties, type ComponentPropsWithRef, forwardRef } from 'react';
9
9
  import { useTranslation } from 'react-i18next';
10
10
 
11
11
  import { useId } from '@dxos/react-hooks';
@@ -16,6 +16,7 @@ import { translationKey } from '#translations';
16
16
  import { useElevationContext, useThemeContext } from '../../hooks';
17
17
  import { type ThemedClassName } from '../../util';
18
18
  import { IconButton } from '../Button';
19
+ import { Column } from '../Column';
19
20
  import { Icon } from '../Icon';
20
21
 
21
22
  const messageIcons: Record<MessageValence, string> = {
@@ -38,6 +39,42 @@ type MessageContextValue = { titleId?: string; descriptionId: string; valence: M
38
39
 
39
40
  const MESSAGE_NAME = 'Message';
40
41
 
42
+ // CSS custom properties for valence color inheritance — consumed by Button variant='valence'.
43
+ // Extending CSSProperties so entries satisfy the style prop type without a cast at the use site.
44
+ type ValenceCSSVars = CSSProperties & {
45
+ '--dx-valence-bg': string;
46
+ '--dx-valence-bg-hover': string;
47
+ '--dx-valence-text': string;
48
+ };
49
+
50
+ const valenceVars: Record<MessageValence, ValenceCSSVars> = {
51
+ success: {
52
+ '--dx-valence-bg': 'var(--color-success-bg)',
53
+ '--dx-valence-bg-hover': 'var(--color-success-bg-hover)',
54
+ '--dx-valence-text': 'var(--color-success-text)',
55
+ },
56
+ info: {
57
+ '--dx-valence-bg': 'var(--color-info-bg)',
58
+ '--dx-valence-bg-hover': 'var(--color-info-bg-hover)',
59
+ '--dx-valence-text': 'var(--color-info-text)',
60
+ },
61
+ warning: {
62
+ '--dx-valence-bg': 'var(--color-warning-bg)',
63
+ '--dx-valence-bg-hover': 'var(--color-warning-bg-hover)',
64
+ '--dx-valence-text': 'var(--color-warning-text)',
65
+ },
66
+ error: {
67
+ '--dx-valence-bg': 'var(--color-error-bg)',
68
+ '--dx-valence-bg-hover': 'var(--color-error-bg-hover)',
69
+ '--dx-valence-text': 'var(--color-error-text)',
70
+ },
71
+ neutral: {
72
+ '--dx-valence-bg': 'var(--color-neutral-bg)',
73
+ '--dx-valence-bg-hover': 'var(--color-neutral-bg-hover)',
74
+ '--dx-valence-text': 'var(--color-neutral-text)',
75
+ },
76
+ };
77
+
41
78
  const [MessageProvider, useMessageContext] = createContext<MessageContextValue>(MESSAGE_NAME);
42
79
 
43
80
  //
@@ -62,20 +99,21 @@ const MessageRoot = forwardRef<HTMLDivElement, MessageRootProps>(
62
99
  const titleId = useId('message__title', propsTitleId);
63
100
  const descriptionId = useId('message__description', propsDescriptionId);
64
101
  const elevation = useElevationContext(propsElevation);
65
- const Comp = asChild ? Slot : Primitive.div;
66
102
 
67
103
  return (
68
104
  <MessageProvider {...{ titleId, descriptionId, valence }}>
69
- <Comp
105
+ <Column.Root
106
+ asChild={asChild}
70
107
  role={valence === 'neutral' ? 'paragraph' : 'alert'}
71
- {...props}
72
- className={tx('message.root', { valence, elevation }, classNames)}
73
108
  aria-labelledby={titleId}
74
109
  aria-describedby={descriptionId}
110
+ {...props}
111
+ style={{ ...valenceVars[valence], ...(props.style || {}) }}
112
+ classNames={tx('message.root', { valence, elevation }, classNames)}
75
113
  ref={forwardedRef}
76
114
  >
77
115
  {children}
78
- </Comp>
116
+ </Column.Root>
79
117
  </MessageProvider>
80
118
  );
81
119
  },
@@ -92,32 +130,37 @@ type MessageTitleProps = Omit<ThemedClassName<ComponentPropsWithRef<typeof Primi
92
130
  onClose?: () => void;
93
131
  };
94
132
 
95
- const MESSAGE_TITLE_NAME = 'MessageTitle';
133
+ const MESSAGE_TITLE_NAME = 'Message.Title';
96
134
 
97
- const MessageTitle = forwardRef<HTMLHeadingElement, MessageTitleProps>(
135
+ const MessageTitle = forwardRef<HTMLDivElement, MessageTitleProps>(
98
136
  ({ classNames, children, icon: iconProp, onClose }, forwardedRef) => {
99
137
  const { t } = useTranslation(translationKey);
100
138
  const { tx } = useThemeContext();
101
139
  const { titleId, valence } = useMessageContext(MESSAGE_TITLE_NAME);
102
140
  const icon = iconProp ?? messageIcons[valence];
103
141
  return (
104
- <div className={tx('message.header', {}, classNames)} id={titleId} ref={forwardedRef}>
142
+ <Column.Row classNames={tx('message.header', {}, classNames)} ref={forwardedRef}>
105
143
  {icon && (
106
144
  <div className={tx('message.icon', { valence })}>
107
- <Icon icon={icon} />
145
+ <Icon icon={icon} size={5} />
108
146
  </div>
109
147
  )}
110
- <h2 className={tx('message.title', {}, classNames)}>{children}</h2>
148
+ <h2 className={tx('message.title', {}, classNames)} id={titleId}>
149
+ {children}
150
+ </h2>
111
151
  {onClose && (
112
- <IconButton
113
- variant='ghost'
114
- icon='ph--x--regular'
115
- iconOnly
116
- label={t('toolbar-close.label')}
117
- onClick={onClose}
118
- />
152
+ <div className={tx('message.close', {})}>
153
+ <IconButton
154
+ variant='ghost'
155
+ icon='ph--x--regular'
156
+ iconOnly
157
+ density='sm'
158
+ label={t('toolbar-close.label')}
159
+ onClick={onClose}
160
+ />
161
+ </div>
119
162
  )}
120
- </div>
163
+ </Column.Row>
121
164
  );
122
165
  },
123
166
  );
@@ -132,7 +175,7 @@ type MessageContentProps = Omit<ThemedClassName<ComponentPropsWithRef<typeof Pri
132
175
  asChild?: boolean;
133
176
  };
134
177
 
135
- const MESSAGE_CONTENT_NAME = 'MessageContent';
178
+ const MESSAGE_CONTENT_NAME = 'Message.Content';
136
179
 
137
180
  const MessageContent = forwardRef<HTMLParagraphElement, MessageContentProps>(
138
181
  ({ asChild, classNames, children, ...props }, forwardedRef) => {
@@ -5,10 +5,9 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React from 'react';
7
7
 
8
- import { composable, composableProps } from '@dxos/ui-theme';
9
-
10
8
  import { Input, ScrollArea, ScrollAreaRootProps, Toolbar } from '../../components';
11
9
  import { withLayout, withTheme } from '../../testing';
10
+ import { composable, composableProps } from '../../util';
12
11
  import { Panel } from './Panel';
13
12
 
14
13
  const List = composable<HTMLDivElement, ScrollAreaRootProps>((props, forwardedRef) => {
@@ -53,7 +52,7 @@ const DefaultStory = () => {
53
52
  };
54
53
 
55
54
  const meta: Meta = {
56
- title: 'ui/react-ui-core/primitives/Panel',
55
+ title: 'ui/react-ui-core/components/Panel',
57
56
  render: DefaultStory,
58
57
  decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
59
58
  parameters: {
@@ -0,0 +1,42 @@
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
+ type Size = 'lg' | 'md' | 'sm';
9
+
10
+ export type PanelStyleProps = {
11
+ size?: Size;
12
+ };
13
+
14
+ const sizes: Record<Size, string> = {
15
+ lg: 'h-(--dx-topbar-size)',
16
+ md: 'h-(--dx-toolbar-size)',
17
+ sm: 'h-(--dx-statusbar-size)',
18
+ };
19
+
20
+ const root: ComponentFunction<PanelStyleProps> = (_, ...etc) =>
21
+ mx(
22
+ // prettier-ignore
23
+ 'dx-container grid grid-cols-[100%] overflow-hidden',
24
+ // Add uncategorized children to content slot.
25
+ '[&>*:not([data-slot])]:[grid-area:content]',
26
+ ...etc,
27
+ );
28
+
29
+ const toolbar: ComponentFunction<PanelStyleProps> = ({ size = 'md' }, ...etc) =>
30
+ mx('[grid-area:toolbar]', 'shrink-0', sizes[size], ...etc);
31
+
32
+ const content: ComponentFunction<PanelStyleProps> = (_, ...etc) => mx('[grid-area:content] min-h-0', ...etc);
33
+
34
+ const statusbar: ComponentFunction<PanelStyleProps> = ({ size = 'md' }, ...etc) =>
35
+ mx('[grid-area:statusbar]', 'shrink-0', sizes[size], ...etc);
36
+
37
+ export const panelTheme = {
38
+ root,
39
+ toolbar,
40
+ content,
41
+ statusbar,
42
+ };
@@ -6,10 +6,11 @@ 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, PanelStyleProps, slottable } from '@dxos/ui-theme';
10
9
  import { type SlottableProps } from '@dxos/ui-types';
11
10
 
12
11
  import { useThemeContext } from '../../hooks';
12
+ import { PanelStyleProps } from '../../theme';
13
+ import { composableProps, slottable } from '../../util';
13
14
 
14
15
  //
15
16
  // Root
@@ -0,0 +1,40 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { mx, surfaceShadow, surfaceZIndex } from '@dxos/ui-theme';
6
+ import { type ComponentFunction, type Elevation, type Theme } from '@dxos/ui-types';
7
+
8
+ export type PopoverStyleProps = Partial<{
9
+ constrainBlock: boolean;
10
+ constrainInline: boolean;
11
+ elevation: Elevation;
12
+ }>;
13
+
14
+ const content: ComponentFunction<PopoverStyleProps> = ({ elevation }, ...etc) =>
15
+ mx(
16
+ 'dx-popover-surface border border-separator rounded-sm',
17
+ surfaceShadow({ elevation: 'positioned' }),
18
+ surfaceZIndex({ elevation, level: 'menu' }),
19
+ 'dx-focus-ring',
20
+ ...etc,
21
+ );
22
+
23
+ const viewport: ComponentFunction<PopoverStyleProps> = ({ constrainBlock, constrainInline }, ...etc) =>
24
+ mx(
25
+ 'grid grid-rows-[1fr] min-h-0 min-w-popover-min-width',
26
+ (constrainBlock || constrainInline) && 'overflow-hidden',
27
+ constrainBlock && 'max-h-(--radix-popover-content-available-height)',
28
+ constrainBlock &&
29
+ 'max-h-[min(var(--radix-popover-content-available-height),calc(100dvh-var(--spacing-screen-border)*2))]',
30
+ constrainInline && 'max-w-(--radix-popover-content-available-width)',
31
+ ...etc,
32
+ );
33
+
34
+ const arrow: ComponentFunction<PopoverStyleProps> = (_props, ...etc) => mx('fill-separator', ...etc);
35
+
36
+ export const popoverTheme: Theme<PopoverStyleProps> = {
37
+ content,
38
+ viewport,
39
+ arrow,
40
+ };
@@ -114,7 +114,7 @@ PopoverRoot.displayName = POPOVER_NAME;
114
114
  // PopoverAnchor
115
115
  //
116
116
 
117
- const ANCHOR_NAME = 'PopoverAnchor';
117
+ const ANCHOR_NAME = 'Popover.Anchor';
118
118
 
119
119
  type PopoverAnchorElement = ComponentRef<typeof PopperPrimitive.Anchor>;
120
120
  type PopperAnchorProps = ComponentPropsWithoutRef<typeof PopperPrimitive.Anchor>;
@@ -142,7 +142,7 @@ PopoverAnchor.displayName = ANCHOR_NAME;
142
142
  // PopoverTrigger
143
143
  //
144
144
 
145
- const TRIGGER_NAME = 'PopoverTrigger';
145
+ const TRIGGER_NAME = 'Popover.Trigger';
146
146
 
147
147
  type PopoverTriggerElement = ComponentRef<typeof Primitive.button>;
148
148
  type PrimitiveButtonProps = ComponentPropsWithoutRef<typeof Primitive.button>;
@@ -187,7 +187,7 @@ PopoverTrigger.displayName = TRIGGER_NAME;
187
187
  // PopoverVirtualTrigger
188
188
  //
189
189
 
190
- const VIRTUAL_TRIGGER_NAME = 'PopoverVirtualTrigger';
190
+ const VIRTUAL_TRIGGER_NAME = 'Popover.VirtualTrigger';
191
191
 
192
192
  type PopoverVirtualTriggerProps = {
193
193
  virtualRef: RefObject<PopoverTriggerElement | null>;
@@ -211,7 +211,7 @@ PopoverVirtualTrigger.displayName = VIRTUAL_TRIGGER_NAME;
211
211
  // PopoverPortal
212
212
  //
213
213
 
214
- const PORTAL_NAME = 'PopoverPortal';
214
+ const PORTAL_NAME = 'Popover.Portal';
215
215
 
216
216
  type PortalContextValue = { forceMount?: true };
217
217
  const [PortalProvider, usePortalContext] = createPopoverContext<PortalContextValue>(PORTAL_NAME, {
@@ -252,7 +252,7 @@ PopoverPortal.displayName = PORTAL_NAME;
252
252
  // PopoverContent
253
253
  //
254
254
 
255
- const CONTENT_NAME = 'PopoverContent';
255
+ const CONTENT_NAME = 'Popover.Content';
256
256
 
257
257
  type PopoverContentProps = ThemedClassName<PopoverContentTypeProps> & {
258
258
  /**
@@ -512,7 +512,7 @@ const PopoverContentImpl = forwardRef<PopoverContentImplElement, PopoverContentI
512
512
  // PopoverClose
513
513
  //
514
514
 
515
- const CLOSE_NAME = 'PopoverClose';
515
+ const CLOSE_NAME = 'Popover.Close';
516
516
 
517
517
  type PopoverCloseElement = ComponentRef<typeof Primitive.button>;
518
518
  type PopoverCloseProps = PrimitiveButtonProps;
@@ -538,7 +538,7 @@ PopoverClose.displayName = CLOSE_NAME;
538
538
  // PopoverArrow
539
539
  //
540
540
 
541
- const ARROW_NAME = 'PopoverArrow';
541
+ const ARROW_NAME = 'Popover.Arrow';
542
542
 
543
543
  type PopoverArrowElement = ComponentRef<typeof PopperPrimitive.Arrow>;
544
544
  type PopperArrowProps = ThemedClassName<ComponentPropsWithoutRef<typeof PopperPrimitive.Arrow>>;
@@ -8,8 +8,8 @@ import { random } from '@dxos/random';
8
8
  import { mx } from '@dxos/ui-theme';
9
9
  import { ThemedClassName } from '@dxos/ui-types';
10
10
 
11
- import { Column } from '../../primitives';
12
11
  import { withLayout, withTheme } from '../../testing';
12
+ import { Column } from '../Column';
13
13
  import { Input } from '../Input';
14
14
  import { ScrollArea } from './ScrollArea';
15
15
 
@@ -0,0 +1,107 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { mx } from '@dxos/ui-theme';
6
+ import { type AllowedAxis, type ComponentFunction, type Theme } from '@dxos/ui-types';
7
+
8
+ import { withColumn } from '../Column/withColumn';
9
+
10
+ export type ScrollAreaStyleProps = {
11
+ orientation?: AllowedAxis;
12
+ autoHide?: boolean;
13
+ /** Balance left/right, top/bottom offset with scrollbar. */
14
+ centered?: boolean;
15
+ /** Add default padding. */
16
+ /** TODO(burdon): Integrate with Column.Root padding. */
17
+ padding?: boolean;
18
+ /** Use thin scrollbars. */
19
+ /** TODO(burdon): Density fine/course. */
20
+ thin?: boolean;
21
+ /** Enable snap scrolling. */
22
+ snap?: boolean;
23
+ };
24
+
25
+ const root: ComponentFunction<ScrollAreaStyleProps> = ({ orientation }, ...etc) =>
26
+ mx(
27
+ // Expand
28
+ 'dx-container',
29
+
30
+ orientation === 'vertical' && 'group/scroll-v flex flex-col',
31
+ orientation === 'horizontal' && 'group/scroll-h flex',
32
+ // `flex flex-col` is required (as in `vertical`) so the viewport's `flex-1 min-h-0` can
33
+ // bound its height; without it the viewport grows to content height and only scrolls
34
+ // horizontally (the root clips the vertical overflow instead of scrolling it).
35
+ orientation === 'all' && 'group/scroll-all flex flex-col',
36
+
37
+ // Apply col-span-full only when inside a Column.Root grid (detected via dx-column-root marker).
38
+ '[.dx-column-root_&]:col-span-full',
39
+
40
+ ...etc,
41
+ );
42
+
43
+ /**
44
+ * NOTE: The browser reserves space for scrollbars.
45
+ */
46
+ const viewport: ComponentFunction<ScrollAreaStyleProps> = (
47
+ { orientation, centered, padding, snap, autoHide },
48
+ ...etc
49
+ ) => {
50
+ return mx(
51
+ 'flex-1 min-h-0 w-full',
52
+
53
+ // Reset --dx-col so nested components don't try to grid-position themselves.
54
+ // ScrollArea has already consumed --gutter for padding.
55
+ withColumn.consumed(),
56
+
57
+ orientation === 'vertical' && 'overflow-y-scroll',
58
+ orientation === 'horizontal' && 'flex overflow-x-scroll overscroll-x-contain',
59
+ orientation === 'all' && 'overflow-scroll',
60
+
61
+ '[&::-webkit-scrollbar-corner]:bg-transparent',
62
+ '[&::-webkit-scrollbar-track]:bg-transparent',
63
+ '[&::-webkit-scrollbar-thumb]:rounded-none',
64
+
65
+ '[&::-webkit-scrollbar]:w-[var(--scroll-width)] [&::-webkit-scrollbar]:h-[var(--scroll-width)]',
66
+
67
+ // If contained within Column.Root grid the gutter is set by that component (--gutter CSS variable).
68
+ // If centered, left padding compensates for scrollbar width so content is visually centered.
69
+ (orientation === 'vertical' || orientation === 'all') &&
70
+ (padding
71
+ ? [
72
+ centered ? 'pl-[var(--gutter,calc(var(--scroll-width)+var(--scroll-padding)))]' : 'pl-[var(--gutter,0)]',
73
+ 'pr-[calc(var(--gutter,calc(var(--scroll-width)+var(--scroll-padding)))-var(--scroll-width))]',
74
+ ]
75
+ : centered && 'pl-[var(--scroll-width)]'),
76
+
77
+ (orientation === 'horizontal' || orientation === 'all') &&
78
+ (padding
79
+ ? [centered && 'pt-[calc(var(--scroll-width)+var(--scroll-padding))]', 'pb-[var(--scroll-padding)]']
80
+ : centered && 'pt-[var(--scroll-width)]'),
81
+
82
+ snap && [
83
+ orientation === 'vertical' && 'snap-y snap-mandatory',
84
+ orientation === 'horizontal' && 'snap-x snap-mandatory',
85
+ orientation === 'all' && 'snap-both snap-mandatory',
86
+ ],
87
+
88
+ autoHide
89
+ ? [
90
+ orientation === 'vertical' && 'group-hover/scroll-v:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb',
91
+ orientation === 'horizontal' && 'group-hover/scroll-h:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb',
92
+ orientation === 'all' && 'group-hover/scroll-all:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb',
93
+ ]
94
+ : [
95
+ orientation === 'vertical' && '[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb',
96
+ orientation === 'horizontal' && '[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb',
97
+ orientation === 'all' && '[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb',
98
+ ],
99
+
100
+ ...etc,
101
+ );
102
+ };
103
+
104
+ export const scrollAreaTheme: Theme<ScrollAreaStyleProps> = {
105
+ root,
106
+ viewport,
107
+ };
@@ -7,10 +7,11 @@ import { Primitive } from '@radix-ui/react-primitive';
7
7
  import { Slot } from '@radix-ui/react-slot';
8
8
  import React, { CSSProperties, useMemo } from 'react';
9
9
 
10
- import { composableProps, scrollbar, slottable } from '@dxos/ui-theme';
11
10
  import { type AllowedAxis, type SlottableProps } from '@dxos/ui-types';
12
11
 
13
12
  import { useThemeContext } from '../../hooks';
13
+ import { composableProps, slottable } from '../../util';
14
+ import { scrollbar } from './scrollbar';
14
15
 
15
16
  //
16
17
  // Context
@@ -92,7 +93,7 @@ type ScrollAreaViewportProps = SlottableProps;
92
93
  const ScrollAreaViewport = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
93
94
  const { tx } = useThemeContext();
94
95
  const options = useScrollAreaContext(SCROLLAREA_VIEWPORT_NAME);
95
- const density = options.thin ? scrollbar.thin : scrollbar.coarse;
96
+ const density = options.thin ? scrollbar.md : scrollbar.lg;
96
97
  const { className, ...rest } = composableProps(props);
97
98
  const { style, ...restWithoutStyle } = rest as { style?: CSSProperties; [key: string]: any };
98
99
  const Comp = asChild ? Slot : Primitive.div;
@@ -3,3 +3,4 @@
3
3
  //
4
4
 
5
5
  export * from './ScrollArea';
6
+ export * from './scrollbar';
@@ -0,0 +1,21 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ /**
6
+ * Scrollbar sizing presets keyed by density tier.
7
+ */
8
+ export const scrollbar = {
9
+ sm: {
10
+ size: 2,
11
+ padding: 2,
12
+ },
13
+ md: {
14
+ size: 4,
15
+ padding: 4,
16
+ },
17
+ lg: {
18
+ size: 8,
19
+ padding: 8,
20
+ },
21
+ };
@@ -7,9 +7,9 @@ import React, { useEffect, useRef, useState } from 'react';
7
7
 
8
8
  import { random } from '@dxos/random';
9
9
 
10
- import { Panel } from '../../primitives';
11
10
  import { withLayout, withTheme } from '../../testing';
12
11
  import { Button } from '../Button';
12
+ import { Panel } from '../Panel';
13
13
  import { Toolbar } from '../Toolbar';
14
14
  import { ScrollContainer, type ScrollContainerRootProps, type ScrollController } from './ScrollContainer';
15
15