From da1bfaf17072f5ea2f6d1a8336dd700089d146a0 Mon Sep 17 00:00:00 2001 From: Matheus Verissimo Date: Sun, 7 Jul 2024 18:19:53 -0300 Subject: [PATCH 1/4] feat(react): add floating panel --- .../.storybook/styles/floating-panel.css | 90 +++++++++++++++ .../floating-panel/examples/basic.tsx | 59 ++++++++++ .../floating-panel/examples/controlled.tsx | 66 +++++++++++ .../floating-panel/examples/lazy-mount.tsx | 61 ++++++++++ .../floating-panel/examples/render-fn.tsx | 65 +++++++++++ .../floating-panel/floating-panel-body.tsx | 18 +++ .../floating-panel-close-trigger.tsx | 21 ++++ .../floating-panel/floating-panel-content.tsx | 30 +++++ .../floating-panel/floating-panel-context.tsx | 9 ++ .../floating-panel/floating-panel-dock.tsx | 13 +++ .../floating-panel-drag-trigger.tsx | 20 ++++ .../floating-panel/floating-panel-header.tsx | 18 +++ .../floating-panel-maximize-trigger.tsx | 21 ++++ .../floating-panel-minimize-trigger.tsx | 21 ++++ .../floating-panel-positioner.tsx | 26 +++++ .../floating-panel-resize-trigger.tsx | 24 ++++ .../floating-panel-restore-trigger.tsx | 21 ++++ .../floating-panel-root-provider.tsx | 31 ++++++ .../floating-panel/floating-panel-root.tsx | 28 +++++ .../floating-panel/floating-panel-title.tsx | 18 +++ .../floating-panel/floating-panel-trigger.tsx | 30 +++++ .../floating-panel/floating-panel.anatomy.ts | 1 + .../floating-panel/floating-panel.stories.tsx | 12 ++ .../floating-panel/floating-panel.ts | 76 +++++++++++++ .../src/components/floating-panel/index.ts | 89 +++++++++++++++ .../components/floating-panel/tests/basic.tsx | 32 ++++++ .../tests/floating-panel.spec.tsx | 105 ++++++++++++++++++ .../use-floating-panel-context.ts | 11 ++ .../floating-panel/use-floating-panel.ts | 40 +++++++ packages/react/src/components/index.ts | 1 + 30 files changed, 1057 insertions(+) create mode 100644 packages/react/.storybook/styles/floating-panel.css create mode 100644 packages/react/src/components/floating-panel/examples/basic.tsx create mode 100644 packages/react/src/components/floating-panel/examples/controlled.tsx create mode 100644 packages/react/src/components/floating-panel/examples/lazy-mount.tsx create mode 100644 packages/react/src/components/floating-panel/examples/render-fn.tsx create mode 100644 packages/react/src/components/floating-panel/floating-panel-body.tsx create mode 100644 packages/react/src/components/floating-panel/floating-panel-close-trigger.tsx create mode 100644 packages/react/src/components/floating-panel/floating-panel-content.tsx create mode 100644 packages/react/src/components/floating-panel/floating-panel-context.tsx create mode 100644 packages/react/src/components/floating-panel/floating-panel-dock.tsx create mode 100644 packages/react/src/components/floating-panel/floating-panel-drag-trigger.tsx create mode 100644 packages/react/src/components/floating-panel/floating-panel-header.tsx create mode 100644 packages/react/src/components/floating-panel/floating-panel-maximize-trigger.tsx create mode 100644 packages/react/src/components/floating-panel/floating-panel-minimize-trigger.tsx create mode 100644 packages/react/src/components/floating-panel/floating-panel-positioner.tsx create mode 100644 packages/react/src/components/floating-panel/floating-panel-resize-trigger.tsx create mode 100644 packages/react/src/components/floating-panel/floating-panel-restore-trigger.tsx create mode 100644 packages/react/src/components/floating-panel/floating-panel-root-provider.tsx create mode 100644 packages/react/src/components/floating-panel/floating-panel-root.tsx create mode 100644 packages/react/src/components/floating-panel/floating-panel-title.tsx create mode 100644 packages/react/src/components/floating-panel/floating-panel-trigger.tsx create mode 100644 packages/react/src/components/floating-panel/floating-panel.anatomy.ts create mode 100644 packages/react/src/components/floating-panel/floating-panel.stories.tsx create mode 100644 packages/react/src/components/floating-panel/floating-panel.ts create mode 100644 packages/react/src/components/floating-panel/index.ts create mode 100644 packages/react/src/components/floating-panel/tests/basic.tsx create mode 100644 packages/react/src/components/floating-panel/tests/floating-panel.spec.tsx create mode 100644 packages/react/src/components/floating-panel/use-floating-panel-context.ts create mode 100644 packages/react/src/components/floating-panel/use-floating-panel.ts diff --git a/packages/react/.storybook/styles/floating-panel.css b/packages/react/.storybook/styles/floating-panel.css new file mode 100644 index 0000000000..db6de978e9 --- /dev/null +++ b/packages/react/.storybook/styles/floating-panel.css @@ -0,0 +1,90 @@ +[data-scope='floating-panel'] button { + appearance: none; + border: 1px solid black; + margin: 0; + padding: 0; +} +[data-scope='floating-panel'][data-part='content'] { + box-shadow: + rgba(0, 0, 0, 0.28) 0px 16px 18px 0px, + rgba(0, 0, 0, 0.12) 0px 4px 16px 0px; + outline: 0 !important; + background-color: white; + display: flex; + flex-direction: column; + + &[data-topmost] { + z-index: 999999; + } + + &[data-behind] { + opacity: 0.4; + } +} + +[data-scope='floating-panel'][data-part='body'] { + position: relative; + overflow: auto; + flex: 1 1 auto; + padding-block: 16px; + padding-inline: 16px; + background-color: white; +} + +[data-scope='floating-panel'][data-part='header'] { + padding-block: 16px; + padding-inline: 16px; + background-color: #f5f5f5; + border-bottom: 1px solid #ebebeb; + display: flex; + justify-content: space-between; + align-items: center; +} + +[data-scope='floating-panel'][data-part='header'] button { + width: 24px; + height: 24px; + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 14px; + padding: 0; + svg { + width: 1em; + height: 1em; + } +} + +[data-scope='floating-panel'][data-part='trigger-group'] { + display: flex; + align-items: center; + gap: 8px; +} + +[data-scope='floating-panel'][data-part='resize-trigger'] { + background-color: rgba(154, 18, 18, 0.396); + + &[data-axis='n'], + &[data-axis='s'] { + height: 6px; + max-width: 90%; + } + + &[data-axis='e'], + &[data-axis='w'] { + width: 6px; + max-height: 90%; + } + + &[data-axis='ne'], + &[data-axis='nw'], + &[data-axis='se'], + &[data-axis='sw'] { + width: 10px; + height: 10px; + } +} + +[hidden] { + display: none !important; +} diff --git a/packages/react/src/components/floating-panel/examples/basic.tsx b/packages/react/src/components/floating-panel/examples/basic.tsx new file mode 100644 index 0000000000..de8cb1c560 --- /dev/null +++ b/packages/react/src/components/floating-panel/examples/basic.tsx @@ -0,0 +1,59 @@ +import { + FloatingPanel, + FloatingPanelBody, + FloatingPanelCloseTrigger, + FloatingPanelContent, + FloatingPanelDragTrigger, + FloatingPanelHeader, + FloatingPanelMaximizeTrigger, + FloatingPanelMinimizeTrigger, + FloatingPanelPositioner, + FloatingPanelResizeTrigger, + FloatingPanelRestoreTrigger, + FloatingPanelTitle, + FloatingPanelTrigger, + Portal, +} from '../..' + +import { ArrowDownLeft, Maximize2, Minus, XIcon } from 'lucide-react' + +export const Basic = () => ( + + Toggle Panel + + + + + Floating Panel +
+ + + + + + + + + + + + +
+
+
+ +

Some content

+
+ + + + + + + + + +
+
+
+) diff --git a/packages/react/src/components/floating-panel/examples/controlled.tsx b/packages/react/src/components/floating-panel/examples/controlled.tsx new file mode 100644 index 0000000000..e36994996f --- /dev/null +++ b/packages/react/src/components/floating-panel/examples/controlled.tsx @@ -0,0 +1,66 @@ +import { useState } from 'react' +import { + FloatingPanel, + FloatingPanelBody, + FloatingPanelCloseTrigger, + FloatingPanelContent, + FloatingPanelDragTrigger, + FloatingPanelHeader, + FloatingPanelMaximizeTrigger, + FloatingPanelMinimizeTrigger, + FloatingPanelPositioner, + FloatingPanelResizeTrigger, + FloatingPanelRestoreTrigger, + FloatingPanelTitle, + FloatingPanelTrigger, + Portal, +} from '../..' + +import { ArrowDownLeft, Maximize2, Minus, XIcon } from 'lucide-react' + +export const Controlled = () => { + const [isOpen, setIsOpen] = useState(false) + + return ( + setIsOpen(e.open)}> + setIsOpen(true)}>Toggle Panel + + + + + + Floating Panel +
+ + + + + + + + + + + + +
+
+
+ +

Some content

+
+ + + + + + + + + +
+
+
+
+ ) +} diff --git a/packages/react/src/components/floating-panel/examples/lazy-mount.tsx b/packages/react/src/components/floating-panel/examples/lazy-mount.tsx new file mode 100644 index 0000000000..9163ee63c2 --- /dev/null +++ b/packages/react/src/components/floating-panel/examples/lazy-mount.tsx @@ -0,0 +1,61 @@ +import { + FloatingPanel, + FloatingPanelBody, + FloatingPanelCloseTrigger, + FloatingPanelContent, + FloatingPanelDragTrigger, + FloatingPanelHeader, + FloatingPanelMaximizeTrigger, + FloatingPanelMinimizeTrigger, + FloatingPanelPositioner, + FloatingPanelResizeTrigger, + FloatingPanelRestoreTrigger, + FloatingPanelTitle, + FloatingPanelTrigger, + Portal, +} from '../..' + +import { ArrowDownLeft, Maximize2, Minus, XIcon } from 'lucide-react' + +export const LazyMount = () => ( + console.log('onExitComplete invoked')}> + Toggle Panel + + + + + + Floating Panel +
+ + + + + + + + + + + + +
+
+
+ +

Some content

+
+ + + + + + + + + +
+
+
+
+) diff --git a/packages/react/src/components/floating-panel/examples/render-fn.tsx b/packages/react/src/components/floating-panel/examples/render-fn.tsx new file mode 100644 index 0000000000..c525e52d98 --- /dev/null +++ b/packages/react/src/components/floating-panel/examples/render-fn.tsx @@ -0,0 +1,65 @@ +import { + FloatingPanel, + FloatingPanelBody, + FloatingPanelCloseTrigger, + FloatingPanelContent, + FloatingPanelContext, + FloatingPanelDragTrigger, + FloatingPanelHeader, + FloatingPanelMaximizeTrigger, + FloatingPanelMinimizeTrigger, + FloatingPanelPositioner, + FloatingPanelResizeTrigger, + FloatingPanelRestoreTrigger, + FloatingPanelTitle, + FloatingPanelTrigger, + Portal, +} from '../..' + +import { ArrowDownLeft, Maximize2, Minus, XIcon } from 'lucide-react' + +export const RenderFn = () => ( + + Toggle Panel + + + + + + Floating Panel +
+ + + + + + + + + + + + +
+
+
+ +

Some content

+
+ + + + + + + + + +
+
+
+ + {(floatingPanel) =>

floatingPanel is {floatingPanel.open ? 'open' : 'closed'}

} +
+
+) diff --git a/packages/react/src/components/floating-panel/floating-panel-body.tsx b/packages/react/src/components/floating-panel/floating-panel-body.tsx new file mode 100644 index 0000000000..d96de2af92 --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel-body.tsx @@ -0,0 +1,18 @@ +import { mergeProps } from '@zag-js/react' +import { forwardRef } from 'react' +import { type HTMLProps, type PolymorphicProps, ark } from '../factory' +import { useFloatingPanelContext } from './use-floating-panel-context' + +export interface FloatingPanelBodyBaseProps extends PolymorphicProps {} +export interface FloatingPanelBodyProps extends HTMLProps<'div'>, FloatingPanelBodyBaseProps {} + +export const FloatingPanelBody = forwardRef( + (props, ref) => { + const floatingPanel = useFloatingPanelContext() + const mergedProps = mergeProps(floatingPanel.getBodyProps(), props) + + return + }, +) + +FloatingPanelBody.displayName = 'FloatingPanelBody' diff --git a/packages/react/src/components/floating-panel/floating-panel-close-trigger.tsx b/packages/react/src/components/floating-panel/floating-panel-close-trigger.tsx new file mode 100644 index 0000000000..90f22b54d3 --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel-close-trigger.tsx @@ -0,0 +1,21 @@ +import { mergeProps } from '@zag-js/react' +import { forwardRef } from 'react' +import { type HTMLProps, type PolymorphicProps, ark } from '../factory' +import { useFloatingPanelContext } from './use-floating-panel-context' + +export interface FloatingPanelCloseTriggerBaseProps extends PolymorphicProps {} +export interface FloatingPanelCloseTriggerProps + extends HTMLProps<'button'>, + FloatingPanelCloseTriggerBaseProps {} + +export const FloatingPanelCloseTrigger = forwardRef< + HTMLButtonElement, + FloatingPanelCloseTriggerProps +>((props, ref) => { + const floatingPanel = useFloatingPanelContext() + const mergedProps = mergeProps(floatingPanel.getCloseTriggerProps(), props) + + return +}) + +FloatingPanelCloseTrigger.displayName = 'FloatingPanelCloseTrigger' diff --git a/packages/react/src/components/floating-panel/floating-panel-content.tsx b/packages/react/src/components/floating-panel/floating-panel-content.tsx new file mode 100644 index 0000000000..3b16fdf84e --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel-content.tsx @@ -0,0 +1,30 @@ +import { mergeProps } from '@zag-js/react' +import { forwardRef } from 'react' +import { type HTMLProps, type PolymorphicProps, ark } from '../factory' +import { usePresenceContext } from '../presence' +import { useFloatingPanelContext } from './use-floating-panel-context' + +export interface FloatingPanelContentBaseProps extends PolymorphicProps {} +export interface FloatingPanelContentProps + extends HTMLProps<'div'>, + FloatingPanelContentBaseProps {} + +export const FloatingPanelContent = forwardRef( + (props, ref) => { + const floatingPanel = useFloatingPanelContext() + const presence = usePresenceContext() + const mergedProps = mergeProps( + floatingPanel.getContentProps(), + presence.getPresenceProps(ref), + props, + ) + + if (presence.unmounted) { + return null + } + + return + }, +) + +FloatingPanelContent.displayName = 'FloatingPanelContent' diff --git a/packages/react/src/components/floating-panel/floating-panel-context.tsx b/packages/react/src/components/floating-panel/floating-panel-context.tsx new file mode 100644 index 0000000000..aea516408e --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel-context.tsx @@ -0,0 +1,9 @@ +import type { ReactNode } from 'react' +import { type UseFloatingPanelContext, useFloatingPanelContext } from './use-floating-panel-context' + +export interface FloatingPanelContextProps { + children: (context: UseFloatingPanelContext) => ReactNode +} + +export const FloatingPanelContext = (props: FloatingPanelContextProps) => + props.children(useFloatingPanelContext()) diff --git a/packages/react/src/components/floating-panel/floating-panel-dock.tsx b/packages/react/src/components/floating-panel/floating-panel-dock.tsx new file mode 100644 index 0000000000..50d72c1851 --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel-dock.tsx @@ -0,0 +1,13 @@ +import { forwardRef } from 'react' +import { type HTMLProps, type PolymorphicProps, ark } from '../factory' + +export interface FloatingPanelDockBaseProps extends PolymorphicProps {} +export interface FloatingPanelDockProps extends HTMLProps<'div'>, FloatingPanelDockBaseProps {} + +export const FloatingPanelDock = forwardRef( + (props, ref) => { + return + }, +) + +FloatingPanelDock.displayName = 'FloatingPanelDock' diff --git a/packages/react/src/components/floating-panel/floating-panel-drag-trigger.tsx b/packages/react/src/components/floating-panel/floating-panel-drag-trigger.tsx new file mode 100644 index 0000000000..549eb9d6c7 --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel-drag-trigger.tsx @@ -0,0 +1,20 @@ +import { mergeProps } from '@zag-js/react' +import { forwardRef } from 'react' +import { type HTMLProps, type PolymorphicProps, ark } from '../factory' +import { useFloatingPanelContext } from './use-floating-panel-context' + +export interface FloatingPanelDragTriggerBaseProps extends PolymorphicProps {} +export interface FloatingPanelDragTriggerProps + extends HTMLProps<'div'>, + FloatingPanelDragTriggerBaseProps {} + +export const FloatingPanelDragTrigger = forwardRef( + (props, ref) => { + const floatingPanel = useFloatingPanelContext() + const mergedProps = mergeProps(floatingPanel.getDragTriggerProps(), props) + + return + }, +) + +FloatingPanelDragTrigger.displayName = 'FloatingPanelDragTrigger' diff --git a/packages/react/src/components/floating-panel/floating-panel-header.tsx b/packages/react/src/components/floating-panel/floating-panel-header.tsx new file mode 100644 index 0000000000..483095ff67 --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel-header.tsx @@ -0,0 +1,18 @@ +import { mergeProps } from '@zag-js/react' +import { forwardRef } from 'react' +import { type HTMLProps, type PolymorphicProps, ark } from '../factory' +import { useFloatingPanelContext } from './use-floating-panel-context' + +export interface FloatingPanelHeaderBaseProps extends PolymorphicProps {} +export interface FloatingPanelHeaderProps extends HTMLProps<'div'>, FloatingPanelHeaderBaseProps {} + +export const FloatingPanelHeader = forwardRef( + (props, ref) => { + const floatingPanel = useFloatingPanelContext() + const mergedProps = mergeProps(floatingPanel.getHeaderProps(), props) + + return + }, +) + +FloatingPanelHeader.displayName = 'FloatingPanelHeader' diff --git a/packages/react/src/components/floating-panel/floating-panel-maximize-trigger.tsx b/packages/react/src/components/floating-panel/floating-panel-maximize-trigger.tsx new file mode 100644 index 0000000000..a1c1d38378 --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel-maximize-trigger.tsx @@ -0,0 +1,21 @@ +import { mergeProps } from '@zag-js/react' +import { forwardRef } from 'react' +import { type HTMLProps, type PolymorphicProps, ark } from '../factory' +import { useFloatingPanelContext } from './use-floating-panel-context' + +export interface FloatingPanelMaximizeTriggerBaseProps extends PolymorphicProps {} +export interface FloatingPanelMaximizeTriggerProps + extends HTMLProps<'button'>, + FloatingPanelMaximizeTriggerBaseProps {} + +export const FloatingPanelMaximizeTrigger = forwardRef< + HTMLButtonElement, + FloatingPanelMaximizeTriggerProps +>((props, ref) => { + const floatingPanel = useFloatingPanelContext() + const mergedProps = mergeProps(floatingPanel.getMaximizeTriggerProps(), props) + + return +}) + +FloatingPanelMaximizeTrigger.displayName = 'FloatingPanelMaximizeTrigger' diff --git a/packages/react/src/components/floating-panel/floating-panel-minimize-trigger.tsx b/packages/react/src/components/floating-panel/floating-panel-minimize-trigger.tsx new file mode 100644 index 0000000000..fc3d3a2f17 --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel-minimize-trigger.tsx @@ -0,0 +1,21 @@ +import { mergeProps } from '@zag-js/react' +import { forwardRef } from 'react' +import { type HTMLProps, type PolymorphicProps, ark } from '../factory' +import { useFloatingPanelContext } from './use-floating-panel-context' + +export interface FloatingPanelMinimizeTriggerBaseProps extends PolymorphicProps {} +export interface FloatingPanelMinimizeTriggerProps + extends HTMLProps<'button'>, + FloatingPanelMinimizeTriggerBaseProps {} + +export const FloatingPanelMinimizeTrigger = forwardRef< + HTMLButtonElement, + FloatingPanelMinimizeTriggerProps +>((props, ref) => { + const floatingPanel = useFloatingPanelContext() + const mergedProps = mergeProps(floatingPanel.getMinimizeTriggerProps(), props) + + return +}) + +FloatingPanelMinimizeTrigger.displayName = 'FloatingPanelMinimizeTrigger' diff --git a/packages/react/src/components/floating-panel/floating-panel-positioner.tsx b/packages/react/src/components/floating-panel/floating-panel-positioner.tsx new file mode 100644 index 0000000000..bb95a2bfb8 --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel-positioner.tsx @@ -0,0 +1,26 @@ +import { mergeProps } from '@zag-js/react' +import { forwardRef } from 'react' +import { type HTMLProps, type PolymorphicProps, ark } from '../factory' +import { usePresenceContext } from '../presence' +import { useFloatingPanelContext } from './use-floating-panel-context' + +export interface FloatingPanelPositionerBaseProps extends PolymorphicProps {} +export interface FloatingPanelPositionerProps + extends HTMLProps<'div'>, + FloatingPanelPositionerBaseProps {} + +export const FloatingPanelPositioner = forwardRef( + (props, ref) => { + const floatingPanel = useFloatingPanelContext() + const mergedProps = mergeProps(floatingPanel.getPositionerProps(), props) + const presence = usePresenceContext() + + if (presence.unmounted) { + return null + } + + return + }, +) + +FloatingPanelPositioner.displayName = 'FloatingPanelPositioner' diff --git a/packages/react/src/components/floating-panel/floating-panel-resize-trigger.tsx b/packages/react/src/components/floating-panel/floating-panel-resize-trigger.tsx new file mode 100644 index 0000000000..da7416f641 --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel-resize-trigger.tsx @@ -0,0 +1,24 @@ +import type { ResizeTriggerProps } from '@zag-js/floating-panel' +import { mergeProps } from '@zag-js/react' +import { forwardRef } from 'react' +import { createSplitProps } from '../../utils/create-split-props' +import { type HTMLProps, type PolymorphicProps, ark } from '../factory' +import { useFloatingPanelContext } from './use-floating-panel-context' + +export interface FloatingPanelResizeTriggerBaseProps extends ResizeTriggerProps, PolymorphicProps {} +export interface FloatingPanelResizeTriggerProps + extends HTMLProps<'button'>, + FloatingPanelResizeTriggerBaseProps {} + +export const FloatingPanelResizeTrigger = forwardRef< + HTMLButtonElement, + FloatingPanelResizeTriggerProps +>((props, ref) => { + const [resizeProps, localProps] = createSplitProps()(props, ['axis']) + const floatingPanel = useFloatingPanelContext() + const mergedProps = mergeProps(floatingPanel.getResizeTriggerProps(resizeProps), localProps) + + return +}) + +FloatingPanelResizeTrigger.displayName = 'FloatingPanelResizeTrigger' diff --git a/packages/react/src/components/floating-panel/floating-panel-restore-trigger.tsx b/packages/react/src/components/floating-panel/floating-panel-restore-trigger.tsx new file mode 100644 index 0000000000..1448c278e3 --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel-restore-trigger.tsx @@ -0,0 +1,21 @@ +import { mergeProps } from '@zag-js/react' +import { forwardRef } from 'react' +import { type HTMLProps, type PolymorphicProps, ark } from '../factory' +import { useFloatingPanelContext } from './use-floating-panel-context' + +export interface FloatingPanelRestoreTriggerBaseProps extends PolymorphicProps {} +export interface FloatingPanelRestoreTriggerProps + extends HTMLProps<'button'>, + FloatingPanelRestoreTriggerBaseProps {} + +export const FloatingPanelRestoreTrigger = forwardRef< + HTMLButtonElement, + FloatingPanelRestoreTriggerProps +>((props, ref) => { + const floatingPanel = useFloatingPanelContext() + const mergedProps = mergeProps(floatingPanel.getRestoreTriggerProps(), props) + + return +}) + +FloatingPanelRestoreTrigger.displayName = 'FloatingPanelRestoreTrigger' diff --git a/packages/react/src/components/floating-panel/floating-panel-root-provider.tsx b/packages/react/src/components/floating-panel/floating-panel-root-provider.tsx new file mode 100644 index 0000000000..76d1a0a151 --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel-root-provider.tsx @@ -0,0 +1,31 @@ +import { mergeProps } from '@zag-js/react' +import type { ReactNode } from 'react' +import { RenderStrategyPropsProvider, splitRenderStrategyProps } from '../../utils/render-strategy' +import type { UsePresenceProps } from '../presence' +import { PresenceProvider, usePresence } from '../presence' +import { splitPresenceProps } from '../presence/split-presence-props' +import type { UseFloatingPanelReturn } from './use-floating-panel' +import { FloatingPanelProvider } from './use-floating-panel-context' + +interface RootProviderProps { + value: UseFloatingPanelReturn +} + +export interface FloatingPanelRootProviderBaseProps extends RootProviderProps, UsePresenceProps {} +export interface FloatingPanelRootProviderProps extends FloatingPanelRootProviderBaseProps { + children?: ReactNode +} + +export const FloatingPanelRootProvider = (props: FloatingPanelRootProviderProps) => { + const [presenceProps, { value: floatingPanel, children }] = splitPresenceProps(props) + const [renderStrategyProps] = splitRenderStrategyProps(presenceProps) + const presence = usePresence(mergeProps({ present: floatingPanel.open }, presenceProps)) + + return ( + + + {children} + + + ) +} diff --git a/packages/react/src/components/floating-panel/floating-panel-root.tsx b/packages/react/src/components/floating-panel/floating-panel-root.tsx new file mode 100644 index 0000000000..f36a80282e --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel-root.tsx @@ -0,0 +1,28 @@ +import { mergeProps } from '@zag-js/react' +import type { ReactNode } from 'react' +import { RenderStrategyPropsProvider, splitRenderStrategyProps } from '../../utils/render-strategy' +import type { UsePresenceProps } from '../presence' +import { PresenceProvider, usePresence } from '../presence' +import { splitPresenceProps } from '../presence/split-presence-props' +import { type UseFloatingPanelProps, useFloatingPanel } from './use-floating-panel' +import { FloatingPanelProvider } from './use-floating-panel-context' + +export interface FloatingPanelRootBaseProps extends UseFloatingPanelProps, UsePresenceProps {} +export interface FloatingPanelRootProps extends FloatingPanelRootBaseProps { + children?: ReactNode +} + +export const FloatingPanelRoot = (props: FloatingPanelRootProps) => { + const [presenceProps, { children, ...localProps }] = splitPresenceProps(props) + const [renderStrategyProps] = splitRenderStrategyProps(presenceProps) + const floatingPanel = useFloatingPanel(localProps) + const presence = usePresence(mergeProps({ present: floatingPanel.open }, presenceProps)) + + return ( + + + {children} + + + ) +} diff --git a/packages/react/src/components/floating-panel/floating-panel-title.tsx b/packages/react/src/components/floating-panel/floating-panel-title.tsx new file mode 100644 index 0000000000..9e5af68646 --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel-title.tsx @@ -0,0 +1,18 @@ +import { mergeProps } from '@zag-js/react' +import { forwardRef } from 'react' +import { type HTMLProps, type PolymorphicProps, ark } from '../factory' +import { useFloatingPanelContext } from './use-floating-panel-context' + +export interface FloatingPanelTitleBaseProps extends PolymorphicProps {} +export interface FloatingPanelTitleProps extends HTMLProps<'p'>, FloatingPanelTitleBaseProps {} + +export const FloatingPanelTitle = forwardRef( + (props, ref) => { + const floatingPanel = useFloatingPanelContext() + const mergedProps = mergeProps(floatingPanel.getTitleProps(), props) + + return + }, +) + +FloatingPanelTitle.displayName = 'FloatingPanelTitle' diff --git a/packages/react/src/components/floating-panel/floating-panel-trigger.tsx b/packages/react/src/components/floating-panel/floating-panel-trigger.tsx new file mode 100644 index 0000000000..0a21fa4d68 --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel-trigger.tsx @@ -0,0 +1,30 @@ +import { mergeProps } from '@zag-js/react' +import { forwardRef } from 'react' +import { type HTMLProps, type PolymorphicProps, ark } from '../factory' +import { usePresenceContext } from '../presence' +import { useFloatingPanelContext } from './use-floating-panel-context' + +export interface FloatingPanelTriggerBaseProps extends PolymorphicProps {} +export interface FloatingPanelTriggerProps + extends HTMLProps<'button'>, + FloatingPanelTriggerBaseProps {} + +export const FloatingPanelTrigger = forwardRef( + (props, ref) => { + const floatingPanel = useFloatingPanelContext() + const presence = usePresenceContext() + const mergedProps = mergeProps( + { + ...floatingPanel.getTriggerProps(), + 'aria-controls': presence.unmounted + ? undefined + : floatingPanel.getTriggerProps()['aria-controls'], + }, + props, + ) + + return + }, +) + +FloatingPanelTrigger.displayName = 'FloatingPanelTrigger' diff --git a/packages/react/src/components/floating-panel/floating-panel.anatomy.ts b/packages/react/src/components/floating-panel/floating-panel.anatomy.ts new file mode 100644 index 0000000000..3a94f987a5 --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel.anatomy.ts @@ -0,0 +1 @@ +export { anatomy as floatingPanelAnatomy } from '@zag-js/floating-panel' diff --git a/packages/react/src/components/floating-panel/floating-panel.stories.tsx b/packages/react/src/components/floating-panel/floating-panel.stories.tsx new file mode 100644 index 0000000000..516589c3ad --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel.stories.tsx @@ -0,0 +1,12 @@ +import type { Meta } from '@storybook/react' + +const meta: Meta = { + title: 'Components / Floating Panel', +} + +export default meta + +export { Basic } from './examples/basic' +export { Controlled } from './examples/controlled' +export { LazyMount } from './examples/lazy-mount' +export { RenderFn } from './examples/render-fn' diff --git a/packages/react/src/components/floating-panel/floating-panel.ts b/packages/react/src/components/floating-panel/floating-panel.ts new file mode 100644 index 0000000000..a7a9ba2b4e --- /dev/null +++ b/packages/react/src/components/floating-panel/floating-panel.ts @@ -0,0 +1,76 @@ +export type { OpenChangeDetails } from '@zag-js/floating-panel' +export { + FloatingPanelBody as Body, + type FloatingPanelBodyProps as BodyProps, + type FloatingPanelBodyBaseProps as BodyBaseProps, +} from './floating-panel-body' +export { + FloatingPanelCloseTrigger as CloseTrigger, + type FloatingPanelCloseTriggerProps as CloseTriggerProps, + type FloatingPanelCloseTriggerBaseProps as CloseTriggerBaseProps, +} from './floating-panel-close-trigger' +export { + FloatingPanelContent as Content, + type FloatingPanelContentProps as ContentProps, + type FloatingPanelContentBaseProps as ContentBaseProps, +} from './floating-panel-content' +export { + FloatingPanelDock as Dock, + type FloatingPanelDockProps as DockProps, + type FloatingPanelDockBaseProps as DockBaseProps, +} from './floating-panel-dock' +export { + FloatingPanelDragTrigger as DragTrigger, + type FloatingPanelDragTriggerProps as DragTriggerProps, + type FloatingPanelDragTriggerBaseProps as DragTriggerBaseProps, +} from './floating-panel-drag-trigger' +export { + FloatingPanelHeader as Header, + type FloatingPanelHeaderProps as HeaderProps, + type FloatingPanelHeaderBaseProps as HeaderBaseProps, +} from './floating-panel-header' +export { + FloatingPanelMaximizeTrigger as MaximizeTrigger, + type FloatingPanelMaximizeTriggerProps as MaximizeTriggerProps, + type FloatingPanelMaximizeTriggerBaseProps as MaximizeTriggerBaseProps, +} from './floating-panel-maximize-trigger' +export { + FloatingPanelMinimizeTrigger as MinimizeTrigger, + type FloatingPanelMinimizeTriggerProps as MinimizeTriggerProps, + type FloatingPanelMinimizeTriggerBaseProps as MinimizeTriggerBaseProps, +} from './floating-panel-minimize-trigger' +export { + FloatingPanelPositioner as Positioner, + type FloatingPanelPositionerProps as PositionerProps, + type FloatingPanelPositionerBaseProps as PositionerBaseProps, +} from './floating-panel-positioner' +export { + FloatingPanelResizeTrigger as ResizeTrigger, + type FloatingPanelResizeTriggerProps as ResizeTriggerProps, + type FloatingPanelResizeTriggerBaseProps as ResizeTriggerBaseProps, +} from './floating-panel-resize-trigger' +export { + FloatingPanelRestoreTrigger as RestoreTrigger, + type FloatingPanelRestoreTriggerProps as RestoreTriggerProps, + type FloatingPanelRestoreTriggerBaseProps as RestoreTriggerBaseProps, +} from './floating-panel-restore-trigger' +export { + FloatingPanelRoot as Root, + type FloatingPanelRootProps as RootProps, + type FloatingPanelRootBaseProps as RootBaseProps, +} from './floating-panel-root' +export { + FloatingPanelRootProvider as RootProvider, + type FloatingPanelRootProviderProps as RootProviderProps, + type FloatingPanelRootProviderBaseProps as RootProviderBaseProps, +} from './floating-panel-root-provider' +export { + FloatingPanelTitle as Title, + type FloatingPanelTitleProps as TitleProps, + type FloatingPanelTitleBaseProps as TitleBaseProps, +} from './floating-panel-title' +export { + FloatingPanelTrigger as Trigger, + type FloatingPanelTriggerProps as TriggerProps, + type FloatingPanelTriggerBaseProps as TriggerBaseProps, +} from './floating-panel-trigger' diff --git a/packages/react/src/components/floating-panel/index.ts b/packages/react/src/components/floating-panel/index.ts new file mode 100644 index 0000000000..ce57d6a8b9 --- /dev/null +++ b/packages/react/src/components/floating-panel/index.ts @@ -0,0 +1,89 @@ +export type { OpenChangeDetails as FloatingPanelOpenChangeDetails } from '@zag-js/floating-panel' +export { + FloatingPanelBody, + type FloatingPanelBodyProps, + type FloatingPanelBodyBaseProps, +} from './floating-panel-body' +export { + FloatingPanelCloseTrigger, + type FloatingPanelCloseTriggerProps, + type FloatingPanelCloseTriggerBaseProps, +} from './floating-panel-close-trigger' +export { + FloatingPanelContent, + type FloatingPanelContentProps, + type FloatingPanelContentBaseProps, +} from './floating-panel-content' +export { + FloatingPanelDock, + type FloatingPanelDockProps, + type FloatingPanelDockBaseProps, +} from './floating-panel-dock' +export { + FloatingPanelContext, + type FloatingPanelContextProps, +} from './floating-panel-context' +export { + FloatingPanelDragTrigger, + type FloatingPanelDragTriggerProps, + type FloatingPanelDragTriggerBaseProps, +} from './floating-panel-drag-trigger' +export { + FloatingPanelHeader, + type FloatingPanelHeaderProps, + type FloatingPanelHeaderBaseProps, +} from './floating-panel-header' +export { + FloatingPanelMaximizeTrigger, + type FloatingPanelMaximizeTriggerProps, + type FloatingPanelMaximizeTriggerBaseProps, +} from './floating-panel-maximize-trigger' +export { + FloatingPanelMinimizeTrigger, + type FloatingPanelMinimizeTriggerProps, + type FloatingPanelMinimizeTriggerBaseProps, +} from './floating-panel-minimize-trigger' +export { + FloatingPanelPositioner, + type FloatingPanelPositionerProps, + type FloatingPanelPositionerBaseProps, +} from './floating-panel-positioner' +export { + FloatingPanelResizeTrigger, + type FloatingPanelResizeTriggerProps, + type FloatingPanelResizeTriggerBaseProps, +} from './floating-panel-resize-trigger' +export { + FloatingPanelRestoreTrigger, + type FloatingPanelRestoreTriggerProps, + type FloatingPanelRestoreTriggerBaseProps, +} from './floating-panel-restore-trigger' +export { + FloatingPanelRoot, + type FloatingPanelRootProps, + type FloatingPanelRootBaseProps, +} from './floating-panel-root' +export { + FloatingPanelRootProvider, + type FloatingPanelRootProviderProps, + type FloatingPanelRootProviderBaseProps, +} from './floating-panel-root-provider' +export { + FloatingPanelTitle, + type FloatingPanelTitleProps, + type FloatingPanelTitleBaseProps, +} from './floating-panel-title' +export { + FloatingPanelTrigger, + type FloatingPanelTriggerProps, + type FloatingPanelTriggerBaseProps, +} from './floating-panel-trigger' +export { + useFloatingPanel, + type UseFloatingPanelProps, + type UseFloatingPanelReturn, +} from './use-floating-panel' +export { useFloatingPanelContext, type UseFloatingPanelContext } from './use-floating-panel-context' +export { floatingPanelAnatomy } from './floating-panel.anatomy' + +export * as FloatingPanel from './floating-panel' diff --git a/packages/react/src/components/floating-panel/tests/basic.tsx b/packages/react/src/components/floating-panel/tests/basic.tsx new file mode 100644 index 0000000000..d6efc209e4 --- /dev/null +++ b/packages/react/src/components/floating-panel/tests/basic.tsx @@ -0,0 +1,32 @@ +import { FloatingPanel, type FloatingPanelRootProps } from '../..' + +export const ComponentUnderTest = (props: FloatingPanelRootProps) => ( + + Open FloatingPanel + + + + + + FloatingPanel Title + minimize window + maximize window + restore window + close window + + + +

Some content

+
+ + + + + + + + +
+
+
+) diff --git a/packages/react/src/components/floating-panel/tests/floating-panel.spec.tsx b/packages/react/src/components/floating-panel/tests/floating-panel.spec.tsx new file mode 100644 index 0000000000..47221887c2 --- /dev/null +++ b/packages/react/src/components/floating-panel/tests/floating-panel.spec.tsx @@ -0,0 +1,105 @@ +import { cleanup, render, screen, waitFor } from '@testing-library/react/pure' +import user from '@testing-library/user-event' +import { axe } from 'vitest-axe' +import { FloatingPanel, floatingPanelAnatomy } from '../' +import { getExports, getParts } from '../../../setup-test' +import { ComponentUnderTest } from './basic' + +describe('FloatingPanel / Parts & Exports', () => { + afterAll(() => { + cleanup() + }) + + render() + + it.each(getParts(floatingPanelAnatomy))('should render part! %s', async (part) => { + expect(document.querySelector(part)).toBeInTheDocument() + }) + + it.each(getExports(floatingPanelAnatomy))('should export %s', async (part) => { + expect(FloatingPanel[part]).toBeDefined() + }) +}) + +describe('FloatingPanel', () => { + afterEach(() => { + cleanup() + }) + + it('should have no a11y violations', async () => { + const { container } = render() + const results = await axe(container) + + expect(results).toHaveNoViolations() + }) + + it('should show floatingPanel content when opened', async () => { + render() + + await user.click(screen.getByText('Open FloatingPanel')) + expect(await screen.findByText('FloatingPanel Title')).toBeVisible() + + await user.click(screen.getByRole('button', { name: /close window/i })) + await waitFor(() => expect(screen.queryByText('FloatingPanel Title')).not.toBeVisible()) + }) + + it('should invoke onOpenChange if floatingPanel is closed', async () => { + const onOpenChange = vi.fn() + render() + + await user.click(screen.getByRole('button', { name: /close window/i })) + expect(onOpenChange).toHaveBeenCalledTimes(1) + }) + + it('should be able to lazy mount', async () => { + render() + + expect(screen.queryByTestId('positioner')).not.toBeInTheDocument() + + await user.click(screen.getByRole('button', { name: 'Open FloatingPanel' })) + expect(screen.getByTestId('positioner')).toBeInTheDocument() + + screen.logTestingPlaygroundURL() + + await user.click(screen.getByRole('button', { name: /close window/i })) + expect(screen.getByTestId('positioner')).toBeInTheDocument() + }) + + it('should not have aria-controls if lazy mounted', async () => { + render() + + expect(screen.getByRole('button', { name: 'Open FloatingPanel' })).not.toHaveAttribute( + 'aria-controls', + ) + }) + + it('should lazy mount and unmount on exit', async () => { + render() + + expect(screen.queryByTestId('positioner')).not.toBeInTheDocument() + + await user.click(screen.getByRole('button', { name: 'Open FloatingPanel' })) + expect(screen.getByTestId('positioner')).toBeInTheDocument() + + await user.click(screen.getByRole('button', { name: /close window/i })) + await waitFor(() => expect(screen.queryByTestId('positioner')).not.toBeInTheDocument()) + }) + + it('should be fully controlled (true)', async () => { + render() + + expect(screen.queryByRole('button', { name: /close window/i })).toBeVisible() + + await user.click(screen.getByRole('button', { name: /close window/i })) + expect(screen.queryByRole('button', { name: /close window/i })).toBeVisible() + }) + + it('should be fully controlled (false)', async () => { + render() + + expect(screen.queryByRole('button', { name: 'Close' })).not.toBeInTheDocument() + + await user.click(screen.getByRole('button', { name: 'Open FloatingPanel' })) + expect(screen.queryByRole('button', { name: 'Close' })).not.toBeInTheDocument() + }) +}) diff --git a/packages/react/src/components/floating-panel/use-floating-panel-context.ts b/packages/react/src/components/floating-panel/use-floating-panel-context.ts new file mode 100644 index 0000000000..b9ca55c0f6 --- /dev/null +++ b/packages/react/src/components/floating-panel/use-floating-panel-context.ts @@ -0,0 +1,11 @@ +import { createContext } from '../../utils/create-context' +import type { UseFloatingPanelReturn } from './use-floating-panel' + +export interface UseFloatingPanelContext extends UseFloatingPanelReturn {} + +export const [FloatingPanelProvider, useFloatingPanelContext] = + createContext({ + name: 'FloatingPanelContext', + hookName: 'useFloatingPanelContext', + providerName: '', + }) diff --git a/packages/react/src/components/floating-panel/use-floating-panel.ts b/packages/react/src/components/floating-panel/use-floating-panel.ts new file mode 100644 index 0000000000..ad636d2c85 --- /dev/null +++ b/packages/react/src/components/floating-panel/use-floating-panel.ts @@ -0,0 +1,40 @@ +import * as floatingPanel from '@zag-js/floating-panel' +import { type PropTypes, normalizeProps, useMachine } from '@zag-js/react' +import { useId } from 'react' +import { useEnvironmentContext, useLocaleContext } from '../../providers' +import type { Optional } from '../../types' +import { useEvent } from '../../utils/use-event' + +export interface UseFloatingPanelProps + extends Optional, 'id'> { + /** + * The initial open state of the floating panel when it is first rendered. + * Use when you do not need to control its open state. + */ + defaultOpen?: floatingPanel.Context['open'] +} + +export interface UseFloatingPanelReturn extends floatingPanel.Api {} + +export const useFloatingPanel = (props: UseFloatingPanelProps = {}): UseFloatingPanelReturn => { + const { getRootNode } = useEnvironmentContext() + const { dir } = useLocaleContext() + + const initialContext: floatingPanel.Context = { + id: useId(), + dir, + getRootNode, + open: props.defaultOpen, + ...props, + } + + const context: floatingPanel.Context = { + ...initialContext, + open: props.open, + onOpenChange: useEvent(props.onOpenChange, { sync: true }), + } + + const [state, send] = useMachine(floatingPanel.machine(initialContext), { context }) + + return floatingPanel.connect(state, send, normalizeProps) +} diff --git a/packages/react/src/components/index.ts b/packages/react/src/components/index.ts index 7e2e6dc9b1..dc0541b4dd 100644 --- a/packages/react/src/components/index.ts +++ b/packages/react/src/components/index.ts @@ -13,6 +13,7 @@ export * from './factory' export * from './field' export * from './fieldset' export * from './file-upload' +export * from './floating-panel' export * from './format' export * from './highlight' export * from './hover-card' From 364e4cdcaa2a3e4c100317ac11d646ec40eae22e Mon Sep 17 00:00:00 2001 From: Matheus Verissimo Date: Tue, 9 Jul 2024 23:45:30 -0300 Subject: [PATCH 2/4] feat(react): add missing exports --- .../floating-panel/examples/basic.tsx | 90 ++++++++----------- .../floating-panel/examples/controlled.tsx | 76 +++++++--------- .../floating-panel/examples/lazy-mount.tsx | 73 ++++++--------- .../floating-panel/examples/render-fn.tsx | 81 +++++++---------- .../floating-panel-root-provider.tsx | 6 +- .../floating-panel/floating-panel-title.tsx | 4 +- .../floating-panel/floating-panel.ts | 4 + .../components/floating-panel/tests/basic.tsx | 52 +++++------ 8 files changed, 167 insertions(+), 219 deletions(-) diff --git a/packages/react/src/components/floating-panel/examples/basic.tsx b/packages/react/src/components/floating-panel/examples/basic.tsx index de8cb1c560..86d477f4ff 100644 --- a/packages/react/src/components/floating-panel/examples/basic.tsx +++ b/packages/react/src/components/floating-panel/examples/basic.tsx @@ -1,59 +1,45 @@ -import { - FloatingPanel, - FloatingPanelBody, - FloatingPanelCloseTrigger, - FloatingPanelContent, - FloatingPanelDragTrigger, - FloatingPanelHeader, - FloatingPanelMaximizeTrigger, - FloatingPanelMinimizeTrigger, - FloatingPanelPositioner, - FloatingPanelResizeTrigger, - FloatingPanelRestoreTrigger, - FloatingPanelTitle, - FloatingPanelTrigger, - Portal, -} from '../..' - import { ArrowDownLeft, Maximize2, Minus, XIcon } from 'lucide-react' +import { FloatingPanel, Portal } from '../..' export const Basic = () => ( - Toggle Panel - - - - - Floating Panel -
- - - - - - - - - - - - -
-
-
- -

Some content

-
+ Toggle Panel + + + + + + Floating Panel +
+ + + + + + + + + + + + +
+
+
+ +

Some content

+
- - - - - - - - -
-
+ + + + + + + + + + +
) diff --git a/packages/react/src/components/floating-panel/examples/controlled.tsx b/packages/react/src/components/floating-panel/examples/controlled.tsx index e36994996f..b116c61348 100644 --- a/packages/react/src/components/floating-panel/examples/controlled.tsx +++ b/packages/react/src/components/floating-panel/examples/controlled.tsx @@ -1,65 +1,49 @@ -import { useState } from 'react' -import { - FloatingPanel, - FloatingPanelBody, - FloatingPanelCloseTrigger, - FloatingPanelContent, - FloatingPanelDragTrigger, - FloatingPanelHeader, - FloatingPanelMaximizeTrigger, - FloatingPanelMinimizeTrigger, - FloatingPanelPositioner, - FloatingPanelResizeTrigger, - FloatingPanelRestoreTrigger, - FloatingPanelTitle, - FloatingPanelTrigger, - Portal, -} from '../..' - import { ArrowDownLeft, Maximize2, Minus, XIcon } from 'lucide-react' +import { useState } from 'react' +import { FloatingPanel, Portal } from '../..' export const Controlled = () => { const [isOpen, setIsOpen] = useState(false) return ( setIsOpen(e.open)}> - setIsOpen(true)}>Toggle Panel + setIsOpen(true)}>Toggle Panel - - - - - Floating Panel + + + + + Floating Panel
- + - - + + - - + + - - + + - +
-
-
- + + +

Some content

-
+ - - - - - - - - -
-
+ + + + + + + + + +
) diff --git a/packages/react/src/components/floating-panel/examples/lazy-mount.tsx b/packages/react/src/components/floating-panel/examples/lazy-mount.tsx index 9163ee63c2..fcb2752183 100644 --- a/packages/react/src/components/floating-panel/examples/lazy-mount.tsx +++ b/packages/react/src/components/floating-panel/examples/lazy-mount.tsx @@ -1,61 +1,46 @@ -import { - FloatingPanel, - FloatingPanelBody, - FloatingPanelCloseTrigger, - FloatingPanelContent, - FloatingPanelDragTrigger, - FloatingPanelHeader, - FloatingPanelMaximizeTrigger, - FloatingPanelMinimizeTrigger, - FloatingPanelPositioner, - FloatingPanelResizeTrigger, - FloatingPanelRestoreTrigger, - FloatingPanelTitle, - FloatingPanelTrigger, - Portal, -} from '../..' +import { FloatingPanel, Portal } from '../..' import { ArrowDownLeft, Maximize2, Minus, XIcon } from 'lucide-react' export const LazyMount = () => ( console.log('onExitComplete invoked')}> - Toggle Panel + Toggle Panel - - - - - Floating Panel + + + + + Floating Panel
- + - - + + - - + + - - + + - +
-
-
- + + +

Some content

-
+ - - - - - - - - -
-
+ + + + + + + + + +
) diff --git a/packages/react/src/components/floating-panel/examples/render-fn.tsx b/packages/react/src/components/floating-panel/examples/render-fn.tsx index c525e52d98..13020867a1 100644 --- a/packages/react/src/components/floating-panel/examples/render-fn.tsx +++ b/packages/react/src/components/floating-panel/examples/render-fn.tsx @@ -1,65 +1,48 @@ -import { - FloatingPanel, - FloatingPanelBody, - FloatingPanelCloseTrigger, - FloatingPanelContent, - FloatingPanelContext, - FloatingPanelDragTrigger, - FloatingPanelHeader, - FloatingPanelMaximizeTrigger, - FloatingPanelMinimizeTrigger, - FloatingPanelPositioner, - FloatingPanelResizeTrigger, - FloatingPanelRestoreTrigger, - FloatingPanelTitle, - FloatingPanelTrigger, - Portal, -} from '../..' - import { ArrowDownLeft, Maximize2, Minus, XIcon } from 'lucide-react' +import { FloatingPanel, Portal } from '../..' export const RenderFn = () => ( - Toggle Panel + Toggle Panel - - - - - Floating Panel + + + + + Floating Panel
- + - - + + - - + + - - + + - +
-
-
- + + +

Some content

-
+ - - - - - - - - -
-
+ + + + + + + + + +
- - {(floatingPanel) =>

floatingPanel is {floatingPanel.open ? 'open' : 'closed'}

} -
+ + {(floatingPanel) =>

floatingPanel. is {floatingPanel.open ? 'open' : 'closed'}

} +
) diff --git a/packages/react/src/components/floating-panel/floating-panel-root-provider.tsx b/packages/react/src/components/floating-panel/floating-panel-root-provider.tsx index 76d1a0a151..37437a5ef2 100644 --- a/packages/react/src/components/floating-panel/floating-panel-root-provider.tsx +++ b/packages/react/src/components/floating-panel/floating-panel-root-provider.tsx @@ -1,6 +1,7 @@ import { mergeProps } from '@zag-js/react' import type { ReactNode } from 'react' import { RenderStrategyPropsProvider, splitRenderStrategyProps } from '../../utils/render-strategy' +import type { PolymorphicProps } from '../factory' import type { UsePresenceProps } from '../presence' import { PresenceProvider, usePresence } from '../presence' import { splitPresenceProps } from '../presence/split-presence-props' @@ -11,7 +12,10 @@ interface RootProviderProps { value: UseFloatingPanelReturn } -export interface FloatingPanelRootProviderBaseProps extends RootProviderProps, UsePresenceProps {} +export interface FloatingPanelRootProviderBaseProps + extends RootProviderProps, + UsePresenceProps, + PolymorphicProps {} export interface FloatingPanelRootProviderProps extends FloatingPanelRootProviderBaseProps { children?: ReactNode } diff --git a/packages/react/src/components/floating-panel/floating-panel-title.tsx b/packages/react/src/components/floating-panel/floating-panel-title.tsx index 9e5af68646..f272d95edc 100644 --- a/packages/react/src/components/floating-panel/floating-panel-title.tsx +++ b/packages/react/src/components/floating-panel/floating-panel-title.tsx @@ -4,14 +4,14 @@ import { type HTMLProps, type PolymorphicProps, ark } from '../factory' import { useFloatingPanelContext } from './use-floating-panel-context' export interface FloatingPanelTitleBaseProps extends PolymorphicProps {} -export interface FloatingPanelTitleProps extends HTMLProps<'p'>, FloatingPanelTitleBaseProps {} +export interface FloatingPanelTitleProps extends HTMLProps<'h2'>, FloatingPanelTitleBaseProps {} export const FloatingPanelTitle = forwardRef( (props, ref) => { const floatingPanel = useFloatingPanelContext() const mergedProps = mergeProps(floatingPanel.getTitleProps(), props) - return + return }, ) diff --git a/packages/react/src/components/floating-panel/floating-panel.ts b/packages/react/src/components/floating-panel/floating-panel.ts index a7a9ba2b4e..55af52e8c0 100644 --- a/packages/react/src/components/floating-panel/floating-panel.ts +++ b/packages/react/src/components/floating-panel/floating-panel.ts @@ -14,6 +14,10 @@ export { type FloatingPanelContentProps as ContentProps, type FloatingPanelContentBaseProps as ContentBaseProps, } from './floating-panel-content' +export { + FloatingPanelContext as Context, + type FloatingPanelContextProps as ContextProps, +} from './floating-panel-context' export { FloatingPanelDock as Dock, type FloatingPanelDockProps as DockProps, diff --git a/packages/react/src/components/floating-panel/tests/basic.tsx b/packages/react/src/components/floating-panel/tests/basic.tsx index d6efc209e4..a93e1dec0a 100644 --- a/packages/react/src/components/floating-panel/tests/basic.tsx +++ b/packages/react/src/components/floating-panel/tests/basic.tsx @@ -1,32 +1,34 @@ -import { FloatingPanel, type FloatingPanelRootProps } from '../..' +import { FloatingPanel, type FloatingPanelRootProps, Portal } from '../..' export const ComponentUnderTest = (props: FloatingPanelRootProps) => ( Open FloatingPanel - - - - - FloatingPanel Title - minimize window - maximize window - restore window - close window - - - -

Some content

-
- - - - - - - - -
-
+ + + + + + FloatingPanel Title + minimize window + maximize window + restore window + close window + + + +

Some content

+
+ + + + + + + + +
+
+
) From 363665a160b0a995de553825a57ef577b94e2908 Mon Sep 17 00:00:00 2001 From: Matheus Verissimo Date: Fri, 30 Aug 2024 21:13:39 -0300 Subject: [PATCH 3/4] build(packages): update --- bun.lockb | Bin 952068 -> 952780 bytes packages/react/.storybook/main.css | 1 + packages/react/package.json | 1 + 3 files changed, 2 insertions(+) diff --git a/bun.lockb b/bun.lockb index 86a90aed29fc9920a0f38fb46d917fcf02427a91..1ed11cac42b3ec739d8c9275dbe3795087feb1f7 100755 GIT binary patch delta 101465 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
7<;&>Kiq8Tq=~g{0AUF})YH5x% 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 Date: Tue, 22 Oct 2024 20:28:24 -0300 Subject: [PATCH 4/4] feat(floating-panel): update types --- .../src/components/floating-panel/floating-panel-content.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/react/src/components/floating-panel/floating-panel-content.tsx b/packages/react/src/components/floating-panel/floating-panel-content.tsx index 3b16fdf84e..daa6427056 100644 --- a/packages/react/src/components/floating-panel/floating-panel-content.tsx +++ b/packages/react/src/components/floating-panel/floating-panel-content.tsx @@ -1,5 +1,6 @@ import { mergeProps } from '@zag-js/react' import { forwardRef } from 'react' +import { composeRefs } from '../../utils/compose-refs' import { type HTMLProps, type PolymorphicProps, ark } from '../factory' import { usePresenceContext } from '../presence' import { useFloatingPanelContext } from './use-floating-panel-context' @@ -15,7 +16,7 @@ export const FloatingPanelContent = forwardRef + return }, )