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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. package/dist/lib/browser/chunk-6DTBPJE4.mjs +774 -0
  2. package/dist/lib/browser/chunk-6DTBPJE4.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +3202 -59
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +66 -49
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/chunk-JKHQSGNU.mjs +776 -0
  9. package/dist/lib/node-esm/chunk-JKHQSGNU.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +3202 -59
  11. package/dist/lib/node-esm/index.mjs.map +4 -4
  12. package/dist/lib/node-esm/meta.json +1 -1
  13. package/dist/lib/node-esm/testing/index.mjs +66 -49
  14. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  15. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +7 -0
  16. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +1 -1
  17. package/dist/types/src/components/Avatars/Avatar.d.ts +1 -1
  18. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  19. package/dist/types/src/components/Avatars/Avatar.stories.d.ts +5 -31
  20. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  21. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts +5 -11
  22. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  23. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts +1 -1
  24. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  25. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts +8 -20
  26. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  27. package/dist/types/src/components/{Buttons → Button}/Button.d.ts +2 -2
  28. package/dist/types/src/components/Button/Button.d.ts.map +1 -0
  29. package/dist/types/src/components/Button/Button.stories.d.ts +17 -0
  30. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -0
  31. package/dist/types/src/components/{Buttons → Button}/IconButton.d.ts +4 -4
  32. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -0
  33. package/dist/types/src/components/Button/IconButton.stories.d.ts +13 -0
  34. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -0
  35. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -0
  36. package/dist/types/src/components/Button/Toggle.stories.d.ts +16 -0
  37. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -0
  38. package/dist/types/src/components/Button/ToggleGroup.d.ts +27 -0
  39. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -0
  40. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +27 -0
  41. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -0
  42. package/dist/types/src/components/Button/index.d.ts.map +1 -0
  43. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  44. package/dist/types/src/components/Clipboard/CopyButton.d.ts +1 -1
  45. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  46. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  47. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  48. package/dist/types/src/components/{Dialogs → Dialog}/AlertDialog.d.ts +1 -1
  49. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -0
  50. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts +11 -0
  51. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -0
  52. package/dist/types/src/components/Dialog/Dialog.d.ts +46 -0
  53. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -0
  54. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +27 -0
  55. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -0
  56. package/dist/types/src/components/Dialog/index.d.ts.map +1 -0
  57. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  58. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  59. package/dist/types/src/components/Icon/Icon.d.ts +2 -2
  60. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  61. package/dist/types/src/components/Icon/Icon.stories.d.ts +17 -0
  62. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -0
  63. package/dist/types/src/components/Input/Input.d.ts +6 -5
  64. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  65. package/dist/types/src/components/Input/Input.stories.d.ts +12 -13
  66. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  67. package/dist/types/src/components/Link/Link.stories.d.ts +8 -8
  68. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  69. package/dist/types/src/components/{Lists → List}/List.d.ts +3 -3
  70. package/dist/types/src/components/List/List.d.ts.map +1 -0
  71. package/dist/types/src/components/List/List.stories.d.ts +14 -0
  72. package/dist/types/src/components/List/List.stories.d.ts.map +1 -0
  73. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -0
  74. package/dist/types/src/components/{Lists → List}/Tree.d.ts +1 -1
  75. package/dist/types/src/components/List/Tree.d.ts.map +1 -0
  76. package/dist/types/src/components/List/Tree.stories.d.ts +15 -0
  77. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -0
  78. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -0
  79. package/dist/types/src/components/{Lists → List}/Treegrid.d.ts +1 -1
  80. package/dist/types/src/components/{Lists → List}/Treegrid.d.ts.map +1 -1
  81. package/dist/types/src/components/List/Treegrid.stories.d.ts +12 -0
  82. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -0
  83. package/dist/types/src/components/List/index.d.ts.map +1 -0
  84. package/dist/types/src/components/Main/Main.d.ts +17 -27
  85. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  86. package/dist/types/src/components/Main/Main.stories.d.ts +6 -7
  87. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  88. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  89. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  90. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts +12 -0
  91. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  92. package/dist/types/src/components/{Menus → Menu}/DropdownMenu.d.ts +8 -8
  93. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  94. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +15 -0
  95. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  96. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  97. package/dist/types/src/components/Message/Message.d.ts +1 -1
  98. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  99. package/dist/types/src/components/Message/Message.stories.d.ts +8 -17
  100. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  101. package/dist/types/src/components/Popover/Popover.d.ts +3 -3
  102. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  103. package/dist/types/src/components/Popover/Popover.stories.d.ts +6 -34
  104. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  105. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +25 -26
  106. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  107. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +37 -25
  108. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  109. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +39 -0
  110. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -0
  111. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +19 -0
  112. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -0
  113. package/dist/types/src/components/ScrollContainer/index.d.ts +2 -0
  114. package/dist/types/src/components/ScrollContainer/index.d.ts.map +1 -0
  115. package/dist/types/src/components/Select/Select.d.ts +10 -10
  116. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  117. package/dist/types/src/components/Select/Select.stories.d.ts +4 -9
  118. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  119. package/dist/types/src/components/Separator/Separator.d.ts +1 -1
  120. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  121. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  122. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  123. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  124. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  125. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  126. package/dist/types/src/components/Splitter/Splitter.d.ts +26 -0
  127. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  128. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  129. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  130. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  131. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  132. package/dist/types/src/components/Status/Status.stories.d.ts +2 -8
  133. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  134. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  135. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  136. package/dist/types/src/components/Tag/Tag.stories.d.ts +12 -12
  137. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  138. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +3 -3
  139. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  140. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
  141. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  142. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  143. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  144. package/dist/types/src/components/Toast/Toast.d.ts +5 -5
  145. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  146. package/dist/types/src/components/Toast/Toast.stories.d.ts +6 -44
  147. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  148. package/dist/types/src/components/Toolbar/Toolbar.d.ts +20 -19
  149. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  150. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +6 -50
  151. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  152. package/dist/types/src/components/Tooltip/Tooltip.d.ts +2 -4
  153. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  154. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +8 -61
  155. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  156. package/dist/types/src/components/index.d.ts +7 -4
  157. package/dist/types/src/components/index.d.ts.map +1 -1
  158. package/dist/types/src/exemplars/generics.stories.d.ts +17 -0
  159. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  160. package/dist/types/src/exemplars/slot.stories.d.ts +14 -0
  161. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  162. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  163. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  164. package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
  165. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  166. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  167. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  168. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  169. package/dist/types/src/hooks/useVisualViewport.d.ts +2 -2
  170. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  171. package/dist/types/src/index.d.ts +2 -1
  172. package/dist/types/src/index.d.ts.map +1 -1
  173. package/dist/types/src/playground/Controls.stories.d.ts +5 -9
  174. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  175. package/dist/types/src/playground/Custom.stories.d.ts +12 -4
  176. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  177. package/dist/types/src/playground/Typography.stories.d.ts +5 -11
  178. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  179. package/dist/types/src/primitives/Container/Container.d.ts +23 -0
  180. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  181. package/dist/types/src/primitives/Container/Container.stories.d.ts +11 -0
  182. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  183. package/dist/types/src/primitives/Container/Layout.d.ts +18 -0
  184. package/dist/types/src/primitives/Container/Layout.d.ts.map +1 -0
  185. package/dist/types/src/primitives/Container/Layout.stories.d.ts +10 -0
  186. package/dist/types/src/primitives/Container/Layout.stories.d.ts.map +1 -0
  187. package/dist/types/src/primitives/Container/index.d.ts +3 -0
  188. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  189. package/dist/types/src/primitives/Flex/Flex.d.ts +8 -0
  190. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  191. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  192. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  193. package/dist/types/src/primitives/index.d.ts +3 -0
  194. package/dist/types/src/primitives/index.d.ts.map +1 -0
  195. package/dist/types/src/testing/decorators/index.d.ts +2 -1
  196. package/dist/types/src/testing/decorators/index.d.ts.map +1 -1
  197. package/dist/types/src/testing/decorators/withLayout.d.ts +15 -0
  198. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -0
  199. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +12 -0
  200. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -0
  201. package/dist/types/src/testing/decorators/withTheme.d.ts +5 -1
  202. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  203. package/dist/types/src/util/index.d.ts +2 -1
  204. package/dist/types/src/util/index.d.ts.map +1 -1
  205. package/dist/types/src/util/usePx.d.ts +8 -0
  206. package/dist/types/src/util/usePx.d.ts.map +1 -0
  207. package/dist/types/tsconfig.tsbuildinfo +1 -1
  208. package/package.json +39 -31
  209. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +10 -12
  210. package/src/components/Avatars/Avatar.stories.tsx +23 -14
  211. package/src/components/Avatars/Avatar.tsx +6 -13
  212. package/src/components/Avatars/AvatarGroup.stories.tsx +12 -8
  213. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +19 -14
  214. package/src/components/Breadcrumb/Breadcrumb.tsx +6 -32
  215. package/src/components/{Buttons → Button}/Button.stories.tsx +9 -10
  216. package/src/components/{Buttons → Button}/Button.tsx +2 -8
  217. package/src/components/{Buttons → Button}/IconButton.stories.tsx +13 -10
  218. package/src/components/{Buttons → Button}/IconButton.tsx +23 -16
  219. package/src/components/Button/Toggle.stories.tsx +37 -0
  220. package/src/components/{Buttons → Button}/ToggleGroup.stories.tsx +12 -9
  221. package/src/components/{Buttons → Button}/ToggleGroup.tsx +17 -4
  222. package/src/components/Clipboard/ClipboardProvider.tsx +1 -1
  223. package/src/components/Clipboard/CopyButton.tsx +6 -5
  224. package/src/components/DensityProvider/DensityProvider.tsx +2 -2
  225. package/src/components/{Dialogs → Dialog}/AlertDialog.stories.tsx +17 -14
  226. package/src/components/{Dialogs → Dialog}/AlertDialog.tsx +16 -21
  227. package/src/components/Dialog/Dialog.stories.tsx +101 -0
  228. package/src/components/{Dialogs → Dialog}/Dialog.tsx +182 -57
  229. package/src/components/ElevationProvider/ElevationProvider.tsx +2 -2
  230. package/src/components/Icon/Icon.stories.tsx +113 -0
  231. package/src/components/Icon/Icon.tsx +3 -3
  232. package/src/components/Input/Input.stories.tsx +22 -23
  233. package/src/components/Input/Input.tsx +38 -44
  234. package/src/components/Link/Link.stories.tsx +12 -8
  235. package/src/components/Link/Link.tsx +1 -1
  236. package/src/components/{Lists → List}/List.stories.tsx +34 -28
  237. package/src/components/{Lists → List}/List.tsx +23 -25
  238. package/src/components/{Lists → List}/ListDropIndicator.tsx +1 -1
  239. package/src/components/{Lists → List}/Tree.stories.tsx +13 -10
  240. package/src/components/{Lists → List}/Tree.tsx +4 -3
  241. package/src/components/{Lists → List}/TreeDropIndicator.tsx +1 -1
  242. package/src/components/{Lists → List}/Treegrid.stories.tsx +14 -8
  243. package/src/components/{Lists → List}/Treegrid.tsx +61 -25
  244. package/src/components/Main/Main.stories.tsx +56 -27
  245. package/src/components/Main/Main.tsx +166 -94
  246. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +13 -10
  247. package/src/components/{Menus → Menu}/ContextMenu.tsx +8 -31
  248. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +14 -11
  249. package/src/components/{Menus → Menu}/DropdownMenu.tsx +109 -78
  250. package/src/components/Message/Message.stories.tsx +14 -10
  251. package/src/components/Message/Message.tsx +34 -23
  252. package/src/components/Popover/Popover.stories.tsx +14 -11
  253. package/src/components/Popover/Popover.tsx +67 -48
  254. package/src/components/ScrollArea/ScrollArea.stories.tsx +163 -34
  255. package/src/components/ScrollArea/ScrollArea.tsx +80 -82
  256. package/src/components/ScrollArea/index.ts +1 -1
  257. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +70 -0
  258. package/src/components/ScrollContainer/ScrollContainer.tsx +238 -0
  259. package/src/components/ScrollContainer/index.ts +5 -0
  260. package/src/components/Select/Select.stories.tsx +15 -12
  261. package/src/components/Select/Select.tsx +18 -33
  262. package/src/components/Separator/Separator.tsx +1 -1
  263. package/src/components/Skeleton/Skeleton.stories.tsx +52 -0
  264. package/src/components/Skeleton/Skeleton.tsx +26 -0
  265. package/src/components/Skeleton/index.ts +5 -0
  266. package/src/components/Splitter/Splitter.stories.tsx +73 -0
  267. package/src/components/Splitter/Splitter.tsx +123 -0
  268. package/src/components/Splitter/index.ts +5 -0
  269. package/src/components/Status/Status.stories.tsx +11 -8
  270. package/src/components/Status/Status.tsx +2 -2
  271. package/src/components/Tag/Tag.stories.tsx +21 -12
  272. package/src/components/Tag/Tag.tsx +2 -7
  273. package/src/components/ThemeProvider/ThemeProvider.tsx +5 -5
  274. package/src/components/ThemeProvider/TranslationsProvider.tsx +3 -18
  275. package/src/components/ThemeProvider/index.ts +3 -3
  276. package/src/components/Toast/Toast.stories.tsx +14 -11
  277. package/src/components/Toast/Toast.tsx +15 -19
  278. package/src/components/Toolbar/Toolbar.stories.tsx +16 -14
  279. package/src/components/Toolbar/Toolbar.tsx +41 -10
  280. package/src/components/Tooltip/Tooltip.stories.tsx +18 -14
  281. package/src/components/Tooltip/Tooltip.tsx +29 -26
  282. package/src/components/index.ts +7 -4
  283. package/src/exemplars/generics.stories.tsx +44 -0
  284. package/src/exemplars/slot.stories.tsx +108 -0
  285. package/src/exemplars/tabster.stories.tsx +127 -0
  286. package/src/hooks/useDensityContext.ts +1 -1
  287. package/src/hooks/useElevationContext.ts +1 -1
  288. package/src/hooks/useSafeArea.ts +3 -2
  289. package/src/hooks/useVisualViewport.ts +4 -4
  290. package/src/index.ts +2 -1
  291. package/src/playground/Controls.stories.tsx +12 -9
  292. package/src/playground/Custom.stories.tsx +15 -26
  293. package/src/playground/Typography.stories.tsx +10 -8
  294. package/src/primitives/Container/Container.stories.tsx +67 -0
  295. package/src/primitives/Container/Container.tsx +79 -0
  296. package/src/primitives/Container/Layout.stories.tsx +57 -0
  297. package/src/primitives/Container/Layout.tsx +61 -0
  298. package/src/primitives/Container/index.ts +6 -0
  299. package/src/primitives/Flex/Flex.tsx +26 -0
  300. package/src/primitives/Flex/index.ts +5 -0
  301. package/src/primitives/index.ts +6 -0
  302. package/src/testing/decorators/index.ts +2 -1
  303. package/src/testing/decorators/withLayout.tsx +63 -0
  304. package/src/testing/decorators/{withSurfaceVariantsLayout.tsx → withLayoutVariants.tsx} +5 -5
  305. package/src/testing/decorators/withTheme.tsx +34 -0
  306. package/src/util/index.ts +3 -1
  307. package/src/util/usePx.ts +61 -0
  308. package/dist/lib/browser/chunk-2COVUP44.mjs +0 -4373
  309. package/dist/lib/browser/chunk-2COVUP44.mjs.map +0 -7
  310. package/dist/lib/node-esm/chunk-GHXHND5V.mjs +0 -4375
  311. package/dist/lib/node-esm/chunk-GHXHND5V.mjs.map +0 -7
  312. package/dist/types/src/components/Buttons/Button.d.ts.map +0 -1
  313. package/dist/types/src/components/Buttons/Button.stories.d.ts +0 -12
  314. package/dist/types/src/components/Buttons/Button.stories.d.ts.map +0 -1
  315. package/dist/types/src/components/Buttons/IconButton.d.ts.map +0 -1
  316. package/dist/types/src/components/Buttons/IconButton.stories.d.ts +0 -22
  317. package/dist/types/src/components/Buttons/IconButton.stories.d.ts.map +0 -1
  318. package/dist/types/src/components/Buttons/Toggle.d.ts.map +0 -1
  319. package/dist/types/src/components/Buttons/Toggle.stories.d.ts +0 -19
  320. package/dist/types/src/components/Buttons/Toggle.stories.d.ts.map +0 -1
  321. package/dist/types/src/components/Buttons/ToggleGroup.d.ts +0 -28
  322. package/dist/types/src/components/Buttons/ToggleGroup.d.ts.map +0 -1
  323. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts +0 -39
  324. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts.map +0 -1
  325. package/dist/types/src/components/Buttons/index.d.ts.map +0 -1
  326. package/dist/types/src/components/Dialogs/AlertDialog.d.ts.map +0 -1
  327. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts +0 -43
  328. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts.map +0 -1
  329. package/dist/types/src/components/Dialogs/Dialog.d.ts +0 -31
  330. package/dist/types/src/components/Dialogs/Dialog.d.ts.map +0 -1
  331. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts +0 -48
  332. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts.map +0 -1
  333. package/dist/types/src/components/Dialogs/index.d.ts.map +0 -1
  334. package/dist/types/src/components/Lists/List.d.ts.map +0 -1
  335. package/dist/types/src/components/Lists/List.stories.d.ts +0 -37
  336. package/dist/types/src/components/Lists/List.stories.d.ts.map +0 -1
  337. package/dist/types/src/components/Lists/ListDropIndicator.d.ts.map +0 -1
  338. package/dist/types/src/components/Lists/Tree.d.ts.map +0 -1
  339. package/dist/types/src/components/Lists/Tree.stories.d.ts +0 -41
  340. package/dist/types/src/components/Lists/Tree.stories.d.ts.map +0 -1
  341. package/dist/types/src/components/Lists/TreeDropIndicator.d.ts.map +0 -1
  342. package/dist/types/src/components/Lists/Treegrid.stories.d.ts +0 -10
  343. package/dist/types/src/components/Lists/Treegrid.stories.d.ts.map +0 -1
  344. package/dist/types/src/components/Lists/index.d.ts.map +0 -1
  345. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  346. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts +0 -50
  347. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  348. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  349. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts +0 -50
  350. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  351. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  352. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts +0 -12
  353. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts.map +0 -1
  354. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  355. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  356. package/src/components/Buttons/Toggle.stories.tsx +0 -33
  357. package/src/components/Dialogs/Dialog.stories.tsx +0 -65
  358. package/src/testing/decorators/withTheme.ts +0 -25
  359. package/src/util/ThemedClassName.ts +0 -7
  360. /package/dist/types/src/components/{Buttons → Button}/Toggle.d.ts +0 -0
  361. /package/dist/types/src/components/{Buttons → Button}/index.d.ts +0 -0
  362. /package/dist/types/src/components/{Dialogs → Dialog}/index.d.ts +0 -0
  363. /package/dist/types/src/components/{Lists → List}/ListDropIndicator.d.ts +0 -0
  364. /package/dist/types/src/components/{Lists → List}/TreeDropIndicator.d.ts +0 -0
  365. /package/dist/types/src/components/{Lists → List}/index.d.ts +0 -0
  366. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  367. /package/src/components/{Buttons → Button}/Toggle.tsx +0 -0
  368. /package/src/components/{Buttons → Button}/index.ts +0 -0
  369. /package/src/components/{Dialogs → Dialog}/index.ts +0 -0
  370. /package/src/components/{Lists → List}/index.ts +0 -0
  371. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -2,12 +2,18 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { useArrowNavigationGroup, useFocusableGroup } from '@fluentui/react-tabster';
6
- import { createContextScope, type Scope } from '@radix-ui/react-context';
5
+ import { useFocusFinders } from '@fluentui/react-tabster';
6
+ import { type Scope, createContextScope } from '@radix-ui/react-context';
7
7
  import { Primitive } from '@radix-ui/react-primitive';
8
8
  import { Slot } from '@radix-ui/react-slot';
9
9
  import { useControllableState } from '@radix-ui/react-use-controllable-state';
10
- import React, { type ComponentPropsWithRef, type CSSProperties, forwardRef } from 'react';
10
+ import React, {
11
+ type CSSProperties,
12
+ type ComponentPropsWithRef,
13
+ type KeyboardEvent,
14
+ forwardRef,
15
+ useCallback,
16
+ } from 'react';
11
17
 
12
18
  import { useThemeContext } from '../../hooks';
13
19
  import { type ThemedClassName } from '../../util';
@@ -40,15 +46,61 @@ const TreegridRoot = forwardRef<HTMLDivElement, TreegridRootProps>(
40
46
  ({ asChild, classNames, children, style, gridTemplateColumns, ...props }, forwardedRef) => {
41
47
  const { tx } = useThemeContext();
42
48
  const Root = asChild ? Slot : Primitive.div;
43
- const arrowNavigationAttrs = useArrowNavigationGroup({ axis: 'vertical', tabbable: false, circular: true });
49
+ const { findFirstFocusable } = useFocusFinders();
50
+
51
+ const handleKeyDown = useCallback(
52
+ (event: KeyboardEvent<HTMLDivElement>) => {
53
+ switch (event.key) {
54
+ case 'ArrowDown':
55
+ case 'ArrowUp': {
56
+ const direction = event.key === 'ArrowDown' ? 'down' : 'up';
57
+ const target = event.target as HTMLElement;
58
+
59
+ // Find ancestor with data-arrow-keys containing the relevant direction.
60
+ const ancestorWithArrowKeys = target.closest(`[data-arrow-keys*="${direction}"], [data-arrow-keys="all"]`);
61
+
62
+ // If no ancestor with data-arrow-keys found, proceed with row navigation.
63
+ if (!ancestorWithArrowKeys) {
64
+ // Find the closest row
65
+ const currentRow = target.closest('[role="row"]');
66
+ if (currentRow) {
67
+ // Find the treegrid container.
68
+ const treegrid = currentRow.closest('[role="treegrid"]');
69
+ if (treegrid) {
70
+ // Get all rows in the treegrid.
71
+ const rows = Array.from(treegrid.querySelectorAll('[role="row"]'));
72
+ const currentIndex = rows.indexOf(currentRow as Element);
73
+
74
+ // Find next or previous row.
75
+ const nextIndex = direction === 'down' ? currentIndex + 1 : currentIndex - 1;
76
+ const targetRow = rows[nextIndex];
77
+
78
+ if (targetRow) {
79
+ // Focus the first focusable element in the target row.
80
+ const firstFocusable = findFirstFocusable(targetRow as HTMLElement);
81
+ if (firstFocusable) {
82
+ event.preventDefault();
83
+ firstFocusable.focus();
84
+ }
85
+ }
86
+ }
87
+ }
88
+ }
89
+ break;
90
+ }
91
+ }
92
+ props.onKeyDown?.(event);
93
+ },
94
+ [findFirstFocusable],
95
+ );
44
96
 
45
97
  return (
46
98
  <Root
47
99
  role='treegrid'
48
- {...arrowNavigationAttrs}
49
100
  {...props}
50
- className={tx('treegrid.root', 'treegrid', {}, classNames)}
101
+ className={tx('treegrid.root', {}, classNames)}
51
102
  style={{ ...style, gridTemplateColumns }}
103
+ onKeyDown={handleKeyDown}
52
104
  ref={forwardedRef}
53
105
  >
54
106
  {children}
@@ -91,30 +143,19 @@ const TreegridRow = forwardRef<HTMLDivElement, TreegridRowScopedProps<TreegridRo
91
143
  onChange: propsOnOpenChange,
92
144
  defaultProp: defaultOpen,
93
145
  });
94
- const focusableGroupAttrs = useFocusableGroup({ tabBehavior: 'limited' });
95
- const arrowGroupAttrs = useArrowNavigationGroup({
96
- axis: 'horizontal',
97
- tabbable: false,
98
- circular: false,
99
- memorizeCurrent: false,
100
- });
101
146
 
102
147
  return (
103
148
  <TreegridRowProvider open={open} onOpenChange={onOpenChange} scope={__treegridRowScope}>
104
149
  <Root
105
150
  role='row'
106
151
  aria-level={level}
107
- className={tx('treegrid.row', 'treegrid__row', { level }, classNames)}
152
+ className={tx('treegrid.row', { level }, classNames)}
108
153
  {...(parentOf && { 'aria-expanded': open, 'aria-owns': parentOf })}
109
- tabIndex={0}
110
- {...focusableGroupAttrs}
111
154
  {...props}
112
155
  id={id}
113
156
  ref={forwardedRef}
114
157
  >
115
- <div role='none' className='contents' {...arrowGroupAttrs}>
116
- {children}
117
- </div>
158
+ {children}
118
159
  </Root>
119
160
  </TreegridRowProvider>
120
161
  );
@@ -127,12 +168,7 @@ const TreegridCell = forwardRef<HTMLDivElement, TreegridCellProps>(
127
168
  ({ classNames, children, indent, ...props }, forwardedRef) => {
128
169
  const { tx } = useThemeContext();
129
170
  return (
130
- <div
131
- role='gridcell'
132
- className={tx('treegrid.cell', 'treegrid__cell', { indent }, classNames)}
133
- {...props}
134
- ref={forwardedRef}
135
- >
171
+ <div role='gridcell' className={tx('treegrid.cell', { indent }, classNames)} {...props} ref={forwardedRef}>
136
172
  {children}
137
173
  </div>
138
174
  );
@@ -2,58 +2,87 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
6
  import React from 'react';
8
7
 
8
+ import { withLayout, withTheme } from '../../testing';
9
+ import { IconButton } from '../Button';
10
+ import { Toolbar } from '../Toolbar';
11
+
9
12
  import { Main, useSidebars } from './Main';
10
- import { withTheme } from '../../testing';
11
- import { Button } from '../Buttons';
12
13
 
13
14
  type StoryMainArgs = {};
14
15
 
15
- const NavigationSidebarToggle = () => {
16
+ const NavigationSidebarToggle = ({ close }: { close?: boolean }) => {
16
17
  const { toggleNavigationSidebar } = useSidebars('StoryMain__SidebarToggle');
17
- return <Button onClick={toggleNavigationSidebar}>Toggle navigation sidebar</Button>;
18
+ return (
19
+ <IconButton
20
+ icon={close ? 'ph--caret-left--regular' : 'ph--caret-right--regular'}
21
+ iconOnly
22
+ label='Toggle navigation sidebar'
23
+ onClick={toggleNavigationSidebar}
24
+ />
25
+ );
18
26
  };
19
27
 
20
- const ComplementarySidebarToggle = () => {
28
+ const ComplementarySidebarToggle = ({ close }: { close?: boolean }) => {
21
29
  const { toggleComplementarySidebar } = useSidebars('StoryMain__SidebarToggle');
22
- return <Button onClick={toggleComplementarySidebar}>Toggle complementary sidebar</Button>;
30
+ return (
31
+ <IconButton
32
+ icon={close ? 'ph--caret-right--regular' : 'ph--caret-left--regular'}
33
+ iconOnly
34
+ label='Toggle complementary sidebar'
35
+ onClick={toggleComplementarySidebar}
36
+ />
37
+ );
23
38
  };
24
39
 
25
40
  const DefaultStory = (_args: StoryMainArgs) => {
26
41
  return (
27
- <Main.Root>
42
+ <Main.Root defaultComplementarySidebarState='closed' defaultNavigationSidebarState='closed'>
28
43
  <Main.Overlay />
29
- <Main.NavigationSidebar label='Navigation' classNames='p-4'>
30
- <p>Navigation sidebar content, hi!</p>
31
- <NavigationSidebarToggle />
44
+ <Main.NavigationSidebar label='Navigation'>
45
+ <Toolbar.Root>
46
+ <h1>Navigation</h1>
47
+ <Toolbar.Separator variant='gap' classNames='grow' />
48
+ <NavigationSidebarToggle close />
49
+ </Toolbar.Root>
32
50
  </Main.NavigationSidebar>
33
- <Main.Content>
34
- <div role='group' className='m-2 p-4 bg-neutral-50 dark:bg-neutral-950 rounded space-y-2'>
35
- <ComplementarySidebarToggle />
36
- <p>Main content, hello!</p>
51
+ <Main.Content classNames='is-full'>
52
+ <Toolbar.Root>
37
53
  <NavigationSidebarToggle />
38
- </div>
54
+ <div className='flex items-center grow justify-center'>Main</div>
55
+ <ComplementarySidebarToggle />
56
+ </Toolbar.Root>
39
57
  </Main.Content>
40
- <Main.ComplementarySidebar label='Complementary content' classNames='p-4'>
41
- <p>Complementary sidebar content, hello!</p>
42
- <ComplementarySidebarToggle />
58
+ <Main.ComplementarySidebar label='Complementary'>
59
+ <Toolbar.Root>
60
+ <ComplementarySidebarToggle close />
61
+ <Toolbar.Separator variant='gap' classNames='grow' />
62
+ <h1>Complementary</h1>
63
+ </Toolbar.Root>
43
64
  </Main.ComplementarySidebar>
44
65
  </Main.Root>
45
66
  );
46
67
  };
47
68
 
48
- export default {
49
- title: 'ui/react-ui-core/Main',
69
+ const meta = {
70
+ title: 'ui/react-ui-core/components/Main',
50
71
  component: Main.Root,
51
72
  render: DefaultStory,
52
- decorators: [withTheme],
53
- parameters: { chromatic: { disableSnapshot: false } },
54
- };
73
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
74
+ parameters: {
75
+ layout: 'fullscreen',
76
+ chromatic: {
77
+ disableSnapshot: false,
78
+ },
79
+ },
80
+ } satisfies Meta<typeof DefaultStory>;
81
+
82
+ export default meta;
83
+
84
+ type Story = StoryObj<typeof meta>;
55
85
 
56
- export const Default = {
86
+ export const Default: Story = {
57
87
  args: {},
58
- layout: 'fullscreen',
59
88
  };
@@ -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 { useForwardedRef, useMediaQuery } 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';
38
+ const MAIN_OVERLAY_NAME = 'MainOverlay';
33
39
  const NAVIGATION_SIDEBAR_NAME = 'NavigationSidebar';
34
40
  const COMPLEMENTARY_SIDEBAR_NAME = 'ComplementarySidebar';
35
- const MAIN_NAME = 'Main';
36
- const GENERIC_CONSUMER_NAME = 'GenericConsumer';
37
-
38
- type SidebarState = 'expanded' | 'collapsed' | 'closed';
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,60 @@ 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
+ //
88
+ // Context
89
+ //
90
+
91
+ // TODO(burdon): Define collapsed state.
92
+ type SidebarState = 'expanded' | 'collapsed' | 'closed';
93
+
94
+ type MainContextValue = {
95
+ resizing: boolean;
96
+
97
+ // Navigation
98
+ navigationSidebarState: SidebarState;
99
+ setNavigationSidebarState: Dispatch<SetStateAction<SidebarState | undefined>>;
100
+
101
+ // Complementary
102
+ complementarySidebarState: SidebarState;
103
+ setComplementarySidebarState: Dispatch<SetStateAction<SidebarState | undefined>>;
75
104
  };
76
105
 
77
106
  const [MainProvider, useMainContext] = createContext<MainContextValue>(MAIN_NAME, {
78
107
  resizing: false,
108
+
79
109
  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`');
110
+ setNavigationSidebarState: (_nextState) => {
111
+ log.warn('Not initialized');
83
112
  },
113
+
84
114
  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`');
115
+ setComplementarySidebarState: (_nextState) => {
116
+ log.warn('Not initialized');
88
117
  },
89
118
  });
90
119
 
91
- const useSidebars = (consumerName = GENERIC_CONSUMER_NAME) => {
92
- const { setNavigationSidebarState, navigationSidebarState, setComplementarySidebarState, complementarySidebarState } =
93
- useMainContext(consumerName);
120
+ const useSidebars = (consumerName: string) => {
121
+ const {
122
+ navigationSidebarState,
123
+ setNavigationSidebarState,
124
+
125
+ complementarySidebarState,
126
+ setComplementarySidebarState,
127
+ } = useMainContext(consumerName);
94
128
 
95
129
  return {
96
130
  navigationSidebarState,
@@ -102,6 +136,7 @@ const useSidebars = (consumerName = GENERIC_CONSUMER_NAME) => {
102
136
  openNavigationSidebar: useCallback(() => setNavigationSidebarState('expanded'), []),
103
137
  collapseNavigationSidebar: useCallback(() => setNavigationSidebarState('collapsed'), []),
104
138
  closeNavigationSidebar: useCallback(() => setNavigationSidebarState('closed'), []),
139
+
105
140
  complementarySidebarState,
106
141
  setComplementarySidebarState,
107
142
  toggleComplementarySidebar: useCallback(
@@ -114,28 +149,33 @@ const useSidebars = (consumerName = GENERIC_CONSUMER_NAME) => {
114
149
  };
115
150
  };
116
151
 
152
+ //
153
+ // Root
154
+ //
155
+
117
156
  type MainRootProps = PropsWithChildren<{
118
157
  navigationSidebarState?: SidebarState;
119
158
  defaultNavigationSidebarState?: SidebarState;
120
159
  onNavigationSidebarStateChange?: (nextState: SidebarState) => void;
160
+
121
161
  complementarySidebarState?: SidebarState;
122
162
  defaultComplementarySidebarState?: SidebarState;
123
163
  onComplementarySidebarStateChange?: (nextState: SidebarState) => void;
124
164
  }>;
125
165
 
126
- const resizeDebounce = 3000;
127
-
128
166
  const MainRoot = ({
129
167
  navigationSidebarState: propsNavigationSidebarState,
130
- defaultNavigationSidebarState,
168
+ defaultNavigationSidebarState = 'closed',
131
169
  onNavigationSidebarStateChange,
170
+
132
171
  complementarySidebarState: propsComplementarySidebarState,
133
- defaultComplementarySidebarState,
172
+ defaultComplementarySidebarState = 'closed',
134
173
  onComplementarySidebarStateChange,
174
+
135
175
  children,
136
176
  ...props
137
177
  }: MainRootProps) => {
138
- const [isLg] = useMediaQuery('lg', { ssr: false });
178
+ const [isLg] = useMediaQuery('lg');
139
179
  const [navigationSidebarState = isLg ? 'expanded' : 'collapsed', setNavigationSidebarState] =
140
180
  useControllableState<SidebarState>({
141
181
  prop: propsNavigationSidebarState,
@@ -151,22 +191,21 @@ const MainRoot = ({
151
191
 
152
192
  const [resizing, setResizing] = useState(false);
153
193
  const resizeInterval = useRef<ReturnType<typeof setTimeout> | null>(null);
194
+ useEffect(
195
+ () =>
196
+ addEventListener(window, 'resize', () => {
197
+ setResizing(true);
198
+ if (resizeInterval.current) {
199
+ clearTimeout(resizeInterval.current);
200
+ }
154
201
 
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]);
202
+ resizeInterval.current = setTimeout(() => {
203
+ setResizing(false);
204
+ resizeInterval.current = null;
205
+ }, 3_000);
206
+ }),
207
+ [],
208
+ );
170
209
 
171
210
  return (
172
211
  <MainProvider
@@ -186,9 +225,45 @@ const MainRoot = ({
186
225
 
187
226
  MainRoot.displayName = MAIN_ROOT_NAME;
188
227
 
189
- const handleOpenAutoFocus = (event: Event) => {
190
- !document.body.hasAttribute('data-is-keyboard') && event.preventDefault();
191
- };
228
+ //
229
+ // Overlay
230
+ //
231
+
232
+ type MainOverlayProps = ThemedClassName<Omit<ComponentPropsWithRef<typeof Primitive.div>, 'children' | 'onClick'>>;
233
+
234
+ const MainOverlay = forwardRef<HTMLDivElement, MainOverlayProps>(({ classNames, ...props }, forwardedRef) => {
235
+ const [isLg] = useMediaQuery('lg');
236
+ const { navigationSidebarState, setNavigationSidebarState, complementarySidebarState, setComplementarySidebarState } =
237
+ useMainContext(MAIN_OVERLAY_NAME);
238
+ const { tx } = useThemeContext();
239
+ return (
240
+ <div
241
+ {...props}
242
+ onClick={() => {
243
+ setNavigationSidebarState('collapsed');
244
+ setComplementarySidebarState('collapsed');
245
+ }}
246
+ className={tx(
247
+ 'main.overlay',
248
+ {
249
+ isLg,
250
+ inlineStartSidebarOpen: navigationSidebarState,
251
+ inlineEndSidebarOpen: complementarySidebarState,
252
+ },
253
+ classNames,
254
+ )}
255
+ data-state={navigationSidebarState === 'expanded' || complementarySidebarState === 'expanded' ? 'open' : 'closed'}
256
+ aria-hidden='true'
257
+ ref={forwardedRef}
258
+ />
259
+ );
260
+ });
261
+
262
+ MainOverlay.displayName = MAIN_OVERLAY_NAME;
263
+
264
+ //
265
+ // Sidebar
266
+ //
192
267
 
193
268
  type MainSidebarProps = ThemedClassName<ComponentPropsWithRef<typeof DialogContent>> & {
194
269
  swipeToDismiss?: boolean;
@@ -204,23 +279,31 @@ const MainSidebar = forwardRef<HTMLDivElement, MainSidebarProps>(
204
279
  { classNames, children, swipeToDismiss, onOpenAutoFocus, state, resizing, onStateChange, side, label, ...props },
205
280
  forwardedRef,
206
281
  ) => {
207
- const [isLg] = useMediaQuery('lg', { ssr: false });
282
+ const [isLg] = useMediaQuery('lg');
208
283
  const { tx } = useThemeContext();
209
284
  const { t } = useTranslation();
210
285
  const ref = useForwardedRef(forwardedRef);
211
286
  const noopRef = useRef(null);
287
+
212
288
  useSwipeToDismiss(swipeToDismiss ? ref : noopRef, {
213
289
  onDismiss: () => onStateChange?.('closed'),
214
290
  });
291
+
292
+ // NOTE(thure): This is a workaround for something further down the tree grabbing focus on Escape. Adding this
293
+ // intervention to `Tabs.Root` or `Tabs.Tabpenel` instances is somehow ineffectual.
215
294
  const handleKeyDown = useCallback(
216
295
  (event: KeyboardEvent<HTMLDivElement>) => {
217
- if (event.key === 'Escape') {
218
- ((event.target as HTMLDivElement).closest('[data-tabster]') as HTMLDivElement)?.focus();
296
+ const focusGroupParent = (event.target as HTMLElement).closest('[data-tabster]');
297
+ if (event.key === 'Escape' && focusGroupParent) {
298
+ event.preventDefault();
299
+ event.stopPropagation();
300
+ (focusGroupParent as HTMLElement).focus();
219
301
  }
220
302
  props.onKeyDown?.(event);
221
303
  },
222
304
  [props.onKeyDown],
223
305
  );
306
+
224
307
  const Root = isLg ? Primitive.div : DialogContent;
225
308
 
226
309
  return (
@@ -228,13 +311,13 @@ const MainSidebar = forwardRef<HTMLDivElement, MainSidebarProps>(
228
311
  {!isLg && <DialogTitle className='sr-only'>{toLocalizedString(label, t)}</DialogTitle>}
229
312
  <Root
230
313
  {...(!isLg && { forceMount: true, tabIndex: -1, onOpenAutoFocus: onOpenAutoFocus ?? handleOpenAutoFocus })}
314
+ {...(state === 'closed' && { inert: true })}
231
315
  {...props}
232
316
  data-side={side === 'inline-end' ? 'ie' : 'is'}
233
317
  data-state={state}
234
318
  data-resizing={resizing ? 'true' : 'false'}
235
- className={tx('main.sidebar', 'main__sidebar', {}, classNames)}
236
- onKeyDown={handleKeyDown}
237
- {...(state === 'closed' && { inert: 'true' })}
319
+ className={tx('main.sidebar', {}, classNames)}
320
+ onKeyDownCapture={handleKeyDown}
238
321
  ref={ref}
239
322
  >
240
323
  {children}
@@ -244,6 +327,10 @@ const MainSidebar = forwardRef<HTMLDivElement, MainSidebarProps>(
244
327
  },
245
328
  );
246
329
 
330
+ //
331
+ // Navigation Sidebar
332
+ //
333
+
247
334
  type MainNavigationSidebarProps = Omit<MainSidebarProps, 'expanded' | 'side'>;
248
335
 
249
336
  const MainNavigationSidebar = forwardRef<HTMLDivElement, MainNavigationSidebarProps>((props, forwardedRef) => {
@@ -265,6 +352,10 @@ const MainNavigationSidebar = forwardRef<HTMLDivElement, MainNavigationSidebarPr
265
352
 
266
353
  MainNavigationSidebar.displayName = NAVIGATION_SIDEBAR_NAME;
267
354
 
355
+ //
356
+ // Complementary Sidebar
357
+ //
358
+
268
359
  type MainComplementarySidebarProps = Omit<MainSidebarProps, 'expanded' | 'side'>;
269
360
 
270
361
  const MainComplementarySidebar = forwardRef<HTMLDivElement, MainComplementarySidebarProps>((props, forwardedRef) => {
@@ -285,20 +376,24 @@ const MainComplementarySidebar = forwardRef<HTMLDivElement, MainComplementarySid
285
376
  );
286
377
  });
287
378
 
288
- MainNavigationSidebar.displayName = NAVIGATION_SIDEBAR_NAME;
379
+ MainComplementarySidebar.displayName = COMPLEMENTARY_SIDEBAR_NAME;
289
380
 
290
- type MainProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.div>> & {
291
- asChild?: boolean;
292
- bounce?: boolean;
293
- handlesFocus?: boolean;
294
- };
381
+ //
382
+ // Content
383
+ //
295
384
 
296
- const MainContent = forwardRef<HTMLDivElement, MainProps>(
297
- ({ asChild, classNames, bounce, handlesFocus, children, role, ...props }: MainProps, forwardedRef) => {
385
+ type MainContentProps = ThemedClassName<
386
+ ComponentPropsWithRef<typeof Primitive.div> &
387
+ MainStyleProps & {
388
+ asChild?: boolean;
389
+ }
390
+ >;
391
+
392
+ const MainContent = forwardRef<HTMLDivElement, MainContentProps>(
393
+ ({ asChild, classNames, bounce, handlesFocus, children, role, ...props }: MainContentProps, forwardedRef) => {
298
394
  const { navigationSidebarState, complementarySidebarState } = useMainContext(MAIN_NAME);
299
395
  const { tx } = useThemeContext();
300
396
  const Root = asChild ? Slot : role ? 'div' : 'main';
301
-
302
397
  const mover = useLandmarkMover(props.onKeyDown, '1');
303
398
 
304
399
  return (
@@ -309,7 +404,7 @@ const MainContent = forwardRef<HTMLDivElement, MainProps>(
309
404
  data-sidebar-inline-start-state={navigationSidebarState}
310
405
  data-sidebar-inline-end-state={complementarySidebarState}
311
406
  data-handles-focus={handlesFocus}
312
- className={tx('main.content', 'main', { bounce, handlesFocus }, classNames)}
407
+ className={tx('main.content', { bounce, handlesFocus }, classNames)}
313
408
  ref={forwardedRef}
314
409
  >
315
410
  {children}
@@ -320,41 +415,18 @@ const MainContent = forwardRef<HTMLDivElement, MainProps>(
320
415
 
321
416
  MainContent.displayName = MAIN_NAME;
322
417
 
323
- type MainOverlayProps = ThemedClassName<Omit<ComponentPropsWithRef<typeof Primitive.div>, 'children'>>;
324
-
325
- const MainOverlay = forwardRef<HTMLDivElement, MainOverlayProps>(({ classNames, ...props }, forwardedRef) => {
326
- const [isLg] = useMediaQuery('lg', { ssr: false });
327
- const { navigationSidebarState, setNavigationSidebarState, complementarySidebarState, setComplementarySidebarState } =
328
- useMainContext(MAIN_NAME);
329
- const { tx } = useThemeContext();
330
- return (
331
- <div
332
- onClick={() => {
333
- setNavigationSidebarState('collapsed');
334
- setComplementarySidebarState('collapsed');
335
- }}
336
- {...props}
337
- className={tx(
338
- 'main.overlay',
339
- 'main__overlay',
340
- { isLg, inlineStartSidebarOpen: navigationSidebarState, inlineEndSidebarOpen: complementarySidebarState },
341
- classNames,
342
- )}
343
- data-state={navigationSidebarState === 'expanded' || complementarySidebarState === 'expanded' ? 'open' : 'closed'}
344
- aria-hidden='true'
345
- ref={forwardedRef}
346
- />
347
- );
348
- });
418
+ //
419
+ // Main
420
+ //
349
421
 
350
422
  export const Main = {
351
423
  Root: MainRoot,
352
- Content: MainContent,
353
424
  Overlay: MainOverlay,
425
+ Content: MainContent,
354
426
  NavigationSidebar: MainNavigationSidebar,
355
427
  ComplementarySidebar: MainComplementarySidebar,
356
428
  };
357
429
 
358
430
  export { useMainContext, useSidebars, useLandmarkMover };
359
431
 
360
- export type { MainRootProps, MainProps, MainOverlayProps, MainNavigationSidebarProps, SidebarState };
432
+ export type { MainRootProps, MainOverlayProps, MainContentProps, MainNavigationSidebarProps, SidebarState };