{% if is_hx_request %}{% include "partials/_period_control.html" %}{% endif %} {% from "partials/_macros.html" import amount, category_row, currency_symbol %}
{% set spending = dashboard.category_spending %}

Spending Breakdown

Income {{ amount(spending.total_income) if spending else '—' }} Expenses {{ amount(spending.total_spending) if spending else '—' }}
{% if spending and spending.categories %} {% set income_abs = spending.total_income | abs %} {% set expense_abs = spending.total_spending | abs %} {% set income_categories = spending.categories | selectattr('is_income') | selectattr('total_amount', 'ne', 0) | sort(attribute='total_amount', reverse=true) %} {% set expense_categories = spending.categories | rejectattr('is_income') | selectattr('total_amount', 'ne', 0) | sort(attribute='total_amount', reverse=true) %}
Income {% for cat in income_categories %} {% set pct = ((cat.total_amount | abs / income_abs) * 100) | round if income_abs else 0 %} {{ cat.category_name }} — {{ amount(cat.total_amount, cat.currency or 'USD') }} ({{ pct }}%) {% endfor %}
Expenses {% for cat in expense_categories %} {% set ci = loop.index0 + income_categories | length %} {% set pct = ((cat.total_amount | abs / expense_abs) * 100) | round if expense_abs else 0 %} {{ cat.category_name }} — {{ amount(cat.total_amount, cat.currency or 'USD') }} ({{ pct }}%) {% endfor %}
{% set income_categories = spending.categories | selectattr('is_income') | selectattr('transaction_count') | sort(attribute='total_amount', reverse=true) %} {% set expense_categories = spending.categories | rejectattr('is_income') | selectattr('transaction_count') | sort(attribute='total_amount', reverse=true) %} {% if income_categories %}

Income

{% for category in income_categories %}{{ category_row(category, spending.total_income or 1, loop.index0) }}{% endfor %}
{% endif %} {% if expense_categories %}

Expenses

{% for category in expense_categories %}{{ category_row(category, spending.total_spending or 1, loop.index0 + income_categories | length) }}{% endfor %}
{% endif %}
{% if chart_data %} {% endif %} {% else %}

No categorized activity yet.

Your next sync will give this dashboard some shape.
{% endif %}