{# v11.0.0a4: stateBadge unification.
A single Alpine helper for the small icon+label badges scattered
across statusStrip (bridge state), reembedPanel (phase), and
networkPanel (live/offline). Eliminates 3 near-identical markup
blocks so future tweaks (icon family, ring color, hover) happen
in one place.
Usage in a template (Alpine context):
{% include "_partials/_state_badge.html" %}
Or, the more idiomatic call (computed by the parent component):
Props:
state — semantic state name (used as data-state attr for tests)
icon — single character / emoji (e.g. ✓, ⚠, ⊘) OR raw HTML
if `iconHtml: true` is passed (used by reembedPanel for
its animated spinner span).
iconHtml — when true, `icon` is treated as raw HTML (NOT escaped).
v12.0.0a2: opt-in to support the existing animated
spinner element. Caller is responsible for the markup.
color — tailwind color name (emerald, amber, rose, gray, cyan)
label — human-readable text shown to the right of the icon
(also becomes the aria-label).
ariaLabel — optional; overrides `label` for the aria-label
attribute. Use when the visible text is a glyph or
ambiguous (e.g. "Bridge connected" while the badge
text reads only "connected").
title — optional tooltip (rendered as the `title` attr).
v12.0.0a2: introduced for statusStrip's heartbeat-age
tooltip.
The helper attaches itself to `window.harbormaster.stateBadgeHtml`
so it's reachable from any Alpine factory without per-component
registration. Idempotent — multiple includes are safe.
#}