{# Pure data table. Swapped via HTMX `hx-get` on filter input changes. Self-contained — gets re-rendered without the outer page chrome. #}
{% if rows %} {% for row in rows %} {# Score: pill + tiny progress bar #} {# Status code with semantic colour #} {# Full reasoning lives in the title tooltip; the cell truncates to one line so it always fits. #} {% endfor %}
Score FQDN Code Title Tech Reasoning
{% if row.score is none %} {% else %}
{{ row.score }}
{% endif %}
{{ row.fqdn }} {% if row.status_code is none %} {% elif row.status_code in [401, 403] %} {{ row.status_code }} {% elif row.status_code >= 500 %} {{ row.status_code }} {% elif row.status_code >= 400 %} {{ row.status_code }} {% else %} {{ row.status_code }} {% endif %} {{ row.title or "—" }} {{ row.technologies|join(" · ") }} {{ row.reasoning or "—" }}
{% else %}
{% if q is defined and q %}

No subdomains match “{{ q }}”.

{% else %}

No subdomains yet — the scan may still be running.

{% endif %}
{% endif %}