@dxos/react-ui 0.8.4-main.d05673bc65 → 0.8.4-main.e00bdcdb52
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-2FKSMWNY.mjs → chunk-BDBC6H6V.mjs} +79 -5
- package/dist/lib/browser/chunk-BDBC6H6V.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +921 -736
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +30 -18
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/browser/translations.mjs +18 -0
- package/dist/lib/browser/translations.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-ZNBLTSHI.mjs → chunk-3JSJK2ZY.mjs} +79 -5
- package/dist/lib/node-esm/chunk-3JSJK2ZY.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +921 -736
- 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 +30 -18
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/lib/node-esm/translations.mjs +20 -0
- package/dist/lib/node-esm/translations.mjs.map +7 -0
- package/dist/types/src/components/Avatars/Avatar.d.ts +1 -1
- package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
- package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
- package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
- package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
- package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
- package/dist/types/src/components/Button/Button.d.ts +2 -2
- package/dist/types/src/components/Button/Button.d.ts.map +1 -1
- package/dist/types/src/components/Button/Button.stories.d.ts +1 -1
- package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -1
- package/dist/types/src/components/Button/IconButton.d.ts +1 -0
- package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
- package/dist/types/src/components/Button/IconButton.stories.d.ts +3 -0
- package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
- package/dist/types/src/components/Button/Toggle.d.ts +2 -2
- package/dist/types/src/components/Button/Toggle.d.ts.map +1 -1
- package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
- package/dist/types/src/components/Button/ToggleGroup.d.ts +6 -6
- package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -1
- package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +2 -2
- package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
- package/dist/types/src/components/Card/Card.d.ts +70 -50
- package/dist/types/src/components/Card/Card.d.ts.map +1 -1
- package/dist/types/src/components/Card/Card.stories.d.ts +2 -2
- package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -1
- package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
- package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
- package/dist/types/src/components/Clipboard/index.d.ts +10 -1
- package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
- package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
- package/dist/types/src/components/Dialog/AlertDialog.d.ts +42 -31
- package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
- package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
- package/dist/types/src/components/Dialog/Dialog.d.ts +47 -30
- package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
- package/dist/types/src/components/Dialog/Dialog.stories.d.ts +3 -2
- package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
- package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
- package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -1
- package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -1
- package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +14 -3
- package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -1
- package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -1
- package/dist/types/src/components/Focus/Focus.d.ts +36 -0
- package/dist/types/src/components/Focus/Focus.d.ts.map +1 -0
- package/dist/types/src/components/Focus/Focus.stories.d.ts +9 -0
- package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -0
- package/dist/types/src/components/Focus/index.d.ts +2 -0
- package/dist/types/src/components/Focus/index.d.ts.map +1 -0
- package/dist/types/src/components/Icon/Icon.d.ts +3 -0
- package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
- package/dist/types/src/components/Icon/Icon.stories.d.ts +11 -3
- package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
- package/dist/types/src/components/Image/Image.d.ts +2 -1
- package/dist/types/src/components/Image/Image.d.ts.map +1 -1
- package/dist/types/src/components/Image/Image.stories.d.ts +3 -2
- package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -1
- package/dist/types/src/components/Input/Input.d.ts +14 -17
- package/dist/types/src/components/Input/Input.d.ts.map +1 -1
- package/dist/types/src/components/Input/Input.stories.d.ts +3 -3
- package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
- package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
- package/dist/types/src/components/List/List.d.ts +5 -3
- package/dist/types/src/components/List/List.d.ts.map +1 -1
- package/dist/types/src/components/List/List.stories.d.ts +3 -1
- package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
- package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -1
- package/dist/types/src/components/List/Tree.d.ts +2 -2
- package/dist/types/src/components/List/Tree.d.ts.map +1 -1
- package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
- package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -1
- package/dist/types/src/components/List/Treegrid.d.ts +5 -9
- package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
- package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
- package/dist/types/src/components/Main/Main.d.ts +7 -3
- package/dist/types/src/components/Main/Main.d.ts.map +1 -1
- package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
- package/dist/types/src/components/Main/useSwipeToDismiss.d.ts.map +1 -1
- package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -1
- package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -1
- package/dist/types/src/components/Menu/DropdownMenu.d.ts +58 -49
- package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
- package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +14 -1
- package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
- package/dist/types/src/components/Message/Message.d.ts.map +1 -1
- package/dist/types/src/components/Message/Message.stories.d.ts +2 -2
- package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
- package/dist/types/src/components/Popover/Popover.d.ts +38 -22
- package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
- package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
- package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +12 -9
- package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
- package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +18 -5
- package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
- package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +42 -13
- package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
- package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +5 -6
- package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/Select/Select.d.ts.map +1 -1
- package/dist/types/src/components/Select/Select.stories.d.ts +2 -2
- package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
- package/dist/types/src/components/Separator/Separator.d.ts +3 -3
- package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
- package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -1
- package/dist/types/src/components/Splitter/Splitter.d.ts +19 -17
- package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -1
- package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -1
- package/dist/types/src/components/Status/Status.d.ts +3 -4
- package/dist/types/src/components/Status/Status.d.ts.map +1 -1
- package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
- package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
- package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +1 -1
- package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
- package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts +1 -1
- package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -1
- package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +54 -55
- package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
- package/dist/types/src/components/ThemeProvider/index.d.ts +1 -1
- package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
- package/dist/types/src/components/Toast/Toast.d.ts +16 -16
- package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
- package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.d.ts +11 -19
- 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 +10 -10
- package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +2 -2
- package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +1 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/exemplars/generics.stories.d.ts +6 -5
- package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -1
- package/dist/types/src/exemplars/slot.stories.d.ts +1 -0
- package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -1
- package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -1
- package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +1 -0
- package/dist/types/src/hooks/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.map +1 -1
- package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
- package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
- package/dist/types/src/hooks/useSafeCollisionPadding.d.ts.map +1 -1
- package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
- package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
- package/dist/types/src/playground/Custom.stories.d.ts +1 -1
- package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
- package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
- package/dist/types/src/primitives/Column/Column.d.ts +21 -14
- package/dist/types/src/primitives/Column/Column.d.ts.map +1 -1
- package/dist/types/src/primitives/Column/Column.stories.d.ts +19 -0
- package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -1
- package/dist/types/src/primitives/Container/Container.d.ts +4 -5
- package/dist/types/src/primitives/Container/Container.d.ts.map +1 -1
- package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -1
- package/dist/types/src/primitives/Flex/Flex.d.ts +5 -7
- package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -1
- package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -1
- package/dist/types/src/primitives/Grid/Grid.d.ts +3 -8
- package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -1
- package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -1
- package/dist/types/src/primitives/Panel/Panel.d.ts +24 -15
- package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -1
- package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -1
- package/dist/types/src/testing/Loading.d.ts.map +1 -1
- package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
- package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
- package/dist/types/src/testing/decorators/withTheme.d.ts +1 -1
- package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +3 -3
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/util/usePx.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +28 -25
- package/src/components/Avatars/Avatar.stories.tsx +2 -3
- package/src/components/Avatars/Avatar.tsx +1 -2
- package/src/components/Avatars/AvatarGroup.stories.tsx +0 -1
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -2
- package/src/components/Button/Button.stories.tsx +0 -1
- package/src/components/Button/Button.tsx +5 -13
- package/src/components/Button/IconButton.stories.tsx +6 -4
- package/src/components/Button/IconButton.tsx +3 -4
- package/src/components/Button/Toggle.stories.tsx +0 -1
- package/src/components/Button/Toggle.tsx +4 -4
- package/src/components/Button/ToggleGroup.stories.tsx +0 -1
- package/src/components/Button/ToggleGroup.tsx +12 -16
- package/src/components/Card/Card.stories.tsx +12 -12
- package/src/components/Card/Card.tsx +266 -108
- package/src/components/Clipboard/CopyButton.tsx +3 -4
- package/src/components/Dialog/AlertDialog.stories.tsx +5 -6
- package/src/components/Dialog/AlertDialog.tsx +67 -126
- package/src/components/Dialog/Dialog.stories.tsx +64 -9
- package/src/components/Dialog/Dialog.tsx +84 -88
- package/src/components/ErrorFallback/ErrorFallback.stories.tsx +3 -8
- package/src/components/ErrorFallback/ErrorStack.tsx +36 -2
- package/src/components/Focus/AUDIT.md +43 -0
- package/src/components/Focus/Focus.stories.tsx +230 -0
- package/src/components/Focus/Focus.tsx +201 -0
- package/src/components/Focus/index.ts +5 -0
- package/src/components/Icon/Icon.stories.tsx +43 -13
- package/src/components/Icon/Icon.tsx +5 -1
- package/src/components/Image/Image.stories.tsx +3 -3
- package/src/components/Image/Image.tsx +31 -8
- package/src/components/Input/Input.stories.tsx +3 -4
- package/src/components/Input/Input.tsx +7 -7
- package/src/components/Link/Link.stories.tsx +0 -1
- package/src/components/List/List.stories.tsx +0 -1
- package/src/components/List/List.tsx +6 -5
- package/src/components/List/Tree.stories.tsx +1 -2
- package/src/components/List/Tree.tsx +0 -1
- package/src/components/List/Treegrid.stories.tsx +26 -27
- package/src/components/List/Treegrid.tsx +14 -14
- package/src/components/Main/Main.stories.tsx +0 -1
- package/src/components/Main/Main.tsx +1 -2
- package/src/components/Menu/ContextMenu.stories.tsx +0 -1
- package/src/components/Menu/DropdownMenu.stories.tsx +0 -1
- package/src/components/Menu/DropdownMenu.tsx +48 -42
- package/src/components/Message/Message.stories.tsx +6 -7
- package/src/components/Message/Message.tsx +1 -5
- package/src/components/Popover/Popover.stories.tsx +4 -5
- package/src/components/Popover/Popover.tsx +42 -42
- package/src/components/ScrollArea/ScrollArea.stories.tsx +93 -30
- package/src/components/ScrollArea/ScrollArea.tsx +39 -23
- package/src/components/ScrollContainer/ScrollContainer.stories.tsx +20 -18
- package/src/components/ScrollContainer/ScrollContainer.tsx +200 -91
- package/src/components/Select/Select.stories.tsx +5 -6
- package/src/components/Separator/Separator.tsx +4 -7
- package/src/components/Skeleton/Skeleton.stories.tsx +0 -1
- package/src/components/Splitter/Splitter.stories.tsx +29 -29
- package/src/components/Splitter/Splitter.tsx +35 -34
- package/src/components/Status/Status.stories.tsx +0 -1
- package/src/components/Status/Status.tsx +8 -5
- package/src/components/Tag/Tag.stories.tsx +0 -1
- package/src/components/ThemeProvider/ThemeProvider.stories.tsx +0 -1
- package/src/components/ThemeProvider/ThemeProvider.tsx +5 -4
- package/src/components/ThemeProvider/index.ts +1 -1
- package/src/components/Toast/Toast.stories.tsx +0 -1
- package/src/components/Toast/Toast.tsx +16 -31
- package/src/components/Toolbar/Toolbar.stories.tsx +0 -1
- package/src/components/Toolbar/Toolbar.tsx +21 -35
- package/src/components/Tooltip/Tooltip.stories.tsx +6 -7
- package/src/components/Tooltip/Tooltip.tsx +15 -16
- package/src/components/index.ts +1 -0
- package/src/exemplars/generics.stories.tsx +7 -15
- package/src/exemplars/slot.stories.tsx +67 -57
- package/src/exemplars/tabster.stories.tsx +1 -1
- package/src/exemplars/virtualizer.stories.tsx +4 -4
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useDensityContext.ts +2 -2
- package/src/playground/Custom.stories.tsx +6 -9
- package/src/primitives/Column/AUDIT.md +148 -0
- package/src/primitives/Column/Column.stories.tsx +122 -19
- package/src/primitives/Column/Column.tsx +73 -42
- package/src/primitives/Container/Container.stories.tsx +0 -1
- package/src/primitives/Container/Container.tsx +5 -8
- package/src/primitives/Flex/Flex.stories.tsx +0 -1
- package/src/primitives/Flex/Flex.tsx +10 -12
- package/src/primitives/Grid/Grid.stories.tsx +0 -1
- package/src/primitives/Grid/Grid.tsx +4 -9
- package/src/primitives/Panel/Panel.stories.tsx +9 -8
- package/src/primitives/Panel/Panel.tsx +64 -63
- package/src/testing/Loading.tsx +25 -4
- package/src/testing/decorators/withLayout.tsx +6 -6
- package/src/testing/decorators/withTheme.tsx +10 -7
- package/src/translations.ts +3 -3
- package/src/util/usePx.ts +1 -0
- package/dist/lib/browser/chunk-2FKSMWNY.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ZNBLTSHI.mjs.map +0 -7
|
@@ -24,7 +24,6 @@ import React, {
|
|
|
24
24
|
type ComponentPropsWithRef,
|
|
25
25
|
type ComponentPropsWithoutRef,
|
|
26
26
|
type ComponentRef,
|
|
27
|
-
type ElementRef,
|
|
28
27
|
type FC,
|
|
29
28
|
type ReactNode,
|
|
30
29
|
type RefObject,
|
|
@@ -37,30 +36,31 @@ import React, {
|
|
|
37
36
|
} from 'react';
|
|
38
37
|
import { RemoveScroll } from 'react-remove-scroll';
|
|
39
38
|
|
|
40
|
-
import { useElevationContext, useThemeContext } from '../../hooks';
|
|
41
|
-
import { useSafeCollisionPadding } from '../../hooks/useSafeCollisionPadding';
|
|
39
|
+
import { useSafeCollisionPadding, useElevationContext, useThemeContext } from '../../hooks';
|
|
42
40
|
import { type ThemedClassName } from '../../util';
|
|
43
41
|
|
|
44
42
|
//
|
|
45
43
|
// Context
|
|
46
44
|
//
|
|
47
45
|
|
|
46
|
+
type ScopedProps<P> = P & { __scopePopover?: Scope };
|
|
47
|
+
|
|
48
48
|
const POPOVER_NAME = 'Popover';
|
|
49
49
|
|
|
50
|
-
type ScopedProps<P> = P & { __scopePopover?: Scope };
|
|
51
50
|
const [createPopoverContext, createPopoverScope] = createContextScope(POPOVER_NAME, [createPopperScope]);
|
|
51
|
+
|
|
52
52
|
const usePopperScope = createPopperScope();
|
|
53
53
|
|
|
54
54
|
type PopoverContextValue = {
|
|
55
55
|
triggerRef: RefObject<HTMLButtonElement>;
|
|
56
56
|
contentId: string;
|
|
57
|
+
hasCustomAnchor: boolean;
|
|
58
|
+
modal: boolean;
|
|
57
59
|
open: boolean;
|
|
58
60
|
onOpenChange(open: boolean): void;
|
|
59
61
|
onOpenToggle(): void;
|
|
60
|
-
hasCustomAnchor: boolean;
|
|
61
62
|
onCustomAnchorAdd(): void;
|
|
62
63
|
onCustomAnchorRemove(): void;
|
|
63
|
-
modal: boolean;
|
|
64
64
|
};
|
|
65
65
|
|
|
66
66
|
const [PopoverProvider, usePopoverContext] = createPopoverContext<PopoverContextValue>(POPOVER_NAME);
|
|
@@ -69,13 +69,13 @@ const [PopoverProvider, usePopoverContext] = createPopoverContext<PopoverContext
|
|
|
69
69
|
// PopoverRoot
|
|
70
70
|
//
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
type PopoverRootProps = {
|
|
73
73
|
children?: ReactNode;
|
|
74
74
|
open?: boolean;
|
|
75
75
|
defaultOpen?: boolean;
|
|
76
76
|
onOpenChange?: (open: boolean) => void;
|
|
77
77
|
modal?: boolean;
|
|
78
|
-
}
|
|
78
|
+
};
|
|
79
79
|
|
|
80
80
|
const PopoverRoot: FC<PopoverRootProps> = (props: ScopedProps<PopoverRootProps>) => {
|
|
81
81
|
const { __scopePopover, children, open: openProp, defaultOpen, onOpenChange, modal = false } = props;
|
|
@@ -118,7 +118,7 @@ const ANCHOR_NAME = 'PopoverAnchor';
|
|
|
118
118
|
|
|
119
119
|
type PopoverAnchorElement = ComponentRef<typeof PopperPrimitive.Anchor>;
|
|
120
120
|
type PopperAnchorProps = ComponentPropsWithoutRef<typeof PopperPrimitive.Anchor>;
|
|
121
|
-
|
|
121
|
+
type PopoverAnchorProps = PopperAnchorProps;
|
|
122
122
|
|
|
123
123
|
const PopoverAnchor = forwardRef<PopoverAnchorElement, PopoverAnchorProps>(
|
|
124
124
|
(props: ScopedProps<PopoverAnchorProps>, forwardedRef) => {
|
|
@@ -144,11 +144,11 @@ PopoverAnchor.displayName = ANCHOR_NAME;
|
|
|
144
144
|
|
|
145
145
|
const TRIGGER_NAME = 'PopoverTrigger';
|
|
146
146
|
|
|
147
|
-
type PopoverTriggerElement =
|
|
147
|
+
type PopoverTriggerElement = ComponentRef<typeof Primitive.button>;
|
|
148
148
|
type PrimitiveButtonProps = ComponentPropsWithoutRef<typeof Primitive.button>;
|
|
149
|
-
|
|
149
|
+
type PopoverTriggerProps = PrimitiveButtonProps & {
|
|
150
150
|
asChild?: boolean;
|
|
151
|
-
}
|
|
151
|
+
};
|
|
152
152
|
|
|
153
153
|
const PopoverTrigger = forwardRef<PopoverTriggerElement, PopoverTriggerProps>(
|
|
154
154
|
(props: ScopedProps<PopoverTriggerProps>, forwardedRef) => {
|
|
@@ -189,9 +189,9 @@ PopoverTrigger.displayName = TRIGGER_NAME;
|
|
|
189
189
|
|
|
190
190
|
const VIRTUAL_TRIGGER_NAME = 'PopoverVirtualTrigger';
|
|
191
191
|
|
|
192
|
-
|
|
192
|
+
type PopoverVirtualTriggerProps = {
|
|
193
193
|
virtualRef: RefObject<PopoverTriggerElement | null>;
|
|
194
|
-
}
|
|
194
|
+
};
|
|
195
195
|
|
|
196
196
|
const PopoverVirtualTrigger = (props: ScopedProps<PopoverVirtualTriggerProps>) => {
|
|
197
197
|
const { __scopePopover, virtualRef } = props;
|
|
@@ -219,7 +219,7 @@ const [PortalProvider, usePortalContext] = createPopoverContext<PortalContextVal
|
|
|
219
219
|
});
|
|
220
220
|
|
|
221
221
|
type PortalProps = ComponentPropsWithoutRef<typeof PortalPrimitive>;
|
|
222
|
-
|
|
222
|
+
type PopoverPortalProps = {
|
|
223
223
|
children?: ReactNode;
|
|
224
224
|
/**
|
|
225
225
|
* Specify a container element to portal the content into.
|
|
@@ -230,9 +230,9 @@ interface PopoverPortalProps {
|
|
|
230
230
|
* controlling animation with React animation libraries.
|
|
231
231
|
*/
|
|
232
232
|
forceMount?: true;
|
|
233
|
-
}
|
|
233
|
+
};
|
|
234
234
|
|
|
235
|
-
const PopoverPortal
|
|
235
|
+
const PopoverPortal = (props: ScopedProps<PopoverPortalProps>) => {
|
|
236
236
|
const { __scopePopover, forceMount, children, container } = props;
|
|
237
237
|
const context = usePopoverContext(PORTAL_NAME, __scopePopover);
|
|
238
238
|
return (
|
|
@@ -397,31 +397,31 @@ const PopoverContentNonModal = forwardRef<PopoverContentTypeElement, PopoverCont
|
|
|
397
397
|
},
|
|
398
398
|
);
|
|
399
399
|
|
|
400
|
-
type PopoverContentImplElement =
|
|
400
|
+
type PopoverContentImplElement = ComponentRef<typeof PopperPrimitive.Content>;
|
|
401
401
|
type FocusScopeProps = ComponentPropsWithoutRef<typeof FocusScope>;
|
|
402
402
|
type DismissableLayerProps = ComponentPropsWithoutRef<typeof DismissableLayer>;
|
|
403
403
|
type PopperContentProps = ThemedClassName<ComponentPropsWithoutRef<typeof PopperPrimitive.Content>>;
|
|
404
404
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
}
|
|
405
|
+
type PopoverContentImplProps = Omit<PopperContentProps, 'onPlaced'> &
|
|
406
|
+
Omit<DismissableLayerProps, 'onDismiss'> & {
|
|
407
|
+
/**
|
|
408
|
+
* Whether focus should be trapped within the `Popover`
|
|
409
|
+
* (default: false)
|
|
410
|
+
*/
|
|
411
|
+
trapFocus?: FocusScopeProps['trapped'];
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* Event handler called when auto-focusing on open.
|
|
415
|
+
* Can be prevented.
|
|
416
|
+
*/
|
|
417
|
+
onOpenAutoFocus?: FocusScopeProps['onMountAutoFocus'];
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Event handler called when auto-focusing on close.
|
|
421
|
+
* Can be prevented.
|
|
422
|
+
*/
|
|
423
|
+
onCloseAutoFocus?: FocusScopeProps['onUnmountAutoFocus'];
|
|
424
|
+
};
|
|
425
425
|
|
|
426
426
|
const PopoverContentImpl = forwardRef<PopoverContentImplElement, PopoverContentImplProps>(
|
|
427
427
|
(props: ScopedProps<PopoverContentImplProps>, forwardedRef) => {
|
|
@@ -514,8 +514,8 @@ const PopoverContentImpl = forwardRef<PopoverContentImplElement, PopoverContentI
|
|
|
514
514
|
|
|
515
515
|
const CLOSE_NAME = 'PopoverClose';
|
|
516
516
|
|
|
517
|
-
type PopoverCloseElement =
|
|
518
|
-
|
|
517
|
+
type PopoverCloseElement = ComponentRef<typeof Primitive.button>;
|
|
518
|
+
type PopoverCloseProps = PrimitiveButtonProps;
|
|
519
519
|
|
|
520
520
|
const PopoverClose = forwardRef<PopoverCloseElement, PopoverCloseProps>(
|
|
521
521
|
(props: ScopedProps<PopoverCloseProps>, forwardedRef) => {
|
|
@@ -540,9 +540,9 @@ PopoverClose.displayName = CLOSE_NAME;
|
|
|
540
540
|
|
|
541
541
|
const ARROW_NAME = 'PopoverArrow';
|
|
542
542
|
|
|
543
|
-
type PopoverArrowElement =
|
|
543
|
+
type PopoverArrowElement = ComponentRef<typeof PopperPrimitive.Arrow>;
|
|
544
544
|
type PopperArrowProps = ThemedClassName<ComponentPropsWithoutRef<typeof PopperPrimitive.Arrow>>;
|
|
545
|
-
|
|
545
|
+
type PopoverArrowProps = PopperArrowProps;
|
|
546
546
|
|
|
547
547
|
const PopoverArrow = forwardRef<PopoverArrowElement, PopoverArrowProps>(
|
|
548
548
|
(props: ScopedProps<PopoverArrowProps>, forwardedRef) => {
|
|
@@ -2,16 +2,18 @@
|
|
|
2
2
|
// Copyright 2026 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import React, { useMemo } from 'react';
|
|
5
|
+
import React, { PropsWithChildren, useMemo } from 'react';
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { random } from '@dxos/random';
|
|
8
8
|
import { mx } from '@dxos/ui-theme';
|
|
9
|
+
import { ThemedClassName } from '@dxos/ui-types';
|
|
9
10
|
|
|
11
|
+
import { Column } from '../../primitives';
|
|
10
12
|
import { withLayout, withTheme } from '../../testing';
|
|
11
|
-
|
|
13
|
+
import { Input } from '../Input';
|
|
12
14
|
import { ScrollArea } from './ScrollArea';
|
|
13
15
|
|
|
14
|
-
|
|
16
|
+
random.seed(123);
|
|
15
17
|
|
|
16
18
|
export default {
|
|
17
19
|
title: 'ui/react-ui-core/components/ScrollArea',
|
|
@@ -22,22 +24,22 @@ export default {
|
|
|
22
24
|
},
|
|
23
25
|
};
|
|
24
26
|
|
|
25
|
-
const
|
|
27
|
+
const List = ({ items = 50 }: { items?: number }) => (
|
|
26
28
|
<div>
|
|
27
|
-
{Array.from({ length:
|
|
28
|
-
<div key={index} className='px-1
|
|
29
|
+
{Array.from({ length: items }).map((_, index) => (
|
|
30
|
+
<div key={index} className='px-1 cursor-pointer hover:bg-hover-surface'>
|
|
29
31
|
Item {index + 1}
|
|
30
32
|
</div>
|
|
31
33
|
))}
|
|
32
34
|
</div>
|
|
33
35
|
);
|
|
34
36
|
|
|
35
|
-
const Row = () => (
|
|
37
|
+
const Row = ({ items = 50 }: { items?: number }) => (
|
|
36
38
|
<div className='flex gap-2 w-max'>
|
|
37
|
-
{Array.from({ length:
|
|
39
|
+
{Array.from({ length: items }).map((_, index) => (
|
|
38
40
|
<div
|
|
39
41
|
key={index}
|
|
40
|
-
className='shrink-0 h-20 w-20 cursor-pointer border border-separator rounded-md flex items-center justify-center
|
|
42
|
+
className='shrink-0 h-20 w-20 cursor-pointer border border-separator rounded-md flex items-center justify-center hover:bg-hover-surface'
|
|
41
43
|
>
|
|
42
44
|
{index + 1}
|
|
43
45
|
</div>
|
|
@@ -45,58 +47,95 @@ const Row = () => (
|
|
|
45
47
|
</div>
|
|
46
48
|
);
|
|
47
49
|
|
|
50
|
+
const Container = ({ classNames, children }: ThemedClassName<PropsWithChildren>) => {
|
|
51
|
+
return (
|
|
52
|
+
<div role='none' className={mx('border border-separator rounded-md overflow-hidden', classNames)}>
|
|
53
|
+
{children}
|
|
54
|
+
</div>
|
|
55
|
+
);
|
|
56
|
+
};
|
|
57
|
+
|
|
48
58
|
export const Vertical = {
|
|
49
59
|
render: () => (
|
|
50
|
-
<
|
|
51
|
-
<ScrollArea.Root orientation='vertical'
|
|
60
|
+
<Container classNames='h-72 w-48'>
|
|
61
|
+
<ScrollArea.Root orientation='vertical'>
|
|
52
62
|
<ScrollArea.Viewport>
|
|
53
|
-
<
|
|
63
|
+
<List />
|
|
54
64
|
</ScrollArea.Viewport>
|
|
55
65
|
</ScrollArea.Root>
|
|
56
|
-
</
|
|
66
|
+
</Container>
|
|
57
67
|
),
|
|
58
68
|
};
|
|
59
69
|
|
|
60
70
|
export const VerticalThin = {
|
|
61
71
|
render: () => (
|
|
62
|
-
<
|
|
63
|
-
<ScrollArea.Root orientation='vertical'
|
|
72
|
+
<Container classNames='h-72 w-48'>
|
|
73
|
+
<ScrollArea.Root orientation='vertical' thin>
|
|
64
74
|
<ScrollArea.Viewport>
|
|
65
|
-
<
|
|
75
|
+
<List />
|
|
66
76
|
</ScrollArea.Viewport>
|
|
67
77
|
</ScrollArea.Root>
|
|
68
|
-
</
|
|
78
|
+
</Container>
|
|
79
|
+
),
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export const VerticalPadded = {
|
|
83
|
+
render: () => (
|
|
84
|
+
<Container classNames='h-72 w-48'>
|
|
85
|
+
<ScrollArea.Root orientation='vertical' centered padding thin>
|
|
86
|
+
<ScrollArea.Viewport>
|
|
87
|
+
<List />
|
|
88
|
+
</ScrollArea.Viewport>
|
|
89
|
+
</ScrollArea.Root>
|
|
90
|
+
</Container>
|
|
91
|
+
),
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
export const VerticalColumn = {
|
|
95
|
+
render: () => (
|
|
96
|
+
<Container classNames='h-72 w-48'>
|
|
97
|
+
<Column.Root gutter='sm' classNames='h-full overflow-hidden'>
|
|
98
|
+
<ScrollArea.Root orientation='vertical' padding thin>
|
|
99
|
+
<ScrollArea.Viewport classNames='py-2'>
|
|
100
|
+
<Input.Root>
|
|
101
|
+
<Input.TextInput classNames='p-1' />
|
|
102
|
+
</Input.Root>
|
|
103
|
+
<List />
|
|
104
|
+
</ScrollArea.Viewport>
|
|
105
|
+
</ScrollArea.Root>
|
|
106
|
+
</Column.Root>
|
|
107
|
+
</Container>
|
|
69
108
|
),
|
|
70
109
|
};
|
|
71
110
|
|
|
72
111
|
export const Horizontal = {
|
|
73
112
|
render: () => (
|
|
74
|
-
<
|
|
75
|
-
<ScrollArea.Root orientation='horizontal'
|
|
113
|
+
<Container classNames='w-96'>
|
|
114
|
+
<ScrollArea.Root orientation='horizontal'>
|
|
76
115
|
<ScrollArea.Viewport>
|
|
77
116
|
<Row />
|
|
78
117
|
</ScrollArea.Viewport>
|
|
79
118
|
</ScrollArea.Root>
|
|
80
|
-
</
|
|
119
|
+
</Container>
|
|
81
120
|
),
|
|
82
121
|
};
|
|
83
122
|
|
|
84
123
|
export const HorizontalThin = {
|
|
85
124
|
render: () => (
|
|
86
|
-
<
|
|
87
|
-
<ScrollArea.Root orientation='horizontal'
|
|
125
|
+
<Container classNames='w-96'>
|
|
126
|
+
<ScrollArea.Root orientation='horizontal' thin>
|
|
88
127
|
<ScrollArea.Viewport>
|
|
89
128
|
<Row />
|
|
90
129
|
</ScrollArea.Viewport>
|
|
91
130
|
</ScrollArea.Root>
|
|
92
|
-
</
|
|
131
|
+
</Container>
|
|
93
132
|
),
|
|
94
133
|
};
|
|
95
134
|
|
|
96
135
|
export const Both = {
|
|
97
136
|
render: () => (
|
|
98
|
-
<
|
|
99
|
-
<ScrollArea.Root orientation='all'
|
|
137
|
+
<Container classNames='w-96 h-96'>
|
|
138
|
+
<ScrollArea.Root orientation='all'>
|
|
100
139
|
<ScrollArea.Viewport>
|
|
101
140
|
<div className='flex flex-col gap-2'>
|
|
102
141
|
{Array.from({ length: 50 }).map((_, rowIndex) => (
|
|
@@ -114,7 +153,31 @@ export const Both = {
|
|
|
114
153
|
</div>
|
|
115
154
|
</ScrollArea.Viewport>
|
|
116
155
|
</ScrollArea.Root>
|
|
117
|
-
</
|
|
156
|
+
</Container>
|
|
157
|
+
),
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
export const Fullscreen = {
|
|
161
|
+
decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
|
|
162
|
+
render: () => (
|
|
163
|
+
<ScrollArea.Root orientation='all' thin>
|
|
164
|
+
<ScrollArea.Viewport>
|
|
165
|
+
<div className='flex flex-col gap-2'>
|
|
166
|
+
{Array.from({ length: 50 }).map((_, rowIndex) => (
|
|
167
|
+
<div key={rowIndex} className='flex gap-2'>
|
|
168
|
+
{Array.from({ length: 50 }).map((_, colIndex) => (
|
|
169
|
+
<div
|
|
170
|
+
key={colIndex}
|
|
171
|
+
className='shrink-0 h-20 w-20 flex items-center justify-center text-sm border border-separator font-mono'
|
|
172
|
+
>
|
|
173
|
+
[{colIndex}:{rowIndex}]
|
|
174
|
+
</div>
|
|
175
|
+
))}
|
|
176
|
+
</div>
|
|
177
|
+
))}
|
|
178
|
+
</div>
|
|
179
|
+
</ScrollArea.Viewport>
|
|
180
|
+
</ScrollArea.Root>
|
|
118
181
|
),
|
|
119
182
|
};
|
|
120
183
|
|
|
@@ -125,13 +188,13 @@ export const NestedScrollAreas = {
|
|
|
125
188
|
() =>
|
|
126
189
|
Array.from({ length: 8 }).map((_, index) => ({
|
|
127
190
|
id: String(index),
|
|
128
|
-
count:
|
|
191
|
+
count: random.number.int({ min: 5, max: 20 }),
|
|
129
192
|
})),
|
|
130
193
|
[],
|
|
131
194
|
);
|
|
132
195
|
|
|
133
196
|
return (
|
|
134
|
-
<ScrollArea.Root
|
|
197
|
+
<ScrollArea.Root orientation='horizontal' thin padding>
|
|
135
198
|
<ScrollArea.Viewport classNames='gap-4'>
|
|
136
199
|
{columns.map((column) => (
|
|
137
200
|
<section
|
|
@@ -170,7 +233,7 @@ export const NativeScroll = {
|
|
|
170
233
|
'group-hover:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb',
|
|
171
234
|
)}
|
|
172
235
|
>
|
|
173
|
-
<
|
|
236
|
+
<List />
|
|
174
237
|
</div>
|
|
175
238
|
</div>
|
|
176
239
|
),
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
import { createContext } from '@radix-ui/react-context';
|
|
6
6
|
import { Primitive } from '@radix-ui/react-primitive';
|
|
7
7
|
import { Slot } from '@radix-ui/react-slot';
|
|
8
|
-
import React, {
|
|
8
|
+
import React, { CSSProperties, useMemo } from 'react';
|
|
9
9
|
|
|
10
|
-
import { composableProps } from '@dxos/ui-theme';
|
|
11
|
-
import { type AllowedAxis, type SlottableProps
|
|
10
|
+
import { composableProps, scrollbar, slottable } from '@dxos/ui-theme';
|
|
11
|
+
import { type AllowedAxis, type SlottableProps } from '@dxos/ui-types';
|
|
12
12
|
|
|
13
13
|
import { useThemeContext } from '../../hooks';
|
|
14
14
|
|
|
@@ -24,7 +24,7 @@ type ScrollAreaContextType = {
|
|
|
24
24
|
/** Hide scrollbars when not scrolling. */
|
|
25
25
|
autoHide: boolean;
|
|
26
26
|
/** Apply padding to opposite side of scrollbar. */
|
|
27
|
-
|
|
27
|
+
centered?: boolean;
|
|
28
28
|
/** Apply padding. */
|
|
29
29
|
padding: boolean;
|
|
30
30
|
/** Use thin scrollbars. */
|
|
@@ -41,19 +41,19 @@ const [ScrollAreaProvider, useScrollAreaContext] = createContext<ScrollAreaConte
|
|
|
41
41
|
|
|
42
42
|
const SCROLLAREA_ROOT_NAME = 'ScrollArea.Root';
|
|
43
43
|
|
|
44
|
-
type ScrollAreaRootProps =
|
|
44
|
+
type ScrollAreaRootProps = Partial<ScrollAreaContextType>;
|
|
45
45
|
|
|
46
46
|
/**
|
|
47
47
|
* ScrollArea provides native scrollbars with custom styling.
|
|
48
48
|
*/
|
|
49
|
-
const ScrollAreaRoot =
|
|
49
|
+
const ScrollAreaRoot = slottable<HTMLDivElement, ScrollAreaRootProps>(
|
|
50
50
|
(
|
|
51
51
|
{
|
|
52
52
|
children,
|
|
53
53
|
asChild,
|
|
54
54
|
orientation = 'vertical',
|
|
55
55
|
autoHide = true,
|
|
56
|
-
|
|
56
|
+
centered = false,
|
|
57
57
|
padding = false,
|
|
58
58
|
thin = false,
|
|
59
59
|
snap = false,
|
|
@@ -61,10 +61,13 @@ const ScrollAreaRoot = forwardRef<HTMLDivElement, ScrollAreaRootProps>(
|
|
|
61
61
|
},
|
|
62
62
|
forwardedRef,
|
|
63
63
|
) => {
|
|
64
|
+
const { tx } = useThemeContext();
|
|
64
65
|
const { className, ...rest } = composableProps(props);
|
|
65
66
|
const Comp = asChild ? Slot : Primitive.div;
|
|
66
|
-
const
|
|
67
|
-
|
|
67
|
+
const options = useMemo(
|
|
68
|
+
() => ({ orientation, autoHide, centered, padding, thin, snap }),
|
|
69
|
+
[orientation, autoHide, centered, padding, thin, snap],
|
|
70
|
+
);
|
|
68
71
|
|
|
69
72
|
return (
|
|
70
73
|
<ScrollAreaProvider {...options}>
|
|
@@ -84,20 +87,33 @@ ScrollAreaRoot.displayName = SCROLLAREA_ROOT_NAME;
|
|
|
84
87
|
|
|
85
88
|
const SCROLLAREA_VIEWPORT_NAME = 'ScrollArea.Viewport';
|
|
86
89
|
|
|
87
|
-
type ScrollAreaViewportProps =
|
|
88
|
-
|
|
89
|
-
const ScrollAreaViewport =
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
90
|
+
type ScrollAreaViewportProps = SlottableProps;
|
|
91
|
+
|
|
92
|
+
const ScrollAreaViewport = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
|
|
93
|
+
const { tx } = useThemeContext();
|
|
94
|
+
const options = useScrollAreaContext(SCROLLAREA_VIEWPORT_NAME);
|
|
95
|
+
const density = options.thin ? scrollbar.thin : scrollbar.coarse;
|
|
96
|
+
const { className, ...rest } = composableProps(props);
|
|
97
|
+
const { style, ...restWithoutStyle } = rest as { style?: CSSProperties; [key: string]: any };
|
|
98
|
+
const Comp = asChild ? Slot : Primitive.div;
|
|
99
|
+
|
|
100
|
+
return (
|
|
101
|
+
<Comp
|
|
102
|
+
{...restWithoutStyle}
|
|
103
|
+
style={
|
|
104
|
+
{
|
|
105
|
+
'--scroll-width': `${density.size}px`,
|
|
106
|
+
'--scroll-padding': `${density.padding}px`,
|
|
107
|
+
...style,
|
|
108
|
+
} as CSSProperties
|
|
109
|
+
}
|
|
110
|
+
className={tx('scrollArea.viewport', options, className)}
|
|
111
|
+
ref={forwardedRef}
|
|
112
|
+
>
|
|
113
|
+
{children}
|
|
114
|
+
</Comp>
|
|
115
|
+
);
|
|
116
|
+
});
|
|
101
117
|
|
|
102
118
|
ScrollAreaViewport.displayName = SCROLLAREA_VIEWPORT_NAME;
|
|
103
119
|
|
|
@@ -5,23 +5,22 @@
|
|
|
5
5
|
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
6
|
import React, { useEffect, useRef, useState } from 'react';
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import { random } from '@dxos/random';
|
|
9
9
|
|
|
10
10
|
import { Panel } from '../../primitives';
|
|
11
11
|
import { withLayout, withTheme } from '../../testing';
|
|
12
12
|
import { Button } from '../Button';
|
|
13
13
|
import { Toolbar } from '../Toolbar';
|
|
14
|
-
|
|
15
14
|
import { ScrollContainer, type ScrollContainerRootProps, type ScrollController } from './ScrollContainer';
|
|
16
15
|
|
|
17
|
-
type
|
|
16
|
+
type DefaultStoryProps = ScrollContainerRootProps & { running?: boolean; initialLines?: number };
|
|
18
17
|
|
|
19
|
-
const DefaultStory = ({ initialLines = 0, running: runningProp, ...props }:
|
|
18
|
+
const DefaultStory = ({ initialLines = 0, running: runningProp, ...props }: DefaultStoryProps) => {
|
|
20
19
|
const [lines, setLines] = useState<string[]>([]);
|
|
21
20
|
const [running, setRunning] = useState(runningProp);
|
|
22
21
|
const scroller = useRef<ScrollController>(null);
|
|
23
22
|
useEffect(() => {
|
|
24
|
-
setLines(Array.from({ length: initialLines }, () =>
|
|
23
|
+
setLines(Array.from({ length: initialLines }, () => random.lorem.paragraph()));
|
|
25
24
|
}, [initialLines]);
|
|
26
25
|
useEffect(() => {
|
|
27
26
|
if (!running) {
|
|
@@ -29,14 +28,14 @@ const DefaultStory = ({ initialLines = 0, running: runningProp, ...props }: Stor
|
|
|
29
28
|
}
|
|
30
29
|
|
|
31
30
|
const i = setInterval(() => {
|
|
32
|
-
setLines((lines) => [...lines,
|
|
31
|
+
setLines((lines) => [...lines, random.lorem.paragraph()]);
|
|
33
32
|
}, 500);
|
|
34
33
|
|
|
35
34
|
return () => clearInterval(i);
|
|
36
35
|
}, [running]);
|
|
37
36
|
|
|
38
37
|
return (
|
|
39
|
-
<Panel.Root className='dx-
|
|
38
|
+
<Panel.Root className='dx-document'>
|
|
40
39
|
<Panel.Toolbar asChild>
|
|
41
40
|
<Toolbar.Root>
|
|
42
41
|
<Button onClick={() => setRunning((running) => !running)}>{running ? 'Stop' : 'Start'}</Button>
|
|
@@ -45,16 +44,19 @@ const DefaultStory = ({ initialLines = 0, running: runningProp, ...props }: Stor
|
|
|
45
44
|
<div className='px-1'>{lines.length}</div>
|
|
46
45
|
</Toolbar.Root>
|
|
47
46
|
</Panel.Toolbar>
|
|
48
|
-
<Panel.Content
|
|
47
|
+
<Panel.Content>
|
|
49
48
|
<ScrollContainer.Root {...props} ref={scroller}>
|
|
50
|
-
<ScrollContainer.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
{
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
49
|
+
<ScrollContainer.Content>
|
|
50
|
+
<ScrollContainer.Viewport>
|
|
51
|
+
{lines.map((line, index) => (
|
|
52
|
+
<div key={index} className='p-2 text-description'>
|
|
53
|
+
{line}
|
|
54
|
+
</div>
|
|
55
|
+
))}
|
|
56
|
+
</ScrollContainer.Viewport>
|
|
57
|
+
<ScrollContainer.ScrollDownButton />
|
|
58
|
+
<ScrollContainer.Fade />
|
|
59
|
+
</ScrollContainer.Content>
|
|
58
60
|
</ScrollContainer.Root>
|
|
59
61
|
</Panel.Content>
|
|
60
62
|
</Panel.Root>
|
|
@@ -75,7 +77,7 @@ type Story = StoryObj<typeof meta>;
|
|
|
75
77
|
export const Default: Story = {
|
|
76
78
|
args: {
|
|
77
79
|
pin: true,
|
|
78
|
-
|
|
80
|
+
|
|
79
81
|
running: true,
|
|
80
82
|
},
|
|
81
83
|
};
|
|
@@ -83,7 +85,7 @@ export const Default: Story = {
|
|
|
83
85
|
export const Large: Story = {
|
|
84
86
|
args: {
|
|
85
87
|
pin: true,
|
|
86
|
-
|
|
88
|
+
|
|
87
89
|
initialLines: 100,
|
|
88
90
|
},
|
|
89
91
|
};
|