{{ _('Proposal Preview') }}

{{ _('Funder') }}

{{ proposal.client_name or "—" }}

{{ _('Program') }}

{{ proposal.subtitle or "—" }}

{% if proposal.project_summary %}

{{ _('Project Summary') }}

{{ proposal.project_summary|md }}
{% endif %} {% if map_ctx %}

{{ _('Project Map') }}

{% if map_ctx.image_url %} {{ _('Project map') }} {% else %} {% endif %}

{{ _('Map powered by GeoLibre') }} — Wu, Q. (2026). GeoLibre: A lightweight, cloud-native GIS platform for visualizing, exploring, and analyzing geospatial data. Zenodo. https://doi.org/10.5281/zenodo.20785400

{% endif %} {% if proposal.scope %}

{{ _('Scope') }}

{{ proposal.scope|md }}
{% endif %} {% if budget_items %}

{{ _('Budget') }}

{% for task in tasks %} {% set ns = namespace(total=0) %} {% for item in budget_items %} {% if item.task_id|string == task.id|string %} {% set ns.total = ns.total + item.cost_per_unit * item.units %} {% endif %} {% endfor %} {% for item in budget_items %} {% if item.task_id|string == task.id|string %} {% endif %} {% endfor %} {% endfor %} {% if indirect_percent is defined and indirect_percent > 0 %} {% endif %}
{{ _('Item') }} {{ _('Cost/Unit') }} {{ _('Units') }} {{ _('Total') }}
{{ task.name }} {{ ns.total|currency }}
{{ item.name }} {{ item.cost_per_unit|currency }} {{ item.units|currency }} {{ (item.cost_per_unit * item.units)|currency }}
{{ _('Subtotal') }} {{ total_budget|currency }}
{{ _('Indirect') }} ({{ "%.0f"|format(indirect_percent) }}%) {{ indirect_amount|currency }}
{{ _('Total') }} ${{ total_with_indirect|currency }}
{% if budget_by_year.years or budget_by_year.unscheduled %}

{{ _('Budget by Year') }}

{% for row in budget_by_year.years %} {% endfor %} {% for u in budget_by_year.unscheduled %} {% endfor %}
{{ _('Year') }} {{ _('Amount') }} {{ _('% of Total') }}
{{ row.year }} ${{ row.amount|currency }} {% if total_budget > 0 %}{{ (row.amount / total_budget * 100)|round(1) }}%{% endif %}
{{ _('Not scheduled') }} ${{ u.amount|currency }} {% if total_budget > 0 %}{{ (u.amount / total_budget * 100)|round(1) }}%{% endif %}
{% endif %}
{% endif %} {% if proposal.show_budget_description and proposal.budget_description %}

{{ _('Budget Description') }}

{{ proposal.budget_description|md }}
{% endif %} {% if proposal.qualifications %}

{{ _('Qualifications') }}

{{ proposal.qualifications|md }}
{% endif %} {% if proposal.custom_sections %} {% for section in proposal.custom_sections | sort(attribute='order') %}

{{ section.title }}

{{ section.content | md }}
{% endfor %} {% endif %} {% if tasks %}

{{ _('Timeline') }}

{% set proj_start_month = proposal.start_date[5:7]|int if proposal.start_date and proposal.start_date|length >= 7 else 1 %} {% set proj_start_year = proposal.start_date[:4]|int if proposal.start_date and proposal.start_date|length >= 4 else 2025 %} {% set month_names = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'] %} {% if proposal.end_date and proposal.end_date|length >= 7 %} {% set proj_end_month = proposal.end_date[5:7]|int %} {% set proj_end_year = proposal.end_date[:4]|int %} {% set total_project_months = [(proj_end_year - proj_start_year) * 12 + (proj_end_month - proj_start_month) + 1, 1]|max %} {% else %} {% set max_end = 0 %} {% for r in all_rows %} {% for bar in r.bars %} {% set row_end = bar.offset + bar.duration %} {% if row_end > max_end %}{% set max_end = row_end %}{% endif %} {% endfor %} {% endfor %} {% set total_project_months = [max_end, 1]|max %} {% endif %}
{% set years_in_proj = ((proj_start_month - 1 + total_project_months - 1) // 12) + 1 %}
{% for y in range(years_in_proj) %} {% set abs_y = proj_start_year + y %} {% set year_start_m = [(abs_y - proj_start_year) * 12 - (proj_start_month - 1), 0]|max %} {% set year_end_m = [(y + 1) * 12 - (proj_start_month - 1), total_project_months]|min %} {% set year_span = year_end_m - year_start_m %} {% if year_span > 0 %}
{{ abs_y }}
{% endif %} {% endfor %}
{% for m_offset in range(total_project_months) %} {% set abs_m = proj_start_month + m_offset - 1 %} {% set abs_m_1based = (abs_m % 12) + 1 %} {% set is_year_start = (abs_m_1based == 1) %}
{{ month_names[abs_m_1based - 1] }}
{% endfor %}
{% for r in all_rows %}
{{ r.name }}
{% for bar in r.bars %} {% set left_pct = (bar.offset / total_project_months * 100)|round(1) if total_project_months > 0 else 0 %} {% set width_pct = (bar.duration / total_project_months * 100)|round(1) if total_project_months > 0 else 100 %}
{% endfor %}
{% endfor %}
{% endif %}