@dxos/react-ui 0.8.4-main.3eb6e50203 → 0.8.4-main.3fbcb4aa9b
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-6DTBPJE4.mjs → chunk-BDBC6H6V.mjs} +182 -108
- package/dist/lib/browser/chunk-BDBC6H6V.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +2961 -2056
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +70 -41
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/browser/translations.mjs +18 -0
- package/dist/lib/browser/translations.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-JKHQSGNU.mjs → chunk-3JSJK2ZY.mjs} +182 -108
- package/dist/lib/node-esm/chunk-3JSJK2ZY.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +2961 -2056
- 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 +70 -41
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- 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 +124 -0
- package/dist/types/src/components/Card/Card.d.ts.map +1 -0
- package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
- package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
- package/dist/types/src/components/Card/index.d.ts +2 -0
- package/dist/types/src/components/Card/index.d.ts.map +1 -0
- 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 +43 -23
- 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 +48 -30
- package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
- package/dist/types/src/components/Dialog/Dialog.stories.d.ts +6 -8
- 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 +11 -0
- package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
- package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
- package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
- package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +19 -0
- package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
- package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
- package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
- package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
- package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
- 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 +4 -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 +15 -0
- package/dist/types/src/components/Image/Image.d.ts.map +1 -0
- package/dist/types/src/components/Image/Image.stories.d.ts +34 -0
- package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
- package/dist/types/src/components/Image/index.d.ts +2 -0
- package/dist/types/src/components/Image/index.d.ts.map +1 -0
- package/dist/types/src/components/Input/Input.d.ts +16 -22
- package/dist/types/src/components/Input/Input.d.ts.map +1 -1
- package/dist/types/src/components/Input/Input.stories.d.ts +6 -6
- 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 +8 -4
- package/dist/types/src/components/Main/Main.d.ts.map +1 -1
- package/dist/types/src/components/Main/Main.stories.d.ts +0 -3
- 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 +1 -1
- package/dist/types/src/components/Message/Message.d.ts.map +1 -1
- package/dist/types/src/components/Message/Message.stories.d.ts +4 -5
- package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
- package/dist/types/src/components/Popover/Popover.d.ts +39 -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 -11
- package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
- package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +21 -10
- 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 +9 -5
- 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 +23 -15
- 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 +4 -2
- package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
- package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
- 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 +12 -0
- package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
- 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 +32 -15
- 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 +7 -4
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/exemplars/generics.stories.d.ts +8 -6
- 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 +11 -0
- package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
- 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 +33 -0
- package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
- package/dist/types/src/primitives/Column/Column.stories.d.ts +25 -0
- package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
- package/dist/types/src/primitives/Column/index.d.ts +2 -0
- package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
- package/dist/types/src/primitives/Container/Container.d.ts +6 -22
- package/dist/types/src/primitives/Container/Container.d.ts.map +1 -1
- package/dist/types/src/primitives/Container/Container.stories.d.ts +2 -7
- package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -1
- package/dist/types/src/primitives/Container/index.d.ts +0 -1
- package/dist/types/src/primitives/Container/index.d.ts.map +1 -1
- package/dist/types/src/primitives/Flex/Flex.d.ts +8 -5
- package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -1
- package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
- package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
- package/dist/types/src/primitives/Grid/Grid.d.ts +10 -0
- package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
- package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
- package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
- package/dist/types/src/primitives/Grid/index.d.ts +2 -0
- package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
- package/dist/types/src/primitives/Panel/Panel.d.ts +35 -0
- package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
- package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
- package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
- package/dist/types/src/primitives/Panel/index.d.ts +2 -0
- package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
- package/dist/types/src/primitives/index.d.ts +3 -0
- package/dist/types/src/primitives/index.d.ts.map +1 -1
- package/dist/types/src/testing/Loading.d.ts +9 -0
- package/dist/types/src/testing/Loading.d.ts.map +1 -0
- package/dist/types/src/testing/decorators/withLayout.d.ts +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/testing/index.d.ts +1 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +11 -0
- package/dist/types/src/translations.d.ts.map +1 -0
- package/dist/types/src/util/usePx.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +33 -26
- package/src/components/Avatars/Avatar.stories.tsx +5 -7
- package/src/components/Avatars/Avatar.tsx +5 -6
- package/src/components/Avatars/AvatarGroup.stories.tsx +0 -1
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -2
- package/src/components/Breadcrumb/Breadcrumb.tsx +10 -10
- package/src/components/Button/Button.stories.tsx +1 -2
- package/src/components/Button/Button.tsx +11 -19
- 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 +151 -0
- package/src/components/Card/Card.tsx +512 -0
- package/src/components/Card/index.ts +5 -0
- package/src/components/Clipboard/CopyButton.tsx +6 -7
- package/src/components/Dialog/AlertDialog.stories.tsx +14 -15
- package/src/components/Dialog/AlertDialog.tsx +123 -77
- package/src/components/Dialog/Dialog.stories.tsx +90 -14
- package/src/components/Dialog/Dialog.tsx +105 -104
- package/src/components/ErrorFallback/ErrorFallback.stories.tsx +45 -0
- package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
- package/src/components/ErrorFallback/ErrorStack.tsx +114 -0
- package/src/components/ErrorFallback/ThrowError.tsx +37 -0
- package/src/components/ErrorFallback/index.ts +9 -0
- 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 +14 -3
- package/src/components/Image/Image.stories.tsx +86 -0
- package/src/components/Image/Image.tsx +246 -0
- package/src/components/Image/index.ts +5 -0
- package/src/components/Input/Input.stories.tsx +17 -38
- package/src/components/Input/Input.tsx +20 -50
- package/src/components/Link/Link.stories.tsx +0 -1
- package/src/components/Link/Link.tsx +2 -2
- package/src/components/List/List.stories.tsx +14 -22
- package/src/components/List/List.tsx +11 -9
- package/src/components/List/ListDropIndicator.tsx +7 -8
- package/src/components/List/Tree.stories.tsx +4 -5
- package/src/components/List/Tree.tsx +0 -1
- package/src/components/List/TreeDropIndicator.tsx +6 -6
- package/src/components/List/Treegrid.stories.tsx +27 -28
- package/src/components/List/Treegrid.tsx +20 -20
- package/src/components/Main/Main.stories.tsx +3 -7
- package/src/components/Main/Main.tsx +13 -14
- package/src/components/Menu/ContextMenu.stories.tsx +0 -1
- package/src/components/Menu/ContextMenu.tsx +3 -3
- package/src/components/Menu/DropdownMenu.stories.tsx +0 -1
- package/src/components/Menu/DropdownMenu.tsx +51 -45
- package/src/components/Message/Message.stories.tsx +25 -11
- package/src/components/Message/Message.tsx +30 -15
- package/src/components/Popover/Popover.stories.tsx +5 -6
- package/src/components/Popover/Popover.tsx +59 -56
- package/src/components/ScrollArea/ScrollArea.stories.tsx +98 -39
- package/src/components/ScrollArea/ScrollArea.tsx +45 -25
- package/src/components/ScrollContainer/ScrollContainer.stories.tsx +46 -25
- package/src/components/ScrollContainer/ScrollContainer.tsx +199 -92
- package/src/components/Select/Select.stories.tsx +5 -6
- package/src/components/Select/Select.tsx +2 -2
- package/src/components/Separator/Separator.tsx +4 -7
- package/src/components/Skeleton/Skeleton.stories.tsx +12 -13
- package/src/components/Splitter/Splitter.stories.tsx +47 -37
- package/src/components/Splitter/Splitter.tsx +44 -40
- package/src/components/Status/Status.stories.tsx +19 -16
- package/src/components/Status/Status.tsx +8 -5
- package/src/components/Tag/Tag.stories.tsx +3 -9
- package/src/components/Tag/Tag.tsx +2 -2
- package/src/components/ThemeProvider/ThemeProvider.stories.tsx +31 -0
- package/src/components/ThemeProvider/ThemeProvider.tsx +7 -6
- package/src/components/ThemeProvider/index.ts +1 -1
- package/src/components/Toast/Toast.stories.tsx +0 -1
- package/src/components/Toast/Toast.tsx +22 -37
- package/src/components/Toolbar/Toolbar.stories.tsx +0 -1
- package/src/components/Toolbar/Toolbar.tsx +173 -29
- package/src/components/Tooltip/Tooltip.stories.tsx +18 -17
- package/src/components/Tooltip/Tooltip.tsx +16 -16
- package/src/components/index.ts +8 -5
- package/src/exemplars/generics.stories.tsx +12 -15
- package/src/exemplars/slot.stories.tsx +68 -61
- package/src/exemplars/tabster.stories.tsx +5 -5
- package/src/exemplars/virtualizer.stories.tsx +136 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useDensityContext.ts +2 -2
- package/src/playground/Controls.stories.tsx +0 -6
- package/src/playground/Custom.stories.tsx +13 -16
- package/src/playground/Typography.stories.tsx +1 -1
- package/src/primitives/Column/AUDIT.md +148 -0
- package/src/primitives/Column/Column.stories.tsx +181 -0
- package/src/primitives/Column/Column.tsx +165 -0
- package/src/primitives/Column/index.ts +5 -0
- package/src/primitives/Container/Container.stories.tsx +13 -51
- package/src/primitives/Container/Container.tsx +14 -74
- package/src/primitives/Container/index.ts +0 -1
- package/src/primitives/Flex/Flex.stories.tsx +57 -0
- package/src/primitives/Flex/Flex.tsx +20 -19
- package/src/primitives/Grid/Grid.stories.tsx +56 -0
- package/src/primitives/Grid/Grid.tsx +30 -0
- package/src/primitives/Grid/index.ts +5 -0
- package/src/primitives/Panel/Panel.stories.tsx +68 -0
- package/src/primitives/Panel/Panel.tsx +120 -0
- package/src/primitives/Panel/index.ts +5 -0
- package/src/primitives/index.ts +3 -0
- package/src/testing/Loading.tsx +47 -0
- package/src/testing/decorators/withLayout.tsx +15 -11
- package/src/testing/decorators/withLayoutVariants.tsx +18 -21
- package/src/testing/decorators/withTheme.tsx +10 -7
- package/src/testing/index.ts +2 -0
- package/src/translations.ts +19 -0
- package/src/util/usePx.ts +1 -0
- package/dist/lib/browser/chunk-6DTBPJE4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-JKHQSGNU.mjs.map +0 -7
- package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -22
- package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
- package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
- package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
- package/dist/types/src/primitives/Container/Layout.d.ts +0 -18
- package/dist/types/src/primitives/Container/Layout.d.ts.map +0 -1
- package/dist/types/src/primitives/Container/Layout.stories.d.ts +0 -10
- package/dist/types/src/primitives/Container/Layout.stories.d.ts.map +0 -1
- package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -57
- package/src/components/AnchoredOverflow/index.ts +0 -5
- package/src/primitives/Container/Layout.stories.tsx +0 -57
- package/src/primitives/Container/Layout.tsx +0 -61
|
@@ -5,49 +5,61 @@
|
|
|
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
|
+
import { Panel } from '../../primitives';
|
|
10
11
|
import { withLayout, withTheme } from '../../testing';
|
|
11
12
|
import { Button } from '../Button';
|
|
12
13
|
import { Toolbar } from '../Toolbar';
|
|
13
|
-
|
|
14
14
|
import { ScrollContainer, type ScrollContainerRootProps, type ScrollController } from './ScrollContainer';
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
type DefaultStoryProps = ScrollContainerRootProps & { running?: boolean; initialLines?: number };
|
|
17
|
+
|
|
18
|
+
const DefaultStory = ({ initialLines = 0, running: runningProp, ...props }: DefaultStoryProps) => {
|
|
17
19
|
const [lines, setLines] = useState<string[]>([]);
|
|
18
|
-
const [running, setRunning] = useState(
|
|
20
|
+
const [running, setRunning] = useState(runningProp);
|
|
19
21
|
const scroller = useRef<ScrollController>(null);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
setLines(Array.from({ length: initialLines }, () => random.lorem.paragraph()));
|
|
24
|
+
}, [initialLines]);
|
|
20
25
|
useEffect(() => {
|
|
21
26
|
if (!running) {
|
|
22
27
|
return;
|
|
23
28
|
}
|
|
24
29
|
|
|
25
30
|
const i = setInterval(() => {
|
|
26
|
-
setLines((lines) => [...lines,
|
|
31
|
+
setLines((lines) => [...lines, random.lorem.paragraph()]);
|
|
27
32
|
}, 500);
|
|
28
33
|
|
|
29
34
|
return () => clearInterval(i);
|
|
30
35
|
}, [running]);
|
|
31
36
|
|
|
32
37
|
return (
|
|
33
|
-
<
|
|
34
|
-
<Toolbar
|
|
35
|
-
<
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
38
|
+
<Panel.Root className='dx-document'>
|
|
39
|
+
<Panel.Toolbar asChild>
|
|
40
|
+
<Toolbar.Root>
|
|
41
|
+
<Button onClick={() => setRunning((running) => !running)}>{running ? 'Stop' : 'Start'}</Button>
|
|
42
|
+
<Button onClick={() => scroller.current?.scrollToBottom()}>Scroll to bottom</Button>
|
|
43
|
+
<Toolbar.Separator />
|
|
44
|
+
<div className='px-1'>{lines.length}</div>
|
|
45
|
+
</Toolbar.Root>
|
|
46
|
+
</Panel.Toolbar>
|
|
47
|
+
<Panel.Content>
|
|
48
|
+
<ScrollContainer.Root {...props} ref={scroller}>
|
|
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>
|
|
60
|
+
</ScrollContainer.Root>
|
|
61
|
+
</Panel.Content>
|
|
62
|
+
</Panel.Root>
|
|
51
63
|
);
|
|
52
64
|
};
|
|
53
65
|
|
|
@@ -55,7 +67,7 @@ const meta = {
|
|
|
55
67
|
title: 'ui/react-ui-core/components/ScrollContainer',
|
|
56
68
|
component: ScrollContainer.Root,
|
|
57
69
|
render: DefaultStory,
|
|
58
|
-
decorators: [withTheme(), withLayout({ layout: 'column', classNames: '
|
|
70
|
+
decorators: [withTheme(), withLayout({ layout: 'column', classNames: 'w-[30rem]' })],
|
|
59
71
|
} satisfies Meta<typeof DefaultStory>;
|
|
60
72
|
|
|
61
73
|
export default meta;
|
|
@@ -65,6 +77,15 @@ type Story = StoryObj<typeof meta>;
|
|
|
65
77
|
export const Default: Story = {
|
|
66
78
|
args: {
|
|
67
79
|
pin: true,
|
|
68
|
-
|
|
80
|
+
|
|
81
|
+
running: true,
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const Large: Story = {
|
|
86
|
+
args: {
|
|
87
|
+
pin: true,
|
|
88
|
+
|
|
89
|
+
initialLines: 100,
|
|
69
90
|
},
|
|
70
91
|
};
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
import { createContext } from '@radix-ui/react-context';
|
|
6
6
|
import React, {
|
|
7
|
-
type HTMLAttributes,
|
|
8
7
|
type PropsWithChildren,
|
|
8
|
+
type RefObject,
|
|
9
9
|
forwardRef,
|
|
10
10
|
useCallback,
|
|
11
11
|
useEffect,
|
|
@@ -15,15 +15,16 @@ import React, {
|
|
|
15
15
|
useState,
|
|
16
16
|
} from 'react';
|
|
17
17
|
|
|
18
|
-
// TODO(burdon): Move these deps to @dxos/dom-util.
|
|
19
18
|
import { addEventListener, combine } from '@dxos/async';
|
|
20
19
|
import { invariant } from '@dxos/invariant';
|
|
21
|
-
import {
|
|
20
|
+
import { useMergeRefs } from '@dxos/react-hooks';
|
|
21
|
+
import { composable, composableProps, slottable } from '@dxos/ui-theme';
|
|
22
22
|
import { mx } from '@dxos/ui-theme';
|
|
23
|
+
import { type SlottableProps } from '@dxos/ui-types';
|
|
23
24
|
|
|
24
25
|
import { type ThemedClassName } from '../../util';
|
|
25
26
|
import { IconButton } from '../Button';
|
|
26
|
-
import { ScrollArea } from '../ScrollArea';
|
|
27
|
+
import { ScrollArea, type ScrollAreaRootProps } from '../ScrollArea';
|
|
27
28
|
|
|
28
29
|
const isBottom = (el: HTMLElement | null) => {
|
|
29
30
|
return !!(el && el.scrollHeight - el.scrollTop === el.clientHeight);
|
|
@@ -36,9 +37,15 @@ export interface ScrollController {
|
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
type ScrollContainerContextValue = {
|
|
39
|
-
scrollToBottom: (behavior?: ScrollBehavior) => void;
|
|
40
40
|
controller?: ScrollController;
|
|
41
41
|
pinned?: boolean;
|
|
42
|
+
overflow?: boolean;
|
|
43
|
+
/** Called by Viewport to register/unregister the scroll element. */
|
|
44
|
+
setViewport: (el: HTMLDivElement | null) => void;
|
|
45
|
+
/** Called by Viewport on wheel events to update pinned state. */
|
|
46
|
+
setPinned: (value: boolean) => void;
|
|
47
|
+
/** Called by Viewport on scroll events to update overflow state. */
|
|
48
|
+
setOverflow: (value: boolean) => void;
|
|
42
49
|
};
|
|
43
50
|
|
|
44
51
|
const [ScrollContainerProvider, useScrollContainerContext] =
|
|
@@ -48,101 +55,85 @@ const [ScrollContainerProvider, useScrollContainerContext] =
|
|
|
48
55
|
// Root
|
|
49
56
|
//
|
|
50
57
|
|
|
51
|
-
type RootProps =
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
behavior?: ScrollBehavior;
|
|
56
|
-
}>
|
|
57
|
-
>;
|
|
58
|
+
type RootProps = PropsWithChildren<{
|
|
59
|
+
pin?: boolean;
|
|
60
|
+
behavior?: ScrollBehavior;
|
|
61
|
+
}>;
|
|
58
62
|
|
|
59
63
|
/**
|
|
60
|
-
*
|
|
64
|
+
* Headless scroll container that provides context for scroll state.
|
|
65
|
+
* Render ScrollContainer.Content and ScrollContainer.Viewport as children.
|
|
61
66
|
*/
|
|
62
67
|
const Root = forwardRef<ScrollController, RootProps>(
|
|
63
|
-
({ children,
|
|
64
|
-
const scrollerRef = useRef<HTMLDivElement>(null);
|
|
68
|
+
({ children, pin, behavior: behaviorProp = 'smooth' }, forwardedRef) => {
|
|
69
|
+
const scrollerRef = useRef<HTMLDivElement | null>(null);
|
|
65
70
|
const autoScrollRef = useRef(false);
|
|
66
|
-
const [overflow, setOverflow] = useState(false);
|
|
67
71
|
const [pinned, setPinned] = useState(pin);
|
|
72
|
+
const [overflow, setOverflow] = useState(false);
|
|
68
73
|
|
|
69
74
|
const timeoutRef = useRef<NodeJS.Timeout>(undefined);
|
|
70
|
-
const scrollToBottom = useCallback(
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
75
|
+
const scrollToBottom = useCallback(
|
|
76
|
+
(behavior: ScrollBehavior = behaviorProp) => {
|
|
77
|
+
if (scrollerRef.current) {
|
|
78
|
+
if (behavior !== 'instant') {
|
|
79
|
+
// Temporarily hide scrollbar to prevent flickering during smooth scroll.
|
|
80
|
+
// For instant scrolling we skip this — there's no animation to hide,
|
|
81
|
+
// and adding the class changes element size which re-fires the ResizeObserver.
|
|
82
|
+
autoScrollRef.current = true;
|
|
83
|
+
scrollerRef.current.classList.add('scrollbar-none');
|
|
84
|
+
clearTimeout(timeoutRef.current);
|
|
85
|
+
timeoutRef.current = setTimeout(() => {
|
|
86
|
+
scrollerRef.current?.classList.remove('scrollbar-none');
|
|
87
|
+
autoScrollRef.current = false;
|
|
88
|
+
}, 500);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
scrollerRef.current.scrollTo({
|
|
92
|
+
top: scrollerRef.current.scrollHeight,
|
|
93
|
+
behavior,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
setPinned(true);
|
|
86
97
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
98
|
+
},
|
|
99
|
+
[behaviorProp],
|
|
100
|
+
);
|
|
90
101
|
|
|
91
|
-
const controller = useMemo(
|
|
102
|
+
const controller = useMemo<ScrollController>(
|
|
92
103
|
() => ({
|
|
93
|
-
viewport
|
|
104
|
+
get viewport() {
|
|
105
|
+
return scrollerRef.current;
|
|
106
|
+
},
|
|
94
107
|
scrollToTop: () => {
|
|
95
108
|
invariant(scrollerRef.current);
|
|
96
109
|
scrollerRef.current.scrollTo({ top: 0, behavior: 'smooth' });
|
|
97
110
|
setPinned(false);
|
|
98
111
|
},
|
|
99
|
-
scrollToBottom: () => {
|
|
100
|
-
scrollToBottom(
|
|
112
|
+
scrollToBottom: (behavior = 'smooth' as ScrollBehavior) => {
|
|
113
|
+
scrollToBottom(behavior);
|
|
101
114
|
},
|
|
102
115
|
}),
|
|
103
|
-
[scrollToBottom
|
|
116
|
+
[scrollToBottom],
|
|
104
117
|
);
|
|
105
118
|
|
|
106
119
|
// Scroll controller imperative ref.
|
|
107
120
|
useImperativeHandle(forwardedRef, () => controller, [controller]);
|
|
108
121
|
|
|
109
|
-
//
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
return combine(
|
|
116
|
-
// Check if user scrolls.
|
|
117
|
-
addEventListener(scrollerRef.current, 'wheel', () => {
|
|
118
|
-
setPinned(isBottom(scrollerRef.current));
|
|
119
|
-
}),
|
|
120
|
-
// Check if scrolls.
|
|
121
|
-
addEventListener(scrollerRef.current, 'scroll', () => {
|
|
122
|
-
setOverflow((scrollerRef.current?.scrollTop ?? 0) > 0);
|
|
123
|
-
}),
|
|
124
|
-
);
|
|
122
|
+
// Called by Viewport when the scroll element mounts/unmounts.
|
|
123
|
+
const setViewport = useCallback((el: HTMLDivElement | null) => {
|
|
124
|
+
scrollerRef.current = el;
|
|
125
125
|
}, []);
|
|
126
126
|
|
|
127
127
|
return (
|
|
128
|
-
<ScrollContainerProvider
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
'opacity-0 duration-200 transition-opacity data-[visible="true"]:opacity-100',
|
|
138
|
-
'bg-gradient-to-b from-[--surface-bg] to-transparent pointer-events-none',
|
|
139
|
-
)}
|
|
140
|
-
/>
|
|
141
|
-
)}
|
|
142
|
-
<ScrollArea.Root classNames={mx('min-bs-0', classNames)} ref={scrollerRef} thin>
|
|
143
|
-
<ScrollArea.Viewport>{children}</ScrollArea.Viewport>
|
|
144
|
-
</ScrollArea.Root>
|
|
145
|
-
</div>
|
|
128
|
+
<ScrollContainerProvider
|
|
129
|
+
pinned={pinned}
|
|
130
|
+
overflow={overflow}
|
|
131
|
+
controller={controller}
|
|
132
|
+
setViewport={setViewport}
|
|
133
|
+
setPinned={setPinned}
|
|
134
|
+
setOverflow={setOverflow}
|
|
135
|
+
>
|
|
136
|
+
{children}
|
|
146
137
|
</ScrollContainerProvider>
|
|
147
138
|
);
|
|
148
139
|
},
|
|
@@ -150,41 +141,154 @@ const Root = forwardRef<ScrollController, RootProps>(
|
|
|
150
141
|
|
|
151
142
|
Root.displayName = 'ScrollContainer.Root';
|
|
152
143
|
|
|
144
|
+
//
|
|
145
|
+
// Content
|
|
146
|
+
//
|
|
147
|
+
|
|
148
|
+
type ContentProps = Pick<ScrollAreaRootProps, 'thin' | 'padding' | 'centered'>;
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Composable wrapper around ScrollArea.Root.
|
|
152
|
+
* Provides the DOM structure for the scroll container.
|
|
153
|
+
*/
|
|
154
|
+
const Content = composable<HTMLDivElement, ContentProps>(
|
|
155
|
+
({ children, thin, padding, centered, ...props }, forwardedRef) => {
|
|
156
|
+
return (
|
|
157
|
+
<ScrollArea.Root
|
|
158
|
+
{...composableProps(props, { classNames: 'relative' })}
|
|
159
|
+
thin={thin}
|
|
160
|
+
padding={padding}
|
|
161
|
+
centered={centered}
|
|
162
|
+
ref={forwardedRef}
|
|
163
|
+
>
|
|
164
|
+
{children}
|
|
165
|
+
</ScrollArea.Root>
|
|
166
|
+
);
|
|
167
|
+
},
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
Content.displayName = 'ScrollContainer.Content';
|
|
171
|
+
|
|
153
172
|
//
|
|
154
173
|
// Viewport
|
|
155
174
|
//
|
|
156
175
|
|
|
157
176
|
const VIEWPORT_NAME = 'ScrollContainer.Viewport';
|
|
158
177
|
|
|
159
|
-
type ViewportProps =
|
|
178
|
+
type ViewportProps = SlottableProps;
|
|
160
179
|
|
|
161
|
-
const Viewport =
|
|
162
|
-
const
|
|
163
|
-
const
|
|
180
|
+
const Viewport = slottable<HTMLDivElement, ViewportProps>(({ children, asChild, ...props }, forwardedRef) => {
|
|
181
|
+
const scrollerRef = useRef<HTMLDivElement>(null);
|
|
182
|
+
const mergedRef = useMergeRefs([forwardedRef, scrollerRef]);
|
|
183
|
+
const { setViewport, setPinned, setOverflow } = useScrollContainerContext(VIEWPORT_NAME);
|
|
164
184
|
|
|
185
|
+
// Register the scroll element with Root and set up wheel/scroll listeners.
|
|
165
186
|
useEffect(() => {
|
|
166
|
-
|
|
187
|
+
const el = scrollerRef.current;
|
|
188
|
+
if (!el) {
|
|
167
189
|
return;
|
|
168
190
|
}
|
|
169
191
|
|
|
170
|
-
|
|
171
|
-
scrollToBottom();
|
|
192
|
+
setViewport(el);
|
|
172
193
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
194
|
+
return combine(
|
|
195
|
+
addEventListener(el, 'wheel', () => setPinned(isBottom(el))),
|
|
196
|
+
addEventListener(el, 'scroll', () => setOverflow((el.scrollTop ?? 0) > 0)),
|
|
197
|
+
() => setViewport(null),
|
|
198
|
+
);
|
|
199
|
+
}, [setViewport, setPinned, setOverflow]);
|
|
178
200
|
|
|
179
201
|
return (
|
|
180
|
-
|
|
181
|
-
{
|
|
182
|
-
|
|
202
|
+
<>
|
|
203
|
+
<ScrollArea.Viewport asChild={asChild} {...composableProps(props)} ref={mergedRef}>
|
|
204
|
+
{children}
|
|
205
|
+
</ScrollArea.Viewport>
|
|
206
|
+
<PinEffect scrollerRef={scrollerRef} />
|
|
207
|
+
</>
|
|
183
208
|
);
|
|
184
209
|
});
|
|
185
210
|
|
|
186
211
|
Viewport.displayName = VIEWPORT_NAME;
|
|
187
212
|
|
|
213
|
+
/**
|
|
214
|
+
* Isolated component that consumes pinned/controller from context.
|
|
215
|
+
* Kept separate so that Viewport does not re-render when pinned changes.
|
|
216
|
+
*/
|
|
217
|
+
const PIN_EFFECT_NAME = 'ScrollContainer.PinEffect';
|
|
218
|
+
|
|
219
|
+
const PinEffect = ({ scrollerRef }: { scrollerRef: RefObject<HTMLDivElement | null> }) => {
|
|
220
|
+
const { pinned, controller } = useScrollContainerContext(PIN_EFFECT_NAME);
|
|
221
|
+
|
|
222
|
+
// Pin scroll to bottom when content changes.
|
|
223
|
+
useEffect(() => {
|
|
224
|
+
const viewport = scrollerRef.current;
|
|
225
|
+
if (!pinned || !viewport) {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Scroll instantly so we don't visually jump while content is being added.
|
|
230
|
+
controller?.scrollToBottom('instant');
|
|
231
|
+
|
|
232
|
+
// Setup resize observer on content children to detect size changes (e.g. streaming).
|
|
233
|
+
// We observe children rather than the viewport itself, because the viewport's size
|
|
234
|
+
// stays fixed — only its content grows.
|
|
235
|
+
// Use instant scroll in the callback — smooth scrolling adds/removes the
|
|
236
|
+
// scrollbar-none class, which changes the element size and re-fires the
|
|
237
|
+
// observer, creating an infinite loop.
|
|
238
|
+
const resizeObserver = new ResizeObserver(() => controller?.scrollToBottom('smooth'));
|
|
239
|
+
Array.from(viewport.children).forEach((child) => {
|
|
240
|
+
resizeObserver.observe(child);
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
// Watch for added/removed children.
|
|
244
|
+
const mutationObserver = new MutationObserver((mutations) => {
|
|
245
|
+
mutations.forEach((mutation) => {
|
|
246
|
+
mutation.addedNodes.forEach((node) => {
|
|
247
|
+
if (node instanceof Element) {
|
|
248
|
+
resizeObserver.observe(node);
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
controller?.scrollToBottom('smooth');
|
|
254
|
+
});
|
|
255
|
+
mutationObserver.observe(viewport, { childList: true });
|
|
256
|
+
|
|
257
|
+
return () => {
|
|
258
|
+
resizeObserver.disconnect();
|
|
259
|
+
mutationObserver.disconnect();
|
|
260
|
+
};
|
|
261
|
+
}, [pinned, controller, scrollerRef]);
|
|
262
|
+
|
|
263
|
+
return null;
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
//
|
|
267
|
+
// Fade
|
|
268
|
+
//
|
|
269
|
+
|
|
270
|
+
const FADE_NAME = 'ScrollContainer.Fade';
|
|
271
|
+
|
|
272
|
+
type FadeProps = {};
|
|
273
|
+
|
|
274
|
+
const Fade = () => {
|
|
275
|
+
const { overflow } = useScrollContainerContext(FADE_NAME);
|
|
276
|
+
|
|
277
|
+
return (
|
|
278
|
+
<div
|
|
279
|
+
data-visible={overflow}
|
|
280
|
+
className={mx(
|
|
281
|
+
// NOTE: Gradients may not be visible with dark reader extensions.
|
|
282
|
+
'z-10 absolute top-0 inset-x-0 h-24 w-full',
|
|
283
|
+
'opacity-0 duration-200 transition-opacity data-[visible="true"]:opacity-100',
|
|
284
|
+
'bg-gradient-to-b from-(--color-base-surface) to-transparent pointer-events-none',
|
|
285
|
+
)}
|
|
286
|
+
/>
|
|
287
|
+
);
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
Fade.displayName = FADE_NAME;
|
|
291
|
+
|
|
188
292
|
//
|
|
189
293
|
// ScrollDownButton
|
|
190
294
|
//
|
|
@@ -194,11 +298,10 @@ const SCROLL_DOWN_BUTTON_NAME = 'ScrollContainer.ScrollDownButton';
|
|
|
194
298
|
type ScrollDownButtonProps = ThemedClassName;
|
|
195
299
|
|
|
196
300
|
const ScrollDownButton = ({ classNames }: ScrollDownButtonProps) => {
|
|
197
|
-
const { pinned,
|
|
301
|
+
const { pinned, controller } = useScrollContainerContext(SCROLL_DOWN_BUTTON_NAME);
|
|
198
302
|
|
|
199
303
|
return (
|
|
200
304
|
<div
|
|
201
|
-
role='none'
|
|
202
305
|
className={mx(
|
|
203
306
|
'absolute bottom-2 right-4 opacity-100 transition-opacity duration-300',
|
|
204
307
|
pinned && 'opacity-0',
|
|
@@ -211,7 +314,7 @@ const ScrollDownButton = ({ classNames }: ScrollDownButtonProps) => {
|
|
|
211
314
|
iconOnly
|
|
212
315
|
size={4}
|
|
213
316
|
label='Scroll down'
|
|
214
|
-
onClick={() => scrollToBottom()}
|
|
317
|
+
onClick={() => controller?.scrollToBottom()}
|
|
215
318
|
/>
|
|
216
319
|
</div>
|
|
217
320
|
);
|
|
@@ -227,12 +330,16 @@ export { useScrollContainerContext };
|
|
|
227
330
|
|
|
228
331
|
export const ScrollContainer = {
|
|
229
332
|
Root,
|
|
333
|
+
Content,
|
|
230
334
|
Viewport,
|
|
335
|
+
Fade,
|
|
231
336
|
ScrollDownButton,
|
|
232
337
|
};
|
|
233
338
|
|
|
234
339
|
export type {
|
|
235
340
|
RootProps as ScrollContainerRootProps,
|
|
341
|
+
ContentProps as ScrollContainerContentProps,
|
|
236
342
|
ViewportProps as ScrollContainerViewportProps,
|
|
343
|
+
FadeProps as ScrollContainerFadeProps,
|
|
237
344
|
ScrollDownButtonProps as ScrollContainerScrollDownButtonProps,
|
|
238
345
|
};
|
|
@@ -5,20 +5,19 @@
|
|
|
5
5
|
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
6
|
import React, { useState } from 'react';
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import { random } from '@dxos/random';
|
|
9
9
|
|
|
10
10
|
import { withTheme } from '../../testing';
|
|
11
11
|
import { withLayoutVariants } from '../../testing';
|
|
12
|
-
|
|
13
12
|
import { Select } from './Select';
|
|
14
13
|
|
|
15
|
-
|
|
14
|
+
random.seed(1234);
|
|
16
15
|
|
|
17
16
|
type ItemProps = { id: string; text: string };
|
|
18
17
|
|
|
19
|
-
type
|
|
18
|
+
type DefaultStoryProps = { items: ItemProps[] };
|
|
20
19
|
|
|
21
|
-
const DefaultStory = ({ items = [] }:
|
|
20
|
+
const DefaultStory = ({ items = [] }: DefaultStoryProps) => {
|
|
22
21
|
const [value, setValue] = useState<string>();
|
|
23
22
|
return (
|
|
24
23
|
<Select.Root value={value} onValueChange={setValue}>
|
|
@@ -53,6 +52,6 @@ type Story = StoryObj<typeof meta>;
|
|
|
53
52
|
|
|
54
53
|
export const Default: Story = {
|
|
55
54
|
args: {
|
|
56
|
-
items: Array.from({ length: 16 }).map((_, i) => ({ id: `item-${i}`, text:
|
|
55
|
+
items: Array.from({ length: 16 }).map((_, i) => ({ id: `item-${i}`, text: random.lorem.word() })),
|
|
57
56
|
},
|
|
58
57
|
};
|
|
@@ -39,7 +39,7 @@ const SelectTriggerButton = forwardRef<HTMLButtonElement, SelectTriggerButtonPro
|
|
|
39
39
|
<SelectPrimitive.Trigger asChild ref={forwardedRef}>
|
|
40
40
|
<Button {...props}>
|
|
41
41
|
<SelectPrimitive.Value placeholder={placeholder}>{children}</SelectPrimitive.Value>
|
|
42
|
-
<span className='
|
|
42
|
+
<span className='w-1 flex-1' />
|
|
43
43
|
<SelectPrimitive.Icon asChild>
|
|
44
44
|
<Icon size={3} icon='ph--caret-down--bold' />
|
|
45
45
|
</SelectPrimitive.Icon>
|
|
@@ -154,7 +154,7 @@ const SelectOption = forwardRef<HTMLDivElement, SelectItemProps>(({ children, cl
|
|
|
154
154
|
return (
|
|
155
155
|
<SelectPrimitive.Item {...props} className={tx('select.item', {}, classNames)} ref={forwardedRef}>
|
|
156
156
|
<SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
|
|
157
|
-
<span className='grow
|
|
157
|
+
<span className='grow w-1' />
|
|
158
158
|
{/* <SelectPrimitive.ItemIndicator className={tx('select.itemIndicator', 'option__indicator', {})}> */}
|
|
159
159
|
<Icon icon='ph--check--regular' />
|
|
160
160
|
{/* </SelectPrimitive.ItemIndicator> */}
|
|
@@ -1,24 +1,21 @@
|
|
|
1
1
|
//
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
|
-
import
|
|
5
|
-
Separator as SeparatorPrimitive,
|
|
6
|
-
type SeparatorProps as SeparatorPrimitiveProps,
|
|
7
|
-
} from '@radix-ui/react-separator';
|
|
4
|
+
import * as SeparatorPrimitive from '@radix-ui/react-separator';
|
|
8
5
|
import React, { forwardRef } from 'react';
|
|
9
6
|
|
|
10
7
|
import { useThemeContext } from '../../hooks';
|
|
11
8
|
import { type ThemedClassName } from '../../util';
|
|
12
9
|
|
|
13
|
-
type SeparatorProps = ThemedClassName<
|
|
10
|
+
type SeparatorProps = ThemedClassName<SeparatorPrimitive.SeparatorProps> & { subdued?: boolean };
|
|
14
11
|
|
|
15
12
|
const Separator = forwardRef<HTMLDivElement, SeparatorProps>(
|
|
16
13
|
({ classNames, orientation = 'horizontal', subdued, ...props }, forwardedRef) => {
|
|
17
14
|
const { tx } = useThemeContext();
|
|
18
15
|
return (
|
|
19
|
-
<SeparatorPrimitive
|
|
20
|
-
orientation={orientation}
|
|
16
|
+
<SeparatorPrimitive.Root
|
|
21
17
|
{...props}
|
|
18
|
+
orientation={orientation}
|
|
22
19
|
className={tx('separator.root', { orientation, subdued }, classNames)}
|
|
23
20
|
ref={forwardedRef}
|
|
24
21
|
/>
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
import React from 'react';
|
|
6
6
|
|
|
7
7
|
import { withTheme } from '../../testing';
|
|
8
|
-
|
|
9
8
|
import { Skeleton } from './Skeleton';
|
|
10
9
|
|
|
11
10
|
export default {
|
|
@@ -19,12 +18,12 @@ export default {
|
|
|
19
18
|
|
|
20
19
|
export const Default = {
|
|
21
20
|
render: () => (
|
|
22
|
-
<div className='flex flex-col gap-4 p-4 border border-separator rounded-
|
|
23
|
-
<div className='flex
|
|
21
|
+
<div className='flex flex-col gap-4 p-4 border border-separator rounded-xs'>
|
|
22
|
+
<div className='flex w-fit items-center gap-4'>
|
|
24
23
|
<Skeleton classNames='size-10 shrink-0 rounded-full' />
|
|
25
24
|
<div className='grid gap-2'>
|
|
26
|
-
<Skeleton classNames='
|
|
27
|
-
<Skeleton classNames='
|
|
25
|
+
<Skeleton classNames='h-4 w-[150px]' />
|
|
26
|
+
<Skeleton classNames='h-4 w-[100px]' />
|
|
28
27
|
</div>
|
|
29
28
|
</div>
|
|
30
29
|
</div>
|
|
@@ -33,19 +32,19 @@ export const Default = {
|
|
|
33
32
|
|
|
34
33
|
export const Card = {
|
|
35
34
|
render: () => (
|
|
36
|
-
<div className='flex flex-col gap-3
|
|
35
|
+
<div className='flex flex-col gap-3 w-96 p-4 border border-separator rounded-xs'>
|
|
37
36
|
<div className='flex items-center gap-3'>
|
|
38
|
-
<Skeleton variant='circle' classNames='
|
|
37
|
+
<Skeleton variant='circle' classNames='h-12 w-12 rounded-full' />
|
|
39
38
|
<div className='flex flex-col gap-2 flex-1'>
|
|
40
|
-
<Skeleton classNames='
|
|
41
|
-
<Skeleton classNames='
|
|
39
|
+
<Skeleton classNames='h-4 w-24' />
|
|
40
|
+
<Skeleton classNames='h-3 w-32' />
|
|
42
41
|
</div>
|
|
43
42
|
</div>
|
|
44
|
-
<Skeleton classNames='
|
|
43
|
+
<Skeleton classNames='h-32 w-full rounded-sm' />
|
|
45
44
|
<div className='flex flex-col gap-2'>
|
|
46
|
-
<Skeleton classNames='
|
|
47
|
-
<Skeleton classNames='
|
|
48
|
-
<Skeleton classNames='
|
|
45
|
+
<Skeleton classNames='h-3 w-full' />
|
|
46
|
+
<Skeleton classNames='h-3 w-5/6' />
|
|
47
|
+
<Skeleton classNames='h-3 w-4/6' />
|
|
49
48
|
</div>
|
|
50
49
|
</div>
|
|
51
50
|
),
|