@dxos/react-ui 0.8.4-main.84f28bd → 0.8.4-main.ae835ea

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 (211) hide show
  1. package/dist/lib/browser/{chunk-T6YPS45E.mjs → chunk-HUZZ56DW.mjs} +323 -190
  2. package/dist/lib/browser/chunk-HUZZ56DW.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +7 -1
  4. package/dist/lib/browser/index.mjs.map +1 -1
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +54 -27
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/{chunk-TYVQJ4KW.mjs → chunk-OJLL6E2Z.mjs} +323 -190
  9. package/dist/lib/node-esm/chunk-OJLL6E2Z.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +7 -1
  11. package/dist/lib/node-esm/index.mjs.map +1 -1
  12. package/dist/lib/node-esm/meta.json +1 -1
  13. package/dist/lib/node-esm/testing/index.mjs +54 -27
  14. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  15. package/dist/types/src/components/Avatars/Avatar.d.ts +1 -1
  16. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  17. package/dist/types/src/components/Avatars/Avatar.stories.d.ts +5 -31
  18. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  19. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts +5 -11
  20. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  21. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts +1 -1
  22. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  23. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts +8 -20
  24. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  25. package/dist/types/src/components/Buttons/Button.d.ts +1 -1
  26. package/dist/types/src/components/Buttons/Button.d.ts.map +1 -1
  27. package/dist/types/src/components/Buttons/Button.stories.d.ts +9 -4
  28. package/dist/types/src/components/Buttons/Button.stories.d.ts.map +1 -1
  29. package/dist/types/src/components/Buttons/IconButton.d.ts +2 -2
  30. package/dist/types/src/components/Buttons/IconButton.d.ts.map +1 -1
  31. package/dist/types/src/components/Buttons/IconButton.stories.d.ts +6 -15
  32. package/dist/types/src/components/Buttons/IconButton.stories.d.ts.map +1 -1
  33. package/dist/types/src/components/Buttons/Toggle.stories.d.ts +5 -11
  34. package/dist/types/src/components/Buttons/Toggle.stories.d.ts.map +1 -1
  35. package/dist/types/src/components/Buttons/ToggleGroup.d.ts +7 -8
  36. package/dist/types/src/components/Buttons/ToggleGroup.d.ts.map +1 -1
  37. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts +7 -19
  38. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts.map +1 -1
  39. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  40. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  41. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  42. package/dist/types/src/components/Dialogs/AlertDialog.d.ts +1 -1
  43. package/dist/types/src/components/Dialogs/AlertDialog.d.ts.map +1 -1
  44. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts +7 -39
  45. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts.map +1 -1
  46. package/dist/types/src/components/Dialogs/Dialog.d.ts +1 -1
  47. package/dist/types/src/components/Dialogs/Dialog.d.ts.map +1 -1
  48. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts +6 -29
  49. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts.map +1 -1
  50. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  51. package/dist/types/src/components/Icon/Icon.d.ts +1 -1
  52. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  53. package/dist/types/src/components/Icon/Icon.stories.d.ts +17 -0
  54. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -0
  55. package/dist/types/src/components/Input/Input.d.ts +2 -4
  56. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  57. package/dist/types/src/components/Input/Input.stories.d.ts +10 -11
  58. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  59. package/dist/types/src/components/Link/Link.stories.d.ts +8 -8
  60. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  61. package/dist/types/src/components/Lists/List.d.ts +2 -2
  62. package/dist/types/src/components/Lists/List.d.ts.map +1 -1
  63. package/dist/types/src/components/Lists/List.stories.d.ts +8 -31
  64. package/dist/types/src/components/Lists/List.stories.d.ts.map +1 -1
  65. package/dist/types/src/components/Lists/Tree.d.ts +1 -1
  66. package/dist/types/src/components/Lists/Tree.d.ts.map +1 -1
  67. package/dist/types/src/components/Lists/Tree.stories.d.ts +6 -32
  68. package/dist/types/src/components/Lists/Tree.stories.d.ts.map +1 -1
  69. package/dist/types/src/components/Lists/Treegrid.d.ts +1 -1
  70. package/dist/types/src/components/Lists/Treegrid.d.ts.map +1 -1
  71. package/dist/types/src/components/Lists/Treegrid.stories.d.ts +6 -4
  72. package/dist/types/src/components/Lists/Treegrid.stories.d.ts.map +1 -1
  73. package/dist/types/src/components/Main/Main.d.ts +2 -11
  74. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  75. package/dist/types/src/components/Main/Main.stories.d.ts +6 -7
  76. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  77. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +1 -1
  78. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts +6 -44
  79. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +1 -1
  80. package/dist/types/src/components/Menus/DropdownMenu.d.ts +6 -5
  81. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +1 -1
  82. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts +6 -41
  83. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +1 -1
  84. package/dist/types/src/components/Message/Message.d.ts +1 -1
  85. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  86. package/dist/types/src/components/Message/Message.stories.d.ts +7 -16
  87. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  88. package/dist/types/src/components/Popover/Popover.d.ts +2 -2
  89. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  90. package/dist/types/src/components/Popover/Popover.stories.d.ts +6 -34
  91. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  92. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +1 -1
  93. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  94. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +6 -32
  95. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  96. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  97. package/dist/types/src/components/Select/Select.stories.d.ts +4 -9
  98. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  99. package/dist/types/src/components/Status/Status.stories.d.ts +2 -8
  100. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  101. package/dist/types/src/components/Tag/Tag.stories.d.ts +12 -12
  102. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  103. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +1 -1
  104. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  105. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -1
  106. package/dist/types/src/components/ThemeProvider/TranslationsProvider.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 -44
  110. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  111. package/dist/types/src/components/Toolbar/Toolbar.d.ts +12 -12
  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 -50
  114. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  115. package/dist/types/src/components/Tooltip/Tooltip.d.ts +2 -4
  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 -61
  118. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  119. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  120. package/dist/types/src/hooks/useVisualViewport.d.ts +2 -2
  121. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  122. package/dist/types/src/playground/Controls.stories.d.ts +5 -9
  123. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  124. package/dist/types/src/playground/Custom.stories.d.ts +12 -4
  125. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  126. package/dist/types/src/playground/Typography.stories.d.ts +5 -11
  127. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  128. package/dist/types/src/testing/decorators/index.d.ts +2 -1
  129. package/dist/types/src/testing/decorators/index.d.ts.map +1 -1
  130. package/dist/types/src/testing/decorators/withLayout.d.ts +15 -0
  131. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -0
  132. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -0
  133. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  134. package/dist/types/src/util/domino.d.ts +18 -0
  135. package/dist/types/src/util/domino.d.ts.map +1 -0
  136. package/dist/types/src/util/index.d.ts +3 -1
  137. package/dist/types/src/util/index.d.ts.map +1 -1
  138. package/dist/types/src/util/usePx.d.ts +8 -0
  139. package/dist/types/src/util/usePx.d.ts.map +1 -0
  140. package/dist/types/tsconfig.tsbuildinfo +1 -1
  141. package/package.json +23 -22
  142. package/src/components/Avatars/Avatar.stories.tsx +19 -10
  143. package/src/components/Avatars/Avatar.tsx +3 -3
  144. package/src/components/Avatars/AvatarGroup.stories.tsx +10 -6
  145. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +16 -11
  146. package/src/components/Breadcrumb/Breadcrumb.tsx +3 -3
  147. package/src/components/Buttons/Button.stories.tsx +10 -11
  148. package/src/components/Buttons/IconButton.stories.tsx +11 -8
  149. package/src/components/Buttons/IconButton.tsx +4 -3
  150. package/src/components/Buttons/Toggle.stories.tsx +12 -9
  151. package/src/components/Buttons/ToggleGroup.stories.tsx +13 -10
  152. package/src/components/Buttons/ToggleGroup.tsx +17 -4
  153. package/src/components/Clipboard/ClipboardProvider.tsx +1 -1
  154. package/src/components/Clipboard/CopyButton.tsx +3 -2
  155. package/src/components/DensityProvider/DensityProvider.tsx +1 -1
  156. package/src/components/Dialogs/AlertDialog.stories.tsx +14 -11
  157. package/src/components/Dialogs/AlertDialog.tsx +13 -13
  158. package/src/components/Dialogs/Dialog.stories.tsx +16 -14
  159. package/src/components/Dialogs/Dialog.tsx +13 -13
  160. package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
  161. package/src/components/Icon/Icon.stories.tsx +113 -0
  162. package/src/components/Icon/Icon.tsx +1 -1
  163. package/src/components/Input/Input.stories.tsx +12 -14
  164. package/src/components/Input/Input.tsx +16 -16
  165. package/src/components/Link/Link.stories.tsx +10 -6
  166. package/src/components/Lists/List.stories.tsx +22 -20
  167. package/src/components/Lists/List.tsx +15 -16
  168. package/src/components/Lists/Tree.stories.tsx +11 -8
  169. package/src/components/Lists/Tree.tsx +4 -3
  170. package/src/components/Lists/TreeDropIndicator.tsx +1 -1
  171. package/src/components/Lists/Treegrid.stories.tsx +12 -6
  172. package/src/components/Lists/Treegrid.tsx +58 -17
  173. package/src/components/Main/Main.stories.tsx +16 -8
  174. package/src/components/Main/Main.tsx +32 -17
  175. package/src/components/Menus/ContextMenu.stories.tsx +11 -8
  176. package/src/components/Menus/ContextMenu.tsx +1 -0
  177. package/src/components/Menus/DropdownMenu.stories.tsx +11 -8
  178. package/src/components/Menus/DropdownMenu.tsx +23 -13
  179. package/src/components/Message/Message.stories.tsx +11 -7
  180. package/src/components/Message/Message.tsx +1 -1
  181. package/src/components/Popover/Popover.stories.tsx +11 -8
  182. package/src/components/Popover/Popover.tsx +12 -12
  183. package/src/components/ScrollArea/ScrollArea.stories.tsx +11 -8
  184. package/src/components/ScrollArea/ScrollArea.tsx +4 -4
  185. package/src/components/Select/Select.stories.tsx +15 -12
  186. package/src/components/Select/Select.tsx +5 -5
  187. package/src/components/Status/Status.stories.tsx +9 -6
  188. package/src/components/Tag/Tag.stories.tsx +18 -9
  189. package/src/components/ThemeProvider/ThemeProvider.tsx +3 -2
  190. package/src/components/ThemeProvider/TranslationsProvider.tsx +3 -3
  191. package/src/components/Toast/Toast.stories.tsx +11 -8
  192. package/src/components/Toast/Toast.tsx +9 -9
  193. package/src/components/Toolbar/Toolbar.stories.tsx +20 -16
  194. package/src/components/Toolbar/Toolbar.tsx +19 -7
  195. package/src/components/Tooltip/Tooltip.stories.tsx +15 -11
  196. package/src/components/Tooltip/Tooltip.tsx +5 -4
  197. package/src/hooks/useSafeArea.ts +3 -2
  198. package/src/hooks/useSafeCollisionPadding.ts +1 -1
  199. package/src/hooks/useVisualViewport.ts +4 -4
  200. package/src/playground/Controls.stories.tsx +20 -17
  201. package/src/playground/Custom.stories.tsx +7 -16
  202. package/src/playground/Typography.stories.tsx +8 -6
  203. package/src/testing/decorators/index.ts +2 -1
  204. package/src/testing/decorators/withLayout.tsx +56 -0
  205. package/src/testing/decorators/withTheme.tsx +31 -0
  206. package/src/util/domino.ts +53 -0
  207. package/src/util/index.ts +3 -1
  208. package/src/util/usePx.ts +61 -0
  209. package/dist/lib/browser/chunk-T6YPS45E.mjs.map +0 -7
  210. package/dist/lib/node-esm/chunk-TYVQJ4KW.mjs.map +0 -7
  211. package/src/testing/decorators/withTheme.ts +0 -22
@@ -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
 
@@ -182,7 +182,7 @@ PopoverTrigger.displayName = TRIGGER_NAME;
182
182
  const VIRTUAL_TRIGGER_NAME = 'PopoverVirtualTrigger';
183
183
 
184
184
  interface PopoverVirtualTriggerProps {
185
- virtualRef: RefObject<PopoverTriggerElement>;
185
+ virtualRef: RefObject<PopoverTriggerElement | null>;
186
186
  }
187
187
 
188
188
  const PopoverVirtualTrigger = (props: ScopedProps<PopoverVirtualTriggerProps>) => {
@@ -194,7 +194,7 @@ const PopoverVirtualTrigger = (props: ScopedProps<PopoverVirtualTriggerProps>) =
194
194
  context.triggerRef.current = virtualRef.current;
195
195
  }
196
196
  });
197
- return <PopperPrimitive.Anchor {...popperScope} virtualRef={virtualRef} />;
197
+ return <PopperPrimitive.Anchor {...popperScope} virtualRef={virtualRef as RefObject<PopoverTriggerElement>} />;
198
198
  };
199
199
 
200
200
  PopoverVirtualTrigger.displayName = VIRTUAL_TRIGGER_NAME;
@@ -396,6 +396,7 @@ type PopoverContentImplElement = ElementRef<typeof PopperPrimitive.Content>;
396
396
  type FocusScopeProps = ComponentPropsWithoutRef<typeof FocusScope>;
397
397
  type DismissableLayerProps = ComponentPropsWithoutRef<typeof DismissableLayer>;
398
398
  type PopperContentProps = ThemedClassName<ComponentPropsWithoutRef<typeof PopperPrimitive.Content>>;
399
+
399
400
  interface PopoverContentImplProps
400
401
  extends Omit<PopperContentProps, 'onPlaced'>,
401
402
  Omit<DismissableLayerProps, 'onDismiss'> {
@@ -440,8 +441,7 @@ const PopoverContentImpl = forwardRef<PopoverContentImplElement, PopoverContentI
440
441
  const elevation = useElevationContext();
441
442
  const safeCollisionPadding = useSafeCollisionPadding(collisionPadding);
442
443
 
443
- // Make sure the whole tree has focus guards as our `Popover` may be
444
- // the last element in the DOM (because of the `Portal`)
444
+ // Make sure the whole tree has focus guards as our `Popover` may be the last element in the DOM (because of the `Portal`)
445
445
  useFocusGuards();
446
446
 
447
447
  return (
@@ -472,7 +472,7 @@ const PopoverContentImpl = forwardRef<PopoverContentImplElement, PopoverContentI
472
472
  ref={forwardedRef}
473
473
  style={{
474
474
  ...contentProps.style,
475
- // re-namespace exposed content custom properties
475
+ // Re-namespace exposed content custom properties.
476
476
  ...{
477
477
  '--radix-popover-content-transform-origin': 'var(--radix-popper-transform-origin)',
478
478
  '--radix-popover-content-available-width': 'var(--radix-popper-available-width)',
@@ -2,16 +2,16 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
6
  import React, { type PropsWithChildren } from 'react';
8
7
 
9
8
  import { faker } from '@dxos/random';
10
9
  import { activeSurface, surfaceShadow } from '@dxos/react-ui-theme';
11
10
 
12
- import { ScrollArea } from './ScrollArea';
13
11
  import { withTheme } from '../../testing';
14
12
 
13
+ import { ScrollArea } from './ScrollArea';
14
+
15
15
  faker.seed(1234);
16
16
 
17
17
  const DefaultStory = ({ children }: PropsWithChildren<{}>) => {
@@ -33,15 +33,18 @@ const DefaultStory = ({ children }: PropsWithChildren<{}>) => {
33
33
  );
34
34
  };
35
35
 
36
- export default {
36
+ const meta = {
37
37
  title: 'ui/react-ui-core/Scroll area',
38
- component: ScrollArea,
38
+ component: ScrollArea as any,
39
39
  render: DefaultStory,
40
40
  decorators: [withTheme],
41
- parameters: { chromatic: { disableSnapshot: false } },
42
- };
41
+ } satisfies Meta<typeof DefaultStory>;
42
+
43
+ export default meta;
44
+
45
+ type Story = StoryObj<typeof meta>;
43
46
 
44
- export const Default = {
47
+ export const Default: Story = {
45
48
  args: {
46
49
  children: faker.lorem.paragraphs(5),
47
50
  },
@@ -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
 
@@ -2,15 +2,15 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type StoryObj } from '@storybook/react-vite';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React, { useState } from 'react';
9
7
 
10
8
  import { faker } from '@dxos/random';
11
9
 
10
+ import { withTheme } from '../../testing';
11
+ import { withSurfaceVariantsLayout } from '../../testing';
12
+
12
13
  import { Select } from './Select';
13
- import { withSurfaceVariantsLayout, withTheme } from '../../testing';
14
14
 
15
15
  faker.seed(1234);
16
16
 
@@ -41,15 +41,18 @@ const DefaultStory = ({ items = [] }: StoryProps) => {
41
41
  );
42
42
  };
43
43
 
44
- export const Default: StoryObj<StoryProps> = {
44
+ const meta = {
45
+ title: 'ui/react-ui-core/Select',
46
+ render: DefaultStory,
47
+ decorators: [withTheme, withSurfaceVariantsLayout()],
48
+ } satisfies Meta<typeof DefaultStory>;
49
+
50
+ export default meta;
51
+
52
+ type Story = StoryObj<typeof meta>;
53
+
54
+ export const Default: Story = {
45
55
  args: {
46
56
  items: Array.from({ length: 16 }).map((_, i) => ({ id: `item-${i}`, text: faker.lorem.word() })),
47
57
  },
48
58
  };
49
-
50
- export default {
51
- title: 'ui/react-ui-core/Select',
52
- render: DefaultStory,
53
- decorators: [withSurfaceVariantsLayout(), withTheme],
54
- parameters: { chromatic: { disableSnapshot: false } },
55
- };
@@ -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 (
@@ -2,19 +2,22 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
6
  import React from 'react';
8
7
 
9
- import { Status } from './Status';
10
8
  import { withTheme } from '../../testing';
11
9
 
12
- export default {
10
+ import { Status } from './Status';
11
+
12
+ const meta = {
13
13
  title: 'ui/react-ui-core/Status',
14
14
  component: Status,
15
15
  decorators: [withTheme],
16
- parameters: { chromatic: { disableSnapshot: false } },
17
- };
16
+ } satisfies Meta<typeof Status>;
17
+
18
+ export default meta;
19
+
20
+ type Story = StoryObj<typeof meta>;
18
21
 
19
22
  export const Normal = (props: any) => {
20
23
  return (
@@ -1,25 +1,22 @@
1
1
  //
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
4
6
  import React from 'react';
5
7
 
6
8
  import { hues } from '@dxos/react-ui-theme';
7
- import '@dxos-theme';
8
9
  import { type ChromaticPalette, type MessageValence } from '@dxos/react-ui-types';
9
10
 
10
- import { Tag } from './Tag';
11
11
  import { withTheme } from '../../testing';
12
12
 
13
+ import { Tag } from './Tag';
14
+
13
15
  const palettes = ['neutral', 'success', 'info', 'warning', 'error', ...hues] as (ChromaticPalette | MessageValence)[];
14
16
 
15
- export default {
17
+ const meta = {
16
18
  title: 'ui/react-ui-core/Tag',
17
19
  component: Tag,
18
- decorators: [withTheme],
19
- parameters: { chromatic: { disableSnapshot: false } },
20
- } as const;
21
-
22
- export const Default = {
23
20
  render: () => (
24
21
  <div role='grid' className='grid grid-cols-5 gap-2 max-is-screen-md'>
25
22
  {palettes.map((palette) => (
@@ -29,4 +26,16 @@ export const Default = {
29
26
  ))}
30
27
  </div>
31
28
  ),
32
- };
29
+ decorators: [withTheme],
30
+ parameters: {
31
+ chromatic: {
32
+ disableSnapshot: false,
33
+ },
34
+ },
35
+ } satisfies Meta<typeof Tag>;
36
+
37
+ export default meta;
38
+
39
+ type Story = StoryObj<typeof meta>;
40
+
41
+ export const Default: Story = {};
@@ -3,16 +3,17 @@
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
 
15
+ import { TranslationsProvider, type TranslationsProviderProps } from './TranslationsProvider';
16
+
16
17
  export type ThemeMode = 'dark' | 'light';
17
18
 
18
19
  export type ThemeContextValue = {
@@ -2,9 +2,9 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { enUS as dtLocaleEnUs, type Locale } from 'date-fns/locale';
6
- import i18Next, { type TFunction, type Resource } from 'i18next';
7
- import React, { type ReactNode, useEffect, createContext, useState, Suspense, useContext } from 'react';
5
+ import { type Locale, enUS as dtLocaleEnUs } from 'date-fns/locale';
6
+ import i18Next, { type Resource, type TFunction } from 'i18next';
7
+ import React, { type ReactNode, Suspense, createContext, useContext, useEffect, useState } from 'react';
8
8
  import { initReactI18next, useTranslation as useI18NextTranslation } from 'react-i18next';
9
9
 
10
10
  const initialLng = 'en-US';
@@ -2,14 +2,14 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
6
  import React, { type ReactNode, useState } from 'react';
8
7
 
9
- import { Toast } from './Toast';
10
8
  import { withTheme } from '../../testing';
11
9
  import { Button } from '../Buttons';
12
10
 
11
+ import { Toast } from './Toast';
12
+
13
13
  type ActionTriggerProps = { altText: string; trigger: ReactNode };
14
14
 
15
15
  type StorybookToastProps = Partial<{
@@ -44,15 +44,18 @@ const DefaultStory = ({ title, description, actionTriggers, openTrigger, closeTr
44
44
  );
45
45
  };
46
46
 
47
- export default {
47
+ const meta = {
48
48
  title: 'ui/react-ui-core/Toast',
49
- component: Toast,
49
+ component: Toast as any,
50
50
  render: DefaultStory,
51
51
  decorators: [withTheme],
52
- parameters: { chromatic: { disableSnapshot: false } },
53
- };
52
+ } satisfies Meta<typeof DefaultStory>;
53
+
54
+ export default meta;
55
+
56
+ type Story = StoryObj<typeof meta>;
54
57
 
55
- export const Default = {
58
+ export const Default: Story = {
56
59
  args: {
57
60
  openTrigger: 'Open toast',
58
61
  title: 'This is a toast',
@@ -5,22 +5,22 @@
5
5
  import { Primitive } from '@radix-ui/react-primitive';
6
6
  import { Slot } from '@radix-ui/react-slot';
7
7
  import {
8
+ ToastAction as ToastActionPrimitive,
9
+ type ToastActionProps as ToastActionPrimitiveProps,
10
+ ToastClose as ToastClosePrimitive,
11
+ type ToastCloseProps as ToastClosePrimitiveProps,
12
+ ToastDescription as ToastDescriptionPrimitive,
13
+ type ToastDescriptionProps as ToastDescriptionPrimitiveProps,
8
14
  ToastProvider as ToastProviderPrimitive,
9
15
  type ToastProviderProps as ToastProviderPrimitiveProps,
10
- ToastViewport as ToastViewportPrimitive,
11
- type ToastViewportProps as ToastViewportPrimitiveProps,
12
16
  Root as ToastRootPrimitive,
13
17
  type ToastProps as ToastRootPrimitiveProps,
14
18
  ToastTitle as ToastTitlePrimitive,
15
19
  type ToastTitleProps as ToastTitlePrimitiveProps,
16
- ToastDescription as ToastDescriptionPrimitive,
17
- type ToastDescriptionProps as ToastDescriptionPrimitiveProps,
18
- ToastAction as ToastActionPrimitive,
19
- type ToastActionProps as ToastActionPrimitiveProps,
20
- ToastClose as ToastClosePrimitive,
21
- type ToastCloseProps as ToastClosePrimitiveProps,
20
+ ToastViewport as ToastViewportPrimitive,
21
+ type ToastViewportProps as ToastViewportPrimitiveProps,
22
22
  } from '@radix-ui/react-toast';
23
- import React, { type ComponentPropsWithRef, forwardRef, type FunctionComponent } from 'react';
23
+ import React, { type ComponentPropsWithRef, type FunctionComponent, forwardRef } from 'react';
24
24
 
25
25
  import { useThemeContext } from '../../hooks';
26
26
  import { type ThemedClassName } from '../../util';
@@ -2,16 +2,16 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { ArrowClockwise, Bug, FileJs, FileTs, TextB, TextItalic, TextUnderline } from '@phosphor-icons/react';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React from 'react';
9
7
 
10
- import { Toolbar } from './Toolbar';
11
8
  import { withTheme } from '../../testing';
12
9
  import { Toggle } from '../Buttons';
10
+ import { Icon } from '../Icon';
13
11
  import { Select } from '../Select';
14
12
 
13
+ import { Toolbar } from './Toolbar';
14
+
15
15
  type StorybookToolbarProps = {};
16
16
 
17
17
  const DefaultStory = (props: StorybookToolbarProps) => {
@@ -29,6 +29,7 @@ const DefaultStory = (props: StorybookToolbarProps) => {
29
29
  <Select.Option value={'b'}>B</Select.Option>
30
30
  <Select.Option value={'c'}>C</Select.Option>
31
31
  </Select.Viewport>
32
+ <Select.Arrow />
32
33
  </Select.Content>
33
34
  </Select.Portal>
34
35
  </Select.Root>
@@ -37,46 +38,49 @@ const DefaultStory = (props: StorybookToolbarProps) => {
37
38
  {/* TODO(burdon): Icon sizes should adapt to density. */}
38
39
  <Toolbar.ToggleGroup type='multiple'>
39
40
  <Toolbar.ToggleGroupItem value='a'>
40
- <TextB />
41
+ <Icon icon='ph--text-b--regular' />
41
42
  </Toolbar.ToggleGroupItem>
42
43
  <Toolbar.ToggleGroupItem value='b'>
43
- <TextItalic />
44
+ <Icon icon='ph--text-italic--regular' />
44
45
  </Toolbar.ToggleGroupItem>
45
46
  <Toolbar.ToggleGroupItem value='c'>
46
- <TextUnderline />
47
+ <Icon icon='ph--text-underline--regular' />
47
48
  </Toolbar.ToggleGroupItem>
48
49
  </Toolbar.ToggleGroup>
49
50
  {/* TODO(burdon): Highlight isn't shown. */}
50
51
  <Toolbar.ToggleGroup type='single' defaultValue='a'>
51
52
  <Toolbar.ToggleGroupItem value='a'>
52
- <FileTs />
53
+ <Icon icon='ph--file-ts--regular' />
53
54
  </Toolbar.ToggleGroupItem>
54
55
  <Toolbar.ToggleGroupItem value='b'>
55
- <FileJs />
56
+ <Icon icon='ph--file-js--regular' />
56
57
  </Toolbar.ToggleGroupItem>
57
58
  </Toolbar.ToggleGroup>
58
59
  <Toolbar.Button asChild>
59
60
  <Toggle>
60
- <Bug />
61
+ <Icon icon='ph--bug--regular' />
61
62
  </Toggle>
62
63
  </Toolbar.Button>
63
64
  <Toolbar.Separator />
64
65
  <Toolbar.Button>Test</Toolbar.Button>
65
66
  <Toolbar.Button>
66
- <ArrowClockwise />
67
+ <Icon icon='ph--arrow-clockwise--regular' />
67
68
  </Toolbar.Button>
68
69
  </Toolbar.Root>
69
70
  );
70
71
  };
71
72
 
72
- export default {
73
+ const meta = {
73
74
  title: 'ui/react-ui-core/Toolbar',
74
- component: Toolbar,
75
+ component: Toolbar as any,
75
76
  render: DefaultStory,
76
77
  decorators: [withTheme],
77
- parameters: { chromatic: { disableSnapshot: false } },
78
- };
78
+ } satisfies Meta<typeof DefaultStory>;
79
+
80
+ export default meta;
81
+
82
+ type Story = StoryObj<typeof meta>;
79
83
 
80
- export const Default = {
84
+ export const Default: Story = {
81
85
  args: {},
82
86
  };
@@ -4,7 +4,7 @@
4
4
 
5
5
  import type { ToggleGroupItemProps as ToggleGroupItemPrimitiveProps } from '@radix-ui/react-toggle-group';
6
6
  import * as ToolbarPrimitive from '@radix-ui/react-toolbar';
7
- import React, { forwardRef } from 'react';
7
+ import React, { Fragment, forwardRef } from 'react';
8
8
 
9
9
  import { useThemeContext } from '../../hooks';
10
10
  import { type ThemedClassName } from '../../util';
@@ -13,27 +13,39 @@ import {
13
13
  ButtonGroup,
14
14
  type ButtonGroupProps,
15
15
  type ButtonProps,
16
+ IconButton,
17
+ type IconButtonProps,
16
18
  Toggle,
17
19
  type ToggleGroupItemProps,
18
20
  type ToggleProps,
19
- IconButton,
20
- type IconButtonProps,
21
21
  } from '../Buttons';
22
22
  import { Link, type LinkProps } from '../Link';
23
23
  import { Separator, type SeparatorProps } from '../Separator';
24
24
 
25
- type ToolbarRootProps = ThemedClassName<ToolbarPrimitive.ToolbarProps> & { layoutManaged?: boolean };
25
+ type ToolbarRootProps = ThemedClassName<
26
+ ToolbarPrimitive.ToolbarProps & {
27
+ textBlockWidth?: boolean;
28
+ layoutManaged?: boolean;
29
+ disabled?: boolean;
30
+ }
31
+ >;
26
32
 
27
33
  const ToolbarRoot = forwardRef<HTMLDivElement, ToolbarRootProps>(
28
- ({ classNames, children, layoutManaged, ...props }, forwardedRef) => {
34
+ ({ classNames, children, layoutManaged, textBlockWidth: textBlockWidthParam, disabled, ...props }, forwardedRef) => {
29
35
  const { tx } = useThemeContext();
36
+ const InnerRoot = textBlockWidthParam ? 'div' : Fragment;
37
+ const innerRootProps = textBlockWidthParam
38
+ ? { role: 'none', className: tx('toolbar.inner', 'toolbar', { layoutManaged }, classNames) }
39
+ : {};
40
+
30
41
  return (
31
42
  <ToolbarPrimitive.Root
32
43
  {...props}
33
- className={tx('toolbar.root', 'toolbar', { layoutManaged }, classNames)}
44
+ data-arrow-keys={props.orientation === 'vertical' ? 'up down' : 'left right'}
45
+ className={tx('toolbar.root', 'toolbar', { layoutManaged, disabled }, classNames)}
34
46
  ref={forwardedRef}
35
47
  >
36
- {children}
48
+ <InnerRoot {...innerRootProps}>{children}</InnerRoot>
37
49
  </ToolbarPrimitive.Root>
38
50
  );
39
51
  },
@@ -2,15 +2,16 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React from 'react';
7
7
 
8
8
  import { faker } from '@dxos/random';
9
9
 
10
- import { Tooltip } from './Tooltip';
11
10
  import { withTheme } from '../../testing';
12
11
  import { Button } from '../Buttons';
13
12
 
13
+ import { Tooltip } from './Tooltip';
14
+
14
15
  type StoryProps = {
15
16
  tooltips: { label: string; content: string }[];
16
17
  defaultOpen?: boolean;
@@ -28,15 +29,18 @@ const DefaultStory = ({ tooltips, defaultOpen }: StoryProps) => (
28
29
  </Tooltip.Provider>
29
30
  );
30
31
 
31
- export default {
32
+ const meta = {
32
33
  title: 'ui/react-ui-core/Tooltip',
33
- component: Tooltip,
34
+ component: Tooltip as any,
34
35
  render: DefaultStory,
35
36
  decorators: [withTheme],
36
- parameters: { chromatic: { disableSnapshot: false } },
37
- };
37
+ } satisfies Meta<typeof DefaultStory>;
38
+
39
+ export default meta;
40
+
41
+ type Story = StoryObj<typeof meta>;
38
42
 
39
- export const Default = {
43
+ export const Default: Story = {
40
44
  args: {
41
45
  tooltips: [
42
46
  {
@@ -50,9 +54,9 @@ export const Default = {
50
54
  },
51
55
  };
52
56
 
53
- export const DefaultOpen = {
57
+ export const DefaultOpen: Story = {
54
58
  args: {
55
- defaultOption: true,
59
+ defaultOpen: true,
56
60
  tooltips: [
57
61
  {
58
62
  label: 'Tooltip trigger',
@@ -65,9 +69,9 @@ export const DefaultOpen = {
65
69
  },
66
70
  };
67
71
 
68
- export const StressTest = {
72
+ export const StressTest: Story = {
69
73
  args: {
70
- defaultOption: true,
74
+ defaultOpen: true,
71
75
  tooltips: faker.helpers.multiple(
72
76
  () => ({
73
77
  label: faker.lorem.words(2),
@@ -11,7 +11,7 @@ import type { Scope } from '@radix-ui/react-context';
11
11
  import { DismissableLayer } from '@radix-ui/react-dismissable-layer';
12
12
  import { useId } from '@radix-ui/react-id';
13
13
  import * as PopperPrimitive from '@radix-ui/react-popper';
14
- import { createPopperScope, type PopperAnchorProps } from '@radix-ui/react-popper';
14
+ import { type PopperAnchorProps, createPopperScope } from '@radix-ui/react-popper';
15
15
  import { Portal as PortalPrimitive } from '@radix-ui/react-portal';
16
16
  import { Presence } from '@radix-ui/react-presence';
17
17
  import { Primitive } from '@radix-ui/react-primitive';
@@ -23,10 +23,11 @@ import React, {
23
23
  type ComponentPropsWithoutRef,
24
24
  type ElementRef,
25
25
  type FC,
26
- type SyntheticEvent,
27
- forwardRef,
28
26
  type MutableRefObject,
29
27
  type ReactNode,
28
+ type RefObject,
29
+ type SyntheticEvent,
30
+ forwardRef,
30
31
  useCallback,
31
32
  useEffect,
32
33
  useMemo,
@@ -218,7 +219,7 @@ const TooltipProvider: FC<TooltipProviderProps> = (props: TooltipScopedProps<Too
218
219
  {content}
219
220
  <TooltipArrow className={tx('tooltip.arrow', 'tooltip__arrow')} />
220
221
  </TooltipContent>
221
- <TooltipVirtualTrigger virtualRef={triggerRef} />
222
+ <TooltipVirtualTrigger virtualRef={triggerRef as RefObject<HTMLButtonElement>} />
222
223
  {children}
223
224
  </TooltipContextProvider>
224
225
  </PopperPrimitive.Root>