Overlay dialogs with ASCII-style borders for important messages and user interactions.
Click any button to open a modal. Press ESC or click outside to close (except static).
npm install react-ascii-ui
import { AsciiModal, AsciiButton } from 'react-ascii-ui';
export default function Example() {
const [isOpen, setIsOpen] = useState(false);
return (
<>
<AsciiButton onClick={() => setIsOpen(true)}>
Open Modal
</AsciiButton>
<AsciiModal
isOpen={isOpen}
onClose={() => setIsOpen(false)}
title="My Modal"
>
<p>Modal content goes here</p>
</AsciiModal>
</>
);
}<AsciiModal
isOpen={isOpen}
onClose={() => setIsOpen(false)}
title="Basic Modal"
>
<p>Your content here</p>
</AsciiModal>{/* Small modal */}
<AsciiModal size="sm" isOpen={isOpen} onClose={onClose}>
<p>Small modal content</p>
</AsciiModal>
{/* Large modal */}
<AsciiModal size="lg" isOpen={isOpen} onClose={onClose}>
<p>Large modal with more space</p>
</AsciiModal><AsciiModal
isOpen={isOpen}
onClose={() => setIsOpen(false)}
backdrop="static"
title="Cannot click outside to close"
>
<p>This modal requires explicit close action</p>
</AsciiModal><AsciiModal
isOpen={isOpen}
onClose={() => setIsOpen(false)}
showCloseButton={false}
title="Custom Controls"
>
<p>Use your own close button</p>
<AsciiButton onClick={() => setIsOpen(false)}>
Custom Close
</AsciiButton>
</AsciiModal>| Prop | Type | Default | Description |
|---|---|---|---|
| isOpen | boolean | - | Whether the modal is visible |
| onClose | () => void | - | Callback function called when modal should close |
| title | string | - | Optional title displayed in modal header |
| children | React.ReactNode | - | Modal body content |
| size | 'sm' | 'md' | 'lg' | 'md' | Modal size variant |
| showCloseButton | boolean | true | Whether to show the [X] close button |
| backdrop | 'static' | 'clickable' | 'clickable' | Whether clicking outside closes the modal |
| className | string | "" | Additional CSS classes for modal container |
Modal automatically handles accessibility features including focus management and ARIA attributes.