import * as React from 'react'; import { useArgs } from '@storybook/client-api'; import { ComponentMeta, ComponentStory } from '@storybook/react'; import scrollable from '../storybook/decorators/scrollable'; import { extendStory } from '../storybook/utils'; import { Transition } from 'react-transition-group'; import Button from '../storybook/Button'; import Flyout from '../storybook/Flyout'; import PositioningPortal, { defaultPositionStrategy, PositioningStrategy, } from './PositioningPortal'; export default { title: 'PositioningPortal', component: PositioningPortal, decorators: [ (story, context) => { const [, updateArgs] = useArgs(); return story({ args: { ...context.args, onOpen: () => updateArgs({ isOpen: true }), onClose: () => updateArgs({ isOpen: false }), onShouldClose: () => updateArgs({ isOpen: false }), children: ( ), }, }); }, ], } as ComponentMeta; export const Base: ComponentStory = (args) => { return ; }; Base.args = { children: null, isOpen: false, positionStrategy: defaultPositionStrategy as PositioningStrategy, portalContent: ({ close }) => ( Flyout positioned with portal. ), }; export const ScrollableTest = extendStory(Base); ScrollableTest.decorators = [scrollable]; export const WithAnimation = extendStory(Base, { portalContent: ({ isOpen, isPositioned, transitionStarted, transitionEnded, close, }) => ( addEndListener={(node, done) => { node.addEventListener('transitionend', done, false); }} in={isOpen && isPositioned} onEnter={transitionStarted} onExited={transitionEnded} > {(state) => ( Flyout positioned with portal. )} ), }); export const SameWidthAsParent = extendStory(Base, { portalContent: ({ close, relatedWidth }) => ( Flyout positioned with portal. ), }); export const NoClickOutsideClose = extendStory(Base, { closeOnOutsideClick: false, }); export const CloseOnKeydownQ = extendStory(Base, { closeOnKeyDown: (event: KeyboardEvent) => event.code === 'KeyQ', });