renderreport 0.2.0

Data-driven report generation with Typst as embedded render engine — no CLI dependency
Documentation
// BeforeAfter Component
// Before/after comparison block

#let before-after(data) = {
  let lbl-before = if data.label_before != none { data.label_before } else { "Before" }
  let lbl-after  = if data.label_after  != none { data.label_after  } else { "After"  }

  block(width: 100%)[
    #if data.title != none [
      #text(weight: "semibold", size: font-size-lg)[#data.title]
      #v(spacing-3)
    ]

    #grid(
      columns: (1fr, 1fr),
      gutter: spacing-3,

      // Before — muted/grey
      block(
        width: 100%,
        fill: color-surface-alt,
        stroke: (paint: color-border, thickness: component-card-border-width),
        radius: 8pt,
        inset: spacing-4,
      )[
        #label-text(lbl-before)
        #v(spacing-2)
        #text(size: font-size-sm, fill: color-text)[#data.before]
      ],

      // After — accent color
      block(
        width: 100%,
        fill: color-accent-soft,
        stroke: (left: (paint: color-primary, thickness: 3pt)),
        radius: (right: 8pt),
        inset: spacing-4,
      )[
        #label-text(lbl-after)
        #v(spacing-2)
        #text(size: font-size-sm, fill: color-text)[#data.after]
      ],
    )

    #if data.note != none [
      #v(spacing-2)
      #small-text(data.note)
    ]
  ]
}