This commit is contained in:
Youssef Aitousarrah 2026-02-20 08:53:37 -08:00
parent 0420e84283
commit 07851feeda
2 changed files with 34 additions and 19 deletions

View File

@ -404,7 +404,11 @@ def render():
rank = rec.get("rank", idx + 1)
score = rec.get("final_score", 0)
confidence = rec.get("confidence", 0)
strategy = (rec.get("strategy_match") or rec.get("pipeline") or "unknown").replace("_", " ").title()
strategy = (
(rec.get("strategy_match") or rec.get("pipeline") or "unknown")
.replace("_", " ")
.title()
)
entry_price = rec.get("entry_price", 0)
reason = rec.get("reason", "No thesis provided.")
company_name = rec.get("company_name", "")

View File

@ -5,6 +5,8 @@ Bloomberg/TradingView-inspired aesthetic with green/amber accents.
Uses CSS variables for consistency and injects custom fonts.
"""
import html as _html
# -- Color Tokens --
COLORS = {
"bg_primary": "#0a0e17",
@ -588,36 +590,45 @@ def signal_card(
strat_badge = "badge-blue"
strat_css = "strat-volume"
# Risk level badge
risk_badge_html = ""
if risk_level:
risk_lower = risk_level.lower()
if risk_lower == "low":
risk_badge_html = f'<span class="badge badge-green">{risk_level.title()}</span>'
elif risk_lower == "moderate":
risk_badge_html = f'<span class="badge badge-blue">{risk_level.title()}</span>'
elif risk_lower == "high":
risk_badge_html = f'<span class="badge badge-amber">{risk_level.title()}</span>'
elif risk_lower == "speculative":
risk_badge_html = f'<span class="badge badge-muted" style="border-color:{COLORS["red"]};">{risk_level.title()}</span>'
entry_str = f"${entry_price:.2f}" if entry_price else "N/A"
conf_pct = confidence * 10
# Escape all LLM-generated text to prevent HTML injection / rendering breaks
safe_reason = _html.escape(reason)
safe_company = _html.escape(company_name)
safe_desc = _html.escape(description)
safe_strategy = _html.escape(strategy)
safe_risk = _html.escape(risk_level)
# Risk level badge (built after escaping)
risk_badge_html = ""
if safe_risk:
risk_lower = safe_risk.lower()
if risk_lower == "low":
risk_badge_html = f'<span class="badge badge-green">{safe_risk.title()}</span>'
elif risk_lower == "moderate":
risk_badge_html = f'<span class="badge badge-blue">{safe_risk.title()}</span>'
elif risk_lower == "high":
risk_badge_html = f'<span class="badge badge-amber">{safe_risk.title()}</span>'
elif risk_lower == "speculative":
risk_badge_html = f'<span class="badge badge-muted" style="border-color:{COLORS["red"]};">{safe_risk.title()}</span>'
name_html = (
f'<span style="font-size:0.8rem;color:{COLORS["text_muted"]};font-weight:400;">{company_name}</span>'
f'<span style="font-size:0.8rem;color:{COLORS["text_muted"]};font-weight:400;">{safe_company}</span>'
if company_name and company_name != ticker
else ""
)
desc_html = (
f'<div class="company-brief">'
f'<div class="company-brief-label">Company</div>'
f'<div class="company-brief-text">{description}</div>'
f'<div class="company-brief-text">{safe_desc}</div>'
f"</div>"
if description
else ""
)
safe_risk_title = safe_risk.title() if safe_risk else ""
return f"""
<div class="signal-card {strat_css}">
<div class="signal-header">
@ -629,7 +640,7 @@ def signal_card(
</div>
{desc_html}
<div class="signal-badges">
<span class="badge {strat_badge}">{strategy}</span>
<span class="badge {strat_badge}">{safe_strategy}</span>
<span class="badge {score_badge}">Score {score}</span>
<span class="badge badge-muted">Conf {confidence}/10</span>
{risk_badge_html}
@ -649,10 +660,10 @@ def signal_card(
</div>
<div class="signal-metric">
<div class="signal-metric-label">Risk</div>
<div class="signal-metric-value" style="font-size:0.8rem;">{risk_level.title() if risk_level else ""}</div>
<div class="signal-metric-value" style="font-size:0.8rem;">{safe_risk_title}</div>
</div>
</div>
<div class="signal-thesis">{reason}</div>
<div class="signal-thesis">{safe_reason}</div>
<div class="conf-bar">
<div class="conf-fill" style="width:{conf_pct}%;background:{bar_color};"></div>
</div>