diff --git a/.changeset/silver-peaches-float.md b/.changeset/silver-peaches-float.md new file mode 100644 index 000000000..89d525bf0 --- /dev/null +++ b/.changeset/silver-peaches-float.md @@ -0,0 +1,5 @@ +--- +'@cube-dev/ui-kit': patch +--- + +Stabilize ResizablePanel & remove requirement for the flex layout. diff --git a/src/components/layout/Panel.tsx b/src/components/layout/Panel.tsx index 28f949f17..d6f90ec2b 100644 --- a/src/components/layout/Panel.tsx +++ b/src/components/layout/Panel.tsx @@ -1,10 +1,4 @@ -import { - createContext, - ForwardedRef, - forwardRef, - ReactNode, - useMemo, -} from 'react'; +import { ForwardedRef, forwardRef, ReactNode, useMemo } from 'react'; import { BASE_STYLES, @@ -21,14 +15,6 @@ import { tasty, } from '../../tasty'; -export interface PanelContextData { - layout: 'grid' | 'flex'; -} - -export const PanelContext = createContext({ - layout: 'grid', -}); - const PanelElement = tasty({ as: 'section', qa: 'Panel', @@ -164,25 +150,19 @@ function Panel(props: CubePanelProps, ref: ForwardedRef) { ); return ( - - - - {children} - - {extra} - - + + {children} + + {extra} + ); } diff --git a/src/components/layout/ResizablePanel.stories.tsx b/src/components/layout/ResizablePanel.stories.tsx index c1727d069..2f7d30b37 100644 --- a/src/components/layout/ResizablePanel.stories.tsx +++ b/src/components/layout/ResizablePanel.stories.tsx @@ -57,6 +57,13 @@ const TemplateControllable: StoryFn = (args) => { ); }; +const GridTemplate: StoryFn = (args) => ( + + + + +); + export const ResizeRight = TemplateRight.bind({}); ResizeRight.args = { direction: 'right', @@ -86,3 +93,9 @@ export const Disabled = TemplateRight.bind({}); Disabled.args = { isDisabled: true, }; + +export const InGridLayout = GridTemplate.bind({}); +InGridLayout.args = { + direction: 'right', + maxSize: 500, +}; diff --git a/src/components/layout/ResizablePanel.tsx b/src/components/layout/ResizablePanel.tsx index d8095c6cd..e48f3452a 100644 --- a/src/components/layout/ResizablePanel.tsx +++ b/src/components/layout/ResizablePanel.tsx @@ -1,17 +1,10 @@ -import { - ForwardedRef, - forwardRef, - useContext, - useEffect, - useState, -} from 'react'; +import { ForwardedRef, forwardRef, useEffect, useState } from 'react'; import { useHover, useMove } from 'react-aria'; -import { useWarn } from '../../_internal/index'; import { BasePropsWithoutChildren, Styles, tasty } from '../../tasty/index'; import { mergeProps, useCombinedRefs } from '../../utils/react/index'; -import { Panel, CubePanelProps, PanelContext } from './Panel'; +import { Panel, CubePanelProps } from './Panel'; type Direction = 'top' | 'right' | 'bottom' | 'left'; @@ -166,16 +159,6 @@ function ResizablePanel( props: CubeResizablePanelProps, ref: ForwardedRef, ) { - const panelContext = useContext(PanelContext); - - useWarn(panelContext.layout !== 'flex', { - once: true, - key: 'resizable panel layout requirement', - args: [ - 'ResizablePanel can only be used inside a flex layout. Use Panel with `isFlex` property to create one.', - ], - }); - const isControllable = typeof props.size === 'number'; const { isDisabled, @@ -240,16 +223,19 @@ function ResizablePanel( }, onMoveEnd(e) { setIsDragging(false); + setSize((size) => clamp(Math.round(size))); }, }); useEffect(() => { - onSizeChange?.(size); + if (providedSize == null || Math.abs(providedSize - size) > 0.5) { + onSizeChange?.(size); + } }, [size]); useEffect(() => { - if (providedSize) { - setSize(providedSize); + if (providedSize && Math.abs(providedSize - size) > 0.5) { + setSize(clamp(providedSize)); } }, [providedSize]);