diff --git a/code/ui/components/package.json b/code/ui/components/package.json index 0e9cc0dc42a4..ea379c9ae697 100644 --- a/code/ui/components/package.json +++ b/code/ui/components/package.json @@ -73,12 +73,11 @@ "devDependencies": { "@chromaui/addon-visual-tests": "^0.0.77", "@popperjs/core": "^2.6.0", + "@radix-ui/react-scroll-area": "^1.0.5", "@storybook/icons": "^1.1.6", "@types/react-syntax-highlighter": "11.0.5", "@types/util-deprecate": "^1.0.0", "css": "^3.0.0", - "overlayscrollbars": "2.2.1", - "overlayscrollbars-react": "^0.5.0", "polished": "^4.2.2", "prettier": "^2.8.0", "react-popper-tooltip": "^4.4.2", diff --git a/code/ui/components/src/components/ScrollArea/GlobalScrollAreaStyles.tsx b/code/ui/components/src/components/ScrollArea/GlobalScrollAreaStyles.tsx deleted file mode 100644 index a7650a8f922f..000000000000 --- a/code/ui/components/src/components/ScrollArea/GlobalScrollAreaStyles.tsx +++ /dev/null @@ -1,497 +0,0 @@ -import React from 'react'; -import { Global } from '@storybook/theming'; -import type { Theme, CSSObject } from '@storybook/theming'; - -export const getScrollAreaStyles: (theme: Theme) => CSSObject = (theme: Theme) => - ({ - '.os-size-observer,\n.os-size-observer-listener': { - direction: 'inherit', - pointerEvents: 'none', - overflow: 'hidden', - visibility: 'hidden', - boxSizing: 'border-box', - }, - '.os-size-observer,\n.os-size-observer-listener,\n.os-size-observer-listener-item,\n.os-size-observer-listener-item-final': - { - writingMode: 'horizontal-tb', - position: 'absolute', - left: '0', - top: '0', - }, - '.os-size-observer': { - zIndex: -1, - contain: 'strict', - display: 'flex', - flexDirection: 'row', - flexWrap: 'nowrap', - padding: 'inherit', - border: 'inherit', - boxSizing: 'inherit', - margin: '-133px', - top: '0', - right: '0', - bottom: '0', - left: '0', - transform: 'scale(0.1)', - }, - '.os-size-observer::before': { - content: '""', - flex: 'none', - boxSizing: 'inherit', - padding: '10px', - width: '10px', - height: '10px', - }, - '.os-size-observer-appear': { - animation: 'os-size-observer-appear-animation 1ms forwards', - }, - '.os-size-observer-listener': { - boxSizing: 'border-box', - position: 'relative', - flex: 'auto', - padding: 'inherit', - border: 'inherit', - margin: '-133px', - transform: 'scale(10)', - }, - '.os-size-observer-listener.ltr': { marginRight: '-266px', marginLeft: '0' }, - '.os-size-observer-listener.rtl': { marginLeft: '-266px', marginRight: '0' }, - '.os-size-observer-listener:empty::before': { - content: '""', - width: '100%', - height: '100%', - }, - '.os-size-observer-listener:empty::before, .os-size-observer-listener > .os-size-observer-listener-item': - { - display: 'block', - position: 'relative', - padding: 'inherit', - border: 'inherit', - boxSizing: 'content-box', - flex: 'auto', - }, - '.os-size-observer-listener-scroll': { - boxSizing: 'border-box', - display: 'flex', - }, - '.os-size-observer-listener-item': { - right: '0', - bottom: '0', - overflow: 'hidden', - direction: 'ltr', - flex: 'none', - }, - '.os-size-observer-listener-item-final': { transition: 'none' }, - '@keyframes os-size-observer-appear-animation': { - from: { cursor: 'auto' }, - to: { cursor: 'none' }, - }, - '.os-trinsic-observer': { - flex: 'none', - boxSizing: 'border-box', - position: 'relative', - maxWidth: '0px', - maxHeight: '1px', - padding: '0', - margin: '0', - border: 'none', - overflow: 'hidden', - zIndex: -1, - height: '0', - top: 'calc(100% + 1px)', - contain: 'strict', - }, - '.os-trinsic-observer:not(:empty)': { - height: 'calc(100% + 1px)', - top: '-1px', - }, - '.os-trinsic-observer:not(:empty) > .os-size-observer': { - width: '1000%', - height: '1000%', - minHeight: '1px', - minWidth: '1px', - }, - '.os-environment': { - '--os-custom-prop': '-1', - position: 'fixed', - opacity: 0, - visibility: 'hidden', - overflow: 'scroll', - height: '200px', - width: '200px', - zIndex: 'var(--os-custom-prop)', - }, - '.os-environment div': { width: '200%', height: '200%', margin: '10px 0' }, - '.os-environment.os-environment-flexbox-glue': { - display: 'flex', - flexDirection: 'row', - flexWrap: 'nowrap', - height: 'auto', - width: 'auto', - minHeight: '200px', - minWidth: '200px', - }, - '.os-environment.os-environment-flexbox-glue div': { - flex: 'auto', - width: 'auto', - height: 'auto', - maxHeight: '100%', - maxWidth: '100%', - margin: '0', - }, - '.os-environment.os-environment-flexbox-glue-max': { maxHeight: '200px' }, - '.os-environment.os-environment-flexbox-glue-max div': { - overflow: 'visible', - }, - '.os-environment.os-environment-flexbox-glue-max div::before': { - content: '""', - display: 'block', - height: '999px', - width: '999px', - }, - '.os-environment,\n[data-overlayscrollbars-viewport]': { - msOverflowStyle: 'scrollbar !important', - }, - '[data-overlayscrollbars-initialize],\n[data-overlayscrollbars~=scrollbarHidden],\n[data-overlayscrollbars-viewport~=scrollbarHidden],\n.os-scrollbar-hidden.os-environment': - { - scrollbarWidth: 'none !important', - }, - '[data-overlayscrollbars-initialize]::-webkit-scrollbar,\n[data-overlayscrollbars-initialize]::-webkit-scrollbar-corner,\n[data-overlayscrollbars~=scrollbarHidden]::-webkit-scrollbar,\n[data-overlayscrollbars~=scrollbarHidden]::-webkit-scrollbar-corner,\n[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar,\n[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar-corner,\n.os-scrollbar-hidden.os-environment::-webkit-scrollbar,\n.os-scrollbar-hidden.os-environment::-webkit-scrollbar-corner': - { - WebkitAppearance: 'none !important', - appearance: 'none !important', - display: 'none !important', - width: '0 !important', - height: '0 !important', - }, - '[data-overlayscrollbars-initialize]': { overflow: 'auto' }, - 'html[data-overlayscrollbars],\nhtml.os-scrollbar-hidden,\nhtml.os-scrollbar-hidden > body': { - boxSizing: 'border-box', - margin: '0', - width: '100%', - height: '100%', - }, - 'html[data-overlayscrollbars] > body': { overflow: 'visible' }, - '[data-overlayscrollbars~=host]': { position: 'relative' }, - '[data-overlayscrollbars~=host],\n[data-overlayscrollbars-padding]': { - display: 'flex', - flexDirection: 'row !important', - flexWrap: 'nowrap !important', - }, - '[data-overlayscrollbars-padding],\n[data-overlayscrollbars-viewport]': { - boxSizing: 'inherit', - position: 'relative', - flex: 'auto !important', - height: 'auto', - width: '100%', - padding: '0', - margin: '0', - border: 'none', - zIndex: 0, - overflow: 'hidden', - }, - '[data-overlayscrollbars-viewport]': { '--os-vaw': '0', '--os-vah': '0' }, - '[data-overlayscrollbars-viewport][data-overlayscrollbars-viewport~=arrange]::before': { - content: '""', - position: 'absolute', - pointerEvents: 'none', - zIndex: -1, - minWidth: '1px', - minHeight: '1px', - width: 'var(--os-vaw)', - height: 'var(--os-vah)', - }, - '[data-overlayscrollbars~=host],\n[data-overlayscrollbars~=viewport]': { - overflow: 'hidden', - }, - '[data-overlayscrollbars~=overflowVisible],\n[data-overlayscrollbars-padding~=overflowVisible],\n[data-overlayscrollbars-viewport~=overflowVisible]': - { - overflow: 'visible', - }, - '[data-overlayscrollbars-overflow-x=hidden]': { - overflowX: 'hidden', - overflowY: 'hidden', - }, - '[data-overlayscrollbars-overflow-x=scroll]': { overflowX: 'scroll' }, - '[data-overlayscrollbars-overflow-y=scroll]': { overflowY: 'scroll' }, - '[data-overlayscrollbars~=scrollbarPressed],\n[data-overlayscrollbars~=scrollbarPressed] [data-overlayscrollbars-viewport]': - { - scrollBehavior: 'auto !important', - }, - '[data-overlayscrollbars-content]': { boxSizing: 'inherit' }, - '[data-overlayscrollbars-grid],\n[data-overlayscrollbars-grid] [data-overlayscrollbars-padding]': - { - display: 'grid', - gridTemplate: '1fr/1fr', - }, - '[data-overlayscrollbars-grid] > [data-overlayscrollbars-padding],\n[data-overlayscrollbars-grid] > [data-overlayscrollbars-viewport],\n[data-overlayscrollbars-grid] > [data-overlayscrollbars-padding] > [data-overlayscrollbars-viewport]': - { - height: 'auto !important', - width: 'auto !important', - }, - '.os-scrollbar': { - contain: ['size layout', 'size layout style'], - transition: - 'opacity 0.15s, visibility 0.15s, top 0.15s, right 0.15s, bottom 0.15s, left 0.15s', - pointerEvents: 'none', - position: 'absolute', - opacity: 0, - visibility: 'hidden', - '--os-size': '0', - '--os-padding-perpendicular': '0', - '--os-padding-axis': '0', - '--os-track-border-radius': '0', - '--os-track-bg': 'none', - '--os-track-bg-hover': 'none', - '--os-track-bg-active': 'none', - '--os-track-border': 'none', - '--os-track-border-hover': 'none', - '--os-track-border-active': 'none', - '--os-handle-border-radius': '0', - '--os-handle-bg': 'none', - '--os-handle-bg-hover': 'none', - '--os-handle-bg-active': 'none', - '--os-handle-border': 'none', - '--os-handle-border-hover': 'none', - '--os-handle-border-active': 'none', - '--os-handle-min-size': '33px', - '--os-handle-max-size': 'none', - '--os-handle-perpendicular-size': '100%', - '--os-handle-perpendicular-size-hover': '100%', - '--os-handle-perpendicular-size-active': '100%', - '--os-handle-interactive-area-offset': '0', - }, - 'body > .os-scrollbar': { position: 'fixed', zIndex: 99999 }, - '.os-scrollbar-transitionless': { transition: 'none' }, - '.os-scrollbar-track': { - position: 'relative', - direction: 'ltr !important', - padding: '0 !important', - border: 'none !important', - }, - '.os-scrollbar-handle': { position: 'absolute' }, - '.os-scrollbar-track,\n.os-scrollbar-handle': { - pointerEvents: 'none', - width: '100%', - height: '100%', - }, - '.os-scrollbar.os-scrollbar-track-interactive .os-scrollbar-track,\n.os-scrollbar.os-scrollbar-handle-interactive .os-scrollbar-handle': - { - pointerEvents: 'auto', - touchAction: 'none', - }, - '.os-scrollbar-horizontal': { - bottom: '0', - left: '0', - padding: 'var(--os-padding-perpendicular) var(--os-padding-axis)', - right: 'var(--os-size)', - height: 'var(--os-size)', - }, - '.os-scrollbar-vertical': { - top: '0', - right: '0', - padding: 'var(--os-padding-axis) var(--os-padding-perpendicular)', - bottom: 'var(--os-size)', - width: 'var(--os-size)', - }, - '.os-scrollbar-rtl.os-scrollbar-horizontal': { right: '0' }, - '.os-scrollbar-rtl.os-scrollbar-vertical': { right: 'auto', left: '0' }, - '.os-scrollbar-visible,\n.os-scrollbar-interaction.os-scrollbar-visible': { - opacity: 1, - visibility: 'visible', - }, - '.os-scrollbar-auto-hidden': { opacity: 0, visibility: 'hidden' }, - '.os-scrollbar-unusable,\n.os-scrollbar-unusable *,\n.os-scrollbar-wheel,\n.os-scrollbar-wheel *': - { - pointerEvents: 'none !important', - }, - '.os-scrollbar-unusable .os-scrollbar-handle': { opacity: '0 !important' }, - '.os-scrollbar-horizontal .os-scrollbar-handle': { - bottom: '0', - minWidth: 'var(--os-handle-min-size)', - maxWidth: 'var(--os-handle-max-size)', - height: 'var(--os-handle-perpendicular-size)', - transition: 'opacity 0.15s, background-color 0.15s, border-color 0.15s, height 0.15s', - }, - '.os-scrollbar-vertical .os-scrollbar-handle': { - right: '0', - minHeight: 'var(--os-handle-min-size)', - maxHeight: 'var(--os-handle-max-size)', - width: 'var(--os-handle-perpendicular-size)', - transition: 'opacity 0.15s, background-color 0.15s, border-color 0.15s, width 0.15s', - }, - '.os-scrollbar-rtl.os-scrollbar-vertical .os-scrollbar-handle': { - right: 'auto', - left: '0', - }, - '.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless,\n.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless.os-scrollbar-rtl': - { - left: '0', - right: '0', - }, - '.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless,\n.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless.os-scrollbar-rtl': - { - top: '0', - bottom: '0', - }, - '.os-scrollbar .os-scrollbar-track': { - border: 'var(--os-track-border)', - borderRadius: 'var(--os-track-border-radius)', - background: 'var(--os-track-bg)', - transition: 'opacity 0.15s, background-color 0.15s, border-color 0.15s', - }, - '.os-scrollbar .os-scrollbar-track:hover': { - border: 'var(--os-track-border-hover)', - background: 'var(--os-track-bg-hover)', - }, - '.os-scrollbar .os-scrollbar-track:active': { - border: 'var(--os-track-border-active)', - background: 'var(--os-track-bg-active)', - }, - '.os-scrollbar .os-scrollbar-handle': { - border: 'var(--os-handle-border)', - borderRadius: 'var(--os-handle-border-radius)', - background: theme.textMutedColor, - opacity: 0.5, - }, - '.os-scrollbar .os-scrollbar-handle:before': { - content: '""', - position: 'absolute', - left: '0', - right: '0', - top: '0', - bottom: '0', - display: 'block', - }, - '.os-scrollbar .os-scrollbar-handle:hover': { - border: 'var(--os-handle-border-hover)', - opacity: 0.6, - }, - '.os-scrollbar .os-scrollbar-handle:active': { - border: 'var(--os-handle-border-active)', - background: 'var(--os-handle-bg-active)', - }, - '.os-scrollbar-horizontal.os-scrollbar-rtl': { - left: 'var(--os-size)', - right: '0', - }, - '.os-scrollbar-horizontal .os-scrollbar-handle:before': { - top: 'calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1)', - bottom: 'calc(var(--os-padding-perpendicular) * -1)', - }, - '.os-scrollbar-horizontal:hover .os-scrollbar-handle': { - height: 'var(--os-handle-perpendicular-size-hover)', - }, - '.os-scrollbar-horizontal:active .os-scrollbar-handle': { - height: 'var(--os-handle-perpendicular-size-active)', - }, - '.os-scrollbar-vertical .os-scrollbar-handle:before': { - left: 'calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1)', - right: 'calc(var(--os-padding-perpendicular) * -1)', - }, - '.os-scrollbar-vertical.os-scrollbar-rtl .os-scrollbar-handle:before': { - right: - 'calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1)', - left: 'calc(var(--os-padding-perpendicular) * -1)', - }, - '.os-scrollbar-vertical:hover .os-scrollbar-handle': { - width: 'var(--os-handle-perpendicular-size-hover)', - }, - '.os-scrollbar-vertical:active .os-scrollbar-handle': { - width: 'var(--os-handle-perpendicular-size-active)', - }, - '[data-overlayscrollbars~=updating] > .os-scrollbar,\n.os-theme-none.os-scrollbar': { - display: 'none !important', - }, - '.os-theme-dark,\n.os-theme-light': { - boxSizing: 'border-box', - '--os-size': '10px', - '--os-padding-perpendicular': '2px', - '--os-padding-axis': '2px', - '--os-track-border-radius': '10px', - '--os-handle-interactive-area-offset': '4px', - '--os-handle-border-radius': '10px', - }, - '.os-theme-dark': { - '--os-handle-bg': 'rgba(0, 0, 0, 0.44)', - '--os-handle-bg-hover': 'rgba(0, 0, 0, 0.55)', - '--os-handle-bg-active': 'rgba(0, 0, 0, 0.66)', - }, - '.os-theme-light': { - '--os-handle-bg': 'rgba(255, 255, 255, 0.44)', - '--os-handle-bg-hover': 'rgba(255, 255, 255, 0.55)', - '--os-handle-bg-active': 'rgba(255, 255, 255, 0.66)', - }, - '.os-no-css-vars.os-theme-dark.os-scrollbar .os-scrollbar-handle, .os-no-css-vars.os-theme-light.os-scrollbar .os-scrollbar-handle': - { - borderRadius: '10px', - }, - '.os-no-css-vars.os-theme-dark.os-scrollbar .os-scrollbar-track, .os-no-css-vars.os-theme-light.os-scrollbar .os-scrollbar-track': - { - borderRadius: '10px', - }, - '.os-no-css-vars.os-theme-dark.os-scrollbar-horizontal, .os-no-css-vars.os-theme-light.os-scrollbar-horizontal': - { - padding: '2px 2px', - right: '10px', - height: '10px', - }, - '.os-no-css-vars.os-theme-dark.os-scrollbar-horizontal.os-scrollbar-rtl, .os-no-css-vars.os-theme-light.os-scrollbar-horizontal.os-scrollbar-rtl': - { - left: '10px', - right: '0', - }, - '.os-no-css-vars.os-theme-dark.os-scrollbar-horizontal .os-scrollbar-handle, .os-no-css-vars.os-theme-light.os-scrollbar-horizontal .os-scrollbar-handle': - { - minWidth: '33px', - maxWidth: 'none', - }, - '.os-no-css-vars.os-theme-dark.os-scrollbar-horizontal .os-scrollbar-handle:before, .os-no-css-vars.os-theme-light.os-scrollbar-horizontal .os-scrollbar-handle:before': - { - top: 'calc((\n 2px + 4px\n ) * -1)', - bottom: 'calc(2px * -1)', - }, - '.os-no-css-vars.os-theme-dark.os-scrollbar-vertical, .os-no-css-vars.os-theme-light.os-scrollbar-vertical': - { - padding: '2px 2px', - bottom: '10px', - width: '10px', - }, - '.os-no-css-vars.os-theme-dark.os-scrollbar-vertical .os-scrollbar-handle, .os-no-css-vars.os-theme-light.os-scrollbar-vertical .os-scrollbar-handle': - { - minHeight: '33px', - maxHeight: 'none', - }, - '.os-no-css-vars.os-theme-dark.os-scrollbar-vertical .os-scrollbar-handle:before, .os-no-css-vars.os-theme-light.os-scrollbar-vertical .os-scrollbar-handle:before': - { - left: 'calc((\n 2px + 4px\n ) * -1)', - right: 'calc(2px * -1)', - }, - '.os-no-css-vars.os-theme-dark.os-scrollbar-vertical.os-scrollbar-rtl .os-scrollbar-handle:before, .os-no-css-vars.os-theme-light.os-scrollbar-vertical.os-scrollbar-rtl .os-scrollbar-handle:before': - { - right: 'calc((\n 2px + 4px\n ) * -1)', - left: 'calc(2px * -1)', - }, - '.os-no-css-vars.os-theme-dark .os-scrollbar-handle': { - background: 'rgba(0, 0, 0, 0.44)', - }, - '.os-no-css-vars.os-theme-dark:hover .os-scrollbar-handle': { - background: 'rgba(0, 0, 0, 0.55)', - }, - '.os-no-css-vars.os-theme-dark:active .os-scrollbar-handle': { - background: 'rgba(0, 0, 0, 0.66)', - }, - '.os-no-css-vars.os-theme-light .os-scrollbar-handle': { - background: 'rgba(255, 255, 255, 0.44)', - }, - '.os-no-css-vars.os-theme-light:hover .os-scrollbar-handle': { - background: 'rgba(255, 255, 255, 0.55)', - }, - '.os-no-css-vars.os-theme-light:active .os-scrollbar-handle': { - background: 'rgba(255, 255, 255, 0.66)', - }, - } as any as CSSObject); - -const GlobalScrollAreaStyles = () => ; - -export default GlobalScrollAreaStyles; diff --git a/code/ui/components/src/components/ScrollArea/OverlayScrollbars.tsx b/code/ui/components/src/components/ScrollArea/OverlayScrollbars.tsx deleted file mode 100644 index c5043032448c..000000000000 --- a/code/ui/components/src/components/ScrollArea/OverlayScrollbars.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { OverlayScrollbarsComponent } from 'overlayscrollbars-react'; - -export const OverlayScrollbars = OverlayScrollbarsComponent; - -export default OverlayScrollbarsComponent; diff --git a/code/ui/components/src/components/ScrollArea/ScrollArea.stories.tsx b/code/ui/components/src/components/ScrollArea/ScrollArea.stories.tsx index e4a7a09e7dc2..59eabd84925d 100644 --- a/code/ui/components/src/components/ScrollArea/ScrollArea.stories.tsx +++ b/code/ui/components/src/components/ScrollArea/ScrollArea.stories.tsx @@ -84,3 +84,29 @@ export const WithOuterBorder = () => ( /> ); + +export const CustomOffset = () => ( + + {list((i) => ( + + {list((ii) => ( + {ii * i} + ))} +
+
+ ))} +
+); + +export const CustomSize = () => ( + + {list((i) => ( + + {list((ii) => ( + {ii * i} + ))} +
+
+ ))} +
+); diff --git a/code/ui/components/src/components/ScrollArea/ScrollArea.tsx b/code/ui/components/src/components/ScrollArea/ScrollArea.tsx index 51a0f5786679..3bb523dddcda 100644 --- a/code/ui/components/src/components/ScrollArea/ScrollArea.tsx +++ b/code/ui/components/src/components/ScrollArea/ScrollArea.tsx @@ -1,34 +1,112 @@ import type { FC } from 'react'; -import React, { lazy, Suspense } from 'react'; +import React from 'react'; import { styled } from '@storybook/theming'; - -const GlobalScrollAreaStyles = lazy(() => import('./GlobalScrollAreaStyles')); -const OverlayScrollbars = lazy(() => import('./OverlayScrollbars')); - -const Scroller: FC = ({ horizontal, vertical, ...props }) => ( - }> - - - -); +import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'; export interface ScrollAreaProps { children?: React.ReactNode; horizontal?: boolean; vertical?: boolean; className?: string; + offset?: number; + scrollbarSize?: number; } -export const ScrollArea: FC = styled(Scroller)( - ({ vertical }) => (!vertical ? { overflowY: 'hidden' } : { overflowY: 'auto', height: '100%' }), - ({ horizontal }) => (!horizontal ? { overflowX: 'hidden' } : { overflowX: 'auto', width: '100%' }) +const ScrollAreaRoot = styled(ScrollAreaPrimitive.Root)<{ scrollbarsize: number; offset: number }>( + ({ scrollbarsize, offset }) => ({ + width: '100%', + height: '100%', + overflow: 'hidden', + '--scrollbar-size': `${scrollbarsize + offset}px`, + '--radix-scroll-area-thumb-width': `${scrollbarsize}px`, + }) ); -ScrollArea.defaultProps = { - horizontal: false, - vertical: false, -}; +const ScrollAreaViewport = styled(ScrollAreaPrimitive.Viewport)({ + width: '100%', + height: '100%', +}); + +const ScrollAreaScrollbar = styled(ScrollAreaPrimitive.Scrollbar)<{ + offset: number; + horizontal: string; + vertical: string; +}>(({ offset, horizontal, vertical }) => ({ + display: 'flex', + userSelect: 'none', // ensures no selection + touchAction: 'none', // disable browser handling of all panning and zooming gestures on touch devices + background: 'transparent', + transition: 'all 0.2s ease-out', + borderRadius: 'var(--scrollbar-size)', + + '&[data-orientation="vertical"]': { + width: 'var(--scrollbar-size)', + paddingRight: offset, + marginTop: offset, + marginBottom: horizontal === 'true' && vertical === 'true' ? 0 : offset, + }, + '&[data-orientation="horizontal"]': { + flexDirection: 'column', + height: 'var(--scrollbar-size)', + paddingBottom: offset, + marginLeft: offset, + marginRight: horizontal === 'true' && vertical === 'true' ? 0 : offset, + }, +})); + +const ScrollAreaThumb = styled(ScrollAreaPrimitive.Thumb)(({ theme }) => ({ + flex: 1, + background: theme.textMutedColor, + opacity: 0.5, + borderRadius: `var(--scrollbar-size)`, + position: 'relative', + transition: 'opacity 0.2s ease-out', + + '&:hover': { opacity: 0.8 }, + + /* increase target size for touch devices https://www.w3.org/WAI/WCAG21/Understanding/target-size.html */ + '::before': { + content: '""', + position: 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%,-50%)', + width: '100%', + height: '100%', + minWidth: 44, + minHeight: 44, + }, +})); + +export const ScrollArea: FC = ({ + children, + horizontal = false, + vertical = false, + offset = 2, + scrollbarSize = 6, +}) => ( + + {children} + {horizontal && ( + + + + )} + {vertical && ( + + + + )} + {horizontal && vertical && } + +); diff --git a/code/ui/manager/src/components/sidebar/Search.tsx b/code/ui/manager/src/components/sidebar/Search.tsx index d9d03217db38..c8c71ae659cd 100644 --- a/code/ui/manager/src/components/sidebar/Search.tsx +++ b/code/ui/manager/src/components/sidebar/Search.tsx @@ -85,6 +85,8 @@ const Input = styled.input(({ theme }) => ({ fontFamily: 'inherit', transition: 'all 150ms', color: theme.color.defaultText, + width: '100%', + '&:focus, &:active': { outline: 0, borderColor: theme.color.secondary, diff --git a/code/ui/manager/src/components/sidebar/Sidebar.tsx b/code/ui/manager/src/components/sidebar/Sidebar.tsx index 23aacc19f099..072603211c21 100644 --- a/code/ui/manager/src/components/sidebar/Sidebar.tsx +++ b/code/ui/manager/src/components/sidebar/Sidebar.tsx @@ -53,15 +53,6 @@ const Bottom = styled.div(({ theme }) => ({ }, })); -const CustomScrollArea = styled(ScrollArea)({ - '&&&&& .os-scrollbar-handle:before': { - left: -12, - }, - '&&&&& .os-scrollbar-vertical': { - right: 5, - }, -}); - const Swap = React.memo(function Swap({ children, condition, @@ -130,7 +121,7 @@ export const Sidebar = React.memo(function Sidebar({ return ( - + - + {isLoading ? null : ( {bottom.map(({ id, render: Render }) => ( diff --git a/code/yarn.lock b/code/yarn.lock index 3ec46c6397a8..3c200a7a8a38 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -5234,6 +5234,27 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-presence@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-presence@npm:1.0.1" + dependencies: + "@babel/runtime": ^7.13.10 + "@radix-ui/react-compose-refs": 1.0.1 + "@radix-ui/react-use-layout-effect": 1.0.1 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 90780618b265fe794a8f1ddaa5bfd3c71a1127fa79330a14d32722e6265b44452a9dd36efe4e769129d33e57f979f6b8713e2cbf2e2755326aa3b0f337185b6e + languageName: node + linkType: hard + "@radix-ui/react-primitive@npm:1.0.3": version: 1.0.3 resolution: "@radix-ui/react-primitive@npm:1.0.3" @@ -5282,6 +5303,34 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-scroll-area@npm:^1.0.5": + version: 1.0.5 + resolution: "@radix-ui/react-scroll-area@npm:1.0.5" + dependencies: + "@babel/runtime": ^7.13.10 + "@radix-ui/number": 1.0.1 + "@radix-ui/primitive": 1.0.1 + "@radix-ui/react-compose-refs": 1.0.1 + "@radix-ui/react-context": 1.0.1 + "@radix-ui/react-direction": 1.0.1 + "@radix-ui/react-presence": 1.0.1 + "@radix-ui/react-primitive": 1.0.3 + "@radix-ui/react-use-callback-ref": 1.0.1 + "@radix-ui/react-use-layout-effect": 1.0.1 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: a08818aeeb15920a02e708699a8bdc85c26eab0579ab741129b464a799b5d9a04f81810a2d200f1cf4aef03452067770e87b0f81593a689350fcd7e51819e4cb + languageName: node + linkType: hard + "@radix-ui/react-select@npm:^1.2.2": version: 1.2.2 resolution: "@radix-ui/react-select@npm:1.2.2" @@ -6744,6 +6793,7 @@ __metadata: dependencies: "@chromaui/addon-visual-tests": ^0.0.77 "@popperjs/core": ^2.6.0 + "@radix-ui/react-scroll-area": ^1.0.5 "@radix-ui/react-select": ^1.2.2 "@radix-ui/react-toolbar": ^1.0.4 "@storybook/client-logger": "workspace:*" @@ -6756,8 +6806,6 @@ __metadata: "@types/util-deprecate": ^1.0.0 css: ^3.0.0 memoizerific: ^1.11.3 - overlayscrollbars: 2.2.1 - overlayscrollbars-react: ^0.5.0 polished: ^4.2.2 prettier: ^2.8.0 react-popper-tooltip: ^4.4.2 @@ -24976,23 +25024,6 @@ __metadata: languageName: node linkType: hard -"overlayscrollbars-react@npm:^0.5.0": - version: 0.5.2 - resolution: "overlayscrollbars-react@npm:0.5.2" - peerDependencies: - overlayscrollbars: ^2.0.0 - react: ">=16.8.0" - checksum: 56e8df609f589cd38c97408d743ebd9112047c60da340c8f121b10418beabd1b5411396f4c1fd27b46dd0e663e7675ae72df1c531feb1e3f6bf1342dbafa21ef - languageName: node - linkType: hard - -"overlayscrollbars@npm:2.2.1": - version: 2.2.1 - resolution: "overlayscrollbars@npm:2.2.1" - checksum: 718dd563ee17a8c92a54f0b67989806edadd5b999e36d2ab322e7813b369d1cf0198d7267ca42ca9e879023f0658825e2b050d2845e751d876285d1d3549cb5e - languageName: node - linkType: hard - "override-require@npm:^1.1.1": version: 1.1.1 resolution: "override-require@npm:1.1.1"