@dxos/react-ui 0.8.4-main.3c1ae3b → 0.8.4-main.3eb6e50203

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 (242) 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 +3198 -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-JKHQSGNU.mjs +776 -0
  9. package/dist/lib/node-esm/chunk-JKHQSGNU.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +3198 -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/Avatars/Avatar.d.ts.map +1 -1
  18. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  19. package/dist/types/src/components/Button/Button.d.ts +1 -1
  20. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  21. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  22. package/dist/types/src/components/Button/ToggleGroup.d.ts +4 -4
  23. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +4 -4
  24. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  25. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  26. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  27. package/dist/types/src/components/Dialog/Dialog.d.ts +23 -8
  28. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  29. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +7 -5
  30. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  31. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  32. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  33. package/dist/types/src/components/Icon/Icon.d.ts +1 -1
  34. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  35. package/dist/types/src/components/Input/Input.d.ts +1 -1
  36. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  37. package/dist/types/src/components/Input/Input.stories.d.ts +2 -2
  38. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  39. package/dist/types/src/components/List/List.d.ts +1 -1
  40. package/dist/types/src/components/List/List.d.ts.map +1 -1
  41. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  42. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  43. package/dist/types/src/components/Main/Main.d.ts +8 -9
  44. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  45. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  46. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  47. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  48. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  49. package/dist/types/src/components/{Menus → Menu}/DropdownMenu.d.ts +1 -1
  50. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  51. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  52. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  53. package/dist/types/src/components/Message/Message.d.ts +1 -1
  54. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  55. package/dist/types/src/components/Message/Message.stories.d.ts +1 -1
  56. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  57. package/dist/types/src/components/Popover/Popover.d.ts +1 -1
  58. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  59. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +25 -26
  60. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  61. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +46 -8
  62. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  63. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +2 -2
  64. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  65. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +1 -1
  66. package/dist/types/src/components/Select/Select.d.ts +9 -9
  67. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  68. package/dist/types/src/components/Separator/Separator.d.ts +1 -1
  69. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  70. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  71. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  72. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  73. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  74. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  75. package/dist/types/src/components/Splitter/Splitter.d.ts +26 -0
  76. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  77. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  78. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  79. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  80. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  81. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  82. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  83. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +2 -2
  84. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  85. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
  86. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  87. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  88. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  89. package/dist/types/src/components/Toast/Toast.d.ts +4 -4
  90. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  91. package/dist/types/src/components/Toolbar/Toolbar.d.ts +13 -12
  92. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  93. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  94. package/dist/types/src/components/index.d.ts +3 -1
  95. package/dist/types/src/components/index.d.ts.map +1 -1
  96. package/dist/types/src/exemplars/generics.stories.d.ts +17 -0
  97. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  98. package/dist/types/src/exemplars/slot.stories.d.ts +14 -0
  99. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  100. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  101. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  102. package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
  103. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  104. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  105. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  106. package/dist/types/src/index.d.ts +2 -1
  107. package/dist/types/src/index.d.ts.map +1 -1
  108. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  109. package/dist/types/src/primitives/Container/Container.d.ts +23 -0
  110. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  111. package/dist/types/src/primitives/Container/Container.stories.d.ts +11 -0
  112. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  113. package/dist/types/src/primitives/Container/Layout.d.ts +18 -0
  114. package/dist/types/src/primitives/Container/Layout.d.ts.map +1 -0
  115. package/dist/types/src/primitives/Container/Layout.stories.d.ts +10 -0
  116. package/dist/types/src/primitives/Container/Layout.stories.d.ts.map +1 -0
  117. package/dist/types/src/primitives/Container/index.d.ts +3 -0
  118. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  119. package/dist/types/src/primitives/Flex/Flex.d.ts +8 -0
  120. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  121. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  122. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  123. package/dist/types/src/primitives/index.d.ts +3 -0
  124. package/dist/types/src/primitives/index.d.ts.map +1 -0
  125. package/dist/types/src/testing/decorators/withLayout.d.ts +3 -3
  126. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  127. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +1 -1
  128. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  129. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  130. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  131. package/dist/types/src/util/index.d.ts +1 -2
  132. package/dist/types/src/util/index.d.ts.map +1 -1
  133. package/dist/types/tsconfig.tsbuildinfo +1 -1
  134. package/package.json +37 -32
  135. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +10 -12
  136. package/src/components/Avatars/Avatar.stories.tsx +4 -4
  137. package/src/components/Avatars/Avatar.tsx +3 -10
  138. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -2
  139. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +2 -2
  140. package/src/components/Breadcrumb/Breadcrumb.tsx +5 -31
  141. package/src/components/Button/Button.stories.tsx +2 -2
  142. package/src/components/Button/Button.tsx +2 -8
  143. package/src/components/Button/IconButton.stories.tsx +2 -2
  144. package/src/components/Button/IconButton.tsx +5 -2
  145. package/src/components/Button/Toggle.stories.tsx +2 -2
  146. package/src/components/Button/ToggleGroup.stories.tsx +2 -2
  147. package/src/components/Clipboard/CopyButton.tsx +3 -3
  148. package/src/components/DensityProvider/DensityProvider.tsx +1 -1
  149. package/src/components/Dialog/AlertDialog.stories.tsx +2 -2
  150. package/src/components/Dialog/AlertDialog.tsx +3 -8
  151. package/src/components/Dialog/Dialog.stories.tsx +57 -23
  152. package/src/components/Dialog/Dialog.tsx +162 -43
  153. package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
  154. package/src/components/Icon/Icon.stories.tsx +3 -3
  155. package/src/components/Icon/Icon.tsx +2 -2
  156. package/src/components/Input/Input.stories.tsx +12 -11
  157. package/src/components/Input/Input.tsx +12 -27
  158. package/src/components/Link/Link.stories.tsx +2 -2
  159. package/src/components/Link/Link.tsx +1 -1
  160. package/src/components/List/List.stories.tsx +18 -14
  161. package/src/components/List/List.tsx +8 -14
  162. package/src/components/List/Tree.stories.tsx +2 -2
  163. package/src/components/List/Treegrid.stories.tsx +2 -2
  164. package/src/components/List/Treegrid.tsx +4 -9
  165. package/src/components/Main/Main.stories.tsx +41 -20
  166. package/src/components/Main/Main.tsx +128 -71
  167. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +2 -2
  168. package/src/components/{Menus → Menu}/ContextMenu.tsx +7 -31
  169. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +2 -2
  170. package/src/components/{Menus → Menu}/DropdownMenu.tsx +65 -63
  171. package/src/components/Message/Message.stories.tsx +3 -3
  172. package/src/components/Message/Message.tsx +32 -23
  173. package/src/components/Popover/Popover.stories.tsx +2 -2
  174. package/src/components/Popover/Popover.tsx +38 -36
  175. package/src/components/ScrollArea/ScrollArea.stories.tsx +166 -40
  176. package/src/components/ScrollArea/ScrollArea.tsx +80 -82
  177. package/src/components/ScrollArea/index.ts +1 -1
  178. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +2 -2
  179. package/src/components/ScrollContainer/ScrollContainer.tsx +14 -9
  180. package/src/components/Select/Select.stories.tsx +2 -2
  181. package/src/components/Select/Select.tsx +9 -25
  182. package/src/components/Separator/Separator.tsx +1 -1
  183. package/src/components/Skeleton/Skeleton.stories.tsx +52 -0
  184. package/src/components/Skeleton/Skeleton.tsx +26 -0
  185. package/src/components/Skeleton/index.ts +5 -0
  186. package/src/components/Splitter/Splitter.stories.tsx +73 -0
  187. package/src/components/Splitter/Splitter.tsx +123 -0
  188. package/src/components/Splitter/index.ts +5 -0
  189. package/src/components/Status/Status.stories.tsx +2 -2
  190. package/src/components/Status/Status.tsx +2 -2
  191. package/src/components/Tag/Tag.stories.tsx +4 -4
  192. package/src/components/Tag/Tag.tsx +2 -7
  193. package/src/components/ThemeProvider/ThemeProvider.tsx +3 -4
  194. package/src/components/ThemeProvider/TranslationsProvider.tsx +1 -16
  195. package/src/components/ThemeProvider/index.ts +3 -3
  196. package/src/components/Toast/Toast.stories.tsx +2 -2
  197. package/src/components/Toast/Toast.tsx +6 -10
  198. package/src/components/Toolbar/Toolbar.stories.tsx +2 -2
  199. package/src/components/Toolbar/Toolbar.tsx +31 -12
  200. package/src/components/Tooltip/Tooltip.stories.tsx +2 -2
  201. package/src/components/Tooltip/Tooltip.tsx +24 -22
  202. package/src/components/index.ts +3 -1
  203. package/src/exemplars/generics.stories.tsx +44 -0
  204. package/src/exemplars/slot.stories.tsx +108 -0
  205. package/src/exemplars/tabster.stories.tsx +127 -0
  206. package/src/hooks/useDensityContext.ts +1 -1
  207. package/src/hooks/useElevationContext.ts +1 -1
  208. package/src/index.ts +2 -1
  209. package/src/playground/Controls.stories.tsx +3 -4
  210. package/src/playground/Custom.stories.tsx +2 -2
  211. package/src/playground/Typography.stories.tsx +2 -2
  212. package/src/primitives/Container/Container.stories.tsx +67 -0
  213. package/src/primitives/Container/Container.tsx +79 -0
  214. package/src/primitives/Container/Layout.stories.tsx +57 -0
  215. package/src/primitives/Container/Layout.tsx +61 -0
  216. package/src/primitives/Container/index.ts +6 -0
  217. package/src/primitives/Flex/Flex.tsx +26 -0
  218. package/src/primitives/Flex/index.ts +5 -0
  219. package/src/primitives/index.ts +6 -0
  220. package/src/testing/decorators/withLayout.tsx +22 -15
  221. package/src/testing/decorators/withLayoutVariants.tsx +2 -2
  222. package/src/testing/decorators/withTheme.tsx +21 -18
  223. package/src/util/index.ts +2 -2
  224. package/dist/lib/browser/chunk-BFCXP6YC.mjs +0 -4710
  225. package/dist/lib/browser/chunk-BFCXP6YC.mjs.map +0 -7
  226. package/dist/lib/node-esm/chunk-F4Z46DD6.mjs +0 -4712
  227. package/dist/lib/node-esm/chunk-F4Z46DD6.mjs.map +0 -7
  228. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  229. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  230. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  231. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  232. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  233. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  234. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  235. package/dist/types/src/util/domino.d.ts +0 -18
  236. package/dist/types/src/util/domino.d.ts.map +0 -1
  237. package/src/util/ThemedClassName.ts +0 -7
  238. package/src/util/domino.ts +0 -53
  239. /package/dist/types/src/components/{Menus → Menu}/ContextMenu.stories.d.ts +0 -0
  240. /package/dist/types/src/components/{Menus → Menu}/DropdownMenu.stories.d.ts +0 -0
  241. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  242. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -23,7 +23,7 @@ import {
23
23
  useListContext,
24
24
  useListItemContext,
25
25
  } from '@dxos/react-list';
26
- import { type Density } from '@dxos/react-ui-types';
26
+ import { type Density } from '@dxos/ui-types';
27
27
 
28
28
  import { useDensityContext, useThemeContext } from '../../hooks';
29
29
  import { type ThemedClassName } from '../../util';
@@ -40,7 +40,7 @@ const List = forwardRef<HTMLOListElement, ListProps>(({ classNames, children, ..
40
40
 
41
41
  return (
42
42
  <DensityProvider density={density}>
43
- <ListPrimitive {...props} className={tx('list.root', 'list', {}, classNames)} ref={forwardedRef}>
43
+ <ListPrimitive {...props} className={tx('list.root', {}, classNames)} ref={forwardedRef}>
44
44
  {children}
45
45
  </ListPrimitive>
46
46
  </DensityProvider>
@@ -58,7 +58,7 @@ const ListItemEndcap = forwardRef<HTMLDivElement, ListItemEndcapProps>(
58
58
  <Root
59
59
  {...(!asChild && { role: 'none' })}
60
60
  {...props}
61
- className={tx('list.item.endcap', 'list__listItem__endcap', { density }, classNames)}
61
+ className={tx('list.item.endcap', { density }, classNames)}
62
62
  ref={forwardedRef}
63
63
  >
64
64
  {children}
@@ -73,13 +73,7 @@ const MockListItemOpenTrigger = ({
73
73
  }: ThemedClassName<Omit<ComponentPropsWithoutRef<'div'>, 'children'>>) => {
74
74
  const density = useDensityContext();
75
75
  const { tx } = useThemeContext();
76
- return (
77
- <div
78
- role='none'
79
- {...props}
80
- className={tx('list.item.openTrigger', 'list__listItem__openTrigger--mock', { density }, classNames)}
81
- />
82
- );
76
+ return <div role='none' {...props} className={tx('list.item.openTrigger', { density }, classNames)} />;
83
77
  };
84
78
 
85
79
  type ListItemHeadingProps = ThemedClassName<ListPrimitiveItemHeadingProps>;
@@ -91,7 +85,7 @@ const ListItemHeading = forwardRef<HTMLParagraphElement, ListItemHeadingProps>(
91
85
  return (
92
86
  <ListPrimitiveItemHeading
93
87
  {...props}
94
- className={tx('list.item.heading', 'list__listItem__heading', { density }, classNames)}
88
+ className={tx('list.item.heading', { density }, classNames)}
95
89
  ref={forwardedRef}
96
90
  >
97
91
  {children}
@@ -110,14 +104,14 @@ const ListItemOpenTrigger = forwardRef<HTMLButtonElement, ListItemOpenTriggerPro
110
104
  return (
111
105
  <ListPrimitiveItemOpenTrigger
112
106
  {...props}
113
- className={tx('list.item.openTrigger', 'list__listItem__openTrigger', { density }, classNames)}
107
+ className={tx('list.item.openTrigger', { density }, classNames)}
114
108
  ref={forwardedRef}
115
109
  >
116
110
  {children || (
117
111
  <Icon
118
112
  size={3}
119
113
  icon={open ? 'ph--caret-down--bold' : 'ph--caret-right--bold'}
120
- classNames={tx('list.item.openTriggerIcon', 'list__listItem__openTrigger__icon', {})}
114
+ classNames={tx('list.item.openTriggerIcon', {})}
121
115
  />
122
116
  )}
123
117
  </ListPrimitiveItemOpenTrigger>
@@ -134,7 +128,7 @@ const ListItemRoot = forwardRef<HTMLLIElement, ListItemRootProps>(
134
128
  return (
135
129
  <ListPrimitiveItem
136
130
  {...props}
137
- className={tx('list.item.root', 'list__listItem', { density, collapsible: props.collapsible }, classNames)}
131
+ className={tx('list.item.root', { density, collapsible: props.collapsible }, classNames)}
138
132
  ref={forwardedRef}
139
133
  >
140
134
  {children}
@@ -56,10 +56,10 @@ const DefaultStory = ({ data }: StorybookTreeProps) => {
56
56
  };
57
57
 
58
58
  const meta = {
59
- title: 'ui/react-ui-core/Tree',
59
+ title: 'ui/react-ui-core/components/Tree',
60
60
  component: Tree as any,
61
61
  render: DefaultStory,
62
- decorators: [withTheme],
62
+ decorators: [withTheme()],
63
63
  } satisfies Meta<typeof DefaultStory>;
64
64
 
65
65
  export default meta;
@@ -144,10 +144,10 @@ const DefaultStory = () => {
144
144
  };
145
145
 
146
146
  const meta = {
147
- title: 'ui/react-ui-core/Treegrid',
147
+ title: 'ui/react-ui-core/components/Treegrid',
148
148
  component: Treegrid.Root as any,
149
149
  render: DefaultStory,
150
- decorators: [withTheme],
150
+ decorators: [withTheme()],
151
151
  } satisfies Meta<typeof DefaultStory>;
152
152
 
153
153
  export default meta;
@@ -97,10 +97,10 @@ const TreegridRoot = forwardRef<HTMLDivElement, TreegridRootProps>(
97
97
  return (
98
98
  <Root
99
99
  role='treegrid'
100
- onKeyDown={handleKeyDown}
101
100
  {...props}
102
- className={tx('treegrid.root', 'treegrid', {}, classNames)}
101
+ className={tx('treegrid.root', {}, classNames)}
103
102
  style={{ ...style, gridTemplateColumns }}
103
+ onKeyDown={handleKeyDown}
104
104
  ref={forwardedRef}
105
105
  >
106
106
  {children}
@@ -149,7 +149,7 @@ const TreegridRow = forwardRef<HTMLDivElement, TreegridRowScopedProps<TreegridRo
149
149
  <Root
150
150
  role='row'
151
151
  aria-level={level}
152
- className={tx('treegrid.row', 'treegrid__row', { level }, classNames)}
152
+ className={tx('treegrid.row', { level }, classNames)}
153
153
  {...(parentOf && { 'aria-expanded': open, 'aria-owns': parentOf })}
154
154
  {...props}
155
155
  id={id}
@@ -168,12 +168,7 @@ const TreegridCell = forwardRef<HTMLDivElement, TreegridCellProps>(
168
168
  ({ classNames, children, indent, ...props }, forwardedRef) => {
169
169
  const { tx } = useThemeContext();
170
170
  return (
171
- <div
172
- role='gridcell'
173
- className={tx('treegrid.cell', 'treegrid__cell', { indent }, classNames)}
174
- {...props}
175
- ref={forwardedRef}
176
- >
171
+ <div role='gridcell' className={tx('treegrid.cell', { indent }, classNames)} {...props} ref={forwardedRef}>
177
172
  {children}
178
173
  </div>
179
174
  );
@@ -5,51 +5,72 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React from 'react';
7
7
 
8
- import { withTheme } from '../../testing';
9
- import { Button } from '../Button';
8
+ import { withLayout, withTheme } from '../../testing';
9
+ import { IconButton } from '../Button';
10
+ import { Toolbar } from '../Toolbar';
10
11
 
11
12
  import { Main, useSidebars } from './Main';
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
69
  const meta = {
49
- title: 'ui/react-ui-core/Main',
70
+ title: 'ui/react-ui-core/components/Main',
50
71
  component: Main.Root,
51
72
  render: DefaultStory,
52
- decorators: [withTheme],
73
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
53
74
  parameters: {
54
75
  layout: 'fullscreen',
55
76
  chromatic: {
@@ -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';
@@ -33,9 +35,17 @@ import { useSwipeToDismiss } from './useSwipeToDismiss';
33
35
 
34
36
  const MAIN_NAME = 'Main';
35
37
  const MAIN_ROOT_NAME = 'MainRoot';
38
+ const MAIN_OVERLAY_NAME = 'MainOverlay';
36
39
  const NAVIGATION_SIDEBAR_NAME = 'NavigationSidebar';
37
40
  const COMPLEMENTARY_SIDEBAR_NAME = 'ComplementarySidebar';
38
- const GENERIC_CONSUMER_NAME = 'GenericConsumer';
41
+
42
+ const handleOpenAutoFocus = (event: Event) => {
43
+ !document.body.hasAttribute('data-is-keyboard') && event.preventDefault();
44
+ };
45
+
46
+ //
47
+ // Landmark
48
+ //
39
49
 
40
50
  const landmarkAttr = 'data-main-landmark';
41
51
 
@@ -67,40 +77,54 @@ const useLandmarkMover = (propsOnKeyDown: ComponentPropsWithoutRef<'div'>['onKey
67
77
  const focusableGroupAttrs = useFocusableGroup({ tabBehavior: 'limited', ignoreDefaultKeydown: { Tab: true } });
68
78
 
69
79
  return {
70
- onKeyDown: handleKeyDown,
71
80
  [landmarkAttr]: landmark,
72
81
  tabIndex: 0,
82
+ onKeyDown: handleKeyDown,
73
83
  ...focusableGroupAttrs,
74
84
  };
75
85
  };
76
86
 
87
+ //
88
+ // Context
89
+ //
90
+
91
+ // TODO(burdon): Define collapsed state.
77
92
  type SidebarState = 'expanded' | 'collapsed' | 'closed';
78
93
 
79
94
  type MainContextValue = {
80
95
  resizing: boolean;
96
+
97
+ // Navigation
81
98
  navigationSidebarState: SidebarState;
82
99
  setNavigationSidebarState: Dispatch<SetStateAction<SidebarState | undefined>>;
100
+
101
+ // Complementary
83
102
  complementarySidebarState: SidebarState;
84
103
  setComplementarySidebarState: Dispatch<SetStateAction<SidebarState | undefined>>;
85
104
  };
86
105
 
87
106
  const [MainProvider, useMainContext] = createContext<MainContextValue>(MAIN_NAME, {
88
107
  resizing: false,
108
+
89
109
  navigationSidebarState: 'closed',
90
110
  setNavigationSidebarState: (_nextState) => {
91
- // TODO(burdon): Standardize with other context missing errors using raise.
92
- log.warn('Attempt to set sidebar state without initializing `MainRoot`');
111
+ log.warn('Not initialized');
93
112
  },
113
+
94
114
  complementarySidebarState: 'closed',
95
115
  setComplementarySidebarState: (_nextState) => {
96
- // TODO(burdon): Standardize with other context missing errors using raise.
97
- log.warn('Attempt to set sidebar state without initializing `MainRoot`');
116
+ log.warn('Not initialized');
98
117
  },
99
118
  });
100
119
 
101
- const useSidebars = (consumerName = GENERIC_CONSUMER_NAME) => {
102
- const { setNavigationSidebarState, navigationSidebarState, setComplementarySidebarState, complementarySidebarState } =
103
- useMainContext(consumerName);
120
+ const useSidebars = (consumerName: string) => {
121
+ const {
122
+ navigationSidebarState,
123
+ setNavigationSidebarState,
124
+
125
+ complementarySidebarState,
126
+ setComplementarySidebarState,
127
+ } = useMainContext(consumerName);
104
128
 
105
129
  return {
106
130
  navigationSidebarState,
@@ -112,6 +136,7 @@ const useSidebars = (consumerName = GENERIC_CONSUMER_NAME) => {
112
136
  openNavigationSidebar: useCallback(() => setNavigationSidebarState('expanded'), []),
113
137
  collapseNavigationSidebar: useCallback(() => setNavigationSidebarState('collapsed'), []),
114
138
  closeNavigationSidebar: useCallback(() => setNavigationSidebarState('closed'), []),
139
+
115
140
  complementarySidebarState,
116
141
  setComplementarySidebarState,
117
142
  toggleComplementarySidebar: useCallback(
@@ -124,24 +149,29 @@ const useSidebars = (consumerName = GENERIC_CONSUMER_NAME) => {
124
149
  };
125
150
  };
126
151
 
152
+ //
153
+ // Root
154
+ //
155
+
127
156
  type MainRootProps = PropsWithChildren<{
128
157
  navigationSidebarState?: SidebarState;
129
158
  defaultNavigationSidebarState?: SidebarState;
130
159
  onNavigationSidebarStateChange?: (nextState: SidebarState) => void;
160
+
131
161
  complementarySidebarState?: SidebarState;
132
162
  defaultComplementarySidebarState?: SidebarState;
133
163
  onComplementarySidebarStateChange?: (nextState: SidebarState) => void;
134
164
  }>;
135
165
 
136
- const resizeDebounce = 3000;
137
-
138
166
  const MainRoot = ({
139
167
  navigationSidebarState: propsNavigationSidebarState,
140
- defaultNavigationSidebarState,
168
+ defaultNavigationSidebarState = 'closed',
141
169
  onNavigationSidebarStateChange,
170
+
142
171
  complementarySidebarState: propsComplementarySidebarState,
143
- defaultComplementarySidebarState,
172
+ defaultComplementarySidebarState = 'closed',
144
173
  onComplementarySidebarStateChange,
174
+
145
175
  children,
146
176
  ...props
147
177
  }: MainRootProps) => {
@@ -161,22 +191,21 @@ const MainRoot = ({
161
191
 
162
192
  const [resizing, setResizing] = useState(false);
163
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
+ }
164
201
 
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]);
202
+ resizeInterval.current = setTimeout(() => {
203
+ setResizing(false);
204
+ resizeInterval.current = null;
205
+ }, 3_000);
206
+ }),
207
+ [],
208
+ );
180
209
 
181
210
  return (
182
211
  <MainProvider
@@ -196,9 +225,45 @@ const MainRoot = ({
196
225
 
197
226
  MainRoot.displayName = MAIN_ROOT_NAME;
198
227
 
199
- const handleOpenAutoFocus = (event: Event) => {
200
- !document.body.hasAttribute('data-is-keyboard') && event.preventDefault();
201
- };
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
+ //
202
267
 
203
268
  type MainSidebarProps = ThemedClassName<ComponentPropsWithRef<typeof DialogContent>> & {
204
269
  swipeToDismiss?: boolean;
@@ -219,9 +284,11 @@ const MainSidebar = forwardRef<HTMLDivElement, MainSidebarProps>(
219
284
  const { t } = useTranslation();
220
285
  const ref = useForwardedRef(forwardedRef);
221
286
  const noopRef = useRef(null);
287
+
222
288
  useSwipeToDismiss(swipeToDismiss ? ref : noopRef, {
223
289
  onDismiss: () => onStateChange?.('closed'),
224
290
  });
291
+
225
292
  // NOTE(thure): This is a workaround for something further down the tree grabbing focus on Escape. Adding this
226
293
  // intervention to `Tabs.Root` or `Tabs.Tabpenel` instances is somehow ineffectual.
227
294
  const handleKeyDown = useCallback(
@@ -236,6 +303,7 @@ const MainSidebar = forwardRef<HTMLDivElement, MainSidebarProps>(
236
303
  },
237
304
  [props.onKeyDown],
238
305
  );
306
+
239
307
  const Root = isLg ? Primitive.div : DialogContent;
240
308
 
241
309
  return (
@@ -243,13 +311,13 @@ const MainSidebar = forwardRef<HTMLDivElement, MainSidebarProps>(
243
311
  {!isLg && <DialogTitle className='sr-only'>{toLocalizedString(label, t)}</DialogTitle>}
244
312
  <Root
245
313
  {...(!isLg && { forceMount: true, tabIndex: -1, onOpenAutoFocus: onOpenAutoFocus ?? handleOpenAutoFocus })}
314
+ {...(state === 'closed' && { inert: true })}
246
315
  {...props}
247
316
  data-side={side === 'inline-end' ? 'ie' : 'is'}
248
317
  data-state={state}
249
318
  data-resizing={resizing ? 'true' : 'false'}
250
- className={tx('main.sidebar', 'main__sidebar', {}, classNames)}
319
+ className={tx('main.sidebar', {}, classNames)}
251
320
  onKeyDownCapture={handleKeyDown}
252
- {...(state === 'closed' && { inert: true })}
253
321
  ref={ref}
254
322
  >
255
323
  {children}
@@ -259,6 +327,10 @@ const MainSidebar = forwardRef<HTMLDivElement, MainSidebarProps>(
259
327
  },
260
328
  );
261
329
 
330
+ //
331
+ // Navigation Sidebar
332
+ //
333
+
262
334
  type MainNavigationSidebarProps = Omit<MainSidebarProps, 'expanded' | 'side'>;
263
335
 
264
336
  const MainNavigationSidebar = forwardRef<HTMLDivElement, MainNavigationSidebarProps>((props, forwardedRef) => {
@@ -280,6 +352,10 @@ const MainNavigationSidebar = forwardRef<HTMLDivElement, MainNavigationSidebarPr
280
352
 
281
353
  MainNavigationSidebar.displayName = NAVIGATION_SIDEBAR_NAME;
282
354
 
355
+ //
356
+ // Complementary Sidebar
357
+ //
358
+
283
359
  type MainComplementarySidebarProps = Omit<MainSidebarProps, 'expanded' | 'side'>;
284
360
 
285
361
  const MainComplementarySidebar = forwardRef<HTMLDivElement, MainComplementarySidebarProps>((props, forwardedRef) => {
@@ -300,20 +376,24 @@ const MainComplementarySidebar = forwardRef<HTMLDivElement, MainComplementarySid
300
376
  );
301
377
  });
302
378
 
303
- MainNavigationSidebar.displayName = NAVIGATION_SIDEBAR_NAME;
379
+ MainComplementarySidebar.displayName = COMPLEMENTARY_SIDEBAR_NAME;
304
380
 
305
- type MainProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.div>> & {
306
- asChild?: boolean;
307
- bounce?: boolean;
308
- handlesFocus?: boolean;
309
- };
381
+ //
382
+ // Content
383
+ //
384
+
385
+ type MainContentProps = ThemedClassName<
386
+ ComponentPropsWithRef<typeof Primitive.div> &
387
+ MainStyleProps & {
388
+ asChild?: boolean;
389
+ }
390
+ >;
310
391
 
311
- const MainContent = forwardRef<HTMLDivElement, MainProps>(
312
- ({ asChild, classNames, bounce, handlesFocus, children, role, ...props }: MainProps, forwardedRef) => {
392
+ const MainContent = forwardRef<HTMLDivElement, MainContentProps>(
393
+ ({ asChild, classNames, bounce, handlesFocus, children, role, ...props }: MainContentProps, forwardedRef) => {
313
394
  const { navigationSidebarState, complementarySidebarState } = useMainContext(MAIN_NAME);
314
395
  const { tx } = useThemeContext();
315
396
  const Root = asChild ? Slot : role ? 'div' : 'main';
316
-
317
397
  const mover = useLandmarkMover(props.onKeyDown, '1');
318
398
 
319
399
  return (
@@ -324,7 +404,7 @@ const MainContent = forwardRef<HTMLDivElement, MainProps>(
324
404
  data-sidebar-inline-start-state={navigationSidebarState}
325
405
  data-sidebar-inline-end-state={complementarySidebarState}
326
406
  data-handles-focus={handlesFocus}
327
- className={tx('main.content', 'main', { bounce, handlesFocus }, classNames)}
407
+ className={tx('main.content', { bounce, handlesFocus }, classNames)}
328
408
  ref={forwardedRef}
329
409
  >
330
410
  {children}
@@ -335,41 +415,18 @@ const MainContent = forwardRef<HTMLDivElement, MainProps>(
335
415
 
336
416
  MainContent.displayName = MAIN_NAME;
337
417
 
338
- type MainOverlayProps = ThemedClassName<Omit<ComponentPropsWithRef<typeof Primitive.div>, 'children'>>;
339
-
340
- const MainOverlay = forwardRef<HTMLDivElement, MainOverlayProps>(({ classNames, ...props }, forwardedRef) => {
341
- const [isLg] = useMediaQuery('lg');
342
- const { navigationSidebarState, setNavigationSidebarState, complementarySidebarState, setComplementarySidebarState } =
343
- useMainContext(MAIN_NAME);
344
- const { tx } = useThemeContext();
345
- return (
346
- <div
347
- onClick={() => {
348
- setNavigationSidebarState('collapsed');
349
- setComplementarySidebarState('collapsed');
350
- }}
351
- {...props}
352
- className={tx(
353
- 'main.overlay',
354
- 'main__overlay',
355
- { isLg, inlineStartSidebarOpen: navigationSidebarState, inlineEndSidebarOpen: complementarySidebarState },
356
- classNames,
357
- )}
358
- data-state={navigationSidebarState === 'expanded' || complementarySidebarState === 'expanded' ? 'open' : 'closed'}
359
- aria-hidden='true'
360
- ref={forwardedRef}
361
- />
362
- );
363
- });
418
+ //
419
+ // Main
420
+ //
364
421
 
365
422
  export const Main = {
366
423
  Root: MainRoot,
367
- Content: MainContent,
368
424
  Overlay: MainOverlay,
425
+ Content: MainContent,
369
426
  NavigationSidebar: MainNavigationSidebar,
370
427
  ComplementarySidebar: MainComplementarySidebar,
371
428
  };
372
429
 
373
430
  export { useMainContext, useSidebars, useLandmarkMover };
374
431
 
375
- export type { MainRootProps, MainProps, MainOverlayProps, MainNavigationSidebarProps, SidebarState };
432
+ export type { MainRootProps, MainOverlayProps, MainContentProps, 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;