@dxos/react-ui 0.8.4-main.fffef41 → 0.8.4-staging.ac66bdf99f
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-OCVRIJCH.mjs +848 -0
- package/dist/lib/browser/chunk-OCVRIJCH.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +4111 -67
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +88 -64
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/chunk-QUD5P3RU.mjs +850 -0
- package/dist/lib/node-esm/chunk-QUD5P3RU.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +4111 -67
- 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 +88 -64
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- 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 +3 -3
- package/dist/types/src/components/Button/Button.d.ts.map +1 -1
- package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -1
- package/dist/types/src/components/Button/IconButton.d.ts +2 -1
- 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 +10 -10
- package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -1
- package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +4 -4
- package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
- package/dist/types/src/components/Card/Card.d.ts +120 -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/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 +1 -1
- package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
- package/dist/types/src/components/Dialog/AlertDialog.d.ts +39 -19
- 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 +54 -21
- package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
- package/dist/types/src/components/Dialog/Dialog.stories.d.ts +10 -10
- package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
- 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/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 -1
- 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 +14 -0
- package/dist/types/src/components/Image/Image.d.ts.map +1 -0
- package/dist/types/src/components/Image/Image.stories.d.ts +33 -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 +7 -7
- package/dist/types/src/components/Input/Input.d.ts.map +1 -1
- package/dist/types/src/components/Input/Input.stories.d.ts +8 -8
- 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 +6 -4
- 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/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/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 +9 -10
- 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/{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 +52 -51
- package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
- package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +28 -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 +5 -6
- package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
- package/dist/types/src/components/Popover/Popover.d.ts +33 -24
- 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 +27 -27
- package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
- package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +57 -8
- package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
- package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +37 -14
- package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
- package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +10 -5
- package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/Select/Select.d.ts +9 -9
- 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 +4 -4
- package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
- package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
- package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
- package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
- package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
- package/dist/types/src/components/Skeleton/index.d.ts +2 -0
- package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
- package/dist/types/src/components/Splitter/Splitter.d.ts +34 -0
- package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
- package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
- package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
- package/dist/types/src/components/Splitter/index.d.ts +2 -0
- package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
- 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.d.ts +1 -1
- package/dist/types/src/components/Tag/Tag.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 +3 -3
- package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
- package/dist/types/src/components/{Menus/DropdownMenu.stories.d.ts → ThemeProvider/ThemeProvider.stories.d.ts} +2 -5
- package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
- 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 +19 -19
- 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 +36 -18
- 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 +9 -9
- 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 +10 -5
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/exemplars/generics.stories.d.ts +19 -0
- package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
- package/dist/types/src/exemplars/slot.stories.d.ts +15 -0
- package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
- package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
- package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
- 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 +2 -2
- 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 +2 -1
- package/dist/types/src/index.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.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 +7 -0
- package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
- package/dist/types/src/primitives/Container/Container.stories.d.ts +6 -0
- package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
- package/dist/types/src/primitives/Container/index.d.ts +2 -0
- package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
- package/dist/types/src/primitives/Flex/Flex.d.ts +11 -0
- package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
- 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/Flex/index.d.ts +2 -0
- package/dist/types/src/primitives/Flex/index.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 +6 -0
- package/dist/types/src/primitives/index.d.ts.map +1 -0
- 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 +3 -3
- package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
- package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +1 -1
- package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
- package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
- 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/index.d.ts +1 -2
- package/dist/types/src/util/index.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 +42 -32
- package/src/components/Avatars/Avatar.stories.tsx +7 -9
- package/src/components/Avatars/Avatar.tsx +7 -15
- package/src/components/Avatars/AvatarGroup.stories.tsx +2 -3
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +3 -4
- package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
- package/src/components/Button/Button.stories.tsx +3 -4
- package/src/components/Button/Button.tsx +12 -26
- package/src/components/Button/IconButton.stories.tsx +8 -6
- package/src/components/Button/IconButton.tsx +9 -6
- package/src/components/Button/Toggle.stories.tsx +2 -3
- package/src/components/Button/Toggle.tsx +4 -4
- package/src/components/Button/ToggleGroup.stories.tsx +2 -3
- package/src/components/Button/ToggleGroup.tsx +12 -16
- package/src/components/Card/Card.stories.tsx +151 -0
- package/src/components/Card/Card.tsx +493 -0
- package/src/components/Card/index.ts +5 -0
- package/src/components/Clipboard/CopyButton.tsx +7 -8
- package/src/components/DensityProvider/DensityProvider.tsx +1 -1
- package/src/components/Dialog/AlertDialog.stories.tsx +16 -17
- package/src/components/Dialog/AlertDialog.tsx +123 -82
- package/src/components/Dialog/Dialog.stories.tsx +138 -28
- package/src/components/Dialog/Dialog.tsx +197 -71
- package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
- 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 +45 -15
- package/src/components/Icon/Icon.tsx +7 -3
- package/src/components/Image/Image.stories.tsx +86 -0
- package/src/components/Image/Image.tsx +223 -0
- package/src/components/Image/index.ts +5 -0
- package/src/components/Input/Input.stories.tsx +21 -41
- package/src/components/Input/Input.tsx +38 -74
- package/src/components/Link/Link.stories.tsx +2 -3
- package/src/components/Link/Link.tsx +2 -2
- package/src/components/List/List.stories.tsx +30 -34
- package/src/components/List/List.tsx +17 -21
- package/src/components/List/ListDropIndicator.tsx +7 -7
- package/src/components/List/Tree.stories.tsx +5 -6
- package/src/components/List/Tree.tsx +0 -1
- package/src/components/List/TreeDropIndicator.tsx +6 -6
- package/src/components/List/Treegrid.stories.tsx +29 -30
- package/src/components/List/Treegrid.tsx +23 -28
- package/src/components/Main/Main.stories.tsx +41 -24
- package/src/components/Main/Main.tsx +139 -83
- package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +2 -3
- package/src/components/{Menus → Menu}/ContextMenu.tsx +9 -33
- package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +2 -3
- package/src/components/{Menus → Menu}/DropdownMenu.tsx +115 -107
- package/src/components/Message/Message.stories.tsx +27 -13
- package/src/components/Message/Message.tsx +43 -34
- package/src/components/Popover/Popover.stories.tsx +7 -8
- package/src/components/Popover/Popover.tsx +97 -92
- package/src/components/ScrollArea/ScrollArea.stories.tsx +223 -34
- package/src/components/ScrollArea/ScrollArea.tsx +97 -79
- package/src/components/ScrollArea/index.ts +1 -1
- package/src/components/ScrollContainer/ScrollContainer.stories.tsx +47 -25
- package/src/components/ScrollContainer/ScrollContainer.tsx +225 -109
- package/src/components/Select/Select.stories.tsx +7 -8
- package/src/components/Select/Select.tsx +11 -27
- package/src/components/Separator/Separator.tsx +5 -8
- package/src/components/Skeleton/Skeleton.stories.tsx +51 -0
- package/src/components/Skeleton/Skeleton.tsx +26 -0
- package/src/components/Skeleton/index.ts +5 -0
- package/src/components/Splitter/Splitter.stories.tsx +83 -0
- package/src/components/Splitter/Splitter.tsx +127 -0
- package/src/components/Splitter/index.ts +5 -0
- package/src/components/Status/Status.stories.tsx +21 -18
- package/src/components/Status/Status.tsx +10 -7
- package/src/components/Tag/Tag.stories.tsx +6 -12
- package/src/components/Tag/Tag.tsx +3 -8
- package/src/components/ThemeProvider/ThemeProvider.stories.tsx +31 -0
- package/src/components/ThemeProvider/ThemeProvider.tsx +10 -10
- package/src/components/ThemeProvider/TranslationsProvider.tsx +1 -16
- package/src/components/ThemeProvider/index.ts +3 -3
- package/src/components/Toast/Toast.stories.tsx +2 -3
- package/src/components/Toast/Toast.tsx +22 -41
- package/src/components/Toolbar/Toolbar.stories.tsx +2 -3
- package/src/components/Toolbar/Toolbar.tsx +185 -23
- package/src/components/Tooltip/Tooltip.stories.tsx +20 -19
- package/src/components/Tooltip/Tooltip.tsx +40 -38
- package/src/components/index.ts +11 -6
- package/src/exemplars/generics.stories.tsx +41 -0
- package/src/exemplars/slot.stories.tsx +117 -0
- package/src/exemplars/tabster.stories.tsx +127 -0
- package/src/exemplars/virtualizer.stories.tsx +137 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useDensityContext.ts +3 -3
- package/src/hooks/useElevationContext.ts +1 -1
- package/src/index.ts +2 -1
- package/src/playground/Controls.stories.tsx +3 -10
- package/src/playground/Custom.stories.tsx +15 -18
- package/src/playground/Typography.stories.tsx +3 -3
- 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 +29 -0
- package/src/primitives/Container/Container.tsx +19 -0
- package/src/primitives/Container/index.ts +5 -0
- package/src/primitives/Flex/Flex.stories.tsx +57 -0
- package/src/primitives/Flex/Flex.tsx +27 -0
- package/src/primitives/Flex/index.ts +5 -0
- 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 +9 -0
- package/src/testing/Loading.tsx +47 -0
- package/src/testing/decorators/withLayout.tsx +39 -18
- package/src/testing/decorators/withLayoutVariants.tsx +20 -23
- package/src/testing/decorators/withTheme.tsx +26 -20
- package/src/testing/index.ts +2 -0
- package/src/translations.ts +19 -0
- package/src/util/index.ts +2 -2
- package/src/util/usePx.ts +1 -0
- package/dist/lib/browser/chunk-N5GDJTT2.mjs +0 -4707
- package/dist/lib/browser/chunk-N5GDJTT2.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SP7VQH72.mjs +0 -4709
- package/dist/lib/node-esm/chunk-SP7VQH72.mjs.map +0 -7
- package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
- 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/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/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/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
- package/src/components/AnchoredOverflow/index.ts +0 -5
- package/src/util/ThemedClassName.ts +0 -7
- package/src/util/domino.ts +0 -53
- /package/dist/types/src/components/{Menus → Menu}/ContextMenu.stories.d.ts +0 -0
- /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
- /package/src/components/{Menus → Menu}/index.ts +0 -0
|
@@ -2,27 +2,29 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { useState } from '@preact-signals/safe-react/react';
|
|
6
5
|
import { createContext } from '@radix-ui/react-context';
|
|
7
6
|
import React, {
|
|
8
|
-
type HTMLAttributes,
|
|
9
7
|
type PropsWithChildren,
|
|
8
|
+
type RefObject,
|
|
10
9
|
forwardRef,
|
|
11
10
|
useCallback,
|
|
12
11
|
useEffect,
|
|
13
12
|
useImperativeHandle,
|
|
14
13
|
useMemo,
|
|
15
14
|
useRef,
|
|
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 {
|
|
22
|
-
import {
|
|
20
|
+
import { useMergeRefs } from '@dxos/react-hooks';
|
|
21
|
+
import { composable, composableProps, slottable } from '@dxos/ui-theme';
|
|
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';
|
|
27
|
+
import { ScrollArea, type ScrollAreaRootProps } from '../ScrollArea';
|
|
26
28
|
|
|
27
29
|
const isBottom = (el: HTMLElement | null) => {
|
|
28
30
|
return !!(el && el.scrollHeight - el.scrollTop === el.clientHeight);
|
|
@@ -35,9 +37,15 @@ export interface ScrollController {
|
|
|
35
37
|
}
|
|
36
38
|
|
|
37
39
|
type ScrollContainerContextValue = {
|
|
38
|
-
scrollToBottom: (behavior?: ScrollBehavior) => void;
|
|
39
40
|
controller?: ScrollController;
|
|
40
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;
|
|
41
49
|
};
|
|
42
50
|
|
|
43
51
|
const [ScrollContainerProvider, useScrollContainerContext] =
|
|
@@ -47,147 +55,251 @@ const [ScrollContainerProvider, useScrollContainerContext] =
|
|
|
47
55
|
// Root
|
|
48
56
|
//
|
|
49
57
|
|
|
50
|
-
type RootProps =
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}>
|
|
55
|
-
>;
|
|
58
|
+
type RootProps = PropsWithChildren<{
|
|
59
|
+
pin?: boolean;
|
|
60
|
+
behavior?: ScrollBehavior;
|
|
61
|
+
}>;
|
|
56
62
|
|
|
57
63
|
/**
|
|
58
|
-
*
|
|
64
|
+
* Headless scroll container that provides context for scroll state.
|
|
65
|
+
* Render ScrollContainer.Content and ScrollContainer.Viewport as children.
|
|
59
66
|
*/
|
|
60
|
-
const Root = forwardRef<ScrollController, RootProps>(
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
scrollToTop: () => {
|
|
92
|
-
invariant(scrollerRef.current);
|
|
93
|
-
scrollerRef.current.scrollTo({ top: 0, behavior: 'smooth' });
|
|
94
|
-
setPinned(false);
|
|
95
|
-
},
|
|
96
|
-
scrollToBottom: () => {
|
|
97
|
-
scrollToBottom('smooth');
|
|
67
|
+
const Root = forwardRef<ScrollController, RootProps>(
|
|
68
|
+
({ children, pin, behavior: behaviorProp = 'smooth' }, forwardedRef) => {
|
|
69
|
+
const scrollerRef = useRef<HTMLDivElement | null>(null);
|
|
70
|
+
const autoScrollRef = useRef(false);
|
|
71
|
+
const [pinned, setPinned] = useState(pin);
|
|
72
|
+
const [overflow, setOverflow] = useState(false);
|
|
73
|
+
|
|
74
|
+
const timeoutRef = useRef<NodeJS.Timeout>(undefined);
|
|
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);
|
|
97
|
+
}
|
|
98
98
|
},
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
99
|
+
[behaviorProp],
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
const controller = useMemo<ScrollController>(
|
|
103
|
+
() => ({
|
|
104
|
+
get viewport() {
|
|
105
|
+
return scrollerRef.current;
|
|
106
|
+
},
|
|
107
|
+
scrollToTop: () => {
|
|
108
|
+
invariant(scrollerRef.current);
|
|
109
|
+
scrollerRef.current.scrollTo({ top: 0, behavior: 'smooth' });
|
|
110
|
+
setPinned(false);
|
|
111
|
+
},
|
|
112
|
+
scrollToBottom: (behavior = 'smooth' as ScrollBehavior) => {
|
|
113
|
+
scrollToBottom(behavior);
|
|
114
|
+
},
|
|
115
|
+
}),
|
|
116
|
+
[scrollToBottom],
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
// Scroll controller imperative ref.
|
|
120
|
+
useImperativeHandle(forwardedRef, () => controller, [controller]);
|
|
121
|
+
|
|
122
|
+
// Called by Viewport when the scroll element mounts/unmounts.
|
|
123
|
+
const setViewport = useCallback((el: HTMLDivElement | null) => {
|
|
124
|
+
scrollerRef.current = el;
|
|
125
|
+
}, []);
|
|
126
|
+
|
|
127
|
+
return (
|
|
128
|
+
<ScrollContainerProvider
|
|
129
|
+
pinned={pinned}
|
|
130
|
+
overflow={overflow}
|
|
131
|
+
controller={controller}
|
|
132
|
+
setViewport={setViewport}
|
|
133
|
+
setPinned={setPinned}
|
|
134
|
+
setOverflow={setOverflow}
|
|
135
|
+
>
|
|
136
|
+
{children}
|
|
137
|
+
</ScrollContainerProvider>
|
|
138
|
+
);
|
|
139
|
+
},
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
Root.displayName = 'ScrollContainer.Root';
|
|
102
143
|
|
|
103
|
-
|
|
104
|
-
|
|
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';
|
|
105
171
|
|
|
106
|
-
|
|
172
|
+
//
|
|
173
|
+
// Viewport
|
|
174
|
+
//
|
|
175
|
+
|
|
176
|
+
const VIEWPORT_NAME = 'ScrollContainer.Viewport';
|
|
177
|
+
|
|
178
|
+
type ViewportProps = SlottableProps;
|
|
179
|
+
|
|
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);
|
|
184
|
+
|
|
185
|
+
// Register the scroll element with Root and set up wheel/scroll listeners.
|
|
107
186
|
useEffect(() => {
|
|
108
|
-
|
|
187
|
+
const el = scrollerRef.current;
|
|
188
|
+
if (!el) {
|
|
109
189
|
return;
|
|
110
190
|
}
|
|
111
191
|
|
|
192
|
+
setViewport(el);
|
|
193
|
+
|
|
112
194
|
return combine(
|
|
113
|
-
|
|
114
|
-
addEventListener(
|
|
115
|
-
|
|
116
|
-
}),
|
|
117
|
-
// Check if scrolls.
|
|
118
|
-
addEventListener(scrollerRef.current, 'scroll', () => {
|
|
119
|
-
setOverflow((scrollerRef.current?.scrollTop ?? 0) > 0);
|
|
120
|
-
}),
|
|
195
|
+
addEventListener(el, 'wheel', () => setPinned(isBottom(el))),
|
|
196
|
+
addEventListener(el, 'scroll', () => setOverflow((el.scrollTop ?? 0) > 0)),
|
|
197
|
+
() => setViewport(null),
|
|
121
198
|
);
|
|
122
|
-
}, []);
|
|
199
|
+
}, [setViewport, setPinned, setOverflow]);
|
|
123
200
|
|
|
124
201
|
return (
|
|
125
|
-
|
|
126
|
-
<
|
|
127
|
-
{
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
className={mx(
|
|
132
|
-
// NOTE: Gradients may not be visible with dark reader extensions.
|
|
133
|
-
'z-10 absolute block-start-0 inset-inline-0 bs-24 is-full',
|
|
134
|
-
'opacity-0 duration-200 transition-opacity data-[visible="true"]:opacity-100',
|
|
135
|
-
'bg-gradient-to-b from-[--surface-bg] to-transparent pointer-events-none',
|
|
136
|
-
)}
|
|
137
|
-
/>
|
|
138
|
-
)}
|
|
139
|
-
<div className={mx('flex flex-col min-bs-0 overflow-y-auto scrollbar-thin', classNames)} ref={scrollerRef}>
|
|
140
|
-
{children}
|
|
141
|
-
</div>
|
|
142
|
-
</div>
|
|
143
|
-
</ScrollContainerProvider>
|
|
202
|
+
<>
|
|
203
|
+
<ScrollArea.Viewport asChild={asChild} {...composableProps(props)} ref={mergedRef}>
|
|
204
|
+
{children}
|
|
205
|
+
</ScrollArea.Viewport>
|
|
206
|
+
<PinEffect scrollerRef={scrollerRef} />
|
|
207
|
+
</>
|
|
144
208
|
);
|
|
145
209
|
});
|
|
146
210
|
|
|
147
|
-
|
|
211
|
+
Viewport.displayName = VIEWPORT_NAME;
|
|
148
212
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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';
|
|
154
218
|
|
|
155
|
-
const
|
|
156
|
-
const
|
|
157
|
-
const { pinned, scrollToBottom } = useScrollContainerContext(Viewport.displayName!);
|
|
219
|
+
const PinEffect = ({ scrollerRef }: { scrollerRef: RefObject<HTMLDivElement | null> }) => {
|
|
220
|
+
const { pinned, controller } = useScrollContainerContext(PIN_EFFECT_NAME);
|
|
158
221
|
|
|
222
|
+
// Pin scroll to bottom when content changes.
|
|
159
223
|
useEffect(() => {
|
|
160
|
-
|
|
224
|
+
const viewport = scrollerRef.current;
|
|
225
|
+
if (!pinned || !viewport) {
|
|
161
226
|
return;
|
|
162
227
|
}
|
|
163
228
|
|
|
164
|
-
//
|
|
165
|
-
|
|
166
|
-
|
|
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 });
|
|
167
256
|
|
|
168
|
-
resizeObserver.observe(contentRef.current);
|
|
169
257
|
return () => {
|
|
170
258
|
resizeObserver.disconnect();
|
|
259
|
+
mutationObserver.disconnect();
|
|
171
260
|
};
|
|
172
|
-
}, [pinned,
|
|
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);
|
|
173
276
|
|
|
174
277
|
return (
|
|
175
|
-
<div
|
|
176
|
-
|
|
177
|
-
|
|
278
|
+
<div
|
|
279
|
+
role='none'
|
|
280
|
+
data-visible={overflow}
|
|
281
|
+
className={mx(
|
|
282
|
+
// NOTE: Gradients may not be visible with dark reader extensions.
|
|
283
|
+
'z-10 absolute top-0 inset-x-0 h-24 w-full',
|
|
284
|
+
'opacity-0 duration-200 transition-opacity data-[visible="true"]:opacity-100',
|
|
285
|
+
'bg-gradient-to-b from-(--surface-bg) to-transparent pointer-events-none',
|
|
286
|
+
)}
|
|
287
|
+
/>
|
|
178
288
|
);
|
|
179
|
-
}
|
|
289
|
+
};
|
|
180
290
|
|
|
181
|
-
|
|
291
|
+
Fade.displayName = FADE_NAME;
|
|
182
292
|
|
|
183
293
|
//
|
|
184
294
|
// ScrollDownButton
|
|
185
295
|
//
|
|
186
296
|
|
|
297
|
+
const SCROLL_DOWN_BUTTON_NAME = 'ScrollContainer.ScrollDownButton';
|
|
298
|
+
|
|
187
299
|
type ScrollDownButtonProps = ThemedClassName;
|
|
188
300
|
|
|
189
301
|
const ScrollDownButton = ({ classNames }: ScrollDownButtonProps) => {
|
|
190
|
-
const { pinned,
|
|
302
|
+
const { pinned, controller } = useScrollContainerContext(SCROLL_DOWN_BUTTON_NAME);
|
|
191
303
|
|
|
192
304
|
return (
|
|
193
305
|
<div
|
|
@@ -204,13 +316,13 @@ const ScrollDownButton = ({ classNames }: ScrollDownButtonProps) => {
|
|
|
204
316
|
iconOnly
|
|
205
317
|
size={4}
|
|
206
318
|
label='Scroll down'
|
|
207
|
-
onClick={() => scrollToBottom()}
|
|
319
|
+
onClick={() => controller?.scrollToBottom()}
|
|
208
320
|
/>
|
|
209
321
|
</div>
|
|
210
322
|
);
|
|
211
323
|
};
|
|
212
324
|
|
|
213
|
-
ScrollDownButton.displayName =
|
|
325
|
+
ScrollDownButton.displayName = SCROLL_DOWN_BUTTON_NAME;
|
|
214
326
|
|
|
215
327
|
//
|
|
216
328
|
// ScrollContainer
|
|
@@ -220,12 +332,16 @@ export { useScrollContainerContext };
|
|
|
220
332
|
|
|
221
333
|
export const ScrollContainer = {
|
|
222
334
|
Root,
|
|
335
|
+
Content,
|
|
223
336
|
Viewport,
|
|
337
|
+
Fade,
|
|
224
338
|
ScrollDownButton,
|
|
225
339
|
};
|
|
226
340
|
|
|
227
341
|
export type {
|
|
228
342
|
RootProps as ScrollContainerRootProps,
|
|
343
|
+
ContentProps as ScrollContainerContentProps,
|
|
229
344
|
ViewportProps as ScrollContainerViewportProps,
|
|
345
|
+
FadeProps as ScrollContainerFadeProps,
|
|
230
346
|
ScrollDownButtonProps as ScrollContainerScrollDownButtonProps,
|
|
231
347
|
};
|
|
@@ -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}>
|
|
@@ -42,9 +41,9 @@ const DefaultStory = ({ items = [] }: StoryProps) => {
|
|
|
42
41
|
};
|
|
43
42
|
|
|
44
43
|
const meta = {
|
|
45
|
-
title: 'ui/react-ui-core/Select',
|
|
44
|
+
title: 'ui/react-ui-core/components/Select',
|
|
46
45
|
render: DefaultStory,
|
|
47
|
-
decorators: [withTheme, withLayoutVariants()],
|
|
46
|
+
decorators: [withTheme(), withLayoutVariants()],
|
|
48
47
|
} satisfies Meta<typeof DefaultStory>;
|
|
49
48
|
|
|
50
49
|
export default meta;
|
|
@@ -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>
|
|
@@ -61,7 +61,7 @@ const SelectContent = forwardRef<HTMLDivElement, SelectContentProps>(
|
|
|
61
61
|
{...props}
|
|
62
62
|
data-arrow-keys='up down'
|
|
63
63
|
collisionPadding={safeCollisionPadding}
|
|
64
|
-
className={tx('select.content',
|
|
64
|
+
className={tx('select.content', { elevation }, classNames)}
|
|
65
65
|
position='popper'
|
|
66
66
|
ref={forwardedRef}
|
|
67
67
|
>
|
|
@@ -79,7 +79,7 @@ const SelectScrollUpButton = forwardRef<HTMLDivElement, SelectScrollUpButtonProp
|
|
|
79
79
|
return (
|
|
80
80
|
<SelectPrimitive.SelectScrollUpButton
|
|
81
81
|
{...props}
|
|
82
|
-
className={tx('select.scrollButton',
|
|
82
|
+
className={tx('select.scrollButton', {}, classNames)}
|
|
83
83
|
ref={forwardedRef}
|
|
84
84
|
>
|
|
85
85
|
{children ?? <Icon size={3} icon='ph--caret-up--bold' />}
|
|
@@ -96,7 +96,7 @@ const SelectScrollDownButton = forwardRef<HTMLDivElement, SelectScrollDownButton
|
|
|
96
96
|
return (
|
|
97
97
|
<SelectPrimitive.SelectScrollDownButton
|
|
98
98
|
{...props}
|
|
99
|
-
className={tx('select.scrollButton',
|
|
99
|
+
className={tx('select.scrollButton', {}, classNames)}
|
|
100
100
|
ref={forwardedRef}
|
|
101
101
|
>
|
|
102
102
|
{children ?? <Icon size={3} icon='ph--caret-down--bold' />}
|
|
@@ -111,11 +111,7 @@ const SelectViewport = forwardRef<HTMLDivElement, SelectViewportProps>(
|
|
|
111
111
|
({ classNames, children, ...props }, forwardedRef) => {
|
|
112
112
|
const { tx } = useThemeContext();
|
|
113
113
|
return (
|
|
114
|
-
<SelectPrimitive.SelectViewport
|
|
115
|
-
{...props}
|
|
116
|
-
className={tx('select.viewport', 'select__viewport', {}, classNames)}
|
|
117
|
-
ref={forwardedRef}
|
|
118
|
-
>
|
|
114
|
+
<SelectPrimitive.SelectViewport {...props} className={tx('select.viewport', {}, classNames)} ref={forwardedRef}>
|
|
119
115
|
{children}
|
|
120
116
|
</SelectPrimitive.SelectViewport>
|
|
121
117
|
);
|
|
@@ -126,7 +122,7 @@ type SelectItemProps = ThemedClassName<SelectPrimitive.SelectItemProps>;
|
|
|
126
122
|
|
|
127
123
|
const SelectItem = forwardRef<HTMLDivElement, SelectItemProps>(({ classNames, ...props }, forwardedRef) => {
|
|
128
124
|
const { tx } = useThemeContext();
|
|
129
|
-
return <SelectPrimitive.Item {...props} className={tx('select.item',
|
|
125
|
+
return <SelectPrimitive.Item {...props} className={tx('select.item', {}, classNames)} ref={forwardedRef} />;
|
|
130
126
|
});
|
|
131
127
|
|
|
132
128
|
type SelectItemTextProps = SelectPrimitive.SelectItemTextProps;
|
|
@@ -141,7 +137,7 @@ const SelectItemIndicator = forwardRef<HTMLDivElement, SelectItemIndicatorProps>
|
|
|
141
137
|
return (
|
|
142
138
|
<SelectPrimitive.ItemIndicator
|
|
143
139
|
{...props}
|
|
144
|
-
className={tx('select.itemIndicator',
|
|
140
|
+
className={tx('select.itemIndicator', {}, classNames)}
|
|
145
141
|
ref={forwardedRef}
|
|
146
142
|
>
|
|
147
143
|
{children}
|
|
@@ -156,9 +152,9 @@ type SelectOptionProps = SelectItemProps;
|
|
|
156
152
|
const SelectOption = forwardRef<HTMLDivElement, SelectItemProps>(({ children, classNames, ...props }, forwardedRef) => {
|
|
157
153
|
const { tx } = useThemeContext();
|
|
158
154
|
return (
|
|
159
|
-
<SelectPrimitive.Item {...props} className={tx('select.item',
|
|
155
|
+
<SelectPrimitive.Item {...props} className={tx('select.item', {}, classNames)} ref={forwardedRef}>
|
|
160
156
|
<SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
|
|
161
|
-
<span className='grow
|
|
157
|
+
<span className='grow w-1' />
|
|
162
158
|
{/* <SelectPrimitive.ItemIndicator className={tx('select.itemIndicator', 'option__indicator', {})}> */}
|
|
163
159
|
<Icon icon='ph--check--regular' />
|
|
164
160
|
{/* </SelectPrimitive.ItemIndicator> */}
|
|
@@ -178,26 +174,14 @@ type SelectSeparatorProps = ThemedClassName<SelectPrimitive.SelectSeparatorProps
|
|
|
178
174
|
|
|
179
175
|
const SelectSeparator = forwardRef<HTMLDivElement, SelectSeparatorProps>(({ classNames, ...props }, forwardedRef) => {
|
|
180
176
|
const { tx } = useThemeContext();
|
|
181
|
-
return (
|
|
182
|
-
<SelectPrimitive.Separator
|
|
183
|
-
{...props}
|
|
184
|
-
className={tx('select.separator', 'select__separator', {}, classNames)}
|
|
185
|
-
ref={forwardedRef}
|
|
186
|
-
/>
|
|
187
|
-
);
|
|
177
|
+
return <SelectPrimitive.Separator {...props} className={tx('select.separator', {}, classNames)} ref={forwardedRef} />;
|
|
188
178
|
});
|
|
189
179
|
|
|
190
180
|
type SelectArrowProps = ThemedClassName<SelectPrimitive.SelectArrowProps>;
|
|
191
181
|
|
|
192
182
|
const SelectArrow = forwardRef<SVGSVGElement, SelectArrowProps>(({ classNames, ...props }, forwardedRef) => {
|
|
193
183
|
const { tx } = useThemeContext();
|
|
194
|
-
return (
|
|
195
|
-
<SelectPrimitive.Arrow
|
|
196
|
-
{...props}
|
|
197
|
-
className={tx('select.arrow', 'select__arrow', {}, classNames)}
|
|
198
|
-
ref={forwardedRef}
|
|
199
|
-
/>
|
|
200
|
-
);
|
|
184
|
+
return <SelectPrimitive.Arrow {...props} className={tx('select.arrow', {}, classNames)} ref={forwardedRef} />;
|
|
201
185
|
});
|
|
202
186
|
|
|
203
187
|
export const Select = {
|
|
@@ -1,25 +1,22 @@
|
|
|
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}
|
|
22
|
-
|
|
18
|
+
orientation={orientation}
|
|
19
|
+
className={tx('separator.root', { orientation, subdued }, classNames)}
|
|
23
20
|
ref={forwardedRef}
|
|
24
21
|
/>
|
|
25
22
|
);
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React from 'react';
|
|
6
|
+
|
|
7
|
+
import { withTheme } from '../../testing';
|
|
8
|
+
import { Skeleton } from './Skeleton';
|
|
9
|
+
|
|
10
|
+
export default {
|
|
11
|
+
title: 'ui/react-ui-core/components/Skeleton',
|
|
12
|
+
component: Skeleton,
|
|
13
|
+
decorators: [withTheme()],
|
|
14
|
+
parameters: {
|
|
15
|
+
layout: 'centered',
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const Default = {
|
|
20
|
+
render: () => (
|
|
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'>
|
|
23
|
+
<Skeleton classNames='size-10 shrink-0 rounded-full' />
|
|
24
|
+
<div className='grid gap-2'>
|
|
25
|
+
<Skeleton classNames='h-4 w-[150px]' />
|
|
26
|
+
<Skeleton classNames='h-4 w-[100px]' />
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
),
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export const Card = {
|
|
34
|
+
render: () => (
|
|
35
|
+
<div className='flex flex-col gap-3 w-96 p-4 border border-separator rounded-xs'>
|
|
36
|
+
<div className='flex items-center gap-3'>
|
|
37
|
+
<Skeleton variant='circle' classNames='h-12 w-12 rounded-full' />
|
|
38
|
+
<div className='flex flex-col gap-2 flex-1'>
|
|
39
|
+
<Skeleton classNames='h-4 w-24' />
|
|
40
|
+
<Skeleton classNames='h-3 w-32' />
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
<Skeleton classNames='h-32 w-full rounded-sm' />
|
|
44
|
+
<div className='flex flex-col gap-2'>
|
|
45
|
+
<Skeleton classNames='h-3 w-full' />
|
|
46
|
+
<Skeleton classNames='h-3 w-5/6' />
|
|
47
|
+
<Skeleton classNames='h-3 w-4/6' />
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
),
|
|
51
|
+
};
|