import * as React from "react"; import { userEvent, waitFor, within } from "@storybook/testing-library"; import { expect } from "@storybook/jest"; import { Dialog } from "./Dialog"; import { styled, theme, Box, Button, RadioButton, RadioGroup, Select, } from "../"; import type { Meta, StoryFn } from "@storybook/react"; export default { title: "Dialog", component: Dialog.Root, subcomponents: { Content: Dialog.Content, Trigger: Dialog.Trigger, Portal: Dialog.Portal, Overlay: Dialog.Overlay, Title: Dialog.Title, Description: Dialog.Description, }, } as Meta; const DialogContainer = styled("div", { position: "relative", height: "100vh", width: "50vw", marginBlock: "-32px", marginInlineStart: "-16px", display: "flex", alignItems: "center", justifyContent: "center", }); const Template: StoryFn = (args) => { const [container, setContainer] = React.useState(null); return (
Dialog Title Descriptive text of dialog content
); }; export const Default = { render: Template, args: {}, }; const ContentTemplate: StoryFn = (args) => { const [container, setContainer] = React.useState(null); return ( Dialog Title

Lorem ipsum dolor sit, amet consectetur adipisicing elit. Tempora cupiditate possimus aliquid natus cumque? Ratione minus exercitationem consequuntur quis dolor ut possimus earum officiis itaque culpa eveniet vero, laboriosam sit!

Lorem ipsum dolor sit, amet consectetur adipisicing elit. Tempora cupiditate possimus aliquid natus cumque? Ratione minus exercitationem consequuntur quis dolor ut possimus earum officiis itaque culpa eveniet vero, laboriosam sit!

Lorem ipsum dolor sit, amet consectetur adipisicing elit. Tempora cupiditate possimus aliquid natus cumque? Ratione minus exercitationem consequuntur quis dolor ut possimus earum officiis itaque culpa eveniet vero, laboriosam sit!

); }; export const Content = { render: ContentTemplate, }; const ComplexTemplate: StoryFn = (args) => { const [container, setContainer] = React.useState(null); return ( Complex dialog Label/Placeholder Option Option Option Option Option ); }; export const Complex = { render: ComplexTemplate, }; // eslint-disable-next-line @typescript-eslint/no-explicit-any const ContentBackgroundColorTemplate: any = (args) => { const [container, setContainer] = React.useState(null); return ( ); }; export const ContentBackgroundColor = { render: ContentBackgroundColorTemplate, argTypes: { backgroundColor: { control: { type: "color" }, }, }, args: { // eslint-disable-next-line @washingtonpost/wpds/theme-colors backgroundColor: theme.colors.blue500.value, }, }; // eslint-disable-next-line @typescript-eslint/no-explicit-any const OverlayBackgroundColorTemplate: any = (args) => { const [container, setContainer] = React.useState(null); return ( ); }; export const OverlayBackgroundColor = { render: OverlayBackgroundColorTemplate, argTypes: { backgroundColor: { control: { type: "color" }, }, }, args: { // eslint-disable-next-line @washingtonpost/wpds/theme-colors backgroundColor: theme.colors.green500.value, }, }; const SmallTemplate: StoryFn = (args) => { const [container, setContainer] = React.useState(null); return ( Dialog Title

Lorem ipsum dolor sit, amet consectetur adipisicing elit.

); }; export const Small = { render: SmallTemplate, }; const InteractionsTemplate: StoryFn = () => { const [container, setContainer] = React.useState(null); return ( Open Dialog Title

Lorem ipsum

); }; export const Interactions = { render: InteractionsTemplate, play: async ({ canvasElement }) => { const canvas = within(canvasElement); const open = canvas.getByRole("button"); const user = userEvent.setup({ pointerEventsCheck: 0 }); await user.click(open); await waitFor(() => expect(canvas.getByTestId("close-button")).toHaveFocus() ); await user.click(canvas.getByTestId("close-button")); await waitFor(() => expect(open).toHaveFocus()); await user.click(open); await waitFor(() => expect(canvas.getByText("Cancel")).toBeVisible()); await user.click(canvas.getByText("Cancel")); await waitFor(() => expect(open).toHaveFocus()); await user.click(open); await waitFor(() => expect(canvas.getByTestId("overlay")).toBeVisible()); await user.click(canvas.getByTestId("overlay")); await waitFor(() => expect(open).toHaveFocus()); }, }; // eslint-disable-next-line @typescript-eslint/no-explicit-any const ResponsiveInteractionsTemplate: any = () => { const [container, setContainer] = React.useState(null); return ( Open Dialog Title

Lorem ipsum

); }; export const ResponsiveInteractions = { render: ResponsiveInteractionsTemplate, parameters: { viewport: { defaultViewport: "small", viewports: { small: { name: "Small", styles: { height: "590px", width: "767px", }, type: "mobile", }, }, }, chromatic: { modes: { mobile: { viewport: "small" }, }, }, }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await sleep(500); await expect(canvas.getByRole("dialog")).toHaveStyle("width: 300px"); }, }; // Function to emulate pausing between interactions function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); }