Components

Modal

A dialog that grows out of the button that opened it, and shrinks back into it. Drag the header down to dismiss.

Paste it into ChatGPT, Claude, Cursor or v0.
width480

Usage

React
import { Modal, Button } from '@vizzele/react';

const [open, setOpen] = useState(false);
const trigger = useRef(null);

<Button ref={trigger} onClick={() => setOpen(true)}>New project</Button>
<Modal open={open} onOpenChange={setOpen} originRef={trigger} title="New project">
  …
</Modal>

Props

PropTypeDefaultDescription
open / onOpenChangeboolean / (open) => void—Controlled state.
originRefRefObject<HTMLElement>—Element to morph from (default: the focused element).
title / descriptionReactNode—Accessible name and description.
widthnumber | string520Max width.
dismissiblebooleantrueEscape, backdrop and drag-down close it.

Accessibility

  • role="dialog" + aria-modal; focus moves inside, Tab is trapped, Escape closes, focus returns to the trigger.
  • Page scroll is locked while open. Reduced motion: a simple fade.