@dxos/react-ui 0.8.4-main.406dc2a → 0.8.4-main.4a85c3132b

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 (392) hide show
  1. package/dist/lib/browser/chunk-2FKSMWNY.mjs +774 -0
  2. package/dist/lib/browser/chunk-2FKSMWNY.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +3929 -66
  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 +58 -64
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/chunk-ZNBLTSHI.mjs +776 -0
  9. package/dist/lib/node-esm/chunk-ZNBLTSHI.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +3929 -66
  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 +58 -64
  14. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  15. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  16. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  17. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  18. package/dist/types/src/components/{Buttons → Button}/Button.d.ts +1 -1
  19. package/dist/types/src/components/Button/Button.d.ts.map +1 -0
  20. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -0
  21. package/dist/types/src/components/{Buttons → Button}/IconButton.d.ts +2 -2
  22. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -0
  23. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -0
  24. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -0
  25. package/dist/types/src/components/Button/Toggle.stories.d.ts +16 -0
  26. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -0
  27. package/dist/types/src/components/{Buttons → Button}/ToggleGroup.d.ts +4 -4
  28. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -0
  29. package/dist/types/src/components/{Buttons → Button}/ToggleGroup.stories.d.ts +4 -4
  30. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -0
  31. package/dist/types/src/components/Button/index.d.ts.map +1 -0
  32. package/dist/types/src/components/Card/Card.d.ts +121 -0
  33. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  34. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  35. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  36. package/dist/types/src/components/Card/index.d.ts +2 -0
  37. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  38. package/dist/types/src/components/Clipboard/CopyButton.d.ts +1 -1
  39. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  40. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  41. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  42. package/dist/types/src/components/{Dialogs → Dialog}/AlertDialog.d.ts +12 -3
  43. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -0
  44. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -0
  45. package/dist/types/src/components/Dialog/Dialog.d.ts +47 -0
  46. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -0
  47. package/dist/types/src/components/{Dialogs → Dialog}/Dialog.stories.d.ts +9 -10
  48. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -0
  49. package/dist/types/src/components/Dialog/index.d.ts.map +1 -0
  50. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  51. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  52. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  53. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  54. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  55. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  56. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +8 -0
  57. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  58. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  59. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  60. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  61. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  62. package/dist/types/src/components/Icon/Icon.d.ts +1 -1
  63. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  64. package/dist/types/src/components/Icon/Icon.stories.d.ts +17 -0
  65. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -0
  66. package/dist/types/src/components/Image/Image.d.ts +14 -0
  67. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  68. package/dist/types/src/components/Image/Image.stories.d.ts +33 -0
  69. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  70. package/dist/types/src/components/Image/index.d.ts +2 -0
  71. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  72. package/dist/types/src/components/Input/Input.d.ts +5 -5
  73. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  74. package/dist/types/src/components/Input/Input.stories.d.ts +8 -8
  75. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  76. package/dist/types/src/components/{Lists → List}/List.d.ts +1 -1
  77. package/dist/types/src/components/List/List.d.ts.map +1 -0
  78. package/dist/types/src/components/List/List.stories.d.ts.map +1 -0
  79. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -0
  80. package/dist/types/src/components/List/Tree.d.ts.map +1 -0
  81. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -0
  82. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -0
  83. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -0
  84. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -0
  85. package/dist/types/src/components/List/index.d.ts.map +1 -0
  86. package/dist/types/src/components/Main/Main.d.ts +17 -18
  87. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  88. package/dist/types/src/components/Main/Main.stories.d.ts +0 -3
  89. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  90. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  91. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  92. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  93. package/dist/types/src/components/{Menus → Menu}/DropdownMenu.d.ts +3 -4
  94. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -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 +3 -4
  100. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  101. package/dist/types/src/components/Popover/Popover.d.ts +2 -1
  102. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  103. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +25 -26
  104. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  105. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +46 -8
  106. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  107. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +39 -0
  108. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -0
  109. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +24 -0
  110. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -0
  111. package/dist/types/src/components/ScrollContainer/index.d.ts +2 -0
  112. package/dist/types/src/components/ScrollContainer/index.d.ts.map +1 -0
  113. package/dist/types/src/components/Select/Select.d.ts +10 -10
  114. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  115. package/dist/types/src/components/Separator/Separator.d.ts +1 -1
  116. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  117. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  118. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  119. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  120. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  121. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  122. package/dist/types/src/components/Splitter/Splitter.d.ts +36 -0
  123. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  124. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  125. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  126. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  127. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  128. package/dist/types/src/components/Status/Status.stories.d.ts +4 -2
  129. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  130. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  131. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  132. package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
  133. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  134. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +2 -2
  135. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  136. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts +12 -0
  137. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  138. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
  139. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  140. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  141. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  142. package/dist/types/src/components/Toast/Toast.d.ts +4 -4
  143. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  144. package/dist/types/src/components/Toolbar/Toolbar.d.ts +42 -12
  145. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  146. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  147. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  148. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  149. package/dist/types/src/components/index.d.ts +13 -8
  150. package/dist/types/src/components/index.d.ts.map +1 -1
  151. package/dist/types/src/exemplars/generics.stories.d.ts +18 -0
  152. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  153. package/dist/types/src/exemplars/slot.stories.d.ts +14 -0
  154. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  155. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  156. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  157. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  158. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  159. package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
  160. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  161. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  162. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  163. package/dist/types/src/index.d.ts +2 -1
  164. package/dist/types/src/index.d.ts.map +1 -1
  165. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  166. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  167. package/dist/types/src/primitives/Column/Column.d.ts +32 -0
  168. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  169. package/dist/types/src/primitives/Column/Column.stories.d.ts +6 -0
  170. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  171. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  172. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  173. package/dist/types/src/primitives/Flex/Flex.d.ts +8 -0
  174. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  175. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  176. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  177. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  178. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  179. package/dist/types/src/primitives/Grid/Grid.d.ts +9 -0
  180. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  181. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  182. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  183. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  184. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  185. package/dist/types/src/primitives/Panel/Panel.d.ts +34 -0
  186. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  187. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  188. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  189. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  190. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  191. package/dist/types/src/primitives/index.d.ts +5 -0
  192. package/dist/types/src/primitives/index.d.ts.map +1 -0
  193. package/dist/types/src/testing/decorators/index.d.ts +1 -1
  194. package/dist/types/src/testing/decorators/index.d.ts.map +1 -1
  195. package/dist/types/src/testing/decorators/withLayout.d.ts +3 -3
  196. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  197. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +12 -0
  198. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -0
  199. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  200. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  201. package/dist/types/src/translations.d.ts +11 -0
  202. package/dist/types/src/translations.d.ts.map +1 -0
  203. package/dist/types/src/util/index.d.ts +1 -2
  204. package/dist/types/src/util/index.d.ts.map +1 -1
  205. package/dist/types/tsconfig.tsbuildinfo +1 -1
  206. package/package.json +41 -29
  207. package/src/components/Avatars/Avatar.stories.tsx +5 -6
  208. package/src/components/Avatars/Avatar.tsx +6 -13
  209. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -2
  210. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +4 -4
  211. package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
  212. package/src/components/{Buttons → Button}/Button.stories.tsx +4 -4
  213. package/src/components/{Buttons → Button}/Button.tsx +7 -13
  214. package/src/components/{Buttons → Button}/IconButton.stories.tsx +4 -4
  215. package/src/components/{Buttons → Button}/IconButton.tsx +20 -14
  216. package/src/components/{Buttons → Button}/Toggle.stories.tsx +7 -6
  217. package/src/components/{Buttons → Button}/ToggleGroup.stories.tsx +2 -2
  218. package/src/components/Card/Card.stories.tsx +151 -0
  219. package/src/components/Card/Card.tsx +352 -0
  220. package/src/components/Card/index.ts +5 -0
  221. package/src/components/Clipboard/CopyButton.tsx +7 -7
  222. package/src/components/DensityProvider/DensityProvider.tsx +1 -1
  223. package/src/components/Dialog/AlertDialog.stories.tsx +69 -0
  224. package/src/components/{Dialogs → Dialog}/AlertDialog.tsx +116 -16
  225. package/src/components/Dialog/Dialog.stories.tsx +122 -0
  226. package/src/components/{Dialogs → Dialog}/Dialog.tsx +179 -49
  227. package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
  228. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +50 -0
  229. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  230. package/src/components/ErrorFallback/ErrorStack.tsx +80 -0
  231. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  232. package/src/components/ErrorFallback/index.ts +9 -0
  233. package/src/components/Icon/Icon.stories.tsx +113 -0
  234. package/src/components/Icon/Icon.tsx +3 -3
  235. package/src/components/Image/Image.stories.tsx +86 -0
  236. package/src/components/Image/Image.tsx +223 -0
  237. package/src/components/Image/index.ts +5 -0
  238. package/src/components/Input/Input.stories.tsx +21 -40
  239. package/src/components/Input/Input.tsx +32 -68
  240. package/src/components/Link/Link.stories.tsx +2 -2
  241. package/src/components/Link/Link.tsx +2 -2
  242. package/src/components/{Lists → List}/List.stories.tsx +30 -33
  243. package/src/components/{Lists → List}/List.tsx +12 -17
  244. package/src/components/{Lists → List}/ListDropIndicator.tsx +7 -7
  245. package/src/components/{Lists → List}/Tree.stories.tsx +4 -4
  246. package/src/components/{Lists → List}/TreeDropIndicator.tsx +6 -6
  247. package/src/components/{Lists → List}/Treegrid.stories.tsx +3 -3
  248. package/src/components/{Lists → List}/Treegrid.tsx +10 -15
  249. package/src/components/Main/Main.stories.tsx +41 -23
  250. package/src/components/Main/Main.tsx +149 -92
  251. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +2 -2
  252. package/src/components/{Menus → Menu}/ContextMenu.tsx +9 -33
  253. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +3 -3
  254. package/src/components/{Menus → Menu}/DropdownMenu.tsx +89 -68
  255. package/src/components/Message/Message.stories.tsx +26 -11
  256. package/src/components/Message/Message.tsx +46 -33
  257. package/src/components/Popover/Popover.stories.tsx +5 -5
  258. package/src/components/Popover/Popover.tsx +75 -53
  259. package/src/components/ScrollArea/ScrollArea.stories.tsx +166 -40
  260. package/src/components/ScrollArea/ScrollArea.tsx +84 -82
  261. package/src/components/ScrollArea/index.ts +1 -1
  262. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +89 -0
  263. package/src/components/ScrollContainer/ScrollContainer.tsx +238 -0
  264. package/src/components/ScrollContainer/index.ts +5 -0
  265. package/src/components/Select/Select.stories.tsx +3 -3
  266. package/src/components/Select/Select.tsx +11 -27
  267. package/src/components/Separator/Separator.tsx +1 -1
  268. package/src/components/Skeleton/Skeleton.stories.tsx +52 -0
  269. package/src/components/Skeleton/Skeleton.tsx +26 -0
  270. package/src/components/Skeleton/index.ts +5 -0
  271. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  272. package/src/components/Splitter/Splitter.tsx +138 -0
  273. package/src/components/Splitter/index.ts +5 -0
  274. package/src/components/Status/Status.stories.tsx +21 -17
  275. package/src/components/Status/Status.tsx +2 -2
  276. package/src/components/Tag/Tag.stories.tsx +6 -11
  277. package/src/components/Tag/Tag.tsx +3 -8
  278. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +32 -0
  279. package/src/components/ThemeProvider/ThemeProvider.tsx +5 -6
  280. package/src/components/ThemeProvider/TranslationsProvider.tsx +1 -16
  281. package/src/components/ThemeProvider/index.ts +3 -3
  282. package/src/components/Toast/Toast.stories.tsx +3 -3
  283. package/src/components/Toast/Toast.tsx +10 -14
  284. package/src/components/Toolbar/Toolbar.stories.tsx +4 -6
  285. package/src/components/Toolbar/Toolbar.tsx +190 -13
  286. package/src/components/Tooltip/Tooltip.stories.tsx +16 -14
  287. package/src/components/Tooltip/Tooltip.tsx +25 -22
  288. package/src/components/index.ts +14 -9
  289. package/src/exemplars/generics.stories.tsx +49 -0
  290. package/src/exemplars/slot.stories.tsx +119 -0
  291. package/src/exemplars/tabster.stories.tsx +127 -0
  292. package/src/exemplars/virtualizer.stories.tsx +137 -0
  293. package/src/hooks/useDensityContext.ts +1 -1
  294. package/src/hooks/useElevationContext.ts +1 -1
  295. package/src/index.ts +2 -1
  296. package/src/playground/Controls.stories.tsx +3 -10
  297. package/src/playground/Custom.stories.tsx +8 -10
  298. package/src/playground/Typography.stories.tsx +3 -3
  299. package/src/primitives/Column/Column.stories.tsx +72 -0
  300. package/src/primitives/Column/Column.tsx +156 -0
  301. package/src/primitives/Column/index.ts +5 -0
  302. package/src/primitives/Flex/Flex.stories.tsx +58 -0
  303. package/src/primitives/Flex/Flex.tsx +27 -0
  304. package/src/primitives/Flex/index.ts +5 -0
  305. package/src/primitives/Grid/Grid.stories.tsx +57 -0
  306. package/src/primitives/Grid/Grid.tsx +43 -0
  307. package/src/primitives/Grid/index.ts +5 -0
  308. package/src/primitives/Panel/Panel.stories.tsx +67 -0
  309. package/src/primitives/Panel/Panel.tsx +137 -0
  310. package/src/primitives/Panel/index.ts +5 -0
  311. package/src/primitives/index.ts +8 -0
  312. package/src/testing/decorators/index.ts +1 -1
  313. package/src/testing/decorators/withLayout.tsx +39 -18
  314. package/src/testing/decorators/withLayoutVariants.tsx +48 -0
  315. package/src/testing/decorators/withTheme.tsx +21 -18
  316. package/src/translations.ts +19 -0
  317. package/src/util/index.ts +2 -2
  318. package/dist/lib/browser/chunk-KX5JDELJ.mjs +0 -4521
  319. package/dist/lib/browser/chunk-KX5JDELJ.mjs.map +0 -7
  320. package/dist/lib/node-esm/chunk-3HDQYL5S.mjs +0 -4523
  321. package/dist/lib/node-esm/chunk-3HDQYL5S.mjs.map +0 -7
  322. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  323. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  324. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  325. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  326. package/dist/types/src/components/Buttons/Button.d.ts.map +0 -1
  327. package/dist/types/src/components/Buttons/Button.stories.d.ts.map +0 -1
  328. package/dist/types/src/components/Buttons/IconButton.d.ts.map +0 -1
  329. package/dist/types/src/components/Buttons/IconButton.stories.d.ts.map +0 -1
  330. package/dist/types/src/components/Buttons/Toggle.d.ts.map +0 -1
  331. package/dist/types/src/components/Buttons/Toggle.stories.d.ts +0 -13
  332. package/dist/types/src/components/Buttons/Toggle.stories.d.ts.map +0 -1
  333. package/dist/types/src/components/Buttons/ToggleGroup.d.ts.map +0 -1
  334. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts.map +0 -1
  335. package/dist/types/src/components/Buttons/index.d.ts.map +0 -1
  336. package/dist/types/src/components/Dialogs/AlertDialog.d.ts.map +0 -1
  337. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts.map +0 -1
  338. package/dist/types/src/components/Dialogs/Dialog.d.ts +0 -31
  339. package/dist/types/src/components/Dialogs/Dialog.d.ts.map +0 -1
  340. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts.map +0 -1
  341. package/dist/types/src/components/Dialogs/index.d.ts.map +0 -1
  342. package/dist/types/src/components/Lists/List.d.ts.map +0 -1
  343. package/dist/types/src/components/Lists/List.stories.d.ts.map +0 -1
  344. package/dist/types/src/components/Lists/ListDropIndicator.d.ts.map +0 -1
  345. package/dist/types/src/components/Lists/Tree.d.ts.map +0 -1
  346. package/dist/types/src/components/Lists/Tree.stories.d.ts.map +0 -1
  347. package/dist/types/src/components/Lists/TreeDropIndicator.d.ts.map +0 -1
  348. package/dist/types/src/components/Lists/Treegrid.d.ts.map +0 -1
  349. package/dist/types/src/components/Lists/Treegrid.stories.d.ts.map +0 -1
  350. package/dist/types/src/components/Lists/index.d.ts.map +0 -1
  351. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  352. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  353. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  354. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  355. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  356. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts +0 -12
  357. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts.map +0 -1
  358. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  359. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  360. package/dist/types/src/util/domino.d.ts +0 -18
  361. package/dist/types/src/util/domino.d.ts.map +0 -1
  362. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
  363. package/src/components/AnchoredOverflow/index.ts +0 -5
  364. package/src/components/Dialogs/AlertDialog.stories.tsx +0 -69
  365. package/src/components/Dialogs/Dialog.stories.tsx +0 -67
  366. package/src/testing/decorators/withSurfaceVariantsLayout.tsx +0 -51
  367. package/src/util/ThemedClassName.ts +0 -7
  368. package/src/util/domino.ts +0 -53
  369. /package/dist/types/src/components/{Buttons → Button}/Button.stories.d.ts +0 -0
  370. /package/dist/types/src/components/{Buttons → Button}/IconButton.stories.d.ts +0 -0
  371. /package/dist/types/src/components/{Buttons → Button}/Toggle.d.ts +0 -0
  372. /package/dist/types/src/components/{Buttons → Button}/index.d.ts +0 -0
  373. /package/dist/types/src/components/{Dialogs → Dialog}/AlertDialog.stories.d.ts +0 -0
  374. /package/dist/types/src/components/{Dialogs → Dialog}/index.d.ts +0 -0
  375. /package/dist/types/src/components/{Lists → List}/List.stories.d.ts +0 -0
  376. /package/dist/types/src/components/{Lists → List}/ListDropIndicator.d.ts +0 -0
  377. /package/dist/types/src/components/{Lists → List}/Tree.d.ts +0 -0
  378. /package/dist/types/src/components/{Lists → List}/Tree.stories.d.ts +0 -0
  379. /package/dist/types/src/components/{Lists → List}/TreeDropIndicator.d.ts +0 -0
  380. /package/dist/types/src/components/{Lists → List}/Treegrid.d.ts +0 -0
  381. /package/dist/types/src/components/{Lists → List}/Treegrid.stories.d.ts +0 -0
  382. /package/dist/types/src/components/{Lists → List}/index.d.ts +0 -0
  383. /package/dist/types/src/components/{Menus → Menu}/ContextMenu.stories.d.ts +0 -0
  384. /package/dist/types/src/components/{Menus → Menu}/DropdownMenu.stories.d.ts +0 -0
  385. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  386. /package/src/components/{Buttons → Button}/Toggle.tsx +0 -0
  387. /package/src/components/{Buttons → Button}/ToggleGroup.tsx +0 -0
  388. /package/src/components/{Buttons → Button}/index.ts +0 -0
  389. /package/src/components/{Dialogs → Dialog}/index.ts +0 -0
  390. /package/src/components/{Lists → List}/Tree.tsx +0 -0
  391. /package/src/components/{Lists → List}/index.ts +0 -0
  392. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -0,0 +1,156 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Primitive } from '@radix-ui/react-primitive';
6
+ import { Slot } from '@radix-ui/react-slot';
7
+ import React, { type CSSProperties, forwardRef } from 'react';
8
+
9
+ import { type SlottableProps } from '@dxos/ui-types';
10
+
11
+ import { useThemeContext } from '../../hooks';
12
+
13
+ //
14
+ // Root
15
+ //
16
+
17
+ const COLUMN_ROOT_NAME = 'Column.Root';
18
+
19
+ type GutterSize = 'sm' | 'md' | 'lg' | 'rail';
20
+
21
+ const gutterSizes: Record<GutterSize, string> = {
22
+ sm: 'var(--dx-gutter-sm)',
23
+ md: 'var(--dx-gutter-md)',
24
+ lg: 'var(--dx-gutter-lg)',
25
+ rail: 'var(--dx-rail-item)',
26
+ };
27
+
28
+ type ColumnRootProps = SlottableProps<HTMLDivElement> & { gutter?: GutterSize };
29
+
30
+ /**
31
+ * Creates a vertical channel with left/right gutter columns.
32
+ * The `--gutter` CSS variable is set for nested components (Dialog, ScrollArea, Form.Viewport, etc.).
33
+ * Use `gutter='rail'` for icon-slot row layouts (Card); `gutter='md'` for whitespace layouts (Dialog).
34
+ * Direct children must use Column.Row (spans all 3 cols) or Column.Segment (center col only).
35
+ *
36
+ * NOTE: The theme applies a `dx-column` marker class to this element.
37
+ * ScrollArea.Root detects this via `[.dx-column_&]:col-span-full` to span all 3 grid columns,
38
+ * ensuring scroll content extends under the gutters rather than being confined to the center column.
39
+ * The `--gutter` CSS variable is also consumed by ScrollArea's `margin` option to align scrollbar spacing.
40
+ */
41
+ const Root = forwardRef<HTMLDivElement, ColumnRootProps>(
42
+ ({ classNames, className, asChild, role, children, gutter = 'md', ...props }, forwardedRef) => {
43
+ const { tx } = useThemeContext();
44
+ const Component = asChild ? Slot : Primitive.div;
45
+ const gutterSize = gutterSizes[gutter];
46
+ return (
47
+ <Component
48
+ {...props}
49
+ role={role ?? 'none'}
50
+ style={
51
+ {
52
+ '--gutter': gutterSize,
53
+ gridTemplateColumns: [gutterSize, 'minmax(0,1fr)', gutterSize].join(' '),
54
+ } as CSSProperties
55
+ }
56
+ className={tx('column.root', { gutter }, [className, classNames])}
57
+ ref={forwardedRef}
58
+ >
59
+ {children}
60
+ </Component>
61
+ );
62
+ },
63
+ );
64
+
65
+ Root.displayName = COLUMN_ROOT_NAME;
66
+
67
+ //
68
+ // Row
69
+ //
70
+
71
+ const COLUMN_ROW_NAME = 'Column.Row';
72
+
73
+ type ColumnRowProps = SlottableProps<HTMLDivElement>;
74
+
75
+ /**
76
+ * Spans all 3 columns of the parent Column.Root and uses CSS subgrid to inherit their sizing.
77
+ * Children map to: [col-1: icon/slot] [col-2: content] [col-3: icon/action].
78
+ * Must be a direct child of Column.Root.
79
+ */
80
+ const Row = forwardRef<HTMLDivElement, ColumnRowProps>(
81
+ ({ classNames, className, asChild, role, children, ...props }, forwardedRef) => {
82
+ const { tx } = useThemeContext();
83
+ const Component = asChild ? Slot : Primitive.div;
84
+ return (
85
+ <Component
86
+ {...props}
87
+ className={tx('column.row', {}, [className, classNames])}
88
+ role={role ?? 'none'}
89
+ ref={forwardedRef}
90
+ >
91
+ {children}
92
+ </Component>
93
+ );
94
+ },
95
+ );
96
+
97
+ Row.displayName = COLUMN_ROW_NAME;
98
+
99
+ //
100
+ // Segment
101
+ //
102
+
103
+ const COLUMN_SEGMENT_NAME = 'Column.Segment';
104
+
105
+ type ColumnSegmentProps = SlottableProps<HTMLDivElement>;
106
+
107
+ /**
108
+ * Occupies only the center column (col-2) of the parent Column.Root grid.
109
+ * Use `asChild` to merge grid positioning onto the child element, eliminating the wrapper div.
110
+ * NOTE: Must not use overflow-hidden here since it will clip input focus rings.
111
+ */
112
+ const Segment = forwardRef<HTMLDivElement, ColumnSegmentProps>(
113
+ ({ classNames, className, asChild, role, children, ...props }, forwardedRef) => {
114
+ const { tx } = useThemeContext();
115
+ const Component = asChild ? Slot : Primitive.div;
116
+
117
+ if (asChild) {
118
+ // With asChild, merge col-start-2 directly onto the child — no contents wrapper needed.
119
+ return (
120
+ <Component
121
+ {...props}
122
+ role={role ?? 'none'}
123
+ className={tx('column.segment', {}, [className, classNames])}
124
+ ref={forwardedRef}
125
+ >
126
+ {children}
127
+ </Component>
128
+ );
129
+ }
130
+
131
+ return (
132
+ <Component
133
+ {...props}
134
+ className={tx('column.segment', {}, [className, classNames])}
135
+ role={role}
136
+ ref={forwardedRef}
137
+ >
138
+ <div className='contents'>{children}</div>
139
+ </Component>
140
+ );
141
+ },
142
+ );
143
+
144
+ Segment.displayName = COLUMN_SEGMENT_NAME;
145
+
146
+ //
147
+ // Column
148
+ //
149
+
150
+ export const Column = {
151
+ Root,
152
+ Row,
153
+ Segment,
154
+ };
155
+
156
+ export type { ColumnRootProps, ColumnRowProps, ColumnSegmentProps };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './Column';
@@ -0,0 +1,58 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React from 'react';
7
+
8
+ import { type ChromaticPalette } from '@dxos/ui-types';
9
+
10
+ import { withLayout, withTheme } from '../../testing';
11
+
12
+ import { Flex } from './Flex';
13
+
14
+ const Cell = ({ label, hue }: { label: string; hue: ChromaticPalette }) => (
15
+ <div data-hue={hue} className='flex w-full dx-panel p-2 text-sm font-mono border rounded-sm'>
16
+ {label}
17
+ </div>
18
+ );
19
+
20
+ const RowStory = () => (
21
+ <Flex classNames='gap-2 p-2'>
22
+ <Cell label='A' hue='red' />
23
+ <Cell label='B' hue='green' />
24
+ <Cell label='C' hue='blue' />
25
+ </Flex>
26
+ );
27
+
28
+ const ColumnStory = () => (
29
+ <Flex column classNames='gap-2 p-2'>
30
+ <Cell label='A' hue='red' />
31
+ <Cell label='B' hue='green' />
32
+ <Cell label='C' hue='blue' />
33
+ </Flex>
34
+ );
35
+
36
+ const GrowStory = () => (
37
+ <Flex column grow classNames='gap-2 p-2'>
38
+ <Cell label='Header' hue='yellow' />
39
+ <Flex grow>
40
+ <Cell label='Content (grows)' hue='blue' />
41
+ </Flex>
42
+ <Cell label='Footer' hue='orange' />
43
+ </Flex>
44
+ );
45
+
46
+ const meta: Meta = {
47
+ title: 'ui/react-ui-core/primitives/Flex',
48
+ decorators: [withTheme(), withLayout({ layout: 'column' })],
49
+ parameters: { layout: 'fullscreen' },
50
+ };
51
+
52
+ export default meta;
53
+
54
+ type Story = StoryObj<typeof meta>;
55
+
56
+ export const Row: Story = { render: RowStory };
57
+ export const Column: Story = { render: ColumnStory };
58
+ export const Grow: Story = { render: GrowStory };
@@ -0,0 +1,27 @@
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 ComposableProps } from '@dxos/ui-types';
9
+
10
+ export type FlexProps = ComposableProps<
11
+ HTMLAttributes<HTMLDivElement> & {
12
+ column?: boolean;
13
+ grow?: boolean;
14
+ }
15
+ >;
16
+
17
+ export const Flex = ({ children, classNames, className, role, column, grow, ...props }: FlexProps) => {
18
+ return (
19
+ <div
20
+ {...props}
21
+ role={role ?? 'none'}
22
+ className={mx('flex', column && 'flex-col', grow && 'flex-1 overflow-hidden', className, classNames)}
23
+ >
24
+ {children}
25
+ </div>
26
+ );
27
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './Flex';
@@ -0,0 +1,57 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React from 'react';
7
+
8
+ import { type ChromaticPalette } from '@dxos/ui-types';
9
+
10
+ import { withLayout, withTheme } from '../../testing';
11
+
12
+ import { Grid } from './Grid';
13
+
14
+ const Cell = ({ label, hue }: { label: string; hue: ChromaticPalette }) => (
15
+ <div data-hue={hue} className='dx-panel p-2 text-sm font-mono border rounded-sm'>
16
+ {label}
17
+ </div>
18
+ );
19
+
20
+ const ColsStory = () => (
21
+ <Grid cols={3} classNames='gap-2 p-2'>
22
+ <Cell label='Row 1' hue='red' />
23
+ <Cell label='Row 2' hue='green' />
24
+ <Cell label='Row 3' hue='blue' />
25
+ </Grid>
26
+ );
27
+
28
+ const RowsStory = () => (
29
+ <Grid rows={3} classNames='gap-2 p-2'>
30
+ <Cell label='Row 1' hue='red' />
31
+ <Cell label='Row 2' hue='green' />
32
+ <Cell label='Row 3' hue='blue' />
33
+ </Grid>
34
+ );
35
+
36
+ const MixedStory = () => (
37
+ <Grid cols={2} rows={2} classNames='gap-2 p-2'>
38
+ <Cell label='A' hue='red' />
39
+ <Cell label='B' hue='green' />
40
+ <Cell label='C' hue='blue' />
41
+ <Cell label='D' hue='yellow' />
42
+ </Grid>
43
+ );
44
+
45
+ const meta: Meta = {
46
+ title: 'ui/react-ui-core/primitives/Grid',
47
+ decorators: [withTheme(), withLayout({ layout: 'column' })],
48
+ parameters: { layout: 'fullscreen' },
49
+ };
50
+
51
+ export default meta;
52
+
53
+ type Story = StoryObj<typeof meta>;
54
+
55
+ export const Cols: Story = { render: ColsStory };
56
+ export const Rows: Story = { render: RowsStory };
57
+ export const Mixed: Story = { render: MixedStory };
@@ -0,0 +1,43 @@
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 ComposableProps } from '@dxos/ui-types';
9
+
10
+ export type GridProps = ComposableProps<
11
+ HTMLAttributes<HTMLDivElement> & {
12
+ cols?: number;
13
+ rows?: number;
14
+ grow?: boolean;
15
+ }
16
+ >;
17
+
18
+ export const Grid = ({
19
+ children,
20
+ classNames,
21
+ className,
22
+ style,
23
+ role,
24
+ cols,
25
+ rows,
26
+ grow = true,
27
+ ...props
28
+ }: GridProps) => {
29
+ return (
30
+ <div
31
+ {...props}
32
+ role={role ?? 'none'}
33
+ style={{
34
+ gridTemplateColumns: cols ? `repeat(${cols}, 1fr)` : undefined,
35
+ gridTemplateRows: rows ? `repeat(${rows}, 1fr)` : undefined,
36
+ ...style,
37
+ }}
38
+ className={mx('grid overflow-hidden', grow && 'dx-container', className, classNames)}
39
+ >
40
+ {children}
41
+ </div>
42
+ );
43
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './Grid';
@@ -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, ScrollArea, Toolbar } from '../../components';
9
+ import { withLayout, withTheme } from '../../testing';
10
+
11
+ import { Panel } from './Panel';
12
+
13
+ const List = () => {
14
+ return (
15
+ <ScrollArea.Root margin role='list'>
16
+ <ScrollArea.Viewport>
17
+ {Array.from({ length: 100 }).map((_, i) => (
18
+ <div key={i} role='listitem' className='p-1 hover:bg-hover-surface'>
19
+ Item {i}
20
+ </div>
21
+ ))}
22
+ </ScrollArea.Viewport>
23
+ </ScrollArea.Root>
24
+ );
25
+ };
26
+
27
+ const DefaultStory = () => {
28
+ return (
29
+ <Panel.Root className='dx-article'>
30
+ <Panel.Toolbar asChild>
31
+ <Toolbar.Root classNames='gap-2'>
32
+ <Toolbar.IconButton icon='ph--plus--regular' variant='primary' label='Add' />
33
+ <Input.Root>
34
+ <Input.TextInput placeholder='Search' />
35
+ </Input.Root>
36
+ <Toolbar.IconButton icon='ph--dots-three-vertical--regular' iconOnly label='Menu' />
37
+ </Toolbar.Root>
38
+ </Panel.Toolbar>
39
+
40
+ <Panel.Content asChild>
41
+ <List />
42
+ </Panel.Content>
43
+
44
+ <Panel.Statusbar asChild>
45
+ <Toolbar.Root classNames='justify-between'>
46
+ <Toolbar.IconButton variant='ghost' icon='ph--house--regular' iconOnly label='Add' size={4} />
47
+ <Toolbar.IconButton variant='ghost' icon='ph--alarm--regular' iconOnly label='Status' size={4} />
48
+ </Toolbar.Root>
49
+ </Panel.Statusbar>
50
+ </Panel.Root>
51
+ );
52
+ };
53
+
54
+ const meta: Meta = {
55
+ title: 'ui/react-ui-core/primitives/Panel',
56
+ render: DefaultStory,
57
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
58
+ parameters: {
59
+ layout: 'fullscreen',
60
+ },
61
+ };
62
+
63
+ export default meta;
64
+
65
+ type Story = StoryObj<typeof meta>;
66
+
67
+ export const Default: Story = {};
@@ -0,0 +1,137 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { Primitive } from '@radix-ui/react-primitive';
6
+ import { Slot } from '@radix-ui/react-slot';
7
+ import React, { forwardRef } from 'react';
8
+
9
+ import { type SlottableProps } from '@dxos/ui-types';
10
+
11
+ import { useThemeContext } from '../../hooks';
12
+
13
+ //
14
+ // Root
15
+ //
16
+
17
+ const GRID_TEMPLATE_ROWS = 'auto 1fr auto';
18
+ const GRID_TEMPLATE_AREAS = '"toolbar" "content" "statusbar"';
19
+
20
+ type PanelRootProps = SlottableProps<HTMLDivElement>;
21
+
22
+ const Root = forwardRef<HTMLDivElement, PanelRootProps>(
23
+ ({ classNames, className, asChild, children, role, ...props }, forwardedRef) => {
24
+ const { tx } = useThemeContext();
25
+ const Comp = asChild ? Slot : Primitive.div;
26
+ return (
27
+ <Comp
28
+ ref={forwardedRef}
29
+ role={role ?? 'none'}
30
+ {...props}
31
+ style={{
32
+ gridTemplateRows: GRID_TEMPLATE_ROWS,
33
+ gridTemplateAreas: GRID_TEMPLATE_AREAS,
34
+ ...props.style,
35
+ }}
36
+ className={tx('panel.root', {}, [className, classNames])}
37
+ >
38
+ {children}
39
+ </Comp>
40
+ );
41
+ },
42
+ );
43
+
44
+ Root.displayName = 'Panel.Root';
45
+
46
+ //
47
+ // Toolbar
48
+ //
49
+
50
+ type ToolbarProps = SlottableProps<HTMLDivElement>;
51
+
52
+ const Toolbar = forwardRef<HTMLDivElement, ToolbarProps>(
53
+ ({ classNames, className, asChild, children, ...props }, forwardedRef) => {
54
+ const { tx } = useThemeContext();
55
+ const Comp = asChild ? Slot : Primitive.div;
56
+ return (
57
+ <Comp
58
+ ref={forwardedRef}
59
+ data-slot='toolbar'
60
+ {...props}
61
+ className={tx('panel.toolbar', {}, [className, classNames])}
62
+ >
63
+ {children}
64
+ </Comp>
65
+ );
66
+ },
67
+ );
68
+
69
+ Toolbar.displayName = 'Panel.Toolbar';
70
+
71
+ //
72
+ // Content
73
+ //
74
+
75
+ type ContentProps = SlottableProps<HTMLDivElement>;
76
+
77
+ const Content = forwardRef<HTMLDivElement, ContentProps>(
78
+ ({ classNames, className, asChild, children, ...props }, forwardedRef) => {
79
+ const { tx } = useThemeContext();
80
+ const Comp = asChild ? Slot : Primitive.div;
81
+ return (
82
+ <Comp
83
+ ref={forwardedRef}
84
+ data-slot='content'
85
+ {...props}
86
+ className={tx('panel.content', {}, [className, classNames])}
87
+ >
88
+ {children}
89
+ </Comp>
90
+ );
91
+ },
92
+ );
93
+
94
+ Content.displayName = 'Panel.Content';
95
+
96
+ //
97
+ // Statusbar
98
+ //
99
+
100
+ type StatusbarProps = SlottableProps<HTMLDivElement>;
101
+
102
+ const Statusbar = forwardRef<HTMLDivElement, StatusbarProps>(
103
+ ({ classNames, className, asChild, children, ...props }, forwardedRef) => {
104
+ const { tx } = useThemeContext();
105
+ const Comp = asChild ? Slot : Primitive.div;
106
+ return (
107
+ <Comp
108
+ ref={forwardedRef}
109
+ data-slot='statusbar'
110
+ {...props}
111
+ className={tx('panel.statusbar', {}, [className, classNames])}
112
+ >
113
+ {children}
114
+ </Comp>
115
+ );
116
+ },
117
+ );
118
+
119
+ Statusbar.displayName = 'Panel.Statusbar';
120
+
121
+ //
122
+ // Panel
123
+ //
124
+
125
+ export const Panel = {
126
+ Root,
127
+ Toolbar,
128
+ Content,
129
+ Statusbar,
130
+ };
131
+
132
+ export type {
133
+ PanelRootProps,
134
+ ToolbarProps as PanelToolbarProps,
135
+ ContentProps as PanelContentProps,
136
+ StatusbarProps as PanelStatusbarProps,
137
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './Panel';
@@ -0,0 +1,8 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './Column';
6
+ export * from './Flex';
7
+ export * from './Grid';
8
+ export * from './Panel';
@@ -3,5 +3,5 @@
3
3
  //
4
4
 
5
5
  export * from './withLayout';
6
- export * from './withSurfaceVariantsLayout';
6
+ export * from './withLayoutVariants';
7
7
  export * from './withTheme';
@@ -3,52 +3,73 @@
3
3
  //
4
4
 
5
5
  import { type Decorator } from '@storybook/react';
6
- import React, { type FC, type PropsWithChildren } from 'react';
6
+ import React, { type FC, type PropsWithChildren, memo } from 'react';
7
7
 
8
8
  import { type ClassNameValue, type ThemedClassName } from '@dxos/react-ui';
9
- import { mx } from '@dxos/react-ui-theme';
9
+ import { mx } from '@dxos/ui-theme';
10
10
 
11
11
  export type ContainerProps = ThemedClassName<PropsWithChildren>;
12
12
 
13
- export type ContainerType = 'default' | 'column';
13
+ export type ContainerType = 'default' | 'fullscreen' | 'centered' | 'column';
14
14
 
15
15
  export type WithLayoutProps =
16
16
  | FC<ContainerProps>
17
- | { classNames?: ClassNameValue; container?: ContainerType; scroll?: boolean };
17
+ | {
18
+ classNames?: ClassNameValue;
19
+ layout?: ContainerType;
20
+ scroll?: boolean;
21
+ };
18
22
 
19
23
  /**
20
24
  * Adds layout container.
21
25
  */
22
26
  export const withLayout =
23
- (props: WithLayoutProps): Decorator =>
27
+ (props: WithLayoutProps = {}): Decorator =>
24
28
  (Story) => {
29
+ // Prevent re-rendering of the story.
30
+ const MemoizedStory = memo(Story);
25
31
  if (typeof props === 'function') {
26
32
  const Container = props;
27
33
  return (
28
34
  <Container>
29
- <Story />
35
+ <MemoizedStory />
36
+ </Container>
37
+ );
38
+ } else {
39
+ const { layout = 'default', classNames, scroll } = props;
40
+ const Container = layouts[layout] ?? layouts.fullscreen;
41
+ return (
42
+ <Container classNames={mx(classNames, scroll ? 'overflow-y-auto' : 'overflow-hidden')}>
43
+ <MemoizedStory />
30
44
  </Container>
31
45
  );
32
46
  }
33
-
34
- const Container = layouts[(props as any).container as ContainerType] ?? layouts.default;
35
- return (
36
- <Container classNames={mx(props.classNames, props.scroll ? 'overflow-y-auto' : 'overflow-hidden')}>
37
- <Story />
38
- </Container>
39
- );
40
47
  };
41
48
 
42
49
  const layouts: Record<ContainerType, FC<ContainerProps>> = {
43
- default: ({ children, classNames }: ContainerProps) => (
44
- <div role='none' className={mx(classNames)}>
50
+ default: ({ classNames, children }: ContainerProps) => (
51
+ <div role='none' className={mx('p-4', classNames)}>
45
52
  {children}
46
53
  </div>
47
54
  ),
48
55
 
49
- column: ({ children, classNames }: ContainerProps) => (
50
- <div role='none' className='fixed inset-0 flex justify-center overflow-hidden bg-deckSurface'>
51
- <div role='none' className={mx('flex flex-col is-[40rem] bg-baseSurface', classNames)}>
56
+ fullscreen: ({ classNames, children }: ContainerProps) => (
57
+ <div role='none' className={mx('fixed inset-0 flex overflow-hidden bg-base-surface', classNames)}>
58
+ {children}
59
+ </div>
60
+ ),
61
+
62
+ centered: ({ classNames, children }: ContainerProps) => (
63
+ <div role='none' className={mx('fixed inset-0 grid overflow-hidden place-items-center bg-base-surface')}>
64
+ <div role='none' className={mx('flex flex-col w-[40rem] bg-group-surface', classNames)}>
65
+ {children}
66
+ </div>
67
+ </div>
68
+ ),
69
+
70
+ column: ({ classNames, children }: ContainerProps) => (
71
+ <div role='none' className='fixed inset-0 flex overflow-hidden justify-center bg-base-surface'>
72
+ <div role='none' className={mx('flex flex-col w-[40rem] bg-group-surface', classNames)}>
52
73
  {children}
53
74
  </div>
54
75
  </div>