@dxos/react-ui 0.8.4-main.ef1bc66f44 → 0.8.4-main.f466a3d56e

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 (376) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/browser/chunk-A5QCIG5R.mjs +24 -0
  4. package/dist/lib/browser/chunk-A5QCIG5R.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-EJYV4HAH.mjs → chunk-LY5XDQR5.mjs} +189 -117
  6. package/dist/lib/browser/chunk-LY5XDQR5.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +3257 -2048
  8. package/dist/lib/browser/index.mjs.map +4 -4
  9. package/dist/lib/browser/meta.json +1 -1
  10. package/dist/lib/browser/testing/index.mjs +70 -41
  11. package/dist/lib/browser/testing/index.mjs.map +4 -4
  12. package/dist/lib/browser/translations.mjs +9 -0
  13. package/dist/lib/browser/translations.mjs.map +7 -0
  14. package/dist/lib/node-esm/{chunk-YTLZCZ2M.mjs → chunk-NGKLIKP3.mjs} +189 -117
  15. package/dist/lib/node-esm/chunk-NGKLIKP3.mjs.map +7 -0
  16. package/dist/lib/node-esm/chunk-XCFLA74M.mjs +26 -0
  17. package/dist/lib/node-esm/chunk-XCFLA74M.mjs.map +7 -0
  18. package/dist/lib/node-esm/index.mjs +3257 -2048
  19. package/dist/lib/node-esm/index.mjs.map +4 -4
  20. package/dist/lib/node-esm/meta.json +1 -1
  21. package/dist/lib/node-esm/testing/index.mjs +70 -41
  22. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  23. package/dist/lib/node-esm/translations.mjs +10 -0
  24. package/dist/lib/node-esm/translations.mjs.map +7 -0
  25. package/dist/types/src/components/Avatars/Avatar.d.ts +1 -1
  26. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  27. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  28. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  29. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  30. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  31. package/dist/types/src/components/Button/Button.d.ts +2 -2
  32. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  33. package/dist/types/src/components/Button/Button.stories.d.ts +1 -1
  34. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -1
  35. package/dist/types/src/components/Button/IconButton.d.ts +1 -0
  36. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  37. package/dist/types/src/components/Button/IconButton.stories.d.ts +3 -0
  38. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
  39. package/dist/types/src/components/Button/Toggle.d.ts +2 -2
  40. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -1
  41. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
  42. package/dist/types/src/components/Button/ToggleGroup.d.ts +6 -6
  43. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -1
  44. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +2 -2
  45. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
  46. package/dist/types/src/components/Card/Card.d.ts +124 -0
  47. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  48. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  49. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  50. package/dist/types/src/components/Card/index.d.ts +2 -0
  51. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  52. package/dist/types/src/components/Carousel/Carousel.d.ts +90 -0
  53. package/dist/types/src/components/Carousel/Carousel.d.ts.map +1 -0
  54. package/dist/types/src/components/Carousel/index.d.ts +2 -0
  55. package/dist/types/src/components/Carousel/index.d.ts.map +1 -0
  56. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  57. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  58. package/dist/types/src/components/Clipboard/index.d.ts +10 -1
  59. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  60. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  61. package/dist/types/src/components/Dialog/AlertDialog.d.ts +43 -23
  62. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  63. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  64. package/dist/types/src/components/Dialog/Dialog.d.ts +48 -30
  65. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  66. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +6 -8
  67. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  68. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  69. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  70. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  71. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  72. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  73. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +19 -0
  74. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  75. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  76. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  77. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  78. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  79. package/dist/types/src/components/Focus/Focus.d.ts +36 -0
  80. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -0
  81. package/dist/types/src/components/Focus/Focus.stories.d.ts +9 -0
  82. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -0
  83. package/dist/types/src/components/Focus/index.d.ts +2 -0
  84. package/dist/types/src/components/Focus/index.d.ts.map +1 -0
  85. package/dist/types/src/components/Icon/Icon.d.ts +4 -0
  86. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  87. package/dist/types/src/components/Icon/Icon.stories.d.ts +11 -3
  88. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/Image/Image.d.ts +15 -0
  90. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  91. package/dist/types/src/components/Image/Image.stories.d.ts +34 -0
  92. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  93. package/dist/types/src/components/Image/index.d.ts +2 -0
  94. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  95. package/dist/types/src/components/Input/Input.d.ts +16 -22
  96. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  97. package/dist/types/src/components/Input/Input.stories.d.ts +6 -6
  98. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  99. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  100. package/dist/types/src/components/List/List.d.ts +5 -3
  101. package/dist/types/src/components/List/List.d.ts.map +1 -1
  102. package/dist/types/src/components/List/List.stories.d.ts +3 -1
  103. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  104. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -1
  105. package/dist/types/src/components/List/Tree.d.ts +2 -2
  106. package/dist/types/src/components/List/Tree.d.ts.map +1 -1
  107. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
  108. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -1
  109. package/dist/types/src/components/List/Treegrid.d.ts +5 -9
  110. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  111. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
  112. package/dist/types/src/components/Main/Main.d.ts +11 -7
  113. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  114. package/dist/types/src/components/Main/Main.stories.d.ts +0 -3
  115. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  116. package/dist/types/src/components/Main/useSwipeToDismiss.d.ts.map +1 -1
  117. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +46 -0
  118. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -0
  119. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts +16 -0
  120. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts.map +1 -0
  121. package/dist/types/src/components/MediaPlayer/index.d.ts +2 -0
  122. package/dist/types/src/components/MediaPlayer/index.d.ts.map +1 -0
  123. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -1
  124. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -1
  125. package/dist/types/src/components/Menu/DropdownMenu.d.ts +58 -49
  126. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
  127. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +14 -1
  128. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
  129. package/dist/types/src/components/Message/Message.d.ts +1 -1
  130. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  131. package/dist/types/src/components/Message/Message.stories.d.ts +4 -5
  132. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  133. package/dist/types/src/components/Popover/Popover.d.ts +39 -22
  134. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  135. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  136. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +12 -11
  137. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  138. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +21 -10
  139. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  140. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +42 -13
  141. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  142. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +9 -5
  143. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  144. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  145. package/dist/types/src/components/Select/Select.stories.d.ts +2 -2
  146. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  147. package/dist/types/src/components/Separator/Separator.d.ts +3 -3
  148. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  149. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -1
  150. package/dist/types/src/components/Splitter/Splitter.d.ts +23 -15
  151. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -1
  152. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -1
  153. package/dist/types/src/components/Status/Status.d.ts +3 -4
  154. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  155. package/dist/types/src/components/Status/Status.stories.d.ts +4 -2
  156. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  157. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  158. package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
  159. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  160. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +1 -1
  161. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  162. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts +12 -0
  163. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  164. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +54 -55
  165. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  166. package/dist/types/src/components/ThemeProvider/index.d.ts +1 -1
  167. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  168. package/dist/types/src/components/Toast/Toast.d.ts +16 -16
  169. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  170. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  171. package/dist/types/src/components/Toolbar/Toolbar.d.ts +32 -15
  172. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  173. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  174. package/dist/types/src/components/Tooltip/Tooltip.d.ts +16 -16
  175. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  176. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +2 -2
  177. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  178. package/dist/types/src/components/index.d.ts +9 -4
  179. package/dist/types/src/components/index.d.ts.map +1 -1
  180. package/dist/types/src/exemplars/generics.stories.d.ts +8 -6
  181. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -1
  182. package/dist/types/src/exemplars/slot.stories.d.ts +1 -0
  183. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -1
  184. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -1
  185. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  186. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  187. package/dist/types/src/hooks/index.d.ts +1 -0
  188. package/dist/types/src/hooks/index.d.ts.map +1 -1
  189. package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
  190. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  191. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  192. package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
  193. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  194. package/dist/types/src/hooks/useSafeCollisionPadding.d.ts.map +1 -1
  195. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  196. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  197. package/dist/types/src/playground/Custom.stories.d.ts +1 -1
  198. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  199. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  200. package/dist/types/src/primitives/Column/Column.d.ts +33 -0
  201. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  202. package/dist/types/src/primitives/Column/Column.stories.d.ts +25 -0
  203. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  204. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  205. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  206. package/dist/types/src/primitives/Container/Container.d.ts +6 -22
  207. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -1
  208. package/dist/types/src/primitives/Container/Container.stories.d.ts +2 -7
  209. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -1
  210. package/dist/types/src/primitives/Container/index.d.ts +0 -1
  211. package/dist/types/src/primitives/Container/index.d.ts.map +1 -1
  212. package/dist/types/src/primitives/Flex/Flex.d.ts +8 -5
  213. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -1
  214. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  215. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  216. package/dist/types/src/primitives/Grid/Grid.d.ts +10 -0
  217. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  218. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  219. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  220. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  221. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  222. package/dist/types/src/primitives/Panel/Panel.d.ts +35 -0
  223. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  224. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  225. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  226. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  227. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  228. package/dist/types/src/primitives/index.d.ts +3 -0
  229. package/dist/types/src/primitives/index.d.ts.map +1 -1
  230. package/dist/types/src/testing/Loading.d.ts +9 -0
  231. package/dist/types/src/testing/Loading.d.ts.map +1 -0
  232. package/dist/types/src/testing/decorators/withLayout.d.ts +1 -1
  233. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  234. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  235. package/dist/types/src/testing/decorators/withTheme.d.ts +1 -1
  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 +16 -0
  240. package/dist/types/src/translations.d.ts.map +1 -0
  241. package/dist/types/src/util/usePx.d.ts.map +1 -1
  242. package/dist/types/tsconfig.tsbuildinfo +1 -1
  243. package/package.json +34 -27
  244. package/src/components/Avatars/Avatar.stories.tsx +5 -7
  245. package/src/components/Avatars/Avatar.tsx +6 -14
  246. package/src/components/Avatars/AvatarGroup.stories.tsx +0 -1
  247. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -2
  248. package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
  249. package/src/components/Button/Button.stories.tsx +1 -2
  250. package/src/components/Button/Button.tsx +11 -25
  251. package/src/components/Button/IconButton.stories.tsx +6 -4
  252. package/src/components/Button/IconButton.tsx +3 -4
  253. package/src/components/Button/Toggle.stories.tsx +0 -1
  254. package/src/components/Button/Toggle.tsx +4 -4
  255. package/src/components/Button/ToggleGroup.stories.tsx +0 -1
  256. package/src/components/Button/ToggleGroup.tsx +12 -16
  257. package/src/components/Card/Card.stories.tsx +151 -0
  258. package/src/components/Card/Card.tsx +514 -0
  259. package/src/components/Card/index.ts +5 -0
  260. package/src/components/Carousel/Carousel.tsx +337 -0
  261. package/src/components/Carousel/index.ts +5 -0
  262. package/src/components/Clipboard/CopyButton.tsx +6 -7
  263. package/src/components/Dialog/AlertDialog.stories.tsx +14 -15
  264. package/src/components/Dialog/AlertDialog.tsx +123 -82
  265. package/src/components/Dialog/Dialog.stories.tsx +90 -14
  266. package/src/components/Dialog/Dialog.tsx +98 -113
  267. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +45 -0
  268. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  269. package/src/components/ErrorFallback/ErrorStack.tsx +114 -0
  270. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  271. package/src/components/ErrorFallback/index.ts +9 -0
  272. package/src/components/Focus/AUDIT.md +43 -0
  273. package/src/components/Focus/Focus.stories.tsx +230 -0
  274. package/src/components/Focus/Focus.tsx +201 -0
  275. package/src/components/Focus/index.ts +5 -0
  276. package/src/components/Icon/Icon.stories.tsx +43 -13
  277. package/src/components/Icon/Icon.tsx +14 -3
  278. package/src/components/Image/Image.stories.tsx +86 -0
  279. package/src/components/Image/Image.tsx +246 -0
  280. package/src/components/Image/index.ts +5 -0
  281. package/src/components/Input/Input.stories.tsx +17 -38
  282. package/src/components/Input/Input.tsx +27 -71
  283. package/src/components/Link/Link.stories.tsx +0 -1
  284. package/src/components/Link/Link.tsx +2 -2
  285. package/src/components/List/List.stories.tsx +14 -22
  286. package/src/components/List/List.tsx +16 -20
  287. package/src/components/List/ListDropIndicator.tsx +7 -8
  288. package/src/components/List/Tree.stories.tsx +4 -5
  289. package/src/components/List/Tree.tsx +0 -1
  290. package/src/components/List/TreeDropIndicator.tsx +6 -6
  291. package/src/components/List/Treegrid.stories.tsx +27 -28
  292. package/src/components/List/Treegrid.tsx +22 -27
  293. package/src/components/Main/Main.stories.tsx +3 -7
  294. package/src/components/Main/Main.tsx +57 -48
  295. package/src/components/MediaPlayer/MediaPlayer.stories.tsx +50 -0
  296. package/src/components/MediaPlayer/MediaPlayer.tsx +153 -0
  297. package/src/components/MediaPlayer/index.ts +5 -0
  298. package/src/components/Menu/ContextMenu.stories.tsx +0 -1
  299. package/src/components/Menu/ContextMenu.tsx +9 -33
  300. package/src/components/Menu/DropdownMenu.stories.tsx +0 -1
  301. package/src/components/Menu/DropdownMenu.tsx +58 -52
  302. package/src/components/Message/Message.stories.tsx +25 -11
  303. package/src/components/Message/Message.tsx +30 -29
  304. package/src/components/Popover/Popover.stories.tsx +5 -6
  305. package/src/components/Popover/Popover.tsx +62 -59
  306. package/src/components/ScrollArea/ScrollArea.stories.tsx +98 -39
  307. package/src/components/ScrollArea/ScrollArea.tsx +45 -33
  308. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +46 -25
  309. package/src/components/ScrollContainer/ScrollContainer.tsx +199 -92
  310. package/src/components/Select/Select.stories.tsx +5 -6
  311. package/src/components/Select/Select.tsx +11 -27
  312. package/src/components/Separator/Separator.tsx +5 -8
  313. package/src/components/Skeleton/Skeleton.stories.tsx +12 -13
  314. package/src/components/Skeleton/Skeleton.tsx +1 -1
  315. package/src/components/Splitter/Splitter.stories.tsx +47 -37
  316. package/src/components/Splitter/Splitter.tsx +44 -40
  317. package/src/components/Status/Status.stories.tsx +19 -16
  318. package/src/components/Status/Status.tsx +10 -7
  319. package/src/components/Tag/Tag.stories.tsx +3 -9
  320. package/src/components/Tag/Tag.tsx +2 -7
  321. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +31 -0
  322. package/src/components/ThemeProvider/ThemeProvider.tsx +8 -7
  323. package/src/components/ThemeProvider/index.ts +1 -1
  324. package/src/components/Toast/Toast.stories.tsx +0 -1
  325. package/src/components/Toast/Toast.tsx +22 -41
  326. package/src/components/Toolbar/Toolbar.stories.tsx +0 -1
  327. package/src/components/Toolbar/Toolbar.tsx +175 -30
  328. package/src/components/Tooltip/Tooltip.stories.tsx +18 -17
  329. package/src/components/Tooltip/Tooltip.tsx +32 -31
  330. package/src/components/index.ts +10 -5
  331. package/src/exemplars/generics.stories.tsx +12 -15
  332. package/src/exemplars/slot.stories.tsx +68 -61
  333. package/src/exemplars/tabster.stories.tsx +5 -5
  334. package/src/exemplars/virtualizer.stories.tsx +136 -0
  335. package/src/hooks/index.ts +1 -0
  336. package/src/hooks/useDensityContext.ts +2 -2
  337. package/src/playground/Controls.stories.tsx +0 -6
  338. package/src/playground/Custom.stories.tsx +13 -16
  339. package/src/playground/Typography.stories.tsx +1 -1
  340. package/src/primitives/Column/AUDIT.md +148 -0
  341. package/src/primitives/Column/Column.stories.tsx +181 -0
  342. package/src/primitives/Column/Column.tsx +165 -0
  343. package/src/primitives/Column/index.ts +5 -0
  344. package/src/primitives/Container/Container.stories.tsx +13 -51
  345. package/src/primitives/Container/Container.tsx +14 -77
  346. package/src/primitives/Container/index.ts +0 -1
  347. package/src/primitives/Flex/Flex.stories.tsx +57 -0
  348. package/src/primitives/Flex/Flex.tsx +20 -19
  349. package/src/primitives/Grid/Grid.stories.tsx +56 -0
  350. package/src/primitives/Grid/Grid.tsx +30 -0
  351. package/src/primitives/Grid/index.ts +5 -0
  352. package/src/primitives/Panel/Panel.stories.tsx +68 -0
  353. package/src/primitives/Panel/Panel.tsx +120 -0
  354. package/src/primitives/Panel/index.ts +5 -0
  355. package/src/primitives/index.ts +3 -0
  356. package/src/testing/Loading.tsx +47 -0
  357. package/src/testing/decorators/withLayout.tsx +15 -11
  358. package/src/testing/decorators/withLayoutVariants.tsx +18 -21
  359. package/src/testing/decorators/withTheme.tsx +10 -7
  360. package/src/testing/index.ts +2 -0
  361. package/src/translations.ts +24 -0
  362. package/src/util/usePx.ts +1 -0
  363. package/dist/lib/browser/chunk-EJYV4HAH.mjs.map +0 -7
  364. package/dist/lib/node-esm/chunk-YTLZCZ2M.mjs.map +0 -7
  365. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -22
  366. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  367. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  368. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  369. package/dist/types/src/primitives/Container/Layout.d.ts +0 -18
  370. package/dist/types/src/primitives/Container/Layout.d.ts.map +0 -1
  371. package/dist/types/src/primitives/Container/Layout.stories.d.ts +0 -10
  372. package/dist/types/src/primitives/Container/Layout.stories.d.ts.map +0 -1
  373. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -67
  374. package/src/components/AnchoredOverflow/index.ts +0 -5
  375. package/src/primitives/Container/Layout.stories.tsx +0 -57
  376. package/src/primitives/Container/Layout.tsx +0 -61
@@ -1,25 +1,22 @@
1
1
  //
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
- import {
5
- Separator as SeparatorPrimitive,
6
- type SeparatorProps as SeparatorPrimitiveProps,
7
- } from '@radix-ui/react-separator';
4
+ import * as SeparatorPrimitive from '@radix-ui/react-separator';
8
5
  import React, { forwardRef } from 'react';
9
6
 
10
7
  import { useThemeContext } from '../../hooks';
11
8
  import { type ThemedClassName } from '../../util';
12
9
 
13
- type SeparatorProps = ThemedClassName<SeparatorPrimitiveProps> & { subdued?: boolean };
10
+ type SeparatorProps = ThemedClassName<SeparatorPrimitive.SeparatorProps> & { subdued?: boolean };
14
11
 
15
12
  const Separator = forwardRef<HTMLDivElement, SeparatorProps>(
16
13
  ({ classNames, orientation = 'horizontal', subdued, ...props }, forwardedRef) => {
17
14
  const { tx } = useThemeContext();
18
15
  return (
19
- <SeparatorPrimitive
20
- orientation={orientation}
16
+ <SeparatorPrimitive.Root
21
17
  {...props}
22
- className={tx('separator.root', 'separator', { orientation, subdued }, classNames)}
18
+ orientation={orientation}
19
+ className={tx('separator.root', { orientation, subdued }, classNames)}
23
20
  ref={forwardedRef}
24
21
  />
25
22
  );
@@ -5,7 +5,6 @@
5
5
  import React from 'react';
6
6
 
7
7
  import { withTheme } from '../../testing';
8
-
9
8
  import { Skeleton } from './Skeleton';
10
9
 
11
10
  export default {
@@ -19,12 +18,12 @@ export default {
19
18
 
20
19
  export const Default = {
21
20
  render: () => (
22
- <div className='flex flex-col gap-4 p-4 border border-separator rounded-sm'>
23
- <div className='flex is-fit items-center gap-4'>
21
+ <div className='flex flex-col gap-4 p-4 border border-separator rounded-xs'>
22
+ <div className='flex w-fit items-center gap-4'>
24
23
  <Skeleton classNames='size-10 shrink-0 rounded-full' />
25
24
  <div className='grid gap-2'>
26
- <Skeleton classNames='bs-4 is-[150px]' />
27
- <Skeleton classNames='bs-4 is-[100px]' />
25
+ <Skeleton classNames='h-4 w-[150px]' />
26
+ <Skeleton classNames='h-4 w-[100px]' />
28
27
  </div>
29
28
  </div>
30
29
  </div>
@@ -33,19 +32,19 @@ export const Default = {
33
32
 
34
33
  export const Card = {
35
34
  render: () => (
36
- <div className='flex flex-col gap-3 is-96 p-4 border border-separator rounded-sm'>
35
+ <div className='flex flex-col gap-3 w-96 p-4 border border-separator rounded-xs'>
37
36
  <div className='flex items-center gap-3'>
38
- <Skeleton variant='circle' classNames='bs-12 is-12 rounded-full' />
37
+ <Skeleton variant='circle' classNames='h-12 w-12 rounded-full' />
39
38
  <div className='flex flex-col gap-2 flex-1'>
40
- <Skeleton classNames='bs-4 is-24' />
41
- <Skeleton classNames='bs-3 is-32' />
39
+ <Skeleton classNames='h-4 w-24' />
40
+ <Skeleton classNames='h-3 w-32' />
42
41
  </div>
43
42
  </div>
44
- <Skeleton classNames='bs-32 is-full rounded' />
43
+ <Skeleton classNames='h-32 w-full rounded-sm' />
45
44
  <div className='flex flex-col gap-2'>
46
- <Skeleton classNames='bs-3 is-full' />
47
- <Skeleton classNames='bs-3 is-5/6' />
48
- <Skeleton classNames='bs-3 is-4/6' />
45
+ <Skeleton classNames='h-3 w-full' />
46
+ <Skeleton classNames='h-3 w-5/6' />
47
+ <Skeleton classNames='h-3 w-4/6' />
49
48
  </div>
50
49
  </div>
51
50
  ),
@@ -17,7 +17,7 @@ type SkeletonProps = ThemedClassName<ComponentPropsWithRef<'div'>> & {
17
17
  const Skeleton = forwardRef<HTMLDivElement, SkeletonProps>(
18
18
  ({ classNames, variant = 'default', ...props }, forwardedRef) => {
19
19
  const { tx } = useThemeContext();
20
- return <div {...props} className={tx('skeleton.root', 'skeleton', { variant }, classNames)} ref={forwardedRef} />;
20
+ return <div {...props} className={tx('skeleton.root', { variant }, classNames)} ref={forwardedRef} />;
21
21
  },
22
22
  );
23
23
 
@@ -3,51 +3,61 @@
3
3
  //
4
4
 
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
- import React, { useState } from 'react';
6
+ import React, { type ComponentPropsWithoutRef, forwardRef, useState } from 'react';
7
7
 
8
- import { Layout } from '../../primitives';
8
+ import { Panel } from '../../primitives';
9
9
  import { withLayout, withTheme } from '../../testing';
10
10
  import { ScrollArea } from '../ScrollArea';
11
11
  import { Toolbar } from '../Toolbar';
12
-
13
12
  import { Splitter, type SplitterRootProps } from './Splitter';
14
13
 
15
- const Panel = ({ label }: { label: string }) => {
16
- return (
17
- <Layout.Main toolbar>
18
- <Toolbar.Root>{label}</Toolbar.Root>
19
- <ScrollArea.Root orientation='vertical'>
20
- <ScrollArea.Viewport>
21
- {Array.from({ length: 100 }).map((_, i) => (
22
- <div key={i} className='p-1'>
23
- {label}-{i}
24
- </div>
25
- ))}
26
- </ScrollArea.Viewport>
27
- </ScrollArea.Root>
28
- </Layout.Main>
29
- );
30
- };
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
+ );
31
34
 
32
35
  const DefaultStory = (props: SplitterRootProps) => {
33
- const [mode, setMode] = useState(props.mode ?? 'both');
36
+ const [mode, setMode] = useState(props.mode ?? 'split');
37
+ const [ratio, setRatio] = useState(props.ratio ?? 0.5);
34
38
 
35
39
  return (
36
- <div className='grid grid-rows-[min-content_1fr] bs-full overflow-hidden'>
37
- <Toolbar.Root>
38
- <Toolbar.Button onClick={() => setMode('upper')}>A</Toolbar.Button>
39
- <Toolbar.Button onClick={() => setMode('both')}>A + B</Toolbar.Button>
40
- <Toolbar.Button onClick={() => setMode('lower')}>B</Toolbar.Button>
41
- </Toolbar.Root>
42
- <Splitter.Root mode={mode} ratio={props.ratio} classNames='divide-y divide-subduedSeparator'>
43
- <Splitter.Panel position='upper'>
44
- <Panel label='A' />
45
- </Splitter.Panel>
46
- <Splitter.Panel position='lower'>
47
- <Panel label='B' />
48
- </Splitter.Panel>
49
- </Splitter.Root>
50
- </div>
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>
51
61
  );
52
62
  };
53
63
 
@@ -67,7 +77,7 @@ type Story = StoryObj<SplitterRootProps>;
67
77
 
68
78
  export const Default: Story = {
69
79
  args: {
70
- mode: 'both',
71
- ratio: 0.5,
80
+ mode: 'split',
81
+ ratio: 0.4,
72
82
  },
73
83
  };
@@ -3,22 +3,23 @@
3
3
  //
4
4
 
5
5
  import { createContextScope } from '@radix-ui/react-context';
6
- import React, { type ComponentPropsWithoutRef, forwardRef } from 'react';
6
+ import { Primitive } from '@radix-ui/react-primitive';
7
+ import { Slot } from '@radix-ui/react-slot';
8
+ import React from 'react';
7
9
 
8
- import { mx } from '@dxos/ui-theme';
10
+ import { composableProps, slottable } from '@dxos/ui-theme';
9
11
 
10
- import { type ThemedClassName } from '../../util';
12
+ import { useThemeContext } from '../../hooks';
13
+ import { ThemedClassName } from '../../util';
11
14
 
12
15
  type ScopedProps<P> = P & { __scopeSplitter?: any };
13
16
 
14
- // TODO(burdon): Generalize styles.
15
- // TODO(burdon): Enalbe resize.
16
17
  // TODO(burdon): Generalize horizontal/vertical and change to start/end.
17
- type Mode = 'upper' | 'lower' | 'both';
18
+ type Mode = 'top' | 'bottom' | 'split';
18
19
 
19
20
  type SplitterContextValue = {
20
21
  mode: Mode;
21
- ratio: number;
22
+ ratio?: number;
22
23
  transition: number;
23
24
  };
24
25
 
@@ -34,23 +35,22 @@ const [SplitterProvider, useSplitterContext] = createSplitterContext<SplitterCon
34
35
 
35
36
  const ROOT_NAME = 'Splitter.Root';
36
37
 
37
- type RootProps = ThemedClassName<ComponentPropsWithoutRef<'div'>> & Partial<SplitterContextValue>;
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;
38
48
 
39
- const Root = forwardRef<HTMLDivElement, ScopedProps<RootProps>>(
40
- (
41
- { __scopeSplitter, classNames, mode = 'upper', ratio = 0.5, transition = 250, children, ...rootProps },
42
- forwardedRef,
43
- ) => {
44
49
  return (
45
50
  <SplitterProvider scope={__scopeSplitter} mode={mode} ratio={ratio} transition={transition}>
46
- <div
47
- role='none'
48
- {...rootProps}
49
- ref={forwardedRef}
50
- className={mx('relative bs-full overflow-hidden', classNames)}
51
- >
51
+ <Comp {...restProps} ref={forwardedRef} className={tx('splitter.root', {}, className)}>
52
52
  {children}
53
- </div>
53
+ </Comp>
54
54
  </SplitterProvider>
55
55
  );
56
56
  },
@@ -64,45 +64,49 @@ Root.displayName = ROOT_NAME;
64
64
 
65
65
  const PANEL_NAME = 'Splitter.Panel';
66
66
 
67
- interface PanelProps extends ThemedClassName<ComponentPropsWithoutRef<'div'>> {
68
- position: 'upper' | 'lower';
69
- }
67
+ type PanelOwnProps = ThemedClassName<{
68
+ position: 'top' | 'bottom';
69
+ }>;
70
70
 
71
- const Panel = forwardRef<HTMLDivElement, ScopedProps<PanelProps>>(
72
- ({ __scopeSplitter, classNames, children, position, style, ...panelProps }, forwardedRef) => {
73
- const context = useSplitterContext(PANEL_NAME, __scopeSplitter);
74
- const { mode, ratio, transition } = context;
71
+ type PanelProps = PanelOwnProps;
75
72
 
76
- // Calculate position and height based on mode and ratio.
77
- const isUpper = position === 'upper';
78
- const top = isUpper ? '0%' : mode === 'upper' ? '100%' : mode === 'lower' ? '0%' : `${ratio * 100}%`;
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);
79
80
 
80
- const height = isUpper
81
- ? mode === 'upper'
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'
82
86
  ? '100%'
83
- : mode === 'lower'
87
+ : mode === 'bottom'
84
88
  ? '0%'
85
89
  : `${ratio * 100}%`
86
- : mode === 'lower'
90
+ : mode === 'bottom'
87
91
  ? '100%'
88
- : mode === 'upper'
92
+ : mode === 'top'
89
93
  ? '0%'
90
94
  : `${(1 - ratio) * 100}%`;
91
95
 
92
96
  return (
93
- <div
94
- {...panelProps}
97
+ <Comp
98
+ {...restProps}
95
99
  ref={forwardedRef}
96
- className={mx('absolute inset-inline-0 flex flex-col overflow-hidden', classNames)}
100
+ className={tx('splitter.panel', {}, className)}
97
101
  style={{
98
- top,
102
+ top: topOffset,
99
103
  height,
100
104
  transition: `top ${transition}ms, height ${transition}ms ease-out`,
101
105
  ...style,
102
106
  }}
103
107
  >
104
108
  {children}
105
- </div>
109
+ </Comp>
106
110
  );
107
111
  },
108
112
  );
@@ -6,7 +6,6 @@ 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 = {
@@ -19,21 +18,25 @@ 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}
@@ -8,8 +8,7 @@ import React from 'react';
8
8
  import { hues } from '@dxos/ui-theme';
9
9
  import { type ChromaticPalette, type MessageValence } from '@dxos/ui-types';
10
10
 
11
- import { withTheme } from '../../testing';
12
-
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)[];
@@ -18,7 +17,7 @@ const meta = {
18
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;
@@ -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 = {};
@@ -11,7 +11,6 @@ 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
16
  export type ThemeContextValue = {
@@ -40,10 +39,11 @@ export const ThemeProvider = ({
40
39
  fallback = null,
41
40
  resourceExtensions,
42
41
  appNs,
43
- tx = (_path, defaultClassName, _styleProps, ..._options) => defaultClassName,
42
+ tx = (_path, _styleProps, ..._options) => undefined,
44
43
  themeMode = 'dark',
45
44
  rootDensity = 'fine',
46
- ...rest
45
+ noCache,
46
+ platform,
47
47
  }: ThemeProviderProps) => {
48
48
  useEffect(() => {
49
49
  if (document.defaultView) {
@@ -54,9 +54,10 @@ export const ThemeProvider = ({
54
54
  }, []);
55
55
 
56
56
  const safeAreaPadding = useSafeArea();
57
+ // Destructure all props explicitly so useMemo deps are stable primitives, not a new `rest` object every render.
57
58
  const contextValue = useMemo(
58
- () => ({ tx, themeMode, hasIosKeyboard: hasIosKeyboard(), safeAreaPadding, ...rest }),
59
- [tx, themeMode, safeAreaPadding, rest],
59
+ () => ({ tx, themeMode, hasIosKeyboard: hasIosKeyboard(), safeAreaPadding, noCache, platform }),
60
+ [tx, themeMode, safeAreaPadding, noCache, platform],
60
61
  );
61
62
 
62
63
  return (
@@ -78,8 +79,8 @@ export const ThemeProvider = ({
78
79
 
79
80
  const handleInputModalityChange = (isUsingKeyboard: boolean) => {
80
81
  if (isUsingKeyboard) {
81
- document.body.setAttribute('data-is-keyboard', 'true');
82
+ document.body.setAttribute('data-w-keyboard', 'true');
82
83
  } else {
83
- document.body.removeAttribute('data-is-keyboard');
84
+ document.body.removeAttribute('data-w-keyboard');
84
85
  }
85
86
  };
@@ -2,7 +2,7 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- export { type Label, isLabel, toLocalizedString } from '@dxos/ui-types';
5
+ export { type Label, isLabel, toLocalizedString } from '@dxos/ui-types/translations';
6
6
 
7
7
  export * from './ThemeProvider';
8
8
  export { useTranslation } from './TranslationsProvider';
@@ -7,7 +7,6 @@ import React, { type ReactNode, useState } from 'react';
7
7
 
8
8
  import { withTheme } from '../../testing';
9
9
  import { Button } from '../Button';
10
-
11
10
  import { Toast } from './Toast';
12
11
 
13
12
  type ActionTriggerProps = { altText: string; trigger: ReactNode };