{# Layout JSON embedded as a data island (#635) #}
{# Workspace heading — title, not purpose. `purpose:` is developer intent (e.g. "Personal dashboard for support agents") and leaks into user-facing copy when rendered verbatim, with no awareness of who's viewing it. See #805. Title (the DSL's first positional string) is the user-facing name. #}

{{ workspace.title or workspace.name.replace('_', ' ').title() }}

{% if workspace.context_options_url %}
{% endif %} {# ── Toolbar ── #}
{# Reset button #} {# Save button — reflects saveState #}
{# ── Card Grid ── #} {# Pointer drag/resize listeners are registered imperatively in the dashboard Alpine component's init()/destroy() (same lifecycle pattern used by dzTable for issue #795) — using @.window here leaks the listener across HTMX morph navigations and throws ReferenceError on the next pointer event. #}
{# ── Add Card ── #}
{% include 'workspace/_card_picker.html' %}
{# Detail drawer (preserved unchanged) #}