renderreport 0.2.4

Data-driven report generation with Typst as embedded render engine — no CLI dependency
Documentation
// Sparkline component template
#let sparkline(data) = {
  let sparkline_type = data.sparkline_type
  let values = data.data
  let width = data.at("width", default: "80pt")
  let height = data.at("height", default: "20pt")
  let color = data.at("color", default: none)
  let stroke_color = if color != none { rgb(color) } else { rgb("#3b82f6") }
  
  box(
    width: eval(width),
    height: eval(height),
    baseline: 25%,
    {
      if sparkline_type == "bar" {
        // Mini bar chart
        let max_val = calc.max(..values)
        let bar_width = eval(width) / values.len()
        
        grid(
          columns: values.len(),
          column-gutter: 0pt,
          ..values.map(v => {
            let bar_height = if max_val > 0 { (v / max_val) * eval(height) } else { 0pt }
            align(bottom, rect(
              width: bar_width - 1pt,
              height: bar_height,
              fill: stroke_color,
              stroke: none
            ))
          })
        )
      } else {
        // Line sparkline (simplified)
        rect(
          width: 100%,
          height: 100%,
          stroke: 1pt + stroke_color,
          fill: none,
          radius: 2pt
        )
      }
    }
  )
}