{# Reusable fragments. `ticker_card` renders one symbol tile; its data-ticker
and data-field hooks let the live stream client patch it in place. #}
{# `verdict_badge` renders the rolled-up strong / fair / weak standing badge
(Phase 20). `s` is a compute::Standing: `s.grade` is the colour hook
(good/ok/bad), `s.verdict` the word (Strong/Fair/Weak). #}
{% macro verdict_badge(s) %}{{ s.verdict }}{% endmacro %}
{% macro ticker_card(c) %}
{% endmacro %}
{# `spark_card` renders one dashboard tile: an intraday sparkline with a live
price and day change. data-lo/data-hi let the stream client place a live
quote on the same y-scale and nudge the trailing point. #}
{% macro spark_card(c) %}
{% endmacro %}
{# `etf_card` renders one curated ETF tile (Phase 5): the same intraday
sparkline + live price as `spark_card`, plus the Phase-4 quality verdict as a
small pill in the head so the fund's quality reads at a glance beside its
move. `e.card` is a SparkCard; `e.quality` an EtfQuality (None until ≥2
factors grade). #}
{% macro etf_card(e) %}