renderreport 0.2.0

Data-driven report generation with Typst as embedded render engine — no CLI dependency
Documentation
// Pivot Table component template
#let pivot-table(data) = {
  let title = data.at("title", default: none)
  let row_headers = data.row_headers
  let col_headers = data.column_headers
  let values = data.values
  let show_borders = data.at("show_borders", default: true)
  
  let stroke_val = if show_borders { 0.5pt + gray } else { none }
  let num_cols = col_headers.len() + 1
  
  block(
    width: 100%,
    breakable: true,
    {
      if title != none {
        text(weight: "bold", size: 11pt, title)
        v(6pt)
      }
      
      table(
        columns: num_cols,
        stroke: stroke_val,
        fill: (x, y) => {
          if y == 0 or x == 0 { gray.lighten(70%) }
          else { white }
        },
        
        // Build header cells
        text(weight: "bold", size: 9pt, ""),
        ..col_headers.map(h => text(weight: "bold", size: 9pt, h)),
        
        // Build data rows - must be flat array
        ..{
          let cells = ()
          for i in range(row_headers.len()) {
            // Add row header
            cells.push(text(weight: "bold", size: 9pt, row_headers.at(i)))
            // Add row values
            for v in values.at(i) {
              cells.push(text(size: 9pt, v))
            }
          }
          cells
        }
      )
    }
  )
}