@dxos/react-ui 0.8.4-main.e8ec1fe → 0.8.4-main.ef1bc66f44

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 (231) hide show
  1. package/dist/lib/browser/chunk-EJYV4HAH.mjs +774 -0
  2. package/dist/lib/browser/chunk-EJYV4HAH.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +3197 -66
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +34 -45
  7. package/dist/lib/browser/testing/index.mjs.map +3 -3
  8. package/dist/lib/node-esm/chunk-YTLZCZ2M.mjs +776 -0
  9. package/dist/lib/node-esm/chunk-YTLZCZ2M.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +3197 -66
  11. package/dist/lib/node-esm/index.mjs.map +4 -4
  12. package/dist/lib/node-esm/meta.json +1 -1
  13. package/dist/lib/node-esm/testing/index.mjs +34 -45
  14. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  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/Button/Button.d.ts +1 -1
  18. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  19. package/dist/types/src/components/Button/IconButton.d.ts +2 -1
  20. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  21. package/dist/types/src/components/Button/ToggleGroup.d.ts +4 -4
  22. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +4 -4
  23. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  24. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  25. package/dist/types/src/components/Dialog/Dialog.d.ts +24 -9
  26. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  27. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +7 -5
  28. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  29. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  30. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  31. package/dist/types/src/components/Icon/Icon.d.ts +1 -1
  32. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  33. package/dist/types/src/components/Input/Input.d.ts +5 -2
  34. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  35. package/dist/types/src/components/Input/Input.stories.d.ts +2 -2
  36. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  37. package/dist/types/src/components/List/List.d.ts +1 -1
  38. package/dist/types/src/components/List/List.d.ts.map +1 -1
  39. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  40. package/dist/types/src/components/Main/Main.d.ts +8 -9
  41. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  42. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  43. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  44. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  45. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  46. package/dist/types/src/components/{Menus → Menu}/DropdownMenu.d.ts +3 -4
  47. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  48. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  49. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  50. package/dist/types/src/components/Message/Message.d.ts +1 -1
  51. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  52. package/dist/types/src/components/Message/Message.stories.d.ts +1 -1
  53. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  54. package/dist/types/src/components/Popover/Popover.d.ts +1 -1
  55. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  56. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +25 -26
  57. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  58. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +46 -8
  59. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  60. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +4 -2
  61. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  62. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +2 -1
  63. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  64. package/dist/types/src/components/Select/Select.d.ts +9 -9
  65. package/dist/types/src/components/Separator/Separator.d.ts +1 -1
  66. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  67. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  68. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  69. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  70. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  71. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  72. package/dist/types/src/components/Splitter/Splitter.d.ts +26 -0
  73. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  74. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  75. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  76. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  77. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  78. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  79. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  80. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +2 -2
  81. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  82. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
  83. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  84. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  85. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  86. package/dist/types/src/components/Toast/Toast.d.ts +4 -4
  87. package/dist/types/src/components/Toolbar/Toolbar.d.ts +13 -12
  88. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  89. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  90. package/dist/types/src/components/index.d.ts +3 -1
  91. package/dist/types/src/components/index.d.ts.map +1 -1
  92. package/dist/types/src/exemplars/generics.stories.d.ts +17 -0
  93. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  94. package/dist/types/src/exemplars/slot.stories.d.ts +14 -0
  95. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  96. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  97. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  98. package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
  99. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  100. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  101. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  102. package/dist/types/src/index.d.ts +2 -1
  103. package/dist/types/src/index.d.ts.map +1 -1
  104. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  105. package/dist/types/src/primitives/Container/Container.d.ts +23 -0
  106. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  107. package/dist/types/src/primitives/Container/Container.stories.d.ts +11 -0
  108. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  109. package/dist/types/src/primitives/Container/Layout.d.ts +18 -0
  110. package/dist/types/src/primitives/Container/Layout.d.ts.map +1 -0
  111. package/dist/types/src/primitives/Container/Layout.stories.d.ts +10 -0
  112. package/dist/types/src/primitives/Container/Layout.stories.d.ts.map +1 -0
  113. package/dist/types/src/primitives/Container/index.d.ts +3 -0
  114. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  115. package/dist/types/src/primitives/Flex/Flex.d.ts +8 -0
  116. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  117. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  118. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  119. package/dist/types/src/primitives/index.d.ts +3 -0
  120. package/dist/types/src/primitives/index.d.ts.map +1 -0
  121. package/dist/types/src/testing/decorators/withLayout.d.ts +3 -3
  122. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  123. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +1 -1
  124. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  125. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  126. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  127. package/dist/types/src/util/index.d.ts +1 -2
  128. package/dist/types/src/util/index.d.ts.map +1 -1
  129. package/dist/types/tsconfig.tsbuildinfo +1 -1
  130. package/package.json +37 -32
  131. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +8 -0
  132. package/src/components/Avatars/Avatar.stories.tsx +4 -4
  133. package/src/components/Avatars/Avatar.tsx +1 -1
  134. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -2
  135. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +2 -2
  136. package/src/components/Button/Button.stories.tsx +2 -2
  137. package/src/components/Button/Button.tsx +1 -1
  138. package/src/components/Button/IconButton.stories.tsx +2 -2
  139. package/src/components/Button/IconButton.tsx +8 -3
  140. package/src/components/Button/Toggle.stories.tsx +2 -2
  141. package/src/components/Button/ToggleGroup.stories.tsx +2 -2
  142. package/src/components/Clipboard/CopyButton.tsx +3 -3
  143. package/src/components/DensityProvider/DensityProvider.tsx +1 -1
  144. package/src/components/Dialog/AlertDialog.stories.tsx +2 -2
  145. package/src/components/Dialog/Dialog.stories.tsx +57 -23
  146. package/src/components/Dialog/Dialog.tsx +181 -40
  147. package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
  148. package/src/components/Icon/Icon.stories.tsx +3 -3
  149. package/src/components/Icon/Icon.tsx +1 -1
  150. package/src/components/Input/Input.stories.tsx +12 -11
  151. package/src/components/Input/Input.tsx +13 -5
  152. package/src/components/Link/Link.stories.tsx +2 -2
  153. package/src/components/List/List.stories.tsx +18 -14
  154. package/src/components/List/List.tsx +1 -1
  155. package/src/components/List/Tree.stories.tsx +2 -2
  156. package/src/components/List/Treegrid.stories.tsx +2 -2
  157. package/src/components/List/Treegrid.tsx +1 -1
  158. package/src/components/Main/Main.stories.tsx +41 -20
  159. package/src/components/Main/Main.tsx +92 -45
  160. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +2 -2
  161. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +2 -2
  162. package/src/components/{Menus → Menu}/DropdownMenu.tsx +61 -57
  163. package/src/components/Message/Message.stories.tsx +3 -3
  164. package/src/components/Message/Message.tsx +30 -5
  165. package/src/components/Popover/Popover.stories.tsx +2 -2
  166. package/src/components/Popover/Popover.tsx +35 -33
  167. package/src/components/ScrollArea/ScrollArea.stories.tsx +166 -40
  168. package/src/components/ScrollArea/ScrollArea.tsx +86 -80
  169. package/src/components/ScrollArea/index.ts +1 -1
  170. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +3 -2
  171. package/src/components/ScrollContainer/ScrollContainer.tsx +99 -92
  172. package/src/components/Select/Select.stories.tsx +2 -2
  173. package/src/components/Skeleton/Skeleton.stories.tsx +52 -0
  174. package/src/components/Skeleton/Skeleton.tsx +26 -0
  175. package/src/components/Skeleton/index.ts +5 -0
  176. package/src/components/Splitter/Splitter.stories.tsx +73 -0
  177. package/src/components/Splitter/Splitter.tsx +123 -0
  178. package/src/components/Splitter/index.ts +5 -0
  179. package/src/components/Status/Status.stories.tsx +2 -2
  180. package/src/components/Tag/Tag.stories.tsx +4 -4
  181. package/src/components/Tag/Tag.tsx +1 -1
  182. package/src/components/ThemeProvider/ThemeProvider.tsx +2 -3
  183. package/src/components/ThemeProvider/TranslationsProvider.tsx +1 -16
  184. package/src/components/ThemeProvider/index.ts +3 -3
  185. package/src/components/Toast/Toast.stories.tsx +2 -2
  186. package/src/components/Toolbar/Toolbar.stories.tsx +2 -2
  187. package/src/components/Toolbar/Toolbar.tsx +31 -12
  188. package/src/components/Tooltip/Tooltip.stories.tsx +2 -2
  189. package/src/components/Tooltip/Tooltip.tsx +22 -20
  190. package/src/components/index.ts +3 -1
  191. package/src/exemplars/generics.stories.tsx +44 -0
  192. package/src/exemplars/slot.stories.tsx +108 -0
  193. package/src/exemplars/tabster.stories.tsx +127 -0
  194. package/src/hooks/useDensityContext.ts +1 -1
  195. package/src/hooks/useElevationContext.ts +1 -1
  196. package/src/index.ts +2 -1
  197. package/src/playground/Controls.stories.tsx +3 -4
  198. package/src/playground/Custom.stories.tsx +2 -2
  199. package/src/playground/Typography.stories.tsx +2 -2
  200. package/src/primitives/Container/Container.stories.tsx +67 -0
  201. package/src/primitives/Container/Container.tsx +82 -0
  202. package/src/primitives/Container/Layout.stories.tsx +57 -0
  203. package/src/primitives/Container/Layout.tsx +61 -0
  204. package/src/primitives/Container/index.ts +6 -0
  205. package/src/primitives/Flex/Flex.tsx +26 -0
  206. package/src/primitives/Flex/index.ts +5 -0
  207. package/src/primitives/index.ts +6 -0
  208. package/src/testing/decorators/withLayout.tsx +22 -15
  209. package/src/testing/decorators/withLayoutVariants.tsx +3 -3
  210. package/src/testing/decorators/withTheme.tsx +21 -18
  211. package/src/util/index.ts +2 -2
  212. package/dist/lib/browser/chunk-53MI2QCM.mjs +0 -4707
  213. package/dist/lib/browser/chunk-53MI2QCM.mjs.map +0 -7
  214. package/dist/lib/node-esm/chunk-ID67AFFF.mjs +0 -4709
  215. package/dist/lib/node-esm/chunk-ID67AFFF.mjs.map +0 -7
  216. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  217. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  218. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  219. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  220. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  221. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  222. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  223. package/dist/types/src/util/domino.d.ts +0 -18
  224. package/dist/types/src/util/domino.d.ts.map +0 -1
  225. package/src/util/ThemedClassName.ts +0 -7
  226. package/src/util/domino.ts +0 -53
  227. /package/dist/types/src/components/{Menus → Menu}/ContextMenu.stories.d.ts +0 -0
  228. /package/dist/types/src/components/{Menus → Menu}/DropdownMenu.stories.d.ts +0 -0
  229. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  230. /package/src/components/{Menus → Menu}/ContextMenu.tsx +0 -0
  231. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -22,8 +22,10 @@ import React, {
22
22
  useState,
23
23
  } from 'react';
24
24
 
25
+ import { addEventListener } from '@dxos/async';
25
26
  import { log } from '@dxos/log';
26
27
  import { useForwardedRef, useMediaQuery } from '@dxos/react-hooks';
28
+ import { type MainStyleProps } from '@dxos/ui-theme';
27
29
 
28
30
  import { useThemeContext } from '../../hooks';
29
31
  import { type ThemedClassName } from '../../util';
@@ -35,7 +37,14 @@ const MAIN_NAME = 'Main';
35
37
  const MAIN_ROOT_NAME = 'MainRoot';
36
38
  const NAVIGATION_SIDEBAR_NAME = 'NavigationSidebar';
37
39
  const COMPLEMENTARY_SIDEBAR_NAME = 'ComplementarySidebar';
38
- const GENERIC_CONSUMER_NAME = 'GenericConsumer';
40
+
41
+ const handleOpenAutoFocus = (event: Event) => {
42
+ !document.body.hasAttribute('data-is-keyboard') && event.preventDefault();
43
+ };
44
+
45
+ //
46
+ // Landmark
47
+ //
39
48
 
40
49
  const landmarkAttr = 'data-main-landmark';
41
50
 
@@ -67,40 +76,54 @@ const useLandmarkMover = (propsOnKeyDown: ComponentPropsWithoutRef<'div'>['onKey
67
76
  const focusableGroupAttrs = useFocusableGroup({ tabBehavior: 'limited', ignoreDefaultKeydown: { Tab: true } });
68
77
 
69
78
  return {
70
- onKeyDown: handleKeyDown,
71
79
  [landmarkAttr]: landmark,
72
80
  tabIndex: 0,
81
+ onKeyDown: handleKeyDown,
73
82
  ...focusableGroupAttrs,
74
83
  };
75
84
  };
76
85
 
86
+ //
87
+ // Context
88
+ //
89
+
90
+ // TODO(burdon): Define collapsed state.
77
91
  type SidebarState = 'expanded' | 'collapsed' | 'closed';
78
92
 
79
93
  type MainContextValue = {
80
94
  resizing: boolean;
95
+
96
+ // Navigation
81
97
  navigationSidebarState: SidebarState;
82
98
  setNavigationSidebarState: Dispatch<SetStateAction<SidebarState | undefined>>;
99
+
100
+ // Complementary
83
101
  complementarySidebarState: SidebarState;
84
102
  setComplementarySidebarState: Dispatch<SetStateAction<SidebarState | undefined>>;
85
103
  };
86
104
 
87
105
  const [MainProvider, useMainContext] = createContext<MainContextValue>(MAIN_NAME, {
88
106
  resizing: false,
107
+
89
108
  navigationSidebarState: 'closed',
90
109
  setNavigationSidebarState: (_nextState) => {
91
- // TODO(burdon): Standardize with other context missing errors using raise.
92
- log.warn('Attempt to set sidebar state without initializing `MainRoot`');
110
+ log.warn('Not initialized');
93
111
  },
112
+
94
113
  complementarySidebarState: 'closed',
95
114
  setComplementarySidebarState: (_nextState) => {
96
- // TODO(burdon): Standardize with other context missing errors using raise.
97
- log.warn('Attempt to set sidebar state without initializing `MainRoot`');
115
+ log.warn('Not initialized');
98
116
  },
99
117
  });
100
118
 
101
- const useSidebars = (consumerName = GENERIC_CONSUMER_NAME) => {
102
- const { setNavigationSidebarState, navigationSidebarState, setComplementarySidebarState, complementarySidebarState } =
103
- useMainContext(consumerName);
119
+ const useSidebars = (consumerName: string) => {
120
+ const {
121
+ navigationSidebarState,
122
+ setNavigationSidebarState,
123
+
124
+ complementarySidebarState,
125
+ setComplementarySidebarState,
126
+ } = useMainContext(consumerName);
104
127
 
105
128
  return {
106
129
  navigationSidebarState,
@@ -112,6 +135,7 @@ const useSidebars = (consumerName = GENERIC_CONSUMER_NAME) => {
112
135
  openNavigationSidebar: useCallback(() => setNavigationSidebarState('expanded'), []),
113
136
  collapseNavigationSidebar: useCallback(() => setNavigationSidebarState('collapsed'), []),
114
137
  closeNavigationSidebar: useCallback(() => setNavigationSidebarState('closed'), []),
138
+
115
139
  complementarySidebarState,
116
140
  setComplementarySidebarState,
117
141
  toggleComplementarySidebar: useCallback(
@@ -124,24 +148,29 @@ const useSidebars = (consumerName = GENERIC_CONSUMER_NAME) => {
124
148
  };
125
149
  };
126
150
 
151
+ //
152
+ // Root
153
+ //
154
+
127
155
  type MainRootProps = PropsWithChildren<{
128
156
  navigationSidebarState?: SidebarState;
129
157
  defaultNavigationSidebarState?: SidebarState;
130
158
  onNavigationSidebarStateChange?: (nextState: SidebarState) => void;
159
+
131
160
  complementarySidebarState?: SidebarState;
132
161
  defaultComplementarySidebarState?: SidebarState;
133
162
  onComplementarySidebarStateChange?: (nextState: SidebarState) => void;
134
163
  }>;
135
164
 
136
- const resizeDebounce = 3000;
137
-
138
165
  const MainRoot = ({
139
166
  navigationSidebarState: propsNavigationSidebarState,
140
- defaultNavigationSidebarState,
167
+ defaultNavigationSidebarState = 'closed',
141
168
  onNavigationSidebarStateChange,
169
+
142
170
  complementarySidebarState: propsComplementarySidebarState,
143
- defaultComplementarySidebarState,
171
+ defaultComplementarySidebarState = 'closed',
144
172
  onComplementarySidebarStateChange,
173
+
145
174
  children,
146
175
  ...props
147
176
  }: MainRootProps) => {
@@ -161,22 +190,21 @@ const MainRoot = ({
161
190
 
162
191
  const [resizing, setResizing] = useState(false);
163
192
  const resizeInterval = useRef<ReturnType<typeof setTimeout> | null>(null);
193
+ useEffect(
194
+ () =>
195
+ addEventListener(window, 'resize', () => {
196
+ setResizing(true);
197
+ if (resizeInterval.current) {
198
+ clearTimeout(resizeInterval.current);
199
+ }
164
200
 
165
- const handleResize = useCallback(() => {
166
- setResizing(true);
167
- if (resizeInterval.current) {
168
- clearTimeout(resizeInterval.current);
169
- }
170
- resizeInterval.current = setTimeout(() => {
171
- setResizing(false);
172
- resizeInterval.current = null;
173
- }, resizeDebounce);
174
- }, []);
175
-
176
- useEffect(() => {
177
- window.addEventListener('resize', handleResize);
178
- return () => window.removeEventListener('resize', handleResize);
179
- }, [handleResize]);
201
+ resizeInterval.current = setTimeout(() => {
202
+ setResizing(false);
203
+ resizeInterval.current = null;
204
+ }, 3_000);
205
+ }),
206
+ [],
207
+ );
180
208
 
181
209
  return (
182
210
  <MainProvider
@@ -196,9 +224,9 @@ const MainRoot = ({
196
224
 
197
225
  MainRoot.displayName = MAIN_ROOT_NAME;
198
226
 
199
- const handleOpenAutoFocus = (event: Event) => {
200
- !document.body.hasAttribute('data-is-keyboard') && event.preventDefault();
201
- };
227
+ //
228
+ // Sidebar
229
+ //
202
230
 
203
231
  type MainSidebarProps = ThemedClassName<ComponentPropsWithRef<typeof DialogContent>> & {
204
232
  swipeToDismiss?: boolean;
@@ -219,9 +247,11 @@ const MainSidebar = forwardRef<HTMLDivElement, MainSidebarProps>(
219
247
  const { t } = useTranslation();
220
248
  const ref = useForwardedRef(forwardedRef);
221
249
  const noopRef = useRef(null);
250
+
222
251
  useSwipeToDismiss(swipeToDismiss ? ref : noopRef, {
223
252
  onDismiss: () => onStateChange?.('closed'),
224
253
  });
254
+
225
255
  // NOTE(thure): This is a workaround for something further down the tree grabbing focus on Escape. Adding this
226
256
  // intervention to `Tabs.Root` or `Tabs.Tabpenel` instances is somehow ineffectual.
227
257
  const handleKeyDown = useCallback(
@@ -236,6 +266,7 @@ const MainSidebar = forwardRef<HTMLDivElement, MainSidebarProps>(
236
266
  },
237
267
  [props.onKeyDown],
238
268
  );
269
+
239
270
  const Root = isLg ? Primitive.div : DialogContent;
240
271
 
241
272
  return (
@@ -243,13 +274,13 @@ const MainSidebar = forwardRef<HTMLDivElement, MainSidebarProps>(
243
274
  {!isLg && <DialogTitle className='sr-only'>{toLocalizedString(label, t)}</DialogTitle>}
244
275
  <Root
245
276
  {...(!isLg && { forceMount: true, tabIndex: -1, onOpenAutoFocus: onOpenAutoFocus ?? handleOpenAutoFocus })}
277
+ {...(state === 'closed' && { inert: true })}
246
278
  {...props}
247
279
  data-side={side === 'inline-end' ? 'ie' : 'is'}
248
280
  data-state={state}
249
281
  data-resizing={resizing ? 'true' : 'false'}
250
282
  className={tx('main.sidebar', 'main__sidebar', {}, classNames)}
251
283
  onKeyDownCapture={handleKeyDown}
252
- {...(state === 'closed' && { inert: true })}
253
284
  ref={ref}
254
285
  >
255
286
  {children}
@@ -259,6 +290,10 @@ const MainSidebar = forwardRef<HTMLDivElement, MainSidebarProps>(
259
290
  },
260
291
  );
261
292
 
293
+ //
294
+ // Navigation Sidebar
295
+ //
296
+
262
297
  type MainNavigationSidebarProps = Omit<MainSidebarProps, 'expanded' | 'side'>;
263
298
 
264
299
  const MainNavigationSidebar = forwardRef<HTMLDivElement, MainNavigationSidebarProps>((props, forwardedRef) => {
@@ -280,6 +315,10 @@ const MainNavigationSidebar = forwardRef<HTMLDivElement, MainNavigationSidebarPr
280
315
 
281
316
  MainNavigationSidebar.displayName = NAVIGATION_SIDEBAR_NAME;
282
317
 
318
+ //
319
+ // Complementary Sidebar
320
+ //
321
+
283
322
  type MainComplementarySidebarProps = Omit<MainSidebarProps, 'expanded' | 'side'>;
284
323
 
285
324
  const MainComplementarySidebar = forwardRef<HTMLDivElement, MainComplementarySidebarProps>((props, forwardedRef) => {
@@ -300,20 +339,24 @@ const MainComplementarySidebar = forwardRef<HTMLDivElement, MainComplementarySid
300
339
  );
301
340
  });
302
341
 
303
- MainNavigationSidebar.displayName = NAVIGATION_SIDEBAR_NAME;
342
+ MainComplementarySidebar.displayName = COMPLEMENTARY_SIDEBAR_NAME;
304
343
 
305
- type MainProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.div>> & {
306
- asChild?: boolean;
307
- bounce?: boolean;
308
- handlesFocus?: boolean;
309
- };
344
+ //
345
+ // Content
346
+ //
347
+
348
+ type MainContentProps = ThemedClassName<
349
+ ComponentPropsWithRef<typeof Primitive.div> &
350
+ MainStyleProps & {
351
+ asChild?: boolean;
352
+ }
353
+ >;
310
354
 
311
- const MainContent = forwardRef<HTMLDivElement, MainProps>(
312
- ({ asChild, classNames, bounce, handlesFocus, children, role, ...props }: MainProps, forwardedRef) => {
355
+ const MainContent = forwardRef<HTMLDivElement, MainContentProps>(
356
+ ({ asChild, classNames, bounce, handlesFocus, children, role, ...props }: MainContentProps, forwardedRef) => {
313
357
  const { navigationSidebarState, complementarySidebarState } = useMainContext(MAIN_NAME);
314
358
  const { tx } = useThemeContext();
315
359
  const Root = asChild ? Slot : role ? 'div' : 'main';
316
-
317
360
  const mover = useLandmarkMover(props.onKeyDown, '1');
318
361
 
319
362
  return (
@@ -335,7 +378,7 @@ const MainContent = forwardRef<HTMLDivElement, MainProps>(
335
378
 
336
379
  MainContent.displayName = MAIN_NAME;
337
380
 
338
- type MainOverlayProps = ThemedClassName<Omit<ComponentPropsWithRef<typeof Primitive.div>, 'children'>>;
381
+ type MainOverlayProps = ThemedClassName<Omit<ComponentPropsWithRef<typeof Primitive.div>, 'children' | 'onClick'>>;
339
382
 
340
383
  const MainOverlay = forwardRef<HTMLDivElement, MainOverlayProps>(({ classNames, ...props }, forwardedRef) => {
341
384
  const [isLg] = useMediaQuery('lg');
@@ -344,15 +387,19 @@ const MainOverlay = forwardRef<HTMLDivElement, MainOverlayProps>(({ classNames,
344
387
  const { tx } = useThemeContext();
345
388
  return (
346
389
  <div
390
+ {...props}
347
391
  onClick={() => {
348
392
  setNavigationSidebarState('collapsed');
349
393
  setComplementarySidebarState('collapsed');
350
394
  }}
351
- {...props}
352
395
  className={tx(
353
396
  'main.overlay',
354
397
  'main__overlay',
355
- { isLg, inlineStartSidebarOpen: navigationSidebarState, inlineEndSidebarOpen: complementarySidebarState },
398
+ {
399
+ isLg,
400
+ inlineStartSidebarOpen: navigationSidebarState,
401
+ inlineEndSidebarOpen: complementarySidebarState,
402
+ },
356
403
  classNames,
357
404
  )}
358
405
  data-state={navigationSidebarState === 'expanded' || complementarySidebarState === 'expanded' ? 'open' : 'closed'}
@@ -372,4 +419,4 @@ export const Main = {
372
419
 
373
420
  export { useMainContext, useSidebars, useLandmarkMover };
374
421
 
375
- export type { MainRootProps, MainProps, MainOverlayProps, MainNavigationSidebarProps, SidebarState };
422
+ export type { MainRootProps, MainContentProps, MainOverlayProps, MainNavigationSidebarProps, SidebarState };
@@ -92,10 +92,10 @@ const DefaultStory = () => {
92
92
  };
93
93
 
94
94
  const meta = {
95
- title: 'ui/react-ui-core/ContextMenu',
95
+ title: 'ui/react-ui-core/components/ContextMenu',
96
96
  component: ContextMenu.Root as any,
97
97
  render: DefaultStory,
98
- decorators: [withTheme],
98
+ decorators: [withTheme()],
99
99
  } satisfies Meta<typeof DefaultStory>;
100
100
 
101
101
  export default meta;
@@ -92,10 +92,10 @@ const DefaultStory = () => {
92
92
  };
93
93
 
94
94
  const meta = {
95
- title: 'ui/react-ui-core/DropdownMenu',
95
+ title: 'ui/react-ui-core/components/DropdownMenu',
96
96
  component: DropdownMenu.Root,
97
97
  render: DefaultStory,
98
- decorators: [withTheme],
98
+ decorators: [withTheme()],
99
99
  } satisfies Meta<typeof DefaultStory>;
100
100
 
101
101
  export default meta;
@@ -35,15 +35,15 @@ import { type ThemedClassName } from '../../util';
35
35
 
36
36
  type Direction = 'ltr' | 'rtl';
37
37
 
38
- /* -------------------------------------------------------------------------------------------------
39
- * DropdownMenu
40
- * ----------------------------------------------------------------------------------------------- */
38
+ //
39
+ // DropdownMenu
40
+ //
41
41
 
42
42
  const DROPDOWN_MENU_NAME = 'DropdownMenu';
43
43
 
44
44
  type ScopedProps<P> = P & { __scopeDropdownMenu?: Scope };
45
45
  const [createDropdownMenuContext, createDropdownMenuScope] = createContextScope(DROPDOWN_MENU_NAME, [createMenuScope]);
46
- const useMenuScope = createMenuScope();
46
+ const useMenuScope: (scope?: Scope) => any = createMenuScope();
47
47
 
48
48
  type DropdownMenuContextValue = {
49
49
  triggerId: string;
@@ -97,9 +97,9 @@ const DropdownMenuRoot: FC<DropdownMenuRootProps> = (props: ScopedProps<Dropdown
97
97
 
98
98
  DropdownMenuRoot.displayName = DROPDOWN_MENU_NAME;
99
99
 
100
- /* -------------------------------------------------------------------------------------------------
101
- * DropdownMenuTrigger
102
- * ----------------------------------------------------------------------------------------------- */
100
+ //
101
+ // DropdownMenuTrigger
102
+ //
103
103
 
104
104
  const TRIGGER_NAME = 'DropdownMenuTrigger';
105
105
 
@@ -162,9 +162,9 @@ const DropdownMenuTrigger = forwardRef<DropdownMenuTriggerElement, DropdownMenuT
162
162
 
163
163
  DropdownMenuTrigger.displayName = TRIGGER_NAME;
164
164
 
165
- /* -------------------------------------------------------------------------------------------------
166
- * DropdownMenuVirtualTrigger
167
- * ----------------------------------------------------------------------------------------------- */
165
+ //
166
+ // DropdownMenuVirtualTrigger
167
+ //
168
168
 
169
169
  const VIRTUAL_TRIGGER_NAME = 'DropdownMenuVirtualTrigger';
170
170
 
@@ -186,9 +186,9 @@ const DropdownMenuVirtualTrigger = (props: ScopedProps<DropdownMenuVirtualTrigge
186
186
 
187
187
  DropdownMenuVirtualTrigger.displayName = VIRTUAL_TRIGGER_NAME;
188
188
 
189
- /* -------------------------------------------------------------------------------------------------
190
- * DropdownMenuPortal
191
- * ----------------------------------------------------------------------------------------------- */
189
+ //
190
+ // DropdownMenuPortal
191
+ //
192
192
 
193
193
  const PORTAL_NAME = 'DropdownMenuPortal';
194
194
 
@@ -203,9 +203,9 @@ const DropdownMenuPortal: FC<DropdownMenuPortalProps> = (props: ScopedProps<Drop
203
203
 
204
204
  DropdownMenuPortal.displayName = PORTAL_NAME;
205
205
 
206
- /* -------------------------------------------------------------------------------------------------
207
- * DropdownMenuViewport
208
- * ----------------------------------------------------------------------------------------------- */
206
+ //
207
+ // DropdownMenuViewport
208
+ //
209
209
 
210
210
  type DropdownMenuViewportProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.div>> & {
211
211
  asChild?: boolean;
@@ -223,9 +223,9 @@ const DropdownMenuViewport = forwardRef<HTMLDivElement, DropdownMenuViewportProp
223
223
  },
224
224
  );
225
225
 
226
- /* -------------------------------------------------------------------------------------------------
227
- * DropdownMenuContent
228
- * ----------------------------------------------------------------------------------------------- */
226
+ //
227
+ // DropdownMenuContent
228
+ //
229
229
 
230
230
  const CONTENT_NAME = 'DropdownMenuContent';
231
231
 
@@ -302,9 +302,9 @@ const DropdownMenuContent = forwardRef<DropdownMenuContentElement, DropdownMenuC
302
302
 
303
303
  DropdownMenuContent.displayName = CONTENT_NAME;
304
304
 
305
- /* -------------------------------------------------------------------------------------------------
306
- * DropdownMenuGroup
307
- * ----------------------------------------------------------------------------------------------- */
305
+ //
306
+ // DropdownMenuGroup
307
+ //
308
308
 
309
309
  const GROUP_NAME = 'DropdownMenuGroup';
310
310
 
@@ -322,9 +322,9 @@ const DropdownMenuGroup = forwardRef<DropdownMenuGroupElement, DropdownMenuGroup
322
322
 
323
323
  DropdownMenuGroup.displayName = GROUP_NAME;
324
324
 
325
- /* -------------------------------------------------------------------------------------------------
326
- * DropdownMenuLabel
327
- * ----------------------------------------------------------------------------------------------- */
325
+ //
326
+ // DropdownMenuLabel
327
+ //
328
328
 
329
329
  const LABEL_NAME = 'DropdownMenuLabel';
330
330
 
@@ -350,9 +350,9 @@ const DropdownMenuGroupLabel = forwardRef<DropdownMenuLabelElement, DropdownMenu
350
350
 
351
351
  DropdownMenuGroupLabel.displayName = LABEL_NAME;
352
352
 
353
- /* -------------------------------------------------------------------------------------------------
354
- * DropdownMenuItem
355
- * ----------------------------------------------------------------------------------------------- */
353
+ //
354
+ // DropdownMenuItem
355
+ //
356
356
 
357
357
  const ITEM_NAME = 'DropdownMenuItem';
358
358
 
@@ -378,9 +378,9 @@ const DropdownMenuItem = forwardRef<DropdownMenuItemElement, DropdownMenuItemPro
378
378
 
379
379
  DropdownMenuItem.displayName = ITEM_NAME;
380
380
 
381
- /* -------------------------------------------------------------------------------------------------
382
- * DropdownMenuCheckboxItem
383
- * ----------------------------------------------------------------------------------------------- */
381
+ //
382
+ // DropdownMenuCheckboxItem
383
+ //
384
384
 
385
385
  const CHECKBOX_ITEM_NAME = 'DropdownMenuCheckboxItem';
386
386
 
@@ -406,9 +406,9 @@ const DropdownMenuCheckboxItem = forwardRef<DropdownMenuCheckboxItemElement, Dro
406
406
 
407
407
  DropdownMenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;
408
408
 
409
- /* -------------------------------------------------------------------------------------------------
410
- * DropdownMenuRadioGroup
411
- * ----------------------------------------------------------------------------------------------- */
409
+ //
410
+ // DropdownMenuRadioGroup
411
+ //
412
412
 
413
413
  const RADIO_GROUP_NAME = 'DropdownMenuRadioGroup';
414
414
 
@@ -426,9 +426,9 @@ const DropdownMenuRadioGroup = forwardRef<DropdownMenuRadioGroupElement, Dropdow
426
426
 
427
427
  DropdownMenuRadioGroup.displayName = RADIO_GROUP_NAME;
428
428
 
429
- /* -------------------------------------------------------------------------------------------------
430
- * DropdownMenuRadioItem
431
- * ----------------------------------------------------------------------------------------------- */
429
+ //
430
+ // DropdownMenuRadioItem
431
+ //
432
432
 
433
433
  const RADIO_ITEM_NAME = 'DropdownMenuRadioItem';
434
434
 
@@ -454,9 +454,9 @@ const DropdownMenuRadioItem = forwardRef<DropdownMenuRadioItemElement, DropdownM
454
454
 
455
455
  DropdownMenuRadioItem.displayName = RADIO_ITEM_NAME;
456
456
 
457
- /* -------------------------------------------------------------------------------------------------
458
- * DropdownMenuItemIndicator
459
- * ----------------------------------------------------------------------------------------------- */
457
+ //
458
+ // DropdownMenuItemIndicator
459
+ //
460
460
 
461
461
  const INDICATOR_NAME = 'DropdownMenuItemIndicator';
462
462
 
@@ -474,9 +474,9 @@ const DropdownMenuItemIndicator = forwardRef<DropdownMenuItemIndicatorElement, D
474
474
 
475
475
  DropdownMenuItemIndicator.displayName = INDICATOR_NAME;
476
476
 
477
- /* -------------------------------------------------------------------------------------------------
478
- * DropdownMenuSeparator
479
- * ----------------------------------------------------------------------------------------------- */
477
+ //
478
+ // DropdownMenuSeparator
479
+ //
480
480
 
481
481
  const SEPARATOR_NAME = 'DropdownMenuSeparator';
482
482
 
@@ -502,9 +502,9 @@ const DropdownMenuSeparator = forwardRef<DropdownMenuSeparatorElement, DropdownM
502
502
 
503
503
  DropdownMenuSeparator.displayName = SEPARATOR_NAME;
504
504
 
505
- /* -------------------------------------------------------------------------------------------------
506
- * DropdownMenuArrow
507
- * ----------------------------------------------------------------------------------------------- */
505
+ //
506
+ // DropdownMenuArrow
507
+ //
508
508
 
509
509
  const ARROW_NAME = 'DropdownMenuArrow';
510
510
 
@@ -530,9 +530,9 @@ const DropdownMenuArrow = forwardRef<DropdownMenuArrowElement, DropdownMenuArrow
530
530
 
531
531
  DropdownMenuArrow.displayName = ARROW_NAME;
532
532
 
533
- /* -------------------------------------------------------------------------------------------------
534
- * DropdownMenuSub
535
- * ----------------------------------------------------------------------------------------------- */
533
+ //
534
+ // DropdownMenuSub
535
+ //
536
536
 
537
537
  interface DropdownMenuSubProps {
538
538
  children?: ReactNode;
@@ -557,9 +557,9 @@ const DropdownMenuSub: FC<DropdownMenuSubProps> = (props: ScopedProps<DropdownMe
557
557
  );
558
558
  };
559
559
 
560
- /* -------------------------------------------------------------------------------------------------
561
- * DropdownMenuSubTrigger
562
- * ----------------------------------------------------------------------------------------------- */
560
+ //
561
+ // DropdownMenuSubTrigger
562
+ //
563
563
 
564
564
  const SUB_TRIGGER_NAME = 'DropdownMenuSubTrigger';
565
565
 
@@ -577,9 +577,9 @@ const DropdownMenuSubTrigger = forwardRef<DropdownMenuSubTriggerElement, Dropdow
577
577
 
578
578
  DropdownMenuSubTrigger.displayName = SUB_TRIGGER_NAME;
579
579
 
580
- /* -------------------------------------------------------------------------------------------------
581
- * DropdownMenuSubContent
582
- * ----------------------------------------------------------------------------------------------- */
580
+ //
581
+ // DropdownMenuSubContent
582
+ //
583
583
 
584
584
  const SUB_CONTENT_NAME = 'DropdownMenuSubContent';
585
585
 
@@ -615,7 +615,9 @@ const DropdownMenuSubContent = forwardRef<DropdownMenuSubContentElement, Dropdow
615
615
 
616
616
  DropdownMenuSubContent.displayName = SUB_CONTENT_NAME;
617
617
 
618
- /* ----------------------------------------------------------------------------------------------- */
618
+ //
619
+ // DropdownMenu
620
+ //
619
621
 
620
622
  export const DropdownMenu = {
621
623
  Root: DropdownMenuRoot,
@@ -638,7 +640,9 @@ export const DropdownMenu = {
638
640
  SubContent: DropdownMenuSubContent,
639
641
  };
640
642
 
641
- const useDropdownMenuMenuScope = useMenuScope;
643
+ type DropdownMenuScope = Scope;
644
+
645
+ const useDropdownMenuMenuScope: (scope?: DropdownMenuScope) => any = useMenuScope;
642
646
 
643
647
  export { createDropdownMenuScope, useDropdownMenuContext, useDropdownMenuMenuScope };
644
648
 
@@ -5,7 +5,7 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React from 'react';
7
7
 
8
- import { type MessageValence } from '@dxos/react-ui-types';
8
+ import { type MessageValence } from '@dxos/ui-types';
9
9
 
10
10
  import { withTheme } from '../../testing';
11
11
 
@@ -25,10 +25,10 @@ const DefaultStory = ({ valence, title, body }: StoryProps) => (
25
25
  );
26
26
 
27
27
  const meta = {
28
- title: 'ui/react-ui-core/Callout',
28
+ title: 'ui/react-ui-core/components/Callout',
29
29
  component: Callout.Root as any,
30
30
  render: DefaultStory,
31
- decorators: [withTheme],
31
+ decorators: [withTheme()],
32
32
  parameters: { chromatic: { disableSnapshot: false } },
33
33
  argTypes: {
34
34
  valence: {