@dxos/react-ui 0.8.4-main.7ace549 → 0.8.4-main.8360d9e660

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 (342) hide show
  1. package/dist/lib/browser/chunk-EJSGYGYH.mjs +774 -0
  2. package/dist/lib/browser/chunk-EJSGYGYH.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +3913 -68
  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 +73 -61
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/chunk-B7MXDDMJ.mjs +776 -0
  9. package/dist/lib/node-esm/chunk-B7MXDDMJ.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +3913 -68
  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 +73 -61
  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/Button/Button.d.ts +3 -3
  19. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  20. package/dist/types/src/components/Button/IconButton.d.ts +2 -1
  21. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  22. package/dist/types/src/components/Button/Toggle.d.ts +2 -2
  23. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -1
  24. package/dist/types/src/components/Button/ToggleGroup.d.ts +10 -10
  25. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -1
  26. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +4 -4
  27. package/dist/types/src/components/Card/Card.d.ts +107 -0
  28. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  29. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  30. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  31. package/dist/types/src/components/Card/index.d.ts +2 -0
  32. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  33. package/dist/types/src/components/Clipboard/index.d.ts +10 -1
  34. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  35. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  36. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  37. package/dist/types/src/components/Dialog/AlertDialog.d.ts +26 -17
  38. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  39. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  40. package/dist/types/src/components/Dialog/Dialog.d.ts +35 -19
  41. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  42. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +9 -10
  43. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  44. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  45. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  46. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  47. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  48. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  49. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  50. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +8 -0
  51. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  52. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  53. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  54. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  55. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  56. package/dist/types/src/components/Icon/Icon.d.ts +1 -1
  57. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  58. package/dist/types/src/components/Image/Image.d.ts +14 -0
  59. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  60. package/dist/types/src/components/Image/Image.stories.d.ts +33 -0
  61. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  62. package/dist/types/src/components/Image/index.d.ts +2 -0
  63. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  64. package/dist/types/src/components/Input/Input.d.ts +7 -7
  65. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  66. package/dist/types/src/components/Input/Input.stories.d.ts +8 -8
  67. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  68. package/dist/types/src/components/List/List.d.ts +1 -1
  69. package/dist/types/src/components/List/List.d.ts.map +1 -1
  70. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  71. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  72. package/dist/types/src/components/Main/Main.d.ts +9 -10
  73. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  74. package/dist/types/src/components/Main/Main.stories.d.ts +0 -3
  75. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  76. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  77. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  78. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  79. package/dist/types/src/components/{Menus → Menu}/DropdownMenu.d.ts +52 -50
  80. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  81. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +20 -0
  82. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  83. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  84. package/dist/types/src/components/Message/Message.d.ts +1 -1
  85. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  86. package/dist/types/src/components/Message/Message.stories.d.ts +3 -4
  87. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  88. package/dist/types/src/components/Popover/Popover.d.ts +29 -23
  89. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  90. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +23 -26
  91. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  92. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +44 -8
  93. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  94. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +4 -2
  95. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  96. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +8 -2
  97. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  98. package/dist/types/src/components/Select/Select.d.ts +9 -9
  99. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  100. package/dist/types/src/components/Separator/Separator.d.ts +4 -4
  101. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  102. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  103. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  104. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  105. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  106. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  107. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  108. package/dist/types/src/components/Splitter/Splitter.d.ts +32 -0
  109. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  110. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  111. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  112. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  113. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  114. package/dist/types/src/components/Status/Status.stories.d.ts +4 -2
  115. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  116. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  117. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  118. package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
  119. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  120. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +2 -2
  121. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  122. package/dist/types/src/components/{Menus/DropdownMenu.stories.d.ts → ThemeProvider/ThemeProvider.stories.d.ts} +2 -5
  123. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  124. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
  125. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  126. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  127. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  128. package/dist/types/src/components/Toast/Toast.d.ts +19 -19
  129. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  130. package/dist/types/src/components/Toolbar/Toolbar.d.ts +39 -17
  131. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  132. package/dist/types/src/components/Tooltip/Tooltip.d.ts +9 -9
  133. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  134. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  135. package/dist/types/src/components/index.d.ts +9 -5
  136. package/dist/types/src/components/index.d.ts.map +1 -1
  137. package/dist/types/src/exemplars/generics.stories.d.ts +18 -0
  138. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  139. package/dist/types/src/exemplars/slot.stories.d.ts +14 -0
  140. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  141. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  142. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  143. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  144. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  145. package/dist/types/src/hooks/index.d.ts +1 -0
  146. package/dist/types/src/hooks/index.d.ts.map +1 -1
  147. package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
  148. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  149. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  150. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  151. package/dist/types/src/index.d.ts +2 -1
  152. package/dist/types/src/index.d.ts.map +1 -1
  153. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  154. package/dist/types/src/primitives/Column/Column.d.ts +26 -0
  155. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  156. package/dist/types/src/primitives/Column/Column.stories.d.ts +6 -0
  157. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  158. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  159. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  160. package/dist/types/src/primitives/Container/Container.d.ts +8 -0
  161. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  162. package/dist/types/src/primitives/Container/Container.stories.d.ts +6 -0
  163. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  164. package/dist/types/src/primitives/Container/index.d.ts +2 -0
  165. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  166. package/dist/types/src/primitives/Flex/Flex.d.ts +13 -0
  167. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  168. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  169. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  170. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  171. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  172. package/dist/types/src/primitives/Grid/Grid.d.ts +15 -0
  173. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  174. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  175. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  176. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  177. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  178. package/dist/types/src/primitives/Panel/Panel.d.ts +26 -0
  179. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  180. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  181. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  182. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  183. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  184. package/dist/types/src/primitives/index.d.ts +6 -0
  185. package/dist/types/src/primitives/index.d.ts.map +1 -0
  186. package/dist/types/src/testing/Loading.d.ts +9 -0
  187. package/dist/types/src/testing/Loading.d.ts.map +1 -0
  188. package/dist/types/src/testing/decorators/withLayout.d.ts +3 -3
  189. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  190. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +1 -1
  191. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  192. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  193. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  194. package/dist/types/src/testing/index.d.ts +1 -0
  195. package/dist/types/src/testing/index.d.ts.map +1 -1
  196. package/dist/types/src/translations.d.ts +11 -0
  197. package/dist/types/src/translations.d.ts.map +1 -0
  198. package/dist/types/src/util/index.d.ts +1 -2
  199. package/dist/types/src/util/index.d.ts.map +1 -1
  200. package/dist/types/tsconfig.tsbuildinfo +1 -1
  201. package/package.json +40 -31
  202. package/src/components/Avatars/Avatar.stories.tsx +5 -6
  203. package/src/components/Avatars/Avatar.tsx +6 -13
  204. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -2
  205. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +3 -3
  206. package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
  207. package/src/components/Button/Button.stories.tsx +3 -3
  208. package/src/components/Button/Button.tsx +9 -15
  209. package/src/components/Button/IconButton.stories.tsx +4 -4
  210. package/src/components/Button/IconButton.tsx +9 -5
  211. package/src/components/Button/Toggle.stories.tsx +2 -2
  212. package/src/components/Button/Toggle.tsx +4 -4
  213. package/src/components/Button/ToggleGroup.stories.tsx +2 -2
  214. package/src/components/Button/ToggleGroup.tsx +12 -16
  215. package/src/components/Card/Card.stories.tsx +151 -0
  216. package/src/components/Card/Card.tsx +390 -0
  217. package/src/components/Card/index.ts +5 -0
  218. package/src/components/Clipboard/CopyButton.tsx +6 -6
  219. package/src/components/DensityProvider/DensityProvider.tsx +1 -1
  220. package/src/components/Dialog/AlertDialog.stories.tsx +15 -15
  221. package/src/components/Dialog/AlertDialog.tsx +137 -54
  222. package/src/components/Dialog/Dialog.stories.tsx +83 -28
  223. package/src/components/Dialog/Dialog.tsx +191 -75
  224. package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
  225. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +50 -0
  226. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  227. package/src/components/ErrorFallback/ErrorStack.tsx +80 -0
  228. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  229. package/src/components/ErrorFallback/index.ts +9 -0
  230. package/src/components/Icon/Icon.stories.tsx +3 -3
  231. package/src/components/Icon/Icon.tsx +4 -3
  232. package/src/components/Image/Image.stories.tsx +86 -0
  233. package/src/components/Image/Image.tsx +223 -0
  234. package/src/components/Image/index.ts +5 -0
  235. package/src/components/Input/Input.stories.tsx +21 -40
  236. package/src/components/Input/Input.tsx +36 -72
  237. package/src/components/Link/Link.stories.tsx +2 -2
  238. package/src/components/Link/Link.tsx +2 -2
  239. package/src/components/List/List.stories.tsx +30 -33
  240. package/src/components/List/List.tsx +12 -17
  241. package/src/components/List/ListDropIndicator.tsx +7 -7
  242. package/src/components/List/Tree.stories.tsx +4 -4
  243. package/src/components/List/TreeDropIndicator.tsx +6 -6
  244. package/src/components/List/Treegrid.stories.tsx +3 -3
  245. package/src/components/List/Treegrid.tsx +10 -15
  246. package/src/components/Main/Main.stories.tsx +41 -23
  247. package/src/components/Main/Main.tsx +139 -82
  248. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +2 -2
  249. package/src/components/{Menus → Menu}/ContextMenu.tsx +9 -33
  250. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +2 -2
  251. package/src/components/{Menus → Menu}/DropdownMenu.tsx +113 -105
  252. package/src/components/Message/Message.stories.tsx +26 -11
  253. package/src/components/Message/Message.tsx +46 -33
  254. package/src/components/Popover/Popover.stories.tsx +4 -4
  255. package/src/components/Popover/Popover.tsx +96 -91
  256. package/src/components/ScrollArea/ScrollArea.stories.tsx +166 -40
  257. package/src/components/ScrollArea/ScrollArea.tsx +84 -82
  258. package/src/components/ScrollArea/index.ts +1 -1
  259. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +41 -21
  260. package/src/components/ScrollContainer/ScrollContainer.tsx +101 -94
  261. package/src/components/Select/Select.stories.tsx +2 -2
  262. package/src/components/Select/Select.tsx +11 -27
  263. package/src/components/Separator/Separator.tsx +5 -8
  264. package/src/components/Skeleton/Skeleton.stories.tsx +52 -0
  265. package/src/components/Skeleton/Skeleton.tsx +26 -0
  266. package/src/components/Skeleton/index.ts +5 -0
  267. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  268. package/src/components/Splitter/Splitter.tsx +126 -0
  269. package/src/components/Splitter/index.ts +5 -0
  270. package/src/components/Status/Status.stories.tsx +21 -17
  271. package/src/components/Status/Status.tsx +2 -2
  272. package/src/components/Tag/Tag.stories.tsx +6 -11
  273. package/src/components/Tag/Tag.tsx +3 -8
  274. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +32 -0
  275. package/src/components/ThemeProvider/ThemeProvider.tsx +5 -6
  276. package/src/components/ThemeProvider/TranslationsProvider.tsx +1 -16
  277. package/src/components/ThemeProvider/index.ts +3 -3
  278. package/src/components/Toast/Toast.stories.tsx +2 -2
  279. package/src/components/Toast/Toast.tsx +22 -41
  280. package/src/components/Toolbar/Toolbar.stories.tsx +2 -2
  281. package/src/components/Toolbar/Toolbar.tsx +179 -19
  282. package/src/components/Tooltip/Tooltip.stories.tsx +15 -13
  283. package/src/components/Tooltip/Tooltip.tsx +40 -38
  284. package/src/components/index.ts +10 -6
  285. package/src/exemplars/generics.stories.tsx +49 -0
  286. package/src/exemplars/slot.stories.tsx +107 -0
  287. package/src/exemplars/tabster.stories.tsx +127 -0
  288. package/src/exemplars/virtualizer.stories.tsx +137 -0
  289. package/src/hooks/index.ts +1 -0
  290. package/src/hooks/useDensityContext.ts +1 -1
  291. package/src/hooks/useElevationContext.ts +1 -1
  292. package/src/index.ts +2 -1
  293. package/src/playground/Controls.stories.tsx +3 -10
  294. package/src/playground/Custom.stories.tsx +11 -11
  295. package/src/playground/Typography.stories.tsx +3 -3
  296. package/src/primitives/Column/Column.stories.tsx +78 -0
  297. package/src/primitives/Column/Column.tsx +133 -0
  298. package/src/primitives/Column/index.ts +5 -0
  299. package/src/primitives/Container/Container.stories.tsx +30 -0
  300. package/src/primitives/Container/Container.tsx +22 -0
  301. package/src/primitives/Container/index.ts +5 -0
  302. package/src/primitives/Flex/Flex.stories.tsx +58 -0
  303. package/src/primitives/Flex/Flex.tsx +29 -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 +35 -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 +119 -0
  310. package/src/primitives/Panel/index.ts +5 -0
  311. package/src/primitives/index.ts +9 -0
  312. package/src/testing/Loading.tsx +26 -0
  313. package/src/testing/decorators/withLayout.tsx +39 -18
  314. package/src/testing/decorators/withLayoutVariants.tsx +20 -23
  315. package/src/testing/decorators/withTheme.tsx +21 -18
  316. package/src/testing/index.ts +2 -0
  317. package/src/translations.ts +19 -0
  318. package/src/util/index.ts +2 -2
  319. package/dist/lib/browser/chunk-N5GDJTT2.mjs +0 -4707
  320. package/dist/lib/browser/chunk-N5GDJTT2.mjs.map +0 -7
  321. package/dist/lib/node-esm/chunk-SP7VQH72.mjs +0 -4709
  322. package/dist/lib/node-esm/chunk-SP7VQH72.mjs.map +0 -7
  323. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  324. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  325. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  326. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  327. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  328. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  329. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  330. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  331. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  332. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  333. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  334. package/dist/types/src/util/domino.d.ts +0 -18
  335. package/dist/types/src/util/domino.d.ts.map +0 -1
  336. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
  337. package/src/components/AnchoredOverflow/index.ts +0 -5
  338. package/src/util/ThemedClassName.ts +0 -7
  339. package/src/util/domino.ts +0 -53
  340. /package/dist/types/src/components/{Menus → Menu}/ContextMenu.stories.d.ts +0 -0
  341. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  342. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -0,0 +1,107 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { Primitive } from '@radix-ui/react-primitive';
6
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
+ import React, { HTMLAttributes, type PropsWithChildren, forwardRef } from 'react';
8
+
9
+ import { composableProps } from '@dxos/ui-theme';
10
+ import { type ComposableProps, type SlottableProps, type ThemedClassName } from '@dxos/ui-types';
11
+
12
+ import { withTheme } from '../testing';
13
+ import { Slot } from '@radix-ui/react-slot';
14
+
15
+ /**
16
+ * Composition
17
+ *
18
+ * All Radix primitive parts that render a DOM element accept an asChild prop.
19
+ * When asChild is set to true, Radix will not render a default DOM element, instead cloning the part's child and passing it the props and behavior required to make it functional.
20
+ * https://www.radix-ui.com/primitives/docs/guides/composition
21
+ */
22
+
23
+ const Outer = forwardRef<HTMLDivElement, SlottableProps<HTMLDivElement>>(
24
+ ({ children, asChild, ...props }, forwardedRef) => {
25
+ const Comp = asChild ? Slot : Primitive.div;
26
+ return (
27
+ <Comp {...composableProps<HTMLDivElement>(props, { role: 'none' })} ref={forwardedRef}>
28
+ {children}
29
+ </Comp>
30
+ );
31
+ },
32
+ );
33
+
34
+ const Middle = forwardRef<HTMLDivElement, SlottableProps<HTMLDivElement>>(
35
+ ({ children, asChild, ...props }, forwardedRef) => {
36
+ const Comp = asChild ? Slot : Primitive.div;
37
+ return (
38
+ <Comp {...composableProps<HTMLDivElement>(props, { role: 'none' })} ref={forwardedRef}>
39
+ {children}
40
+ </Comp>
41
+ );
42
+ },
43
+ );
44
+
45
+ const Leaf = forwardRef<HTMLButtonElement, ComposableProps<HTMLButtonElement>>(
46
+ ({ children, ...props }, forwardedRef) => {
47
+ return (
48
+ <button {...composableProps<HTMLButtonElement>(props, { role: 'none' })} ref={forwardedRef}>
49
+ {children}
50
+ </button>
51
+ );
52
+ },
53
+ );
54
+
55
+ const TestSingle = (props: ThemedClassName<{ role?: string }>) => {
56
+ return (
57
+ <Outer asChild {...composableProps<HTMLDivElement>(props, { role: 'none' })}>
58
+ <Leaf>Single asChild (non-compliant — see console)</Leaf>
59
+ </Outer>
60
+ );
61
+ };
62
+
63
+ const TestNested = (props: ThemedClassName<{ role?: string }>) => {
64
+ return (
65
+ <Outer asChild {...composableProps<HTMLDivElement>(props, { role: 'none' })}>
66
+ <Middle asChild>
67
+ <Leaf>Nested asChild</Leaf>
68
+ </Middle>
69
+ </Outer>
70
+ );
71
+ };
72
+
73
+ const TestInner = (props: ThemedClassName<{ role?: string }>) => {
74
+ return (
75
+ <Outer asChild {...composableProps<HTMLDivElement>(props, { role: 'none' })}>
76
+ <Middle asChild>
77
+ <Leaf>
78
+ <div role='none'>Leaf</div>
79
+ </Leaf>
80
+ </Middle>
81
+ </Outer>
82
+ );
83
+ };
84
+
85
+ const meta = {
86
+ title: 'ui/react-ui-core/exemplars/slot',
87
+ decorators: [withTheme()],
88
+ parameters: {
89
+ layout: 'centered',
90
+ },
91
+ } satisfies Meta;
92
+
93
+ export default meta;
94
+
95
+ type Story = StoryObj<typeof meta>;
96
+
97
+ export const Single: Story = {
98
+ render: () => <TestSingle role='listitem' classNames='border-red-500' />,
99
+ };
100
+
101
+ export const Nested: Story = {
102
+ render: () => <TestNested role='listitem' classNames='border-green-500' />,
103
+ };
104
+
105
+ export const Inner: Story = {
106
+ render: () => <TestInner role='listitem' classNames='border-blue-500' />,
107
+ };
@@ -0,0 +1,127 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import {
6
+ useArrowNavigationGroup,
7
+ useFocusFinders,
8
+ useFocusableGroup,
9
+ useMergedTabsterAttributes_unstable,
10
+ } from '@fluentui/react-tabster';
11
+ import { type Decorator, type Meta, type StoryObj } from '@storybook/react-vite';
12
+ import React, { forwardRef, useEffect, useMemo, useRef } from 'react';
13
+ import { createTabster, disposeTabster } from 'tabster';
14
+
15
+ import { Input, ScrollArea } from '@dxos/react-ui';
16
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
17
+ import { mx } from '@dxos/ui-theme';
18
+
19
+ // TODO(burdon): Factor out styles (incl. tabster debugging).
20
+ // TODO(burdon): Implement horizontal movement between columns when column is selected.
21
+ // TODO(burdon): Prevent tab out of app.
22
+
23
+ const border =
24
+ 'rounded-xs outline-hidden border border-subdued-separator focus:border-primary-500 focus-within:border-rose-500';
25
+
26
+ const Board = forwardRef<HTMLDivElement, { columns: string[][] }>(({ columns }, ref) => {
27
+ const arrowNavigationAttrs = useArrowNavigationGroup({ axis: 'horizontal', memorizeCurrent: true, tabbable: true });
28
+
29
+ return (
30
+ <div ref={ref} tabIndex={0} {...arrowNavigationAttrs} className='flex h-full w-full overflow-hidden'>
31
+ <div className={mx('flex h-full overflow-x-auto p-4 gap-4')}>
32
+ {columns.map((column) => (
33
+ <Column key={column[0]} items={column} />
34
+ ))}
35
+ </div>
36
+ </div>
37
+ );
38
+ });
39
+
40
+ const Column = forwardRef<HTMLDivElement, { items: string[] }>(({ items }, ref) => {
41
+ const focusableGroupAttrs = useFocusableGroup({ tabBehavior: 'limited' });
42
+ const arrowNavigationAttrs = useArrowNavigationGroup({ axis: 'vertical', memorizeCurrent: true });
43
+ const tabsterAttrs = useMergedTabsterAttributes_unstable(focusableGroupAttrs, arrowNavigationAttrs);
44
+
45
+ return (
46
+ <ScrollArea.Root tabIndex={0} orientation='vertical' classNames={mx('w-[25rem]', border)}>
47
+ <ScrollArea.Viewport {...tabsterAttrs} classNames='p-4 gap-4' ref={ref}>
48
+ {items.map((item) => (
49
+ <Item key={item} value={item} />
50
+ ))}
51
+ </ScrollArea.Viewport>
52
+ </ScrollArea.Root>
53
+ );
54
+ });
55
+
56
+ const Item = forwardRef<HTMLDivElement, { value: string }>(({ value }, ref) => {
57
+ const focusableGroupAttrs = useFocusableGroup();
58
+
59
+ return (
60
+ <div
61
+ ref={ref}
62
+ tabIndex={0}
63
+ {...focusableGroupAttrs}
64
+ className={mx('flex shrink-0 w-full gap-4 p-4 items-center', border)}
65
+ >
66
+ <Input.Root>
67
+ <Input.Checkbox />
68
+ </Input.Root>
69
+ <Input.Root>
70
+ <Input.TextInput defaultValue={value} />
71
+ </Input.Root>
72
+ </div>
73
+ );
74
+ });
75
+
76
+ const DefaultStory = () => {
77
+ const columns = useMemo(() => {
78
+ return [['A1', 'A2', 'A3'], ['B1'], ['C1', 'C2', 'C3', 'C4', 'C5', 'C6'], ['D1', 'D2']];
79
+ }, []);
80
+
81
+ const ref = useRef<HTMLDivElement>(null);
82
+ const { findFirstFocusable } = useFocusFinders();
83
+ useEffect(() => {
84
+ if (ref.current) {
85
+ findFirstFocusable(ref.current)?.focus();
86
+ }
87
+ }, []);
88
+
89
+ return <Board columns={columns} ref={ref} />;
90
+ };
91
+
92
+ // TODO(burdon): This doesn't seem to be necessary or recongized; memoization doesn't work.
93
+ const withTabster: Decorator = (Story) => {
94
+ useEffect(() => {
95
+ const tabster = createTabster(window, {
96
+ autoRoot: {},
97
+ // TODO(burdon): Not called.
98
+ // checkUncontrolledCompletely: (el) => {
99
+ // console.log(el);
100
+ // return true;
101
+ // },
102
+ });
103
+
104
+ return () => {
105
+ disposeTabster(tabster);
106
+ };
107
+ }, []);
108
+
109
+ return <Story />;
110
+ };
111
+
112
+ const meta: Meta<typeof DefaultStory> = {
113
+ title: 'ui/react-ui-core/exemplars/tabster',
114
+ component: DefaultStory,
115
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' }), withTabster],
116
+ parameters: {
117
+ layout: 'fullscreen',
118
+ },
119
+ };
120
+
121
+ export default meta;
122
+
123
+ type Story = StoryObj<typeof meta>;
124
+
125
+ export const Default: Story = {
126
+ args: {},
127
+ };
@@ -0,0 +1,137 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type Meta } from '@storybook/react-vite';
6
+ import { useVirtualizer } from '@tanstack/react-virtual';
7
+ import React, { useEffect, useMemo, useRef, useState } from 'react';
8
+
9
+ import { faker } from '@dxos/random';
10
+ import { Panel, ScrollArea, Toolbar } from '@dxos/react-ui';
11
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
12
+
13
+ faker.seed(999);
14
+
15
+ type TestItem = {
16
+ name: string;
17
+ };
18
+
19
+ const meta: Meta = {
20
+ title: 'ui/react-ui-core/exemplars/virtualizer',
21
+ decorators: [withLayout({ layout: 'column' }), withTheme()],
22
+ parameters: {
23
+ layout: 'fullscreen',
24
+ },
25
+ };
26
+
27
+ export default meta;
28
+
29
+ const NUM_ITEMS = 500;
30
+
31
+ /**
32
+ * https://tanstack.com/virtual/latest/docs/introduction
33
+ */
34
+ export const Default = {
35
+ render: () => {
36
+ const [index, setIndex] = useState(0);
37
+ const items = useMemo<TestItem[]>(
38
+ () =>
39
+ Array.from({ length: NUM_ITEMS }, () => ({
40
+ name: faker.lorem.paragraph(),
41
+ })),
42
+ [],
43
+ );
44
+
45
+ const parentRef = useRef(null);
46
+ const [viewport, setViewport] = useState<HTMLElement | null>(null);
47
+ const virtualizer = useVirtualizer({
48
+ getScrollElement: () => viewport,
49
+ estimateSize: () => 40,
50
+ count: items.length,
51
+ gap: 8,
52
+ });
53
+
54
+ useEffect(() => {
55
+ virtualizer.scrollToIndex(index, { align: 'start' });
56
+ }, [virtualizer, index]);
57
+
58
+ const virtualItems = virtualizer.getVirtualItems();
59
+
60
+ return (
61
+ <Panel.Root>
62
+ <Panel.Toolbar asChild>
63
+ <ScrollToolbar items={items} index={index} setIndex={setIndex} />
64
+ </Panel.Toolbar>
65
+ <Panel.Content asChild>
66
+ <ScrollArea.Root orientation='vertical' margin>
67
+ <ScrollArea.Viewport classNames='p-2' ref={setViewport}>
68
+ <div
69
+ role='none'
70
+ style={{
71
+ position: 'relative',
72
+ height: virtualizer.getTotalSize(),
73
+ width: '100%',
74
+ }}
75
+ ref={parentRef}
76
+ >
77
+ {virtualItems.map((virtualItem) => (
78
+ <div
79
+ key={virtualItem.key}
80
+ role='list'
81
+ className='grid grid-cols-[3rem_1fr] overflow-hidden border border-separator rounded-xs'
82
+ style={{
83
+ position: 'absolute',
84
+ top: 0,
85
+ left: 0,
86
+ width: '100%',
87
+ transform: `translateY(${virtualItem.start}px)`,
88
+ }}
89
+ data-index={virtualItem.index}
90
+ ref={virtualizer.measureElement}
91
+ >
92
+ <div className='p-1'>{virtualItem.index + 1}</div>
93
+ <div className='p-1'>{items[virtualItem.index].name}</div>
94
+ </div>
95
+ ))}
96
+ </div>
97
+ </ScrollArea.Viewport>
98
+ </ScrollArea.Root>
99
+ </Panel.Content>
100
+ </Panel.Root>
101
+ );
102
+ },
103
+ };
104
+
105
+ const ScrollToolbar = ({
106
+ items,
107
+ index,
108
+ setIndex,
109
+ }: {
110
+ items: any[];
111
+ index: number;
112
+ setIndex: (index: number) => void;
113
+ }) => {
114
+ return (
115
+ <Toolbar.Root classNames='grid grid-cols-3'>
116
+ <div />
117
+ <div className='flex justify-center gap-1'>
118
+ <Toolbar.IconButton icon='ph--arrow-line-left--regular' iconOnly label='start' onClick={() => setIndex(0)} />
119
+ <Toolbar.IconButton
120
+ icon='ph--arrows-out-line-horizontal--regular'
121
+ iconOnly
122
+ label='random'
123
+ onClick={() => setIndex(Math.floor(Math.random() * items.length))}
124
+ />
125
+ <Toolbar.IconButton
126
+ icon='ph--arrow-line-right--regular'
127
+ iconOnly
128
+ label='end'
129
+ onClick={() => setIndex(items.length - 1)}
130
+ />
131
+ </div>
132
+ <div className='p-1 text-right'>
133
+ {index + 1}/{items.length}
134
+ </div>
135
+ </Toolbar.Root>
136
+ );
137
+ };
@@ -6,6 +6,7 @@ export * from './useDensityContext';
6
6
  export * from './useElevationContext';
7
7
  export * from './useIconHref';
8
8
  export * from './useSafeArea';
9
+ export * from './useSafeCollisionPadding';
9
10
  export * from './useTranslationsContext';
10
11
  export * from './useThemeContext';
11
12
  export * from './useVisualViewport';
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { useContext } from 'react';
6
6
 
7
- import { type Density } from '@dxos/react-ui-types';
7
+ import { type Density } from '@dxos/ui-types';
8
8
 
9
9
  import { DensityContext } from '../components';
10
10
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { useContext } from 'react';
6
6
 
7
- import { type Elevation } from '@dxos/react-ui-types';
7
+ import { type Elevation } from '@dxos/ui-types';
8
8
 
9
9
  import { ElevationContext } from '../components';
10
10
 
package/src/index.ts CHANGED
@@ -6,8 +6,9 @@ export { type Resource, type TFunction } from 'i18next';
6
6
  export { Trans } from 'react-i18next';
7
7
 
8
8
  export * from '@dxos/react-hooks';
9
- export * from '@dxos/react-ui-types';
9
+ export * from '@dxos/ui-types';
10
10
 
11
11
  export * from './components';
12
12
  export * from './hooks';
13
+ export * from './primitives';
13
14
  export * from './util';
@@ -6,8 +6,7 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React, { useState } from 'react';
7
7
 
8
8
  import { Icon, Input, Select, Toggle, Toolbar } from '../components';
9
- import { withTheme } from '../testing';
10
- import { withLayoutVariants } from '../testing';
9
+ import { withLayoutVariants, withTheme } from '../testing';
11
10
 
12
11
  const DefaultStory = () => {
13
12
  const [checked, setChecked] = useState<boolean>(false);
@@ -32,9 +31,6 @@ const DefaultStory = () => {
32
31
  </Select.Content>
33
32
  </Select.Portal>
34
33
  </Select.Root>
35
- {/* TODO(burdon): Highlight is cyan. */}
36
- {/* TODO(burdon): Show vertical divider by default. */}
37
- {/* TODO(burdon): Icon sizes should adapt to density. */}
38
34
  <Toolbar.ToggleGroup type='multiple'>
39
35
  <Toolbar.ToggleGroupItem value='a'>
40
36
  <Icon icon='ph--text-b--regular' />
@@ -46,7 +42,6 @@ const DefaultStory = () => {
46
42
  <Icon icon='ph--text-underline--regular' />
47
43
  </Toolbar.ToggleGroupItem>
48
44
  </Toolbar.ToggleGroup>
49
- {/* TODO(burdon): Highlight isn't shown. */}
50
45
  <Toolbar.ToggleGroup type='single' defaultValue='a'>
51
46
  <Toolbar.ToggleGroupItem value='a'>
52
47
  <Icon icon='ph--file-ts--regular' />
@@ -60,11 +55,9 @@ const DefaultStory = () => {
60
55
  <Icon icon='ph--bug--regular' />
61
56
  </Toggle>
62
57
  </Toolbar.Button>
63
- {/* TODO(burdon): Should not be 'is-full' by default. */}
64
58
  <Input.Root>
65
59
  <Input.TextInput placeholder='Enter text...' />
66
60
  </Input.Root>
67
- {/* TODO(burdon): Checkbox collapsed. */}
68
61
  <Input.Root>
69
62
  <Input.Checkbox checked={checked} onCheckedChange={(value) => setChecked(!!value)} />
70
63
  <Input.Label>Checkbox</Input.Label>
@@ -82,9 +75,9 @@ const DefaultStory = () => {
82
75
  };
83
76
 
84
77
  const meta = {
85
- title: 'ui/react-ui-core/Playground/Controls',
78
+ title: 'ui/react-ui-core/playground/Controls',
86
79
  render: DefaultStory,
87
- decorators: [withTheme, withLayoutVariants()],
80
+ decorators: [withTheme(), withLayoutVariants()],
88
81
  } satisfies Meta<typeof Icon>;
89
82
 
90
83
  export default meta;
@@ -28,9 +28,9 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
28
28
  label='Test'
29
29
  icon='ph--atom--regular'
30
30
  iconOnly
31
- size={7}
31
+ size={6}
32
32
  density='coarse'
33
- classNames='pli-1.5'
33
+ classNames='px-1.5'
34
34
  />
35
35
  </div>
36
36
  </div>
@@ -43,7 +43,7 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
43
43
  </Button>
44
44
  </div>
45
45
  <div className='flex justify-center'>
46
- <IconButton {...args} label='Test' icon='ph--atom--regular' density='fine' classNames='pli-2' />
46
+ <IconButton {...args} label='Test' icon='ph--atom--regular' density='fine' classNames='px-2' />
47
47
  </div>
48
48
  <div className='flex justify-center'>
49
49
  <IconButton
@@ -52,7 +52,7 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
52
52
  icon='ph--atom--regular'
53
53
  iconOnly
54
54
  density='fine'
55
- classNames='plb-1 pli-1.5'
55
+ classNames='py-1 px-1.5'
56
56
  />
57
57
  </div>
58
58
  </div>
@@ -60,7 +60,7 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
60
60
  {/* Small */}
61
61
  <div className='grid grid-cols-3 gap-4'>
62
62
  <div className='flex justify-center'>
63
- <Button {...args} density='fine' classNames={'!h-[24px] !text-[14px] p-0 pli-1.5 min-bs-0'}>
63
+ <Button {...args} density='fine' classNames={'!h-[24px] !text-[14px] p-0 px-1.5 min-h-0'}>
64
64
  {children}
65
65
  </Button>
66
66
  </div>
@@ -71,7 +71,7 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
71
71
  icon='ph--atom--regular'
72
72
  density='fine'
73
73
  size={4}
74
- classNames={'!h-[24px] !text-[14px] p-1 min-bs-0 gap-0.5'}
74
+ classNames={'!h-[24px] !text-[14px] p-1 min-h-0 gap-0.5'}
75
75
  />
76
76
  </div>
77
77
  <div className='flex justify-center'>
@@ -82,21 +82,21 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
82
82
  iconOnly
83
83
  density='fine'
84
84
  size={4}
85
- classNames={'!h-[24px] !text-[14px] p-1 min-bs-0'}
85
+ classNames={'!h-[24px] !text-[14px] p-1 min-h-0'}
86
86
  />
87
87
  </div>
88
88
  </div>
89
89
 
90
90
  {/* TODO(burdon): Full variant with max width. */}
91
91
  <div className='flex justify-center'>
92
- <Button classNames='is-full max-is-[15rem] rounded' variant='default'>
92
+ <Button classNames='w-full max-w-[15rem] rounded-sm' variant='default'>
93
93
  Test
94
94
  </Button>
95
95
  </div>
96
96
  <div className='flex justify-center'>
97
97
  {/* TODO(burdon): Option to have button on RHS. Default size for icon should be 5 for this (medium) density. */}
98
98
  <IconButton
99
- classNames='is-full max-is-[15rem] rounded'
99
+ classNames='w-full max-w-[15rem] rounded-sm'
100
100
  variant='primary'
101
101
  icon='ph--arrows-clockwise--regular'
102
102
  label='Test'
@@ -108,10 +108,10 @@ const DefaultStory = ({ children, ...args }: Omit<ButtonProps, 'ref'>) => {
108
108
  };
109
109
 
110
110
  const meta = {
111
- title: 'ui/react-ui-core/Playground/Custom',
111
+ title: 'ui/react-ui-core/playground/Custom',
112
112
  component: Button,
113
113
  render: DefaultStory,
114
- decorators: [withTheme],
114
+ decorators: [withTheme()],
115
115
  parameters: {
116
116
  layout: 'centered',
117
117
  },
@@ -9,7 +9,7 @@ import { withTheme } from '../testing';
9
9
 
10
10
  const DefaultStory = () => {
11
11
  return (
12
- <div className='mli-auto p-8 max-is-[60rem] space-b-4'>
12
+ <div className='mx-auto p-8 max-w-[60rem] space-b-4'>
13
13
  <h1 className='text-4xl font-medium'>
14
14
  Việc <span className='italic'>thừa</span> nhận{' '}
15
15
  <span className='font-mono bg-neutral-500/10'>
@@ -43,9 +43,9 @@ const DefaultStory = () => {
43
43
  };
44
44
 
45
45
  const meta = {
46
- title: 'ui/react-ui-core/Playground/Typography',
46
+ title: 'ui/react-ui-core/playground/Typography',
47
47
  render: DefaultStory,
48
- decorators: [withTheme],
48
+ decorators: [withTheme()],
49
49
  } satisfies Meta<typeof DefaultStory>;
50
50
 
51
51
  export default meta;
@@ -0,0 +1,78 @@
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 } from '../../components';
9
+ import { withLayout, withTheme } from '../../testing';
10
+ import { Flex } from '../Flex';
11
+
12
+ import { Column } from './Column';
13
+
14
+ const List = () => {
15
+ return (
16
+ <ScrollArea.Root margin role='list'>
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
+ <Column.Root className='h-full overflow-hidden' gutter='md'>
31
+ <Column.Segment asChild>
32
+ <h1 className='p-1 bg-blue-500 text-black'>Header</h1>
33
+ </Column.Segment>
34
+
35
+ <Column.Row>
36
+ <div className='p-1 bg-blue-500'>A</div>
37
+ <div className='p-1 bg-red-500'>B</div>
38
+ <div className='p-1 bg-blue-500'>C</div>
39
+ </Column.Row>
40
+
41
+ <Column.Segment asChild>
42
+ <div className='py-2'>
43
+ <Input.Root>
44
+ <Input.TextInput placeholder='Search' />
45
+ </Input.Root>
46
+ </div>
47
+ </Column.Segment>
48
+
49
+ <List />
50
+
51
+ <Column.Segment asChild>
52
+ <Flex column>
53
+ <h1 className='p-1 bg-red-500 text-black'>Section with overflow</h1>
54
+ <pre className='p-1 text-xs text-subdued overflow-auto'>{new Error().stack}</pre>
55
+ </Flex>
56
+ </Column.Segment>
57
+
58
+ <Column.Segment asChild>
59
+ <div className='p-1 bg-green-500 text-black'>Footer</div>
60
+ </Column.Segment>
61
+ </Column.Root>
62
+ );
63
+ };
64
+
65
+ const meta: Meta = {
66
+ title: 'ui/react-ui-core/primitives/Column',
67
+ render: DefaultStory,
68
+ decorators: [withTheme(), withLayout({ layout: 'column', classNames: 'w-[25rem]' })],
69
+ parameters: {
70
+ layout: 'fullscreen',
71
+ },
72
+ };
73
+
74
+ export default meta;
75
+
76
+ type Story = StoryObj<typeof meta>;
77
+
78
+ export const Default: Story = {};