{# ---- Heroicons (outline, MIT) as inline SVG — no build step needed ---- #} {# The sidebar's class list — ONE definition shared by the page shell and the OOB refresh, so a live update can't morph the drawer styling out from under an open drawer. Off-canvas below md; the open state lives on
. #} {% macro sidebar_classes() -%} w-72 shrink-0 border-r border-line overflow-y-auto p-3 max-md:fixed max-md:inset-y-0 max-md:left-0 max-md:z-40 max-md:bg-ink max-md:-translate-x-full max-md:transition-transform max-md:duration-200 [.sidebar-open_&]:max-md:translate-x-0 {%- endmacro %} {# One badge style everywhere (paused, draining, state chips, counts) — the hand-rolled copies had drifted between px-1.5 and px-2. #} {% macro badge(tone, extra='') -%} text-xs px-1.5 py-0.5 rounded-md bg-{{ tone }}/10 text-{{ tone }} {{ extra }} {%- endmacro %} {% macro icon(name, cls="w-4 h-4") -%} {%- endmacro %} {# The shared empty/absent state: a centred icon + message (and optional detail), so "no jobs", "no schedulers", "no workers" and "no results" all read the same. #} {% macro empty_state(icon_name='inbox', message='Nothing here', detail=None, bordered=false) -%}