@dxos/react-ui 0.8.4-main.3f58842 → 0.8.4-main.52d7546f51

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 (371) hide show
  1. package/dist/lib/browser/chunk-6DTBPJE4.mjs +774 -0
  2. package/dist/lib/browser/chunk-6DTBPJE4.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +3202 -59
  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 +66 -49
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/chunk-JKHQSGNU.mjs +776 -0
  9. package/dist/lib/node-esm/chunk-JKHQSGNU.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +3202 -59
  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 +66 -49
  14. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  15. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +7 -0
  16. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +1 -1
  17. package/dist/types/src/components/Avatars/Avatar.d.ts +1 -1
  18. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  19. package/dist/types/src/components/Avatars/Avatar.stories.d.ts +5 -31
  20. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  21. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts +5 -11
  22. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  23. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts +1 -1
  24. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  25. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts +8 -20
  26. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  27. package/dist/types/src/components/{Buttons → Button}/Button.d.ts +2 -2
  28. package/dist/types/src/components/Button/Button.d.ts.map +1 -0
  29. package/dist/types/src/components/Button/Button.stories.d.ts +17 -0
  30. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -0
  31. package/dist/types/src/components/{Buttons → Button}/IconButton.d.ts +4 -4
  32. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -0
  33. package/dist/types/src/components/Button/IconButton.stories.d.ts +13 -0
  34. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -0
  35. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -0
  36. package/dist/types/src/components/Button/Toggle.stories.d.ts +16 -0
  37. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -0
  38. package/dist/types/src/components/Button/ToggleGroup.d.ts +27 -0
  39. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -0
  40. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +27 -0
  41. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -0
  42. package/dist/types/src/components/Button/index.d.ts.map +1 -0
  43. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  44. package/dist/types/src/components/Clipboard/CopyButton.d.ts +1 -1
  45. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  46. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  47. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  48. package/dist/types/src/components/{Dialogs → Dialog}/AlertDialog.d.ts +1 -1
  49. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -0
  50. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts +11 -0
  51. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -0
  52. package/dist/types/src/components/Dialog/Dialog.d.ts +46 -0
  53. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -0
  54. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +27 -0
  55. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -0
  56. package/dist/types/src/components/Dialog/index.d.ts.map +1 -0
  57. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  58. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  59. package/dist/types/src/components/Icon/Icon.d.ts +2 -2
  60. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  61. package/dist/types/src/components/Icon/Icon.stories.d.ts +17 -0
  62. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -0
  63. package/dist/types/src/components/Input/Input.d.ts +6 -5
  64. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  65. package/dist/types/src/components/Input/Input.stories.d.ts +12 -13
  66. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  67. package/dist/types/src/components/Link/Link.stories.d.ts +8 -8
  68. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  69. package/dist/types/src/components/{Lists → List}/List.d.ts +3 -3
  70. package/dist/types/src/components/List/List.d.ts.map +1 -0
  71. package/dist/types/src/components/List/List.stories.d.ts +14 -0
  72. package/dist/types/src/components/List/List.stories.d.ts.map +1 -0
  73. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -0
  74. package/dist/types/src/components/{Lists → List}/Tree.d.ts +1 -1
  75. package/dist/types/src/components/List/Tree.d.ts.map +1 -0
  76. package/dist/types/src/components/List/Tree.stories.d.ts +15 -0
  77. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -0
  78. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -0
  79. package/dist/types/src/components/{Lists → List}/Treegrid.d.ts +1 -1
  80. package/dist/types/src/components/{Lists → List}/Treegrid.d.ts.map +1 -1
  81. package/dist/types/src/components/List/Treegrid.stories.d.ts +12 -0
  82. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -0
  83. package/dist/types/src/components/List/index.d.ts.map +1 -0
  84. package/dist/types/src/components/Main/Main.d.ts +17 -27
  85. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  86. package/dist/types/src/components/Main/Main.stories.d.ts +6 -7
  87. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  88. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  89. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  90. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts +12 -0
  91. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  92. package/dist/types/src/components/{Menus → Menu}/DropdownMenu.d.ts +8 -8
  93. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  94. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +15 -0
  95. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  96. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  97. package/dist/types/src/components/Message/Message.d.ts +1 -1
  98. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  99. package/dist/types/src/components/Message/Message.stories.d.ts +8 -17
  100. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  101. package/dist/types/src/components/Popover/Popover.d.ts +3 -3
  102. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  103. package/dist/types/src/components/Popover/Popover.stories.d.ts +6 -34
  104. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  105. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +25 -26
  106. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  107. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +37 -25
  108. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  109. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +39 -0
  110. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -0
  111. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +19 -0
  112. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -0
  113. package/dist/types/src/components/ScrollContainer/index.d.ts +2 -0
  114. package/dist/types/src/components/ScrollContainer/index.d.ts.map +1 -0
  115. package/dist/types/src/components/Select/Select.d.ts +10 -10
  116. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  117. package/dist/types/src/components/Select/Select.stories.d.ts +4 -9
  118. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  119. package/dist/types/src/components/Separator/Separator.d.ts +1 -1
  120. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  121. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  122. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  123. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  124. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  125. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  126. package/dist/types/src/components/Splitter/Splitter.d.ts +26 -0
  127. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  128. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  129. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  130. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  131. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  132. package/dist/types/src/components/Status/Status.stories.d.ts +2 -8
  133. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  134. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  135. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  136. package/dist/types/src/components/Tag/Tag.stories.d.ts +12 -12
  137. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  138. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +3 -3
  139. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  140. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
  141. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  142. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  143. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  144. package/dist/types/src/components/Toast/Toast.d.ts +5 -5
  145. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  146. package/dist/types/src/components/Toast/Toast.stories.d.ts +6 -44
  147. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  148. package/dist/types/src/components/Toolbar/Toolbar.d.ts +20 -19
  149. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  150. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +6 -50
  151. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  152. package/dist/types/src/components/Tooltip/Tooltip.d.ts +2 -4
  153. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  154. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +8 -61
  155. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  156. package/dist/types/src/components/index.d.ts +7 -4
  157. package/dist/types/src/components/index.d.ts.map +1 -1
  158. package/dist/types/src/exemplars/generics.stories.d.ts +17 -0
  159. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  160. package/dist/types/src/exemplars/slot.stories.d.ts +14 -0
  161. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  162. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  163. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  164. package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
  165. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  166. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  167. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  168. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  169. package/dist/types/src/hooks/useVisualViewport.d.ts +2 -2
  170. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  171. package/dist/types/src/index.d.ts +2 -1
  172. package/dist/types/src/index.d.ts.map +1 -1
  173. package/dist/types/src/playground/Controls.stories.d.ts +5 -9
  174. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  175. package/dist/types/src/playground/Custom.stories.d.ts +12 -4
  176. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  177. package/dist/types/src/playground/Typography.stories.d.ts +5 -11
  178. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  179. package/dist/types/src/primitives/Container/Container.d.ts +23 -0
  180. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  181. package/dist/types/src/primitives/Container/Container.stories.d.ts +11 -0
  182. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  183. package/dist/types/src/primitives/Container/Layout.d.ts +18 -0
  184. package/dist/types/src/primitives/Container/Layout.d.ts.map +1 -0
  185. package/dist/types/src/primitives/Container/Layout.stories.d.ts +10 -0
  186. package/dist/types/src/primitives/Container/Layout.stories.d.ts.map +1 -0
  187. package/dist/types/src/primitives/Container/index.d.ts +3 -0
  188. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  189. package/dist/types/src/primitives/Flex/Flex.d.ts +8 -0
  190. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  191. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  192. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  193. package/dist/types/src/primitives/index.d.ts +3 -0
  194. package/dist/types/src/primitives/index.d.ts.map +1 -0
  195. package/dist/types/src/testing/decorators/index.d.ts +2 -1
  196. package/dist/types/src/testing/decorators/index.d.ts.map +1 -1
  197. package/dist/types/src/testing/decorators/withLayout.d.ts +15 -0
  198. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -0
  199. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +12 -0
  200. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -0
  201. package/dist/types/src/testing/decorators/withTheme.d.ts +5 -1
  202. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  203. package/dist/types/src/util/index.d.ts +2 -1
  204. package/dist/types/src/util/index.d.ts.map +1 -1
  205. package/dist/types/src/util/usePx.d.ts +8 -0
  206. package/dist/types/src/util/usePx.d.ts.map +1 -0
  207. package/dist/types/tsconfig.tsbuildinfo +1 -1
  208. package/package.json +39 -31
  209. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +10 -12
  210. package/src/components/Avatars/Avatar.stories.tsx +23 -14
  211. package/src/components/Avatars/Avatar.tsx +6 -13
  212. package/src/components/Avatars/AvatarGroup.stories.tsx +12 -8
  213. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +19 -14
  214. package/src/components/Breadcrumb/Breadcrumb.tsx +6 -32
  215. package/src/components/{Buttons → Button}/Button.stories.tsx +9 -10
  216. package/src/components/{Buttons → Button}/Button.tsx +2 -8
  217. package/src/components/{Buttons → Button}/IconButton.stories.tsx +13 -10
  218. package/src/components/{Buttons → Button}/IconButton.tsx +23 -16
  219. package/src/components/Button/Toggle.stories.tsx +37 -0
  220. package/src/components/{Buttons → Button}/ToggleGroup.stories.tsx +12 -9
  221. package/src/components/{Buttons → Button}/ToggleGroup.tsx +17 -4
  222. package/src/components/Clipboard/ClipboardProvider.tsx +1 -1
  223. package/src/components/Clipboard/CopyButton.tsx +6 -5
  224. package/src/components/DensityProvider/DensityProvider.tsx +2 -2
  225. package/src/components/{Dialogs → Dialog}/AlertDialog.stories.tsx +17 -14
  226. package/src/components/{Dialogs → Dialog}/AlertDialog.tsx +16 -21
  227. package/src/components/Dialog/Dialog.stories.tsx +101 -0
  228. package/src/components/{Dialogs → Dialog}/Dialog.tsx +182 -57
  229. package/src/components/ElevationProvider/ElevationProvider.tsx +2 -2
  230. package/src/components/Icon/Icon.stories.tsx +113 -0
  231. package/src/components/Icon/Icon.tsx +3 -3
  232. package/src/components/Input/Input.stories.tsx +22 -23
  233. package/src/components/Input/Input.tsx +38 -44
  234. package/src/components/Link/Link.stories.tsx +12 -8
  235. package/src/components/Link/Link.tsx +1 -1
  236. package/src/components/{Lists → List}/List.stories.tsx +34 -28
  237. package/src/components/{Lists → List}/List.tsx +23 -25
  238. package/src/components/{Lists → List}/ListDropIndicator.tsx +1 -1
  239. package/src/components/{Lists → List}/Tree.stories.tsx +13 -10
  240. package/src/components/{Lists → List}/Tree.tsx +4 -3
  241. package/src/components/{Lists → List}/TreeDropIndicator.tsx +1 -1
  242. package/src/components/{Lists → List}/Treegrid.stories.tsx +14 -8
  243. package/src/components/{Lists → List}/Treegrid.tsx +61 -25
  244. package/src/components/Main/Main.stories.tsx +56 -27
  245. package/src/components/Main/Main.tsx +166 -94
  246. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +13 -10
  247. package/src/components/{Menus → Menu}/ContextMenu.tsx +8 -31
  248. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +14 -11
  249. package/src/components/{Menus → Menu}/DropdownMenu.tsx +109 -78
  250. package/src/components/Message/Message.stories.tsx +14 -10
  251. package/src/components/Message/Message.tsx +34 -23
  252. package/src/components/Popover/Popover.stories.tsx +14 -11
  253. package/src/components/Popover/Popover.tsx +67 -48
  254. package/src/components/ScrollArea/ScrollArea.stories.tsx +163 -34
  255. package/src/components/ScrollArea/ScrollArea.tsx +80 -82
  256. package/src/components/ScrollArea/index.ts +1 -1
  257. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +70 -0
  258. package/src/components/ScrollContainer/ScrollContainer.tsx +238 -0
  259. package/src/components/ScrollContainer/index.ts +5 -0
  260. package/src/components/Select/Select.stories.tsx +15 -12
  261. package/src/components/Select/Select.tsx +18 -33
  262. package/src/components/Separator/Separator.tsx +1 -1
  263. package/src/components/Skeleton/Skeleton.stories.tsx +52 -0
  264. package/src/components/Skeleton/Skeleton.tsx +26 -0
  265. package/src/components/Skeleton/index.ts +5 -0
  266. package/src/components/Splitter/Splitter.stories.tsx +73 -0
  267. package/src/components/Splitter/Splitter.tsx +123 -0
  268. package/src/components/Splitter/index.ts +5 -0
  269. package/src/components/Status/Status.stories.tsx +11 -8
  270. package/src/components/Status/Status.tsx +2 -2
  271. package/src/components/Tag/Tag.stories.tsx +21 -12
  272. package/src/components/Tag/Tag.tsx +2 -7
  273. package/src/components/ThemeProvider/ThemeProvider.tsx +5 -5
  274. package/src/components/ThemeProvider/TranslationsProvider.tsx +3 -18
  275. package/src/components/ThemeProvider/index.ts +3 -3
  276. package/src/components/Toast/Toast.stories.tsx +14 -11
  277. package/src/components/Toast/Toast.tsx +15 -19
  278. package/src/components/Toolbar/Toolbar.stories.tsx +16 -14
  279. package/src/components/Toolbar/Toolbar.tsx +41 -10
  280. package/src/components/Tooltip/Tooltip.stories.tsx +18 -14
  281. package/src/components/Tooltip/Tooltip.tsx +29 -26
  282. package/src/components/index.ts +7 -4
  283. package/src/exemplars/generics.stories.tsx +44 -0
  284. package/src/exemplars/slot.stories.tsx +108 -0
  285. package/src/exemplars/tabster.stories.tsx +127 -0
  286. package/src/hooks/useDensityContext.ts +1 -1
  287. package/src/hooks/useElevationContext.ts +1 -1
  288. package/src/hooks/useSafeArea.ts +3 -2
  289. package/src/hooks/useVisualViewport.ts +4 -4
  290. package/src/index.ts +2 -1
  291. package/src/playground/Controls.stories.tsx +12 -9
  292. package/src/playground/Custom.stories.tsx +15 -26
  293. package/src/playground/Typography.stories.tsx +10 -8
  294. package/src/primitives/Container/Container.stories.tsx +67 -0
  295. package/src/primitives/Container/Container.tsx +79 -0
  296. package/src/primitives/Container/Layout.stories.tsx +57 -0
  297. package/src/primitives/Container/Layout.tsx +61 -0
  298. package/src/primitives/Container/index.ts +6 -0
  299. package/src/primitives/Flex/Flex.tsx +26 -0
  300. package/src/primitives/Flex/index.ts +5 -0
  301. package/src/primitives/index.ts +6 -0
  302. package/src/testing/decorators/index.ts +2 -1
  303. package/src/testing/decorators/withLayout.tsx +63 -0
  304. package/src/testing/decorators/{withSurfaceVariantsLayout.tsx → withLayoutVariants.tsx} +5 -5
  305. package/src/testing/decorators/withTheme.tsx +34 -0
  306. package/src/util/index.ts +3 -1
  307. package/src/util/usePx.ts +61 -0
  308. package/dist/lib/browser/chunk-2COVUP44.mjs +0 -4373
  309. package/dist/lib/browser/chunk-2COVUP44.mjs.map +0 -7
  310. package/dist/lib/node-esm/chunk-GHXHND5V.mjs +0 -4375
  311. package/dist/lib/node-esm/chunk-GHXHND5V.mjs.map +0 -7
  312. package/dist/types/src/components/Buttons/Button.d.ts.map +0 -1
  313. package/dist/types/src/components/Buttons/Button.stories.d.ts +0 -12
  314. package/dist/types/src/components/Buttons/Button.stories.d.ts.map +0 -1
  315. package/dist/types/src/components/Buttons/IconButton.d.ts.map +0 -1
  316. package/dist/types/src/components/Buttons/IconButton.stories.d.ts +0 -22
  317. package/dist/types/src/components/Buttons/IconButton.stories.d.ts.map +0 -1
  318. package/dist/types/src/components/Buttons/Toggle.d.ts.map +0 -1
  319. package/dist/types/src/components/Buttons/Toggle.stories.d.ts +0 -19
  320. package/dist/types/src/components/Buttons/Toggle.stories.d.ts.map +0 -1
  321. package/dist/types/src/components/Buttons/ToggleGroup.d.ts +0 -28
  322. package/dist/types/src/components/Buttons/ToggleGroup.d.ts.map +0 -1
  323. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts +0 -39
  324. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts.map +0 -1
  325. package/dist/types/src/components/Buttons/index.d.ts.map +0 -1
  326. package/dist/types/src/components/Dialogs/AlertDialog.d.ts.map +0 -1
  327. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts +0 -43
  328. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts.map +0 -1
  329. package/dist/types/src/components/Dialogs/Dialog.d.ts +0 -31
  330. package/dist/types/src/components/Dialogs/Dialog.d.ts.map +0 -1
  331. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts +0 -48
  332. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts.map +0 -1
  333. package/dist/types/src/components/Dialogs/index.d.ts.map +0 -1
  334. package/dist/types/src/components/Lists/List.d.ts.map +0 -1
  335. package/dist/types/src/components/Lists/List.stories.d.ts +0 -37
  336. package/dist/types/src/components/Lists/List.stories.d.ts.map +0 -1
  337. package/dist/types/src/components/Lists/ListDropIndicator.d.ts.map +0 -1
  338. package/dist/types/src/components/Lists/Tree.d.ts.map +0 -1
  339. package/dist/types/src/components/Lists/Tree.stories.d.ts +0 -41
  340. package/dist/types/src/components/Lists/Tree.stories.d.ts.map +0 -1
  341. package/dist/types/src/components/Lists/TreeDropIndicator.d.ts.map +0 -1
  342. package/dist/types/src/components/Lists/Treegrid.stories.d.ts +0 -10
  343. package/dist/types/src/components/Lists/Treegrid.stories.d.ts.map +0 -1
  344. package/dist/types/src/components/Lists/index.d.ts.map +0 -1
  345. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  346. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts +0 -50
  347. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  348. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  349. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts +0 -50
  350. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  351. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  352. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts +0 -12
  353. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts.map +0 -1
  354. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  355. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  356. package/src/components/Buttons/Toggle.stories.tsx +0 -33
  357. package/src/components/Dialogs/Dialog.stories.tsx +0 -65
  358. package/src/testing/decorators/withTheme.ts +0 -25
  359. package/src/util/ThemedClassName.ts +0 -7
  360. /package/dist/types/src/components/{Buttons → Button}/Toggle.d.ts +0 -0
  361. /package/dist/types/src/components/{Buttons → Button}/index.d.ts +0 -0
  362. /package/dist/types/src/components/{Dialogs → Dialog}/index.d.ts +0 -0
  363. /package/dist/types/src/components/{Lists → List}/ListDropIndicator.d.ts +0 -0
  364. /package/dist/types/src/components/{Lists → List}/TreeDropIndicator.d.ts +0 -0
  365. /package/dist/types/src/components/{Lists → List}/index.d.ts +0 -0
  366. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  367. /package/src/components/{Buttons → Button}/Toggle.tsx +0 -0
  368. /package/src/components/{Buttons → Button}/index.ts +0 -0
  369. /package/src/components/{Dialogs → Dialog}/index.ts +0 -0
  370. /package/src/components/{Lists → List}/index.ts +0 -0
  371. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -0,0 +1,127 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import {
6
+ useArrowNavigationGroup,
7
+ useFocusFinders,
8
+ useFocusableGroup,
9
+ useMergedTabsterAttributes_unstable,
10
+ } from '@fluentui/react-tabster';
11
+ import { type Decorator, type Meta, type StoryObj } from '@storybook/react-vite';
12
+ import React, { forwardRef, useEffect, useMemo, useRef } from 'react';
13
+ import { createTabster, disposeTabster } from 'tabster';
14
+
15
+ import { Input, ScrollArea } from '@dxos/react-ui';
16
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
17
+ import { mx } from '@dxos/ui-theme';
18
+
19
+ // TODO(burdon): Factor out styles (incl. tabster debugging).
20
+ // TODO(burdon): Implement horizontal movement between columns when column is selected.
21
+ // TODO(burdon): Prevent tab out of app.
22
+
23
+ const border =
24
+ 'rounded-sm outline-none border border-subduedSeparator focus:border-primary-500 focus-within:border-rose-500';
25
+
26
+ const Board = forwardRef<HTMLDivElement, { columns: string[][] }>(({ columns }, ref) => {
27
+ const arrowNavigationAttrs = useArrowNavigationGroup({ axis: 'horizontal', memorizeCurrent: true, tabbable: true });
28
+
29
+ return (
30
+ <div ref={ref} tabIndex={0} {...arrowNavigationAttrs} className='flex bs-full is-full overflow-hidden'>
31
+ <div className={mx('flex bs-full overflow-x-auto p-4 gap-4')}>
32
+ {columns.map((column) => (
33
+ <Column key={column[0]} items={column} />
34
+ ))}
35
+ </div>
36
+ </div>
37
+ );
38
+ });
39
+
40
+ const Column = forwardRef<HTMLDivElement, { items: string[] }>(({ items }, ref) => {
41
+ const focusableGroupAttrs = useFocusableGroup({ tabBehavior: 'limited' });
42
+ const arrowNavigationAttrs = useArrowNavigationGroup({ axis: 'vertical', memorizeCurrent: true });
43
+ const tabsterAttrs = useMergedTabsterAttributes_unstable(focusableGroupAttrs, arrowNavigationAttrs);
44
+
45
+ return (
46
+ <ScrollArea.Root tabIndex={0} orientation='vertical' classNames={mx('shrink-0 bs-full is-[25rem]', border)}>
47
+ <ScrollArea.Viewport {...tabsterAttrs} classNames='p-4 gap-4' ref={ref}>
48
+ {items.map((item) => (
49
+ <Item key={item} value={item} />
50
+ ))}
51
+ </ScrollArea.Viewport>
52
+ </ScrollArea.Root>
53
+ );
54
+ });
55
+
56
+ const Item = forwardRef<HTMLDivElement, { value: string }>(({ value }, ref) => {
57
+ const focusableGroupAttrs = useFocusableGroup();
58
+
59
+ return (
60
+ <div
61
+ ref={ref}
62
+ tabIndex={0}
63
+ {...focusableGroupAttrs}
64
+ className={mx('flex shrink-0 is-full gap-4 p-4 items-center', border)}
65
+ >
66
+ <Input.Root>
67
+ <Input.Checkbox />
68
+ </Input.Root>
69
+ <Input.Root>
70
+ <Input.TextInput defaultValue={value} />
71
+ </Input.Root>
72
+ </div>
73
+ );
74
+ });
75
+
76
+ const DefaultStory = () => {
77
+ const columns = useMemo(() => {
78
+ return [['A1', 'A2', 'A3'], ['B1'], ['C1', 'C2', 'C3', 'C4', 'C5', 'C6'], ['D1', 'D2']];
79
+ }, []);
80
+
81
+ const ref = useRef<HTMLDivElement>(null);
82
+ const { findFirstFocusable } = useFocusFinders();
83
+ useEffect(() => {
84
+ if (ref.current) {
85
+ findFirstFocusable(ref.current)?.focus();
86
+ }
87
+ }, []);
88
+
89
+ return <Board columns={columns} ref={ref} />;
90
+ };
91
+
92
+ // TODO(burdon): This doesn't seem to be necessary or recongized; memoization doesn't work.
93
+ const withTabster: Decorator = (Story) => {
94
+ useEffect(() => {
95
+ const tabster = createTabster(window, {
96
+ autoRoot: {},
97
+ // TODO(burdon): Not called.
98
+ // checkUncontrolledCompletely: (el) => {
99
+ // console.log(el);
100
+ // return true;
101
+ // },
102
+ });
103
+
104
+ return () => {
105
+ disposeTabster(tabster);
106
+ };
107
+ }, []);
108
+
109
+ return <Story />;
110
+ };
111
+
112
+ const meta: Meta<typeof DefaultStory> = {
113
+ title: 'ui/react-ui-core/exemplars/tabster',
114
+ component: DefaultStory,
115
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' }), withTabster],
116
+ parameters: {
117
+ layout: 'fullscreen',
118
+ },
119
+ };
120
+
121
+ export default meta;
122
+
123
+ type Story = StoryObj<typeof meta>;
124
+
125
+ export const Default: Story = {
126
+ args: {},
127
+ };
@@ -4,7 +4,7 @@
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
 
@@ -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
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { useCallback, useState } from 'react';
6
6
 
7
- import { useResize } from '@dxos/react-hooks';
7
+ import { useViewportResize } from '@dxos/react-hooks';
8
8
 
9
9
  export type SafeAreaPadding = Record<'top' | 'right' | 'bottom' | 'left', number>;
10
10
 
@@ -20,6 +20,7 @@ export const useSafeArea = (): SafeAreaPadding => {
20
20
  left: parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--safe-area-left')),
21
21
  });
22
22
  }, []);
23
- useResize(handleResize);
23
+
24
+ useViewportResize(handleResize);
24
25
  return padding;
25
26
  };
@@ -2,11 +2,11 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { useCallback, type useEffect, useState } from 'react';
5
+ import { useCallback, useState } from 'react';
6
6
 
7
- import { useResize } from '@dxos/react-hooks';
7
+ import { useViewportResize } from '@dxos/react-hooks';
8
8
 
9
- export const useVisualViewport = (deps?: Parameters<typeof useEffect>[1]) => {
9
+ export const useVisualViewport = (deps?: Parameters<typeof useViewportResize>[1]) => {
10
10
  const [width, setWidth] = useState<number | null>(null);
11
11
  const [height, setHeight] = useState<number | null>(null);
12
12
 
@@ -17,7 +17,7 @@ export const useVisualViewport = (deps?: Parameters<typeof useEffect>[1]) => {
17
17
  }
18
18
  }, []);
19
19
 
20
- useResize(handleResize);
20
+ useViewportResize(handleResize, deps);
21
21
 
22
22
  return { width, height };
23
23
  };
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 type * 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';
@@ -2,12 +2,11 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
6
  import React, { useState } from 'react';
8
7
 
9
8
  import { Icon, Input, Select, Toggle, Toolbar } from '../components';
10
- import { withTheme, withSurfaceVariantsLayout } from '../testing';
9
+ import { withLayoutVariants, withTheme } from '../testing';
11
10
 
12
11
  const DefaultStory = () => {
13
12
  const [checked, setChecked] = useState<boolean>(false);
@@ -28,6 +27,7 @@ const DefaultStory = () => {
28
27
  <Select.Option value={'b'}>B</Select.Option>
29
28
  <Select.Option value={'c'}>C</Select.Option>
30
29
  </Select.Viewport>
30
+ <Select.Arrow />
31
31
  </Select.Content>
32
32
  </Select.Portal>
33
33
  </Select.Root>
@@ -80,11 +80,14 @@ const DefaultStory = () => {
80
80
  );
81
81
  };
82
82
 
83
- export default {
84
- title: 'ui/react-ui-core/Playground/Controls',
83
+ const meta = {
84
+ title: 'ui/react-ui-core/playground/Controls',
85
85
  render: DefaultStory,
86
- decorators: [withSurfaceVariantsLayout(), withTheme],
87
- parameters: { chromatic: { disableSnapshot: false } },
88
- };
86
+ decorators: [withTheme(), withLayoutVariants()],
87
+ } satisfies Meta<typeof Icon>;
88
+
89
+ export default meta;
90
+
91
+ type Story = StoryObj<typeof meta>;
89
92
 
90
- export const Default = {};
93
+ export const Default: Story = {};
@@ -2,23 +2,12 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type StoryObj, type Meta } from '@storybook/react-vite';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React from 'react';
9
7
 
10
- import { Button, IconButton, type ButtonProps, Tooltip } from '../components';
8
+ import { Button, type ButtonProps, IconButton, Tooltip } from '../components';
11
9
  import { withTheme } from '../testing';
12
10
 
13
- // TODO(burdon): Change density to 3 or 4 sizes: (large, medium, small; or 22, 28, 32, 40)
14
- // TODO(burdon): IconButton should be square if no text.
15
- // TODO(burdon): IconButton icon should be auto-sized based on density.
16
-
17
- // TODO(burdon): Remove custom padding from all Buttons.
18
-
19
- // TODO(burdon): Forms w/ labels.
20
- // TODO(burdon): Card preview with sections.
21
-
22
11
  const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
23
12
  return (
24
13
  <Tooltip.Provider>
@@ -41,7 +30,7 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
41
30
  iconOnly
42
31
  size={7}
43
32
  density='coarse'
44
- classNames='px-1.5'
33
+ classNames='pli-1.5'
45
34
  />
46
35
  </div>
47
36
  </div>
@@ -54,7 +43,7 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
54
43
  </Button>
55
44
  </div>
56
45
  <div className='flex justify-center'>
57
- <IconButton {...args} label='Test' icon='ph--atom--regular' size={5} density='fine' classNames='px-2' />
46
+ <IconButton {...args} label='Test' icon='ph--atom--regular' density='fine' classNames='pli-2' />
58
47
  </div>
59
48
  <div className='flex justify-center'>
60
49
  <IconButton
@@ -62,9 +51,8 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
62
51
  label='Test'
63
52
  icon='ph--atom--regular'
64
53
  iconOnly
65
- size={5}
66
54
  density='fine'
67
- classNames='py-1 px-1.5'
55
+ classNames='plb-1 pli-1.5'
68
56
  />
69
57
  </div>
70
58
  </div>
@@ -72,7 +60,7 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
72
60
  {/* Small */}
73
61
  <div className='grid grid-cols-3 gap-4'>
74
62
  <div className='flex justify-center'>
75
- <Button {...args} density='fine' classNames={'!h-[24px] !text-[14px] p-0 px-1.5 min-bs-0'}>
63
+ <Button {...args} density='fine' classNames={'!h-[24px] !text-[14px] p-0 pli-1.5 min-bs-0'}>
76
64
  {children}
77
65
  </Button>
78
66
  </div>
@@ -101,18 +89,17 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
101
89
 
102
90
  {/* TODO(burdon): Full variant with max width. */}
103
91
  <div className='flex justify-center'>
104
- <Button classNames='w-full max-w-[15rem] rounded' variant='default'>
92
+ <Button classNames='is-full max-is-[15rem] rounded' variant='default'>
105
93
  Test
106
94
  </Button>
107
95
  </div>
108
96
  <div className='flex justify-center'>
109
97
  {/* TODO(burdon): Option to have button on RHS. Default size for icon should be 5 for this (medium) density. */}
110
98
  <IconButton
111
- classNames='w-full max-w-[15rem] rounded'
99
+ classNames='is-full max-is-[15rem] rounded'
112
100
  variant='primary'
113
101
  icon='ph--arrows-clockwise--regular'
114
102
  label='Test'
115
- size={5}
116
103
  />
117
104
  </div>
118
105
  </div>
@@ -120,13 +107,15 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
120
107
  );
121
108
  };
122
109
 
123
- const meta: Meta<typeof Button> = {
124
- title: 'ui/react-ui-core/Playground/Custom',
110
+ const meta = {
111
+ title: 'ui/react-ui-core/playground/Custom',
125
112
  component: Button,
126
113
  render: DefaultStory,
127
- decorators: [withTheme],
128
- parameters: { layout: 'centered' },
129
- };
114
+ decorators: [withTheme()],
115
+ parameters: {
116
+ layout: 'centered',
117
+ },
118
+ } satisfies Meta<typeof Button>;
130
119
 
131
120
  export default meta;
132
121
 
@@ -2,8 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
6
  import React from 'react';
8
7
 
9
8
  import { withTheme } from '../testing';
@@ -43,13 +42,16 @@ const DefaultStory = () => {
43
42
  );
44
43
  };
45
44
 
46
- export default {
47
- title: 'ui/react-ui-core/Playground/Typography',
45
+ const meta = {
46
+ title: 'ui/react-ui-core/playground/Typography',
48
47
  render: DefaultStory,
49
- decorators: [withTheme],
50
- parameters: { chromatic: { disableSnapshot: false } },
51
- };
48
+ decorators: [withTheme()],
49
+ } satisfies Meta<typeof DefaultStory>;
50
+
51
+ export default meta;
52
+
53
+ type Story = StoryObj<typeof meta>;
52
54
 
53
- export const Default = {
55
+ export const Default: Story = {
54
56
  args: {},
55
57
  };
@@ -0,0 +1,67 @@
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 { Input } from '../../components';
9
+ import { withTheme } from '../../testing';
10
+
11
+ import { Container, type ContainerRootProps } from './Container';
12
+
13
+ const DefaultStory = (props: ContainerRootProps) => {
14
+ return (
15
+ <div className='plb-2 is-[20rem] border border-separator rounded-sm'>
16
+ <Container.Root {...props}>
17
+ <Container.Column>
18
+ <Input.Root>
19
+ <Input.Label>Label</Input.Label>
20
+ <Input.TextInput />
21
+ </Input.Root>
22
+ </Container.Column>
23
+ </Container.Root>
24
+ </div>
25
+ );
26
+ };
27
+
28
+ const meta: Meta<typeof Container.Root> = {
29
+ title: 'ui/react-ui-core/primitives/Container',
30
+ component: Container.Root,
31
+ render: DefaultStory,
32
+ decorators: [withTheme()],
33
+ parameters: {
34
+ layout: 'centered',
35
+ },
36
+ };
37
+
38
+ export default meta;
39
+
40
+ type Story = StoryObj<typeof meta>;
41
+
42
+ // TODO(burdon): Requires container.
43
+ export const Default = () => {
44
+ return (
45
+ <Container.Root>
46
+ <Container.Column>Column</Container.Column>
47
+ </Container.Root>
48
+ );
49
+ };
50
+
51
+ export const SM: Story = {
52
+ args: {
53
+ variant: 'sm',
54
+ },
55
+ };
56
+
57
+ export const MD: Story = {
58
+ args: {
59
+ variant: 'md',
60
+ },
61
+ };
62
+
63
+ export const LG: Story = {
64
+ args: {
65
+ variant: 'lg',
66
+ },
67
+ };
@@ -0,0 +1,79 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { createContext } from '@radix-ui/react-context';
6
+ import { Primitive } from '@radix-ui/react-primitive';
7
+ import { Slot } from '@radix-ui/react-slot';
8
+ import React, { type PropsWithChildren, type Ref, forwardRef } from 'react';
9
+
10
+ import { type ColumnPadding } from '@dxos/ui-theme';
11
+ import { type SlottableProps } from '@dxos/ui-types';
12
+
13
+ import { useThemeContext } from '../../hooks';
14
+
15
+ // TODO(burdon): Replace Form, Container, Card spacing.
16
+ // TODO(burdon): Scrolling (reconcile with Mosaic Viewport).
17
+ // TODO(burdon): Reconcile AnchoredOverflow.
18
+
19
+ //
20
+ // Context
21
+ //
22
+
23
+ type ContainerContext = {
24
+ variant?: ColumnPadding;
25
+ };
26
+
27
+ const [ContainerProvider, useContext] = createContext<ContainerContext>('Container');
28
+
29
+ //
30
+ // Root
31
+ //
32
+
33
+ type RootProps = PropsWithChildren<Partial<ContainerContext>>;
34
+
35
+ const Root = ({ variant, children }: RootProps) => {
36
+ return <ContainerProvider {...{ variant }}>{children}</ContainerProvider>;
37
+ };
38
+
39
+ //
40
+ // Column
41
+ //
42
+
43
+ const CONTAINER_COLUMN_NAME = 'Container.Column';
44
+
45
+ type ColumnProps = SlottableProps<HTMLDivElement> & { variant?: ColumnPadding };
46
+
47
+ const Column = forwardRef(
48
+ (
49
+ { classNames, className, asChild, role = 'none', children, variant, ...props }: ColumnProps,
50
+ ref: Ref<HTMLDivElement>,
51
+ ) => {
52
+ const { tx } = useThemeContext();
53
+ const Root = asChild ? Slot : Primitive.div;
54
+ const context = useContext(CONTAINER_COLUMN_NAME);
55
+ return (
56
+ <Root
57
+ {...props}
58
+ className={tx('container.column', { variant: variant ?? context.variant }, [className, classNames])}
59
+ role={role}
60
+ ref={ref}
61
+ >
62
+ {children}
63
+ </Root>
64
+ );
65
+ },
66
+ );
67
+
68
+ Column.displayName = CONTAINER_COLUMN_NAME;
69
+
70
+ //
71
+ // Container
72
+ //
73
+
74
+ export const Container = {
75
+ Root,
76
+ Column,
77
+ };
78
+
79
+ export type { RootProps as ContainerRootProps, ColumnProps as ContainerColumnProps };
@@ -0,0 +1,57 @@
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 { Input, ScrollArea, Toolbar } from '../../components';
9
+ import { withLayout, withTheme } from '../../testing';
10
+
11
+ import { Layout } from './Layout';
12
+
13
+ const DefaultStory = ({ count }: { count: number }) => {
14
+ return (
15
+ <Layout.Main toolbar statusbar>
16
+ <Toolbar.Root classNames='gap-2'>
17
+ <Toolbar.IconButton icon='ph--plus--regular' variant='primary' label='Add' />
18
+ <Input.Root>
19
+ <Input.TextInput placeholder='Search' />
20
+ </Input.Root>
21
+ <Toolbar.IconButton icon='ph--dots-three-vertical--regular' iconOnly label='Menu' />
22
+ </Toolbar.Root>
23
+ <ScrollArea.Root thin orientation='vertical'>
24
+ <ScrollArea.Viewport classNames='pli-2 plb-1 gap-1'>
25
+ {Array.from({ length: count }).map((_, index) => (
26
+ <div key={index} role='listitem' className='pli-2 plb-1 border border-separator'>
27
+ {index}
28
+ </div>
29
+ ))}
30
+ </ScrollArea.Viewport>
31
+ </ScrollArea.Root>
32
+ <Toolbar.Root classNames='justify-between'>
33
+ <Toolbar.IconButton variant='ghost' icon='ph--house--regular' iconOnly label='Add' size={4} />
34
+ <Toolbar.IconButton variant='ghost' icon='ph--alarm--regular' iconOnly label='Status' size={4} />
35
+ </Toolbar.Root>
36
+ </Layout.Main>
37
+ );
38
+ };
39
+
40
+ const meta: Meta<typeof DefaultStory> = {
41
+ title: 'ui/react-ui-core/primitives/Layout',
42
+ component: DefaultStory,
43
+ decorators: [withTheme(), withLayout({ layout: 'column' })],
44
+ parameters: {
45
+ layout: 'fullscreen',
46
+ },
47
+ };
48
+
49
+ export default meta;
50
+
51
+ type Story = StoryObj<typeof meta>;
52
+
53
+ export const Default: Story = {
54
+ args: {
55
+ count: 100,
56
+ },
57
+ };
@@ -0,0 +1,61 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React, { type PropsWithChildren, forwardRef, useMemo } from 'react';
6
+
7
+ import { mx } from '@dxos/ui-theme';
8
+ import { type ThemedClassName } from '@dxos/ui-types';
9
+
10
+ //
11
+ // Main
12
+ //
13
+
14
+ type MainProps = ThemedClassName<
15
+ PropsWithChildren<{
16
+ role?: string;
17
+ toolbar?: boolean;
18
+ statusbar?: boolean;
19
+ }>
20
+ >;
21
+
22
+ const Main = forwardRef<HTMLDivElement, MainProps>(
23
+ ({ classNames, children, role, toolbar, statusbar }, forwardedRef) => {
24
+ const style = useMemo(
25
+ () => ({
26
+ gridTemplateRows: [toolbar && 'var(--toolbar-size)', '1fr', statusbar && 'var(--statusbar-size)']
27
+ .filter(Boolean)
28
+ .join(' '),
29
+ }),
30
+ [toolbar, statusbar],
31
+ );
32
+
33
+ return (
34
+ <div
35
+ ref={forwardedRef}
36
+ role={role ?? 'none'}
37
+ style={style}
38
+ className={mx(
39
+ 'bs-full is-full grid grid-cols-[100%] overflow-hidden',
40
+ toolbar && [
41
+ '[.dx-main-mobile-layout_&>.dx-toolbar]:pli-3 [&>.dx-toolbar]:relative',
42
+ '[&>.dx-toolbar]:border-be [&>.dx-toolbar]:border-subduedSeparator',
43
+ ],
44
+ classNames,
45
+ )}
46
+ >
47
+ {children}
48
+ </div>
49
+ );
50
+ },
51
+ );
52
+
53
+ //
54
+ // Layout
55
+ //
56
+
57
+ export const Layout = {
58
+ Main,
59
+ };
60
+
61
+ export type { MainProps as LayoutMainProps };
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './Container';
6
+ export * from './Layout';
@@ -0,0 +1,26 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React, { type HTMLAttributes } from 'react';
6
+
7
+ import { mx } from '@dxos/ui-theme';
8
+ import { type ThemedClassName } from '@dxos/ui-types';
9
+
10
+ export type FlexProps = ThemedClassName<
11
+ HTMLAttributes<HTMLDivElement> & {
12
+ column?: boolean;
13
+ grow?: boolean;
14
+ }
15
+ >;
16
+
17
+ export const Flex = ({ children, classNames, role, column, grow }: FlexProps) => {
18
+ return (
19
+ <div
20
+ role={role ?? 'none'}
21
+ className={mx('flex', column && 'flex-col', grow && 'flex-1 overflow-hidden', classNames)}
22
+ >
23
+ {children}
24
+ </div>
25
+ );
26
+ };