{% extends "layouts/workspace_settings.html" %} {% comment %} The media library browser (issue #16). **Why a settings layout.** Library used to be a sidebar row, pinned to the footer beside Settings; it is a row in the workspace settings nav now. A page whose own nav row is in a list it does not render would light nothing and strand the reader on a screen with no way back into settings, so it renders the list it lives in — which the layout puts in the sidebar itself. That is all the layout adds here: `content_wrap` is cleared below, so this page keeps the bare `.app-content` flex container it has always filled rather than the card the settings archetype wraps text pages in. A folder rail, a filter bar, a drop zone and the asset grid. Filters are plain links so the state lives in the querystring and a view is bookmarkable; search, uploads and mutations swap `#media-grid` through htmx and nothing else. No inline event handlers anywhere. The CSP (config/settings/base.py) allows 'unsafe-eval' for Alpine's x-* expressions but NOT 'unsafe-inline', so an `onclick=` attribute silently does nothing — the failure mode is a button that looks fine and is inert. Studio keeps this page's `.ml-*` rules in a per-page