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',
});