@dxos/react-ui 0.8.4-main.406dc2a → 0.8.4-main.422d1c7879

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 (443) hide show
  1. package/dist/lib/browser/chunk-OCVRIJCH.mjs +848 -0
  2. package/dist/lib/browser/chunk-OCVRIJCH.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +4120 -65
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +91 -67
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs +850 -0
  9. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +4120 -65
  11. package/dist/lib/node-esm/index.mjs.map +4 -4
  12. package/dist/lib/node-esm/meta.json +1 -1
  13. package/dist/lib/node-esm/testing/index.mjs +91 -67
  14. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  15. package/dist/types/src/components/Avatars/Avatar.d.ts +1 -1
  16. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  17. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  18. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  19. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  20. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  21. package/dist/types/src/components/{Buttons → Button}/Button.d.ts +3 -3
  22. package/dist/types/src/components/Button/Button.d.ts.map +1 -0
  23. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -0
  24. package/dist/types/src/components/{Buttons → Button}/IconButton.d.ts +2 -2
  25. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -0
  26. package/dist/types/src/components/{Buttons → Button}/IconButton.stories.d.ts +3 -0
  27. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -0
  28. package/dist/types/src/components/{Buttons → Button}/Toggle.d.ts +2 -2
  29. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -0
  30. package/dist/types/src/components/Button/Toggle.stories.d.ts +16 -0
  31. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -0
  32. package/dist/types/src/components/Button/ToggleGroup.d.ts +27 -0
  33. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -0
  34. package/dist/types/src/components/{Buttons → Button}/ToggleGroup.stories.d.ts +4 -4
  35. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -0
  36. package/dist/types/src/components/Button/index.d.ts.map +1 -0
  37. package/dist/types/src/components/Card/Card.d.ts +127 -0
  38. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  39. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  40. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  41. package/dist/types/src/components/Card/index.d.ts +2 -0
  42. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  43. package/dist/types/src/components/Clipboard/CopyButton.d.ts +1 -1
  44. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  45. package/dist/types/src/components/Clipboard/index.d.ts +10 -1
  46. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  47. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  48. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  49. package/dist/types/src/components/Dialog/AlertDialog.d.ts +51 -0
  50. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -0
  51. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -0
  52. package/dist/types/src/components/Dialog/Dialog.d.ts +64 -0
  53. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -0
  54. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +25 -0
  55. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -0
  56. package/dist/types/src/components/Dialog/index.d.ts.map +1 -0
  57. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  58. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  59. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  60. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  61. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  62. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  63. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +19 -0
  64. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  65. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  66. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  67. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  68. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  69. package/dist/types/src/components/Focus/Focus.d.ts +36 -0
  70. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -0
  71. package/dist/types/src/components/Focus/Focus.stories.d.ts +9 -0
  72. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -0
  73. package/dist/types/src/components/Focus/index.d.ts +2 -0
  74. package/dist/types/src/components/Focus/index.d.ts.map +1 -0
  75. package/dist/types/src/components/Icon/Icon.d.ts +4 -1
  76. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  77. package/dist/types/src/components/Icon/Icon.stories.d.ts +25 -0
  78. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -0
  79. package/dist/types/src/components/Image/Image.d.ts +15 -0
  80. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  81. package/dist/types/src/components/Image/Image.stories.d.ts +34 -0
  82. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  83. package/dist/types/src/components/Image/index.d.ts +2 -0
  84. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  85. package/dist/types/src/components/Input/Input.d.ts +7 -7
  86. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  87. package/dist/types/src/components/Input/Input.stories.d.ts +8 -8
  88. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  90. package/dist/types/src/components/{Lists → List}/List.d.ts +6 -4
  91. package/dist/types/src/components/List/List.d.ts.map +1 -0
  92. package/dist/types/src/components/{Lists → List}/List.stories.d.ts +3 -1
  93. package/dist/types/src/components/List/List.stories.d.ts.map +1 -0
  94. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -0
  95. package/dist/types/src/components/List/Tree.d.ts.map +1 -0
  96. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -0
  97. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -0
  98. package/dist/types/src/components/{Lists → List}/Treegrid.d.ts +5 -9
  99. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -0
  100. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -0
  101. package/dist/types/src/components/List/index.d.ts.map +1 -0
  102. package/dist/types/src/components/Main/Main.d.ts +17 -18
  103. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  104. package/dist/types/src/components/Main/Main.stories.d.ts +0 -3
  105. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  106. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  107. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  108. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  109. package/dist/types/src/components/Menu/DropdownMenu.d.ts +113 -0
  110. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  111. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +28 -0
  112. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  113. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  114. package/dist/types/src/components/Message/Message.d.ts +1 -1
  115. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  116. package/dist/types/src/components/Message/Message.stories.d.ts +5 -6
  117. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  118. package/dist/types/src/components/Popover/Popover.d.ts +33 -24
  119. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  120. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  121. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +27 -27
  122. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  123. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +57 -8
  124. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  125. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +60 -0
  126. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -0
  127. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +23 -0
  128. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -0
  129. package/dist/types/src/components/ScrollContainer/index.d.ts +2 -0
  130. package/dist/types/src/components/ScrollContainer/index.d.ts.map +1 -0
  131. package/dist/types/src/components/Select/Select.d.ts +10 -10
  132. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  133. package/dist/types/src/components/Select/Select.stories.d.ts +2 -2
  134. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  135. package/dist/types/src/components/Separator/Separator.d.ts +4 -4
  136. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  137. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  138. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  139. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  140. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  141. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  142. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  143. package/dist/types/src/components/Splitter/Splitter.d.ts +34 -0
  144. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  145. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  146. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  147. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  148. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  149. package/dist/types/src/components/Status/Status.d.ts +3 -4
  150. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  151. package/dist/types/src/components/Status/Status.stories.d.ts +4 -2
  152. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  153. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  154. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  155. package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
  156. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  157. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +3 -3
  158. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  159. package/dist/types/src/components/{Menus/DropdownMenu.stories.d.ts → ThemeProvider/ThemeProvider.stories.d.ts} +2 -5
  160. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  161. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
  162. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  163. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  164. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  165. package/dist/types/src/components/Toast/Toast.d.ts +19 -19
  166. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  167. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  168. package/dist/types/src/components/Toolbar/Toolbar.d.ts +37 -17
  169. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  170. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  171. package/dist/types/src/components/Tooltip/Tooltip.d.ts +9 -9
  172. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  173. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +2 -2
  174. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  175. package/dist/types/src/components/index.d.ts +14 -8
  176. package/dist/types/src/components/index.d.ts.map +1 -1
  177. package/dist/types/src/exemplars/generics.stories.d.ts +19 -0
  178. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  179. package/dist/types/src/exemplars/slot.stories.d.ts +15 -0
  180. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  181. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  182. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  183. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  184. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  185. package/dist/types/src/hooks/index.d.ts +1 -0
  186. package/dist/types/src/hooks/index.d.ts.map +1 -1
  187. package/dist/types/src/hooks/useDensityContext.d.ts +2 -2
  188. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  189. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  190. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  191. package/dist/types/src/index.d.ts +2 -1
  192. package/dist/types/src/index.d.ts.map +1 -1
  193. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  194. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  195. package/dist/types/src/primitives/Column/Column.d.ts +33 -0
  196. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  197. package/dist/types/src/primitives/Column/Column.stories.d.ts +25 -0
  198. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  199. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  200. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  201. package/dist/types/src/primitives/Container/Container.d.ts +7 -0
  202. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  203. package/dist/types/src/primitives/Container/Container.stories.d.ts +6 -0
  204. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  205. package/dist/types/src/primitives/Container/index.d.ts +2 -0
  206. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  207. package/dist/types/src/primitives/Flex/Flex.d.ts +11 -0
  208. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  209. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  210. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  211. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  212. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  213. package/dist/types/src/primitives/Grid/Grid.d.ts +10 -0
  214. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  215. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  216. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  217. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  218. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  219. package/dist/types/src/primitives/Panel/Panel.d.ts +35 -0
  220. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  221. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  222. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  223. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  224. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  225. package/dist/types/src/primitives/index.d.ts +6 -0
  226. package/dist/types/src/primitives/index.d.ts.map +1 -0
  227. package/dist/types/src/testing/Loading.d.ts +9 -0
  228. package/dist/types/src/testing/Loading.d.ts.map +1 -0
  229. package/dist/types/src/testing/decorators/index.d.ts +1 -1
  230. package/dist/types/src/testing/decorators/index.d.ts.map +1 -1
  231. package/dist/types/src/testing/decorators/withLayout.d.ts +3 -3
  232. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  233. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +12 -0
  234. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -0
  235. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  236. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  237. package/dist/types/src/testing/index.d.ts +1 -0
  238. package/dist/types/src/testing/index.d.ts.map +1 -1
  239. package/dist/types/src/translations.d.ts +11 -0
  240. package/dist/types/src/translations.d.ts.map +1 -0
  241. package/dist/types/src/util/index.d.ts +1 -2
  242. package/dist/types/src/util/index.d.ts.map +1 -1
  243. package/dist/types/src/util/usePx.d.ts.map +1 -1
  244. package/dist/types/tsconfig.tsbuildinfo +1 -1
  245. package/package.json +43 -37
  246. package/src/components/Avatars/Avatar.stories.tsx +7 -9
  247. package/src/components/Avatars/Avatar.tsx +7 -15
  248. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -3
  249. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +4 -5
  250. package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
  251. package/src/components/{Buttons → Button}/Button.stories.tsx +4 -5
  252. package/src/components/{Buttons → Button}/Button.tsx +12 -26
  253. package/src/components/{Buttons → Button}/IconButton.stories.tsx +8 -6
  254. package/src/components/{Buttons → Button}/IconButton.tsx +19 -15
  255. package/src/components/{Buttons → Button}/Toggle.stories.tsx +7 -7
  256. package/src/components/{Buttons → Button}/Toggle.tsx +4 -4
  257. package/src/components/{Buttons → Button}/ToggleGroup.stories.tsx +2 -3
  258. package/src/components/{Buttons → Button}/ToggleGroup.tsx +12 -16
  259. package/src/components/Card/Card.stories.tsx +151 -0
  260. package/src/components/Card/Card.tsx +505 -0
  261. package/src/components/Card/index.ts +5 -0
  262. package/src/components/Clipboard/CopyButton.tsx +8 -9
  263. package/src/components/DensityProvider/DensityProvider.tsx +1 -1
  264. package/src/components/Dialog/AlertDialog.stories.tsx +68 -0
  265. package/src/components/{Dialogs → Dialog}/AlertDialog.tsx +123 -82
  266. package/src/components/Dialog/Dialog.stories.tsx +177 -0
  267. package/src/components/Dialog/Dialog.tsx +285 -0
  268. package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
  269. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +45 -0
  270. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  271. package/src/components/ErrorFallback/ErrorStack.tsx +114 -0
  272. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  273. package/src/components/ErrorFallback/index.ts +9 -0
  274. package/src/components/Focus/AUDIT.md +43 -0
  275. package/src/components/Focus/Focus.stories.tsx +230 -0
  276. package/src/components/Focus/Focus.tsx +201 -0
  277. package/src/components/Focus/index.ts +5 -0
  278. package/src/components/Icon/Icon.stories.tsx +143 -0
  279. package/src/components/Icon/Icon.tsx +6 -2
  280. package/src/components/Image/Image.stories.tsx +86 -0
  281. package/src/components/Image/Image.tsx +236 -0
  282. package/src/components/Image/index.ts +5 -0
  283. package/src/components/Input/Input.stories.tsx +21 -41
  284. package/src/components/Input/Input.tsx +38 -74
  285. package/src/components/Link/Link.stories.tsx +2 -3
  286. package/src/components/Link/Link.tsx +2 -2
  287. package/src/components/{Lists → List}/List.stories.tsx +30 -34
  288. package/src/components/{Lists → List}/List.tsx +17 -21
  289. package/src/components/{Lists → List}/ListDropIndicator.tsx +7 -7
  290. package/src/components/{Lists → List}/Tree.stories.tsx +5 -6
  291. package/src/components/{Lists → List}/Tree.tsx +0 -1
  292. package/src/components/{Lists → List}/TreeDropIndicator.tsx +6 -6
  293. package/src/components/{Lists → List}/Treegrid.stories.tsx +29 -30
  294. package/src/components/{Lists → List}/Treegrid.tsx +23 -28
  295. package/src/components/Main/Main.stories.tsx +41 -24
  296. package/src/components/Main/Main.tsx +150 -94
  297. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +2 -3
  298. package/src/components/{Menus → Menu}/ContextMenu.tsx +9 -33
  299. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +3 -4
  300. package/src/components/{Menus → Menu}/DropdownMenu.tsx +137 -110
  301. package/src/components/Message/Message.stories.tsx +27 -13
  302. package/src/components/Message/Message.tsx +43 -34
  303. package/src/components/Popover/Popover.stories.tsx +8 -9
  304. package/src/components/Popover/Popover.tsx +114 -92
  305. package/src/components/ScrollArea/ScrollArea.stories.tsx +223 -34
  306. package/src/components/ScrollArea/ScrollArea.tsx +97 -79
  307. package/src/components/ScrollArea/index.ts +1 -1
  308. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +91 -0
  309. package/src/components/ScrollContainer/ScrollContainer.tsx +347 -0
  310. package/src/components/ScrollContainer/index.ts +5 -0
  311. package/src/components/Select/Select.stories.tsx +8 -9
  312. package/src/components/Select/Select.tsx +11 -27
  313. package/src/components/Separator/Separator.tsx +5 -8
  314. package/src/components/Skeleton/Skeleton.stories.tsx +51 -0
  315. package/src/components/Skeleton/Skeleton.tsx +26 -0
  316. package/src/components/Skeleton/index.ts +5 -0
  317. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  318. package/src/components/Splitter/Splitter.tsx +127 -0
  319. package/src/components/Splitter/index.ts +5 -0
  320. package/src/components/Status/Status.stories.tsx +21 -18
  321. package/src/components/Status/Status.tsx +10 -7
  322. package/src/components/Tag/Tag.stories.tsx +6 -12
  323. package/src/components/Tag/Tag.tsx +3 -8
  324. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +31 -0
  325. package/src/components/ThemeProvider/ThemeProvider.tsx +10 -10
  326. package/src/components/ThemeProvider/TranslationsProvider.tsx +1 -16
  327. package/src/components/ThemeProvider/index.ts +3 -3
  328. package/src/components/Toast/Toast.stories.tsx +3 -4
  329. package/src/components/Toast/Toast.tsx +22 -41
  330. package/src/components/Toolbar/Toolbar.stories.tsx +4 -7
  331. package/src/components/Toolbar/Toolbar.tsx +186 -23
  332. package/src/components/Tooltip/Tooltip.stories.tsx +21 -20
  333. package/src/components/Tooltip/Tooltip.tsx +40 -38
  334. package/src/components/index.ts +15 -9
  335. package/src/exemplars/generics.stories.tsx +41 -0
  336. package/src/exemplars/slot.stories.tsx +117 -0
  337. package/src/exemplars/tabster.stories.tsx +127 -0
  338. package/src/exemplars/virtualizer.stories.tsx +137 -0
  339. package/src/hooks/index.ts +1 -0
  340. package/src/hooks/useDensityContext.ts +3 -3
  341. package/src/hooks/useElevationContext.ts +1 -1
  342. package/src/index.ts +2 -1
  343. package/src/playground/Controls.stories.tsx +3 -10
  344. package/src/playground/Custom.stories.tsx +13 -18
  345. package/src/playground/Typography.stories.tsx +3 -3
  346. package/src/primitives/Column/AUDIT.md +148 -0
  347. package/src/primitives/Column/Column.stories.tsx +181 -0
  348. package/src/primitives/Column/Column.tsx +165 -0
  349. package/src/primitives/Column/index.ts +5 -0
  350. package/src/primitives/Container/Container.stories.tsx +29 -0
  351. package/src/primitives/Container/Container.tsx +19 -0
  352. package/src/primitives/Container/index.ts +5 -0
  353. package/src/primitives/Flex/Flex.stories.tsx +57 -0
  354. package/src/primitives/Flex/Flex.tsx +27 -0
  355. package/src/primitives/Flex/index.ts +5 -0
  356. package/src/primitives/Grid/Grid.stories.tsx +56 -0
  357. package/src/primitives/Grid/Grid.tsx +30 -0
  358. package/src/primitives/Grid/index.ts +5 -0
  359. package/src/primitives/Panel/Panel.stories.tsx +68 -0
  360. package/src/primitives/Panel/Panel.tsx +120 -0
  361. package/src/primitives/Panel/index.ts +5 -0
  362. package/src/primitives/index.ts +9 -0
  363. package/src/testing/Loading.tsx +47 -0
  364. package/src/testing/decorators/index.ts +1 -1
  365. package/src/testing/decorators/withLayout.tsx +39 -18
  366. package/src/testing/decorators/withLayoutVariants.tsx +48 -0
  367. package/src/testing/decorators/withTheme.tsx +26 -20
  368. package/src/testing/index.ts +2 -0
  369. package/src/translations.ts +19 -0
  370. package/src/util/index.ts +2 -2
  371. package/src/util/usePx.ts +1 -0
  372. package/dist/lib/browser/chunk-KX5JDELJ.mjs +0 -4521
  373. package/dist/lib/browser/chunk-KX5JDELJ.mjs.map +0 -7
  374. package/dist/lib/node-esm/chunk-3HDQYL5S.mjs +0 -4523
  375. package/dist/lib/node-esm/chunk-3HDQYL5S.mjs.map +0 -7
  376. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  377. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  378. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  379. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  380. package/dist/types/src/components/Buttons/Button.d.ts.map +0 -1
  381. package/dist/types/src/components/Buttons/Button.stories.d.ts.map +0 -1
  382. package/dist/types/src/components/Buttons/IconButton.d.ts.map +0 -1
  383. package/dist/types/src/components/Buttons/IconButton.stories.d.ts.map +0 -1
  384. package/dist/types/src/components/Buttons/Toggle.d.ts.map +0 -1
  385. package/dist/types/src/components/Buttons/Toggle.stories.d.ts +0 -13
  386. package/dist/types/src/components/Buttons/Toggle.stories.d.ts.map +0 -1
  387. package/dist/types/src/components/Buttons/ToggleGroup.d.ts +0 -27
  388. package/dist/types/src/components/Buttons/ToggleGroup.d.ts.map +0 -1
  389. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts.map +0 -1
  390. package/dist/types/src/components/Buttons/index.d.ts.map +0 -1
  391. package/dist/types/src/components/Dialogs/AlertDialog.d.ts +0 -31
  392. package/dist/types/src/components/Dialogs/AlertDialog.d.ts.map +0 -1
  393. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts.map +0 -1
  394. package/dist/types/src/components/Dialogs/Dialog.d.ts +0 -31
  395. package/dist/types/src/components/Dialogs/Dialog.d.ts.map +0 -1
  396. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts +0 -25
  397. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts.map +0 -1
  398. package/dist/types/src/components/Dialogs/index.d.ts.map +0 -1
  399. package/dist/types/src/components/Lists/List.d.ts.map +0 -1
  400. package/dist/types/src/components/Lists/List.stories.d.ts.map +0 -1
  401. package/dist/types/src/components/Lists/ListDropIndicator.d.ts.map +0 -1
  402. package/dist/types/src/components/Lists/Tree.d.ts.map +0 -1
  403. package/dist/types/src/components/Lists/Tree.stories.d.ts.map +0 -1
  404. package/dist/types/src/components/Lists/TreeDropIndicator.d.ts.map +0 -1
  405. package/dist/types/src/components/Lists/Treegrid.d.ts.map +0 -1
  406. package/dist/types/src/components/Lists/Treegrid.stories.d.ts.map +0 -1
  407. package/dist/types/src/components/Lists/index.d.ts.map +0 -1
  408. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  409. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  410. package/dist/types/src/components/Menus/DropdownMenu.d.ts +0 -113
  411. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  412. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  413. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  414. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts +0 -12
  415. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts.map +0 -1
  416. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  417. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  418. package/dist/types/src/util/domino.d.ts +0 -18
  419. package/dist/types/src/util/domino.d.ts.map +0 -1
  420. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
  421. package/src/components/AnchoredOverflow/index.ts +0 -5
  422. package/src/components/Dialogs/AlertDialog.stories.tsx +0 -69
  423. package/src/components/Dialogs/Dialog.stories.tsx +0 -67
  424. package/src/components/Dialogs/Dialog.tsx +0 -159
  425. package/src/testing/decorators/withSurfaceVariantsLayout.tsx +0 -51
  426. package/src/util/ThemedClassName.ts +0 -7
  427. package/src/util/domino.ts +0 -53
  428. /package/dist/types/src/components/{Buttons → Button}/Button.stories.d.ts +0 -0
  429. /package/dist/types/src/components/{Buttons → Button}/index.d.ts +0 -0
  430. /package/dist/types/src/components/{Dialogs → Dialog}/AlertDialog.stories.d.ts +0 -0
  431. /package/dist/types/src/components/{Dialogs → Dialog}/index.d.ts +0 -0
  432. /package/dist/types/src/components/{Lists → List}/ListDropIndicator.d.ts +0 -0
  433. /package/dist/types/src/components/{Lists → List}/Tree.d.ts +0 -0
  434. /package/dist/types/src/components/{Lists → List}/Tree.stories.d.ts +0 -0
  435. /package/dist/types/src/components/{Lists → List}/TreeDropIndicator.d.ts +0 -0
  436. /package/dist/types/src/components/{Lists → List}/Treegrid.stories.d.ts +0 -0
  437. /package/dist/types/src/components/{Lists → List}/index.d.ts +0 -0
  438. /package/dist/types/src/components/{Menus → Menu}/ContextMenu.stories.d.ts +0 -0
  439. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  440. /package/src/components/{Buttons → Button}/index.ts +0 -0
  441. /package/src/components/{Dialogs → Dialog}/index.ts +0 -0
  442. /package/src/components/{Lists → List}/index.ts +0 -0
  443. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -0,0 +1,83 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { type ComponentPropsWithoutRef, forwardRef, useState } from 'react';
7
+
8
+ import { Panel } from '../../primitives';
9
+ import { withLayout, withTheme } from '../../testing';
10
+ import { ScrollArea } from '../ScrollArea';
11
+ import { Toolbar } from '../Toolbar';
12
+ import { Splitter, type SplitterRootProps } from './Splitter';
13
+
14
+ const PanelContent = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'> & { label: string }>(
15
+ ({ label, ...props }, forwardedRef) => (
16
+ <Panel.Root {...props} ref={forwardedRef}>
17
+ <Panel.Toolbar asChild>
18
+ <Toolbar.Root>{label}</Toolbar.Root>
19
+ </Panel.Toolbar>
20
+ <Panel.Content asChild>
21
+ <ScrollArea.Root orientation='vertical'>
22
+ <ScrollArea.Viewport>
23
+ {Array.from({ length: 100 }).map((_, i) => (
24
+ <div key={i} className='p-1'>
25
+ {label}-{i}
26
+ </div>
27
+ ))}
28
+ </ScrollArea.Viewport>
29
+ </ScrollArea.Root>
30
+ </Panel.Content>
31
+ </Panel.Root>
32
+ ),
33
+ );
34
+
35
+ const DefaultStory = (props: SplitterRootProps) => {
36
+ const [mode, setMode] = useState(props.mode ?? 'split');
37
+ const [ratio, setRatio] = useState(props.ratio ?? 0.5);
38
+
39
+ return (
40
+ <Panel.Root>
41
+ <Panel.Toolbar asChild>
42
+ <Toolbar.Root>
43
+ <Toolbar.Button onClick={() => setMode('top')}>A</Toolbar.Button>
44
+ <Toolbar.Button onClick={() => setMode('split')}>A+B</Toolbar.Button>
45
+ <Toolbar.Button onClick={() => setMode('bottom')}>B</Toolbar.Button>
46
+ <Toolbar.Separator />
47
+ <Toolbar.Button onClick={() => setRatio((r) => 1 - r)}>Toggle</Toolbar.Button>
48
+ </Toolbar.Root>
49
+ </Panel.Toolbar>
50
+ <Panel.Content asChild>
51
+ <Splitter.Root mode={mode} ratio={ratio}>
52
+ <Splitter.Panel asChild position='top'>
53
+ <PanelContent label='A' />
54
+ </Splitter.Panel>
55
+ <Splitter.Panel asChild position='bottom'>
56
+ <PanelContent label='B' />
57
+ </Splitter.Panel>
58
+ </Splitter.Root>
59
+ </Panel.Content>
60
+ </Panel.Root>
61
+ );
62
+ };
63
+
64
+ const meta: Meta<SplitterRootProps> = {
65
+ title: 'ui/react-ui-core/components/Splitter',
66
+ component: Splitter.Root,
67
+ render: DefaultStory,
68
+ decorators: [withTheme(), withLayout({ layout: 'column' })],
69
+ parameters: {
70
+ layout: 'fullscreen',
71
+ },
72
+ };
73
+
74
+ export default meta;
75
+
76
+ type Story = StoryObj<SplitterRootProps>;
77
+
78
+ export const Default: Story = {
79
+ args: {
80
+ mode: 'split',
81
+ ratio: 0.4,
82
+ },
83
+ };
@@ -0,0 +1,127 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { createContextScope } from '@radix-ui/react-context';
6
+ import { Primitive } from '@radix-ui/react-primitive';
7
+ import { Slot } from '@radix-ui/react-slot';
8
+ import React from 'react';
9
+
10
+ import { composableProps, slottable } from '@dxos/ui-theme';
11
+
12
+ import { useThemeContext } from '../../hooks';
13
+ import { ThemedClassName } from '../../util';
14
+
15
+ type ScopedProps<P> = P & { __scopeSplitter?: any };
16
+
17
+ // TODO(burdon): Generalize horizontal/vertical and change to start/end.
18
+ type Mode = 'top' | 'bottom' | 'split';
19
+
20
+ type SplitterContextValue = {
21
+ mode: Mode;
22
+ ratio?: number;
23
+ transition: number;
24
+ };
25
+
26
+ const SPLITTER_NAME = 'Splitter';
27
+
28
+ const [createSplitterContext, createSplitterScope] = createContextScope(SPLITTER_NAME);
29
+
30
+ const [SplitterProvider, useSplitterContext] = createSplitterContext<SplitterContextValue>(SPLITTER_NAME);
31
+
32
+ //
33
+ // Root
34
+ //
35
+
36
+ const ROOT_NAME = 'Splitter.Root';
37
+
38
+ type RootOwnProps = Partial<SplitterContextValue>;
39
+
40
+ type RootProps = RootOwnProps;
41
+
42
+ const Root = slottable<HTMLDivElement, RootOwnProps>(
43
+ ({ asChild, mode = 'top', ratio = 0.5, transition = 250, children, ...props }, forwardedRef) => {
44
+ const { tx } = useThemeContext();
45
+ const { __scopeSplitter, ...rest } = props as ScopedProps<typeof props>;
46
+ const { className, ...restProps } = composableProps(rest);
47
+ const Comp = asChild ? Slot : Primitive.div;
48
+
49
+ return (
50
+ <SplitterProvider scope={__scopeSplitter} mode={mode} ratio={ratio} transition={transition}>
51
+ <Comp {...restProps} ref={forwardedRef} className={tx('splitter.root', {}, className)}>
52
+ {children}
53
+ </Comp>
54
+ </SplitterProvider>
55
+ );
56
+ },
57
+ );
58
+
59
+ Root.displayName = ROOT_NAME;
60
+
61
+ //
62
+ // Panel
63
+ //
64
+
65
+ const PANEL_NAME = 'Splitter.Panel';
66
+
67
+ type PanelOwnProps = ThemedClassName<{
68
+ position: 'top' | 'bottom';
69
+ }>;
70
+
71
+ type PanelProps = PanelOwnProps;
72
+
73
+ const Panel = slottable<HTMLDivElement, PanelOwnProps>(
74
+ ({ classNames, asChild, children, position, style, ...props }, forwardedRef) => {
75
+ const { tx } = useThemeContext();
76
+ const { __scopeSplitter, ...rest } = props as ScopedProps<typeof props>;
77
+ const Comp = asChild ? Slot : Primitive.div;
78
+ const { mode, ratio = 0.5, transition } = useSplitterContext(PANEL_NAME, __scopeSplitter);
79
+ const { className, ...restProps } = composableProps(rest);
80
+
81
+ // Calculate position and height based on mode and ratio.
82
+ const isTopPanel = position === 'top';
83
+ const topOffset = isTopPanel ? '0%' : mode === 'top' ? '100%' : mode === 'bottom' ? '0%' : `${ratio * 100}%`;
84
+ const height = isTopPanel
85
+ ? mode === 'top'
86
+ ? '100%'
87
+ : mode === 'bottom'
88
+ ? '0%'
89
+ : `${ratio * 100}%`
90
+ : mode === 'bottom'
91
+ ? '100%'
92
+ : mode === 'top'
93
+ ? '0%'
94
+ : `${(1 - ratio) * 100}%`;
95
+
96
+ return (
97
+ <Comp
98
+ {...restProps}
99
+ ref={forwardedRef}
100
+ className={tx('splitter.panel', {}, className)}
101
+ style={{
102
+ top: topOffset,
103
+ height,
104
+ transition: `top ${transition}ms, height ${transition}ms ease-out`,
105
+ ...style,
106
+ }}
107
+ >
108
+ {children}
109
+ </Comp>
110
+ );
111
+ },
112
+ );
113
+
114
+ Panel.displayName = PANEL_NAME;
115
+
116
+ //
117
+ // Splitter
118
+ //
119
+
120
+ const Splitter = {
121
+ Root,
122
+ Panel,
123
+ };
124
+
125
+ export { Splitter, createSplitterScope };
126
+
127
+ export type { Mode as SplitterMode, RootProps as SplitterRootProps, PanelProps as SplitterPanelProps };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './Splitter';
@@ -6,34 +6,37 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React from 'react';
7
7
 
8
8
  import { withTheme } from '../../testing';
9
-
10
9
  import { Status } from './Status';
11
10
 
12
11
  const meta = {
13
- title: 'ui/react-ui-core/Status',
12
+ title: 'ui/react-ui-core/components/Status',
14
13
  component: Status,
15
- decorators: [withTheme],
14
+ decorators: [withTheme()],
16
15
  } satisfies Meta<typeof Status>;
17
16
 
18
17
  export default meta;
19
18
 
20
19
  type Story = StoryObj<typeof meta>;
21
20
 
22
- export const Normal = (props: any) => {
23
- return (
24
- <div className='m-5 space-b-5'>
25
- <Status classNames='block' progress={0} {...props} />
26
- <Status classNames='block' progress={0.3} {...props} />
27
- <Status classNames='block' progress={0.7} {...props} />
28
- <Status classNames='block' progress={1} {...props} />
29
- </div>
30
- );
21
+ export const Normal: Story = {
22
+ render: (props) => {
23
+ return (
24
+ <div className='m-5 space-b-5'>
25
+ <Status classNames='block' progress={0} {...props} />
26
+ <Status classNames='block' progress={0.3} {...props} />
27
+ <Status classNames='block' progress={0.7} {...props} />
28
+ <Status classNames='block' progress={1} {...props} />
29
+ </div>
30
+ );
31
+ },
31
32
  };
32
33
 
33
- export const Indeterminate = (props: any) => {
34
- return (
35
- <div className='m-5'>
36
- <Status classNames='block' indeterminate {...props} />
37
- </div>
38
- );
34
+ export const Indeterminate: Story = {
35
+ render: (props) => {
36
+ return (
37
+ <div className='m-5'>
38
+ <Status classNames='block' indeterminate {...props} />
39
+ </div>
40
+ );
41
+ },
39
42
  };
@@ -4,14 +4,17 @@
4
4
 
5
5
  import React, { type ComponentPropsWithRef, forwardRef } from 'react';
6
6
 
7
+ import { type StatusStyleProps } from '@dxos/ui-theme';
8
+
7
9
  import { useThemeContext } from '../../hooks';
8
10
  import { type ThemedClassName } from '../../util';
9
11
 
10
- type StatusProps = ThemedClassName<ComponentPropsWithRef<'span'>> & {
11
- indeterminate?: boolean;
12
- variant?: 'default' | 'main-bottom';
13
- progress?: number;
14
- };
12
+ type StatusProps = ThemedClassName<
13
+ ComponentPropsWithRef<'span'> &
14
+ StatusStyleProps & {
15
+ progress?: number;
16
+ }
17
+ >;
15
18
 
16
19
  const Status = forwardRef<HTMLSpanElement, StatusProps>(
17
20
  ({ classNames, children, progress = 0, indeterminate, variant, ...props }, forwardedRef) => {
@@ -20,12 +23,12 @@ const Status = forwardRef<HTMLSpanElement, StatusProps>(
20
23
  <span
21
24
  role='status'
22
25
  {...props}
23
- className={tx('status.root', 'status', { indeterminate, variant }, classNames)}
26
+ className={tx('status.root', { indeterminate, variant }, classNames)}
24
27
  ref={forwardedRef}
25
28
  >
26
29
  <span
27
30
  role='none'
28
- className={tx('status.bar', 'status__bar', { indeterminate, variant }, classNames)}
31
+ className={tx('status.bar', { indeterminate, variant }, classNames)}
29
32
  {...(!indeterminate && { style: { width: `${Math.round(progress * 100)}%` } })}
30
33
  />
31
34
  {children}
@@ -5,20 +5,19 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React from 'react';
7
7
 
8
- import { hues } from '@dxos/react-ui-theme';
9
- import { type ChromaticPalette, type MessageValence } from '@dxos/react-ui-types';
10
-
11
- import { withTheme } from '../../testing';
8
+ import { hues } from '@dxos/ui-theme';
9
+ import { type ChromaticPalette, type MessageValence } from '@dxos/ui-types';
12
10
 
11
+ import { withLayout, withTheme } from '../../testing';
13
12
  import { Tag } from './Tag';
14
13
 
15
14
  const palettes = ['neutral', 'success', 'info', 'warning', 'error', ...hues] as (ChromaticPalette | MessageValence)[];
16
15
 
17
16
  const meta = {
18
- title: 'ui/react-ui-core/Tag',
17
+ title: 'ui/react-ui-core/components/Tag',
19
18
  component: Tag,
20
19
  render: () => (
21
- <div role='grid' className='grid grid-cols-5 gap-2 max-is-screen-md'>
20
+ <div>
22
21
  {palettes.map((palette) => (
23
22
  <Tag key={palette} palette={palette}>
24
23
  {palette}
@@ -26,12 +25,7 @@ const meta = {
26
25
  ))}
27
26
  </div>
28
27
  ),
29
- decorators: [withTheme],
30
- parameters: {
31
- chromatic: {
32
- disableSnapshot: false,
33
- },
34
- },
28
+ decorators: [withTheme(), withLayout({ layout: 'default' })],
35
29
  } satisfies Meta<typeof Tag>;
36
30
 
37
31
  export default meta;
@@ -6,7 +6,7 @@ import { Primitive } from '@radix-ui/react-primitive';
6
6
  import { Slot } from '@radix-ui/react-slot';
7
7
  import React, { type ComponentPropsWithRef, forwardRef } from 'react';
8
8
 
9
- import { type ChromaticPalette, type MessageValence, type NeutralPalette } from '@dxos/react-ui-types';
9
+ import { type ChromaticPalette, type MessageValence, type NeutralPalette } from '@dxos/ui-types';
10
10
 
11
11
  import { useThemeContext } from '../../hooks';
12
12
  import { type ThemedClassName } from '../../util';
@@ -19,14 +19,9 @@ export type TagProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.sp
19
19
  export const Tag = forwardRef<HTMLSpanElement, TagProps>(
20
20
  ({ asChild, palette = 'neutral', classNames, ...props }, forwardedRef) => {
21
21
  const { tx } = useThemeContext();
22
- const Root = asChild ? Slot : Primitive.span;
22
+ const Comp = asChild ? Slot : Primitive.span;
23
23
  return (
24
- <Root
25
- {...props}
26
- className={tx('tag.root', 'dx-tag', { palette }, classNames)}
27
- data-hue={palette}
28
- ref={forwardedRef}
29
- />
24
+ <Comp {...props} className={tx('tag.root', { palette }, classNames)} data-hue={palette} ref={forwardedRef} />
30
25
  );
31
26
  },
32
27
  );
@@ -0,0 +1,31 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React from 'react';
7
+
8
+ import { useThemeContext } from '../../hooks';
9
+ import { withLayout, withTheme } from '../../testing';
10
+ import { ThemeProvider } from './ThemeProvider';
11
+
12
+ const meta = {
13
+ title: 'ui/react-ui-core/components/ThemeProvider',
14
+ component: ThemeProvider,
15
+ render: () => {
16
+ const { themeMode, platform } = useThemeContext();
17
+ return (
18
+ <div className='p-4 flex flex-col gap-4'>
19
+ <h1>ThemeProvider</h1>
20
+ <pre className='text-sm text-description'>{JSON.stringify({ themeMode, platform }, null, 2)}</pre>
21
+ </div>
22
+ );
23
+ },
24
+ decorators: [withTheme(), withLayout()],
25
+ } satisfies Meta<typeof ThemeProvider>;
26
+
27
+ export default meta;
28
+
29
+ type Story = StoryObj<typeof meta>;
30
+
31
+ export const Default: Story = {};
@@ -5,23 +5,21 @@
5
5
  import { createKeyborg } from 'keyborg';
6
6
  import React, { type PropsWithChildren, createContext, useEffect, useMemo } from 'react';
7
7
 
8
- import { type Density, type Elevation, type ThemeFunction } from '@dxos/react-ui-types';
8
+ import { type Density, type Elevation, type ThemeFunction, type ThemeMode } from '@dxos/ui-types';
9
9
 
10
10
  import { type SafeAreaPadding, useSafeArea } from '../../hooks';
11
11
  import { hasIosKeyboard } from '../../util';
12
12
  import { DensityProvider } from '../DensityProvider';
13
13
  import { ElevationProvider } from '../ElevationProvider';
14
-
15
14
  import { TranslationsProvider, type TranslationsProviderProps } from './TranslationsProvider';
16
15
 
17
- export type ThemeMode = 'dark' | 'light';
18
-
19
16
  export type ThemeContextValue = {
20
17
  tx: ThemeFunction<any>;
21
18
  themeMode: ThemeMode;
22
19
  hasIosKeyboard: boolean;
23
20
  safeAreaPadding?: SafeAreaPadding;
24
21
  noCache?: boolean;
22
+ platform?: 'mobile' | 'desktop';
25
23
  };
26
24
 
27
25
  /**
@@ -41,10 +39,11 @@ export const ThemeProvider = ({
41
39
  fallback = null,
42
40
  resourceExtensions,
43
41
  appNs,
44
- tx = (_path, defaultClassName, _styleProps, ..._options) => defaultClassName,
42
+ tx = (_path, _styleProps, ..._options) => undefined,
45
43
  themeMode = 'dark',
46
44
  rootDensity = 'fine',
47
- ...rest
45
+ noCache,
46
+ platform,
48
47
  }: ThemeProviderProps) => {
49
48
  useEffect(() => {
50
49
  if (document.defaultView) {
@@ -55,9 +54,10 @@ export const ThemeProvider = ({
55
54
  }, []);
56
55
 
57
56
  const safeAreaPadding = useSafeArea();
57
+ // Destructure all props explicitly so useMemo deps are stable primitives, not a new `rest` object every render.
58
58
  const contextValue = useMemo(
59
- () => ({ tx, themeMode, hasIosKeyboard: hasIosKeyboard(), safeAreaPadding, ...rest }),
60
- [tx, themeMode, safeAreaPadding, rest],
59
+ () => ({ tx, themeMode, hasIosKeyboard: hasIosKeyboard(), safeAreaPadding, noCache, platform }),
60
+ [tx, themeMode, safeAreaPadding, noCache, platform],
61
61
  );
62
62
 
63
63
  return (
@@ -79,8 +79,8 @@ export const ThemeProvider = ({
79
79
 
80
80
  const handleInputModalityChange = (isUsingKeyboard: boolean) => {
81
81
  if (isUsingKeyboard) {
82
- document.body.setAttribute('data-is-keyboard', 'true');
82
+ document.body.setAttribute('data-w-keyboard', 'true');
83
83
  } else {
84
- document.body.removeAttribute('data-is-keyboard');
84
+ document.body.removeAttribute('data-w-keyboard');
85
85
  }
86
86
  };
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { type Locale, enUS as dtLocaleEnUs } from 'date-fns/locale';
6
- import i18Next, { type Resource, type TFunction } from 'i18next';
6
+ import i18Next, { type Resource } from 'i18next';
7
7
  import React, { type ReactNode, Suspense, createContext, useContext, useEffect, useState } from 'react';
8
8
  import { initReactI18next, useTranslation as useI18NextTranslation } from 'react-i18next';
9
9
 
@@ -11,21 +11,6 @@ const initialLng = 'en-US';
11
11
  const initialNs = 'dxos-common';
12
12
  const initialDtLocale = dtLocaleEnUs;
13
13
 
14
- // TODO(thure): `Parameters<TFunction>` causes typechecking issues because `TFunction` has so many signatures.
15
- export type Label = string | [string, { ns: string; count?: number; defaultValue?: string }];
16
-
17
- export const isLabel = (o: any): o is Label =>
18
- typeof o === 'string' ||
19
- (Array.isArray(o) &&
20
- o.length === 2 &&
21
- typeof o[0] === 'string' &&
22
- !!o[1] &&
23
- typeof o[1] === 'object' &&
24
- 'ns' in o[1] &&
25
- typeof o[1].ns === 'string');
26
-
27
- export const toLocalizedString = (label: Label, t: TFunction) => (Array.isArray(label) ? t(...label) : label);
28
-
29
14
  export const resources = {
30
15
  [initialLng]: {
31
16
  [initialNs]: {
@@ -2,7 +2,7 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- export * from './ThemeProvider';
6
- export { type Label, isLabel, toLocalizedString, useTranslation } from './TranslationsProvider';
5
+ export { type Label, isLabel, toLocalizedString } from '@dxos/ui-types';
7
6
 
8
- // TODO(burdon): Use `@internal` with barrel exports (rather than picking individual exports?)
7
+ export * from './ThemeProvider';
8
+ export { useTranslation } from './TranslationsProvider';
@@ -6,8 +6,7 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React, { type ReactNode, useState } from 'react';
7
7
 
8
8
  import { withTheme } from '../../testing';
9
- import { Button } from '../Buttons';
10
-
9
+ import { Button } from '../Button';
11
10
  import { Toast } from './Toast';
12
11
 
13
12
  type ActionTriggerProps = { altText: string; trigger: ReactNode };
@@ -45,10 +44,10 @@ const DefaultStory = ({ title, description, actionTriggers, openTrigger, closeTr
45
44
  };
46
45
 
47
46
  const meta = {
48
- title: 'ui/react-ui-core/Toast',
47
+ title: 'ui/react-ui-core/components/Toast',
49
48
  component: Toast as any,
50
49
  render: DefaultStory,
51
- decorators: [withTheme],
50
+ decorators: [withTheme()],
52
51
  } satisfies Meta<typeof DefaultStory>;
53
52
 
54
53
  export default meta;
@@ -4,49 +4,32 @@
4
4
 
5
5
  import { Primitive } from '@radix-ui/react-primitive';
6
6
  import { Slot } from '@radix-ui/react-slot';
7
- import {
8
- ToastAction as ToastActionPrimitive,
9
- type ToastActionProps as ToastActionPrimitiveProps,
10
- ToastClose as ToastClosePrimitive,
11
- type ToastCloseProps as ToastClosePrimitiveProps,
12
- ToastDescription as ToastDescriptionPrimitive,
13
- type ToastDescriptionProps as ToastDescriptionPrimitiveProps,
14
- ToastProvider as ToastProviderPrimitive,
15
- type ToastProviderProps as ToastProviderPrimitiveProps,
16
- Root as ToastRootPrimitive,
17
- type ToastProps as ToastRootPrimitiveProps,
18
- ToastTitle as ToastTitlePrimitive,
19
- type ToastTitleProps as ToastTitlePrimitiveProps,
20
- ToastViewport as ToastViewportPrimitive,
21
- type ToastViewportProps as ToastViewportPrimitiveProps,
22
- } from '@radix-ui/react-toast';
7
+ import * as ToastPrimitive from '@radix-ui/react-toast';
23
8
  import React, { type ComponentPropsWithRef, type FunctionComponent, forwardRef } from 'react';
24
9
 
25
10
  import { useThemeContext } from '../../hooks';
26
11
  import { type ThemedClassName } from '../../util';
27
12
  import { ElevationProvider } from '../ElevationProvider';
28
13
 
29
- type ToastProviderProps = ToastProviderPrimitiveProps;
14
+ type ToastProviderProps = ToastPrimitive.ToastProviderProps;
30
15
 
31
- const ToastProvider: FunctionComponent<ToastProviderProps> = ToastProviderPrimitive;
16
+ const ToastProvider: FunctionComponent<ToastProviderProps> = ToastPrimitive.Provider;
32
17
 
33
- type ToastViewportProps = ThemedClassName<ToastViewportPrimitiveProps>;
18
+ type ToastViewportProps = ThemedClassName<ToastPrimitive.ToastViewportProps>;
34
19
 
35
20
  const ToastViewport = forwardRef<HTMLOListElement, ToastViewportProps>(({ classNames, ...props }, forwardedRef) => {
36
21
  const { tx } = useThemeContext();
37
- return (
38
- <ToastViewportPrimitive className={tx('toast.viewport', 'toast-viewport', {}, classNames)} ref={forwardedRef} />
39
- );
22
+ return <ToastPrimitive.Viewport {...props} className={tx('toast.viewport', {}, classNames)} ref={forwardedRef} />;
40
23
  });
41
24
 
42
- type ToastRootProps = ThemedClassName<ToastRootPrimitiveProps>;
25
+ type ToastRootProps = ThemedClassName<ToastPrimitive.ToastProps>;
43
26
 
44
27
  const ToastRoot = forwardRef<HTMLLIElement, ToastRootProps>(({ classNames, children, ...props }, forwardedRef) => {
45
28
  const { tx } = useThemeContext();
46
29
  return (
47
- <ToastRootPrimitive {...props} className={tx('toast.root', 'toast', {}, classNames)} ref={forwardedRef}>
30
+ <ToastPrimitive.Root {...props} className={tx('toast.root', {}, classNames)} ref={forwardedRef}>
48
31
  <ElevationProvider elevation='toast'>{children}</ElevationProvider>
49
- </ToastRootPrimitive>
32
+ </ToastPrimitive.Root>
50
33
  );
51
34
  });
52
35
 
@@ -54,29 +37,27 @@ type ToastBodyProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.div
54
37
 
55
38
  const ToastBody = forwardRef<HTMLDivElement, ToastBodyProps>(({ asChild, classNames, ...props }, forwardedRef) => {
56
39
  const { tx } = useThemeContext();
57
- const Root = asChild ? Slot : Primitive.div;
58
- return <Root {...props} className={tx('toast.body', 'toast__body', {}, classNames)} ref={forwardedRef} />;
40
+ const Comp = asChild ? Slot : Primitive.div;
41
+ return <Comp {...props} className={tx('toast.body', {}, classNames)} ref={forwardedRef} />;
59
42
  });
60
43
 
61
- type ToastTitleProps = ThemedClassName<ToastTitlePrimitiveProps>;
44
+ type ToastTitleProps = ThemedClassName<ToastPrimitive.ToastTitleProps>;
62
45
 
63
46
  const ToastTitle = forwardRef<HTMLHeadingElement, ToastTitleProps>(
64
47
  ({ asChild, classNames, ...props }, forwardedRef) => {
65
48
  const { tx } = useThemeContext();
66
- const Root = asChild ? Slot : ToastTitlePrimitive;
67
- return <Root {...props} className={tx('toast.title', 'toast__title', {}, classNames)} ref={forwardedRef} />;
49
+ const Comp = asChild ? Slot : ToastPrimitive.Title;
50
+ return <Comp {...props} className={tx('toast.title', {}, classNames)} ref={forwardedRef} />;
68
51
  },
69
52
  );
70
53
 
71
- type ToastDescriptionProps = ThemedClassName<ToastDescriptionPrimitiveProps>;
54
+ type ToastDescriptionProps = ThemedClassName<ToastPrimitive.ToastDescriptionProps>;
72
55
 
73
56
  const ToastDescription = forwardRef<HTMLParagraphElement, ToastDescriptionProps>(
74
57
  ({ asChild, classNames, ...props }, forwardedRef) => {
75
58
  const { tx } = useThemeContext();
76
- const Root = asChild ? Slot : ToastDescriptionPrimitive;
77
- return (
78
- <Root {...props} className={tx('toast.description', 'toast__description', {}, classNames)} ref={forwardedRef} />
79
- );
59
+ const Comp = asChild ? Slot : ToastPrimitive.Description;
60
+ return <Comp {...props} className={tx('toast.description', {}, classNames)} ref={forwardedRef} />;
80
61
  },
81
62
  );
82
63
 
@@ -85,18 +66,18 @@ type ToastActionsProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.
85
66
  const ToastActions = forwardRef<HTMLDivElement, ToastActionsProps>(
86
67
  ({ asChild, classNames, ...props }, forwardedRef) => {
87
68
  const { tx } = useThemeContext();
88
- const Root = asChild ? Slot : Primitive.div;
89
- return <Root {...props} className={tx('toast.actions', 'toast__actions', {}, classNames)} ref={forwardedRef} />;
69
+ const Comp = asChild ? Slot : Primitive.div;
70
+ return <Comp {...props} className={tx('toast.actions', {}, classNames)} ref={forwardedRef} />;
90
71
  },
91
72
  );
92
73
 
93
- type ToastActionProps = ToastActionPrimitiveProps;
74
+ type ToastActionProps = ToastPrimitive.ToastActionProps;
94
75
 
95
- const ToastAction: FunctionComponent<ToastActionProps> = ToastActionPrimitive;
76
+ const ToastAction: FunctionComponent<ToastActionProps> = ToastPrimitive.Action;
96
77
 
97
- type ToastCloseProps = ToastClosePrimitiveProps;
78
+ type ToastCloseProps = ToastPrimitive.ToastCloseProps;
98
79
 
99
- const ToastClose: FunctionComponent<ToastCloseProps> = ToastClosePrimitive;
80
+ const ToastClose: FunctionComponent<ToastCloseProps> = ToastPrimitive.Close;
100
81
 
101
82
  export const Toast = {
102
83
  Provider: ToastProvider,