diff --git a/src/components/ScrollArea/ScrollArea.tsx b/src/components/ScrollArea/ScrollArea.tsx index 5e67d7c..5febea1 100644 --- a/src/components/ScrollArea/ScrollArea.tsx +++ b/src/components/ScrollArea/ScrollArea.tsx @@ -1,4 +1,4 @@ -import React, {forwardRef, ForwardRefRenderFunction, memo} from "react"; +import React, {forwardRef, ForwardRefRenderFunction, memo, useImperativeHandle} from "react"; import classnames from "classnames"; import { Corner, @@ -30,16 +30,35 @@ const ScrollArea: ForwardRefRenderFunction = (p children, className, horizontalScroll, + onScroll, thumbClassName, cornerClassName, viewportClassName, scrollbarClassName, ...other } = {...useComponentProps("scrollArea"), ...props}; + const rootRef = React.useRef(null); + const viewportRef = React.useRef(null); + useImperativeHandle( + ref, + () => ({ + ...rootRef.current!, + scrollTo: ((optionsOrX?: ScrollToOptions | number, y?: number) => { + if (typeof optionsOrX === 'number') { + viewportRef.current?.scrollTo(optionsOrX, y!); + } else { + viewportRef.current?.scrollTo(optionsOrX); + } + }) as HTMLElement['scrollTo'], + + }), + [] + ); return ( - + = (p }, viewportClassName )} + onScroll={onScroll} > {children} @@ -56,7 +76,7 @@ const ScrollArea: ForwardRefRenderFunction = (p style={{padding: `0 ${xOffset}px`}} className={classnames(styles["scroll-area__scrollbar"], scrollbarClassName)} > - + = (p style={{padding: `${yOffset}px 0`}} className={classnames(styles["scroll-area__scrollbar"], scrollbarClassName)} > - + - + ); }; diff --git a/src/components/ScrollArea/scroll-area.module.scss b/src/components/ScrollArea/scroll-area.module.scss index f86e14e..5987def 100644 --- a/src/components/ScrollArea/scroll-area.module.scss +++ b/src/components/ScrollArea/scroll-area.module.scss @@ -19,7 +19,7 @@ $root: scroll-area; touch-action: none; padding: var(--scroll-area-scrollbar-padding, 3px); background: var(--scroll-area-scrollbar-bg-color, transparent); - transition: background var(--transition-speed-sm) ease-in-out; + transition: background var(--transition-speed-sm); &:hover { background: var(--scroll-area-scrollbar-bg-color-hover, transparent); @@ -42,6 +42,7 @@ $root: scroll-area; position: relative; background: var(--scroll-area-thumb-bg-color); border-radius: var(--scroll-area-thumb-border-radius, 100px); + transition: background var(--transition-speed-sm); &:hover { background: var(--scroll-area-thumb-bg-color-hover, var(--scroll-area-thumb-bg-color)); diff --git a/src/components/Tooltip/Tooltip.tsx b/src/components/Tooltip/Tooltip.tsx index 28efbb4..9436b89 100644 --- a/src/components/Tooltip/Tooltip.tsx +++ b/src/components/Tooltip/Tooltip.tsx @@ -29,7 +29,7 @@ const Tooltip: ForwardRefRenderFunction = (props, open, defaultOpen, disableHoverableContent, - delayDuration, + delayDuration = 250, onOpenChange, arrowWidth, diff --git a/src/components/Viewport/Provider.tsx b/src/components/Viewport/Provider.tsx index d0e9279..6c9356a 100644 --- a/src/components/Viewport/Provider.tsx +++ b/src/components/Viewport/Provider.tsx @@ -17,12 +17,21 @@ import styles from "./viewport.module.scss"; export type ViewportProps = ComponentProps<"div"> & { mode?: ViewportMode; + transition?: boolean; }; const Provider: ForwardRefRenderFunction> = ( - {children, className, style, mode: viewportMode = ViewportMode.Adaptive, ...props}, + { + children, + className, + style, + mode: viewportMode = ViewportMode.Adaptive, + transition: viewportTransition = true, + ...props + }, ref ) => { + const [transition, withTransition] = useState(viewportTransition); const [mode, setModeState] = useState(viewportMode); const [sizes, setSizesState] = useState(null); @@ -40,6 +49,7 @@ const Provider: ForwardRefRenderFunction({ setSizes() {}, + withTransition() {}, + resetSizes() {}, }); diff --git a/src/components/Viewport/viewport.module.scss b/src/components/Viewport/viewport.module.scss index 8a5f3c5..92292de 100644 --- a/src/components/Viewport/viewport.module.scss +++ b/src/components/Viewport/viewport.module.scss @@ -6,13 +6,15 @@ max-width: var(--viewport-max-width); min-height: var(--viewport-min-height); max-height: var(--viewport-max-height); - transition: - height var(--transition-speed-md) ease-in-out, - width var(--transition-speed-md) ease-in-out, - min-height var(--transition-speed-md) ease-in-out, - min-width var(--transition-speed-md) ease-in-out, - max-height var(--transition-speed-md) ease-in-out, - max-width var(--transition-speed-md) ease-in-out; + + &--transition { + transition: height var(--transition-viewport, var(--transition-speed-md)) ease-in-out, + width var(--transition-viewport, var(--transition-speed-md)) ease-in-out, + min-height var(--transition-viewport, var(--transition-speed-md)) ease-in-out, + min-width var(--transition-viewport, var(--transition-speed-md)) ease-in-out, + max-height var(--transition-viewport, var(--transition-speed-md)) ease-in-out, + max-width var(--transition-viewport, var(--transition-speed-md)) ease-in-out; + } &--expanded { min-height: var(--viewport-max-height); diff --git a/src/components/types.ts b/src/components/types.ts index c60891a..d4f1bbb 100644 --- a/src/components/types.ts +++ b/src/components/types.ts @@ -58,7 +58,7 @@ export interface ComponentsProps { | "radius" | "color" >; - tooltip?: TooltipProps; + tooltip?: Omit; view?: ViewProps; viewDrawer?: ViewDrawerProps; viewModal?: ViewModalProps; diff --git a/src/providers/ui/styles/reset.scss b/src/providers/ui/styles/reset.scss index e391c35..c73233d 100644 --- a/src/providers/ui/styles/reset.scss +++ b/src/providers/ui/styles/reset.scss @@ -123,5 +123,7 @@ body { will-change: background-color, color; transition: background-color var(--transition-speed-md), + border-color var(--transition-speed-md), + background var(--transition-speed-md), color var(--transition-speed-md); } diff --git a/src/styles/mixins.scss b/src/styles/mixins.scss index 86abc3e..2166212 100644 --- a/src/styles/mixins.scss +++ b/src/styles/mixins.scss @@ -22,6 +22,12 @@ } } +@mixin view($view) { + html[view="#{$view}"] & { + @content; + } +} + @mixin browser($browser) { html[browser="#{$browser}"] & { @content;