import React, { useState } from "react"; import { screen, userEvent } from "@storybook/testing-library"; import { expect } from "@storybook/jest"; import { Drawer as Component } from "./"; import { theme } from "../theme"; import { Box } from "../box"; import { Select } from "../select"; import type { Meta, StoryFn } from "@storybook/react"; export default { title: "Drawer", component: Component.Root, subcomponents: { DrawerContent: Component.Content, DrawerTrigger: Component.Trigger, DrawerClose: Component.Close, DrawerCustomTrigger: Component.CustomTrigger, DrawerScrim: Component.Scrim, }, args: { id: "drawer-id", }, } as Meta; // eslint-disable-next-line @typescript-eslint/no-explicit-any const Template: StoryFn = (args) => { const [open, setOpen] = useState(false); const handleChange = (val) => { setOpen(val); }; return ( Trigger Drawer Custom Trigger Drawer ); }; export const Drawer = { render: Template, parameters: { chromatic: { disableSnapshot: true }, }, }; // eslint-disable-next-line @typescript-eslint/no-explicit-any const FocusTemplate: StoryFn = ({ loopFocus, ...args }) => ( Trigger Drawer Menu ); export const Focus = { render: FocusTemplate, args: { loopFocus: true, }, parameters: { chromatic: { disableSnapshot: true }, }, }; // eslint-disable-next-line @typescript-eslint/no-explicit-any const PositionTemplate: StoryFn = () => ( <> Top Drawer
Left Drawer Right Drawer
Bottom Drawer ); export const Position = { render: PositionTemplate, parameters: { chromatic: { disableSnapshot: true }, }, }; // eslint-disable-next-line @typescript-eslint/no-explicit-any const AutoSizeTemplate: StoryFn = () => { const text = [ `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Vestibulum morbi blandit cursus risus at ultrices mi. Sit amet facilisis magna etiam. Pellentesque pulvinar pellentesque habitant morbi tristique. Id faucibus nisl tincidunt eget nullam non nisi. Donec enim diam vulputate ut pharetra sit. Accumsan lacus vel facilisis volutpat est velit egestas dui. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra. Sed vulputate odio ut enim blandit volutpat maecenas. Sed turpis tincidunt id aliquet risus feugiat. Quam vulputate dignissim suspendisse in est ante in.`, `Scelerisque viverra mauris in aliquam sem fringilla. Adipiscing bibendum est ultricies integer quis auctor elit. Sed elementum tempus egestas sed. Purus non enim praesent elementum. Dictum at tempor commodo ullamcorper a lacus vestibulum sed arcu. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant. Duis at consectetur lorem donec massa sapien faucibus. Viverra adipiscing at in tellus integer feugiat scelerisque varius morbi. Scelerisque purus semper eget duis at tellus at. Elit at imperdiet dui accumsan sit amet. Eu facilisis sed odio morbi quis commodo.`, `Cursus risus at ultrices mi tempus imperdiet. Enim blandit volutpat maecenas volutpat blandit aliquam etiam. Urna molestie at elementum eu facilisis. At erat pellentesque adipiscing commodo elit at imperdiet dui. Sed risus ultricies tristique nulla. Id venenatis a condimentum vitae sapien. Eu non diam phasellus vestibulum. Amet tellus cras adipiscing enim eu turpis egestas pretium aenean. Sem fringilla ut morbi tincidunt augue interdum velit euismod. Eu augue ut lectus arcu bibendum. Pellentesque eu tincidunt tortor aliquam nulla. Neque aliquam vestibulum morbi blandit. Elementum nisi quis eleifend quam adipiscing vitae proin sagittis. Eget egestas purus viverra accumsan in nisl nisi scelerisque eu. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae. Euismod in pellentesque massa placerat duis. Dui sapien eget mi proin sed libero enim. Suspendisse potenti nullam ac tortor vitae purus.`, `Velit egestas dui id ornare arcu odio ut. Sagittis id consectetur purus ut faucibus pulvinar elementum integer enim. Mauris in aliquam sem fringilla ut. Commodo viverra maecenas accumsan lacus vel facilisis volutpat est velit. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Velit egestas dui id ornare arcu. Eu augue ut lectus arcu. Molestie nunc non blandit massa. Amet risus nullam eget felis eget nunc. Non tellus orci ac auctor augue mauris augue neque gravida. Feugiat in ante metus dictum at. Nec tincidunt praesent semper feugiat. Ridiculus mus mauris vitae ultricies leo integer malesuada. Scelerisque in dictum non consectetur a erat. Eget sit amet tellus cras adipiscing enim eu.`, `Vel quam elementum pulvinar etiam non quam lacus suspendisse. Id velit ut tortor pretium viverra. Integer malesuada nunc vel risus commodo viverra maecenas. Ligula ullamcorper malesuada proin libero nunc consequat interdum. Senectus et netus et malesuada fames ac turpis egestas maecenas. Lacus viverra vitae congue eu consequat. Gravida neque convallis a cras. Enim eu turpis egestas pretium. Fringilla ut morbi tincidunt augue interdum velit euismod in pellentesque. Id faucibus nisl tincidunt eget nullam non nisi est sit. Sem et tortor consequat id. Nunc sed velit dignissim sodales ut eu. Egestas egestas fringilla phasellus faucibus scelerisque eleifend donec. Aliquet porttitor lacus luctus accumsan. Orci ac auctor augue mauris augue neque gravida in fermentum.`, ]; const [textLength, setTextLength] = useState(5); return ( Open Drawer setTextLength(parseInt(val, 10))} > Number of paragraphs 1 2 3 4 5 {text.slice(0, textLength).map((currentText, index) => (

{currentText}

))}
); }; export const AutoSize = { render: AutoSizeTemplate, parameters: { chromatic: { disableSnapshot: true }, }, }; // eslint-disable-next-line @typescript-eslint/no-explicit-any const ChromaticTemplate: StoryFn = () => ( <> Drawer Drawer Drawer Drawer ); export const Chromatic = { render: ChromaticTemplate, parameters: { docs: { disable: true }, }, }; // eslint-disable-next-line @typescript-eslint/no-explicit-any const InteractionsTemplate: StoryFn = () => ( Trigger Drawer Content ); export const Interactions = { render: InteractionsTemplate, parameters: { chromatic: { disableSnapshot: true }, }, play: async () => { const trigger = screen.getAllByText("Trigger")[0]; await userEvent.click(trigger); await sleep(300); const content = screen.getAllByText("Drawer Content")[0]; await expect(content).toBeVisible(); const close = screen.getByLabelText("Close Drawer"); await userEvent.click(close); await sleep(300); await expect(content).not.toBeInTheDocument(); }, }; // Function to emulate pausing between interactions function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); }