@dxos/react-ui 0.8.4-main.b97322e → 0.8.4-main.bc674ce

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 (312) hide show
  1. package/dist/lib/browser/chunk-CEKVHJ27.mjs +774 -0
  2. package/dist/lib/browser/chunk-CEKVHJ27.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +3165 -59
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +65 -49
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/chunk-2NHEX4AD.mjs +776 -0
  9. package/dist/lib/node-esm/chunk-2NHEX4AD.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +3165 -59
  11. package/dist/lib/node-esm/index.mjs.map +4 -4
  12. package/dist/lib/node-esm/meta.json +1 -1
  13. package/dist/lib/node-esm/testing/index.mjs +65 -49
  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 +5 -31
  18. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  19. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts +5 -11
  20. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  21. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts +1 -1
  22. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  23. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts +8 -20
  24. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  25. package/dist/types/src/components/{Buttons → Button}/Button.d.ts +2 -2
  26. package/dist/types/src/components/Button/Button.d.ts.map +1 -0
  27. package/dist/types/src/components/Button/Button.stories.d.ts +17 -0
  28. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -0
  29. package/dist/types/src/components/{Buttons → Button}/IconButton.d.ts +4 -4
  30. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -0
  31. package/dist/types/src/components/Button/IconButton.stories.d.ts +13 -0
  32. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -0
  33. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -0
  34. package/dist/types/src/components/Button/Toggle.stories.d.ts +16 -0
  35. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -0
  36. package/dist/types/src/components/Button/ToggleGroup.d.ts +27 -0
  37. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -0
  38. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +27 -0
  39. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -0
  40. package/dist/types/src/components/Button/index.d.ts.map +1 -0
  41. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  42. package/dist/types/src/components/Clipboard/CopyButton.d.ts +1 -1
  43. package/dist/types/src/components/Clipboard/CopyButton.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/{Dialogs → Dialog}/AlertDialog.d.ts +1 -1
  47. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -0
  48. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts +11 -0
  49. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -0
  50. package/dist/types/src/components/Dialog/Dialog.d.ts +40 -0
  51. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -0
  52. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +27 -0
  53. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -0
  54. package/dist/types/src/components/Dialog/index.d.ts.map +1 -0
  55. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  56. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  57. package/dist/types/src/components/Icon/Icon.d.ts +2 -2
  58. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  59. package/dist/types/src/components/Icon/Icon.stories.d.ts +17 -0
  60. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -0
  61. package/dist/types/src/components/Input/Input.d.ts +6 -5
  62. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  63. package/dist/types/src/components/Input/Input.stories.d.ts +11 -12
  64. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  65. package/dist/types/src/components/Link/Link.stories.d.ts +8 -8
  66. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  67. package/dist/types/src/components/{Lists → List}/List.d.ts +3 -3
  68. package/dist/types/src/components/List/List.d.ts.map +1 -0
  69. package/dist/types/src/components/List/List.stories.d.ts +14 -0
  70. package/dist/types/src/components/List/List.stories.d.ts.map +1 -0
  71. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -0
  72. package/dist/types/src/components/{Lists → List}/Tree.d.ts +1 -1
  73. package/dist/types/src/components/List/Tree.d.ts.map +1 -0
  74. package/dist/types/src/components/List/Tree.stories.d.ts +15 -0
  75. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -0
  76. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -0
  77. package/dist/types/src/components/{Lists → List}/Treegrid.d.ts +1 -1
  78. package/dist/types/src/components/{Lists → List}/Treegrid.d.ts.map +1 -1
  79. package/dist/types/src/components/List/Treegrid.stories.d.ts +12 -0
  80. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -0
  81. package/dist/types/src/components/List/index.d.ts.map +1 -0
  82. package/dist/types/src/components/Main/Main.d.ts +45 -29
  83. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  84. package/dist/types/src/components/Main/Main.stories.d.ts +8 -8
  85. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  86. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  87. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  88. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts +12 -0
  89. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  90. package/dist/types/src/components/{Menus → Menu}/DropdownMenu.d.ts +8 -8
  91. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  92. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +15 -0
  93. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  94. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  95. package/dist/types/src/components/Message/Message.d.ts +1 -1
  96. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  97. package/dist/types/src/components/Message/Message.stories.d.ts +8 -17
  98. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  99. package/dist/types/src/components/Popover/Popover.d.ts +3 -3
  100. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  101. package/dist/types/src/components/Popover/Popover.stories.d.ts +6 -34
  102. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  103. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +10 -8
  104. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  105. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +8 -30
  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 +19 -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/Select/Select.stories.d.ts +4 -9
  116. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  117. package/dist/types/src/components/Separator/Separator.d.ts +1 -1
  118. package/dist/types/src/components/Status/Status.stories.d.ts +2 -8
  119. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  120. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  121. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  122. package/dist/types/src/components/Tag/Tag.stories.d.ts +12 -12
  123. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  124. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +2 -3
  125. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  126. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
  127. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  128. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  129. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  130. package/dist/types/src/components/Toast/Toast.d.ts +5 -5
  131. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  132. package/dist/types/src/components/Toast/Toast.stories.d.ts +6 -44
  133. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  134. package/dist/types/src/components/Toolbar/Toolbar.d.ts +17 -17
  135. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  136. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +6 -50
  137. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  138. package/dist/types/src/components/Tooltip/Tooltip.d.ts +2 -4
  139. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  140. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +8 -61
  141. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  142. package/dist/types/src/components/index.d.ts +5 -4
  143. package/dist/types/src/components/index.d.ts.map +1 -1
  144. package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
  145. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  146. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  147. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  148. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  149. package/dist/types/src/hooks/useVisualViewport.d.ts +2 -2
  150. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  151. package/dist/types/src/index.d.ts +1 -1
  152. package/dist/types/src/index.d.ts.map +1 -1
  153. package/dist/types/src/playground/Controls.stories.d.ts +5 -9
  154. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  155. package/dist/types/src/playground/Custom.stories.d.ts +12 -4
  156. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  157. package/dist/types/src/playground/Typography.stories.d.ts +5 -11
  158. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  159. package/dist/types/src/testing/decorators/index.d.ts +2 -1
  160. package/dist/types/src/testing/decorators/index.d.ts.map +1 -1
  161. package/dist/types/src/testing/decorators/withLayout.d.ts +15 -0
  162. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -0
  163. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +12 -0
  164. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -0
  165. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -0
  166. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  167. package/dist/types/src/util/index.d.ts +2 -1
  168. package/dist/types/src/util/index.d.ts.map +1 -1
  169. package/dist/types/src/util/usePx.d.ts +8 -0
  170. package/dist/types/src/util/usePx.d.ts.map +1 -0
  171. package/dist/types/tsconfig.tsbuildinfo +1 -1
  172. package/package.json +35 -27
  173. package/src/components/Avatars/Avatar.stories.tsx +21 -12
  174. package/src/components/Avatars/Avatar.tsx +4 -4
  175. package/src/components/Avatars/AvatarGroup.stories.tsx +10 -6
  176. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +17 -12
  177. package/src/components/Breadcrumb/Breadcrumb.tsx +1 -1
  178. package/src/components/{Buttons → Button}/Button.stories.tsx +8 -9
  179. package/src/components/{Buttons → Button}/Button.tsx +1 -1
  180. package/src/components/{Buttons → Button}/IconButton.stories.tsx +11 -8
  181. package/src/components/{Buttons → Button}/IconButton.tsx +22 -15
  182. package/src/components/{Buttons → Button}/Toggle.stories.tsx +13 -9
  183. package/src/components/{Buttons → Button}/ToggleGroup.stories.tsx +10 -7
  184. package/src/components/{Buttons → Button}/ToggleGroup.tsx +17 -4
  185. package/src/components/Clipboard/ClipboardProvider.tsx +1 -1
  186. package/src/components/Clipboard/CopyButton.tsx +6 -5
  187. package/src/components/DensityProvider/DensityProvider.tsx +2 -2
  188. package/src/components/{Dialogs → Dialog}/AlertDialog.stories.tsx +15 -12
  189. package/src/components/{Dialogs → Dialog}/AlertDialog.tsx +13 -13
  190. package/src/components/Dialog/Dialog.stories.tsx +97 -0
  191. package/src/components/{Dialogs → Dialog}/Dialog.tsx +151 -51
  192. package/src/components/ElevationProvider/ElevationProvider.tsx +2 -2
  193. package/src/components/Icon/Icon.stories.tsx +113 -0
  194. package/src/components/Icon/Icon.tsx +2 -2
  195. package/src/components/Input/Input.stories.tsx +13 -15
  196. package/src/components/Input/Input.tsx +28 -19
  197. package/src/components/Link/Link.stories.tsx +10 -6
  198. package/src/components/{Lists → List}/List.stories.tsx +32 -26
  199. package/src/components/{Lists → List}/List.tsx +17 -13
  200. package/src/components/{Lists → List}/ListDropIndicator.tsx +1 -1
  201. package/src/components/{Lists → List}/Tree.stories.tsx +11 -8
  202. package/src/components/{Lists → List}/Tree.tsx +4 -3
  203. package/src/components/{Lists → List}/TreeDropIndicator.tsx +1 -1
  204. package/src/components/{Lists → List}/Treegrid.stories.tsx +12 -6
  205. package/src/components/{Lists → List}/Treegrid.tsx +58 -17
  206. package/src/components/Main/Main.stories.tsx +141 -26
  207. package/src/components/Main/Main.tsx +292 -70
  208. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +11 -8
  209. package/src/components/{Menus → Menu}/ContextMenu.tsx +1 -0
  210. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +12 -9
  211. package/src/components/{Menus → Menu}/DropdownMenu.tsx +102 -71
  212. package/src/components/Message/Message.stories.tsx +12 -8
  213. package/src/components/Message/Message.tsx +30 -5
  214. package/src/components/Popover/Popover.stories.tsx +12 -9
  215. package/src/components/Popover/Popover.tsx +64 -45
  216. package/src/components/ScrollArea/ScrollArea.stories.tsx +64 -11
  217. package/src/components/ScrollArea/ScrollArea.tsx +54 -8
  218. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +70 -0
  219. package/src/components/ScrollContainer/ScrollContainer.tsx +233 -0
  220. package/src/components/ScrollContainer/index.ts +5 -0
  221. package/src/components/Select/Select.stories.tsx +15 -12
  222. package/src/components/Select/Select.tsx +9 -8
  223. package/src/components/Status/Status.stories.tsx +9 -6
  224. package/src/components/Tag/Tag.stories.tsx +20 -11
  225. package/src/components/Tag/Tag.tsx +1 -1
  226. package/src/components/ThemeProvider/ThemeProvider.tsx +3 -4
  227. package/src/components/ThemeProvider/TranslationsProvider.tsx +3 -18
  228. package/src/components/ThemeProvider/index.ts +3 -3
  229. package/src/components/Toast/Toast.stories.tsx +12 -9
  230. package/src/components/Toast/Toast.tsx +9 -9
  231. package/src/components/Toolbar/Toolbar.stories.tsx +14 -12
  232. package/src/components/Toolbar/Toolbar.tsx +37 -10
  233. package/src/components/Tooltip/Tooltip.stories.tsx +16 -12
  234. package/src/components/Tooltip/Tooltip.tsx +27 -24
  235. package/src/components/index.ts +5 -4
  236. package/src/hooks/useDensityContext.ts +1 -1
  237. package/src/hooks/useElevationContext.ts +1 -1
  238. package/src/hooks/useSafeArea.ts +3 -2
  239. package/src/hooks/useVisualViewport.ts +4 -4
  240. package/src/index.ts +1 -1
  241. package/src/playground/Controls.stories.tsx +12 -8
  242. package/src/playground/Custom.stories.tsx +13 -24
  243. package/src/playground/Typography.stories.tsx +8 -6
  244. package/src/testing/decorators/index.ts +2 -1
  245. package/src/testing/decorators/withLayout.tsx +63 -0
  246. package/src/testing/decorators/{withSurfaceVariantsLayout.tsx → withLayoutVariants.tsx} +5 -5
  247. package/src/testing/decorators/withTheme.tsx +32 -0
  248. package/src/util/index.ts +3 -1
  249. package/src/util/usePx.ts +61 -0
  250. package/dist/lib/browser/chunk-2COVUP44.mjs +0 -4373
  251. package/dist/lib/browser/chunk-2COVUP44.mjs.map +0 -7
  252. package/dist/lib/node-esm/chunk-GHXHND5V.mjs +0 -4375
  253. package/dist/lib/node-esm/chunk-GHXHND5V.mjs.map +0 -7
  254. package/dist/types/src/components/Buttons/Button.d.ts.map +0 -1
  255. package/dist/types/src/components/Buttons/Button.stories.d.ts +0 -12
  256. package/dist/types/src/components/Buttons/Button.stories.d.ts.map +0 -1
  257. package/dist/types/src/components/Buttons/IconButton.d.ts.map +0 -1
  258. package/dist/types/src/components/Buttons/IconButton.stories.d.ts +0 -22
  259. package/dist/types/src/components/Buttons/IconButton.stories.d.ts.map +0 -1
  260. package/dist/types/src/components/Buttons/Toggle.d.ts.map +0 -1
  261. package/dist/types/src/components/Buttons/Toggle.stories.d.ts +0 -19
  262. package/dist/types/src/components/Buttons/Toggle.stories.d.ts.map +0 -1
  263. package/dist/types/src/components/Buttons/ToggleGroup.d.ts +0 -28
  264. package/dist/types/src/components/Buttons/ToggleGroup.d.ts.map +0 -1
  265. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts +0 -39
  266. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts.map +0 -1
  267. package/dist/types/src/components/Buttons/index.d.ts.map +0 -1
  268. package/dist/types/src/components/Dialogs/AlertDialog.d.ts.map +0 -1
  269. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts +0 -43
  270. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts.map +0 -1
  271. package/dist/types/src/components/Dialogs/Dialog.d.ts +0 -31
  272. package/dist/types/src/components/Dialogs/Dialog.d.ts.map +0 -1
  273. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts +0 -48
  274. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts.map +0 -1
  275. package/dist/types/src/components/Dialogs/index.d.ts.map +0 -1
  276. package/dist/types/src/components/Lists/List.d.ts.map +0 -1
  277. package/dist/types/src/components/Lists/List.stories.d.ts +0 -37
  278. package/dist/types/src/components/Lists/List.stories.d.ts.map +0 -1
  279. package/dist/types/src/components/Lists/ListDropIndicator.d.ts.map +0 -1
  280. package/dist/types/src/components/Lists/Tree.d.ts.map +0 -1
  281. package/dist/types/src/components/Lists/Tree.stories.d.ts +0 -41
  282. package/dist/types/src/components/Lists/Tree.stories.d.ts.map +0 -1
  283. package/dist/types/src/components/Lists/TreeDropIndicator.d.ts.map +0 -1
  284. package/dist/types/src/components/Lists/Treegrid.stories.d.ts +0 -10
  285. package/dist/types/src/components/Lists/Treegrid.stories.d.ts.map +0 -1
  286. package/dist/types/src/components/Lists/index.d.ts.map +0 -1
  287. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  288. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts +0 -50
  289. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  290. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  291. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts +0 -50
  292. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  293. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  294. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts +0 -12
  295. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts.map +0 -1
  296. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  297. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  298. package/src/components/Dialogs/Dialog.stories.tsx +0 -65
  299. package/src/testing/decorators/withTheme.ts +0 -25
  300. package/src/util/ThemedClassName.ts +0 -7
  301. /package/dist/types/src/components/{Buttons → Button}/Toggle.d.ts +0 -0
  302. /package/dist/types/src/components/{Buttons → Button}/index.d.ts +0 -0
  303. /package/dist/types/src/components/{Dialogs → Dialog}/index.d.ts +0 -0
  304. /package/dist/types/src/components/{Lists → List}/ListDropIndicator.d.ts +0 -0
  305. /package/dist/types/src/components/{Lists → List}/TreeDropIndicator.d.ts +0 -0
  306. /package/dist/types/src/components/{Lists → List}/index.d.ts +0 -0
  307. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  308. /package/src/components/{Buttons → Button}/Toggle.tsx +0 -0
  309. /package/src/components/{Buttons → Button}/index.ts +0 -0
  310. /package/src/components/{Dialogs → Dialog}/index.ts +0 -0
  311. /package/src/components/{Lists → List}/index.ts +0 -0
  312. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -2,49 +2,51 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import { useFocusableGroup } from '@fluentui/react-tabster';
5
6
  import { createContext } from '@radix-ui/react-context';
6
- import { Root as DialogRoot, DialogContent, DialogTitle } from '@radix-ui/react-dialog';
7
+ import { DialogContent, Root as DialogRoot, DialogTitle } from '@radix-ui/react-dialog';
7
8
  import { Primitive } from '@radix-ui/react-primitive';
8
9
  import { Slot } from '@radix-ui/react-slot';
9
10
  import { useControllableState } from '@radix-ui/react-use-controllable-state';
10
11
  import React, {
11
12
  type ComponentPropsWithRef,
13
+ type ComponentPropsWithoutRef,
12
14
  type Dispatch,
13
- forwardRef,
15
+ type KeyboardEvent,
14
16
  type PropsWithChildren,
15
17
  type SetStateAction,
18
+ forwardRef,
16
19
  useCallback,
17
20
  useEffect,
18
21
  useRef,
19
22
  useState,
20
- type KeyboardEvent,
21
- type ComponentPropsWithoutRef,
22
23
  } from 'react';
23
24
 
25
+ import { addEventListener } from '@dxos/async';
24
26
  import { log } from '@dxos/log';
25
- import { useMediaQuery, useForwardedRef } from '@dxos/react-hooks';
27
+ import { useDynamicRef, useForwardedRef, useMediaQuery, useViewportResize } from '@dxos/react-hooks';
28
+ import { type MainStyleProps } from '@dxos/ui-theme';
26
29
 
27
- import { useSwipeToDismiss } from './useSwipeToDismiss';
28
30
  import { useThemeContext } from '../../hooks';
29
31
  import { type ThemedClassName } from '../../util';
30
32
  import { type Label, toLocalizedString, useTranslation } from '../ThemeProvider';
31
33
 
34
+ import { useSwipeToDismiss } from './useSwipeToDismiss';
35
+
36
+ const MAIN_NAME = 'Main';
32
37
  const MAIN_ROOT_NAME = 'MainRoot';
33
38
  const NAVIGATION_SIDEBAR_NAME = 'NavigationSidebar';
34
39
  const COMPLEMENTARY_SIDEBAR_NAME = 'ComplementarySidebar';
35
- const MAIN_NAME = 'Main';
36
- const GENERIC_CONSUMER_NAME = 'GenericConsumer';
37
-
38
- type SidebarState = 'expanded' | 'collapsed' | 'closed';
40
+ const DRAWER_NAME = 'Drawer';
39
41
 
40
- type MainContextValue = {
41
- resizing: boolean;
42
- navigationSidebarState: SidebarState;
43
- setNavigationSidebarState: Dispatch<SetStateAction<SidebarState | undefined>>;
44
- complementarySidebarState: SidebarState;
45
- setComplementarySidebarState: Dispatch<SetStateAction<SidebarState | undefined>>;
42
+ const handleOpenAutoFocus = (event: Event) => {
43
+ !document.body.hasAttribute('data-is-keyboard') && event.preventDefault();
46
44
  };
47
45
 
46
+ //
47
+ // Landmark
48
+ //
49
+
48
50
  const landmarkAttr = 'data-main-landmark';
49
51
 
50
52
  /**
@@ -69,28 +71,105 @@ const useLandmarkMover = (propsOnKeyDown: ComponentPropsWithoutRef<'div'>['onKey
69
71
  },
70
72
  [propsOnKeyDown],
71
73
  );
72
- const focusableGroupAttrs = window ? {} : { tabBehavior: 'limited', ignoreDefaultKeydown: { Tab: true } };
73
74
 
74
- return { onKeyDown: handleKeyDown, [landmarkAttr]: landmark, tabIndex: 0, ...focusableGroupAttrs };
75
+ // TODO(thure): This was disconnected once before in #8818;
76
+ // if this should change again to support the browser extension, please ensure the change doesn’t break web, desktop and mobile.
77
+ const focusableGroupAttrs = useFocusableGroup({ tabBehavior: 'limited', ignoreDefaultKeydown: { Tab: true } });
78
+
79
+ return {
80
+ [landmarkAttr]: landmark,
81
+ tabIndex: 0,
82
+ onKeyDown: handleKeyDown,
83
+ ...focusableGroupAttrs,
84
+ };
85
+ };
86
+
87
+ // TODO(burdon): Better way to detect software keyboard on mobile?
88
+ const isFullscreen = () => {
89
+ const isMobile = window.innerHeight <= 1000;
90
+ return window.visualViewport && isMobile ? window.visualViewport.height < 700 : false;
91
+ };
92
+
93
+ /**
94
+ * Detects if drawer should be in full mode based on:
95
+ * - Device is mobile (width)
96
+ * - Visual viewport is constrained (keyboard visible)
97
+ */
98
+ const useDynamicDrawer = (consumerName: string) => {
99
+ const { drawerState, setDrawerState } = useSidebars(consumerName);
100
+ const drawersStateRef = useDynamicRef(drawerState);
101
+
102
+ const checkViewport = useCallback(() => {
103
+ if (window.visualViewport) {
104
+ document.documentElement.style.setProperty('--visual-viewport-height', `${window.visualViewport.height}px`);
105
+ }
106
+
107
+ if (drawersStateRef.current !== 'closed') {
108
+ setDrawerState(isFullscreen() ? 'full' : 'expanded');
109
+ }
110
+ }, [setDrawerState]);
111
+
112
+ // Check resize.
113
+ useViewportResize(checkViewport, [], 100);
114
+
115
+ // Check on window resize (for device orientation changes).
116
+ useEffect(() => addEventListener(window, 'resize', checkViewport), [checkViewport]);
117
+
118
+ return drawerState;
119
+ };
120
+
121
+ //
122
+ // Context
123
+ //
124
+
125
+ // TODO(burdon): Define collapsed state.
126
+ type SidebarState = 'expanded' | 'collapsed' | 'closed';
127
+ type DrawerState = 'expanded' | 'full' | 'closed';
128
+
129
+ type MainContextValue = {
130
+ resizing: boolean;
131
+
132
+ // Navigation
133
+ navigationSidebarState: SidebarState;
134
+ setNavigationSidebarState: Dispatch<SetStateAction<SidebarState | undefined>>;
135
+
136
+ // Complementary
137
+ complementarySidebarState: SidebarState;
138
+ setComplementarySidebarState: Dispatch<SetStateAction<SidebarState | undefined>>;
139
+
140
+ // Drawer
141
+ drawerState: DrawerState;
142
+ setDrawerState: Dispatch<SetStateAction<DrawerState | undefined>>;
75
143
  };
76
144
 
77
145
  const [MainProvider, useMainContext] = createContext<MainContextValue>(MAIN_NAME, {
78
146
  resizing: false,
147
+
79
148
  navigationSidebarState: 'closed',
80
- setNavigationSidebarState: (nextState) => {
81
- // TODO(burdon): Standardize with other context missing errors using raise.
82
- log.warn('Attempt to set sidebar state without initializing `MainRoot`');
149
+ setNavigationSidebarState: (_nextState) => {
150
+ log.warn('Not initialized');
83
151
  },
152
+
84
153
  complementarySidebarState: 'closed',
85
- setComplementarySidebarState: (nextState) => {
86
- // TODO(burdon): Standardize with other context missing errors using raise.
87
- log.warn('Attempt to set sidebar state without initializing `MainRoot`');
154
+ setComplementarySidebarState: (_nextState) => {
155
+ log.warn('Not initialized');
156
+ },
157
+
158
+ drawerState: 'closed',
159
+ setDrawerState: (_nextState) => {
160
+ log.warn('Not initialized');
88
161
  },
89
162
  });
90
163
 
91
- const useSidebars = (consumerName = GENERIC_CONSUMER_NAME) => {
92
- const { setNavigationSidebarState, navigationSidebarState, setComplementarySidebarState, complementarySidebarState } =
93
- useMainContext(consumerName);
164
+ const useSidebars = (consumerName: string) => {
165
+ const {
166
+ navigationSidebarState,
167
+ setNavigationSidebarState,
168
+ complementarySidebarState,
169
+ setComplementarySidebarState,
170
+ drawerState,
171
+ setDrawerState,
172
+ } = useMainContext(consumerName);
94
173
 
95
174
  return {
96
175
  navigationSidebarState,
@@ -102,6 +181,7 @@ const useSidebars = (consumerName = GENERIC_CONSUMER_NAME) => {
102
181
  openNavigationSidebar: useCallback(() => setNavigationSidebarState('expanded'), []),
103
182
  collapseNavigationSidebar: useCallback(() => setNavigationSidebarState('collapsed'), []),
104
183
  closeNavigationSidebar: useCallback(() => setNavigationSidebarState('closed'), []),
184
+
105
185
  complementarySidebarState,
106
186
  setComplementarySidebarState,
107
187
  toggleComplementarySidebar: useCallback(
@@ -111,31 +191,53 @@ const useSidebars = (consumerName = GENERIC_CONSUMER_NAME) => {
111
191
  openComplementarySidebar: useCallback(() => setComplementarySidebarState('expanded'), []),
112
192
  collapseComplementarySidebar: useCallback(() => setComplementarySidebarState('collapsed'), []),
113
193
  closeComplementarySidebar: useCallback(() => setComplementarySidebarState('closed'), []),
194
+
195
+ drawerState,
196
+ setDrawerState,
197
+ toggleDrawer: useCallback(
198
+ () => setDrawerState(drawerState === 'closed' ? (isFullscreen() ? 'full' : 'expanded') : 'closed'),
199
+ [drawerState, setDrawerState],
200
+ ),
201
+ openDrawer: useCallback(() => setDrawerState('expanded'), []),
202
+ closeDrawer: useCallback(() => setDrawerState('closed'), []),
114
203
  };
115
204
  };
116
205
 
206
+ //
207
+ // Root
208
+ //
209
+
117
210
  type MainRootProps = PropsWithChildren<{
118
211
  navigationSidebarState?: SidebarState;
119
212
  defaultNavigationSidebarState?: SidebarState;
120
213
  onNavigationSidebarStateChange?: (nextState: SidebarState) => void;
214
+
121
215
  complementarySidebarState?: SidebarState;
122
216
  defaultComplementarySidebarState?: SidebarState;
123
217
  onComplementarySidebarStateChange?: (nextState: SidebarState) => void;
124
- }>;
125
218
 
126
- const resizeDebounce = 3000;
219
+ drawerState?: DrawerState;
220
+ defaultDrawerState?: DrawerState;
221
+ onDrawerStateChange?: (nextState: DrawerState) => void;
222
+ }>;
127
223
 
128
224
  const MainRoot = ({
129
225
  navigationSidebarState: propsNavigationSidebarState,
130
- defaultNavigationSidebarState,
226
+ defaultNavigationSidebarState = 'closed',
131
227
  onNavigationSidebarStateChange,
228
+
132
229
  complementarySidebarState: propsComplementarySidebarState,
133
- defaultComplementarySidebarState,
230
+ defaultComplementarySidebarState = 'closed',
134
231
  onComplementarySidebarStateChange,
232
+
233
+ drawerState: propsDrawerState,
234
+ defaultDrawerState = 'closed',
235
+ onDrawerStateChange,
236
+
135
237
  children,
136
238
  ...props
137
239
  }: MainRootProps) => {
138
- const [isLg] = useMediaQuery('lg', { ssr: false });
240
+ const [isLg] = useMediaQuery('lg');
139
241
  const [navigationSidebarState = isLg ? 'expanded' : 'collapsed', setNavigationSidebarState] =
140
242
  useControllableState<SidebarState>({
141
243
  prop: propsNavigationSidebarState,
@@ -148,25 +250,29 @@ const MainRoot = ({
148
250
  defaultProp: defaultComplementarySidebarState,
149
251
  onChange: onComplementarySidebarStateChange,
150
252
  });
253
+ const [drawerState = 'closed', setDrawerState] = useControllableState<DrawerState>({
254
+ prop: propsDrawerState,
255
+ defaultProp: defaultDrawerState,
256
+ onChange: onDrawerStateChange,
257
+ });
151
258
 
152
259
  const [resizing, setResizing] = useState(false);
153
260
  const resizeInterval = useRef<ReturnType<typeof setTimeout> | null>(null);
261
+ useEffect(
262
+ () =>
263
+ addEventListener(window, 'resize', () => {
264
+ setResizing(true);
265
+ if (resizeInterval.current) {
266
+ clearTimeout(resizeInterval.current);
267
+ }
154
268
 
155
- const handleResize = useCallback(() => {
156
- setResizing(true);
157
- if (resizeInterval.current) {
158
- clearTimeout(resizeInterval.current);
159
- }
160
- resizeInterval.current = setTimeout(() => {
161
- setResizing(false);
162
- resizeInterval.current = null;
163
- }, resizeDebounce);
164
- }, []);
165
-
166
- useEffect(() => {
167
- window.addEventListener('resize', handleResize);
168
- return () => window.removeEventListener('resize', handleResize);
169
- }, [handleResize]);
269
+ resizeInterval.current = setTimeout(() => {
270
+ setResizing(false);
271
+ resizeInterval.current = null;
272
+ }, 3_000);
273
+ }),
274
+ [],
275
+ );
170
276
 
171
277
  return (
172
278
  <MainProvider
@@ -176,6 +282,8 @@ const MainRoot = ({
176
282
  setNavigationSidebarState,
177
283
  complementarySidebarState,
178
284
  setComplementarySidebarState,
285
+ drawerState,
286
+ setDrawerState,
179
287
  }}
180
288
  resizing={resizing}
181
289
  >
@@ -186,9 +294,9 @@ const MainRoot = ({
186
294
 
187
295
  MainRoot.displayName = MAIN_ROOT_NAME;
188
296
 
189
- const handleOpenAutoFocus = (event: Event) => {
190
- !document.body.hasAttribute('data-is-keyboard') && event.preventDefault();
191
- };
297
+ //
298
+ // Sidebar
299
+ //
192
300
 
193
301
  type MainSidebarProps = ThemedClassName<ComponentPropsWithRef<typeof DialogContent>> & {
194
302
  swipeToDismiss?: boolean;
@@ -204,23 +312,31 @@ const MainSidebar = forwardRef<HTMLDivElement, MainSidebarProps>(
204
312
  { classNames, children, swipeToDismiss, onOpenAutoFocus, state, resizing, onStateChange, side, label, ...props },
205
313
  forwardedRef,
206
314
  ) => {
207
- const [isLg] = useMediaQuery('lg', { ssr: false });
315
+ const [isLg] = useMediaQuery('lg');
208
316
  const { tx } = useThemeContext();
209
317
  const { t } = useTranslation();
210
318
  const ref = useForwardedRef(forwardedRef);
211
319
  const noopRef = useRef(null);
320
+
212
321
  useSwipeToDismiss(swipeToDismiss ? ref : noopRef, {
213
322
  onDismiss: () => onStateChange?.('closed'),
214
323
  });
324
+
325
+ // NOTE(thure): This is a workaround for something further down the tree grabbing focus on Escape. Adding this
326
+ // intervention to `Tabs.Root` or `Tabs.Tabpenel` instances is somehow ineffectual.
215
327
  const handleKeyDown = useCallback(
216
328
  (event: KeyboardEvent<HTMLDivElement>) => {
217
- if (event.key === 'Escape') {
218
- ((event.target as HTMLDivElement).closest('[data-tabster]') as HTMLDivElement)?.focus();
329
+ const focusGroupParent = (event.target as HTMLElement).closest('[data-tabster]');
330
+ if (event.key === 'Escape' && focusGroupParent) {
331
+ event.preventDefault();
332
+ event.stopPropagation();
333
+ (focusGroupParent as HTMLElement).focus();
219
334
  }
220
335
  props.onKeyDown?.(event);
221
336
  },
222
337
  [props.onKeyDown],
223
338
  );
339
+
224
340
  const Root = isLg ? Primitive.div : DialogContent;
225
341
 
226
342
  return (
@@ -228,13 +344,13 @@ const MainSidebar = forwardRef<HTMLDivElement, MainSidebarProps>(
228
344
  {!isLg && <DialogTitle className='sr-only'>{toLocalizedString(label, t)}</DialogTitle>}
229
345
  <Root
230
346
  {...(!isLg && { forceMount: true, tabIndex: -1, onOpenAutoFocus: onOpenAutoFocus ?? handleOpenAutoFocus })}
347
+ {...(state === 'closed' && { inert: true })}
231
348
  {...props}
232
349
  data-side={side === 'inline-end' ? 'ie' : 'is'}
233
350
  data-state={state}
234
351
  data-resizing={resizing ? 'true' : 'false'}
235
352
  className={tx('main.sidebar', 'main__sidebar', {}, classNames)}
236
- onKeyDown={handleKeyDown}
237
- {...(state === 'closed' && { inert: 'true' })}
353
+ onKeyDownCapture={handleKeyDown}
238
354
  ref={ref}
239
355
  >
240
356
  {children}
@@ -244,6 +360,10 @@ const MainSidebar = forwardRef<HTMLDivElement, MainSidebarProps>(
244
360
  },
245
361
  );
246
362
 
363
+ //
364
+ // Navigation Sidebar
365
+ //
366
+
247
367
  type MainNavigationSidebarProps = Omit<MainSidebarProps, 'expanded' | 'side'>;
248
368
 
249
369
  const MainNavigationSidebar = forwardRef<HTMLDivElement, MainNavigationSidebarProps>((props, forwardedRef) => {
@@ -265,6 +385,10 @@ const MainNavigationSidebar = forwardRef<HTMLDivElement, MainNavigationSidebarPr
265
385
 
266
386
  MainNavigationSidebar.displayName = NAVIGATION_SIDEBAR_NAME;
267
387
 
388
+ //
389
+ // Complementary Sidebar
390
+ //
391
+
268
392
  type MainComplementarySidebarProps = Omit<MainSidebarProps, 'expanded' | 'side'>;
269
393
 
270
394
  const MainComplementarySidebar = forwardRef<HTMLDivElement, MainComplementarySidebarProps>((props, forwardedRef) => {
@@ -285,20 +409,104 @@ const MainComplementarySidebar = forwardRef<HTMLDivElement, MainComplementarySid
285
409
  );
286
410
  });
287
411
 
288
- MainNavigationSidebar.displayName = NAVIGATION_SIDEBAR_NAME;
412
+ MainComplementarySidebar.displayName = COMPLEMENTARY_SIDEBAR_NAME;
289
413
 
290
- type MainProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.div>> & {
291
- asChild?: boolean;
292
- bounce?: boolean;
293
- handlesFocus?: boolean;
414
+ //
415
+ // Drawer
416
+ //
417
+
418
+ type MainDrawerProps = ThemedClassName<ComponentPropsWithRef<typeof DialogContent>> & {
419
+ swipeToDismiss?: boolean;
420
+ state?: DrawerState;
421
+ resizing?: boolean;
422
+ onStateChange?: (nextState: DrawerState) => void;
423
+ label: Label;
294
424
  };
295
425
 
296
- const MainContent = forwardRef<HTMLDivElement, MainProps>(
297
- ({ asChild, classNames, bounce, handlesFocus, children, role, ...props }: MainProps, forwardedRef) => {
298
- const { navigationSidebarState, complementarySidebarState } = useMainContext(MAIN_NAME);
426
+ const MainDrawer = forwardRef<HTMLDivElement, MainDrawerProps>(
427
+ (
428
+ { classNames, children, swipeToDismiss, onOpenAutoFocus, state, resizing, onStateChange, label, ...props },
429
+ forwardedRef,
430
+ ) => {
431
+ const [isLg] = useMediaQuery('lg');
299
432
  const { tx } = useThemeContext();
300
- const Root = asChild ? Slot : role ? 'div' : 'main';
433
+ const { t } = useTranslation();
434
+ const ref = useForwardedRef(forwardedRef);
435
+ const noopRef = useRef(null);
301
436
 
437
+ // TODO(burdon): Implement vertical swipe-to-dismiss for drawer.
438
+ useSwipeToDismiss(swipeToDismiss ? ref : noopRef, {
439
+ onDismiss: () => onStateChange?.('closed'),
440
+ });
441
+
442
+ const handleKeyDown = useCallback(
443
+ (event: KeyboardEvent<HTMLDivElement>) => {
444
+ const focusGroupParent = (event.target as HTMLElement).closest('[data-tabster]');
445
+ if (event.key === 'Escape' && focusGroupParent) {
446
+ event.preventDefault();
447
+ event.stopPropagation();
448
+ (focusGroupParent as HTMLElement).focus();
449
+ }
450
+ props.onKeyDown?.(event);
451
+ },
452
+ [props.onKeyDown],
453
+ );
454
+
455
+ return (
456
+ <Primitive.div
457
+ {...(state === 'closed' && { inert: true })}
458
+ {...(!isLg && { forceMount: true, tabIndex: -1, onOpenAutoFocus: onOpenAutoFocus ?? handleOpenAutoFocus })}
459
+ {...props}
460
+ role='region'
461
+ aria-label={toLocalizedString(label, t)}
462
+ data-state={state}
463
+ data-resizing={resizing ? 'true' : 'false'}
464
+ className={tx('main.drawer', 'main__drawer', {}, classNames)}
465
+ onKeyDownCapture={handleKeyDown}
466
+ ref={ref}
467
+ >
468
+ {children}
469
+ </Primitive.div>
470
+ );
471
+ },
472
+ );
473
+
474
+ type MainDrawerRootProps = Omit<MainDrawerProps, 'state' | 'resizing' | 'onStateChange'>;
475
+
476
+ const MainDrawerRoot = forwardRef<HTMLDivElement, MainDrawerRootProps>((props, forwardedRef) => {
477
+ const { drawerState, setDrawerState, resizing } = useMainContext(DRAWER_NAME);
478
+ const mover = useLandmarkMover(props.onKeyDown, '3');
479
+
480
+ return (
481
+ <MainDrawer
482
+ {...mover}
483
+ {...props}
484
+ resizing={resizing}
485
+ state={drawerState}
486
+ onStateChange={setDrawerState}
487
+ ref={forwardedRef}
488
+ />
489
+ );
490
+ });
491
+
492
+ MainDrawerRoot.displayName = DRAWER_NAME;
493
+
494
+ //
495
+ // Content
496
+ //
497
+
498
+ type MainContentProps = ThemedClassName<
499
+ ComponentPropsWithRef<typeof Primitive.div> &
500
+ MainStyleProps & {
501
+ asChild?: boolean;
502
+ }
503
+ >;
504
+
505
+ const MainContent = forwardRef<HTMLDivElement, MainContentProps>(
506
+ ({ asChild, classNames, bounce, handlesFocus, children, role, ...props }: MainContentProps, forwardedRef) => {
507
+ const { navigationSidebarState, complementarySidebarState, drawerState } = useMainContext(MAIN_NAME);
508
+ const { tx } = useThemeContext();
509
+ const Root = asChild ? Slot : role ? 'div' : 'main';
302
510
  const mover = useLandmarkMover(props.onKeyDown, '1');
303
511
 
304
512
  return (
@@ -308,6 +516,7 @@ const MainContent = forwardRef<HTMLDivElement, MainProps>(
308
516
  {...props}
309
517
  data-sidebar-inline-start-state={navigationSidebarState}
310
518
  data-sidebar-inline-end-state={complementarySidebarState}
519
+ data-drawer-state={drawerState}
311
520
  data-handles-focus={handlesFocus}
312
521
  className={tx('main.content', 'main', { bounce, handlesFocus }, classNames)}
313
522
  ref={forwardedRef}
@@ -320,24 +529,28 @@ const MainContent = forwardRef<HTMLDivElement, MainProps>(
320
529
 
321
530
  MainContent.displayName = MAIN_NAME;
322
531
 
323
- type MainOverlayProps = ThemedClassName<Omit<ComponentPropsWithRef<typeof Primitive.div>, 'children'>>;
532
+ type MainOverlayProps = ThemedClassName<Omit<ComponentPropsWithRef<typeof Primitive.div>, 'children' | 'onClick'>>;
324
533
 
325
534
  const MainOverlay = forwardRef<HTMLDivElement, MainOverlayProps>(({ classNames, ...props }, forwardedRef) => {
326
- const [isLg] = useMediaQuery('lg', { ssr: false });
535
+ const [isLg] = useMediaQuery('lg');
327
536
  const { navigationSidebarState, setNavigationSidebarState, complementarySidebarState, setComplementarySidebarState } =
328
537
  useMainContext(MAIN_NAME);
329
538
  const { tx } = useThemeContext();
330
539
  return (
331
540
  <div
541
+ {...props}
332
542
  onClick={() => {
333
543
  setNavigationSidebarState('collapsed');
334
544
  setComplementarySidebarState('collapsed');
335
545
  }}
336
- {...props}
337
546
  className={tx(
338
547
  'main.overlay',
339
548
  'main__overlay',
340
- { isLg, inlineStartSidebarOpen: navigationSidebarState, inlineEndSidebarOpen: complementarySidebarState },
549
+ {
550
+ isLg,
551
+ inlineStartSidebarOpen: navigationSidebarState,
552
+ inlineEndSidebarOpen: complementarySidebarState,
553
+ },
341
554
  classNames,
342
555
  )}
343
556
  data-state={navigationSidebarState === 'expanded' || complementarySidebarState === 'expanded' ? 'open' : 'closed'}
@@ -353,8 +566,17 @@ export const Main = {
353
566
  Overlay: MainOverlay,
354
567
  NavigationSidebar: MainNavigationSidebar,
355
568
  ComplementarySidebar: MainComplementarySidebar,
569
+ Drawer: MainDrawerRoot,
356
570
  };
357
571
 
358
- export { useMainContext, useSidebars, useLandmarkMover };
572
+ export { useMainContext, useSidebars, useLandmarkMover, useDynamicDrawer };
359
573
 
360
- export type { MainRootProps, MainProps, MainOverlayProps, MainNavigationSidebarProps, SidebarState };
574
+ export type {
575
+ MainRootProps,
576
+ MainContentProps,
577
+ MainOverlayProps,
578
+ MainNavigationSidebarProps,
579
+ MainDrawerRootProps,
580
+ SidebarState,
581
+ DrawerState,
582
+ };
@@ -2,13 +2,13 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
6
  import React from 'react';
8
7
 
9
- import { ContextMenu } from './ContextMenu';
10
8
  import { withTheme } from '../../testing';
11
9
 
10
+ import { ContextMenu } from './ContextMenu';
11
+
12
12
  const DefaultStory = () => {
13
13
  // NOTE(thure): Since long-tap will select text in some OSs, apply `select-none` to `ContextMenu.Trigger` where possible.
14
14
  return (
@@ -91,15 +91,18 @@ const DefaultStory = () => {
91
91
  );
92
92
  };
93
93
 
94
- export default {
94
+ const meta = {
95
95
  title: 'ui/react-ui-core/ContextMenu',
96
- component: ContextMenu,
96
+ component: ContextMenu.Root as any,
97
97
  render: DefaultStory,
98
98
  decorators: [withTheme],
99
- parameters: { chromatic: { disableSnapshot: false } },
100
- };
99
+ } satisfies Meta<typeof DefaultStory>;
100
+
101
+ export default meta;
102
+
103
+ type Story = StoryObj<typeof meta>;
101
104
 
102
- export const Default = {
105
+ export const Default: Story = {
103
106
  args: {},
104
107
  parameters: {
105
108
  chromatic: { delay: 1600 },
@@ -34,6 +34,7 @@ const ContextMenuContent = forwardRef<HTMLDivElement, ContextMenuContentProps>(
34
34
  return (
35
35
  <ContextMenuPrimitive.Content
36
36
  {...props}
37
+ data-arrow-keys='up down'
37
38
  collisionPadding={safeCollisionPadding}
38
39
  className={tx('menu.content', 'menu', { elevation }, classNames)}
39
40
  ref={forwardedRef}
@@ -2,13 +2,13 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
6
  import React, { useRef, useState } from 'react';
8
7
 
9
- import { DropdownMenu } from './DropdownMenu';
10
8
  import { withTheme } from '../../testing';
11
- import { Button } from '../Buttons';
9
+ import { Button } from '../Button';
10
+
11
+ import { DropdownMenu } from './DropdownMenu';
12
12
 
13
13
  const DefaultStory = () => {
14
14
  return (
@@ -91,15 +91,18 @@ const DefaultStory = () => {
91
91
  );
92
92
  };
93
93
 
94
- export default {
94
+ const meta = {
95
95
  title: 'ui/react-ui-core/DropdownMenu',
96
- component: DropdownMenu,
96
+ component: DropdownMenu.Root,
97
97
  render: DefaultStory,
98
98
  decorators: [withTheme],
99
- parameters: { chromatic: { disableSnapshot: false } },
100
- };
99
+ } satisfies Meta<typeof DefaultStory>;
100
+
101
+ export default meta;
102
+
103
+ type Story = StoryObj<typeof meta>;
101
104
 
102
- export const Default = {
105
+ export const Default: Story = {
103
106
  args: {},
104
107
  parameters: {
105
108
  chromatic: { delay: 1600 },