{# 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. #}