from quillwright.models import Estimate, TraceStep # Status drives the icon: done -> check, active -> pulsing dot + cursor, error -> warning. def _step_html(s: TraceStep) -> str: badge = f'{s.model}' if s.model else "" if s.status == "active": marker = '' cursor = '' elif s.status == "error": marker = 'error' cursor = "" else: marker = 'check_circle' cursor = "" return ( f'
{marker}' f'

{s.action}: {s.detail}{cursor}

{badge}
' ) def trace_html(steps: list[TraceStep]) -> str: if not steps: return '

Waiting for capture…

' return '
' + "".join(_step_html(s) for s in steps) + "
" def estimate_rows(est: Estimate | None) -> list[list[str]]: if est is None: return [] return [ [li.description, f"{li.quantity:g} {li.unit}", f"${li.rate:.2f}", f"${li.subtotal:.2f}"] for li in est.line_items ] def summary_text(est: Estimate | None) -> str: if est is None: return "Subtotal $0.00 · Tax (0%) $0.00 · Total $0.00" return ( f"Subtotal ${est.subtotal:.2f} · Tax ({est.tax_rate:.0%}) ${est.tax:.2f} " f"· Total ${est.total:.2f}" )