{
  "pageTemplates": {
    "footer": [
      { "type": "divider", "label": "news.footer.rule" },
      {
        "type": "row",
        "leftLabel": "news.footer.left",
        "rightLabel": "news.footer.right",
        "leftText": "SuperSimplePDF | github.com/hugopalma17/sspdf",
        "rightText": "Page {{page}}"
      }
    ],
    "footerHeightMm": 8,
    "footerStartMm": 284,
    "footerBypassMargins": false
  },
  "sections": [
    {
      "type": "section",
      "spaceAfterMm": 2,
      "content": [
        { "type": "text", "label": "news.masthead", "text": "SuperSimplePDF" },
        {
          "type": "row",
          "leftLabel": "news.edition.left",
          "rightLabel": "news.edition.right",
          "leftText": "March 2026",
          "rightText": "Release Edition"
        },
        { "type": "divider", "label": "news.rule.heavy" },
        { "type": "text", "label": "news.kicker", "text": "Open Source · PDF Generation · Node.js" },
        {
          "type": "text",
          "label": "news.headline",
          "text": "The PDF Engine That Makes jsPDF Invisible"
        },
        {
          "type": "text",
          "label": "news.deck",
          "text": "A new open-source library separates content, style, and layout math into three components that never speak to each other, and produces consistent, paginated PDFs from plain JSON."
        },
        {
          "type": "row",
          "leftLabel": "news.byline",
          "rightLabel": "news.timestamp",
          "leftText": "By Hugo Palma",
          "rightText": "npm install h17-sspdf"
        },
        { "type": "divider", "label": "news.rule.light" }
      ]
    },
    {
      "type": "section",
      "content": [
        {
          "type": "text",
          "label": "news.body",
          "text": [
            "Generating PDFs in code has always meant tracking a cursor. Every text block, every rule, every section heading: the developer moves the pen, measures the result, adjusts for line wrapping, resets the font, and prays the next page break lands somewhere reasonable. The output works, but the code belongs to no one. It is a sequence of measurements masquerading as a document.",
            "SuperSimplePDF inverts that model. You describe what to render and how it should look. The cursor moves itself. Line wrapping, page breaks, font resets, and margin math happen automatically. The developer stops being a typographer and starts being a content author.",
            "The library ships as h17-sspdf on npm. It is built on jsPDF, but jsPDF is an implementation detail; the surface you work with is JSON and a theme object, not a coordinate system."
          ]
        }
      ]
    },
    {
      "type": "section",
      "spaceAfterMm": 1.8,
      "content": [
        {
          "type": "text",
          "label": "news.section.title",
          "text": "Three blind components",
          "keepWithNext": 4
        },
        {
          "type": "text",
          "label": "news.body",
          "text": [
            "The architecture is built around a deliberate ignorance. The source JSON carries the content: text, structure, order, but has no opinion about fonts, colors, or spacing. The theme carries the visual rules: typography, margins, borders, but has no idea what words it is styling. The core engine knows neither. It reads a label, looks it up in the theme, runs the layout math, advances the cursor, and moves on.",
            "This separation means you can take the same source JSON and render it in a minimal theme for internal drafts and a polished editorial theme for publication. It means a developer can define the theme once and hand content authors a simple JSON contract. It means the engine can be tested against arbitrary inputs without ever caring whether the output is a newspaper, an invoice, or a certificate."
          ]
        },
        {
          "type": "quote",
          "label": "news.pullquote",
          "text": "Source JSON + Theme = PDF. The core is blind to both and does all the math.",
          "attribution": "- SuperSimplePDF design principle",
          "xMm": 22,
          "maxWidthMm": 166
        }
      ]
    },
    {
      "type": "section",
      "content": [
        {
          "type": "text",
          "label": "news.section.title",
          "text": "What ships in the box",
          "keepWithNext": 3
        },
        {
          "type": "bullet",
          "label": "news.brief.text",
          "markerLabel": "news.brief.marker",
          "bullets": [
            "Nine operation types: text, row, bullet, divider, spacer, quote, block, section, and hiddenText.",
            "Page templates: declare a footer once and the engine stamps it on every page, with live page number substitution via {{page}}.",
            "keepWithNext and keepTogether controls to prevent orphaned headings and broken blocks.",
            "xMm and maxWidthMm overrides on any operation to position content independently of the theme margins.",
            "Custom font registration via base64 TTF: embed any typeface directly in the theme.",
            "A chart plugin that renders any Chart.js configuration to PNG and embeds it in the PDF.",
            "A CLI: npx sspdf -s source.json -t theme.js -o output.pdf.",
            "Twenty bundled fonts ready to use without configuration."
          ],
          "xMm": 22,
          "maxWidthMm": 166
        }
      ]
    },
    {
      "type": "section",
      "content": [
        {
          "type": "text",
          "label": "news.section.title",
          "text": "The newspaper problem",
          "keepWithNext": 3
        },
        {
          "type": "text",
          "label": "news.body",
          "text": [
            "The most complex example in the repository is a newspaper front page. It has a masthead, an edition line, a heavy rule, a headline hierarchy, a byline, multi-paragraph body copy, a pull quote, a stat scoreboard, and a footer that repeats on every page. Every element is positioned through labels and theme rules. The source JSON contains no font sizes, no colors, no line widths.",
            "That document, including this one, is produced by the same engine, the same theme, and the same rendering loop. The newspaper is not a special case. It is what the system looks like when you give it enough content."
          ]
        }
      ]
    },
    {
      "type": "section",
      "content": [
        {
          "type": "text",
          "label": "news.section.title",
          "text": "Browser and server",
          "keepWithNext": 3
        },
        {
          "type": "text",
          "label": "news.body",
          "text": [
            "The core engine runs in Node.js and in the browser. jsPDF ships a UMD build, and SuperSimplePDF inherits that compatibility: the same rendering logic works client-side. The one exception is the chart plugin, which depends on chartjs-node-canvas, a server-side renderer. Charts require Node.js. Everything else does not.",
            "The library is Apache 2.0 licensed and lives at github.com/hugopalma17/sspdf. Full documentation, the label style property reference, example sources and themes, and the chart plugin guide are all in the README. The source JSON for this document is in the examples folder."
          ]
        }
      ]
    },
    {
      "type": "section",
      "content": [
        {
          "type": "text",
          "label": "news.section.title",
          "text": "By the numbers",
          "keepWithNext": 8
        },
        {
          "type": "row",
          "leftLabel": "news.stat.label",
          "rightLabel": "news.stat.value",
          "leftText": "Operation types",
          "rightText": "9"
        },
        {
          "type": "text",
          "label": "news.stat.note",
          "text": "text, row, bullet, divider, spacer, quote, block, section, hiddenText, and plugins extend the list."
        },
        {
          "type": "row",
          "leftLabel": "news.stat.label",
          "rightLabel": "news.stat.value",
          "leftText": "Bundled fonts",
          "rightText": "20"
        },
        {
          "type": "text",
          "label": "news.stat.note",
          "text": "Inter, Roboto, Lato, Merriweather, Playfair Display, Oswald, and fourteen more, all ready without configuration."
        },
        {
          "type": "row",
          "leftLabel": "news.stat.label",
          "rightLabel": "news.stat.value",
          "leftText": "Lines of source JSON for this document",
          "rightText": "~150"
        },
        {
          "type": "text",
          "label": "news.stat.note",
          "text": "No font sizes, no colors, no coordinates. Just content, labels, and structure."
        },
        {
          "type": "row",
          "leftLabel": "news.stat.label",
          "rightLabel": "news.stat.value",
          "leftText": "Cursor tracking required from the developer",
          "rightText": "zero"
        },
        {
          "type": "text",
          "label": "news.stat.note",
          "text": "The engine handles all of it."
        }
      ]
    },
    {
      "type": "section",
      "content": [
        {
          "type": "text",
          "label": "news.body",
          "text": [
            "The complete API reference, theme property table, chart plugin documentation, and advanced layout examples are available at github.com/hugopalma17/sspdf. The README is the documentation."
          ]
        },
        {
          "type": "hiddenText",
          "label": "news.hidden.tags",
          "text": "pdf generation nodejs jspdf declarative layout theme json supersimplepdf sspdf h17-sspdf open source"
        }
      ]
    }
  ]
}
