-
-
Notifications
You must be signed in to change notification settings - Fork 227
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Improve * Add tests * Cleanup * Remove only
- Loading branch information
1 parent
fbf0ead
commit db6f58a
Showing
5 changed files
with
253 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,206 @@ | ||
'use client'; | ||
|
||
import { useState } from 'react'; | ||
import { Drawer } from 'vaul'; | ||
|
||
export default function Page() { | ||
const [open, setOpen] = useState(false); | ||
const [fullyControlled, setFullyControlled] = useState(false); | ||
|
||
return ( | ||
<div className="w-screen h-screen bg-white p-8 flex justify-center items-center" vaul-drawer-wrapper=""> | ||
<Drawer.Root open={open}> | ||
<Drawer.Trigger asChild onClick={() => setOpen(true)}> | ||
<button data-testid="trigger" className="text-2xl"> | ||
Open Drawer | ||
</button> | ||
</Drawer.Trigger> | ||
<Drawer.Portal> | ||
<Drawer.Overlay data-testid="overlay" className="fixed inset-0 bg-black/40" /> | ||
<Drawer.Content | ||
data-testid="content" | ||
className="bg-zinc-100 flex flex-col rounded-t-[10px] h-[96%] mt-24 fixed bottom-0 left-0 right-0" | ||
> | ||
<Drawer.Close data-testid="drawer-close">Close</Drawer.Close> | ||
<button data-testid="controlled-close" onClick={() => setOpen(false)} className="text-2xl"> | ||
Close | ||
</button> | ||
<div className="p-4 bg-white rounded-t-[10px] flex-1"> | ||
<div className="mx-auto w-12 h-1.5 flex-shrink-0 rounded-full bg-zinc-300 mb-8" /> | ||
<div className="max-w-md mx-auto"> | ||
<Drawer.Title className="font-medium mb-4">Unstyled drawer for React.</Drawer.Title> | ||
<p className="text-zinc-600 mb-2"> | ||
This component can be used as a replacement for a Dialog on mobile and tablet devices. | ||
</p> | ||
<p className="text-zinc-600 mb-8"> | ||
It uses{' '} | ||
<a | ||
href="https://www.radix-ui.com/docs/primitives/components/dialog" | ||
className="underline" | ||
target="_blank" | ||
> | ||
Radix's Dialog primitive | ||
</a>{' '} | ||
under the hood and is inspired by{' '} | ||
<a | ||
href="https://twitter.com/devongovett/status/1674470185783402496" | ||
className="underline" | ||
target="_blank" | ||
> | ||
this tweet. | ||
</a> | ||
</p> | ||
</div> | ||
</div> | ||
<div className="p-4 bg-zinc-100 border-t border-zinc-200 mt-auto"> | ||
<div className="flex gap-6 justify-end max-w-md mx-auto"> | ||
<a | ||
className="text-xs text-zinc-600 flex items-center gap-0.25" | ||
href="https://github.com/emilkowalski/vaul" | ||
target="_blank" | ||
> | ||
GitHub | ||
<svg | ||
fill="none" | ||
height="16" | ||
stroke="currentColor" | ||
strokeLinecap="round" | ||
strokeLinejoin="round" | ||
strokeWidth="2" | ||
viewBox="0 0 24 24" | ||
width="16" | ||
aria-hidden="true" | ||
className="w-3 h-3 ml-1" | ||
> | ||
<path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"></path> | ||
<path d="M15 3h6v6"></path> | ||
<path d="M10 14L21 3"></path> | ||
</svg> | ||
</a> | ||
<a | ||
className="text-xs text-zinc-600 flex items-center gap-0.25" | ||
href="https://twitter.com/emilkowalski_" | ||
target="_blank" | ||
> | ||
<svg | ||
fill="none" | ||
height="16" | ||
stroke="currentColor" | ||
strokeLinecap="round" | ||
strokeLinejoin="round" | ||
strokeWidth="2" | ||
viewBox="0 0 24 24" | ||
width="16" | ||
aria-hidden="true" | ||
className="w-3 h-3 ml-1" | ||
> | ||
<path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"></path> | ||
<path d="M15 3h6v6"></path> | ||
<path d="M10 14L21 3"></path> | ||
</svg> | ||
</a> | ||
</div> | ||
</div> | ||
</Drawer.Content> | ||
</Drawer.Portal> | ||
</Drawer.Root> | ||
<Drawer.Root open={fullyControlled} onOpenChange={(o) => setFullyControlled(o)}> | ||
<Drawer.Trigger asChild> | ||
<button data-testid="fully-controlled-trigger" className="text-2xl"> | ||
Open Drawer | ||
</button> | ||
</Drawer.Trigger> | ||
<Drawer.Portal> | ||
<Drawer.Overlay data-testid="overlay" className="fixed inset-0 bg-black/40" /> | ||
<Drawer.Content | ||
data-testid="fully-controlled-content" | ||
className="bg-zinc-100 flex flex-col rounded-t-[10px] h-[96%] mt-24 fixed bottom-0 left-0 right-0" | ||
> | ||
<Drawer.Close data-testid="drawer-close">Close</Drawer.Close> | ||
<button data-testid="controlled-close" onClick={() => setOpen(false)} className="text-2xl"> | ||
Close | ||
</button> | ||
<div className="p-4 bg-white rounded-t-[10px] flex-1"> | ||
<div className="mx-auto w-12 h-1.5 flex-shrink-0 rounded-full bg-zinc-300 mb-8" /> | ||
<div className="max-w-md mx-auto"> | ||
<Drawer.Title className="font-medium mb-4">Unstyled drawer for React.</Drawer.Title> | ||
<p className="text-zinc-600 mb-2"> | ||
This component can be used as a replacement for a Dialog on mobile and tablet devices. | ||
</p> | ||
<p className="text-zinc-600 mb-8"> | ||
It uses{' '} | ||
<a | ||
href="https://www.radix-ui.com/docs/primitives/components/dialog" | ||
className="underline" | ||
target="_blank" | ||
> | ||
Radix's Dialog primitive | ||
</a>{' '} | ||
under the hood and is inspired by{' '} | ||
<a | ||
href="https://twitter.com/devongovett/status/1674470185783402496" | ||
className="underline" | ||
target="_blank" | ||
> | ||
this tweet. | ||
</a> | ||
</p> | ||
</div> | ||
</div> | ||
<div className="p-4 bg-zinc-100 border-t border-zinc-200 mt-auto"> | ||
<div className="flex gap-6 justify-end max-w-md mx-auto"> | ||
<a | ||
className="text-xs text-zinc-600 flex items-center gap-0.25" | ||
href="https://github.com/emilkowalski/vaul" | ||
target="_blank" | ||
> | ||
GitHub | ||
<svg | ||
fill="none" | ||
height="16" | ||
stroke="currentColor" | ||
strokeLinecap="round" | ||
strokeLinejoin="round" | ||
strokeWidth="2" | ||
viewBox="0 0 24 24" | ||
width="16" | ||
aria-hidden="true" | ||
className="w-3 h-3 ml-1" | ||
> | ||
<path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"></path> | ||
<path d="M15 3h6v6"></path> | ||
<path d="M10 14L21 3"></path> | ||
</svg> | ||
</a> | ||
<a | ||
className="text-xs text-zinc-600 flex items-center gap-0.25" | ||
href="https://twitter.com/emilkowalski_" | ||
target="_blank" | ||
> | ||
<svg | ||
fill="none" | ||
height="16" | ||
stroke="currentColor" | ||
strokeLinecap="round" | ||
strokeLinejoin="round" | ||
strokeWidth="2" | ||
viewBox="0 0 24 24" | ||
width="16" | ||
aria-hidden="true" | ||
className="w-3 h-3 ml-1" | ||
> | ||
<path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"></path> | ||
<path d="M15 3h6v6"></path> | ||
<path d="M10 14L21 3"></path> | ||
</svg> | ||
</a> | ||
</div> | ||
</div> | ||
</Drawer.Content> | ||
</Drawer.Portal> | ||
</Drawer.Root> | ||
</div> | ||
); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
import { expect, test } from '@playwright/test'; | ||
import { ANIMATION_DURATION } from './constants'; | ||
|
||
test.beforeEach(async ({ page }) => { | ||
await page.goto('/controlled'); | ||
}); | ||
|
||
test.describe('Initial-snap', () => { | ||
test('should not close when clicked on overlay and only the open prop is passsed', async ({ page }) => { | ||
await expect(page.getByTestId('content')).not.toBeVisible(); | ||
await page.getByTestId('trigger').click(); | ||
await expect(page.getByTestId('content')).toBeVisible(); | ||
// Click on the background | ||
await page.mouse.click(0, 0); | ||
|
||
await page.waitForTimeout(ANIMATION_DURATION); | ||
await expect(page.getByTestId('content')).toBeVisible(); | ||
}); | ||
|
||
test('should close when clicked on overlay and open and onOpenChange props are passed', async ({ page }) => { | ||
await expect(page.getByTestId('fully-controlled-content')).not.toBeVisible(); | ||
await page.getByTestId('fully-controlled-trigger').click(); | ||
await expect(page.getByTestId('fully-controlled-content')).toBeVisible(); | ||
// Click on the background | ||
await page.mouse.click(0, 0); | ||
|
||
await page.waitForTimeout(ANIMATION_DURATION); | ||
await expect(page.getByTestId('fully-controlled-content')).not.toBeVisible(); | ||
}); | ||
}); |