{% comment %} Button Component - Unified Django Template Version of shadcn/ui Button A versatile button component that supports multiple variants, sizes, icons, and both button/link elements. Compatible with HTMX and Alpine.js. Usage Examples: Basic button: {% include 'components/ui/button.html' with text='Click me' %} With variant and size: {% include 'components/ui/button.html' with text='Submit' variant='default' size='lg' %} Link button: {% include 'components/ui/button.html' with href='/path' text='Go' type='link' %} With HTMX: {% include 'components/ui/button.html' with text='Load' hx_get='/api/data' hx_target='#target' %} With Alpine.js: {% include 'components/ui/button.html' with text='Toggle' x_on_click='open = !open' %} With SVG icon (preferred): {% include 'components/ui/button.html' with icon=search_icon_svg text='Search' %} Icon-only button: {% include 'components/ui/button.html' with icon=icon_svg size='icon' aria_label='Close' %} Parameters: - variant: 'default', 'destructive', 'outline', 'secondary', 'ghost', 'link' (default: 'default') - size: 'default', 'sm', 'lg', 'icon' (default: 'default') - type: 'button', 'submit', 'reset', 'link' (default: 'button') - text: Button text content - label: Alias for text (for backwards compatibility) - content: Alias for text (for backwards compatibility) - href: URL for link buttons (required when type='link') - icon: SVG icon content (will be sanitized) - icon_left: Font Awesome class for left icon (deprecated, prefer icon) - icon_right: Font Awesome class for right icon (deprecated) - disabled: Boolean to disable the button - class: Additional CSS classes - id: Element ID - aria_label: Accessibility label (required for icon-only buttons) - onclick: JavaScript click handler - hx_get, hx_post, hx_target, hx_swap, hx_trigger, hx_indicator, hx_include: HTMX attributes - x_data, x_on_click, x_bind, x_show: Alpine.js attributes - attrs: Additional HTML attributes as string Security: Icon SVGs are sanitized using the sanitize_svg filter to prevent XSS attacks. {% endcomment %} {% load static safe_html %} {% with variant=variant|default:'default' size=size|default:'default' btn_type=type|default:'button' btn_text=text|default:label|default:content %} {% if btn_type == 'link' or href %} {# Link element styled as button #} {% if icon %} {{ icon|sanitize_svg }} {% if btn_text %}{{ btn_text }}{% endif %} {% elif icon_left %} {% if btn_text %}{{ btn_text }}{% endif %} {% else %} {{ btn_text }} {% endif %} {% if icon_right %} {% endif %} {% block link_content %}{% endblock %} {% else %} {# Button element #} {% endif %} {% endwith %}