defmodule Pdf.Component.Column do @moduledoc """ Column component for PDF documents. Stacks content vertically with fixed heights per row. Operates at Document level. ## Example doc |> Pdf.Component.Column.render({50, 700}, {300, 400}, [ {50, fn doc, area -> Pdf.text_at(doc, {area.x, area.y - 14}, "Row 1") end}, {80, fn doc, area -> Pdf.text_at(doc, {area.x, area.y - 14}, "Row 2") end} ], gap: 5) """ @doc """ Render a vertical column at `{x, y}` with size `{w, h}`. `rows` is a list of `{height, callback}` tuples where each callback receives `(doc, %{x, y, width, height})`. ## Options - `:gap` — space between rows (default `0`) """ def render(doc, {x, y}, {w, _h}, rows, opts \\ []) when is_list(rows) do gap = Keyword.get(opts, :gap, 0) {doc, _y} = Enum.reduce(rows, {doc, y}, fn {row_h, callback}, {doc, row_y} -> doc = callback.(doc, %{x: x, y: row_y, width: w, height: row_h}) {doc, row_y - row_h - gap} end) doc end end