@dxos/react-ui 0.8.4-main.fffef41 → 0.8.4-staging.ac66bdf99f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/dist/lib/browser/chunk-OCVRIJCH.mjs +848 -0
  2. package/dist/lib/browser/chunk-OCVRIJCH.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +4111 -67
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +88 -64
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs +850 -0
  9. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +4111 -67
  11. package/dist/lib/node-esm/index.mjs.map +4 -4
  12. package/dist/lib/node-esm/meta.json +1 -1
  13. package/dist/lib/node-esm/testing/index.mjs +88 -64
  14. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  15. package/dist/types/src/components/Avatars/Avatar.d.ts +1 -1
  16. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  17. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  18. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  19. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  20. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  21. package/dist/types/src/components/Button/Button.d.ts +3 -3
  22. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  23. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -1
  24. package/dist/types/src/components/Button/IconButton.d.ts +2 -1
  25. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  26. package/dist/types/src/components/Button/IconButton.stories.d.ts +3 -0
  27. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
  28. package/dist/types/src/components/Button/Toggle.d.ts +2 -2
  29. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -1
  30. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
  31. package/dist/types/src/components/Button/ToggleGroup.d.ts +10 -10
  32. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -1
  33. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +4 -4
  34. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
  35. package/dist/types/src/components/Card/Card.d.ts +120 -0
  36. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  37. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  38. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  39. package/dist/types/src/components/Card/index.d.ts +2 -0
  40. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  41. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  42. package/dist/types/src/components/Clipboard/index.d.ts +10 -1
  43. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  44. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  45. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  46. package/dist/types/src/components/Dialog/AlertDialog.d.ts +39 -19
  47. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  48. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  49. package/dist/types/src/components/Dialog/Dialog.d.ts +54 -21
  50. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  51. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +10 -10
  52. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  53. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  54. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  55. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  56. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  57. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  58. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  59. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +19 -0
  60. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  61. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  62. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  63. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  64. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  65. package/dist/types/src/components/Focus/Focus.d.ts +36 -0
  66. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -0
  67. package/dist/types/src/components/Focus/Focus.stories.d.ts +9 -0
  68. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -0
  69. package/dist/types/src/components/Focus/index.d.ts +2 -0
  70. package/dist/types/src/components/Focus/index.d.ts.map +1 -0
  71. package/dist/types/src/components/Icon/Icon.d.ts +4 -1
  72. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  73. package/dist/types/src/components/Icon/Icon.stories.d.ts +11 -3
  74. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  75. package/dist/types/src/components/Image/Image.d.ts +14 -0
  76. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  77. package/dist/types/src/components/Image/Image.stories.d.ts +33 -0
  78. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  79. package/dist/types/src/components/Image/index.d.ts +2 -0
  80. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  81. package/dist/types/src/components/Input/Input.d.ts +7 -7
  82. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  83. package/dist/types/src/components/Input/Input.stories.d.ts +8 -8
  84. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  85. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  86. package/dist/types/src/components/List/List.d.ts +6 -4
  87. package/dist/types/src/components/List/List.d.ts.map +1 -1
  88. package/dist/types/src/components/List/List.stories.d.ts +3 -1
  89. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  90. package/dist/types/src/components/List/Tree.d.ts.map +1 -1
  91. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
  92. package/dist/types/src/components/List/Treegrid.d.ts +5 -9
  93. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  94. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
  95. package/dist/types/src/components/Main/Main.d.ts +9 -10
  96. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  97. package/dist/types/src/components/Main/Main.stories.d.ts +0 -3
  98. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  99. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  100. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  101. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  102. package/dist/types/src/components/{Menus → Menu}/DropdownMenu.d.ts +52 -51
  103. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  104. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +28 -0
  105. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  106. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  107. package/dist/types/src/components/Message/Message.d.ts +1 -1
  108. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  109. package/dist/types/src/components/Message/Message.stories.d.ts +5 -6
  110. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  111. package/dist/types/src/components/Popover/Popover.d.ts +33 -24
  112. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  113. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  114. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +27 -27
  115. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  116. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +57 -8
  117. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  118. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +37 -14
  119. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  120. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +10 -5
  121. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  122. package/dist/types/src/components/Select/Select.d.ts +9 -9
  123. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  124. package/dist/types/src/components/Select/Select.stories.d.ts +2 -2
  125. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  126. package/dist/types/src/components/Separator/Separator.d.ts +4 -4
  127. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  128. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  129. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  130. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  131. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  132. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  133. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  134. package/dist/types/src/components/Splitter/Splitter.d.ts +34 -0
  135. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  136. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  137. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  138. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  139. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  140. package/dist/types/src/components/Status/Status.d.ts +3 -4
  141. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  142. package/dist/types/src/components/Status/Status.stories.d.ts +4 -2
  143. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  144. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  145. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  146. package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
  147. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  148. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +3 -3
  149. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  150. package/dist/types/src/components/{Menus/DropdownMenu.stories.d.ts → ThemeProvider/ThemeProvider.stories.d.ts} +2 -5
  151. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  152. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
  153. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  154. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  155. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  156. package/dist/types/src/components/Toast/Toast.d.ts +19 -19
  157. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  158. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  159. package/dist/types/src/components/Toolbar/Toolbar.d.ts +36 -18
  160. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  161. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  162. package/dist/types/src/components/Tooltip/Tooltip.d.ts +9 -9
  163. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  164. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +2 -2
  165. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  166. package/dist/types/src/components/index.d.ts +10 -5
  167. package/dist/types/src/components/index.d.ts.map +1 -1
  168. package/dist/types/src/exemplars/generics.stories.d.ts +19 -0
  169. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  170. package/dist/types/src/exemplars/slot.stories.d.ts +15 -0
  171. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  172. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  173. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  174. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  175. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  176. package/dist/types/src/hooks/index.d.ts +1 -0
  177. package/dist/types/src/hooks/index.d.ts.map +1 -1
  178. package/dist/types/src/hooks/useDensityContext.d.ts +2 -2
  179. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  180. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  181. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  182. package/dist/types/src/index.d.ts +2 -1
  183. package/dist/types/src/index.d.ts.map +1 -1
  184. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  185. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  186. package/dist/types/src/primitives/Column/Column.d.ts +33 -0
  187. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  188. package/dist/types/src/primitives/Column/Column.stories.d.ts +25 -0
  189. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  190. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  191. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  192. package/dist/types/src/primitives/Container/Container.d.ts +7 -0
  193. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  194. package/dist/types/src/primitives/Container/Container.stories.d.ts +6 -0
  195. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  196. package/dist/types/src/primitives/Container/index.d.ts +2 -0
  197. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  198. package/dist/types/src/primitives/Flex/Flex.d.ts +11 -0
  199. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  200. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  201. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  202. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  203. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  204. package/dist/types/src/primitives/Grid/Grid.d.ts +10 -0
  205. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  206. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  207. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  208. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  209. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  210. package/dist/types/src/primitives/Panel/Panel.d.ts +35 -0
  211. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  212. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  213. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  214. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  215. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  216. package/dist/types/src/primitives/index.d.ts +6 -0
  217. package/dist/types/src/primitives/index.d.ts.map +1 -0
  218. package/dist/types/src/testing/Loading.d.ts +9 -0
  219. package/dist/types/src/testing/Loading.d.ts.map +1 -0
  220. package/dist/types/src/testing/decorators/withLayout.d.ts +3 -3
  221. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  222. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +1 -1
  223. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  224. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  225. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  226. package/dist/types/src/testing/index.d.ts +1 -0
  227. package/dist/types/src/testing/index.d.ts.map +1 -1
  228. package/dist/types/src/translations.d.ts +11 -0
  229. package/dist/types/src/translations.d.ts.map +1 -0
  230. package/dist/types/src/util/index.d.ts +1 -2
  231. package/dist/types/src/util/index.d.ts.map +1 -1
  232. package/dist/types/src/util/usePx.d.ts.map +1 -1
  233. package/dist/types/tsconfig.tsbuildinfo +1 -1
  234. package/package.json +42 -32
  235. package/src/components/Avatars/Avatar.stories.tsx +7 -9
  236. package/src/components/Avatars/Avatar.tsx +7 -15
  237. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -3
  238. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +3 -4
  239. package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
  240. package/src/components/Button/Button.stories.tsx +3 -4
  241. package/src/components/Button/Button.tsx +12 -26
  242. package/src/components/Button/IconButton.stories.tsx +8 -6
  243. package/src/components/Button/IconButton.tsx +9 -6
  244. package/src/components/Button/Toggle.stories.tsx +2 -3
  245. package/src/components/Button/Toggle.tsx +4 -4
  246. package/src/components/Button/ToggleGroup.stories.tsx +2 -3
  247. package/src/components/Button/ToggleGroup.tsx +12 -16
  248. package/src/components/Card/Card.stories.tsx +151 -0
  249. package/src/components/Card/Card.tsx +493 -0
  250. package/src/components/Card/index.ts +5 -0
  251. package/src/components/Clipboard/CopyButton.tsx +7 -8
  252. package/src/components/DensityProvider/DensityProvider.tsx +1 -1
  253. package/src/components/Dialog/AlertDialog.stories.tsx +16 -17
  254. package/src/components/Dialog/AlertDialog.tsx +123 -82
  255. package/src/components/Dialog/Dialog.stories.tsx +138 -28
  256. package/src/components/Dialog/Dialog.tsx +197 -71
  257. package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
  258. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +45 -0
  259. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  260. package/src/components/ErrorFallback/ErrorStack.tsx +114 -0
  261. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  262. package/src/components/ErrorFallback/index.ts +9 -0
  263. package/src/components/Focus/AUDIT.md +43 -0
  264. package/src/components/Focus/Focus.stories.tsx +230 -0
  265. package/src/components/Focus/Focus.tsx +201 -0
  266. package/src/components/Focus/index.ts +5 -0
  267. package/src/components/Icon/Icon.stories.tsx +45 -15
  268. package/src/components/Icon/Icon.tsx +7 -3
  269. package/src/components/Image/Image.stories.tsx +86 -0
  270. package/src/components/Image/Image.tsx +223 -0
  271. package/src/components/Image/index.ts +5 -0
  272. package/src/components/Input/Input.stories.tsx +21 -41
  273. package/src/components/Input/Input.tsx +38 -74
  274. package/src/components/Link/Link.stories.tsx +2 -3
  275. package/src/components/Link/Link.tsx +2 -2
  276. package/src/components/List/List.stories.tsx +30 -34
  277. package/src/components/List/List.tsx +17 -21
  278. package/src/components/List/ListDropIndicator.tsx +7 -7
  279. package/src/components/List/Tree.stories.tsx +5 -6
  280. package/src/components/List/Tree.tsx +0 -1
  281. package/src/components/List/TreeDropIndicator.tsx +6 -6
  282. package/src/components/List/Treegrid.stories.tsx +29 -30
  283. package/src/components/List/Treegrid.tsx +23 -28
  284. package/src/components/Main/Main.stories.tsx +41 -24
  285. package/src/components/Main/Main.tsx +139 -83
  286. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +2 -3
  287. package/src/components/{Menus → Menu}/ContextMenu.tsx +9 -33
  288. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +2 -3
  289. package/src/components/{Menus → Menu}/DropdownMenu.tsx +115 -107
  290. package/src/components/Message/Message.stories.tsx +27 -13
  291. package/src/components/Message/Message.tsx +43 -34
  292. package/src/components/Popover/Popover.stories.tsx +7 -8
  293. package/src/components/Popover/Popover.tsx +97 -92
  294. package/src/components/ScrollArea/ScrollArea.stories.tsx +223 -34
  295. package/src/components/ScrollArea/ScrollArea.tsx +97 -79
  296. package/src/components/ScrollArea/index.ts +1 -1
  297. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +47 -25
  298. package/src/components/ScrollContainer/ScrollContainer.tsx +225 -109
  299. package/src/components/Select/Select.stories.tsx +7 -8
  300. package/src/components/Select/Select.tsx +11 -27
  301. package/src/components/Separator/Separator.tsx +5 -8
  302. package/src/components/Skeleton/Skeleton.stories.tsx +51 -0
  303. package/src/components/Skeleton/Skeleton.tsx +26 -0
  304. package/src/components/Skeleton/index.ts +5 -0
  305. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  306. package/src/components/Splitter/Splitter.tsx +127 -0
  307. package/src/components/Splitter/index.ts +5 -0
  308. package/src/components/Status/Status.stories.tsx +21 -18
  309. package/src/components/Status/Status.tsx +10 -7
  310. package/src/components/Tag/Tag.stories.tsx +6 -12
  311. package/src/components/Tag/Tag.tsx +3 -8
  312. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +31 -0
  313. package/src/components/ThemeProvider/ThemeProvider.tsx +10 -10
  314. package/src/components/ThemeProvider/TranslationsProvider.tsx +1 -16
  315. package/src/components/ThemeProvider/index.ts +3 -3
  316. package/src/components/Toast/Toast.stories.tsx +2 -3
  317. package/src/components/Toast/Toast.tsx +22 -41
  318. package/src/components/Toolbar/Toolbar.stories.tsx +2 -3
  319. package/src/components/Toolbar/Toolbar.tsx +185 -23
  320. package/src/components/Tooltip/Tooltip.stories.tsx +20 -19
  321. package/src/components/Tooltip/Tooltip.tsx +40 -38
  322. package/src/components/index.ts +11 -6
  323. package/src/exemplars/generics.stories.tsx +41 -0
  324. package/src/exemplars/slot.stories.tsx +117 -0
  325. package/src/exemplars/tabster.stories.tsx +127 -0
  326. package/src/exemplars/virtualizer.stories.tsx +137 -0
  327. package/src/hooks/index.ts +1 -0
  328. package/src/hooks/useDensityContext.ts +3 -3
  329. package/src/hooks/useElevationContext.ts +1 -1
  330. package/src/index.ts +2 -1
  331. package/src/playground/Controls.stories.tsx +3 -10
  332. package/src/playground/Custom.stories.tsx +15 -18
  333. package/src/playground/Typography.stories.tsx +3 -3
  334. package/src/primitives/Column/AUDIT.md +148 -0
  335. package/src/primitives/Column/Column.stories.tsx +181 -0
  336. package/src/primitives/Column/Column.tsx +165 -0
  337. package/src/primitives/Column/index.ts +5 -0
  338. package/src/primitives/Container/Container.stories.tsx +29 -0
  339. package/src/primitives/Container/Container.tsx +19 -0
  340. package/src/primitives/Container/index.ts +5 -0
  341. package/src/primitives/Flex/Flex.stories.tsx +57 -0
  342. package/src/primitives/Flex/Flex.tsx +27 -0
  343. package/src/primitives/Flex/index.ts +5 -0
  344. package/src/primitives/Grid/Grid.stories.tsx +56 -0
  345. package/src/primitives/Grid/Grid.tsx +30 -0
  346. package/src/primitives/Grid/index.ts +5 -0
  347. package/src/primitives/Panel/Panel.stories.tsx +68 -0
  348. package/src/primitives/Panel/Panel.tsx +120 -0
  349. package/src/primitives/Panel/index.ts +5 -0
  350. package/src/primitives/index.ts +9 -0
  351. package/src/testing/Loading.tsx +47 -0
  352. package/src/testing/decorators/withLayout.tsx +39 -18
  353. package/src/testing/decorators/withLayoutVariants.tsx +20 -23
  354. package/src/testing/decorators/withTheme.tsx +26 -20
  355. package/src/testing/index.ts +2 -0
  356. package/src/translations.ts +19 -0
  357. package/src/util/index.ts +2 -2
  358. package/src/util/usePx.ts +1 -0
  359. package/dist/lib/browser/chunk-N5GDJTT2.mjs +0 -4707
  360. package/dist/lib/browser/chunk-N5GDJTT2.mjs.map +0 -7
  361. package/dist/lib/node-esm/chunk-SP7VQH72.mjs +0 -4709
  362. package/dist/lib/node-esm/chunk-SP7VQH72.mjs.map +0 -7
  363. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  364. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  365. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  366. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  367. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  368. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  369. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  370. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  371. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  372. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  373. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  374. package/dist/types/src/util/domino.d.ts +0 -18
  375. package/dist/types/src/util/domino.d.ts.map +0 -1
  376. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
  377. package/src/components/AnchoredOverflow/index.ts +0 -5
  378. package/src/util/ThemedClassName.ts +0 -7
  379. package/src/util/domino.ts +0 -53
  380. /package/dist/types/src/components/{Menus → Menu}/ContextMenu.stories.d.ts +0 -0
  381. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  382. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -0,0 +1,165 @@
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 } from 'react';
8
+
9
+ import { composableProps, slottable } from '@dxos/ui-theme';
10
+ import { type SlottableProps } from '@dxos/ui-types';
11
+
12
+ import { useThemeContext } from '../../hooks';
13
+
14
+ //
15
+ // Root
16
+ //
17
+
18
+ const COLUMN_ROOT_NAME = 'Column.Root';
19
+
20
+ type GutterSize = 'xs' | 'sm' | 'md' | 'lg';
21
+
22
+ const gutterSizes: Record<GutterSize, string> = {
23
+ xs: 'var(--dx-gutter-xs)',
24
+ sm: 'var(--dx-gutter-sm)',
25
+ md: 'var(--dx-gutter-md)',
26
+ lg: 'var(--dx-gutter-lg)',
27
+ };
28
+
29
+ type ColumnRootProps = { gutter?: GutterSize };
30
+
31
+ /**
32
+ * Creates a 3-column CSS grid with left/right gutter columns and a center content column.
33
+ * Sets `--gutter` and `--dx-col` CSS variables for nested components.
34
+ *
35
+ * `--dx-col` defaults to `2 / span 1` (center column),
36
+ * enabling `withColumn` utilities to cascade the correct grid placement to slotted children.
37
+ *
38
+ * Direct children participate in the grid in one of several ways:
39
+ * - **Column.Center** — places element in the center column (col 2). Preferred for plain content.
40
+ * - **Column.Bleed** — spans all 3 columns gutter-to-gutter. Preferred for `ScrollArea` and
41
+ * other content that should ignore the gutters.
42
+ * - **Column.Row** — 3-col subgrid row (icons in gutters, content in center).
43
+ *
44
+ * Use `withColumn.center()` / `withColumn.bleed()` helpers to apply placement on slotted elements.
45
+ *
46
+ * Gutter sizes: `'sm'` for compact layouts (Dialog); `'md'` (default); `'lg'` for wider spacing.
47
+ */
48
+ const ColumnRoot = slottable<HTMLDivElement, ColumnRootProps>(
49
+ ({ children, asChild, role, gutter = 'md', ...props }, forwardedRef) => {
50
+ const { className, ...rest } = composableProps(props);
51
+ const Comp = asChild ? Slot : Primitive.div;
52
+ const { tx } = useThemeContext();
53
+ const gutterSize = gutterSizes[gutter];
54
+ return (
55
+ <Comp
56
+ {...rest}
57
+ role={role ?? 'none'}
58
+ style={
59
+ {
60
+ '--gutter': gutterSize,
61
+ '--dx-col': '2 / span 1',
62
+ gridTemplateColumns: [gutterSize, 'minmax(0,1fr)', gutterSize].join(' '),
63
+ } as CSSProperties
64
+ }
65
+ className={tx('column.root', { gutter }, className)}
66
+ ref={forwardedRef}
67
+ >
68
+ {children}
69
+ </Comp>
70
+ );
71
+ },
72
+ );
73
+
74
+ ColumnRoot.displayName = COLUMN_ROOT_NAME;
75
+
76
+ //
77
+ // Row
78
+ //
79
+
80
+ const COLUMN_ROW_NAME = 'Column.Row';
81
+
82
+ type ColumnRowProps = {};
83
+
84
+ /**
85
+ * Spans all 3 columns of the parent Column.Root and uses CSS subgrid to inherit their sizing.
86
+ * Children map to: [col-1: icon/slot] [col-2: content] [col-3: icon/action].
87
+ * Must be a direct child of Column.Root.
88
+ */
89
+ const ColumnRow = slottable<HTMLDivElement, ColumnRowProps>(({ children, asChild, role, ...props }, forwardedRef) => {
90
+ const { className, ...rest } = composableProps(props);
91
+ const Comp = asChild ? Slot : Primitive.div;
92
+ const { tx } = useThemeContext();
93
+ return (
94
+ <Comp {...rest} role={role ?? 'none'} className={tx('column.row', {}, className)} ref={forwardedRef}>
95
+ {children}
96
+ </Comp>
97
+ );
98
+ });
99
+
100
+ ColumnRow.displayName = COLUMN_ROW_NAME;
101
+
102
+ //
103
+ // Bleed
104
+ //
105
+
106
+ const COLUMN_BLEED_NAME = 'Column.Bleed';
107
+
108
+ type ColumnBleedProps = SlottableProps;
109
+
110
+ /**
111
+ * Spans all 3 columns of the parent Column.Root (gutter-to-gutter).
112
+ * Establishes a CSS subgrid so that grandchildren can participate in the parent column tracks.
113
+ * Use for `ScrollArea`, full-width dividers, tables, or any content that should ignore the gutters.
114
+ */
115
+ const ColumnBleed = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
116
+ const { tx } = useThemeContext();
117
+ const { className, ...rest } = composableProps(props);
118
+ const Comp = asChild ? Slot : Primitive.div;
119
+ return (
120
+ <Comp {...rest} className={tx('column.bleed', {}, className)} ref={forwardedRef}>
121
+ {children}
122
+ </Comp>
123
+ );
124
+ });
125
+
126
+ ColumnBleed.displayName = COLUMN_BLEED_NAME;
127
+
128
+ //
129
+ // Center
130
+ //
131
+
132
+ const COLUMN_CENTER_NAME = 'Column.Center';
133
+
134
+ type ColumnCenterProps = SlottableProps;
135
+
136
+ /**
137
+ * Places its element in column 2 (the center track between gutters) of the parent Column.Root.
138
+ * Does NOT use subgrid — placement is explicit on this element only, so it is safe to nest
139
+ * arbitrary compound components (including ones that render `display: contents` wrappers).
140
+ */
141
+ const ColumnCenter = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
142
+ const { tx } = useThemeContext();
143
+ const { className, ...rest } = composableProps(props);
144
+ const Comp = asChild ? Slot : Primitive.div;
145
+ return (
146
+ <Comp {...rest} className={tx('column.center', {}, className)} ref={forwardedRef}>
147
+ {children}
148
+ </Comp>
149
+ );
150
+ });
151
+
152
+ ColumnCenter.displayName = COLUMN_CENTER_NAME;
153
+
154
+ //
155
+ // Column
156
+ //
157
+
158
+ export const Column = {
159
+ Root: ColumnRoot,
160
+ Row: ColumnRow,
161
+ Bleed: ColumnBleed,
162
+ Center: ColumnCenter,
163
+ };
164
+
165
+ export type { ColumnRootProps, ColumnRowProps, ColumnBleedProps, ColumnCenterProps };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './Column';
@@ -0,0 +1,29 @@
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 { withLayout, withTheme } from '../../testing';
9
+ import { Container } from './Container';
10
+
11
+ const DefaultStory = () => (
12
+ <Container asChild>
13
+ <div className='grid place-items-center border border-red-500'>Hello</div>
14
+ </Container>
15
+ );
16
+
17
+ const meta: Meta = {
18
+ title: 'ui/react-ui-core/primitives/Container',
19
+ component: Container,
20
+ render: DefaultStory,
21
+ decorators: [withTheme(), withLayout({ layout: 'column' })],
22
+ parameters: { layout: 'fullscreen' },
23
+ };
24
+
25
+ export default meta;
26
+
27
+ type Story = StoryObj<typeof meta>;
28
+
29
+ export const Default: Story = {};
@@ -0,0 +1,19 @@
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 from 'react';
8
+
9
+ import { composableProps, mx, slottable } from '@dxos/ui-theme';
10
+
11
+ export const Container = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
12
+ const { className, ...rest } = composableProps<HTMLDivElement>(props);
13
+ const Comp = asChild ? Slot : Primitive.div;
14
+ return (
15
+ <Comp {...rest} className={mx('dx-container', className)} ref={forwardedRef}>
16
+ {children}
17
+ </Comp>
18
+ );
19
+ });
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './Container';
@@ -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
+ import { Flex } from './Flex';
12
+
13
+ const Cell = ({ label, hue }: { label: string; hue: ChromaticPalette }) => (
14
+ <div data-hue={hue} className='flex w-full dx-panel p-2 text-sm font-mono border rounded-sm'>
15
+ {label}
16
+ </div>
17
+ );
18
+
19
+ const RowStory = () => (
20
+ <Flex classNames='gap-2 p-2'>
21
+ <Cell label='A' hue='red' />
22
+ <Cell label='B' hue='green' />
23
+ <Cell label='C' hue='blue' />
24
+ </Flex>
25
+ );
26
+
27
+ const ColumnStory = () => (
28
+ <Flex column classNames='gap-2 p-2'>
29
+ <Cell label='A' hue='red' />
30
+ <Cell label='B' hue='green' />
31
+ <Cell label='C' hue='blue' />
32
+ </Flex>
33
+ );
34
+
35
+ const GrowStory = () => (
36
+ <Flex column grow classNames='gap-2 p-2'>
37
+ <Cell label='Header' hue='yellow' />
38
+ <Flex grow>
39
+ <Cell label='Content (grows)' hue='blue' />
40
+ </Flex>
41
+ <Cell label='Footer' hue='orange' />
42
+ </Flex>
43
+ );
44
+
45
+ const meta: Meta = {
46
+ title: 'ui/react-ui-core/primitives/Flex',
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 Row: Story = { render: RowStory };
56
+ export const Column: Story = { render: ColumnStory };
57
+ export const Grow: Story = { render: GrowStory };
@@ -0,0 +1,27 @@
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 from 'react';
8
+
9
+ import { composableProps, mx, slottable } from '@dxos/ui-theme';
10
+
11
+ export type FlexProps = { column?: boolean; grow?: boolean };
12
+
13
+ export const Flex = slottable<HTMLDivElement, FlexProps>(
14
+ ({ children, asChild, column, grow, ...props }, forwardedRef) => {
15
+ const { className, ...rest } = composableProps(props);
16
+ const Comp = asChild ? Slot : Primitive.div;
17
+ return (
18
+ <Comp
19
+ ref={forwardedRef}
20
+ {...rest}
21
+ className={mx('flex', column && 'flex-col', grow && 'flex-1 overflow-hidden', className)}
22
+ >
23
+ {children}
24
+ </Comp>
25
+ );
26
+ },
27
+ );
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './Flex';
@@ -0,0 +1,56 @@
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
+ import { Grid } from './Grid';
12
+
13
+ const Cell = ({ label, hue }: { label: string; hue: ChromaticPalette }) => (
14
+ <div data-hue={hue} className='dx-panel p-2 text-sm font-mono border rounded-sm'>
15
+ {label}
16
+ </div>
17
+ );
18
+
19
+ const ColsStory = () => (
20
+ <Grid cols={3} classNames='gap-2 p-2'>
21
+ <Cell label='Row 1' hue='red' />
22
+ <Cell label='Row 2' hue='green' />
23
+ <Cell label='Row 3' hue='blue' />
24
+ </Grid>
25
+ );
26
+
27
+ const RowsStory = () => (
28
+ <Grid rows={3} classNames='gap-2 p-2'>
29
+ <Cell label='Row 1' hue='red' />
30
+ <Cell label='Row 2' hue='green' />
31
+ <Cell label='Row 3' hue='blue' />
32
+ </Grid>
33
+ );
34
+
35
+ const MixedStory = () => (
36
+ <Grid cols={2} rows={2} classNames='gap-2 p-2'>
37
+ <Cell label='A' hue='red' />
38
+ <Cell label='B' hue='green' />
39
+ <Cell label='C' hue='blue' />
40
+ <Cell label='D' hue='yellow' />
41
+ </Grid>
42
+ );
43
+
44
+ const meta: Meta = {
45
+ title: 'ui/react-ui-core/primitives/Grid',
46
+ decorators: [withTheme(), withLayout({ layout: 'column' })],
47
+ parameters: { layout: 'fullscreen' },
48
+ };
49
+
50
+ export default meta;
51
+
52
+ type Story = StoryObj<typeof meta>;
53
+
54
+ export const Cols: Story = { render: ColsStory };
55
+ export const Rows: Story = { render: RowsStory };
56
+ export const Mixed: Story = { render: MixedStory };
@@ -0,0 +1,30 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { composable, composableProps, mx } from '@dxos/ui-theme';
8
+
9
+ export type GridProps = { cols?: number; rows?: number; grow?: boolean };
10
+
11
+ export const Grid = composable<HTMLDivElement, GridProps>(
12
+ ({ children, style, role, cols, rows, grow = true, ...props }, forwardedRef) => {
13
+ const { className, ...rest } = composableProps(props);
14
+ return (
15
+ <div
16
+ ref={forwardedRef}
17
+ {...rest}
18
+ role={role ?? 'none'}
19
+ className={mx('grid overflow-hidden', grow && 'dx-container', className)}
20
+ style={{
21
+ gridTemplateColumns: cols ? `repeat(${cols}, 1fr)` : undefined,
22
+ gridTemplateRows: rows ? `repeat(${rows}, 1fr)` : undefined,
23
+ ...style,
24
+ }}
25
+ >
26
+ {children}
27
+ </div>
28
+ );
29
+ },
30
+ );
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './Grid';
@@ -0,0 +1,68 @@
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 { composable, composableProps } from '@dxos/ui-theme';
9
+
10
+ import { Input, ScrollArea, ScrollAreaRootProps, Toolbar } from '../../components';
11
+ import { withLayout, withTheme } from '../../testing';
12
+ import { Panel } from './Panel';
13
+
14
+ const List = composable<HTMLDivElement, ScrollAreaRootProps>((props, forwardedRef) => {
15
+ return (
16
+ <ScrollArea.Root centered {...composableProps(props, { role: 'list' })} ref={forwardedRef}>
17
+ <ScrollArea.Viewport>
18
+ {Array.from({ length: 100 }).map((_, i) => (
19
+ <div key={i} role='listitem' className='p-1 hover:bg-hover-surface'>
20
+ Item {i}
21
+ </div>
22
+ ))}
23
+ </ScrollArea.Viewport>
24
+ </ScrollArea.Root>
25
+ );
26
+ });
27
+
28
+ const DefaultStory = () => {
29
+ return (
30
+ <Panel.Root className='dx-document'>
31
+ <Panel.Toolbar asChild>
32
+ <Toolbar.Root classNames='gap-2'>
33
+ <Toolbar.IconButton icon='ph--plus--regular' variant='primary' label='Add' />
34
+ <Input.Root>
35
+ <Input.TextInput placeholder='Search' />
36
+ </Input.Root>
37
+ <Toolbar.IconButton icon='ph--dots-three-vertical--regular' iconOnly label='Menu' />
38
+ </Toolbar.Root>
39
+ </Panel.Toolbar>
40
+
41
+ <Panel.Content asChild>
42
+ <List />
43
+ </Panel.Content>
44
+
45
+ <Panel.Statusbar asChild>
46
+ <Toolbar.Root classNames='justify-between'>
47
+ <Toolbar.IconButton variant='ghost' icon='ph--house--regular' iconOnly label='Add' />
48
+ <Toolbar.IconButton variant='ghost' icon='ph--alarm--regular' iconOnly label='Status' />
49
+ </Toolbar.Root>
50
+ </Panel.Statusbar>
51
+ </Panel.Root>
52
+ );
53
+ };
54
+
55
+ const meta: Meta = {
56
+ title: 'ui/react-ui-core/primitives/Panel',
57
+ render: DefaultStory,
58
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
59
+ parameters: {
60
+ layout: 'fullscreen',
61
+ },
62
+ };
63
+
64
+ export default meta;
65
+
66
+ type Story = StoryObj<typeof meta>;
67
+
68
+ export const Default: Story = {};
@@ -0,0 +1,120 @@
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, { type CSSProperties } from 'react';
8
+
9
+ import { composableProps, PanelStyleProps, slottable } from '@dxos/ui-theme';
10
+ import { type SlottableProps } from '@dxos/ui-types';
11
+
12
+ import { useThemeContext } from '../../hooks';
13
+
14
+ //
15
+ // Root
16
+ //
17
+
18
+ const GRID_TEMPLATE_ROWS = 'auto 1fr auto';
19
+ const GRID_TEMPLATE_AREAS = '"toolbar" "content" "statusbar"';
20
+
21
+ type PanelRootProps = SlottableProps<{ style?: CSSProperties }>;
22
+
23
+ const PanelRoot = slottable<HTMLDivElement, { style?: CSSProperties }>(
24
+ ({ children, asChild, role, style, ...props }, forwardedRef) => {
25
+ const { className, ...rest } = composableProps(props);
26
+ const Comp = asChild ? Slot : Primitive.div;
27
+ const { tx } = useThemeContext();
28
+ return (
29
+ <Comp
30
+ {...rest}
31
+ role={role ?? 'none'}
32
+ style={{
33
+ gridTemplateRows: GRID_TEMPLATE_ROWS,
34
+ gridTemplateAreas: GRID_TEMPLATE_AREAS,
35
+ ...style,
36
+ }}
37
+ className={tx('panel.root', {}, className)}
38
+ ref={forwardedRef}
39
+ >
40
+ {children}
41
+ </Comp>
42
+ );
43
+ },
44
+ );
45
+
46
+ PanelRoot.displayName = 'Panel.Root';
47
+
48
+ //
49
+ // Toolbar
50
+ //
51
+
52
+ type PanelToolbarProps = SlottableProps & Pick<PanelStyleProps, 'size'>;
53
+
54
+ const PanelToolbar = slottable<HTMLDivElement, Pick<PanelStyleProps, 'size'>>(
55
+ ({ children, asChild, size, ...props }, forwardedRef) => {
56
+ const { className, ...rest } = composableProps(props);
57
+ const Comp = asChild ? Slot : Primitive.div;
58
+ const { tx } = useThemeContext();
59
+ return (
60
+ <Comp {...rest} data-slot='toolbar' className={tx('panel.toolbar', { size }, className)} ref={forwardedRef}>
61
+ {children}
62
+ </Comp>
63
+ );
64
+ },
65
+ );
66
+
67
+ PanelToolbar.displayName = 'Panel.Toolbar';
68
+
69
+ //
70
+ // Content
71
+ //
72
+
73
+ type PanelContentProps = SlottableProps;
74
+
75
+ const PanelContent = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
76
+ const { className, ...rest } = composableProps(props);
77
+ const Comp = asChild ? Slot : Primitive.div;
78
+ const { tx } = useThemeContext();
79
+ return (
80
+ <Comp {...rest} data-slot='content' className={tx('panel.content', {}, className)} ref={forwardedRef}>
81
+ {children}
82
+ </Comp>
83
+ );
84
+ });
85
+
86
+ PanelContent.displayName = 'Panel.Content';
87
+
88
+ //
89
+ // Statusbar
90
+ //
91
+
92
+ type PanelStatusbarProps = SlottableProps & Pick<PanelStyleProps, 'size'>;
93
+
94
+ const PanelStatusbar = slottable<HTMLDivElement, Pick<PanelStyleProps, 'size'>>(
95
+ ({ children, asChild, size, ...props }, forwardedRef) => {
96
+ const { className, ...rest } = composableProps(props);
97
+ const Comp = asChild ? Slot : Primitive.div;
98
+ const { tx } = useThemeContext();
99
+ return (
100
+ <Comp {...rest} data-slot='statusbar' className={tx('panel.statusbar', { size }, className)} ref={forwardedRef}>
101
+ {children}
102
+ </Comp>
103
+ );
104
+ },
105
+ );
106
+
107
+ PanelStatusbar.displayName = 'Panel.Statusbar';
108
+
109
+ //
110
+ // Panel
111
+ //
112
+
113
+ export const Panel = {
114
+ Root: PanelRoot,
115
+ Toolbar: PanelToolbar,
116
+ Content: PanelContent,
117
+ Statusbar: PanelStatusbar,
118
+ };
119
+
120
+ export type { PanelRootProps, PanelToolbarProps, PanelContentProps, PanelStatusbarProps };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './Panel';
@@ -0,0 +1,9 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './Column';
6
+ export * from './Container';
7
+ export * from './Flex';
8
+ export * from './Grid';
9
+ export * from './Panel';
@@ -0,0 +1,47 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import React, { captureOwnerStack, useEffect, useState } from 'react';
6
+
7
+ import { mx } from '@dxos/ui-theme';
8
+ import { safeStringify } from '@dxos/util';
9
+
10
+ import { ErrorStack, parseCaptureOwnerStack } from '../components';
11
+
12
+ export type LoadingProps = { data?: any };
13
+
14
+ /**
15
+ * Storybook loading component.
16
+ */
17
+ export const Loading = ({ data }: LoadingProps) => {
18
+ const [visible, setVisible] = useState(false);
19
+ const ownerFrames = parseCaptureOwnerStack(captureOwnerStack());
20
+
21
+ useEffect(() => {
22
+ const t = setTimeout(() => setVisible(true), 500);
23
+ return () => clearTimeout(t);
24
+ }, []);
25
+
26
+ return (
27
+ <div className='w-full p-2'>
28
+ <div
29
+ className={mx(
30
+ 'flex flex-col w-full p-2 border-2 border-teal-500 rounded-md',
31
+ 'opacity-0 transition delay-1000 duration-1000',
32
+ visible && 'opacity-100',
33
+ )}
34
+ >
35
+ <h2 className='uppercase capitalize text-xs'>Loading State</h2>
36
+ <pre className='text-sm text-description'>{safeStringify(data, undefined, 2)}</pre>
37
+
38
+ <h3 className='uppercase capitalize text-xs mt-2'>Owner stack</h3>
39
+ {ownerFrames && ownerFrames.length > 0 ? (
40
+ <ErrorStack frames={ownerFrames} />
41
+ ) : (
42
+ <p className='text-xs text-subdued'>No owner stack (production build or unsupported context).</p>
43
+ )}
44
+ </div>
45
+ </div>
46
+ );
47
+ };