{# doto-list-calendar.html - Template for doto task list as a month calendar #} {# Context variables: - calendar: Dict describing the month grid (built by nodes._calendar_month_grid): * year / month — ints for the displayed month. * month_label — e.g. "August 2026". * weekday_labels — ordered short weekday names (Mon..Sun). * weeks — list of weeks; each week is a list of 7 day dicts with: - day (int day-of-month) - iso (YYYY-MM-DD) - in_month (bool; False for padding days of adjacent months) - tasks (list of DotoTask due that day) * unscheduled — tasks without a parseable due date. - task_links: Dict mapping task.id -> href of the task box (Feature 5). - icon_mode: Effective icon mode ("icon" | "icon-text" | "text"). Available filters: - row_classes: Get CSS classes for a task. Client-side nature: Clicking a day reveals that day's task panel via the vendored, dependency-free doto-views.js. When JS is unavailable the markup degrades gracefully: every day's tasks are present in the DOM (visually collapsed by CSS, but still accessible). A child theme can fully re-author this file via /_doto/templates/html/. #}
{{ calendar.month_label }}
{%- for weekday in calendar.weekday_labels %} {%- endfor %} {%- for week in calendar.weeks %} {%- for cell in week %} {%- endfor %} {%- endfor %}
{{ weekday }}
{%- if cell.tasks %}
    {%- for task in cell.tasks %} {%- set href = (task_links.get(task.id) if task_links is defined else '#' ~ task.id) or ('#' ~ task.id) %}
  • {{ task.id }}: {{ task.title }}
  • {%- endfor %}
{%- endif %}
{%- if calendar.unscheduled %}
No due date
    {%- for task in calendar.unscheduled %} {%- set href = (task_links.get(task.id) if task_links is defined else '#' ~ task.id) or ('#' ~ task.id) %}
  • {{ task.id }}: {{ task.title }}
  • {%- endfor %}
{%- endif %}