{{/* app_list_row / app_list_row_end — THE canonical app-list row (v0.126.0). One grammar on every list surface: icon + name (+ optional one-line secondary) left, caller-provided action block right. A row without a secondary line stays compact. Usage (the layout_start/layout_end idiom): {{template "app_list_row" dict "Slug" .Slug "Name" .DisplayName}} ...caller action buttons / status... {{template "app_list_row_end"}} dict keys: Slug (icon lookup), Name, Secondary (optional one-liner), RowClass (optional extra row class, e.g. stack-state-run), Href (optional data-href), FallbackIcon (optional last-resort icon URL). DEFAULTS to /static/app-placeholder.svg (the generic app-grid glyph) when a caller omits it — so a logo-less app shows a placeholder, not a hidden dead-end. Infra rows pass /static/infra-logo.svg to override that with the server glyph. Do NOT hand-roll app rows — scripts/app_row_dedup_gate.py asserts this markup exists here ONCE (the backups_apps expander header is the single allowlisted aligned copy). */}} {{define "app_list_row"}}