Modals JS Enhanced
Dialog windows for user notifications, confirmations, prompts, and custom content. Use the simple JavaScript API for best results.
Simple JavaScript API
Focus UI provides one-line functions for common modal patterns.
No need to write HTML - just call Modal.confirm(), Modal.prompt(),
or Modal.deleteConfirm() and you're done!
Confirm Dialog
Show a confirmation dialog with Promise-based handling. Perfect for "Are you sure?" moments:
Modal.confirm({
title: 'Confirm Action',
message: 'Are you sure you want to proceed?',
variant: 'info', // 'info', 'success', 'warning', 'danger'
confirmText: 'Yes, proceed',
cancelText: 'Cancel'
}).then(() => {
console.log('Confirmed!')
// User clicked confirm
}).catch(() => {
console.log('Cancelled')
// User clicked cancel or pressed ESC
})
Delete Confirmation (with Typing)
A safety feature that requires users to type a confirmation text before allowing deletion. Perfect for destructive actions:
Modal.deleteConfirm({
title: 'Delete Project',
message: 'This action cannot be undone.',
entityName: 'MyProject', // User must type this to enable delete
confirmText: 'Delete',
cancelText: 'Cancel'
}).then(() => {
// Delete confirmed
deleteProject()
}).catch(() => {
console.log('Deletion cancelled')
})
Prompt for Input
Get user input with a modal dialog. Supports both text input and textarea:
// Text input
Modal.prompt({
title: 'Rename Item',
message: 'Enter a new name:',
placeholder: 'Item name',
defaultValue: 'Current Name',
type: 'text', // or 'textarea'
required: false,
confirmText: 'Rename',
cancelText: 'Cancel'
}).then(newName => {
console.log('New name:', newName)
}).catch(() => {
console.log('Cancelled')
})
// Textarea input
Modal.prompt({
title: 'Add Note',
message: 'Enter your note:',
type: 'textarea',
placeholder: 'Type your note here...'
}).then(note => {
saveNote(note)
})
Custom Modal (HTML)
For custom layouts, create your modal HTML and use Modal.open() to show it:
<!-- Modal HTML (hidden by default) -->
<div class="focus-modal-overlay" id="customModal" style="display:none;">
<div class="focus-modal">
<div class="focus-modal-header">
<h2>Custom Modal</h2>
<button class="focus-modal-close" onclick="FocusUI.Modal.close('#customModal')">
×
</button>
</div>
<div class="focus-modal-body">
<p>Your custom content here.</p>
</div>
<div class="focus-modal-footer">
<button class="focus-btn focus-btn-secondary"
onclick="FocusUI.Modal.close('#customModal')">
Close
</button>
<button class="focus-btn focus-btn-primary">Save</button>
</div>
</div>
</div>
// Open modal
Modal.open('#customModal', {
focusTrap: true, // Trap focus within modal (default: true)
closeOnEsc: true, // Close on ESC key (default: true)
closeOnOverlay: false // Close on overlay click (default: false)
})
// Close modal
Modal.close('#customModal')
Data Attributes
You can also use data attributes for automatic modal initialization:
<button data-focus-modal="#myModal"> to open,
<button data-focus-modal-close> to close.
Modal Sizes
Control modal width with size modifiers:
<!-- Small (400px) -->
<div class="focus-modal focus-modal-sm">...</div>
<!-- Medium (600px) - default -->
<div class="focus-modal focus-modal-md">...</div>
<!-- Large (800px) -->
<div class="focus-modal focus-modal-lg">...</div>
<!-- Extra Large (1140px) -->
<div class="focus-modal focus-modal-xl">...</div>
<!-- Fullscreen -->
<div class="focus-modal focus-modal-full">...</div>
Modal Variants
Use semantic color variants for different contexts:
<div class="focus-modal focus-modal-info">...</div>
<div class="focus-modal focus-modal-success">...</div>
<div class="focus-modal focus-modal-warning">...</div>
<div class="focus-modal focus-modal-danger">...</div>
Complete JavaScript API
Modal.confirm(config)
Show a confirmation dialog with Promise-based handling.
Modal.confirm({
title: 'Confirm',
message: 'Are you sure?',
variant: 'info', // 'info', 'success', 'warning', 'danger'
confirmText: 'Confirm',
cancelText: 'Cancel'
})
Returns: Promise (resolves on confirm, rejects on cancel)
Modal.deleteConfirm(config)
Confirmation dialog with required text input for safety.
Modal.deleteConfirm({
title: 'Delete',
message: 'This cannot be undone.',
entityName: 'ProjectName', // User must type this
confirmText: 'Delete',
cancelText: 'Cancel'
})
Returns: Promise (resolves on confirm, rejects on cancel)
Modal.prompt(config)
Get user input via text input or textarea.
Modal.prompt({
title: 'Input',
message: 'Enter value:',
placeholder: '',
defaultValue: '',
type: 'text', // 'text' or 'textarea'
required: false,
confirmText: 'OK',
cancelText: 'Cancel'
})
Returns: Promise<string> (resolves with input value, rejects on cancel)
Modal.open(element, options)
Open a custom modal programmatically.
Modal.open('#myModal', {
focusTrap: true, // Trap focus (default: true)
closeOnEsc: true, // Close on ESC (default: true)
closeOnOverlay: false // Close on overlay click (default: false)
})
Modal.close(element)
Close a modal programmatically.
Modal.close('#myModal')
CSS Classes
| Class | Description |
|---|---|
.focus-modal-overlay |
Modal backdrop container |
.focus-modal |
Base modal (required) |
.focus-modal-sm |
Small (400px) |
.focus-modal-lg |
Large (800px) |
.focus-modal-xl |
Extra large (1140px) |
.focus-modal-full |
Fullscreen |
.focus-modal-info |
Info variant (blue) |
.focus-modal-success |
Success variant (green) |
.focus-modal-warning |
Warning variant (yellow) |
.focus-modal-danger |
Danger variant (red) |