@dxos/react-ui 0.8.4-main.406dc2a → 0.8.4-main.59c2e9b
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.
- package/dist/lib/browser/chunk-CEKVHJ27.mjs +774 -0
- package/dist/lib/browser/chunk-CEKVHJ27.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +3067 -64
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +34 -46
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/chunk-2NHEX4AD.mjs +776 -0
- package/dist/lib/node-esm/chunk-2NHEX4AD.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +3067 -64
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +34 -46
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/types/src/components/{Buttons → Button}/Button.d.ts +1 -1
- package/dist/types/src/components/Button/Button.d.ts.map +1 -0
- package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -0
- package/dist/types/src/components/{Buttons → Button}/IconButton.d.ts +2 -2
- package/dist/types/src/components/Button/IconButton.d.ts.map +1 -0
- package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -0
- package/dist/types/src/components/Button/Toggle.d.ts.map +1 -0
- package/dist/types/src/components/Button/Toggle.stories.d.ts +16 -0
- package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -0
- package/dist/types/src/components/{Buttons → Button}/ToggleGroup.d.ts +4 -4
- package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -0
- package/dist/types/src/components/{Buttons → Button}/ToggleGroup.stories.d.ts +4 -4
- package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -0
- package/dist/types/src/components/Button/index.d.ts.map +1 -0
- package/dist/types/src/components/Clipboard/CopyButton.d.ts +1 -1
- package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
- package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
- package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
- package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -0
- package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -0
- package/dist/types/src/components/Dialog/Dialog.d.ts +40 -0
- package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -0
- package/dist/types/src/components/{Dialogs → Dialog}/Dialog.stories.d.ts +7 -5
- package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -0
- package/dist/types/src/components/Dialog/index.d.ts.map +1 -0
- package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
- package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
- package/dist/types/src/components/Icon/Icon.d.ts +1 -1
- package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
- package/dist/types/src/components/Icon/Icon.stories.d.ts +17 -0
- package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -0
- package/dist/types/src/components/Input/Input.d.ts +5 -2
- package/dist/types/src/components/Input/Input.d.ts.map +1 -1
- package/dist/types/src/components/Input/Input.stories.d.ts +1 -1
- package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
- package/dist/types/src/components/{Lists → List}/List.d.ts +1 -1
- package/dist/types/src/components/List/List.d.ts.map +1 -0
- package/dist/types/src/components/List/List.stories.d.ts.map +1 -0
- package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -0
- package/dist/types/src/components/List/Tree.d.ts.map +1 -0
- package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -0
- package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -0
- package/dist/types/src/components/List/Treegrid.d.ts.map +1 -0
- package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -0
- package/dist/types/src/components/List/index.d.ts.map +1 -0
- package/dist/types/src/components/Main/Main.d.ts +8 -8
- package/dist/types/src/components/Main/Main.d.ts.map +1 -1
- package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
- package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
- package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
- package/dist/types/src/components/{Menus → Menu}/DropdownMenu.d.ts +3 -4
- package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
- package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
- package/dist/types/src/components/Menu/index.d.ts.map +1 -0
- package/dist/types/src/components/Message/Message.d.ts +1 -1
- package/dist/types/src/components/Message/Message.d.ts.map +1 -1
- package/dist/types/src/components/Message/Message.stories.d.ts +1 -1
- package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
- package/dist/types/src/components/Popover/Popover.d.ts +1 -1
- package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
- package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +9 -7
- package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
- package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +4 -0
- package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
- package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +39 -0
- package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -0
- package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +19 -0
- package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -0
- package/dist/types/src/components/ScrollContainer/index.d.ts +2 -0
- package/dist/types/src/components/ScrollContainer/index.d.ts.map +1 -0
- package/dist/types/src/components/Select/Select.d.ts +10 -10
- package/dist/types/src/components/Select/Select.d.ts.map +1 -1
- package/dist/types/src/components/Separator/Separator.d.ts +1 -1
- package/dist/types/src/components/Tag/Tag.d.ts +1 -1
- package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
- package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +1 -2
- package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
- package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
- package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
- package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
- package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
- package/dist/types/src/components/Toast/Toast.d.ts +4 -4
- package/dist/types/src/components/Toolbar/Toolbar.d.ts +11 -9
- package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
- package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +5 -4
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
- package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
- package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
- package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
- package/dist/types/src/testing/decorators/index.d.ts +1 -1
- package/dist/types/src/testing/decorators/index.d.ts.map +1 -1
- package/dist/types/src/testing/decorators/withLayout.d.ts +3 -3
- package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
- package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +12 -0
- package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -0
- package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
- package/dist/types/src/util/index.d.ts +1 -2
- package/dist/types/src/util/index.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +32 -24
- package/src/components/Avatars/Avatar.stories.tsx +2 -2
- package/src/components/Avatars/Avatar.tsx +1 -1
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -1
- package/src/components/{Buttons → Button}/Button.stories.tsx +2 -2
- package/src/components/{Buttons → Button}/Button.tsx +1 -1
- package/src/components/{Buttons → Button}/IconButton.tsx +19 -13
- package/src/components/{Buttons → Button}/Toggle.stories.tsx +5 -4
- package/src/components/Clipboard/CopyButton.tsx +4 -4
- package/src/components/DensityProvider/DensityProvider.tsx +1 -1
- package/src/components/{Dialogs → Dialog}/AlertDialog.stories.tsx +1 -1
- package/src/components/Dialog/Dialog.stories.tsx +97 -0
- package/src/components/{Dialogs → Dialog}/Dialog.tsx +140 -40
- package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
- package/src/components/Icon/Icon.stories.tsx +113 -0
- package/src/components/Icon/Icon.tsx +2 -2
- package/src/components/Input/Input.stories.tsx +2 -2
- package/src/components/Input/Input.tsx +13 -4
- package/src/components/{Lists → List}/List.stories.tsx +17 -13
- package/src/components/{Lists → List}/List.tsx +1 -1
- package/src/components/{Lists → List}/ListDropIndicator.tsx +1 -1
- package/src/components/Main/Main.stories.tsx +1 -1
- package/src/components/Main/Main.tsx +13 -13
- package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +1 -1
- package/src/components/{Menus → Menu}/DropdownMenu.tsx +79 -58
- package/src/components/Message/Message.stories.tsx +1 -1
- package/src/components/Message/Message.tsx +30 -5
- package/src/components/Popover/Popover.stories.tsx +1 -1
- package/src/components/Popover/Popover.tsx +52 -33
- package/src/components/ScrollArea/ScrollArea.stories.tsx +54 -4
- package/src/components/ScrollArea/ScrollArea.tsx +50 -4
- package/src/components/ScrollContainer/ScrollContainer.stories.tsx +70 -0
- package/src/components/ScrollContainer/ScrollContainer.tsx +233 -0
- package/src/components/ScrollContainer/index.ts +5 -0
- package/src/components/Select/Select.stories.tsx +2 -2
- package/src/components/Select/Select.tsx +4 -4
- package/src/components/Tag/Tag.stories.tsx +2 -2
- package/src/components/Tag/Tag.tsx +1 -1
- package/src/components/ThemeProvider/ThemeProvider.tsx +1 -3
- package/src/components/ThemeProvider/TranslationsProvider.tsx +1 -16
- package/src/components/ThemeProvider/index.ts +3 -3
- package/src/components/Toast/Toast.stories.tsx +1 -1
- package/src/components/Toolbar/Toolbar.stories.tsx +2 -4
- package/src/components/Toolbar/Toolbar.tsx +24 -9
- package/src/components/Tooltip/Tooltip.stories.tsx +1 -1
- package/src/components/Tooltip/Tooltip.tsx +22 -20
- package/src/components/index.ts +5 -4
- package/src/hooks/useDensityContext.ts +1 -1
- package/src/hooks/useElevationContext.ts +1 -1
- package/src/index.ts +1 -1
- package/src/playground/Controls.stories.tsx +2 -2
- package/src/playground/Custom.stories.tsx +6 -8
- package/src/testing/decorators/index.ts +1 -1
- package/src/testing/decorators/withLayout.tsx +22 -15
- package/src/testing/decorators/{withSurfaceVariantsLayout.tsx → withLayoutVariants.tsx} +5 -5
- package/src/testing/decorators/withTheme.tsx +3 -2
- package/src/util/index.ts +2 -2
- package/dist/lib/browser/chunk-KX5JDELJ.mjs +0 -4521
- package/dist/lib/browser/chunk-KX5JDELJ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-3HDQYL5S.mjs +0 -4523
- package/dist/lib/node-esm/chunk-3HDQYL5S.mjs.map +0 -7
- package/dist/types/src/components/Buttons/Button.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/Button.stories.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/IconButton.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/IconButton.stories.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/Toggle.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/Toggle.stories.d.ts +0 -13
- package/dist/types/src/components/Buttons/Toggle.stories.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/ToggleGroup.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/index.d.ts.map +0 -1
- package/dist/types/src/components/Dialogs/AlertDialog.d.ts.map +0 -1
- package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts.map +0 -1
- package/dist/types/src/components/Dialogs/Dialog.d.ts +0 -31
- package/dist/types/src/components/Dialogs/Dialog.d.ts.map +0 -1
- package/dist/types/src/components/Dialogs/Dialog.stories.d.ts.map +0 -1
- package/dist/types/src/components/Dialogs/index.d.ts.map +0 -1
- package/dist/types/src/components/Lists/List.d.ts.map +0 -1
- package/dist/types/src/components/Lists/List.stories.d.ts.map +0 -1
- package/dist/types/src/components/Lists/ListDropIndicator.d.ts.map +0 -1
- package/dist/types/src/components/Lists/Tree.d.ts.map +0 -1
- package/dist/types/src/components/Lists/Tree.stories.d.ts.map +0 -1
- package/dist/types/src/components/Lists/TreeDropIndicator.d.ts.map +0 -1
- package/dist/types/src/components/Lists/Treegrid.d.ts.map +0 -1
- package/dist/types/src/components/Lists/Treegrid.stories.d.ts.map +0 -1
- package/dist/types/src/components/Lists/index.d.ts.map +0 -1
- package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
- package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
- package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
- package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
- package/dist/types/src/components/Menus/index.d.ts.map +0 -1
- package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts +0 -12
- package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts.map +0 -1
- package/dist/types/src/util/ThemedClassName.d.ts +0 -5
- package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
- package/dist/types/src/util/domino.d.ts +0 -18
- package/dist/types/src/util/domino.d.ts.map +0 -1
- package/src/components/Dialogs/Dialog.stories.tsx +0 -67
- package/src/util/ThemedClassName.ts +0 -7
- package/src/util/domino.ts +0 -53
- /package/dist/types/src/components/{Buttons → Button}/Button.stories.d.ts +0 -0
- /package/dist/types/src/components/{Buttons → Button}/IconButton.stories.d.ts +0 -0
- /package/dist/types/src/components/{Buttons → Button}/Toggle.d.ts +0 -0
- /package/dist/types/src/components/{Buttons → Button}/index.d.ts +0 -0
- /package/dist/types/src/components/{Dialogs → Dialog}/AlertDialog.d.ts +0 -0
- /package/dist/types/src/components/{Dialogs → Dialog}/AlertDialog.stories.d.ts +0 -0
- /package/dist/types/src/components/{Dialogs → Dialog}/index.d.ts +0 -0
- /package/dist/types/src/components/{Lists → List}/List.stories.d.ts +0 -0
- /package/dist/types/src/components/{Lists → List}/ListDropIndicator.d.ts +0 -0
- /package/dist/types/src/components/{Lists → List}/Tree.d.ts +0 -0
- /package/dist/types/src/components/{Lists → List}/Tree.stories.d.ts +0 -0
- /package/dist/types/src/components/{Lists → List}/TreeDropIndicator.d.ts +0 -0
- /package/dist/types/src/components/{Lists → List}/Treegrid.d.ts +0 -0
- /package/dist/types/src/components/{Lists → List}/Treegrid.stories.d.ts +0 -0
- /package/dist/types/src/components/{Lists → List}/index.d.ts +0 -0
- /package/dist/types/src/components/{Menus → Menu}/ContextMenu.stories.d.ts +0 -0
- /package/dist/types/src/components/{Menus → Menu}/DropdownMenu.stories.d.ts +0 -0
- /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
- /package/src/components/{Buttons → Button}/IconButton.stories.tsx +0 -0
- /package/src/components/{Buttons → Button}/Toggle.tsx +0 -0
- /package/src/components/{Buttons → Button}/ToggleGroup.stories.tsx +0 -0
- /package/src/components/{Buttons → Button}/ToggleGroup.tsx +0 -0
- /package/src/components/{Buttons → Button}/index.ts +0 -0
- /package/src/components/{Dialogs → Dialog}/AlertDialog.tsx +0 -0
- /package/src/components/{Dialogs → Dialog}/index.ts +0 -0
- /package/src/components/{Lists → List}/Tree.stories.tsx +0 -0
- /package/src/components/{Lists → List}/Tree.tsx +0 -0
- /package/src/components/{Lists → List}/TreeDropIndicator.tsx +0 -0
- /package/src/components/{Lists → List}/Treegrid.stories.tsx +0 -0
- /package/src/components/{Lists → List}/Treegrid.tsx +0 -0
- /package/src/components/{Lists → List}/index.ts +0 -0
- /package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +0 -0
- /package/src/components/{Menus → Menu}/ContextMenu.tsx +0 -0
- /package/src/components/{Menus → Menu}/index.ts +0 -0
|
@@ -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 Elevation, type MessageValence } from '@dxos/
|
|
11
|
+
import { type Elevation, type MessageValence } from '@dxos/ui-types';
|
|
12
12
|
|
|
13
13
|
import { useElevationContext, useThemeContext } from '../../hooks';
|
|
14
14
|
import { type ThemedClassName } from '../../util';
|
|
@@ -31,9 +31,15 @@ type MessageRootProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.d
|
|
|
31
31
|
};
|
|
32
32
|
|
|
33
33
|
type MessageContextValue = { titleId?: string; descriptionId: string; valence: MessageValence };
|
|
34
|
+
|
|
34
35
|
const MESSAGE_NAME = 'Message';
|
|
36
|
+
|
|
35
37
|
const [MessageProvider, useMessageContext] = createContext<MessageContextValue>(MESSAGE_NAME);
|
|
36
38
|
|
|
39
|
+
//
|
|
40
|
+
// Root
|
|
41
|
+
//
|
|
42
|
+
|
|
37
43
|
const MessageRoot = forwardRef<HTMLDivElement, MessageRootProps>(
|
|
38
44
|
(
|
|
39
45
|
{
|
|
@@ -53,6 +59,7 @@ const MessageRoot = forwardRef<HTMLDivElement, MessageRootProps>(
|
|
|
53
59
|
const descriptionId = useId('message__description', propsDescriptionId);
|
|
54
60
|
const elevation = useElevationContext(propsElevation);
|
|
55
61
|
const Root = asChild ? Slot : Primitive.div;
|
|
62
|
+
|
|
56
63
|
return (
|
|
57
64
|
<MessageProvider {...{ titleId, descriptionId, valence }}>
|
|
58
65
|
<Root
|
|
@@ -72,6 +79,10 @@ const MessageRoot = forwardRef<HTMLDivElement, MessageRootProps>(
|
|
|
72
79
|
|
|
73
80
|
MessageRoot.displayName = MESSAGE_NAME;
|
|
74
81
|
|
|
82
|
+
//
|
|
83
|
+
// Title
|
|
84
|
+
//
|
|
85
|
+
|
|
75
86
|
type MessageTitleProps = Omit<ThemedClassName<ComponentPropsWithRef<typeof Primitive.h2>>, 'id'> & {
|
|
76
87
|
asChild?: boolean;
|
|
77
88
|
icon?: string;
|
|
@@ -84,6 +95,7 @@ const MessageTitle = forwardRef<HTMLHeadingElement, MessageTitleProps>(
|
|
|
84
95
|
const { tx } = useThemeContext();
|
|
85
96
|
const { titleId, valence } = useMessageContext(MESSAGE_TITLE_NAME);
|
|
86
97
|
const Root = asChild ? Slot : Primitive.h2;
|
|
98
|
+
|
|
87
99
|
return (
|
|
88
100
|
<Root
|
|
89
101
|
{...props}
|
|
@@ -106,16 +118,20 @@ const MessageTitle = forwardRef<HTMLHeadingElement, MessageTitleProps>(
|
|
|
106
118
|
|
|
107
119
|
MessageTitle.displayName = MESSAGE_TITLE_NAME;
|
|
108
120
|
|
|
121
|
+
//
|
|
122
|
+
// Content
|
|
123
|
+
//
|
|
124
|
+
|
|
109
125
|
type MessageContentProps = Omit<ThemedClassName<ComponentPropsWithRef<typeof Primitive.h2>>, 'id'> & {
|
|
110
126
|
asChild?: boolean;
|
|
111
127
|
};
|
|
112
128
|
|
|
113
|
-
const
|
|
129
|
+
const MESSAGE_CONTENT_NAME = 'MessageContent';
|
|
114
130
|
|
|
115
131
|
const MessageContent = forwardRef<HTMLParagraphElement, MessageContentProps>(
|
|
116
132
|
({ asChild, classNames, children, ...props }, forwardedRef) => {
|
|
117
133
|
const { tx } = useThemeContext();
|
|
118
|
-
const { descriptionId } = useMessageContext(
|
|
134
|
+
const { descriptionId } = useMessageContext(MESSAGE_CONTENT_NAME);
|
|
119
135
|
const Root = asChild ? Slot : Primitive.p;
|
|
120
136
|
return (
|
|
121
137
|
<Root
|
|
@@ -130,9 +146,18 @@ const MessageContent = forwardRef<HTMLParagraphElement, MessageContentProps>(
|
|
|
130
146
|
},
|
|
131
147
|
);
|
|
132
148
|
|
|
133
|
-
MessageContent.displayName =
|
|
149
|
+
MessageContent.displayName = MESSAGE_CONTENT_NAME;
|
|
150
|
+
|
|
151
|
+
//
|
|
152
|
+
// Message
|
|
153
|
+
//
|
|
154
|
+
|
|
155
|
+
export const Message = {
|
|
156
|
+
Root: MessageRoot,
|
|
157
|
+
Title: MessageTitle,
|
|
158
|
+
Content: MessageContent,
|
|
159
|
+
};
|
|
134
160
|
|
|
135
|
-
export const Message = { Root: MessageRoot, Title: MessageTitle, Content: MessageContent };
|
|
136
161
|
export const Callout = Message;
|
|
137
162
|
|
|
138
163
|
export type { MessageRootProps, MessageTitleProps, MessageContentProps };
|
|
@@ -8,7 +8,7 @@ import React, { type PropsWithChildren, type ReactNode, useRef, useState } from
|
|
|
8
8
|
import { faker } from '@dxos/random';
|
|
9
9
|
|
|
10
10
|
import { withTheme } from '../../testing';
|
|
11
|
-
import { Button } from '../
|
|
11
|
+
import { Button } from '../Button';
|
|
12
12
|
|
|
13
13
|
import { Popover } from './Popover';
|
|
14
14
|
|
|
@@ -31,6 +31,7 @@ import React, {
|
|
|
31
31
|
forwardRef,
|
|
32
32
|
useCallback,
|
|
33
33
|
useEffect,
|
|
34
|
+
useMemo,
|
|
34
35
|
useRef,
|
|
35
36
|
useState,
|
|
36
37
|
} from 'react';
|
|
@@ -40,9 +41,9 @@ import { useElevationContext, useThemeContext } from '../../hooks';
|
|
|
40
41
|
import { useSafeCollisionPadding } from '../../hooks/useSafeCollisionPadding';
|
|
41
42
|
import { type ThemedClassName } from '../../util';
|
|
42
43
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
//
|
|
45
|
+
// Context
|
|
46
|
+
//
|
|
46
47
|
|
|
47
48
|
const POPOVER_NAME = 'Popover';
|
|
48
49
|
|
|
@@ -64,6 +65,10 @@ type PopoverContextValue = {
|
|
|
64
65
|
|
|
65
66
|
const [PopoverProvider, usePopoverContext] = createPopoverContext<PopoverContextValue>(POPOVER_NAME);
|
|
66
67
|
|
|
68
|
+
//
|
|
69
|
+
// PopoverRoot
|
|
70
|
+
//
|
|
71
|
+
|
|
67
72
|
interface PopoverRootProps {
|
|
68
73
|
children?: ReactNode;
|
|
69
74
|
open?: boolean;
|
|
@@ -105,9 +110,9 @@ const PopoverRoot: FC<PopoverRootProps> = (props: ScopedProps<PopoverRootProps>)
|
|
|
105
110
|
|
|
106
111
|
PopoverRoot.displayName = POPOVER_NAME;
|
|
107
112
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
113
|
+
//
|
|
114
|
+
// PopoverAnchor
|
|
115
|
+
//
|
|
111
116
|
|
|
112
117
|
const ANCHOR_NAME = 'PopoverAnchor';
|
|
113
118
|
|
|
@@ -133,9 +138,9 @@ const PopoverAnchor = forwardRef<PopoverAnchorElement, PopoverAnchorProps>(
|
|
|
133
138
|
|
|
134
139
|
PopoverAnchor.displayName = ANCHOR_NAME;
|
|
135
140
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
141
|
+
//
|
|
142
|
+
// PopoverTrigger
|
|
143
|
+
//
|
|
139
144
|
|
|
140
145
|
const TRIGGER_NAME = 'PopoverTrigger';
|
|
141
146
|
|
|
@@ -175,9 +180,9 @@ const PopoverTrigger = forwardRef<PopoverTriggerElement, PopoverTriggerProps>(
|
|
|
175
180
|
|
|
176
181
|
PopoverTrigger.displayName = TRIGGER_NAME;
|
|
177
182
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
183
|
+
//
|
|
184
|
+
// PopoverVirtualTrigger
|
|
185
|
+
//
|
|
181
186
|
|
|
182
187
|
const VIRTUAL_TRIGGER_NAME = 'PopoverVirtualTrigger';
|
|
183
188
|
|
|
@@ -199,9 +204,9 @@ const PopoverVirtualTrigger = (props: ScopedProps<PopoverVirtualTriggerProps>) =
|
|
|
199
204
|
|
|
200
205
|
PopoverVirtualTrigger.displayName = VIRTUAL_TRIGGER_NAME;
|
|
201
206
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
207
|
+
//
|
|
208
|
+
// PopoverPortal
|
|
209
|
+
//
|
|
205
210
|
|
|
206
211
|
const PORTAL_NAME = 'PopoverPortal';
|
|
207
212
|
|
|
@@ -240,9 +245,9 @@ const PopoverPortal: FC<PopoverPortalProps> = (props: ScopedProps<PopoverPortalP
|
|
|
240
245
|
|
|
241
246
|
PopoverPortal.displayName = PORTAL_NAME;
|
|
242
247
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
248
|
+
//
|
|
249
|
+
// PopoverContent
|
|
250
|
+
//
|
|
246
251
|
|
|
247
252
|
const CONTENT_NAME = 'PopoverContent';
|
|
248
253
|
|
|
@@ -274,8 +279,6 @@ const PopoverContent = forwardRef<PopoverContentTypeElement, PopoverContentProps
|
|
|
274
279
|
|
|
275
280
|
PopoverContent.displayName = CONTENT_NAME;
|
|
276
281
|
|
|
277
|
-
/* ----------------------------------------------------------------------------------------------- */
|
|
278
|
-
|
|
279
282
|
type PopoverContentTypeElement = PopoverContentImplElement;
|
|
280
283
|
export interface PopoverContentTypeProps
|
|
281
284
|
extends Omit<PopoverContentImplProps, 'trapFocus' | 'disableOutsidePointerEvents'> {}
|
|
@@ -390,8 +393,6 @@ const PopoverContentNonModal = forwardRef<PopoverContentTypeElement, PopoverCont
|
|
|
390
393
|
},
|
|
391
394
|
);
|
|
392
395
|
|
|
393
|
-
/* ----------------------------------------------------------------------------------------------- */
|
|
394
|
-
|
|
395
396
|
type PopoverContentImplElement = ElementRef<typeof PopperPrimitive.Content>;
|
|
396
397
|
type FocusScopeProps = ComponentPropsWithoutRef<typeof FocusScope>;
|
|
397
398
|
type DismissableLayerProps = ComponentPropsWithoutRef<typeof DismissableLayer>;
|
|
@@ -432,6 +433,7 @@ const PopoverContentImpl = forwardRef<PopoverContentImplElement, PopoverContentI
|
|
|
432
433
|
onFocusOutside,
|
|
433
434
|
onInteractOutside,
|
|
434
435
|
collisionPadding = 8,
|
|
436
|
+
collisionBoundary,
|
|
435
437
|
classNames,
|
|
436
438
|
...contentProps
|
|
437
439
|
} = props;
|
|
@@ -444,6 +446,20 @@ const PopoverContentImpl = forwardRef<PopoverContentImplElement, PopoverContentI
|
|
|
444
446
|
// Make sure the whole tree has focus guards as our `Popover` may be the last element in the DOM (because of the `Portal`)
|
|
445
447
|
useFocusGuards();
|
|
446
448
|
|
|
449
|
+
// Check for the closest annotated collision boundary in the DOM tree.
|
|
450
|
+
const computedCollisionBoundary = useMemo(() => {
|
|
451
|
+
const closestBoundary = context.triggerRef.current?.closest(
|
|
452
|
+
'[data-popover-collision-boundary]',
|
|
453
|
+
) as HTMLElement | null;
|
|
454
|
+
return closestBoundary
|
|
455
|
+
? Array.isArray(collisionBoundary)
|
|
456
|
+
? [closestBoundary, ...collisionBoundary]
|
|
457
|
+
: collisionBoundary
|
|
458
|
+
? [closestBoundary, collisionBoundary]
|
|
459
|
+
: [closestBoundary]
|
|
460
|
+
: collisionBoundary;
|
|
461
|
+
}, [context.open, collisionBoundary, context.triggerRef.current]);
|
|
462
|
+
|
|
447
463
|
return (
|
|
448
464
|
<FocusScope
|
|
449
465
|
asChild
|
|
@@ -468,6 +484,7 @@ const PopoverContentImpl = forwardRef<PopoverContentImplElement, PopoverContentI
|
|
|
468
484
|
{...popperScope}
|
|
469
485
|
{...contentProps}
|
|
470
486
|
collisionPadding={safeCollisionPadding}
|
|
487
|
+
collisionBoundary={computedCollisionBoundary}
|
|
471
488
|
className={tx('popover.content', 'popover', { elevation }, classNames)}
|
|
472
489
|
ref={forwardedRef}
|
|
473
490
|
style={{
|
|
@@ -488,9 +505,9 @@ const PopoverContentImpl = forwardRef<PopoverContentImplElement, PopoverContentI
|
|
|
488
505
|
},
|
|
489
506
|
);
|
|
490
507
|
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
508
|
+
//
|
|
509
|
+
// PopoverClose
|
|
510
|
+
//
|
|
494
511
|
|
|
495
512
|
const CLOSE_NAME = 'PopoverClose';
|
|
496
513
|
|
|
@@ -514,9 +531,9 @@ const PopoverClose = forwardRef<PopoverCloseElement, PopoverCloseProps>(
|
|
|
514
531
|
|
|
515
532
|
PopoverClose.displayName = CLOSE_NAME;
|
|
516
533
|
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
534
|
+
//
|
|
535
|
+
// PopoverArrow
|
|
536
|
+
//
|
|
520
537
|
|
|
521
538
|
const ARROW_NAME = 'PopoverArrow';
|
|
522
539
|
|
|
@@ -542,9 +559,9 @@ const PopoverArrow = forwardRef<PopoverArrowElement, PopoverArrowProps>(
|
|
|
542
559
|
|
|
543
560
|
PopoverArrow.displayName = ARROW_NAME;
|
|
544
561
|
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
562
|
+
//
|
|
563
|
+
// PopoverViewport
|
|
564
|
+
//
|
|
548
565
|
|
|
549
566
|
type PopoverViewportProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.div>> & {
|
|
550
567
|
asChild?: boolean;
|
|
@@ -568,12 +585,14 @@ const PopoverViewport = forwardRef<HTMLDivElement, PopoverViewportProps>(
|
|
|
568
585
|
},
|
|
569
586
|
);
|
|
570
587
|
|
|
571
|
-
/* ----------------------------------------------------------------------------------------------- */
|
|
572
|
-
|
|
573
588
|
const getState = (open: boolean) => (open ? 'open' : 'closed');
|
|
574
589
|
|
|
575
590
|
type PopoverContentInteractOutsideEvent = Parameters<NonNullable<PopoverContentProps['onInteractOutside']>>[0];
|
|
576
591
|
|
|
592
|
+
//
|
|
593
|
+
// Popver
|
|
594
|
+
//
|
|
595
|
+
|
|
577
596
|
export const Popover = {
|
|
578
597
|
Root: PopoverRoot,
|
|
579
598
|
Anchor: PopoverAnchor,
|
|
@@ -6,9 +6,9 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
|
6
6
|
import React, { type PropsWithChildren } from 'react';
|
|
7
7
|
|
|
8
8
|
import { faker } from '@dxos/random';
|
|
9
|
-
import { activeSurface, surfaceShadow } from '@dxos/
|
|
9
|
+
import { activeSurface, surfaceShadow } from '@dxos/ui-theme';
|
|
10
10
|
|
|
11
|
-
import { withTheme } from '../../testing';
|
|
11
|
+
import { withLayout, withTheme } from '../../testing';
|
|
12
12
|
|
|
13
13
|
import { ScrollArea } from './ScrollArea';
|
|
14
14
|
|
|
@@ -34,10 +34,13 @@ const DefaultStory = ({ children }: PropsWithChildren<{}>) => {
|
|
|
34
34
|
};
|
|
35
35
|
|
|
36
36
|
const meta = {
|
|
37
|
-
title: 'ui/react-ui-core/
|
|
37
|
+
title: 'ui/react-ui-core/ScrollArea',
|
|
38
38
|
component: ScrollArea as any,
|
|
39
39
|
render: DefaultStory,
|
|
40
|
-
decorators: [withTheme],
|
|
40
|
+
decorators: [withTheme, withLayout({ layout: 'fullscreen' })],
|
|
41
|
+
parameters: {
|
|
42
|
+
layout: 'fullscreen',
|
|
43
|
+
},
|
|
41
44
|
} satisfies Meta<typeof DefaultStory>;
|
|
42
45
|
|
|
43
46
|
export default meta;
|
|
@@ -49,3 +52,50 @@ export const Default: Story = {
|
|
|
49
52
|
children: faker.lorem.paragraphs(5),
|
|
50
53
|
},
|
|
51
54
|
};
|
|
55
|
+
|
|
56
|
+
export const NestedScrollAreas: Story = {
|
|
57
|
+
render: () => {
|
|
58
|
+
const columns = Array.from({ length: 3 }).map((_, index) => ({
|
|
59
|
+
id: String(index),
|
|
60
|
+
itemCount: 20,
|
|
61
|
+
}));
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
<div className='p-4 bs-full is-full overflow-hidden'>
|
|
65
|
+
<div className='flex bs-full is-full overflow-hidden border border-sky-500'>
|
|
66
|
+
<ScrollArea.Root>
|
|
67
|
+
<ScrollArea.Viewport>
|
|
68
|
+
<div className='flex gap-4 p-3 bs-full overflow-hidden'>
|
|
69
|
+
{columns.map((column) => (
|
|
70
|
+
<div key={column.id} className='flex flex-col gap-1 bs-full overflow-hidden is-[300px]'>
|
|
71
|
+
<div className='flex shrink-0 p-2 border border-separator'>Column {column.id}</div>
|
|
72
|
+
<ScrollArea.Expander classNames='border border-rose-500'>
|
|
73
|
+
<ScrollArea.Root>
|
|
74
|
+
<ScrollArea.Viewport>
|
|
75
|
+
<div className='flex flex-col p-3 space-y-2'>
|
|
76
|
+
{Array.from({ length: column.itemCount }, (_, i) => (
|
|
77
|
+
<div key={i} className={`p-3 border border-separator rounded-sm`}>
|
|
78
|
+
Item {i + 1}
|
|
79
|
+
</div>
|
|
80
|
+
))}
|
|
81
|
+
</div>
|
|
82
|
+
</ScrollArea.Viewport>
|
|
83
|
+
<ScrollArea.Scrollbar orientation='vertical'>
|
|
84
|
+
<ScrollArea.Thumb />
|
|
85
|
+
</ScrollArea.Scrollbar>
|
|
86
|
+
</ScrollArea.Root>
|
|
87
|
+
</ScrollArea.Expander>
|
|
88
|
+
<div className={`p-2 border border-separator`}>Footer</div>
|
|
89
|
+
</div>
|
|
90
|
+
))}
|
|
91
|
+
</div>
|
|
92
|
+
</ScrollArea.Viewport>
|
|
93
|
+
<ScrollArea.Scrollbar orientation='horizontal'>
|
|
94
|
+
<ScrollArea.Thumb />
|
|
95
|
+
</ScrollArea.Scrollbar>
|
|
96
|
+
</ScrollArea.Root>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
);
|
|
100
|
+
},
|
|
101
|
+
};
|
|
@@ -14,18 +14,21 @@ import {
|
|
|
14
14
|
Viewport as ScrollAreaPrimitiveViewport,
|
|
15
15
|
type ScrollAreaViewportProps as ScrollAreaPrimitiveViewportProps,
|
|
16
16
|
} from '@radix-ui/react-scroll-area';
|
|
17
|
-
import React, { forwardRef } from 'react';
|
|
17
|
+
import React, { type PropsWithChildren, forwardRef } from 'react';
|
|
18
|
+
|
|
19
|
+
import { mx } from '@dxos/ui-theme';
|
|
18
20
|
|
|
19
21
|
import { useThemeContext } from '../../hooks';
|
|
20
22
|
import { type ThemedClassName } from '../../util';
|
|
21
23
|
|
|
22
24
|
type ScrollAreaVariant = 'coarse' | 'fine';
|
|
23
25
|
|
|
26
|
+
//
|
|
27
|
+
// Root
|
|
28
|
+
//
|
|
29
|
+
|
|
24
30
|
type ScrollAreaRootProps = ThemedClassName<ScrollAreaPrimitiveRootProps>;
|
|
25
31
|
|
|
26
|
-
/**
|
|
27
|
-
* @deprecated
|
|
28
|
-
*/
|
|
29
32
|
const ScrollAreaRoot = forwardRef<HTMLDivElement, ScrollAreaRootProps>(({ classNames, ...props }, forwardedRef) => {
|
|
30
33
|
const { tx } = useThemeContext();
|
|
31
34
|
return (
|
|
@@ -37,6 +40,10 @@ const ScrollAreaRoot = forwardRef<HTMLDivElement, ScrollAreaRootProps>(({ classN
|
|
|
37
40
|
);
|
|
38
41
|
});
|
|
39
42
|
|
|
43
|
+
//
|
|
44
|
+
// Viewport
|
|
45
|
+
//
|
|
46
|
+
|
|
40
47
|
type ScrollAreaViewportProps = ThemedClassName<ScrollAreaPrimitiveViewportProps>;
|
|
41
48
|
|
|
42
49
|
const ScrollAreaViewport = forwardRef<HTMLDivElement, ScrollAreaViewportProps>(
|
|
@@ -52,6 +59,10 @@ const ScrollAreaViewport = forwardRef<HTMLDivElement, ScrollAreaViewportProps>(
|
|
|
52
59
|
},
|
|
53
60
|
);
|
|
54
61
|
|
|
62
|
+
//
|
|
63
|
+
// Scrollbar
|
|
64
|
+
//
|
|
65
|
+
|
|
55
66
|
type ScrollAreaScrollbarProps = ThemedClassName<ScrollAreaPrimitiveScrollbarProps> & { variant?: ScrollAreaVariant };
|
|
56
67
|
|
|
57
68
|
const ScrollAreaScrollbar = forwardRef<HTMLDivElement, ScrollAreaScrollbarProps>(
|
|
@@ -68,6 +79,10 @@ const ScrollAreaScrollbar = forwardRef<HTMLDivElement, ScrollAreaScrollbarProps>
|
|
|
68
79
|
},
|
|
69
80
|
);
|
|
70
81
|
|
|
82
|
+
//
|
|
83
|
+
// Thumb
|
|
84
|
+
//
|
|
85
|
+
|
|
71
86
|
type ScrollAreaThumbProps = ThemedClassName<ScrollAreaPrimitiveThumbProps>;
|
|
72
87
|
|
|
73
88
|
const ScrollAreaThumb = forwardRef<HTMLDivElement, ScrollAreaThumbProps>(({ classNames, ...props }, forwardedRef) => {
|
|
@@ -81,6 +96,10 @@ const ScrollAreaThumb = forwardRef<HTMLDivElement, ScrollAreaThumbProps>(({ clas
|
|
|
81
96
|
);
|
|
82
97
|
});
|
|
83
98
|
|
|
99
|
+
//
|
|
100
|
+
// Corner
|
|
101
|
+
//
|
|
102
|
+
|
|
84
103
|
type ScrollAreaCornerProps = ThemedClassName<ScrollAreaPrimitiveCornerProps>;
|
|
85
104
|
|
|
86
105
|
const ScrollAreaCorner = forwardRef<HTMLDivElement, ScrollAreaCornerProps>(({ classNames, ...props }, forwardedRef) => {
|
|
@@ -94,12 +113,38 @@ const ScrollAreaCorner = forwardRef<HTMLDivElement, ScrollAreaCornerProps>(({ cl
|
|
|
94
113
|
);
|
|
95
114
|
});
|
|
96
115
|
|
|
116
|
+
//
|
|
117
|
+
// Expander
|
|
118
|
+
//
|
|
119
|
+
|
|
120
|
+
type ScrollAreaExpanderProps = ThemedClassName<PropsWithChildren>;
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Size-locking wrapper required for inner ScrollArea to function correctly.
|
|
124
|
+
* NOTE: Radix ScrollArea.Viewport applies `display: table` to its immediate child,
|
|
125
|
+
* causing the content to participate in table layout and escape the intended fixed-size viewport.
|
|
126
|
+
*/
|
|
127
|
+
const ScrollAreaExpander = ({ classNames, children }: ScrollAreaExpanderProps) => {
|
|
128
|
+
return (
|
|
129
|
+
<div role='none' className={mx('relative bs-full is-full overflow-hidden', classNames)}>
|
|
130
|
+
<div role='none' className='absolute inset-0 overflow-hidden'>
|
|
131
|
+
{children}
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
134
|
+
);
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
//
|
|
138
|
+
// ScrollArea
|
|
139
|
+
//
|
|
140
|
+
|
|
97
141
|
export const ScrollArea = {
|
|
98
142
|
Root: ScrollAreaRoot,
|
|
99
143
|
Viewport: ScrollAreaViewport,
|
|
100
144
|
Scrollbar: ScrollAreaScrollbar,
|
|
101
145
|
Thumb: ScrollAreaThumb,
|
|
102
146
|
Corner: ScrollAreaCorner,
|
|
147
|
+
Expander: ScrollAreaExpander,
|
|
103
148
|
};
|
|
104
149
|
|
|
105
150
|
export type {
|
|
@@ -108,4 +153,5 @@ export type {
|
|
|
108
153
|
ScrollAreaScrollbarProps,
|
|
109
154
|
ScrollAreaThumbProps,
|
|
110
155
|
ScrollAreaCornerProps,
|
|
156
|
+
ScrollAreaExpanderProps,
|
|
111
157
|
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
|
+
import React, { useEffect, useRef, useState } from 'react';
|
|
7
|
+
|
|
8
|
+
import { faker } from '@dxos/random';
|
|
9
|
+
|
|
10
|
+
import { withLayout, withTheme } from '../../testing';
|
|
11
|
+
import { Button } from '../Button';
|
|
12
|
+
import { Toolbar } from '../Toolbar';
|
|
13
|
+
|
|
14
|
+
import { ScrollContainer, type ScrollContainerRootProps, type ScrollController } from './ScrollContainer';
|
|
15
|
+
|
|
16
|
+
const DefaultStory = (props: ScrollContainerRootProps) => {
|
|
17
|
+
const [lines, setLines] = useState<string[]>([]);
|
|
18
|
+
const [running, setRunning] = useState(true);
|
|
19
|
+
const scroller = useRef<ScrollController>(null);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (!running) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const i = setInterval(() => {
|
|
26
|
+
setLines((lines) => [...lines, faker.lorem.paragraph()]);
|
|
27
|
+
}, 500);
|
|
28
|
+
|
|
29
|
+
return () => clearInterval(i);
|
|
30
|
+
}, [running]);
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<div className='flex flex-col bs-full overflow-hidden'>
|
|
34
|
+
<Toolbar.Root>
|
|
35
|
+
<Button onClick={() => setRunning((running) => !running)}>{running ? 'Stop' : 'Start'}</Button>
|
|
36
|
+
<Button onClick={() => scroller.current?.scrollToBottom()}>Scroll to bottom</Button>
|
|
37
|
+
<div className='flex-1' />
|
|
38
|
+
<div>{lines.length}</div>
|
|
39
|
+
</Toolbar.Root>
|
|
40
|
+
<ScrollContainer.Root {...props} ref={scroller}>
|
|
41
|
+
<ScrollContainer.Viewport>
|
|
42
|
+
{lines.map((line, index) => (
|
|
43
|
+
<div key={index} className='p-2'>
|
|
44
|
+
{line}
|
|
45
|
+
</div>
|
|
46
|
+
))}
|
|
47
|
+
</ScrollContainer.Viewport>
|
|
48
|
+
<ScrollContainer.ScrollDownButton />
|
|
49
|
+
</ScrollContainer.Root>
|
|
50
|
+
</div>
|
|
51
|
+
);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const meta = {
|
|
55
|
+
title: 'ui/react-ui-core/ScrollContainer',
|
|
56
|
+
component: ScrollContainer.Root,
|
|
57
|
+
render: DefaultStory,
|
|
58
|
+
decorators: [withTheme, withLayout({ layout: 'column', classNames: 'is-[30rem]' })],
|
|
59
|
+
} satisfies Meta<typeof DefaultStory>;
|
|
60
|
+
|
|
61
|
+
export default meta;
|
|
62
|
+
|
|
63
|
+
type Story = StoryObj<typeof meta>;
|
|
64
|
+
|
|
65
|
+
export const Default: Story = {
|
|
66
|
+
args: {
|
|
67
|
+
pin: true,
|
|
68
|
+
fade: true,
|
|
69
|
+
},
|
|
70
|
+
};
|