mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-23 05:11:10 -05:00
95 lines
3.5 KiB
HTML
95 lines
3.5 KiB
HTML
{% comment %}
|
|
Modal Base Component
|
|
====================
|
|
|
|
A flexible, accessible modal dialog component with Alpine.js integration.
|
|
|
|
Purpose:
|
|
Provides a base modal structure with backdrop, header, body, and footer
|
|
sections. Includes keyboard navigation (ESC to close), focus trapping,
|
|
and proper ARIA attributes for accessibility.
|
|
|
|
Usage Examples:
|
|
Basic modal:
|
|
{% include 'components/modals/modal_base.html' with modal_id='my-modal' title='Modal Title' %}
|
|
{% block modal_body %}
|
|
<p>Modal content here</p>
|
|
{% endblock %}
|
|
{% endinclude %}
|
|
|
|
Modal with footer:
|
|
<div x-data="{ showModal: false }">
|
|
<button @click="showModal = true">Open Modal</button>
|
|
{% include 'components/modals/modal_base.html' with modal_id='confirm-modal' title='Confirm Action' show_var='showModal' %}
|
|
{% block modal_body %}
|
|
<p>Are you sure?</p>
|
|
{% endblock %}
|
|
{% block modal_footer %}
|
|
<button @click="showModal = false" class="btn-secondary">Cancel</button>
|
|
<button @click="confirmAction(); showModal = false" class="btn-primary">Confirm</button>
|
|
{% endblock %}
|
|
{% endinclude %}
|
|
</div>
|
|
|
|
Different sizes:
|
|
{% include 'components/modals/modal_base.html' with modal_id='lg-modal' title='Large Modal' size='lg' %}
|
|
|
|
Parameters:
|
|
Required:
|
|
- modal_id: Unique identifier for the modal (used for ARIA and targeting)
|
|
|
|
Optional:
|
|
- title: Modal title text (if empty, header section is hidden)
|
|
- size: Size variant 'sm', 'md', 'lg', 'xl', 'full' (default: 'md')
|
|
- show_close_button: Show X button in header (default: True)
|
|
- show_var: Alpine.js variable name for show/hide state (default: 'show')
|
|
- close_on_backdrop: Close when clicking backdrop (default: True)
|
|
- close_on_escape: Close when pressing Escape (default: True)
|
|
- prevent_scroll: Prevent body scroll when open (default: True)
|
|
|
|
Blocks:
|
|
- modal_header: Custom header content (replaces default header)
|
|
- modal_body: Main modal content (required)
|
|
- modal_footer: Footer content (optional)
|
|
|
|
Dependencies:
|
|
- Alpine.js for interactivity
|
|
- Tailwind CSS for styling
|
|
- Font Awesome icons (for close button)
|
|
|
|
Accessibility:
|
|
- Uses dialog role with aria-modal="true"
|
|
- Focus is trapped within modal when open
|
|
- ESC key closes the modal
|
|
- aria-labelledby points to title
|
|
- aria-describedby available for body content
|
|
{% endcomment %}
|
|
|
|
{# Default values #}
|
|
{% with size=size|default:'md' show_close_button=show_close_button|default:True show_var=show_var|default:'show' close_on_backdrop=close_on_backdrop|default:True close_on_escape=close_on_escape|default:True prevent_scroll=prevent_scroll|default:True %}
|
|
|
|
{# Size classes mapping #}
|
|
{% if size == 'sm' %}
|
|
{% with size_class='max-w-sm' %}
|
|
{% include 'components/modals/modal_inner.html' %}
|
|
{% endwith %}
|
|
{% elif size == 'lg' %}
|
|
{% with size_class='max-w-2xl' %}
|
|
{% include 'components/modals/modal_inner.html' %}
|
|
{% endwith %}
|
|
{% elif size == 'xl' %}
|
|
{% with size_class='max-w-4xl' %}
|
|
{% include 'components/modals/modal_inner.html' %}
|
|
{% endwith %}
|
|
{% elif size == 'full' %}
|
|
{% with size_class='max-w-full mx-4' %}
|
|
{% include 'components/modals/modal_inner.html' %}
|
|
{% endwith %}
|
|
{% else %}
|
|
{% with size_class='max-w-lg' %}
|
|
{% include 'components/modals/modal_inner.html' %}
|
|
{% endwith %}
|
|
{% endif %}
|
|
|
|
{% endwith %}
|