@dxos/react-ui 0.8.4-main.70d3990 → 0.8.4-main.74a063c4e0

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 (382) hide show
  1. package/dist/lib/browser/chunk-KRSEIVRM.mjs +776 -0
  2. package/dist/lib/browser/chunk-KRSEIVRM.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +4157 -67
  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 +74 -63
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/chunk-ENYC4TYH.mjs +778 -0
  9. package/dist/lib/node-esm/chunk-ENYC4TYH.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +4157 -67
  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 +74 -63
  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/Button/Button.d.ts +3 -3
  22. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  23. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -1
  24. package/dist/types/src/components/Button/IconButton.d.ts +2 -1
  25. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  26. package/dist/types/src/components/Button/IconButton.stories.d.ts +3 -0
  27. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
  28. package/dist/types/src/components/Button/Toggle.d.ts +2 -2
  29. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -1
  30. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
  31. package/dist/types/src/components/Button/ToggleGroup.d.ts +10 -10
  32. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -1
  33. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +4 -4
  34. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
  35. package/dist/types/src/components/Card/Card.d.ts +150 -0
  36. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  37. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  38. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  39. package/dist/types/src/components/Card/index.d.ts +2 -0
  40. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  41. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  42. package/dist/types/src/components/Clipboard/index.d.ts +10 -1
  43. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  44. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  45. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  46. package/dist/types/src/components/Dialog/AlertDialog.d.ts +41 -19
  47. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  48. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  49. package/dist/types/src/components/Dialog/Dialog.d.ts +56 -21
  50. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  51. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +10 -10
  52. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  53. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  54. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  55. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  56. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  57. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  58. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  59. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +8 -0
  60. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  61. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  62. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  63. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  64. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  65. package/dist/types/src/components/Focus/Focus.d.ts +44 -0
  66. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -0
  67. package/dist/types/src/components/Focus/Focus.stories.d.ts +9 -0
  68. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -0
  69. package/dist/types/src/components/Focus/index.d.ts +2 -0
  70. package/dist/types/src/components/Focus/index.d.ts.map +1 -0
  71. package/dist/types/src/components/Icon/Icon.d.ts +4 -1
  72. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  73. package/dist/types/src/components/Icon/Icon.stories.d.ts +11 -3
  74. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  75. package/dist/types/src/components/Image/Image.d.ts +14 -0
  76. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  77. package/dist/types/src/components/Image/Image.stories.d.ts +33 -0
  78. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  79. package/dist/types/src/components/Image/index.d.ts +2 -0
  80. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  81. package/dist/types/src/components/Input/Input.d.ts +7 -7
  82. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  83. package/dist/types/src/components/Input/Input.stories.d.ts +8 -8
  84. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  85. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  86. package/dist/types/src/components/List/List.d.ts +10 -4
  87. package/dist/types/src/components/List/List.d.ts.map +1 -1
  88. package/dist/types/src/components/List/List.stories.d.ts +8 -2
  89. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  90. package/dist/types/src/components/List/Tree.d.ts.map +1 -1
  91. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
  92. package/dist/types/src/components/List/Treegrid.d.ts +9 -9
  93. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  94. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
  95. package/dist/types/src/components/Main/Main.d.ts +9 -10
  96. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  97. package/dist/types/src/components/Main/Main.stories.d.ts +0 -3
  98. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  99. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  100. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  101. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  102. package/dist/types/src/components/{Menus → Menu}/DropdownMenu.d.ts +52 -51
  103. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  104. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +28 -0
  105. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  106. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  107. package/dist/types/src/components/Message/Message.d.ts +1 -1
  108. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  109. package/dist/types/src/components/Message/Message.stories.d.ts +5 -6
  110. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  111. package/dist/types/src/components/Popover/Popover.d.ts +33 -24
  112. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  113. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  114. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +32 -24
  115. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  116. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +65 -8
  117. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  118. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +48 -13
  119. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  120. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +10 -5
  121. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  122. package/dist/types/src/components/Select/Select.d.ts +9 -9
  123. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  124. package/dist/types/src/components/Select/Select.stories.d.ts +2 -2
  125. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  126. package/dist/types/src/components/Separator/Separator.d.ts +4 -4
  127. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  128. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  129. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  130. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  131. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  132. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  133. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  134. package/dist/types/src/components/Splitter/Splitter.d.ts +42 -0
  135. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  136. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  137. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  138. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  139. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  140. package/dist/types/src/components/Status/Status.d.ts +3 -4
  141. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  142. package/dist/types/src/components/Status/Status.stories.d.ts +4 -2
  143. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  144. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  145. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  146. package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
  147. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  148. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +3 -3
  149. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  150. package/dist/types/src/components/{Menus/DropdownMenu.stories.d.ts → ThemeProvider/ThemeProvider.stories.d.ts} +2 -5
  151. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  152. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
  153. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  154. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  155. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  156. package/dist/types/src/components/Toast/Toast.d.ts +19 -19
  157. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  158. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  159. package/dist/types/src/components/Toolbar/Toolbar.d.ts +43 -17
  160. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  161. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  162. package/dist/types/src/components/Tooltip/Tooltip.d.ts +9 -9
  163. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  164. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +2 -2
  165. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  166. package/dist/types/src/components/index.d.ts +10 -5
  167. package/dist/types/src/components/index.d.ts.map +1 -1
  168. package/dist/types/src/exemplars/generics.stories.d.ts +23 -0
  169. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  170. package/dist/types/src/exemplars/slot.stories.d.ts +15 -0
  171. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  172. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  173. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  174. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  175. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  176. package/dist/types/src/hooks/index.d.ts +1 -0
  177. package/dist/types/src/hooks/index.d.ts.map +1 -1
  178. package/dist/types/src/hooks/useDensityContext.d.ts +2 -2
  179. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  180. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  181. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  182. package/dist/types/src/index.d.ts +2 -1
  183. package/dist/types/src/index.d.ts.map +1 -1
  184. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  185. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  186. package/dist/types/src/primitives/Column/Column.d.ts +51 -0
  187. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  188. package/dist/types/src/primitives/Column/Column.stories.d.ts +25 -0
  189. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  190. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  191. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  192. package/dist/types/src/primitives/Container/Container.d.ts +11 -0
  193. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  194. package/dist/types/src/primitives/Container/Container.stories.d.ts +6 -0
  195. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  196. package/dist/types/src/primitives/Container/index.d.ts +2 -0
  197. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  198. package/dist/types/src/primitives/Flex/Flex.d.ts +15 -0
  199. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  200. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  201. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  202. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  203. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  204. package/dist/types/src/primitives/Grid/Grid.d.ts +14 -0
  205. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  206. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  207. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  208. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  209. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  210. package/dist/types/src/primitives/Panel/Panel.d.ts +51 -0
  211. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  212. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  213. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  214. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  215. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  216. package/dist/types/src/primitives/index.d.ts +6 -0
  217. package/dist/types/src/primitives/index.d.ts.map +1 -0
  218. package/dist/types/src/testing/Loading.d.ts +9 -0
  219. package/dist/types/src/testing/Loading.d.ts.map +1 -0
  220. package/dist/types/src/testing/decorators/withLayout.d.ts +3 -3
  221. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  222. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +1 -1
  223. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  224. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  225. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  226. package/dist/types/src/testing/index.d.ts +1 -0
  227. package/dist/types/src/testing/index.d.ts.map +1 -1
  228. package/dist/types/src/translations.d.ts +11 -0
  229. package/dist/types/src/translations.d.ts.map +1 -0
  230. package/dist/types/src/util/index.d.ts +1 -2
  231. package/dist/types/src/util/index.d.ts.map +1 -1
  232. package/dist/types/src/util/usePx.d.ts.map +1 -1
  233. package/dist/types/tsconfig.tsbuildinfo +1 -1
  234. package/package.json +42 -32
  235. package/src/components/Avatars/Avatar.stories.tsx +7 -9
  236. package/src/components/Avatars/Avatar.tsx +7 -15
  237. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -3
  238. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +3 -4
  239. package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
  240. package/src/components/Button/Button.stories.tsx +3 -4
  241. package/src/components/Button/Button.tsx +12 -26
  242. package/src/components/Button/IconButton.stories.tsx +8 -6
  243. package/src/components/Button/IconButton.tsx +9 -6
  244. package/src/components/Button/Toggle.stories.tsx +2 -3
  245. package/src/components/Button/Toggle.tsx +4 -4
  246. package/src/components/Button/ToggleGroup.stories.tsx +2 -3
  247. package/src/components/Button/ToggleGroup.tsx +12 -16
  248. package/src/components/Card/Card.stories.tsx +151 -0
  249. package/src/components/Card/Card.tsx +492 -0
  250. package/src/components/Card/index.ts +5 -0
  251. package/src/components/Clipboard/CopyButton.tsx +7 -8
  252. package/src/components/DensityProvider/DensityProvider.tsx +1 -1
  253. package/src/components/Dialog/AlertDialog.stories.tsx +16 -17
  254. package/src/components/Dialog/AlertDialog.tsx +123 -82
  255. package/src/components/Dialog/Dialog.stories.tsx +138 -28
  256. package/src/components/Dialog/Dialog.tsx +197 -71
  257. package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
  258. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +45 -0
  259. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  260. package/src/components/ErrorFallback/ErrorStack.tsx +80 -0
  261. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  262. package/src/components/ErrorFallback/index.ts +9 -0
  263. package/src/components/Focus/AUDIT.md +43 -0
  264. package/src/components/Focus/Focus.stories.tsx +230 -0
  265. package/src/components/Focus/Focus.tsx +201 -0
  266. package/src/components/Focus/index.ts +5 -0
  267. package/src/components/Icon/Icon.stories.tsx +45 -15
  268. package/src/components/Icon/Icon.tsx +7 -3
  269. package/src/components/Image/Image.stories.tsx +86 -0
  270. package/src/components/Image/Image.tsx +223 -0
  271. package/src/components/Image/index.ts +5 -0
  272. package/src/components/Input/Input.stories.tsx +21 -41
  273. package/src/components/Input/Input.tsx +36 -72
  274. package/src/components/Link/Link.stories.tsx +2 -3
  275. package/src/components/Link/Link.tsx +2 -2
  276. package/src/components/List/List.stories.tsx +30 -34
  277. package/src/components/List/List.tsx +17 -21
  278. package/src/components/List/ListDropIndicator.tsx +7 -7
  279. package/src/components/List/Tree.stories.tsx +5 -6
  280. package/src/components/List/Tree.tsx +0 -1
  281. package/src/components/List/TreeDropIndicator.tsx +6 -6
  282. package/src/components/List/Treegrid.stories.tsx +29 -30
  283. package/src/components/List/Treegrid.tsx +23 -28
  284. package/src/components/Main/Main.stories.tsx +41 -24
  285. package/src/components/Main/Main.tsx +139 -83
  286. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +2 -3
  287. package/src/components/{Menus → Menu}/ContextMenu.tsx +9 -33
  288. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +2 -3
  289. package/src/components/{Menus → Menu}/DropdownMenu.tsx +115 -107
  290. package/src/components/Message/Message.stories.tsx +27 -13
  291. package/src/components/Message/Message.tsx +43 -34
  292. package/src/components/Popover/Popover.stories.tsx +7 -8
  293. package/src/components/Popover/Popover.tsx +97 -92
  294. package/src/components/ScrollArea/ScrollArea.stories.tsx +223 -34
  295. package/src/components/ScrollArea/ScrollArea.tsx +97 -79
  296. package/src/components/ScrollArea/index.ts +1 -1
  297. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +47 -25
  298. package/src/components/ScrollContainer/ScrollContainer.tsx +225 -109
  299. package/src/components/Select/Select.stories.tsx +7 -8
  300. package/src/components/Select/Select.tsx +11 -27
  301. package/src/components/Separator/Separator.tsx +5 -8
  302. package/src/components/Skeleton/Skeleton.stories.tsx +51 -0
  303. package/src/components/Skeleton/Skeleton.tsx +26 -0
  304. package/src/components/Skeleton/index.ts +5 -0
  305. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  306. package/src/components/Splitter/Splitter.tsx +127 -0
  307. package/src/components/Splitter/index.ts +5 -0
  308. package/src/components/Status/Status.stories.tsx +21 -18
  309. package/src/components/Status/Status.tsx +10 -7
  310. package/src/components/Tag/Tag.stories.tsx +6 -12
  311. package/src/components/Tag/Tag.tsx +3 -8
  312. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +31 -0
  313. package/src/components/ThemeProvider/ThemeProvider.tsx +10 -10
  314. package/src/components/ThemeProvider/TranslationsProvider.tsx +1 -16
  315. package/src/components/ThemeProvider/index.ts +3 -3
  316. package/src/components/Toast/Toast.stories.tsx +2 -3
  317. package/src/components/Toast/Toast.tsx +22 -41
  318. package/src/components/Toolbar/Toolbar.stories.tsx +2 -3
  319. package/src/components/Toolbar/Toolbar.tsx +185 -23
  320. package/src/components/Tooltip/Tooltip.stories.tsx +20 -19
  321. package/src/components/Tooltip/Tooltip.tsx +40 -38
  322. package/src/components/index.ts +11 -6
  323. package/src/exemplars/generics.stories.tsx +41 -0
  324. package/src/exemplars/slot.stories.tsx +117 -0
  325. package/src/exemplars/tabster.stories.tsx +127 -0
  326. package/src/exemplars/virtualizer.stories.tsx +137 -0
  327. package/src/hooks/index.ts +1 -0
  328. package/src/hooks/useDensityContext.ts +3 -3
  329. package/src/hooks/useElevationContext.ts +1 -1
  330. package/src/index.ts +2 -1
  331. package/src/playground/Controls.stories.tsx +3 -10
  332. package/src/playground/Custom.stories.tsx +11 -21
  333. package/src/playground/Typography.stories.tsx +3 -3
  334. package/src/primitives/Column/AUDIT.md +354 -0
  335. package/src/primitives/Column/Column.stories.tsx +182 -0
  336. package/src/primitives/Column/Column.tsx +169 -0
  337. package/src/primitives/Column/index.ts +5 -0
  338. package/src/primitives/Container/Container.stories.tsx +29 -0
  339. package/src/primitives/Container/Container.tsx +19 -0
  340. package/src/primitives/Container/index.ts +5 -0
  341. package/src/primitives/Flex/Flex.stories.tsx +57 -0
  342. package/src/primitives/Flex/Flex.tsx +27 -0
  343. package/src/primitives/Flex/index.ts +5 -0
  344. package/src/primitives/Grid/Grid.stories.tsx +56 -0
  345. package/src/primitives/Grid/Grid.tsx +30 -0
  346. package/src/primitives/Grid/index.ts +5 -0
  347. package/src/primitives/Panel/Panel.stories.tsx +68 -0
  348. package/src/primitives/Panel/Panel.tsx +120 -0
  349. package/src/primitives/Panel/index.ts +5 -0
  350. package/src/primitives/index.ts +9 -0
  351. package/src/testing/Loading.tsx +27 -0
  352. package/src/testing/decorators/withLayout.tsx +39 -18
  353. package/src/testing/decorators/withLayoutVariants.tsx +20 -23
  354. package/src/testing/decorators/withTheme.tsx +26 -20
  355. package/src/testing/index.ts +2 -0
  356. package/src/translations.ts +19 -0
  357. package/src/util/index.ts +2 -2
  358. package/src/util/usePx.ts +1 -0
  359. package/dist/lib/browser/chunk-N5GDJTT2.mjs +0 -4707
  360. package/dist/lib/browser/chunk-N5GDJTT2.mjs.map +0 -7
  361. package/dist/lib/node-esm/chunk-SP7VQH72.mjs +0 -4709
  362. package/dist/lib/node-esm/chunk-SP7VQH72.mjs.map +0 -7
  363. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  364. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  365. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  366. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  367. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  368. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  369. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  370. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  371. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  372. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  373. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  374. package/dist/types/src/util/domino.d.ts +0 -18
  375. package/dist/types/src/util/domino.d.ts.map +0 -1
  376. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
  377. package/src/components/AnchoredOverflow/index.ts +0 -5
  378. package/src/util/ThemedClassName.ts +0 -7
  379. package/src/util/domino.ts +0 -53
  380. /package/dist/types/src/components/{Menus → Menu}/ContextMenu.stories.d.ts +0 -0
  381. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  382. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -6,6 +6,7 @@ export * from './useDensityContext';
6
6
  export * from './useElevationContext';
7
7
  export * from './useIconHref';
8
8
  export * from './useSafeArea';
9
+ export * from './useSafeCollisionPadding';
9
10
  export * from './useTranslationsContext';
10
11
  export * from './useThemeContext';
11
12
  export * from './useVisualViewport';
@@ -4,11 +4,11 @@
4
4
 
5
5
  import { useContext } from 'react';
6
6
 
7
- import { type Density } from '@dxos/react-ui-types';
7
+ import { type Density } from '@dxos/ui-types';
8
8
 
9
9
  import { DensityContext } from '../components';
10
10
 
11
- export const useDensityContext = (propsDensity?: Density) => {
11
+ export const useDensityContext = (densityProp?: Density): Density | undefined => {
12
12
  const { density } = useContext(DensityContext);
13
- return propsDensity ?? density;
13
+ return densityProp ?? density;
14
14
  };
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { useContext } from 'react';
6
6
 
7
- import { type Elevation } from '@dxos/react-ui-types';
7
+ import { type Elevation } from '@dxos/ui-types';
8
8
 
9
9
  import { ElevationContext } from '../components';
10
10
 
package/src/index.ts CHANGED
@@ -6,8 +6,9 @@ export { type Resource, type TFunction } from 'i18next';
6
6
  export { Trans } from 'react-i18next';
7
7
 
8
8
  export * from '@dxos/react-hooks';
9
- export * from '@dxos/react-ui-types';
9
+ export * from '@dxos/ui-types';
10
10
 
11
11
  export * from './components';
12
12
  export * from './hooks';
13
+ export * from './primitives';
13
14
  export * from './util';
@@ -6,8 +6,7 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React, { useState } from 'react';
7
7
 
8
8
  import { Icon, Input, Select, Toggle, Toolbar } from '../components';
9
- import { withTheme } from '../testing';
10
- import { withLayoutVariants } from '../testing';
9
+ import { withLayoutVariants, withTheme } from '../testing';
11
10
 
12
11
  const DefaultStory = () => {
13
12
  const [checked, setChecked] = useState<boolean>(false);
@@ -32,9 +31,6 @@ const DefaultStory = () => {
32
31
  </Select.Content>
33
32
  </Select.Portal>
34
33
  </Select.Root>
35
- {/* TODO(burdon): Highlight is cyan. */}
36
- {/* TODO(burdon): Show vertical divider by default. */}
37
- {/* TODO(burdon): Icon sizes should adapt to density. */}
38
34
  <Toolbar.ToggleGroup type='multiple'>
39
35
  <Toolbar.ToggleGroupItem value='a'>
40
36
  <Icon icon='ph--text-b--regular' />
@@ -46,7 +42,6 @@ const DefaultStory = () => {
46
42
  <Icon icon='ph--text-underline--regular' />
47
43
  </Toolbar.ToggleGroupItem>
48
44
  </Toolbar.ToggleGroup>
49
- {/* TODO(burdon): Highlight isn't shown. */}
50
45
  <Toolbar.ToggleGroup type='single' defaultValue='a'>
51
46
  <Toolbar.ToggleGroupItem value='a'>
52
47
  <Icon icon='ph--file-ts--regular' />
@@ -60,11 +55,9 @@ const DefaultStory = () => {
60
55
  <Icon icon='ph--bug--regular' />
61
56
  </Toggle>
62
57
  </Toolbar.Button>
63
- {/* TODO(burdon): Should not be 'is-full' by default. */}
64
58
  <Input.Root>
65
59
  <Input.TextInput placeholder='Enter text...' />
66
60
  </Input.Root>
67
- {/* TODO(burdon): Checkbox collapsed. */}
68
61
  <Input.Root>
69
62
  <Input.Checkbox checked={checked} onCheckedChange={(value) => setChecked(!!value)} />
70
63
  <Input.Label>Checkbox</Input.Label>
@@ -82,9 +75,9 @@ const DefaultStory = () => {
82
75
  };
83
76
 
84
77
  const meta = {
85
- title: 'ui/react-ui-core/Playground/Controls',
78
+ title: 'ui/react-ui-core/playground/Controls',
86
79
  render: DefaultStory,
87
- decorators: [withTheme, withLayoutVariants()],
80
+ decorators: [withTheme(), withLayoutVariants()],
88
81
  } satisfies Meta<typeof Icon>;
89
82
 
90
83
  export default meta;
@@ -20,18 +20,10 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
20
20
  </Button>
21
21
  </div>
22
22
  <div className='flex justify-center'>
23
- <IconButton {...args} label='Test' icon='ph--atom--regular' size={7} density='coarse' />
23
+ <IconButton {...args} label='Test' icon='ph--atom--regular' density='coarse' />
24
24
  </div>
25
25
  <div className='flex justify-center'>
26
- <IconButton
27
- {...args}
28
- label='Test'
29
- icon='ph--atom--regular'
30
- iconOnly
31
- size={7}
32
- density='coarse'
33
- classNames='pli-1.5'
34
- />
26
+ <IconButton {...args} label='Test' icon='ph--atom--regular' iconOnly density='coarse' classNames='px-1.5' />
35
27
  </div>
36
28
  </div>
37
29
 
@@ -43,7 +35,7 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
43
35
  </Button>
44
36
  </div>
45
37
  <div className='flex justify-center'>
46
- <IconButton {...args} label='Test' icon='ph--atom--regular' density='fine' classNames='pli-2' />
38
+ <IconButton {...args} label='Test' icon='ph--atom--regular' density='fine' classNames='px-2' />
47
39
  </div>
48
40
  <div className='flex justify-center'>
49
41
  <IconButton
@@ -52,7 +44,7 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
52
44
  icon='ph--atom--regular'
53
45
  iconOnly
54
46
  density='fine'
55
- classNames='plb-1 pli-1.5'
47
+ classNames='py-1 px-1.5'
56
48
  />
57
49
  </div>
58
50
  </div>
@@ -60,7 +52,7 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
60
52
  {/* Small */}
61
53
  <div className='grid grid-cols-3 gap-4'>
62
54
  <div className='flex justify-center'>
63
- <Button {...args} density='fine' classNames={'!h-[24px] !text-[14px] p-0 pli-1.5 min-bs-0'}>
55
+ <Button {...args} density='fine' classNames={'!h-[24px] !text-[14px] p-0 px-1.5 min-h-0'}>
64
56
  {children}
65
57
  </Button>
66
58
  </div>
@@ -70,8 +62,7 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
70
62
  label='Test'
71
63
  icon='ph--atom--regular'
72
64
  density='fine'
73
- size={4}
74
- classNames={'!h-[24px] !text-[14px] p-1 min-bs-0 gap-0.5'}
65
+ classNames={'!h-[24px] !text-[14px] p-1 min-h-0 gap-0.5'}
75
66
  />
76
67
  </div>
77
68
  <div className='flex justify-center'>
@@ -81,22 +72,21 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
81
72
  icon='ph--atom--regular'
82
73
  iconOnly
83
74
  density='fine'
84
- size={4}
85
- classNames={'!h-[24px] !text-[14px] p-1 min-bs-0'}
75
+ classNames={'!h-[24px] !text-[14px] p-1 min-h-0'}
86
76
  />
87
77
  </div>
88
78
  </div>
89
79
 
90
80
  {/* TODO(burdon): Full variant with max width. */}
91
81
  <div className='flex justify-center'>
92
- <Button classNames='is-full max-is-[15rem] rounded' variant='default'>
82
+ <Button classNames='w-full max-w-[15rem] rounded-sm' variant='default'>
93
83
  Test
94
84
  </Button>
95
85
  </div>
96
86
  <div className='flex justify-center'>
97
87
  {/* TODO(burdon): Option to have button on RHS. Default size for icon should be 5 for this (medium) density. */}
98
88
  <IconButton
99
- classNames='is-full max-is-[15rem] rounded'
89
+ classNames='w-full max-w-[15rem] rounded-sm'
100
90
  variant='primary'
101
91
  icon='ph--arrows-clockwise--regular'
102
92
  label='Test'
@@ -108,10 +98,10 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
108
98
  };
109
99
 
110
100
  const meta = {
111
- title: 'ui/react-ui-core/Playground/Custom',
101
+ title: 'ui/react-ui-core/playground/Custom',
112
102
  component: Button,
113
103
  render: DefaultStory,
114
- decorators: [withTheme],
104
+ decorators: [withTheme()],
115
105
  parameters: {
116
106
  layout: 'centered',
117
107
  },
@@ -9,7 +9,7 @@ import { withTheme } from '../testing';
9
9
 
10
10
  const DefaultStory = () => {
11
11
  return (
12
- <div className='mli-auto p-8 max-is-[60rem] space-b-4'>
12
+ <div className='mx-auto p-8 max-w-[60rem] space-b-4'>
13
13
  <h1 className='text-4xl font-medium'>
14
14
  Việc <span className='italic'>thừa</span> nhận{' '}
15
15
  <span className='font-mono bg-neutral-500/10'>
@@ -43,9 +43,9 @@ const DefaultStory = () => {
43
43
  };
44
44
 
45
45
  const meta = {
46
- title: 'ui/react-ui-core/Playground/Typography',
46
+ title: 'ui/react-ui-core/playground/Typography',
47
47
  render: DefaultStory,
48
- decorators: [withTheme],
48
+ decorators: [withTheme()],
49
49
  } satisfies Meta<typeof DefaultStory>;
50
50
 
51
51
  export default meta;
@@ -0,0 +1,354 @@
1
+ # Column composition
2
+
3
+ ## Background
4
+
5
+ We have a complex design issue that requires research and deep thinking.
6
+
7
+ `Column` is a primitive that establishes a 3 column grid (side gutters and main content channel) by creating a CSS `grid` and setting the `--gutter` CSS variable.
8
+ Both `Dialog` and `Card` use `Column` to establish their grid and both have separate sub-components.
9
+ Also `ScrollArea` uses the `Column` grid to establish the side margins (padding via `--gutter`) for the main content.
10
+ Various components (e.g., `Form`) define a `Viewport` that implements a `ScrollArea` to establish their grid.
11
+
12
+ ## Initial Tasks
13
+
14
+ 1. Create a column-aligned Markdown table listing the sub-components for `Card` and `Dialog`.
15
+ 2. Add to this table all Radix-style components that have a `Viewport` sub-component that uses `ScrollArea`.
16
+ 3. For each of these component comment on whether they use appropraite standard for `Content` and `Viewport`, and call out any major design issues.
17
+
18
+ ## Design Challenge
19
+
20
+ The use of `Column` is intended to standardize how components establish a grid.
21
+ It is intended that this supports nesting; e.g., a `Dialog` that has a `Form` in its `Viewport`.
22
+ However there is a problem when child components contain other components that contain `Viewport`.
23
+ For example:
24
+
25
+ ```
26
+ - CreateObjectDialog (plugin-space)
27
+ - Dialog.Root
28
+ - Dialog.Body
29
+ - Dialog.Viewport => ScrollArea
30
+ - CreateObjectPanel
31
+ - Form.Root
32
+ - Form.Viewport => ScrollArea
33
+ - Form.Content
34
+ - Form.FieldSet
35
+ - Form.Actions
36
+ ```
37
+
38
+ The nested Viewports create a double set of scrollbars,
39
+ whereas the entire contents of the `Dialog.Body` should be considered to be a single scroll-area.
40
+ In this case we could omit the `Dialog.Viewport`, but inside `CreateObjectPanel` there are other components that do not define `Viewports`.
41
+
42
+ Determine if this is really a problem. And consider different approachs.
43
+
44
+ ## Audit
45
+
46
+ ### Sub-components for Dialog and Card
47
+
48
+ | Component | Sub-component | Uses Column | Uses ScrollArea | Has Viewport | Notes |
49
+ | :--------- | :-------------- | :------------------------------ | :--------------------------------- | :----------- | :------------------------------- |
50
+ | **Dialog** | Root | — | — | — | ElevationProvider wrapper |
51
+ | | Trigger | — | — | — | Radix primitive |
52
+ | | Portal | — | — | — | Radix primitive |
53
+ | | Overlay | — | — | — | OverlayLayoutProvider |
54
+ | | Content | **Column.Root** (gutter='sm') | — | — | Establishes the 3-col grid |
55
+ | | Header | **Column.Row** (center) | — | — | Title + Close row |
56
+ | | Body | col-span-full | — | — | Plain div, no gutters applied |
57
+ | | **Viewport** | **Column.Viewport** | **ScrollArea** (vertical, padding) | **Yes** | Alias for Column.Viewport |
58
+ | | Title | — | — | — | Radix primitive |
59
+ | | Description | — | — | — | Radix primitive |
60
+ | | ActionBar | **Column.Row** (center) | — | — | Action buttons row |
61
+ | | Close | — | — | — | Radix primitive |
62
+ | | CloseIconButton | — | — | — | Icon button |
63
+ | **Card** | Root | **Column.Root** (gutter varies) | — | — | gutter='lg' coarse, 'md' default |
64
+ | | Toolbar | col-span-3, subgrid | — | — | Toolbar.Root wrapper |
65
+ | | DragHandle | — | — | — | In CardIconBlock |
66
+ | | CloseIconButton | — | — | — | In CardIconBlock |
67
+ | | Menu | — | — | — | In CardIconBlock |
68
+ | | Icon | — | — | — | In CardIconBlock |
69
+ | | IconBlock | — | — | — | Grid cell for icons |
70
+ | | Title | — | — | — | Heading div |
71
+ | | Content | — | — | — | `display: contents` |
72
+ | | Row | **Column.Row** | — | — | With optional icon slot |
73
+ | | Section | col-span-full | — | — | **Deprecated** |
74
+ | | Heading | — | — | — | **Deprecated** |
75
+ | | Text | — | — | — | Text display |
76
+ | | Poster | col-span-full | — | — | Image/icon |
77
+ | | Action | Column.Row via subgrid | — | — | Button row |
78
+ | | Link | Column.Row via subgrid | — | — | External link row |
79
+
80
+ ### Components with Viewport sub-components using ScrollArea
81
+
82
+ | Component | Viewport impl | ScrollArea config | Notes |
83
+ | :------------- | :--------------------- | :---------------------------------------- | :--------------------------------------- |
84
+ | **Column** | Column.Viewport | vertical, padding | Base primitive; adds `py-2` |
85
+ | **Dialog** | Dialog.Viewport | (alias for Column.Viewport) | No Dialog-specific behavior |
86
+ | **Form** | Form.Viewport | vertical, margin, padding, thin | Sets `role='listbox'` |
87
+ | **SearchList** | SearchList.Viewport | thin only | Sets `role='listbox'`; no margin/padding |
88
+ | **Settings** | Settings.Root (itself) | vertical, margin | Root IS the ScrollArea; adds `p-trim-md` |
89
+ | **Popover** | Popover.Viewport | **None** (constraint div, not ScrollArea) | Just constrains inline/block size |
90
+ | **Combobox** | Combobox.List | (delegates to SearchList.Viewport) | Nested inside Popover.Viewport |
91
+
92
+ ### Design issues per component
93
+
94
+ | Component | Content/Viewport standard | Issues |
95
+ | :------------- | :-------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
96
+ | **Dialog** | Content → Column.Root; Viewport → Column.Viewport | `Dialog.Viewport` is a raw alias with no Dialog-specific awareness. `Dialog.Body` has `col-span-full` but no gutter padding — non-scrolling content inside it has no side margins. |
97
+ | **Card** | Content → `display:contents`; No Viewport | Card has no scroll support. Card.Content using `display:contents` collapses the element from layout, which can cause containment/styling issues. No Body equivalent exists. |
98
+ | **Form** | Root → context provider; Viewport → ScrollArea | Form.Viewport applies its own gutter padding via `--gutter`. When nested inside Dialog.Content (which sets `--gutter`), the padding aligns — but creates a second scroll container. |
99
+ | **SearchList** | Content → flex column; Viewport → ScrollArea (thin) | SearchList.Viewport uses `thin` but NOT `margin` or `padding` — it doesn't apply `--gutter` padding at all. Content alignment inside a Column grid depends entirely on the parent. |
100
+ | **Settings** | Root IS the ScrollArea | Standalone design; would double-scroll if placed inside another Viewport. |
101
+ | **Combobox** | Delegates to SearchList.Viewport inside Popover | No conflict — Popover.Viewport is not ScrollArea-based. |
102
+
103
+ ## Analysis
104
+
105
+ ### The problem
106
+
107
+ The core tension is between two responsibilities that `Viewport` (ScrollArea) currently conflates:
108
+
109
+ 1. **Scrolling** — overflow handling and scrollbar styling.
110
+ 2. **Gutter padding** — applying `px-[var(--gutter)]` (with scrollbar-width offset) to align content within the Column grid.
111
+
112
+ When a container like `Dialog` provides its own Viewport and a child like `Form` also provides one,
113
+ you get double scrollbars. Removing the container's Viewport fixes scrolling but breaks gutter alignment
114
+ for child paths that don't bring their own Viewport (e.g., plain text content).
115
+
116
+ ### The real nesting in CreateObjectDialog today
117
+
118
+ ```
119
+ Dialog.Content (Column.Root, sets --gutter)
120
+ Dialog.Header (Column.Row)
121
+ Dialog.Body (col-span-full, NO gutter padding)
122
+ CreateObjectPanel (switches between paths):
123
+ Path A: SelectType → SearchList → SearchList.Viewport (ScrollArea, thin)
124
+ Path B: SelectSpace → SearchList → SearchList.Viewport (ScrollArea, thin)
125
+ Path C: Form.Root → Form.Viewport (ScrollArea, margin, padding, thin) → Form.Content
126
+ Path D: (future) plain content — no Viewport, no gutters, broken alignment
127
+ ```
128
+
129
+ Dialog.Viewport was removed to avoid double scrollbars in paths A–C.
130
+ But path D would have no gutter padding because Dialog.Body doesn't provide it.
131
+
132
+ ### Design principles
133
+
134
+ 1. **Column.Content provides gutters via subgrid.** `Column.Root` sets `--gutter` and establishes the 3-column grid. `Column.Content` inherits this grid via CSS subgrid, placing non-scrolling children in the center column and allowing ScrollArea children to span full width.
135
+ 2. **Leaves own scrolling.** Components that need to scroll (Form, SearchList) provide their own Viewport. Components that don't need to scroll do nothing.
136
+ 3. **ScrollArea is always full width.** ScrollArea.Root must span all 3 grid columns and apply its own gutter padding via `--gutter` on its Viewport. No parent should constrain its width.
137
+ 4. **Subgrid propagation.** Components with both Content and Viewport sub-components (e.g., SearchList) propagate the subgrid in their Content element when inside a Column context.
138
+
139
+ ## Implemented Solution: Column.Content as subgrid
140
+
141
+ ### Mechanism
142
+
143
+ `Column.Content` uses `grid-cols-subgrid` to inherit `Column.Root`'s 3-column grid. Non-scrolling children default to the center column; ScrollArea children span all 3 columns.
144
+
145
+ Direct children of `Column.Root` participate in the grid in one of three ways:
146
+
147
+ - **Column.Row** — 3-col subgrid row (icons in gutters, content in center).
148
+ - **Column.Content** — multi-row subgrid; children default to center column, ScrollArea spans full width.
149
+ - **Column.Viewport** — full-width scrollable area (delegates gutters to ScrollArea).
150
+
151
+ ```css
152
+ /* Column.Content — subgrid that inherits Column.Root's 3-column grid */
153
+ .column-content {
154
+ col-span-full;
155
+ display: grid;
156
+ grid-template-columns: subgrid;
157
+ min-height: 0; /* allow shrinking in flex/grid parents */
158
+ > *:not(.dx-container) { col-start: 2 } /* non-ScrollArea children → center column */
159
+ /* ScrollArea children span full width via [.dx-column_&]:col-span-full (existing) */
160
+ }
161
+ ```
162
+
163
+ ### Why subgrid instead of padding
164
+
165
+ An earlier approach used `px-[var(--gutter)]` padding on Column.Content with a `--gutter-offset`
166
+ CSS variable for ScrollArea to break out via negative margins. This failed because:
167
+
168
+ 1. **Height constraint required `overflow-hidden`** — needed for ScrollArea to get a bounded height.
169
+ 2. **`overflow-hidden` clips negative margins** — ScrollArea couldn't break out horizontally.
170
+ 3. **CSS doesn't allow mixed overflow** — `overflow-y: hidden` with `overflow-x: visible` isn't possible (browser converts visible to auto).
171
+
172
+ Subgrid avoids all three issues: gutters come from grid columns (not padding), so there's nothing to break out of and no overflow conflict.
173
+
174
+ ### Subgrid propagation pattern
175
+
176
+ Components that have both a Content element and a ScrollArea-based Viewport must propagate
177
+ the subgrid in their Content element when inside a Column context. This ensures the grid chain
178
+ is maintained from Column.Root through intermediate components down to ScrollArea.Root.
179
+
180
+ ```css
181
+ /* Applied to SearchList.Content (and similar) when inside a Column context */
182
+ [.dx-column_&]:col-span-full
183
+ [.dx-column_&]:grid
184
+ [.dx-column_&]:grid-cols-subgrid
185
+ [.dx-column_&]:[&>:not(.dx-container)]:col-start-2
186
+ ```
187
+
188
+ Components using this pattern:
189
+
190
+ - **SearchList.Content** — propagates subgrid; SearchList.Viewport (ScrollArea) spans full width
191
+
192
+ Outside a Column context, these remain normal flex containers.
193
+
194
+ ### Example: CreateObjectDialog
195
+
196
+ ```
197
+ Dialog.Content (Column.Root, --gutter: var(--dx-gutter-sm), grid: 16px|1fr|16px)
198
+ Dialog.Header (Column.Row, center)
199
+ Dialog.Body → Column.Content (subgrid, children default to col-start-2)
200
+ CreateObjectPanel:
201
+ Path A: SearchList.Content (subgrid in column context)
202
+ → SearchList.Input (col-start-2, in center — guttered ✓)
203
+ → SearchList.Viewport (ScrollArea, col-span-full — full width ✓)
204
+ → ScrollArea.Viewport (pl/pr with --gutter and scrollbar offset ✓)
205
+ Path B: (same as A) ✓
206
+ Path C: Form.Viewport (ScrollArea, col-span-full — full width ✓)
207
+ → ScrollArea.Viewport (pl/pr with --gutter and scrollbar offset ✓)
208
+ Path D: <plain text> — col-start-2 (center column, guttered ✓)
209
+ ```
210
+
211
+ ### Dialog sub-component mapping
212
+
213
+ | Dialog sub-component | Column primitive | Gutter mechanism |
214
+ | :------------------- | :--------------- | :--------------------------------------------- |
215
+ | Dialog.Content | Column.Root | Establishes the 3-col grid and sets `--gutter` |
216
+ | Dialog.Header | Column.Row | Gutters via grid columns (subgrid) |
217
+ | Dialog.Body | Column.Content | Subgrid; children in center column |
218
+ | Dialog.ActionBar | Column.Row | Gutters via grid columns (subgrid) |
219
+
220
+ ### AlertDialog unified with Dialog ✅
221
+
222
+ AlertDialog now shares sub-components with Dialog:
223
+
224
+ | Sub-component | Source | Notes |
225
+ | :---------------- | :------------------------- | :------------------------------------------------------------- |
226
+ | Header | **Dialog.Header** | Shared — was missing from AlertDialog |
227
+ | Body | **Dialog.Body** | Shared — was Column.Viewport, now Column.Content |
228
+ | ActionBar | **Dialog.ActionBar** | Shared — was duplicated, now shared |
229
+ | CloseIconButton | **Dialog.CloseIconButton** | Shared — AlertDialog gains this |
230
+ | Content | AlertDialog-specific | Uses AlertDialogPrimitive.Content; gutter normalized to `'sm'` |
231
+ | Overlay | AlertDialog-specific | Uses AlertDialogPrimitive.Overlay |
232
+ | Title/Description | AlertDialog-specific | Uses AlertDialogPrimitive.Title/Description |
233
+ | Cancel/Action | AlertDialog-specific | Radix dismissal primitives |
234
+
235
+ ## Dialog Usage Audit
236
+
237
+ Full audit of all Dialog/AlertDialog consumers, checking whether they use the standard
238
+ `Dialog.Content > Dialog.Header > Dialog.Body > Dialog.ActionBar` structure.
239
+
240
+ ### Correctly structured (uses Dialog.Body)
241
+
242
+ | File | Type | Sub-components used | Body content |
243
+ | :--------------------------------------------- | :----- | :------------------------------- | :---------------------------------- |
244
+ | `devtools/.../DialogRestoreSpace.tsx` | Dialog | Content, Header, Body, ActionBar | Paragraph text + FileUploader |
245
+ | `plugin-navtree/.../CommandsDialogContent.tsx` | Dialog | Content, Header, Body, ActionBar | SearchList with Viewport |
246
+ | `plugin-space/.../CreateObjectDialog.tsx` | Dialog | Content, Header, Body | CreateObjectPanel (Form/SearchList) |
247
+ | `shell/.../ConfirmReset.tsx` | Dialog | Body, ActionBar (step component) | Message, TextInput, checkboxes |
248
+ | `react-ui/.../Dialog.stories.tsx` | Dialog | Content, Header, Body, ActionBar | ScrollArea with Input |
249
+
250
+ ### Correctly structured (AlertDialog with Body)
251
+
252
+ | File | Type | Sub-components used | Body content |
253
+ | :----------------------------------------- | :---------- | :------------------------------ | :---------------------------- |
254
+ | `plugin-client/.../RecoveryCodeDialog.tsx` | AlertDialog | Content, Body, Title, ActionBar | Checkboxes, code grid, inputs |
255
+ | `composer-app/.../ResetDialog.tsx` | AlertDialog | Content, Body, Title, ActionBar | Error display, IconButtons |
256
+ | `shell/.../JoinDialog.tsx` | AlertDialog | Content, Body, Cancel, Action | JoinPanel |
257
+ | `shell/.../StatusDialog.tsx` | AlertDialog | Content, Body | StatusPanel |
258
+ | `react-ui/.../AlertDialog.stories.tsx` | AlertDialog | Content, Body, Title, ActionBar | Title, Description |
259
+
260
+ ### Missing Dialog.Body (should be added)
261
+
262
+ | File | Type | What's used instead | Body content | Issue |
263
+ | :------------------------------------------- | :----- | :----------------------- | :----------------------------- | :---------------------------------------------------- |
264
+ | `plugin-script/.../DeploymentDialog.tsx` | Dialog | Custom flex divs | Text, list items, buttons | No Header, no Body, no gutter padding |
265
+ | `plugin-search/.../SearchDialog.tsx` | Dialog | Content directly | SearchList with max-h overflow | No Header, no Body; SearchList has own scroll |
266
+ | `plugin-help/.../ShortcutsDialogContent.tsx` | Dialog | Custom flex divs | ShortcutsList | No Header, no Body |
267
+ | `plugin-space/.../CreateSpaceDialog.tsx` | Dialog | Form.Viewport in Content | Form fields | Has Header but no Body; Form.Viewport provides scroll |
268
+ | `plugin-space/.../JoinDialog.tsx` | Dialog | Content directly | JoinPanel | No Header, no Body; panel manages layout |
269
+ | `plugin-client/.../JoinDialog.tsx` | Dialog | Content directly | JoinPanel | No Body; panel manages layout |
270
+ | `plugin-client/.../ResetDialog.tsx` | Dialog | Content directly | ConfirmReset step | No Body; step component has its own Body |
271
+ | `shell/.../SpaceDialog.tsx` | Dialog | Content directly | SpacePanel | No Header, no Body; panel manages layout |
272
+ | `shell/.../IdentityDialog.tsx` | Dialog | Content directly | IdentityPanel | No Header, no Body; panel manages layout |
273
+ | `shell/.../run-shell.tsx` | Dialog | Content directly | Button (fallback) | No Header, no Body; minimal fallback UI |
274
+
275
+ ### Custom layout (not standard Dialog)
276
+
277
+ | File | Type | Notes |
278
+ | :------------------------------------ | :----- | :-------------------------------------------------------- |
279
+ | `react-ui-chat/.../ChatDialog.tsx` | Custom | Own Column-based grid layout with Header, Content, Footer |
280
+ | `plugin-assistant/.../ChatDialog.tsx` | Custom | Uses ChatDialog from react-ui-chat |
281
+
282
+ ### Observations
283
+
284
+ 1. **Shell panel dialogs** (SpaceDialog, IdentityDialog, JoinDialog) all delegate layout to internal Panel components. These panels manage their own structure inside Dialog.Content, bypassing Dialog.Body/Header. This may be intentional (panels are reusable outside dialogs) but means they lack standard gutter alignment.
285
+
286
+ 2. **Search-style dialogs** (SearchDialog, CommandsDialogContent) have full-bleed SearchList content. CommandsDialogContent correctly uses Dialog.Body; SearchDialog does not and handles its own max-height overflow.
287
+
288
+ 3. **Form dialogs** (CreateSpaceDialog) use Form.Viewport directly in Dialog.Content, skipping Dialog.Body. This is safe because `--gutter-offset` is set by Column.Content (not Column.Root), so Form.Viewport's ScrollArea.Root sees `--gutter-offset` defaulting to `0px` and applies no negative margin. These dialogs should still be updated to use Dialog.Body for consistency, but they won't break.
289
+
290
+ 4. **AlertDialog.Body uses Column.Viewport** (ScrollArea), while **Dialog.Body uses Column.Content** (non-scrolling). This inconsistency should be resolved — AlertDialog.Body should likely also use Column.Content so that child components can bring their own scroll.
291
+
292
+ ## Completed Work
293
+
294
+ ### Column.Content primitive ✅
295
+
296
+ - New `Column.Content` component using CSS subgrid
297
+ - `Column.Root` JSDoc updated to document three child types (Row, Content, Viewport)
298
+ - `ColumnContentProps` exported from `@dxos/react-ui`
299
+ - Column stories added (WithContent, ContentWithScrollArea)
300
+
301
+ ### Dialog standardization ✅
302
+
303
+ - `Dialog.Viewport` removed (no consumers)
304
+ - `Dialog.Body` delegates to `Column.Content`
305
+ - Dialog stories updated (DefaultStory, ScrollingStory)
306
+ - All dialog stories use consistent `Root > Overlay > Content` wrapping (no Portal)
307
+
308
+ ### AlertDialog unified with Dialog ✅
309
+
310
+ - AlertDialog shares Header, Body, ActionBar, CloseIconButton with Dialog
311
+ - AlertDialog.Content normalized to `gutter='sm'`
312
+ - AlertDialog.Body changed from Column.Viewport (scroll) to Column.Content (subgrid)
313
+
314
+ ### Consumer migrations ✅
315
+
316
+ All dialogs updated to standard `Dialog.Content > Dialog.Header > Dialog.Body` structure:
317
+
318
+ 1. CreateSpaceDialog — wrapped Form.Root in Dialog.Body ✅
319
+ 2. SearchDialog — added Header and Body ✅
320
+ 3. ShortcutsDialogContent — replaced custom flex layout with Header and Body ✅
321
+ 4. DeploymentDialog — restructured to use Header, Body, ActionBar ✅
322
+ 5. SpaceDialog — wrapped SpacePanel in Dialog.Body ✅
323
+ 6. IdentityDialog — wrapped IdentityPanel in Dialog.Body ✅
324
+ 7. JoinDialog (plugin-space) — wrapped JoinPanel in Dialog.Body ✅
325
+ 8. JoinDialog (plugin-client) — wrapped JoinPanel in Dialog.Body ✅
326
+ 9. plugin-client ResetDialog — already correct (ConfirmReset uses Dialog.Body internally) ✅
327
+
328
+ ### SearchList subgrid propagation ✅
329
+
330
+ - SearchList.Content propagates subgrid when inside a Column context
331
+ - SearchList.Viewport now passes `padding` for gutter alignment
332
+
333
+ ## Remaining Work
334
+
335
+ ### Storybook verification
336
+
337
+ Visually verify all migrated dialogs in storybook:
338
+
339
+ - Gutter alignment for non-scrolling content in Dialog.Body
340
+ - ScrollArea full width with correct gutter padding on Viewport
341
+ - Height constraint and scrolling behavior
342
+ - AlertDialog stories with the aligned Body implementation
343
+
344
+ ### Form subgrid propagation
345
+
346
+ Form currently doesn't propagate the subgrid in Column context.
347
+ If Form is used inside Dialog.Body, Form.Viewport (ScrollArea) needs to
348
+ span full width. This may require the same subgrid propagation pattern
349
+ applied to SearchList.Content.
350
+
351
+ ### Card alignment
352
+
353
+ Card has no Body equivalent. Consider adding Card.Body using Column.Content
354
+ for cards that need scrollable or guttered content areas.