{{ page_purpose }}
{% endif %} {% block content %}{% endblock %}{% extends "base.html" %} {% from 'macros/a11y.html' import skip_link %} {% block body %} {{ skip_link("#main-content") }} {# Contract: ~/.claude/skills/ux-architect/components/app-shell.md (UX-031) #} {# v0.62 CSS refactor: inline Tailwind → semantic .dz-app-* / .dz-sidebar-* / .dz-topbar-* classes (components/fragments.css). Sidebar open/collapsed state still lives on the root via `data-dz-sidebar="open"` (Alpine `:data-` bind) — CSS attribute selectors drive both the slide transform on the sidebar AND the lg:pl-64 padding offset on the content area. Active nav link styling keys off `aria-current="page"` (already emitted) so the visual state and accessibility attribute share one source of truth. #}
{{ page_purpose }}
{% endif %} {% block content %}{% endblock %}