@dxos/react-ui 0.8.3 → 0.8.4-main.1da679c

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 (204) hide show
  1. package/dist/lib/browser/{chunk-WXW6KSRL.mjs → chunk-Y4PW3CX2.mjs} +186 -160
  2. package/dist/lib/browser/chunk-Y4PW3CX2.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +4 -2
  4. package/dist/lib/browser/index.mjs.map +2 -2
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +6 -7
  7. package/dist/lib/browser/testing/index.mjs.map +3 -3
  8. package/dist/lib/node-esm/{chunk-EQ7EG74H.mjs → chunk-L6LIOSFT.mjs} +186 -160
  9. package/dist/lib/node-esm/chunk-L6LIOSFT.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +4 -2
  11. package/dist/lib/node-esm/index.mjs.map +2 -2
  12. package/dist/lib/node-esm/meta.json +1 -1
  13. package/dist/lib/node-esm/testing/index.mjs +6 -7
  14. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  15. package/dist/types/src/components/Avatars/Avatar.d.ts +1 -1
  16. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  17. package/dist/types/src/components/Avatars/Avatar.stories.d.ts +5 -25
  18. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  19. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts +5 -5
  20. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  21. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts +1 -1
  22. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  23. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts +8 -14
  24. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  25. package/dist/types/src/components/Buttons/Button.d.ts.map +1 -1
  26. package/dist/types/src/components/Buttons/Button.stories.d.ts +14 -3
  27. package/dist/types/src/components/Buttons/Button.stories.d.ts.map +1 -1
  28. package/dist/types/src/components/Buttons/IconButton.d.ts +2 -2
  29. package/dist/types/src/components/Buttons/IconButton.d.ts.map +1 -1
  30. package/dist/types/src/components/Buttons/IconButton.stories.d.ts +6 -9
  31. package/dist/types/src/components/Buttons/IconButton.stories.d.ts.map +1 -1
  32. package/dist/types/src/components/Buttons/Toggle.stories.d.ts +5 -5
  33. package/dist/types/src/components/Buttons/Toggle.stories.d.ts.map +1 -1
  34. package/dist/types/src/components/Buttons/ToggleGroup.d.ts +5 -2
  35. package/dist/types/src/components/Buttons/ToggleGroup.d.ts.map +1 -1
  36. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts +5 -7
  37. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts.map +1 -1
  38. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  39. package/dist/types/src/components/Clipboard/CopyButton.d.ts +4 -5
  40. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  41. package/dist/types/src/components/Clipboard/index.d.ts +2 -3
  42. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  43. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  44. package/dist/types/src/components/Dialogs/AlertDialog.d.ts +1 -1
  45. package/dist/types/src/components/Dialogs/AlertDialog.d.ts.map +1 -1
  46. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts +7 -33
  47. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts.map +1 -1
  48. package/dist/types/src/components/Dialogs/Dialog.d.ts +1 -1
  49. package/dist/types/src/components/Dialogs/Dialog.d.ts.map +1 -1
  50. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts +6 -28
  51. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts.map +1 -1
  52. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  53. package/dist/types/src/components/Input/Input.d.ts +2 -2
  54. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  55. package/dist/types/src/components/Input/Input.stories.d.ts +15 -10
  56. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  57. package/dist/types/src/components/Link/Link.stories.d.ts +12 -6
  58. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  59. package/dist/types/src/components/Lists/List.d.ts +2 -2
  60. package/dist/types/src/components/Lists/List.d.ts.map +1 -1
  61. package/dist/types/src/components/Lists/List.stories.d.ts +8 -25
  62. package/dist/types/src/components/Lists/List.stories.d.ts.map +1 -1
  63. package/dist/types/src/components/Lists/Tree.d.ts +1 -1
  64. package/dist/types/src/components/Lists/Tree.d.ts.map +1 -1
  65. package/dist/types/src/components/Lists/Tree.stories.d.ts +6 -26
  66. package/dist/types/src/components/Lists/Tree.stories.d.ts.map +1 -1
  67. package/dist/types/src/components/Lists/Treegrid.d.ts +1 -1
  68. package/dist/types/src/components/Lists/Treegrid.d.ts.map +1 -1
  69. package/dist/types/src/components/Lists/Treegrid.stories.d.ts +6 -4
  70. package/dist/types/src/components/Lists/Treegrid.stories.d.ts.map +1 -1
  71. package/dist/types/src/components/Main/Main.d.ts +1 -1
  72. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  73. package/dist/types/src/components/Main/Main.stories.d.ts +6 -6
  74. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  75. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +1 -1
  76. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts +6 -38
  77. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +1 -1
  78. package/dist/types/src/components/Menus/DropdownMenu.d.ts +5 -4
  79. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +1 -1
  80. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts +6 -35
  81. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +1 -1
  82. package/dist/types/src/components/Message/Message.d.ts +1 -1
  83. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  84. package/dist/types/src/components/Message/Message.stories.d.ts +7 -15
  85. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  86. package/dist/types/src/components/Popover/Popover.d.ts +2 -2
  87. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  88. package/dist/types/src/components/Popover/Popover.stories.d.ts +6 -28
  89. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  90. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +1 -1
  91. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  92. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +6 -26
  93. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  94. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  95. package/dist/types/src/components/Select/Select.stories.d.ts +5 -4
  96. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  97. package/dist/types/src/components/Status/Status.stories.d.ts +2 -2
  98. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  99. package/dist/types/src/components/Tag/Tag.stories.d.ts +6 -6
  100. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  101. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +2 -2
  102. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  103. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -1
  104. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  105. package/dist/types/src/components/ThemeProvider/index.d.ts +1 -1
  106. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  107. package/dist/types/src/components/Toast/Toast.d.ts +1 -1
  108. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  109. package/dist/types/src/components/Toast/Toast.stories.d.ts +6 -38
  110. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  111. package/dist/types/src/components/Toolbar/Toolbar.d.ts +1 -1
  112. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  113. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +6 -44
  114. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  115. package/dist/types/src/components/Tooltip/Tooltip.d.ts +1 -1
  116. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  117. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +8 -55
  118. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  119. package/dist/types/src/index.d.ts +1 -1
  120. package/dist/types/src/index.d.ts.map +1 -1
  121. package/dist/types/src/playground/Controls.stories.d.ts +5 -3
  122. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  123. package/dist/types/src/playground/Custom.stories.d.ts +12 -3
  124. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  125. package/dist/types/src/playground/Typography.stories.d.ts +5 -5
  126. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  127. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  128. package/dist/types/src/util/index.d.ts +1 -1
  129. package/dist/types/src/util/index.d.ts.map +1 -1
  130. package/dist/types/tsconfig.tsbuildinfo +1 -1
  131. package/package.json +17 -15
  132. package/src/components/Avatars/Avatar.stories.tsx +19 -8
  133. package/src/components/Avatars/Avatar.tsx +3 -3
  134. package/src/components/Avatars/AvatarGroup.stories.tsx +11 -4
  135. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +16 -8
  136. package/src/components/Breadcrumb/Breadcrumb.tsx +3 -3
  137. package/src/components/Buttons/Button.stories.tsx +8 -7
  138. package/src/components/Buttons/Button.tsx +1 -0
  139. package/src/components/Buttons/IconButton.stories.tsx +11 -5
  140. package/src/components/Buttons/IconButton.tsx +5 -4
  141. package/src/components/Buttons/Toggle.stories.tsx +12 -6
  142. package/src/components/Buttons/ToggleGroup.stories.tsx +13 -7
  143. package/src/components/Buttons/ToggleGroup.tsx +17 -4
  144. package/src/components/Clipboard/ClipboardProvider.tsx +1 -1
  145. package/src/components/Clipboard/CopyButton.tsx +13 -14
  146. package/src/components/DensityProvider/DensityProvider.tsx +1 -1
  147. package/src/components/Dialogs/AlertDialog.stories.tsx +14 -8
  148. package/src/components/Dialogs/AlertDialog.tsx +13 -13
  149. package/src/components/Dialogs/Dialog.stories.tsx +11 -11
  150. package/src/components/Dialogs/Dialog.tsx +13 -13
  151. package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
  152. package/src/components/Input/Input.stories.tsx +12 -11
  153. package/src/components/Input/Input.tsx +13 -13
  154. package/src/components/Link/Link.stories.tsx +11 -4
  155. package/src/components/Lists/List.stories.tsx +20 -14
  156. package/src/components/Lists/List.tsx +15 -16
  157. package/src/components/Lists/Tree.stories.tsx +11 -5
  158. package/src/components/Lists/Tree.tsx +4 -3
  159. package/src/components/Lists/TreeDropIndicator.tsx +1 -1
  160. package/src/components/Lists/Treegrid.stories.tsx +12 -6
  161. package/src/components/Lists/Treegrid.tsx +2 -2
  162. package/src/components/Main/Main.stories.tsx +14 -6
  163. package/src/components/Main/Main.tsx +15 -9
  164. package/src/components/Menus/ContextMenu.stories.tsx +11 -5
  165. package/src/components/Menus/ContextMenu.tsx +1 -0
  166. package/src/components/Menus/DropdownMenu.stories.tsx +11 -5
  167. package/src/components/Menus/DropdownMenu.tsx +21 -11
  168. package/src/components/Message/Message.stories.tsx +11 -5
  169. package/src/components/Message/Message.tsx +1 -1
  170. package/src/components/Popover/Popover.stories.tsx +11 -5
  171. package/src/components/Popover/Popover.tsx +8 -8
  172. package/src/components/ScrollArea/ScrollArea.stories.tsx +11 -5
  173. package/src/components/ScrollArea/ScrollArea.tsx +4 -4
  174. package/src/components/Select/Select.stories.tsx +14 -9
  175. package/src/components/Select/Select.tsx +5 -5
  176. package/src/components/Status/Status.stories.tsx +9 -3
  177. package/src/components/Tag/Tag.stories.tsx +13 -5
  178. package/src/components/ThemeProvider/ThemeProvider.tsx +4 -4
  179. package/src/components/ThemeProvider/TranslationsProvider.tsx +4 -4
  180. package/src/components/ThemeProvider/index.ts +3 -1
  181. package/src/components/Toast/Toast.stories.tsx +11 -5
  182. package/src/components/Toast/Toast.tsx +9 -9
  183. package/src/components/Toolbar/Toolbar.stories.tsx +20 -13
  184. package/src/components/Toolbar/Toolbar.tsx +3 -2
  185. package/src/components/Tooltip/Tooltip.stories.tsx +16 -9
  186. package/src/components/Tooltip/Tooltip.tsx +3 -3
  187. package/src/hooks/useSafeCollisionPadding.ts +1 -1
  188. package/src/index.ts +1 -1
  189. package/src/playground/Controls.stories.tsx +18 -13
  190. package/src/playground/Custom.stories.tsx +4 -4
  191. package/src/playground/Typography.stories.tsx +8 -3
  192. package/src/testing/decorators/withSurfaceVariantsLayout.tsx +1 -1
  193. package/src/testing/decorators/withTheme.ts +8 -5
  194. package/src/util/index.ts +1 -1
  195. package/README.yml +0 -1
  196. package/dist/lib/browser/chunk-WXW6KSRL.mjs.map +0 -7
  197. package/dist/lib/node/chunk-3E3QKWX4.cjs +0 -4363
  198. package/dist/lib/node/chunk-3E3QKWX4.cjs.map +0 -7
  199. package/dist/lib/node/index.cjs +0 -175
  200. package/dist/lib/node/index.cjs.map +0 -7
  201. package/dist/lib/node/meta.json +0 -1
  202. package/dist/lib/node/testing/index.cjs +0 -114
  203. package/dist/lib/node/testing/index.cjs.map +0 -7
  204. package/dist/lib/node-esm/chunk-EQ7EG74H.mjs.map +0 -7
@@ -4,12 +4,14 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
8
  import React from 'react';
8
9
 
9
- import { Main, useSidebars } from './Main';
10
10
  import { withTheme } from '../../testing';
11
11
  import { Button } from '../Buttons';
12
12
 
13
+ import { Main, useSidebars } from './Main';
14
+
13
15
  type StoryMainArgs = {};
14
16
 
15
17
  const NavigationSidebarToggle = () => {
@@ -45,15 +47,21 @@ const DefaultStory = (_args: StoryMainArgs) => {
45
47
  );
46
48
  };
47
49
 
48
- export default {
50
+ const meta = {
49
51
  title: 'ui/react-ui-core/Main',
50
52
  component: Main.Root,
51
53
  render: DefaultStory,
52
54
  decorators: [withTheme],
53
- parameters: { chromatic: { disableSnapshot: false } },
54
- };
55
+ parameters: {
56
+ chromatic: { disableSnapshot: false },
57
+ layout: 'fullscreen',
58
+ },
59
+ } satisfies Meta<typeof DefaultStory>;
60
+
61
+ export default meta;
62
+
63
+ type Story = StoryObj<typeof meta>;
55
64
 
56
- export const Default = {
65
+ export const Default: Story = {
57
66
  args: {},
58
- layout: 'fullscreen',
59
67
  };
@@ -3,32 +3,33 @@
3
3
  //
4
4
 
5
5
  import { createContext } from '@radix-ui/react-context';
6
- import { Root as DialogRoot, DialogContent, DialogTitle } from '@radix-ui/react-dialog';
6
+ import { DialogContent, Root as DialogRoot, DialogTitle } from '@radix-ui/react-dialog';
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
10
  import React, {
11
11
  type ComponentPropsWithRef,
12
+ type ComponentPropsWithoutRef,
12
13
  type Dispatch,
13
- forwardRef,
14
+ type KeyboardEvent,
14
15
  type PropsWithChildren,
15
16
  type SetStateAction,
17
+ forwardRef,
16
18
  useCallback,
17
19
  useEffect,
18
20
  useRef,
19
21
  useState,
20
- type KeyboardEvent,
21
- type ComponentPropsWithoutRef,
22
22
  } from 'react';
23
23
 
24
24
  import { log } from '@dxos/log';
25
- import { useMediaQuery, useForwardedRef } from '@dxos/react-hooks';
25
+ import { useForwardedRef, useMediaQuery } from '@dxos/react-hooks';
26
26
 
27
- import { useSwipeToDismiss } from './useSwipeToDismiss';
28
27
  import { useThemeContext } from '../../hooks';
29
28
  import { type ThemedClassName } from '../../util';
30
29
  import { type Label, toLocalizedString, useTranslation } from '../ThemeProvider';
31
30
 
31
+ import { useSwipeToDismiss } from './useSwipeToDismiss';
32
+
32
33
  const MAIN_ROOT_NAME = 'MainRoot';
33
34
  const NAVIGATION_SIDEBAR_NAME = 'NavigationSidebar';
34
35
  const COMPLEMENTARY_SIDEBAR_NAME = 'ComplementarySidebar';
@@ -71,18 +72,23 @@ const useLandmarkMover = (propsOnKeyDown: ComponentPropsWithoutRef<'div'>['onKey
71
72
  );
72
73
  const focusableGroupAttrs = window ? {} : { tabBehavior: 'limited', ignoreDefaultKeydown: { Tab: true } };
73
74
 
74
- return { onKeyDown: handleKeyDown, [landmarkAttr]: landmark, tabIndex: 0, ...focusableGroupAttrs };
75
+ return {
76
+ onKeyDown: handleKeyDown,
77
+ [landmarkAttr]: landmark,
78
+ tabIndex: 0,
79
+ ...focusableGroupAttrs,
80
+ };
75
81
  };
76
82
 
77
83
  const [MainProvider, useMainContext] = createContext<MainContextValue>(MAIN_NAME, {
78
84
  resizing: false,
79
85
  navigationSidebarState: 'closed',
80
- setNavigationSidebarState: (nextState) => {
86
+ setNavigationSidebarState: (_nextState) => {
81
87
  // TODO(burdon): Standardize with other context missing errors using raise.
82
88
  log.warn('Attempt to set sidebar state without initializing `MainRoot`');
83
89
  },
84
90
  complementarySidebarState: 'closed',
85
- setComplementarySidebarState: (nextState) => {
91
+ setComplementarySidebarState: (_nextState) => {
86
92
  // TODO(burdon): Standardize with other context missing errors using raise.
87
93
  log.warn('Attempt to set sidebar state without initializing `MainRoot`');
88
94
  },
@@ -4,11 +4,13 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
8
  import React from 'react';
8
9
 
9
- import { ContextMenu } from './ContextMenu';
10
10
  import { withTheme } from '../../testing';
11
11
 
12
+ import { ContextMenu } from './ContextMenu';
13
+
12
14
  const DefaultStory = () => {
13
15
  // NOTE(thure): Since long-tap will select text in some OSs, apply `select-none` to `ContextMenu.Trigger` where possible.
14
16
  return (
@@ -91,15 +93,19 @@ const DefaultStory = () => {
91
93
  );
92
94
  };
93
95
 
94
- export default {
96
+ const meta = {
95
97
  title: 'ui/react-ui-core/ContextMenu',
96
- component: ContextMenu,
98
+ component: ContextMenu.Root as any,
97
99
  render: DefaultStory,
98
100
  decorators: [withTheme],
99
101
  parameters: { chromatic: { disableSnapshot: false } },
100
- };
102
+ } satisfies Meta<typeof DefaultStory>;
103
+
104
+ export default meta;
105
+
106
+ type Story = StoryObj<typeof meta>;
101
107
 
102
- export const Default = {
108
+ export const Default: Story = {
103
109
  args: {},
104
110
  parameters: {
105
111
  chromatic: { delay: 1600 },
@@ -34,6 +34,7 @@ const ContextMenuContent = forwardRef<HTMLDivElement, ContextMenuContentProps>(
34
34
  return (
35
35
  <ContextMenuPrimitive.Content
36
36
  {...props}
37
+ data-arrow-keys='up down'
37
38
  collisionPadding={safeCollisionPadding}
38
39
  className={tx('menu.content', 'menu', { elevation }, classNames)}
39
40
  ref={forwardedRef}
@@ -4,12 +4,14 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
8
  import React, { useRef, useState } from 'react';
8
9
 
9
- import { DropdownMenu } from './DropdownMenu';
10
10
  import { withTheme } from '../../testing';
11
11
  import { Button } from '../Buttons';
12
12
 
13
+ import { DropdownMenu } from './DropdownMenu';
14
+
13
15
  const DefaultStory = () => {
14
16
  return (
15
17
  <DropdownMenu.Root defaultOpen>
@@ -91,15 +93,19 @@ const DefaultStory = () => {
91
93
  );
92
94
  };
93
95
 
94
- export default {
96
+ const meta = {
95
97
  title: 'ui/react-ui-core/DropdownMenu',
96
- component: DropdownMenu,
98
+ component: DropdownMenu.Root,
97
99
  render: DefaultStory,
98
100
  decorators: [withTheme],
99
101
  parameters: { chromatic: { disableSnapshot: false } },
100
- };
102
+ } satisfies Meta<typeof DefaultStory>;
103
+
104
+ export default meta;
105
+
106
+ type Story = StoryObj<typeof meta>;
101
107
 
102
- export const Default = {
108
+ export const Default: Story = {
103
109
  args: {},
104
110
  parameters: {
105
111
  chromatic: { delay: 1600 },
@@ -15,17 +15,17 @@ import { Primitive } from '@radix-ui/react-primitive';
15
15
  import { Slot } from '@radix-ui/react-slot';
16
16
  import { useControllableState } from '@radix-ui/react-use-controllable-state';
17
17
  import React, {
18
- type ReactNode,
19
- type FC,
20
- useRef,
21
- type ElementRef,
22
- useCallback,
23
- type ComponentPropsWithoutRef,
24
- forwardRef,
25
18
  type ComponentPropsWithRef,
26
- useEffect,
19
+ type ComponentPropsWithoutRef,
20
+ type ElementRef,
21
+ type FC,
27
22
  type MutableRefObject,
23
+ type ReactNode,
28
24
  type RefObject,
25
+ forwardRef,
26
+ useCallback,
27
+ useEffect,
28
+ useRef,
29
29
  } from 'react';
30
30
 
31
31
  import { useElevationContext, useThemeContext } from '../../hooks';
@@ -124,6 +124,7 @@ const DropdownMenuTrigger = forwardRef<DropdownMenuTriggerElement, DropdownMenuT
124
124
  disabled={disabled}
125
125
  {...triggerProps}
126
126
  ref={composeRefs(forwardedRef, context.triggerRef)}
127
+ data-arrow-keys='down'
127
128
  onPointerDown={composeEventHandlers(props.onPointerDown, (event) => {
128
129
  // only call handler if it's the left button (mousedown gets triggered by all mouse buttons)
129
130
  // but not when the control key is pressed (avoiding MacOS right click)
@@ -264,6 +265,7 @@ const DropdownMenuContent = forwardRef<DropdownMenuContentElement, DropdownMenuC
264
265
  hasInteractedOutsideRef.current = true;
265
266
  }
266
267
  })}
268
+ data-arrow-keys='up down'
267
269
  className={tx('menu.content', 'menu', { elevation }, classNames)}
268
270
  style={{
269
271
  ...props.style,
@@ -415,13 +417,21 @@ const RADIO_ITEM_NAME = 'DropdownMenuRadioItem';
415
417
 
416
418
  type DropdownMenuRadioItemElement = ElementRef<typeof MenuPrimitive.RadioItem>;
417
419
  type MenuRadioItemProps = ComponentPropsWithoutRef<typeof MenuPrimitive.RadioItem>;
418
- interface DropdownMenuRadioItemProps extends MenuRadioItemProps {}
420
+ type DropdownMenuRadioItemProps = ThemedClassName<MenuRadioItemProps>;
419
421
 
420
422
  const DropdownMenuRadioItem = forwardRef<DropdownMenuRadioItemElement, DropdownMenuRadioItemProps>(
421
423
  (props: ScopedProps<DropdownMenuRadioItemProps>, forwardedRef) => {
422
- const { __scopeDropdownMenu, ...radioItemProps } = props;
424
+ const { __scopeDropdownMenu, classNames, ...itemProps } = props;
423
425
  const menuScope = useMenuScope(__scopeDropdownMenu);
424
- return <MenuPrimitive.RadioItem {...menuScope} {...radioItemProps} ref={forwardedRef} />;
426
+ const { tx } = useThemeContext();
427
+ return (
428
+ <MenuPrimitive.Item
429
+ {...menuScope}
430
+ {...itemProps}
431
+ className={tx('menu.item', 'menu__item', {}, classNames)}
432
+ ref={forwardedRef}
433
+ />
434
+ );
425
435
  },
426
436
  );
427
437
 
@@ -4,13 +4,15 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
8
  import React from 'react';
8
9
 
9
10
  import { type MessageValence } from '@dxos/react-ui-types';
10
11
 
11
- import { Callout } from './Message';
12
12
  import { withTheme } from '../../testing';
13
13
 
14
+ import { Callout } from './Message';
15
+
14
16
  type StoryProps = {
15
17
  valence: MessageValence;
16
18
  title: string;
@@ -24,9 +26,9 @@ const DefaultStory = ({ valence, title, body }: StoryProps) => (
24
26
  </Callout.Root>
25
27
  );
26
28
 
27
- export default {
29
+ const meta = {
28
30
  title: 'ui/react-ui-core/Callout',
29
- component: Callout,
31
+ component: Callout.Root as any,
30
32
  render: DefaultStory,
31
33
  decorators: [withTheme],
32
34
  parameters: { chromatic: { disableSnapshot: false } },
@@ -36,9 +38,13 @@ export default {
36
38
  options: ['success', 'info', 'warning', 'error', 'neutral'],
37
39
  },
38
40
  },
39
- };
41
+ } satisfies Meta<typeof DefaultStory>;
42
+
43
+ export default meta;
44
+
45
+ type Story = StoryObj<typeof meta>;
40
46
 
41
- export const Default = {
47
+ export const Default: Story = {
42
48
  args: {
43
49
  valence: 'neutral',
44
50
  title: 'Alert title',
@@ -8,7 +8,7 @@ import { Slot } from '@radix-ui/react-slot';
8
8
  import React, { type ComponentPropsWithRef, forwardRef } from 'react';
9
9
 
10
10
  import { useId } from '@dxos/react-hooks';
11
- import { type MessageValence, type Elevation } from '@dxos/react-ui-types';
11
+ import { type Elevation, type MessageValence } from '@dxos/react-ui-types';
12
12
 
13
13
  import { useElevationContext, useThemeContext } from '../../hooks';
14
14
  import { type ThemedClassName } from '../../util';
@@ -4,14 +4,16 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
8
  import React, { type PropsWithChildren, type ReactNode, useRef, useState } from 'react';
8
9
 
9
10
  import { faker } from '@dxos/random';
10
11
 
11
- import { Popover } from './Popover';
12
12
  import { withTheme } from '../../testing';
13
13
  import { Button } from '../Buttons';
14
14
 
15
+ import { Popover } from './Popover';
16
+
15
17
  faker.seed(1234);
16
18
 
17
19
  const DefaultStory = ({ openTrigger, children }: PropsWithChildren<{ openTrigger: ReactNode }>) => {
@@ -28,15 +30,19 @@ const DefaultStory = ({ openTrigger, children }: PropsWithChildren<{ openTrigger
28
30
  );
29
31
  };
30
32
 
31
- export default {
33
+ const meta = {
32
34
  title: 'ui/react-ui-core/Popover',
33
- component: Popover,
35
+ component: Popover.Root,
34
36
  render: DefaultStory,
35
37
  decorators: [withTheme],
36
38
  parameters: { chromatic: { disableSnapshot: false } },
37
- };
39
+ } satisfies Meta<typeof DefaultStory>;
40
+
41
+ export default meta;
42
+
43
+ type Story = StoryObj<typeof meta>;
38
44
 
39
- export const Default = {
45
+ export const Default: Story = {
40
46
  args: {
41
47
  openTrigger: <Button>Open popover</Button>,
42
48
  children: faker.lorem.paragraphs(3),
@@ -7,7 +7,7 @@
7
7
  import { composeEventHandlers } from '@radix-ui/primitive';
8
8
  import { useComposedRefs } from '@radix-ui/react-compose-refs';
9
9
  import { createContextScope } from '@radix-ui/react-context';
10
- import type { Scope } from '@radix-ui/react-context';
10
+ import { type Scope } from '@radix-ui/react-context';
11
11
  import { DismissableLayer } from '@radix-ui/react-dismissable-layer';
12
12
  import { useFocusGuards } from '@radix-ui/react-focus-guards';
13
13
  import { FocusScope } from '@radix-ui/react-focus-scope';
@@ -22,17 +22,17 @@ import { useControllableState } from '@radix-ui/react-use-controllable-state';
22
22
  import { hideOthers } from 'aria-hidden';
23
23
  import React, {
24
24
  type ComponentPropsWithRef,
25
- forwardRef,
25
+ type ComponentPropsWithoutRef,
26
26
  type ElementRef,
27
- type RefObject,
27
+ type FC,
28
+ type MutableRefObject,
28
29
  type ReactNode,
29
- useRef,
30
+ type RefObject,
31
+ forwardRef,
30
32
  useCallback,
31
- type ComponentPropsWithoutRef,
32
- type FC,
33
- useState,
34
33
  useEffect,
35
- type MutableRefObject,
34
+ useRef,
35
+ useState,
36
36
  } from 'react';
37
37
  import { RemoveScroll } from 'react-remove-scroll';
38
38
 
@@ -4,14 +4,16 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
8
  import React, { type PropsWithChildren } from 'react';
8
9
 
9
10
  import { faker } from '@dxos/random';
10
11
  import { activeSurface, surfaceShadow } from '@dxos/react-ui-theme';
11
12
 
12
- import { ScrollArea } from './ScrollArea';
13
13
  import { withTheme } from '../../testing';
14
14
 
15
+ import { ScrollArea } from './ScrollArea';
16
+
15
17
  faker.seed(1234);
16
18
 
17
19
  const DefaultStory = ({ children }: PropsWithChildren<{}>) => {
@@ -33,15 +35,19 @@ const DefaultStory = ({ children }: PropsWithChildren<{}>) => {
33
35
  );
34
36
  };
35
37
 
36
- export default {
38
+ const meta = {
37
39
  title: 'ui/react-ui-core/Scroll area',
38
- component: ScrollArea,
40
+ component: ScrollArea as any,
39
41
  render: DefaultStory,
40
42
  decorators: [withTheme],
41
43
  parameters: { chromatic: { disableSnapshot: false } },
42
- };
44
+ } satisfies Meta<typeof DefaultStory>;
45
+
46
+ export default meta;
47
+
48
+ type Story = StoryObj<typeof meta>;
43
49
 
44
- export const Default = {
50
+ export const Default: Story = {
45
51
  args: {
46
52
  children: faker.lorem.paragraphs(5),
47
53
  },
@@ -3,16 +3,16 @@
3
3
  //
4
4
 
5
5
  import {
6
+ Corner as ScrollAreaPrimitiveCorner,
7
+ type ScrollAreaCornerProps as ScrollAreaPrimitiveCornerProps,
6
8
  Root as ScrollAreaPrimitiveRoot,
7
9
  type ScrollAreaProps as ScrollAreaPrimitiveRootProps,
8
- Viewport as ScrollAreaPrimitiveViewport,
9
- type ScrollAreaViewportProps as ScrollAreaPrimitiveViewportProps,
10
10
  Scrollbar as ScrollAreaPrimitiveScrollbar,
11
11
  type ScrollAreaScrollbarProps as ScrollAreaPrimitiveScrollbarProps,
12
12
  Thumb as ScrollAreaPrimitiveThumb,
13
13
  type ScrollAreaThumbProps as ScrollAreaPrimitiveThumbProps,
14
- Corner as ScrollAreaPrimitiveCorner,
15
- type ScrollAreaCornerProps as ScrollAreaPrimitiveCornerProps,
14
+ Viewport as ScrollAreaPrimitiveViewport,
15
+ type ScrollAreaViewportProps as ScrollAreaPrimitiveViewportProps,
16
16
  } from '@radix-ui/react-scroll-area';
17
17
  import React, { forwardRef } from 'react';
18
18
 
@@ -4,14 +4,15 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type StoryObj } from '@storybook/react';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
8
  import React, { useState } from 'react';
9
9
 
10
10
  import { faker } from '@dxos/random';
11
11
 
12
- import { Select } from './Select';
13
12
  import { withSurfaceVariantsLayout, withTheme } from '../../testing';
14
13
 
14
+ import { Select } from './Select';
15
+
15
16
  faker.seed(1234);
16
17
 
17
18
  type ItemProps = { id: string; text: string };
@@ -41,15 +42,19 @@ const DefaultStory = ({ items = [] }: StoryProps) => {
41
42
  );
42
43
  };
43
44
 
44
- export const Default: StoryObj<StoryProps> = {
45
- args: {
46
- items: Array.from({ length: 16 }).map((_, i) => ({ id: `item-${i}`, text: faker.lorem.word() })),
47
- },
48
- };
49
-
50
- export default {
45
+ const meta = {
51
46
  title: 'ui/react-ui-core/Select',
52
47
  render: DefaultStory,
53
48
  decorators: [withSurfaceVariantsLayout(), withTheme],
54
49
  parameters: { chromatic: { disableSnapshot: false } },
50
+ } satisfies Meta<typeof DefaultStory>;
51
+
52
+ export default meta;
53
+
54
+ type Story = StoryObj<typeof meta>;
55
+
56
+ export const Default: Story = {
57
+ args: {
58
+ items: Array.from({ length: 16 }).map((_, i) => ({ id: `item-${i}`, text: faker.lorem.word() })),
59
+ },
55
60
  };
@@ -2,7 +2,6 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { CaretDown, CaretUp } from '@phosphor-icons/react';
6
5
  import * as SelectPrimitive from '@radix-ui/react-select';
7
6
  import React, { forwardRef } from 'react';
8
7
 
@@ -36,14 +35,13 @@ type SelectTriggerButtonProps = Omit<ButtonProps, 'children'> & Pick<SelectValue
36
35
 
37
36
  const SelectTriggerButton = forwardRef<HTMLButtonElement, SelectTriggerButtonProps>(
38
37
  ({ children, placeholder, ...props }, forwardedRef) => {
39
- const { tx } = useThemeContext();
40
38
  return (
41
39
  <SelectPrimitive.Trigger asChild ref={forwardedRef}>
42
40
  <Button {...props}>
43
41
  <SelectPrimitive.Value placeholder={placeholder}>{children}</SelectPrimitive.Value>
44
42
  <span className='w-1 flex-1' />
45
43
  <SelectPrimitive.Icon asChild>
46
- <CaretDown className={tx('select.triggerIcon', 'select__trigger__icon', {})} weight='bold' />
44
+ <Icon size={3} icon='ph--caret-down--bold' />
47
45
  </SelectPrimitive.Icon>
48
46
  </Button>
49
47
  </SelectPrimitive.Trigger>
@@ -61,6 +59,7 @@ const SelectContent = forwardRef<HTMLDivElement, SelectContentProps>(
61
59
  return (
62
60
  <SelectPrimitive.Content
63
61
  {...props}
62
+ data-arrow-keys='up down'
64
63
  collisionPadding={safeCollisionPadding}
65
64
  className={tx('select.content', 'select__content', { elevation }, classNames)}
66
65
  position='popper'
@@ -83,7 +82,7 @@ const SelectScrollUpButton = forwardRef<HTMLDivElement, SelectScrollUpButtonProp
83
82
  className={tx('select.scrollButton', 'select__scroll-button--up', {}, classNames)}
84
83
  ref={forwardedRef}
85
84
  >
86
- {children ?? <CaretUp weight='bold' />}
85
+ {children ?? <Icon size={3} icon='ph--caret-up--bold' />}
87
86
  </SelectPrimitive.SelectScrollUpButton>
88
87
  );
89
88
  },
@@ -100,7 +99,7 @@ const SelectScrollDownButton = forwardRef<HTMLDivElement, SelectScrollDownButton
100
99
  className={tx('select.scrollButton', 'select__scroll-button--down', {}, classNames)}
101
100
  ref={forwardedRef}
102
101
  >
103
- {children ?? <CaretDown weight='bold' />}
102
+ {children ?? <Icon size={3} icon='ph--caret-down--bold' />}
104
103
  </SelectPrimitive.SelectScrollDownButton>
105
104
  );
106
105
  },
@@ -153,6 +152,7 @@ const SelectItemIndicator = forwardRef<HTMLDivElement, SelectItemIndicatorProps>
153
152
 
154
153
  type SelectOptionProps = SelectItemProps;
155
154
 
155
+ // TODO(burdon): Option to show icon on left/right.
156
156
  const SelectOption = forwardRef<HTMLDivElement, SelectItemProps>(({ children, classNames, ...props }, forwardedRef) => {
157
157
  const { tx } = useThemeContext();
158
158
  return (
@@ -4,17 +4,23 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
8
  import React from 'react';
8
9
 
9
- import { Status } from './Status';
10
10
  import { withTheme } from '../../testing';
11
11
 
12
- export default {
12
+ import { Status } from './Status';
13
+
14
+ const meta = {
13
15
  title: 'ui/react-ui-core/Status',
14
16
  component: Status,
15
17
  decorators: [withTheme],
16
18
  parameters: { chromatic: { disableSnapshot: false } },
17
- };
19
+ } satisfies Meta<typeof Status>;
20
+
21
+ export default meta;
22
+
23
+ type Story = StoryObj<typeof meta>;
18
24
 
19
25
  export const Normal = (props: any) => {
20
26
  return (
@@ -1,25 +1,29 @@
1
1
  //
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
+
5
+ import '@dxos-theme';
6
+
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
4
8
  import React from 'react';
5
9
 
6
10
  import { hues } from '@dxos/react-ui-theme';
7
- import '@dxos-theme';
8
11
  import { type ChromaticPalette, type MessageValence } from '@dxos/react-ui-types';
9
12
 
10
- import { Tag } from './Tag';
11
13
  import { withTheme } from '../../testing';
12
14
 
15
+ import { Tag } from './Tag';
16
+
13
17
  const palettes = ['neutral', 'success', 'info', 'warning', 'error', ...hues] as (ChromaticPalette | MessageValence)[];
14
18
 
15
- export default {
19
+ const meta = {
16
20
  title: 'ui/react-ui-core/Tag',
17
21
  component: Tag,
18
22
  decorators: [withTheme],
19
23
  parameters: { chromatic: { disableSnapshot: false } },
20
24
  } as const;
21
25
 
22
- export const Default = {
26
+ export const Default: Story = {
23
27
  render: () => (
24
28
  <div role='grid' className='grid grid-cols-5 gap-2 max-is-screen-md'>
25
29
  {palettes.map((palette) => (
@@ -29,4 +33,8 @@ export const Default = {
29
33
  ))}
30
34
  </div>
31
35
  ),
32
- };
36
+ } satisfies Meta<typeof Tag>;
37
+
38
+ export default meta;
39
+
40
+ type Story = StoryObj<typeof meta>;
@@ -3,17 +3,18 @@
3
3
  //
4
4
 
5
5
  import { createKeyborg } from 'keyborg';
6
- import React, { createContext, type PropsWithChildren, useEffect, useMemo } from 'react';
6
+ import React, { type PropsWithChildren, createContext, useEffect, useMemo } from 'react';
7
7
 
8
8
  import { type Density, type Elevation, type ThemeFunction } from '@dxos/react-ui-types';
9
9
 
10
- import { TranslationsProvider, type TranslationsProviderProps } from './TranslationsProvider';
11
10
  import { type SafeAreaPadding, useSafeArea } from '../../hooks';
12
11
  import { hasIosKeyboard } from '../../util';
13
12
  import { DensityProvider } from '../DensityProvider';
14
13
  import { ElevationProvider } from '../ElevationProvider';
15
14
 
16
- export type ThemeMode = 'light' | 'dark';
15
+ import { TranslationsProvider, type TranslationsProviderProps } from './TranslationsProvider';
16
+
17
+ export type ThemeMode = 'dark' | 'light';
17
18
 
18
19
  export type ThemeContextValue = {
19
20
  tx: ThemeFunction<any>;
@@ -54,7 +55,6 @@ export const ThemeProvider = ({
54
55
  }, []);
55
56
 
56
57
  const safeAreaPadding = useSafeArea();
57
-
58
58
  const contextValue = useMemo(
59
59
  () => ({ tx, themeMode, hasIosKeyboard: hasIosKeyboard(), safeAreaPadding, ...rest }),
60
60
  [tx, themeMode, safeAreaPadding, rest],