Skip to content

Commit e7a5495

Browse files
authored
chore(release): open the 2.1 development line (#436)
* build(release): bump develop to 2.1.0-SNAPSHOT The 2.1 cycle ships the fixed-layout PPTX render backend and new public DocumentSession PPTX methods — additive public surface, so the next release is a minor, not the 2.0.1 patch the GA bump left as a placeholder. Move all 13 reactor version sites to 2.1.0-SNAPSHOT so the in-development version signals the minor and japicmp compares the 2.1 line against the 2.0.0 baseline. README/web/module install snippets stay on the latest published 2.0.0 until 2.1.0 ships — VersionConsistencyGuardTest enforces both halves. * docs(api): record the 2.1 surface with correct @SInCE tags Keep-with-next and the alpha-state helpers landed after the v2.0.0 tag, but their Javadoc claimed `@since 2.0.0` and their changelog entries sat under the dated `## v2.0.0 — 2026-07-13` heading. Both are published artifacts — the javadoc jar on Central is immutable and the changelog section becomes the GitHub Release notes — so a reader upgrading from 2.0.0 was told the API had always been there. Retag the six members that shipped in this cycle (`DocumentNode.keepWithNext`, `SectionBuilder.keepWithNext` and its boolean overload, `LineBuilder.keepWithNext` and its boolean overload, `NodeDefinition.firstSliceHeight`) to `@since 2.1.0`, and add the missing tag to five members that had none: `MarkdownInline`'s `appendTransformed` / `appendUpperCased` / `appendIfPresent` and `PdfRenderEnvironment`'s `fillAlphaState` / `strokeAlphaState`. Move the four keep-with-next entries out of the v2.0.0 section into v2.1.0 and open that section as `## v2.1.0 — Planned`, the header form the release script dates. Record the node-model delta the feature entries omitted: the new default method on `DocumentNode` and the trailing `keepWithNext` component on `SectionNode` (13 -> 14) and `LineNode` (17 -> 18), which leaves constructor calls working through the previous-arity overloads but changes what a record deconstruction pattern must bind. The compat constructors themselves keep no `@since` — their signatures were the canonical record constructors at v2.0.0 and have been callable since then. Verified: full reactor `clean verify` green (1508 tests, 0 failures); japicmp against the 2.0.0 baseline green with the gate active at 2.1.0-SNAPSHOT; `javadoc:javadoc` green across the six published modules.
1 parent ff05e74 commit e7a5495

20 files changed

Lines changed: 64 additions & 51 deletions

File tree

CHANGELOG.md

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,49 @@
33
All notable changes to GraphCompose are documented here. Versions
44
follow semantic versioning; release dates are ISO 8601.
55

6-
## v2.1.0 — in progress
6+
## v2.1.0 — Planned
77

88
### Public API
99

10+
- **Keep a heading with its content**`SectionBuilder.keepWithNext()`. A section
11+
marked keep-with-next is never left stranded as the last block on a page apart from
12+
the content it introduces: when the section plus the first slice of the following
13+
block would overflow the remaining page space (but fit on a fresh page), the section
14+
relocates to the next page so the heading stays glued to its body. The first slice is
15+
a paragraph's first line, a table's repeated header rows plus first body row, or a
16+
list's first item, so the rule holds whether the following block is atomic or a
17+
page-spanning table or list. Distinct from `keepTogether()`, which relocates a
18+
*whole* block — keep-with-next binds only the start of the following block, the right
19+
tool for a boxed section title above a long, page-spanning body. Inert when nothing
20+
follows (a trailing heading is never moved) and best-effort when the heading plus the
21+
first slice cannot share a page. Default off, so layouts that do not opt in are
22+
unchanged.
23+
- `LineBuilder.keepWithNext()` — the line counterpart of
24+
`SectionBuilder.keepWithNext()`, so a full-width header rule joins its banner's
25+
keep-with-next run and the whole title block (rule + banner + rule) relocates
26+
together instead of the banner stranding apart from its rules or its body.
27+
- Keep-with-next surfaces on the node model as well: `DocumentNode.keepWithNext()`
28+
is a new default method (existing implementations keep the `false` default and
29+
need no change), and `SectionNode` and `LineNode` each gain a trailing
30+
`keepWithNext` record component. Constructor calls are unaffected — both records
31+
keep an overload at the previous argument count that defaults the flag to
32+
`false` — but the canonical component count changed (`SectionNode` 13 → 14,
33+
`LineNode` 17 → 18), so a **record deconstruction pattern** written against the
34+
2.0.0 component list must add the new binding to compile.
35+
- **Single-column CV presets no longer orphan a section title.** Every preset whose
36+
sections flow down the page — BoxedSections, MinimalUnderlined, ModernProfessional,
37+
Executive, CenteredHeadline, BlueBanner, EditorialBlue, and ClassicSerif — keeps a
38+
section heading with the first line of its body across a page break: a standalone
39+
header section binds to the following body section (a multi-node rule + banner + rule
40+
group binds as one run), and a combined header+body module keeps the heading in a
41+
nested keep-with-next group — including Panel's full-width Profile card, whose header
42+
now stays with the summary if a long profile splits the card. Multi-column presets
43+
place their sections in fixed columns that do not paginate, so no heading can strand
44+
there.
45+
- **The Modern Proposal template no longer orphans a section heading.** Its flowing
46+
section bodies, the Timeline and Investment tables, and the Acceptance terms each keep
47+
their title with the first line of the block it introduces across a page break — each
48+
title now renders in its own keep-with-next section rather than a bare paragraph.
1049
- **CV entry titles and subtitles accept inline `[text](url)` links.** In the layered
1150
CV presets, a `[label](url)` in an experience/education entry title or subtitle now
1251
renders as a clickable hyperlink — the same inline-Markdown convention already used
@@ -303,37 +342,6 @@ for this cycle.
303342

304343
### Public API
305344

306-
- **Keep a heading with its content**`SectionBuilder.keepWithNext()`. A section
307-
marked keep-with-next is never left stranded as the last block on a page apart from
308-
the content it introduces: when the section plus the first slice of the following
309-
block would overflow the remaining page space (but fit on a fresh page), the section
310-
relocates to the next page so the heading stays glued to its body. The first slice is
311-
a paragraph's first line, a table's repeated header rows plus first body row, or a
312-
list's first item, so the rule holds whether the following block is atomic or a
313-
page-spanning table or list. Distinct from `keepTogether()`, which relocates a
314-
*whole* block — keep-with-next binds only the start of the following block, the right
315-
tool for a boxed section title above a long, page-spanning body. Inert when nothing
316-
follows (a trailing heading is never moved) and best-effort when the heading plus the
317-
first slice cannot share a page. Default off, so layouts that do not opt in are
318-
unchanged.
319-
- `LineBuilder.keepWithNext()` — the line counterpart of
320-
`SectionBuilder.keepWithNext()`, so a full-width header rule joins its banner's
321-
keep-with-next run and the whole title block (rule + banner + rule) relocates
322-
together instead of the banner stranding apart from its rules or its body.
323-
- **Single-column CV presets no longer orphan a section title.** Every preset whose
324-
sections flow down the page — BoxedSections, MinimalUnderlined, ModernProfessional,
325-
Executive, CenteredHeadline, BlueBanner, EditorialBlue, and ClassicSerif — keeps a
326-
section heading with the first line of its body across a page break: a standalone
327-
header section binds to the following body section (a multi-node rule + banner + rule
328-
group binds as one run), and a combined header+body module keeps the heading in a
329-
nested keep-with-next group — including Panel's full-width Profile card, whose header
330-
now stays with the summary if a long profile splits the card. Multi-column presets
331-
place their sections in fixed columns that do not paginate, so no heading can strand
332-
there.
333-
- **The Modern Proposal template no longer orphans a section heading.** Its flowing
334-
section bodies, the Timeline and Investment tables, and the Acceptance terms each keep
335-
their title with the first line of the block it introduces across a page break — each
336-
title now renders in its own keep-with-next section rather than a bare paragraph.
337345
- **Reproducible PDF output** (`@Beta`). `PdfFixedLayoutBackend.builder().deterministic(true)`
338346
(or `.deterministic(Instant)` for an explicit timestamp) pins the document
339347
CreationDate / ModDate and derives the PDF `/ID` from the document metadata instead

benchmarks/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<parent>
88
<groupId>io.github.demchaav</groupId>
99
<artifactId>graph-compose-build</artifactId>
10-
<version>2.0.1-SNAPSHOT</version>
10+
<version>2.1.0-SNAPSHOT</version>
1111
<relativePath>../pom.xml</relativePath>
1212
</parent>
1313

bundle/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
graph-compose and graph-compose-templates dependencies below use
3333
${project.version}, so they follow automatically.
3434
-->
35-
<version>2.0.1-SNAPSHOT</version>
35+
<version>2.1.0-SNAPSHOT</version>
3636
<packaging>jar</packaging>
3737

3838
<name>GraphCompose Bundle</name>

core/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>io.github.demchaav</groupId>
88
<artifactId>graph-compose-core</artifactId>
9-
<version>2.0.1-SNAPSHOT</version>
9+
<version>2.1.0-SNAPSHOT</version>
1010

1111
<name>GraphCompose Core</name>
1212
<description>A declarative layout engine for programmatic document generation, implemented primarily in Java. This is the lean engine coordinate; depend on the `graph-compose` artifact for the drop-in, PDF-capable install.</description>

core/src/main/java/com/demcha/compose/document/dsl/LineBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ public LineBuilder fill() {
289289
* {@link SectionBuilder#keepWithNext()}.
290290
*
291291
* @return this builder
292-
* @since 2.0.0
292+
* @since 2.1.0
293293
*/
294294
public LineBuilder keepWithNext() {
295295
this.keepWithNext = true;
@@ -301,7 +301,7 @@ public LineBuilder keepWithNext() {
301301
*
302302
* @param value true to keep the line with the next block
303303
* @return this builder
304-
* @since 2.0.0
304+
* @since 2.1.0
305305
*/
306306
public LineBuilder keepWithNext(boolean value) {
307307
this.keepWithNext = value;

core/src/main/java/com/demcha/compose/document/dsl/SectionBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public SectionBuilder keepTogether(boolean value) {
6060
* nothing follows the section on the page.
6161
*
6262
* @return this builder
63-
* @since 2.0.0
63+
* @since 2.1.0
6464
*/
6565
public SectionBuilder keepWithNext() {
6666
this.keepWithNext = true;
@@ -72,7 +72,7 @@ public SectionBuilder keepWithNext() {
7272
*
7373
* @param value true to keep the section with the first line of the next block
7474
* @return this builder
75-
* @since 2.0.0
75+
* @since 2.1.0
7676
*/
7777
public SectionBuilder keepWithNext(boolean value) {
7878
this.keepWithNext = value;

core/src/main/java/com/demcha/compose/document/layout/NodeDefinition.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ default List<LayoutFragment> emitOverlayFragments(PreparedNode<E> prepared,
132132
*
133133
* @param prepared prepared node whose first slice is being measured
134134
* @return the first slice's height in points
135-
* @since 2.0.0
135+
* @since 2.1.0
136136
*/
137137
default double firstSliceHeight(PreparedNode<E> prepared) {
138138
return prepared.measureResult().height();

core/src/main/java/com/demcha/compose/document/node/DocumentNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ default boolean keepTogether() {
9999
* siblings relocate together, with the break hoisted before the run.</p>
100100
*
101101
* @return true to keep this node with the first line of the following block
102-
* @since 2.0.0
102+
* @since 2.1.0
103103
*/
104104
default boolean keepWithNext() {
105105
return false;

coverage/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
<parent>
3030
<groupId>io.github.demchaav</groupId>
3131
<artifactId>graph-compose-build</artifactId>
32-
<version>2.0.1-SNAPSHOT</version>
32+
<version>2.1.0-SNAPSHOT</version>
3333
<relativePath>../pom.xml</relativePath>
3434
</parent>
3535

examples/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<parent>
88
<groupId>io.github.demchaav</groupId>
99
<artifactId>graph-compose-build</artifactId>
10-
<version>2.0.1-SNAPSHOT</version>
10+
<version>2.1.0-SNAPSHOT</version>
1111
<relativePath>../pom.xml</relativePath>
1212
</parent>
1313

0 commit comments

Comments
 (0)