|
3 | 3 | All notable changes to GraphCompose are documented here. Versions |
4 | 4 | follow semantic versioning; release dates are ISO 8601. |
5 | 5 |
|
6 | | -## v2.1.0 — in progress |
| 6 | +## v2.1.0 — Planned |
7 | 7 |
|
8 | 8 | ### Public API |
9 | 9 |
|
| 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. |
10 | 49 | - **CV entry titles and subtitles accept inline `[text](url)` links.** In the layered |
11 | 50 | CV presets, a `[label](url)` in an experience/education entry title or subtitle now |
12 | 51 | renders as a clickable hyperlink — the same inline-Markdown convention already used |
@@ -303,37 +342,6 @@ for this cycle. |
303 | 342 |
|
304 | 343 | ### Public API |
305 | 344 |
|
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. |
337 | 345 | - **Reproducible PDF output** (`@Beta`). `PdfFixedLayoutBackend.builder().deterministic(true)` |
338 | 346 | (or `.deterministic(Instant)` for an explicit timestamp) pins the document |
339 | 347 | CreationDate / ModDate and derives the PDF `/ID` from the document metadata instead |
|
0 commit comments