import { Fragment, ReactNode } from "react";
import { LayoutGrid } from "lucide-react";
import { DropdownMenu } from "./";
export default {
title: "Dropdown Menu",
component: DropdownMenu,
parameters: {
docs: {
description: {
component:
"Exibe um menu ao usuário, como um conjunto de ações ou funções.",
},
},
},
args: {
disabled: false,
side: "bottom",
sideOffset: 0,
align: "start",
alignOffset: 0,
avoidCollisions: true,
},
argTypes: {
disabled: {
options: [true, false],
control: { type: "boolean" },
description: "Habilita ou desabilita o menu.",
table: {
defaultValue: { summary: "false" },
},
},
side: {
control: "select",
options: ["top", "right", "bottom", "left"],
description: "Posiciona o menu em relação ao trigger.",
table: {
defaultValue: { summary: "bottom" },
},
},
sideOffset: {
control: "number",
description: "Desloca o menu em relação ao trigger.",
table: {
defaultValue: { summary: "0" },
},
},
align: {
control: "select",
options: ["start", "center", "end"],
description: "Alinha o menu em relação ao trigger.",
table: {
defaultValue: { summary: "start" },
},
},
alignOffset: {
control: "number",
description: "Desloca o menu em relação ao trigger.",
table: {
defaultValue: { summary: "0" },
},
},
avoidCollisions: {
options: [true, false],
control: { type: "boolean" },
description: "Evita que o menu colida com a borda da tela.",
table: {
defaultValue: { summary: "true" },
},
},
},
};
const BaseItems = (disabled: boolean, leftIcon: boolean, rightIcon: boolean) =>
[...Array(10).keys()].map((item) => (
{leftIcon && (
)}
Item {item + 1}
{rightIcon && (
)}
));
type BaseMenuProps = {
disabled: boolean;
side: "left" | "right" | "bottom" | "top" | undefined;
sideOffset: number;
align: "center" | "end" | "start" | undefined;
alignOffset: number;
avoidCollisions: boolean;
};
const BaseMenu = (
{
disabled,
side,
sideOffset,
align,
alignOffset,
avoidCollisions,
}: BaseMenuProps,
items: () => ReactNode
) => (
Items
Título
{items()}
);
interface TemplateProps {
(args: BaseMenuProps): JSX.Element;
storyName?: string;
}
const IconsLeftTemplate = ({
disabled,
side,
sideOffset,
align,
alignOffset,
avoidCollisions,
}: BaseMenuProps) =>
BaseMenu(
{ disabled, side, sideOffset, align, alignOffset, avoidCollisions },
() => BaseItems(false, true, false)
);
export const IconsLeft: TemplateProps = IconsLeftTemplate;
IconsLeft.storyName = "Ícones à esquerda";
const IconsRightTemplate = ({
disabled,
side,
sideOffset,
align,
alignOffset,
avoidCollisions,
}: BaseMenuProps) =>
BaseMenu(
{ disabled, side, sideOffset, align, alignOffset, avoidCollisions },
() => BaseItems(false, false, true)
);
export const IconsRight: TemplateProps = IconsRightTemplate;
IconsRight.storyName = "Ícones à direita";
const WithoutIconsTemplate = ({
disabled,
side,
sideOffset,
align,
alignOffset,
avoidCollisions,
}: BaseMenuProps) =>
BaseMenu(
{ disabled, side, sideOffset, align, alignOffset, avoidCollisions },
() => BaseItems(false, false, false)
);
export const WithoutIcon: TemplateProps = WithoutIconsTemplate;
WithoutIcon.storyName = "Sem ícones";
const IconsLeftOneDisabledTemplate = ({
disabled,
side,
sideOffset,
align,
alignOffset,
avoidCollisions,
}: BaseMenuProps) =>
BaseMenu(
{ disabled, side, sideOffset, align, alignOffset, avoidCollisions },
() => BaseItems(true, true, false)
);
export const IconsLeftOneDisabled: TemplateProps = IconsLeftOneDisabledTemplate;
IconsLeftOneDisabled.storyName = "Ícones à esquerda com item desabilitado";
const IconsRightOneDisabledTemplate = ({
disabled,
side,
sideOffset,
align,
alignOffset,
avoidCollisions,
}: BaseMenuProps) =>
BaseMenu(
{ disabled, side, sideOffset, align, alignOffset, avoidCollisions },
() => BaseItems(true, false, true)
);
export const IconsRightOneDisabled: TemplateProps =
IconsRightOneDisabledTemplate;
IconsRightOneDisabled.storyName = "Ícones à direita com item desabilitado";
const WithoutIconsOneDisabledTemplate = ({
disabled,
side,
sideOffset,
align,
alignOffset,
avoidCollisions,
}: BaseMenuProps) =>
BaseMenu(
{ disabled, side, sideOffset, align, alignOffset, avoidCollisions },
() => BaseItems(true, false, false)
);
export const WithoutIconOneDisabled: TemplateProps =
WithoutIconsOneDisabledTemplate;
WithoutIconOneDisabled.storyName = "Sem ícones com item desabilitado";