Skip to content

GraphCompose 2.0

v1.6.5 Breaking

This release includes breaking changes for platform teams planning a safe upgrade.

Published 1mo Build & Package
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

business-documents cv-templates declarative-api document-generation invoice-template java
+12 more
java-17 layout-engine maven pagination pdf pdf-generator pdf-lib pdf-library pdfbox3 report-generation snapshot-testing template-engine

Summary

AI summary

Updates Templates v2, Bug fixes, and Public API across a mixed release.

Full changelog

v1.6.5 — 2026-05-30

Templates v2

  • Added the CenteredHeadline CV preset to the cv/v2 layered
    template surface, including its isolated theme tokens, visual
    regression baselines, and reusable Subheadline /
    SectionHeader.flatSpacedCaps widget support.
  • Added the Mint Editorial template set: a two-page, two-column
    editorial CV preset MintEditorial (centred spaced-caps masthead with
    a full-width mint accent rule; sidebar contact / interests / education /
    expertise / skill-bars / social beside a profile / experience / awards /
    references main column) and its paired MintEditorialLetter, both on
    CvTheme.mintEditorial() and with visual regression baselines.
  • Added two reusable cv/v2/widgets: SkillBar (data-driven proficiency
    bar — spaced-caps label above a track with a level-positioned marker;
    no bar when the level is absent) and IconTextRow (inline icon + text
    row, optionally a single click target), with WidgetSmokeTest coverage.
  • Added optional proficiency levels to SkillGroup via the new
    CvSkill record and SkillsSection.Builder.leveledGroup(...). Fully
    backward-compatible: name-only skills carry no level and every existing
    name-based renderer is unaffected.
  • Added MintEditorial.Options (and a matching MintEditorialLetter.Options)
    — an additive masthead colour API (accent, rule, name, and an optional
    full-width page-1 header band) whose defaults reproduce the stock render
    exactly, so the committed look and the parity baselines are unchanged.

Public API

  • PageBackgroundFill band helpers. Added topBand, bottomBand,
    band, topBandPoints, and bandPoints factory methods for full-width
    horizontal background bands (top, bottom, or arbitrary vertical offset;
    ratio- or point-based), complementing the existing column helpers and
    building on the v1.6.5 y-coordinate fix below.

Bug fixes

  • PageBackgroundFill y-coordinate. A partial-height page-background
    fill (heightRatio < 1.0) was painted from the page bottom upward
    instead of from the yRatio top edge the API documents, so a band with
    yRatio = 0 rendered at the bottom of the page. Fills now convert the
    top-down ratios to the PDF bottom-up origin correctly
    (y = (1 - yRatio - heightRatio) * pageHeight); full-page and
    full-height column fills are unchanged. Adds top-/bottom-/mid-band
    regression tests.
  • GraphCompose.document().pageBackgrounds(emptyList()) now actually
    clears.
    The builder's Javadoc promised that an explicit empty list
    overrides any earlier pageBackground(color) on the same builder, but
    the implementation skipped empty lists, so pageBackground(LIGHT_GRAY)
    followed by pageBackgrounds(List.of()) still emitted the grey
    background. The guard is removed; the empty list is now the documented
    clear. Adds a regression test.
  • distributeRowSlotWidths weights / children mismatch. When a row
    was constructed with a weights list whose size did not match the
    number of children (only reachable by bypassing RowBuilder and
    building a RowNode directly), the engine's row distribution code
    walked off the end of the weights list with a raw
    IndexOutOfBoundsException. Both row-distribution call sites
    (LayoutCompiler#distributeRowSlotWidths, NodeDefinitionSupport#measureRow)
    now reject the mismatch with an IllegalArgumentException whose
    message names both sizes and the expected fix. RowNode's canonical
    constructor already validated this at construction time; the new
    engine guards are defence-in-depth for any path that bypasses it
    (e.g. reflection-based deserialization). Adds regression tests for
    the canonical-constructor IAE and the RowBuilder.build() ISE.

Build

  • byte-buddy is now <scope>test</scope>. Mockito already excludes
    its transitive byte-buddy and the project pins a single version in a
    standalone dependency; that dependency was missing a scope, so the
    published POM advertised byte-buddy as a compile dependency even
    though no production code references it. Setting <scope>test</scope>
    keeps the version pin but keeps byte-buddy out of consumers' runtime
    classpath (mvn dependency:tree shows it only as :test).
  • CI exec-maven-plugin version drift removed. The CI workflow's
    three benchmark steps invoked
    org.codehaus.mojo:exec-maven-plugin:3.5.0:java directly, while
    benchmarks/pom.xml already declared exec-maven-plugin at 3.6.3
    for local runs — a silent version split between CI and local invocations
    that grew the surface area to keep aligned. CI now calls the configured
    plugin via exec:java, picking up the pinned 3.6.3 from
    benchmarks/pom.xml. No behaviour change; one fewer hardcoded version
    to bump.

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track GraphCompose 2.0

Get notified when new releases ship.

Sign up free

About GraphCompose 2.0

All releases →

Related context

Related tools

Earlier breaking changes

  • v2.0.0 Package rename: layered template packages dropped `.v2` suffix; update imports.
  • v2.0.0 Removed dormant ECS engine internals (EntityManager, SystemECS, Entity components, render pipeline).
  • v2.0.0 Removed linkOptions() accessor; use linkTarget() and ExternalLinkTarget.options().
  • v2.0.0 Removed PDF‑typed document‑chrome overloads on DocumentSession; use backend‑neutral metadata/watermark/protect/header/footer.
  • v2.0.0 Removed DSL name-aliases DocumentSession.builder() and DocumentDsl.text(); use builder() and paragraph().

Beta — feedback welcome: [email protected]