{# Widget partial: Funnel (label, value) — bars narrow as values decrease, forming a pyramid. Each row tinted differently via CSS nth-child for a funnel-ish visual. Expects: widget, data {columns, rows}, widget_id, config SQL must return (label_col, value_col). Order rows DESC by value for the classic funnel shape — the first row is the widest. #} {% if error %}
{{ error }}
{% elif data and data.rows and data.rows | length > 0 %} {% set top_v = namespace(value=0) %} {% set first_row = data.rows[0] %} {% if first_row | length > 1 %} {% set top_v.value = first_row[1] | float %} {% endif %} {% set top = top_v.value if top_v.value > 0 else 1 %}
{% for row in data.rows[:8] %} {% set label = row[0] if row | length > 0 else '' %} {% set raw = row[1] if row | length > 1 else 0 %} {% set v = raw | float %} {% set pct = (v / top) * 100 if top else 0 %}
{{ label }}
{% if pct >= 18 %}{{ raw }}{% endif %}
{% if pct < 18 %}{{ raw }}{% endif %}
{% endfor %}
{% else %}
No data
{% endif %}