{# _canvas_shell.html — Standardized Canvas Layout (DSW-2) ========================================================= Intermediate template for canvases that want the standard 3-pane shell. New canvases EXTEND this instead of base.html directly. Layout (responsive flex): ┌─────────────────────────────────────────────┐ │ [Left Pane — optional, collapsible] │ │ ├──────────────────────────────────────┤ │ │ │ Canvas Header (title + actions) │ │ │ ├──────────────────────────────────────┤ │ │ │ Main Content Area │ │ │ └──────────────────────────────────────┘ │ │ [Right Pane — optional, collapsible] │ └─────────────────────────────────────────────┘ Usage — new canvas extending the shell: {% extends "includes/_canvas_shell.html" %} {% block canvas_has_left %}true{% endblock %} {# opt-in left pane #} {% block canvas_left %}
Filters
... {% endblock %} {% block canvas_header %}

My Canvas

{% endblock %} {% block canvas_content %} {% endblock %} Pane collapse state is persisted to localStorage (key: icdev-pane-{left|right}). #} {% extends "base.html" %} {% block content %} {#- Read pane opt-in flags from child block string values -#} {%- set _has_left = self.canvas_has_left() | trim | lower == 'true' -%} {%- set _has_right = self.canvas_has_right() | trim | lower == 'true' -%}
{# ── Left Pane ────────────────────────────────────────────────────────── #} {% if _has_left %} {% endif %} {# ── Main Area ────────────────────────────────────────────────────────── #}
{% if self.canvas_header() | trim %}
{% block canvas_header %}{% endblock %}
{% endif %}
{% block canvas_content %}{% endblock %}
{# ── Right Pane ───────────────────────────────────────────────────────── #} {% if _has_right %} {% endif %}
{% endblock %} {# ── Flag blocks — override in child to enable panes ──────────────────────── #} {% block canvas_has_left %}false{% endblock %} {% block canvas_has_right %}false{% endblock %}