Components
Controlled overlay dialog with an active flag and onClose handler that locks page scroll while open. Supports center, bottom, start, end and full-screen positions with matching slide animations, custom size and padding, Modal.Title/Subtitle composition with the Dismissible utility, focus management and a transparent overlay mode for side panels.
npx @21st-dev/cli add reshaped/reshaped-modalLoading preview...
import * as React from "react";
import {
Button,
Dismissible,
Reshaped,
TextField,
useToggle,
View,
} from "reshaped/bundle";
import Modal from "@/components/ui/reshaped-modal";
function Component() {
const { active, activate, deactivate } = useToggle(false);
const inputRef = React.useRef<HTMLInputElement>(null);
const handleOpen = () => inputRef.current?.focus();
return (
<>
<Button onClick={activate}>Open modal</Button>
<Modal active={active} onClose={deactivate} onAfterOpen={handleOpen}>
<View gap={3}>
<Dismissible onClose={deactivate} closeAriaLabel="Close modal">
<Modal.Title>Modal title</Modal.Title>
<Modal.Subtitle>Modal subtitle</Modal.Subtitle>
</Dismissible>
<Button onClick={() => {}}>Focusable button</Button>
<TextField
name="name"
placeholder="Enter your name"
inputAttributes={{ ref: inputRef }}
/>
</View>
</Modal>
</>
);
}
export default function Demo() {
return (
<Reshaped theme="slate">
<div style={{ margin: "0 auto", padding: 24, display: "flex", justifyContent: "center" }}>
<Component />
</div>
</Reshaped>
);
}
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...