{# Reusable component macros using Tailwind CSS #} {# Status badge component #} {% macro status_badge(status) %} {% set status_classes = { 'completed': 'bg-status-success/10 text-status-success border border-status-success/30', 'running': 'bg-status-running/10 text-status-running border border-status-running/30', 'failed': 'bg-status-error/10 text-status-error border border-status-error/30', 'pending': 'bg-status-pending/10 text-status-pending border border-status-pending/30' } %} {{ status|capitalize }} {% endmacro %} {# Execution card for sidebar list #} {% macro execution_card(execution, is_selected=false) %}
{{ execution.workflow_name }} {{ status_badge(execution.status) }}
{{ execution.execution_id[:8] }}... {% if execution.started_at %} {{ execution.started_at.split(' ')[1][:5] if ' ' in execution.started_at else execution.started_at }} {% endif %}
{% endmacro %} {# Step card for execution detail view #} {% macro step_card(step, index) %}
{{ index + 1 }}

{{ step.step_name }} {% if step.error %}❌{% endif %}

{{ step.timestamp }}
{% if not step.error %} {% endif %}
Inputs:
{{ step.inputs | tojson(indent=2) }}
Outputs:
{% if step.error %}
❌ Error: {{ step.error }}
{% else %}
{{ step.outputs | tojson(indent=2) }}
{% endif %}
{% endmacro %} {# Empty state component #} {% macro empty_state(title, description, link_text="", link_url="") %}

{{ title }}

{{ description }}

{% if link_text and link_url %} {{ link_text }} {% endif %}
{% endmacro %} {# Code block component #} {% macro code_block(content, size='normal') %} {% set size_classes = { 'small': 'text-xs p-2.5', 'normal': 'text-sm p-4' } %}
{{ content }}
{% endmacro %}