{# Feedback Components Macros: badge, severity_badge, status_badge, alert, empty_state, loading_spinner, progress_bar, tooltip, modal, confirmation_dialog #} {% macro badge(text, variant="info") %} {% set variants = { "critical": "bg-red-500/20 text-red-400", "high": "bg-orange-500/20 text-orange-400", "medium": "bg-yellow-500/20 text-yellow-400", "low": "bg-blue-500/20 text-blue-400", "info": "bg-gray-500/20 text-gray-400", "safe": "bg-green-500/20 text-green-400", "success": "bg-green-500/20 text-green-400", "warning": "bg-yellow-500/20 text-yellow-400", "error": "bg-red-500/20 text-red-400", "primary": "bg-blue-500/20 text-blue-400" } %} {{ text }} {% endmacro %} {% macro severity_badge(severity) %} {# Convenience macro for severity levels #} {% set severity_lower = severity | lower %} {% if severity_lower == "critical" %} {{ badge(severity | upper, "critical") }} {% elif severity_lower == "high" %} {{ badge(severity | upper, "high") }} {% elif severity_lower == "medium" %} {{ badge(severity | upper, "medium") }} {% elif severity_lower == "low" %} {{ badge(severity | upper, "low") }} {% elif severity_lower in ["safe", "ok", "good"] %} {{ badge(severity | upper, "safe") }} {% else %} {{ badge(severity, "info") }} {% endif %} {% endmacro %} {% macro status_badge(status) %} {# Convenience macro for status indicators #} {% set status_lower = status | lower %} {% if status_lower in ["active", "running", "online", "connected", "healthy"] %} {{ badge(status, "success") }} {% elif status_lower in ["pending", "waiting", "queued"] %} {{ badge(status, "warning") }} {% elif status_lower in ["error", "failed", "offline", "disconnected", "unhealthy"] %} {{ badge(status, "error") }} {% elif status_lower in ["paused", "stopped", "inactive"] %} {{ badge(status, "info") }} {% else %} {{ badge(status, "info") }} {% endif %} {% endmacro %} {% macro alert(message, variant="info", dismissible=false, icon="") %} {% set variants = { "info": "bg-blue-500/10 border-blue-500/30 text-blue-400", "success": "bg-green-500/10 border-green-500/30 text-green-400", "warning": "bg-yellow-500/10 border-yellow-500/30 text-yellow-400", "error": "bg-red-500/10 border-red-500/30 text-red-400" } %} {% set default_icons = { "info": "info", "success": "check-circle", "warning": "alert-triangle", "error": "circle-x" } %}
{{ message }}
{% if dismissible %} {% endif %}
{% endmacro %} {% macro empty_state(message, icon="inbox", action_text="", action_url="", action_onclick="") %}
{{ message }}
{% if action_text %} {% if action_url %} {{ action_text }} {% elif action_onclick %} {% endif %} {% endif %}
{% endmacro %} {% macro loading_spinner(size="md", message="") %} {% set sizes = { "sm": "h-4 w-4 border-2", "md": "h-8 w-8 border-2", "lg": "h-12 w-12 border-3" } %}
{% if message %}
{{ message }}
{% endif %}
{% endmacro %} {% macro progress_bar(value, max=100, color="blue", show_label=false) %} {% set percentage = (value / max * 100) | int %}
{% if show_label %}
{{ percentage }}%
{% endif %}
{% endmacro %} {% macro tooltip(text, position="top") %} {# Wrap content in this macro for tooltip #} {% set positions = { "top": "bottom-full left-1/2 -translate-x-1/2 mb-2", "bottom": "top-full left-1/2 -translate-x-1/2 mt-2", "left": "right-full top-1/2 -translate-y-1/2 mr-2", "right": "left-full top-1/2 -translate-y-1/2 ml-2" } %}
{{ caller() }}
{% endmacro %} {% macro modal(id, title, event="", max_width="max-w-lg", icon="", danger=false, close_event="") %} {# Generic modal wrapper for arbitrary content. Use with {% call %}. Opens via Alpine event dispatch: $dispatch('open-{id}') or custom event name. Args: id: Unique modal ID (used for DOM id and events) title: Modal header title event: Custom open event name (default: "open-{id}") max_width: Tailwind max-width class (default "max-w-lg") icon: Optional Lucide icon in header danger: Red-tinted header if true close_event: Optional event name dispatched on close Usage: {% call modal(id="edit-user", title="Edit User", icon="user") %}
...
{% endcall %} #} {% set open_event = event or ("open-" ~ id) %}
{% if icon %} {% endif %}

{{ title }}

{{ caller() }}
{% endmacro %} {% macro confirmation_dialog(id, title, message, confirm_text="Confirm", cancel_text="Cancel", danger=false) %} {# Modal dialog for confirmations. Use with Alpine.js #}

{{ title }}

{{ message }}

{% endmacro %}