WARNING: This component is in
Draft
status. This means that it is still in development and may have bugs or missing features. It is not intended to be used in production. You may use it for testing purposes.Modal
A window overlaid on either the primary window or another modal window, rendering the content underneath inert.
import { component$, useSignal } from '@builder.io/qwik';
import { cn } from '@qwik-ui/utils';
import { LuX } from '@qwikest/icons/lucide';
import { Button, Input, Label, Modal, buttonVariants } from '~/components/ui';
export default component$(() => {
const show = useSignal(false);
return (
<Modal.Root bind:show={show}>
<Modal.Trigger class={[buttonVariants({ look: 'outline' })]}>
Open modal
</Modal.Trigger>
<Modal.Panel>
<Modal.Title>Edit Profile</Modal.Title>
<Modal.Description>
Make changes to your profile here. Click save when you're done.
</Modal.Description>
<div class="grid gap-4 py-4">
<div class="grid grid-cols-4 items-center gap-4">
<Label for="name" class="text-right">
Name
</Label>
<Input name="name" id="name" defaultValue="Pedro Duarte" class="col-span-3" />
</div>
<div class="grid grid-cols-4 items-center gap-4">
<Label for="username" class="text-right">
Username
</Label>
<Input
name="username"
id="username"
defaultValue="@peduarte"
class="col-span-3"
/>
</div>
</div>
<footer>
<Button look="primary" onClick$={() => (show.value = false)}>
Save
</Button>
</footer>
<Modal.Close
class={cn(
buttonVariants({ size: 'icon', look: 'link' }),
'absolute right-3 top-2',
)}
type="submit"
>
<LuX class="h-5 w-5" />
</Modal.Close>
</Modal.Panel>
</Modal.Root>
);
});
Installation
Run the following cli command or copy/paste the component code into your project
Usage
Examples
import { PropsOf, Slot, component$, useSignal } from '@builder.io/qwik';
import { cn } from '@qwik-ui/utils';
import { LuX } from '@qwikest/icons/lucide';
import { Button, Input, Label, Modal, buttonVariants } from '~/components/ui';
export default component$(() => {
return (
<>
<Sheet position="top">Top</Sheet>
<div class="my-4 flex space-x-24">
<Sheet position="left">Left</Sheet>
<Sheet position="right">Right</Sheet>
</div>
<Sheet position="bottom">Bottom</Sheet>
</>
);
});
export const Sheet = component$<PropsOf<typeof Modal.Panel>>(({ ...props }) => {
const show = useSignal(false);
return (
<Modal.Root bind:show={show}>
<Modal.Trigger class={[buttonVariants({ look: 'ghost' }), 'w-20']}>
<Slot />
</Modal.Trigger>
<Modal.Panel {...props}>
<Modal.Title>Edit Profile</Modal.Title>
<Modal.Description>
Make changes to your profile here. Click save when you're done.
</Modal.Description>
<div class="mt-6">
<Label for="name" class="text-right">
Name
</Label>
<Input
name="name"
id="name"
defaultValue="Pedro Duarte"
class="col-span-3 w-[300px]"
/>
</div>
<footer class="mt-6">
<Button look="primary" onClick$={() => (show.value = false)}>
Save
</Button>
</footer>
<Modal.Close
class={cn(
buttonVariants({ size: 'icon', look: 'link' }),
'absolute right-3 top-2',
)}
type="submit"
>
<LuX class="h-5 w-5" />
</Modal.Close>
</Modal.Panel>
</Modal.Root>
);
});