@dxos/react-ui 0.6.13 → 0.6.14-main.69511f5

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 (126) hide show
  1. package/dist/lib/browser/index.mjs +731 -198
  2. package/dist/lib/browser/index.mjs.map +3 -3
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node/index.cjs +2925 -0
  5. package/dist/lib/node/index.cjs.map +7 -0
  6. package/dist/lib/node/meta.json +1 -0
  7. package/dist/lib/node-esm/index.mjs +2924 -0
  8. package/dist/lib/node-esm/index.mjs.map +7 -0
  9. package/dist/lib/node-esm/meta.json +1 -0
  10. package/dist/types/src/components/Avatars/Avatar.stories.d.ts +15 -1
  11. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  12. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts +6 -1
  13. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  14. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts +9 -1
  15. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  16. package/dist/types/src/components/Buttons/Button.d.ts +1 -1
  17. package/dist/types/src/components/Buttons/Button.d.ts.map +1 -1
  18. package/dist/types/src/components/Buttons/Button.stories.d.ts +12 -17
  19. package/dist/types/src/components/Buttons/Button.stories.d.ts.map +1 -1
  20. package/dist/types/src/components/Buttons/Toggle.stories.d.ts +2 -1
  21. package/dist/types/src/components/Buttons/Toggle.stories.d.ts.map +1 -1
  22. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts +20 -1
  23. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts.map +1 -1
  24. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  25. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts +12 -1
  26. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts.map +1 -1
  27. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts +11 -1
  28. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts.map +1 -1
  29. package/dist/types/src/components/Icon/Icon.d.ts +1 -1
  30. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  31. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  32. package/dist/types/src/components/Input/Input.stories.d.ts +16 -1
  33. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  34. package/dist/types/src/components/Lists/List.stories.d.ts +2 -3
  35. package/dist/types/src/components/Lists/List.stories.d.ts.map +1 -1
  36. package/dist/types/src/components/Lists/Tree.stories.d.ts +5 -1
  37. package/dist/types/src/components/Lists/Tree.stories.d.ts.map +1 -1
  38. package/dist/types/src/components/Lists/Treegrid.stories.d.ts +3 -2
  39. package/dist/types/src/components/Lists/Treegrid.stories.d.ts.map +1 -1
  40. package/dist/types/src/components/Main/Main.stories.d.ts +5 -1
  41. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  42. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts +29 -1
  43. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +1 -1
  44. package/dist/types/src/components/Menus/DropdownMenu.d.ts +105 -44
  45. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +1 -1
  46. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts +29 -1
  47. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +1 -1
  48. package/dist/types/src/components/Message/Message.stories.d.ts +6 -1
  49. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  50. package/dist/types/src/components/Popover/Popover.d.ts +87 -21
  51. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  52. package/dist/types/src/components/Popover/Popover.stories.d.ts +20 -1
  53. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  54. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +20 -1
  55. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  56. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  57. package/dist/types/src/components/Select/Select.stories.d.ts +10 -11
  58. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  59. package/dist/types/src/components/Status/Status.stories.d.ts +0 -3
  60. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  61. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +4 -5
  62. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  63. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +4 -4
  64. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  65. package/dist/types/src/components/Toast/Toast.stories.d.ts +20 -1
  66. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  67. package/dist/types/src/components/Toolbar/Toolbar.d.ts +4 -2
  68. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  69. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +30 -1
  70. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  71. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +13 -1
  72. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  73. package/dist/types/src/hooks/useThemeContext.d.ts.map +1 -1
  74. package/dist/types/src/playground/Controls.stories.d.ts +2 -6
  75. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  76. package/dist/types/src/playground/Surfaces.stories.d.ts +6 -2
  77. package/dist/types/src/playground/Surfaces.stories.d.ts.map +1 -1
  78. package/dist/types/src/playground/Typography.stories.d.ts +1 -1
  79. package/dist/types/src/testing/decorators/index.d.ts +1 -0
  80. package/dist/types/src/testing/decorators/index.d.ts.map +1 -1
  81. package/dist/types/src/testing/decorators/withVariants.d.ts +13 -0
  82. package/dist/types/src/testing/decorators/withVariants.d.ts.map +1 -0
  83. package/package.json +28 -17
  84. package/src/components/Avatars/Avatar.stories.tsx +3 -2
  85. package/src/components/Avatars/AvatarGroup.stories.tsx +3 -2
  86. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +3 -2
  87. package/src/components/Buttons/Button.stories.tsx +34 -63
  88. package/src/components/Buttons/Button.tsx +46 -36
  89. package/src/components/Buttons/Toggle.stories.tsx +3 -2
  90. package/src/components/Buttons/ToggleGroup.stories.tsx +3 -2
  91. package/src/components/DensityProvider/DensityProvider.tsx +1 -1
  92. package/src/components/Dialogs/AlertDialog.stories.tsx +3 -2
  93. package/src/components/Dialogs/Dialog.stories.tsx +3 -2
  94. package/src/components/Icon/Icon.tsx +11 -9
  95. package/src/components/Input/Input.stories.tsx +4 -3
  96. package/src/components/Link/Link.stories.tsx +1 -1
  97. package/src/components/Lists/List.stories.tsx +4 -4
  98. package/src/components/Lists/Tree.stories.tsx +3 -2
  99. package/src/components/Lists/Treegrid.stories.tsx +7 -5
  100. package/src/components/Main/Main.stories.tsx +3 -2
  101. package/src/components/Menus/ContextMenu.stories.tsx +3 -2
  102. package/src/components/Menus/DropdownMenu.stories.tsx +43 -3
  103. package/src/components/Menus/DropdownMenu.tsx +518 -69
  104. package/src/components/Message/Message.stories.tsx +3 -2
  105. package/src/components/Popover/Popover.stories.tsx +27 -3
  106. package/src/components/Popover/Popover.tsx +524 -55
  107. package/src/components/ScrollArea/ScrollArea.stories.tsx +3 -2
  108. package/src/components/Select/Select.stories.tsx +14 -31
  109. package/src/components/Select/Select.tsx +9 -10
  110. package/src/components/Status/Status.stories.tsx +1 -2
  111. package/src/components/Tag/Tag.stories.tsx +1 -1
  112. package/src/components/ThemeProvider/ThemeProvider.tsx +17 -18
  113. package/src/components/Toast/Toast.stories.tsx +3 -2
  114. package/src/components/Toast/Toast.tsx +1 -4
  115. package/src/components/Toolbar/Toolbar.stories.tsx +3 -2
  116. package/src/components/Toolbar/Toolbar.tsx +21 -1
  117. package/src/components/Tooltip/Tooltip.stories.tsx +3 -2
  118. package/src/hooks/useThemeContext.ts +3 -1
  119. package/src/playground/Controls.stories.tsx +7 -10
  120. package/src/playground/Surfaces.stories.tsx +4 -3
  121. package/src/playground/Typography.stories.tsx +2 -2
  122. package/src/testing/decorators/index.ts +1 -0
  123. package/src/testing/decorators/withVariants.tsx +45 -0
  124. package/dist/types/src/playground/helpers.d.ts +0 -6
  125. package/dist/types/src/playground/helpers.d.ts.map +0 -1
  126. package/src/playground/helpers.tsx +0 -32
@@ -34,8 +34,9 @@ const StorybookScrollArea = ({ children }: PropsWithChildren<{}>) => {
34
34
  };
35
35
 
36
36
  export default {
37
- title: 'react-ui/Scroll area',
38
- component: StorybookScrollArea,
37
+ title: 'ui/react-ui-core/Scroll area',
38
+ component: ScrollArea,
39
+ render: StorybookScrollArea,
39
40
  decorators: [withTheme],
40
41
  parameters: { chromatic: { disableSnapshot: false } },
41
42
  };
@@ -4,38 +4,21 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import React, { type FC, type PropsWithChildren, useState } from 'react';
7
+ import { type StoryObj } from '@storybook/react';
8
+ import React, { useState } from 'react';
8
9
 
9
10
  import { faker } from '@dxos/random';
10
- import { type Density } from '@dxos/react-ui-types';
11
11
 
12
12
  import { Select } from './Select';
13
- import { withTheme } from '../../testing';
14
- import { DensityProvider } from '../DensityProvider';
13
+ import { withVariants, withTheme } from '../../testing';
15
14
 
16
15
  faker.seed(1234);
17
16
 
18
- // TODO(burdon): Factor out density test.
19
- const createDensityTest =
20
- (Component: FC<any>) =>
21
- ({ ...props }) => {
22
- const densities: Density[] = ['coarse', 'fine'];
23
- return (
24
- <div className='grid grid-cols-2'>
25
- {densities.map((density) => (
26
- <div key={density}>
27
- <DensityProvider density={density}>
28
- <Component {...props} />
29
- </DensityProvider>
30
- </div>
31
- ))}
32
- </div>
33
- );
34
- };
35
-
36
17
  type ItemProps = { id: string; text: string };
37
18
 
38
- const StorybookSelect = ({ items = [] }: PropsWithChildren<{ items: ItemProps[] }>) => {
19
+ type StoryProps = { items: ItemProps[] };
20
+
21
+ const DefaultStory = ({ items = [] }: StoryProps) => {
39
22
  const [value, setValue] = useState<string>();
40
23
  return (
41
24
  <Select.Root value={value} onValueChange={setValue}>
@@ -58,15 +41,15 @@ const StorybookSelect = ({ items = [] }: PropsWithChildren<{ items: ItemProps[]
58
41
  );
59
42
  };
60
43
 
61
- export default {
62
- title: 'react-ui/Select',
63
- component: createDensityTest(StorybookSelect),
64
- decorators: [withTheme],
65
- parameters: { chromatic: { disableSnapshot: false } },
66
- };
67
-
68
- export const Default = {
44
+ export const Default: StoryObj<StoryProps> = {
69
45
  args: {
70
46
  items: Array.from({ length: 16 }).map((_, i) => ({ id: `item-${i}`, text: faker.lorem.word() })),
71
47
  },
72
48
  };
49
+
50
+ export default {
51
+ title: 'ui/react-ui-core/Select',
52
+ render: DefaultStory,
53
+ decorators: [withVariants(), withTheme],
54
+ parameters: { chromatic: { disableSnapshot: false } },
55
+ };
@@ -2,13 +2,14 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { CaretDown, CaretUp, Check } from '@phosphor-icons/react';
5
+ import { CaretDown, CaretUp } from '@phosphor-icons/react';
6
6
  import * as SelectPrimitive from '@radix-ui/react-select';
7
7
  import React, { forwardRef } from 'react';
8
8
 
9
9
  import { useThemeContext } from '../../hooks';
10
10
  import { type ThemedClassName } from '../../util';
11
11
  import { Button, type ButtonProps } from '../Buttons';
12
+ import { Icon } from '../Icon';
12
13
 
13
14
  type SelectRootProps = SelectPrimitive.SelectProps;
14
15
 
@@ -39,11 +40,9 @@ const SelectTriggerButton = forwardRef<HTMLButtonElement, SelectTriggerButtonPro
39
40
  <SelectPrimitive.Trigger asChild ref={forwardedRef}>
40
41
  <Button {...props}>
41
42
  <SelectPrimitive.Value placeholder={placeholder}>{children}</SelectPrimitive.Value>
43
+ <span className='w-1 flex-1' />
42
44
  <SelectPrimitive.Icon asChild>
43
- <>
44
- <span className='w-1' />
45
- <CaretDown className={tx('select.triggerIcon', 'select__trigger__icon', {})} weight='bold' />
46
- </>
45
+ <CaretDown className={tx('select.triggerIcon', 'select__trigger__icon', {})} weight='bold' />
47
46
  </SelectPrimitive.Icon>
48
47
  </Button>
49
48
  </SelectPrimitive.Trigger>
@@ -60,6 +59,7 @@ const SelectContent = forwardRef<HTMLDivElement, SelectContentProps>(
60
59
  <SelectPrimitive.Content
61
60
  {...props}
62
61
  className={tx('select.content', 'select__content', {}, classNames)}
62
+ position='popper'
63
63
  ref={forwardedRef}
64
64
  >
65
65
  {children}
@@ -138,13 +138,13 @@ type SelectOptionProps = SelectItemProps;
138
138
 
139
139
  const SelectOption = forwardRef<HTMLDivElement, SelectItemProps>(({ children, classNames, ...props }, forwardedRef) => {
140
140
  const { tx } = useThemeContext();
141
-
142
141
  return (
143
142
  <SelectPrimitive.Item {...props} className={tx('select.item', 'option', {}, classNames)} ref={forwardedRef}>
144
143
  <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
145
- <SelectPrimitive.ItemIndicator className={tx('select.itemIndicator', 'option__indicator', {})}>
146
- <Check weight='bold' />
147
- </SelectPrimitive.ItemIndicator>
144
+ <span className='grow w-1' />
145
+ {/* <SelectPrimitive.ItemIndicator className={tx('select.itemIndicator', 'option__indicator', {})}> */}
146
+ <Icon icon='ph--check--regular' />
147
+ {/* </SelectPrimitive.ItemIndicator> */}
148
148
  </SelectPrimitive.Item>
149
149
  );
150
150
  });
@@ -174,7 +174,6 @@ type SelectArrowProps = ThemedClassName<SelectPrimitive.SelectArrowProps>;
174
174
 
175
175
  const SelectArrow = forwardRef<SVGSVGElement, SelectArrowProps>(({ classNames, ...props }, forwardedRef) => {
176
176
  const { tx } = useThemeContext();
177
-
178
177
  return (
179
178
  <SelectPrimitive.Arrow
180
179
  {...props}
@@ -10,9 +10,8 @@ import { Status } from './Status';
10
10
  import { withTheme } from '../../testing';
11
11
 
12
12
  export default {
13
- title: 'react-ui/Status',
13
+ title: 'ui/react-ui-core/Status',
14
14
  component: Status,
15
- actions: { argTypesRegex: '^on.*' },
16
15
  decorators: [withTheme],
17
16
  parameters: { chromatic: { disableSnapshot: false } },
18
17
  };
@@ -8,7 +8,7 @@ import { Tag } from './Tag';
8
8
  import { withTheme } from '../../testing';
9
9
 
10
10
  export default {
11
- title: 'react-ui/Tag',
11
+ title: 'ui/react-ui-core/Tag',
12
12
  component: Tag,
13
13
  decorators: [withTheme],
14
14
  parameters: { chromatic: { disableSnapshot: false } },
@@ -14,33 +14,24 @@ import { ElevationProvider } from '../ElevationProvider';
14
14
 
15
15
  export type ThemeMode = 'light' | 'dark';
16
16
 
17
- export interface ThemeContextValue {
17
+ export type ThemeContextValue = {
18
18
  tx: ThemeFunction<any>;
19
19
  themeMode: ThemeMode;
20
20
  hasIosKeyboard: boolean;
21
- }
21
+ };
22
+
23
+ /**
24
+ * @internal
25
+ */
26
+ export const ThemeContext = createContext<ThemeContextValue | undefined>(undefined);
22
27
 
23
28
  export type ThemeProviderProps = Omit<TranslationsProviderProps, 'children'> &
24
29
  Partial<ThemeContextValue> &
25
30
  PropsWithChildren<{
26
- rootElevation?: Elevation;
27
31
  rootDensity?: Density;
32
+ rootElevation?: Elevation;
28
33
  }>;
29
34
 
30
- export const ThemeContext = createContext<ThemeContextValue>({
31
- tx: (_path, defaultClassName, _styleProps, ..._options) => defaultClassName,
32
- themeMode: 'dark',
33
- hasIosKeyboard: false,
34
- });
35
-
36
- const handleInputModalityChange = (isUsingKeyboard: boolean) => {
37
- if (isUsingKeyboard) {
38
- document.body.setAttribute('data-is-keyboard', 'true');
39
- } else {
40
- document.body.removeAttribute('data-is-keyboard');
41
- }
42
- };
43
-
44
35
  export const ThemeProvider = ({
45
36
  children,
46
37
  fallback = null,
@@ -48,8 +39,8 @@ export const ThemeProvider = ({
48
39
  appNs,
49
40
  tx = (_path, defaultClassName, _styleProps, ..._options) => defaultClassName,
50
41
  themeMode = 'dark',
42
+ rootDensity = 'fine',
51
43
  rootElevation = 'base',
52
- rootDensity = 'coarse',
53
44
  }: ThemeProviderProps) => {
54
45
  useEffect(() => {
55
46
  if (document.defaultView) {
@@ -75,3 +66,11 @@ export const ThemeProvider = ({
75
66
  </ThemeContext.Provider>
76
67
  );
77
68
  };
69
+
70
+ const handleInputModalityChange = (isUsingKeyboard: boolean) => {
71
+ if (isUsingKeyboard) {
72
+ document.body.setAttribute('data-is-keyboard', 'true');
73
+ } else {
74
+ document.body.removeAttribute('data-is-keyboard');
75
+ }
76
+ };
@@ -45,8 +45,9 @@ const StorybookToast = (props: StorybookToastProps) => {
45
45
  };
46
46
 
47
47
  export default {
48
- title: 'react-ui/Toast',
49
- component: StorybookToast,
48
+ title: 'ui/react-ui-core/Toast',
49
+ component: Toast,
50
+ render: StorybookToast,
50
51
  decorators: [withTheme],
51
52
  parameters: { chromatic: { disableSnapshot: false } },
52
53
  };
@@ -24,7 +24,6 @@ import React, { type ComponentPropsWithRef, forwardRef, type FunctionComponent }
24
24
 
25
25
  import { useThemeContext } from '../../hooks';
26
26
  import { type ThemedClassName } from '../../util';
27
- import { DensityProvider } from '../DensityProvider';
28
27
  import { ElevationProvider } from '../ElevationProvider';
29
28
 
30
29
  type ToastProviderProps = ToastProviderPrimitiveProps;
@@ -46,9 +45,7 @@ const ToastRoot = forwardRef<HTMLLIElement, ToastRootProps>(({ classNames, child
46
45
  const { tx } = useThemeContext();
47
46
  return (
48
47
  <ToastRootPrimitive {...props} className={tx('toast.root', 'toast', {}, classNames)} ref={forwardedRef}>
49
- <ElevationProvider elevation='chrome'>
50
- <DensityProvider density='fine'>{children}</DensityProvider>
51
- </ElevationProvider>
48
+ <ElevationProvider elevation='chrome'>{children}</ElevationProvider>
52
49
  </ToastRootPrimitive>
53
50
  );
54
51
  });
@@ -70,8 +70,9 @@ const StorybookToolbar = (props: StorybookToolbarProps) => {
70
70
  };
71
71
 
72
72
  export default {
73
- title: 'react-ui/Toolbar',
74
- component: StorybookToolbar,
73
+ title: 'ui/react-ui-core/Toolbar',
74
+ component: Toolbar,
75
+ render: StorybookToolbar,
75
76
  decorators: [withTheme],
76
77
  parameters: { chromatic: { disableSnapshot: false } },
77
78
  };
@@ -7,7 +7,15 @@ import React, { forwardRef } from 'react';
7
7
 
8
8
  import { useThemeContext } from '../../hooks';
9
9
  import { type ThemedClassName } from '../../util';
10
- import { Button, ButtonGroup, type ButtonGroupProps, type ButtonProps, type ToggleGroupItemProps } from '../Buttons';
10
+ import {
11
+ Button,
12
+ ButtonGroup,
13
+ type ButtonGroupProps,
14
+ type ButtonProps,
15
+ Toggle,
16
+ type ToggleGroupItemProps,
17
+ type ToggleProps,
18
+ } from '../Buttons';
11
19
  import { Link, type LinkProps } from '../Link';
12
20
  import { Separator, type SeparatorProps } from '../Separator';
13
21
 
@@ -32,6 +40,16 @@ const ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>((props,
32
40
  );
33
41
  });
34
42
 
43
+ type ToolbarToggleProps = ToggleProps;
44
+
45
+ const ToolbarToggle = forwardRef<HTMLButtonElement, ToolbarToggleProps>((props, forwardedRef) => {
46
+ return (
47
+ <ToolbarPrimitive.Button asChild>
48
+ <Toggle {...props} ref={forwardedRef} />
49
+ </ToolbarPrimitive.Button>
50
+ );
51
+ });
52
+
35
53
  type ToolbarLinkProps = LinkProps;
36
54
 
37
55
  const ToolbarLink = forwardRef<HTMLAnchorElement, ToolbarLinkProps>((props, forwardedRef) => {
@@ -84,6 +102,7 @@ export const Toolbar = {
84
102
  Root: ToolbarRoot,
85
103
  Button: ToolbarButton,
86
104
  Link: ToolbarLink,
105
+ Toggle: ToolbarToggle,
87
106
  ToggleGroup: ToolbarToggleGroup,
88
107
  ToggleGroupItem: ToolbarToggleGroupItem,
89
108
  Separator: ToolbarSeparator,
@@ -93,6 +112,7 @@ export type {
93
112
  ToolbarRootProps,
94
113
  ToolbarButtonProps,
95
114
  ToolbarLinkProps,
115
+ ToolbarToggleProps,
96
116
  ToolbarToggleGroupProps,
97
117
  ToolbarToggleGroupItemProps,
98
118
  ToolbarSeparatorProps,
@@ -29,8 +29,9 @@ const StoryTooltip = ({ content }: StoryTooltipProps) => (
29
29
  );
30
30
 
31
31
  export default {
32
- title: 'react-ui/Tooltip',
33
- component: StoryTooltip,
32
+ title: 'ui/react-ui-core/Tooltip',
33
+ component: Tooltip,
34
+ render: StoryTooltip,
34
35
  decorators: [withTheme],
35
36
  parameters: { chromatic: { disableSnapshot: false } },
36
37
  };
@@ -4,6 +4,8 @@
4
4
 
5
5
  import { useContext } from 'react';
6
6
 
7
+ import { raise } from '@dxos/debug';
8
+
7
9
  import { ThemeContext } from '../components';
8
10
 
9
- export const useThemeContext = () => useContext(ThemeContext);
11
+ export const useThemeContext = () => useContext(ThemeContext) ?? raise(new Error('Missing ThemeContext'));
@@ -7,11 +7,10 @@ import '@dxos-theme';
7
7
  import { FileTs, FileJs, ArrowClockwise, Bug, TextUnderline, TextB, TextItalic } from '@phosphor-icons/react';
8
8
  import React, { useState } from 'react';
9
9
 
10
- import { createScenarios } from './helpers';
11
10
  import { Input, Select, Toggle, Toolbar } from '../components';
12
- import { withTheme } from '../testing';
11
+ import { withTheme, withVariants } from '../testing';
13
12
 
14
- const Story = () => {
13
+ const DefaultStory = () => {
15
14
  const [checked, setChecked] = useState<boolean>(false);
16
15
  const [select, setSelect] = useState<string>();
17
16
 
@@ -82,13 +81,11 @@ const Story = () => {
82
81
  );
83
82
  };
84
83
 
84
+ export const Default = {};
85
+
85
86
  export default {
86
- title: 'react-ui/Scenarios/Controls',
87
- component: Story,
88
- decorators: [withTheme],
87
+ title: 'ui/react-ui-core/Playground/Controls',
88
+ render: DefaultStory,
89
+ decorators: [withVariants(), withTheme],
89
90
  parameters: { chromatic: { disableSnapshot: false } },
90
91
  };
91
-
92
- export const Default = {
93
- render: createScenarios(Story),
94
- };
@@ -47,7 +47,7 @@ const Surface = ({ children, level }: PropsWithChildren & { level: SurfaceLevel
47
47
  );
48
48
  };
49
49
 
50
- const SurfacesStory = () => {
50
+ const SurfaceStory = () => {
51
51
  return (
52
52
  <div className='bg-cubes p-10 m-0'>
53
53
  <Surface level='fixed' />
@@ -61,8 +61,9 @@ const SurfacesStory = () => {
61
61
  };
62
62
 
63
63
  export default {
64
- title: 'react-ui/Scenarios/Surfaces',
65
- component: SurfacesStory,
64
+ title: 'ui/react-ui-core/Playground/Surfaces',
65
+ component: Surface,
66
+ render: SurfaceStory,
66
67
  decorators: [withTheme],
67
68
  parameters: { chromatic: { disableSnapshot: false } },
68
69
  };
@@ -44,8 +44,8 @@ const TypographyStory = () => {
44
44
  };
45
45
 
46
46
  export default {
47
- title: 'react-ui/Scenarios/Typography',
48
- component: TypographyStory,
47
+ title: 'ui/react-ui-core/Playground/Typography',
48
+ render: TypographyStory,
49
49
  decorators: [withTheme],
50
50
  parameters: { chromatic: { disableSnapshot: false } },
51
51
  };
@@ -3,3 +3,4 @@
3
3
  //
4
4
 
5
5
  export * from './withTheme';
6
+ export * from './withVariants';
@@ -0,0 +1,45 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import '@dxos-theme';
6
+
7
+ import { type Decorator } from '@storybook/react';
8
+ import React from 'react';
9
+
10
+ import { modalSurface, groupSurface, mx, surfaceElevation } from '@dxos/react-ui-theme';
11
+ import { type Density, type Elevation } from '@dxos/react-ui-types';
12
+
13
+ import { DensityProvider, ElevationProvider } from '../../components';
14
+
15
+ type Config = {
16
+ elevations?: { elevation: Elevation; surface?: string }[];
17
+ densities?: Density[];
18
+ };
19
+
20
+ export const withVariants = ({
21
+ elevations = [
22
+ { elevation: 'base' },
23
+ { elevation: 'group', surface: groupSurface },
24
+ { elevation: 'chrome', surface: modalSurface },
25
+ ],
26
+ densities = ['coarse', 'fine'],
27
+ }: Config = {}): Decorator => {
28
+ return (Story) => (
29
+ <div className='flex flex-col gap-8'>
30
+ {elevations.map(({ elevation, surface }) => (
31
+ <ElevationProvider key={elevation} elevation={elevation}>
32
+ <div className='flex flex-col gap-8'>
33
+ {densities.map((density) => (
34
+ <DensityProvider key={density} density={density}>
35
+ <div className={mx('p-4 rounded-lg', surface, surfaceElevation({ elevation }))}>
36
+ <Story />
37
+ </div>
38
+ </DensityProvider>
39
+ ))}
40
+ </div>
41
+ </ElevationProvider>
42
+ ))}
43
+ </div>
44
+ );
45
+ };
@@ -1,6 +0,0 @@
1
- import '@dxos-theme';
2
- import React, { type FunctionComponent } from 'react';
3
- export declare const createScenarios: (Component: FunctionComponent<any>) => ({ ...props }: {
4
- [x: string]: any;
5
- }) => React.JSX.Element;
6
- //# sourceMappingURL=helpers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/playground/helpers.tsx"],"names":[],"mappings":"AAIA,OAAO,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAOtD,eAAO,MAAM,eAAe,cACd,iBAAiB,CAAC,GAAG,CAAC;;uBAiBjC,CAAC"}
@@ -1,32 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import '@dxos-theme';
6
-
7
- import React, { type FunctionComponent } from 'react';
8
-
9
- import { type Density } from '@dxos/react-ui-types';
10
-
11
- import { DensityProvider, ElevationProvider } from '../components';
12
-
13
- // TODO(burdon): Grid: density, variant (context?), elevation.
14
- export const createScenarios =
15
- (Component: FunctionComponent<any>) =>
16
- ({ ...props }) => {
17
- const densities: Density[] = ['coarse', 'fine'];
18
- return (
19
- <div className='flex flex-col space-y-8'>
20
- {densities.map((density) => (
21
- <div key={density}>
22
- <ElevationProvider elevation='chrome'>
23
- <DensityProvider density={density}>
24
- <label className='p-2 text-xs'>{density}</label>
25
- <Component {...props} />
26
- </DensityProvider>
27
- </ElevationProvider>
28
- </div>
29
- ))}
30
- </div>
31
- );
32
- };