diff --git a/src/main/java/com/demcha/compose/document/templates/cv/v2/data/CvContact.java b/src/main/java/com/demcha/compose/document/templates/core/identity/Contact.java
similarity index 87%
rename from src/main/java/com/demcha/compose/document/templates/cv/v2/data/CvContact.java
rename to src/main/java/com/demcha/compose/document/templates/core/identity/Contact.java
index ef8543d9f..88f96ca7c 100644
--- a/src/main/java/com/demcha/compose/document/templates/cv/v2/data/CvContact.java
+++ b/src/main/java/com/demcha/compose/document/templates/core/identity/Contact.java
@@ -1,4 +1,4 @@
-package com.demcha.compose.document.templates.cv.v2.data;
+package com.demcha.compose.document.templates.core.identity;
import java.util.Objects;
@@ -13,12 +13,12 @@
* @param email non-blank email (rendered as a clickable mailto link)
* @param address non-blank location / postal address line
*/
-public record CvContact(String phone, String email, String address) {
+public record Contact(String phone, String email, String address) {
/**
* Validates that every field is non-null and non-blank.
*/
- public CvContact {
+ public Contact {
Objects.requireNonNull(phone, "phone");
Objects.requireNonNull(email, "email");
Objects.requireNonNull(address, "address");
diff --git a/src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/ContactLine.java b/src/main/java/com/demcha/compose/document/templates/core/identity/ContactLine.java
similarity index 91%
rename from src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/ContactLine.java
rename to src/main/java/com/demcha/compose/document/templates/core/identity/ContactLine.java
index ed2cec482..a0b900ca6 100644
--- a/src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/ContactLine.java
+++ b/src/main/java/com/demcha/compose/document/templates/core/identity/ContactLine.java
@@ -1,13 +1,10 @@
-package com.demcha.compose.document.templates.cv.v2.widgets;
+package com.demcha.compose.document.templates.core.identity;
import com.demcha.compose.document.dsl.SectionBuilder;
import com.demcha.compose.document.node.DocumentLinkOptions;
import com.demcha.compose.document.node.TextAlign;
import com.demcha.compose.document.style.DocumentInsets;
import com.demcha.compose.document.style.DocumentTextStyle;
-import com.demcha.compose.document.templates.cv.v2.data.CvContact;
-import com.demcha.compose.document.templates.cv.v2.data.CvIdentity;
-import com.demcha.compose.document.templates.cv.v2.data.CvLink;
import com.demcha.compose.document.templates.core.theme.BrandTheme;
import java.util.ArrayList;
@@ -34,7 +31,7 @@
*
*
*
Email is always rendered as a clickable {@code mailto:} link;
- * each optional {@link CvLink} becomes a clickable hyperlink with
+ * each optional {@link Link} becomes a clickable hyperlink with
* the {@code label} as the visible text. The separator glyph comes
* from {@code theme.decoration().contactSeparator()}.
*/
@@ -52,14 +49,14 @@ private ContactLine() {
* @param identity the CV identity supplying contact fields and links
* @param theme the active theme supplying palette, typography, and spacing
*/
- public static void centered(SectionBuilder host, CvIdentity identity, BrandTheme theme) {
+ public static void centered(SectionBuilder host, PartyIdentity identity, BrandTheme theme) {
render(host, identity, theme, TextAlign.CENTER, Order.PHONE_FIRST);
}
/**
* Centred contact row with explicit text-style overrides for
* non-link text, clickable links, and separators. Same ordering as
- * {@link #centered(SectionBuilder, CvIdentity, BrandTheme)}, but lets
+ * {@link #centered(SectionBuilder, PartyIdentity, BrandTheme)}, but lets
* editorial presets tint / underline the links without forking the
* contact assembly logic.
*
@@ -76,7 +73,7 @@ public static void centered(SectionBuilder host, CvIdentity identity, BrandTheme
* {@code null} →
* {@code theme.contactSeparatorStyle()}
*/
- public static void centered(SectionBuilder host, CvIdentity identity,
+ public static void centered(SectionBuilder host, PartyIdentity identity,
BrandTheme theme,
DocumentTextStyle bodyStyleOverride,
DocumentTextStyle linkStyleOverride,
@@ -94,7 +91,7 @@ public static void centered(SectionBuilder host, CvIdentity identity,
* @param identity the CV identity supplying contact fields and links
* @param theme the active theme supplying palette, typography, and spacing
*/
- public static void rightAligned(SectionBuilder host, CvIdentity identity, BrandTheme theme) {
+ public static void rightAligned(SectionBuilder host, PartyIdentity identity, BrandTheme theme) {
render(host, identity, theme, TextAlign.RIGHT, Order.ADDRESS_FIRST);
}
@@ -107,7 +104,7 @@ public static void rightAligned(SectionBuilder host, CvIdentity identity, BrandT
* @param identity the CV identity supplying contact fields and links
* @param theme the active theme supplying palette, typography, and spacing
*/
- public static void leftAligned(SectionBuilder host, CvIdentity identity,
+ public static void leftAligned(SectionBuilder host, PartyIdentity identity,
BrandTheme theme) {
render(host, identity, theme, TextAlign.LEFT, Order.ADDRESS_FIRST);
}
@@ -129,7 +126,7 @@ public static void leftAligned(SectionBuilder host, CvIdentity identity,
* {@code null} ->
* {@code theme.contactSeparatorStyle()}
*/
- public static void leftAligned(SectionBuilder host, CvIdentity identity,
+ public static void leftAligned(SectionBuilder host, PartyIdentity identity,
BrandTheme theme,
DocumentTextStyle bodyStyleOverride,
DocumentTextStyle linkStyleOverride,
@@ -151,7 +148,7 @@ public static void leftAligned(SectionBuilder host, CvIdentity identity,
*
Email and every {@link CvLink} are rendered as proper PDF
+ *
Email and every {@link Link} are rendered as proper PDF
* hyperlinks (mailto: for the email, the link's URL for each
* label) — not just styled text.
*
@@ -168,7 +165,7 @@ public static void leftAligned(SectionBuilder host, CvIdentity identity,
* separator; {@code null} →
* {@code theme.contactSeparatorStyle()}
*/
- public static void twoRowRightAligned(SectionBuilder host, CvIdentity identity,
+ public static void twoRowRightAligned(SectionBuilder host, PartyIdentity identity,
BrandTheme theme,
DocumentTextStyle bodyStyleOverride,
DocumentTextStyle linkStyleOverride,
@@ -180,7 +177,7 @@ public static void twoRowRightAligned(SectionBuilder host, CvIdentity identity,
DocumentTextStyle separatorStyle = separatorStyleOverride != null
? separatorStyleOverride : theme.contactSeparatorStyle();
- CvContact c = identity.contact();
+ Contact c = identity.contact();
host.spacing(0).padding(theme.spacing().contactPadding())
// Row 1 — address + phone.
.addParagraph(p -> p
@@ -200,7 +197,7 @@ public static void twoRowRightAligned(SectionBuilder host, CvIdentity identity,
.rich(rich -> {
rich.with(c.email(), linkStyle,
new DocumentLinkOptions("mailto:" + c.email()));
- for (CvLink l : identity.links()) {
+ for (Link l : identity.links()) {
rich.style(" | ", separatorStyle);
rich.with(l.label(), linkStyle,
new DocumentLinkOptions(l.url()));
@@ -218,7 +215,7 @@ public static void twoRowRightAligned(SectionBuilder host, CvIdentity identity,
* @param theme the active theme supplying palette, typography, and spacing
*/
public static void rightAlignedStacked(SectionBuilder host,
- CvIdentity identity,
+ PartyIdentity identity,
BrandTheme theme) {
rightAlignedStacked(host, identity, theme, null, null);
}
@@ -236,7 +233,7 @@ public static void rightAlignedStacked(SectionBuilder host,
* → resolved body style
*/
public static void rightAlignedStacked(SectionBuilder host,
- CvIdentity identity,
+ PartyIdentity identity,
BrandTheme theme,
DocumentTextStyle bodyStyleOverride,
DocumentTextStyle linkStyleOverride) {
@@ -274,7 +271,7 @@ public static void rightAlignedStacked(SectionBuilder host,
* @param alignment horizontal text alignment for the row
* @param order the field order in the rendered line
*/
- public static void render(SectionBuilder host, CvIdentity identity, BrandTheme theme,
+ public static void render(SectionBuilder host, PartyIdentity identity, BrandTheme theme,
TextAlign alignment, Order order) {
List parts = parts(identity, order);
DocumentTextStyle textStyle = theme.contactStyle();
@@ -302,7 +299,7 @@ public static void render(SectionBuilder host, CvIdentity identity, BrandTheme t
}));
}
- private static void renderStyled(SectionBuilder host, CvIdentity identity,
+ private static void renderStyled(SectionBuilder host, PartyIdentity identity,
BrandTheme theme, TextAlign alignment,
Order order,
DocumentTextStyle bodyStyleOverride,
@@ -352,8 +349,8 @@ public enum Order {
ADDRESS_FIRST
}
- private static List parts(CvIdentity identity, Order order) {
- CvContact c = identity.contact();
+ private static List parts(PartyIdentity identity, Order order) {
+ Contact c = identity.contact();
List parts = new ArrayList<>(4 + identity.links().size());
DocumentLinkOptions email = new DocumentLinkOptions("mailto:" + c.email());
switch (order) {
@@ -368,7 +365,7 @@ private static List parts(CvIdentity identity, Order order) {
parts.add(new Part(c.email(), email));
}
}
- for (CvLink link : identity.links()) {
+ for (Link link : identity.links()) {
parts.add(new Part(link.label(), new DocumentLinkOptions(link.url())));
}
return parts;
diff --git a/src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/Headline.java b/src/main/java/com/demcha/compose/document/templates/core/identity/Headline.java
similarity index 89%
rename from src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/Headline.java
rename to src/main/java/com/demcha/compose/document/templates/core/identity/Headline.java
index e3e6cf78c..2ed21edd1 100644
--- a/src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/Headline.java
+++ b/src/main/java/com/demcha/compose/document/templates/core/identity/Headline.java
@@ -1,11 +1,10 @@
-package com.demcha.compose.document.templates.cv.v2.widgets;
+package com.demcha.compose.document.templates.core.identity;
import com.demcha.compose.document.dsl.SectionBuilder;
import com.demcha.compose.document.node.TextAlign;
import com.demcha.compose.document.style.DocumentInsets;
import com.demcha.compose.document.style.DocumentTextStyle;
import com.demcha.compose.document.templates.core.text.TextOrnaments;
-import com.demcha.compose.document.templates.cv.v2.data.CvName;
import com.demcha.compose.document.templates.core.theme.BrandTheme;
/**
@@ -55,7 +54,7 @@ private Headline() {
* @param name name to render
* @param theme the active theme supplying palette, typography, and spacing
*/
- public static void spacedCentered(SectionBuilder host, CvName name, BrandTheme theme) {
+ public static void spacedCentered(SectionBuilder host, String name, BrandTheme theme) {
render(host, name, theme, TextAlign.CENTER, true);
}
@@ -68,7 +67,7 @@ public static void spacedCentered(SectionBuilder host, CvName name, BrandTheme t
* @param name name to render
* @param theme the active theme supplying palette, typography, and spacing
*/
- public static void uppercaseCentered(SectionBuilder host, CvName name,
+ public static void uppercaseCentered(SectionBuilder host, String name,
BrandTheme theme) {
uppercaseCentered(host, name, theme, null);
}
@@ -83,10 +82,10 @@ public static void uppercaseCentered(SectionBuilder host, CvName name,
* @param styleOverride explicit style; pass {@code null} to fall
* back to {@code theme.headlineStyle()}
*/
- public static void uppercaseCentered(SectionBuilder host, CvName name,
+ public static void uppercaseCentered(SectionBuilder host, String name,
BrandTheme theme,
DocumentTextStyle styleOverride) {
- renderText(host, name.full().toUpperCase(java.util.Locale.ROOT),
+ renderText(host, name.toUpperCase(java.util.Locale.ROOT),
theme, TextAlign.CENTER, styleOverride);
}
@@ -99,7 +98,7 @@ public static void uppercaseCentered(SectionBuilder host, CvName name,
* @param name name to render
* @param theme the active theme supplying palette, typography, and spacing
*/
- public static void uppercaseLeftAligned(SectionBuilder host, CvName name,
+ public static void uppercaseLeftAligned(SectionBuilder host, String name,
BrandTheme theme) {
uppercaseLeftAligned(host, name, theme, null);
}
@@ -114,10 +113,10 @@ public static void uppercaseLeftAligned(SectionBuilder host, CvName name,
* @param styleOverride explicit style; pass {@code null} to fall
* back to {@code theme.headlineStyle()}
*/
- public static void uppercaseLeftAligned(SectionBuilder host, CvName name,
+ public static void uppercaseLeftAligned(SectionBuilder host, String name,
BrandTheme theme,
DocumentTextStyle styleOverride) {
- renderText(host, name.full().toUpperCase(java.util.Locale.ROOT),
+ renderText(host, name.toUpperCase(java.util.Locale.ROOT),
theme, TextAlign.LEFT, styleOverride);
}
@@ -131,7 +130,7 @@ public static void uppercaseLeftAligned(SectionBuilder host, CvName name,
* @param name name to render
* @param theme the active theme supplying palette, typography, and spacing
*/
- public static void rightAligned(SectionBuilder host, CvName name, BrandTheme theme) {
+ public static void rightAligned(SectionBuilder host, String name, BrandTheme theme) {
rightAligned(host, name, theme, null);
}
@@ -147,7 +146,7 @@ public static void rightAligned(SectionBuilder host, CvName name, BrandTheme the
* @param styleOverride text style for the headline; pass {@code null}
* to fall back to {@code theme.headlineStyle()}
*/
- public static void rightAligned(SectionBuilder host, CvName name, BrandTheme theme,
+ public static void rightAligned(SectionBuilder host, String name, BrandTheme theme,
DocumentTextStyle styleOverride) {
render(host, name, theme, TextAlign.RIGHT, false, styleOverride);
}
@@ -165,14 +164,14 @@ public static void rightAligned(SectionBuilder host, CvName name, BrandTheme the
* @param spacedCaps if true, transforms to letter-spaced
* uppercase; if false, renders verbatim
*/
- public static void render(SectionBuilder host, CvName name, BrandTheme theme,
+ public static void render(SectionBuilder host, String name, BrandTheme theme,
TextAlign alignment, boolean spacedCaps) {
render(host, name, theme, alignment, spacedCaps, null);
}
/**
* Lower-level entry with explicit style override. Same shape as
- * the 5-arg {@link #render(SectionBuilder, CvName, BrandTheme, TextAlign, boolean)}
+ * the 5-arg {@link #render(SectionBuilder, String, BrandTheme, TextAlign, boolean)}
* but lets the caller supply a custom {@link DocumentTextStyle}.
*
* @param host host section
@@ -184,15 +183,15 @@ public static void render(SectionBuilder host, CvName name, BrandTheme theme,
* @param styleOverride explicit style; pass {@code null} to fall
* back to {@code theme.headlineStyle()}
*/
- public static void render(SectionBuilder host, CvName name, BrandTheme theme,
+ public static void render(SectionBuilder host, String name, BrandTheme theme,
TextAlign alignment, boolean spacedCaps,
DocumentTextStyle styleOverride) {
DocumentTextStyle style = styleOverride != null
? styleOverride
: theme.headlineStyle();
String text = spacedCaps
- ? TextOrnaments.spacedUpper(name.full())
- : name.full();
+ ? TextOrnaments.spacedUpper(name)
+ : name;
renderText(host, text, theme, alignment, style);
}
diff --git a/src/main/java/com/demcha/compose/document/templates/cv/v2/data/CvLink.java b/src/main/java/com/demcha/compose/document/templates/core/identity/Link.java
similarity index 70%
rename from src/main/java/com/demcha/compose/document/templates/cv/v2/data/CvLink.java
rename to src/main/java/com/demcha/compose/document/templates/core/identity/Link.java
index 6d5928efb..85dbe7348 100644
--- a/src/main/java/com/demcha/compose/document/templates/cv/v2/data/CvLink.java
+++ b/src/main/java/com/demcha/compose/document/templates/core/identity/Link.java
@@ -1,4 +1,4 @@
-package com.demcha.compose.document.templates.cv.v2.data;
+package com.demcha.compose.document.templates.core.identity;
import java.util.Objects;
@@ -9,12 +9,12 @@
* @param label visible link text (required, non-blank)
* @param url click target (required, non-blank)
*/
-public record CvLink(String label, String url) {
+public record Link(String label, String url) {
/**
* Validates that both fields are non-null and non-blank.
*/
- public CvLink {
+ public Link {
Objects.requireNonNull(label, "label");
Objects.requireNonNull(url, "url");
if (label.isBlank()) {
@@ -26,14 +26,14 @@ public record CvLink(String label, String url) {
}
/**
- * Convenience factory mirroring {@code CvLink.of("LinkedIn",
+ * Convenience factory mirroring {@code Link.of("LinkedIn",
* "https://...")} call sites.
*
* @param label visible link text (required, non-blank)
* @param url click target (required, non-blank)
- * @return a {@code CvLink} with the given label and target
+ * @return a {@code Link} with the given label and target
*/
- public static CvLink of(String label, String url) {
- return new CvLink(label, url);
+ public static Link of(String label, String url) {
+ return new Link(label, url);
}
}
diff --git a/src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/Masthead.java b/src/main/java/com/demcha/compose/document/templates/core/identity/Masthead.java
similarity index 94%
rename from src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/Masthead.java
rename to src/main/java/com/demcha/compose/document/templates/core/identity/Masthead.java
index e4f7b0331..38395f7d8 100644
--- a/src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/Masthead.java
+++ b/src/main/java/com/demcha/compose/document/templates/core/identity/Masthead.java
@@ -1,12 +1,10 @@
-package com.demcha.compose.document.templates.cv.v2.widgets;
+package com.demcha.compose.document.templates.core.identity;
import com.demcha.compose.document.dsl.SectionBuilder;
import com.demcha.compose.document.node.DocumentLinkOptions;
import com.demcha.compose.document.node.TextAlign;
import com.demcha.compose.document.style.DocumentInsets;
import com.demcha.compose.document.style.DocumentTextStyle;
-import com.demcha.compose.document.templates.cv.v2.data.CvIdentity;
-import com.demcha.compose.document.templates.cv.v2.data.CvLink;
import com.demcha.compose.document.templates.core.theme.BrandTheme;
import java.util.ArrayList;
@@ -32,16 +30,16 @@ private Masthead() {
* {@link Style#defaults(BrandTheme)}
*/
public static void centered(SectionBuilder host,
- CvIdentity identity,
+ PartyIdentity identity,
BrandTheme theme,
Style style) {
Style safeStyle = style == null ? Style.defaults(theme) : style;
DocumentTextStyle nameStyle = safeStyle.nameStyle() == null
? theme.headlineStyle()
: safeStyle.nameStyle();
- Headline.uppercaseCentered(host, identity.name(), theme,
+ Headline.uppercaseCentered(host, identity.displayName(), theme,
nameStyle);
- addOptionalLine(host, identity.jobTitle(), safeStyle.titleStyle(),
+ addOptionalLine(host, identity.tagline(), safeStyle.titleStyle(),
safeStyle.lineMargin());
addOptionalLine(host,
join(safeStyle.metaJoiner(),
@@ -66,7 +64,7 @@ private static void addOptionalLine(SectionBuilder host,
}
private static void addLinkRow(SectionBuilder host,
- CvIdentity identity,
+ PartyIdentity identity,
BrandTheme theme,
Style style) {
List parts = linkParts(identity);
@@ -103,14 +101,14 @@ private static void addLinkRow(SectionBuilder host,
}));
}
- private static List linkParts(CvIdentity identity) {
+ private static List linkParts(PartyIdentity identity) {
List parts = new ArrayList<>();
String email = identity.contact().email();
if (!email.isBlank()) {
parts.add(new LinkPart(email,
new DocumentLinkOptions("mailto:" + email)));
}
- for (CvLink link : identity.links()) {
+ for (Link link : identity.links()) {
if (!link.label().isBlank()) {
parts.add(new LinkPart(link.label(), link.url().isBlank()
? null
diff --git a/src/main/java/com/demcha/compose/document/templates/core/identity/PartyIdentity.java b/src/main/java/com/demcha/compose/document/templates/core/identity/PartyIdentity.java
new file mode 100644
index 000000000..e20491fcf
--- /dev/null
+++ b/src/main/java/com/demcha/compose/document/templates/core/identity/PartyIdentity.java
@@ -0,0 +1,45 @@
+package com.demcha.compose.document.templates.core.identity;
+
+import java.util.List;
+
+/**
+ * Family-neutral identity contract rendered by the shared header widgets
+ * ({@link Headline}, {@link ContactLine}, {@link Masthead}). A CV supplies a
+ * person; an invoice or proposal supplies an organisation — both implement
+ * this interface, so the same widgets draw either masthead without knowing the
+ * family's concrete data model.
+ *
+ * @since 2.0.0
+ */
+public interface PartyIdentity {
+
+ /**
+ * Full display name — a person's full name for a CV, a company name for an
+ * invoice or proposal.
+ *
+ * @return the display name, never {@code null}
+ */
+ String displayName();
+
+ /**
+ * Secondary line shown under the name — a job title for a CV, a strapline
+ * for an organisation. May be empty when the family has no tagline.
+ *
+ * @return the tagline, never {@code null} (empty when absent)
+ */
+ String tagline();
+
+ /**
+ * Contact block (phone / email / address).
+ *
+ * @return the contact details, never {@code null}
+ */
+ Contact contact();
+
+ /**
+ * Labelled links (portfolio, social, web).
+ *
+ * @return the links in display order, never {@code null}
+ */
+ List links();
+}
diff --git a/src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/Subheadline.java b/src/main/java/com/demcha/compose/document/templates/core/identity/Subheadline.java
similarity index 97%
rename from src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/Subheadline.java
rename to src/main/java/com/demcha/compose/document/templates/core/identity/Subheadline.java
index bcc56eb8e..6fde920b4 100644
--- a/src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/Subheadline.java
+++ b/src/main/java/com/demcha/compose/document/templates/core/identity/Subheadline.java
@@ -1,4 +1,4 @@
-package com.demcha.compose.document.templates.cv.v2.widgets;
+package com.demcha.compose.document.templates.core.identity;
import com.demcha.compose.document.dsl.SectionBuilder;
import com.demcha.compose.document.node.TextAlign;
diff --git a/src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/SvgGlyph.java b/src/main/java/com/demcha/compose/document/templates/core/identity/SvgGlyph.java
similarity index 96%
rename from src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/SvgGlyph.java
rename to src/main/java/com/demcha/compose/document/templates/core/identity/SvgGlyph.java
index 8ee51189c..d33001a98 100644
--- a/src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/SvgGlyph.java
+++ b/src/main/java/com/demcha/compose/document/templates/core/identity/SvgGlyph.java
@@ -1,4 +1,4 @@
-package com.demcha.compose.document.templates.cv.v2.widgets;
+package com.demcha.compose.document.templates.core.identity;
import com.demcha.compose.document.style.DocumentColor;
import com.demcha.compose.document.style.DocumentPathSegment;
@@ -43,8 +43,8 @@
*
*
Reuse
*
- *
Lives in {@code cv/v2/widgets} as the shared glyph primitive behind
- * {@link IconTextRow} and the per-preset contact rows. Reuse it instead of
+ *
Lives in the core identity layer as the shared glyph primitive behind
+ * the header widgets and per-preset contact rows. Reuse it instead of
* loading icon bytes by hand.
*/
public final class SvgGlyph {
diff --git a/src/main/java/com/demcha/compose/document/templates/core/identity/package-info.java b/src/main/java/com/demcha/compose/document/templates/core/identity/package-info.java
new file mode 100644
index 000000000..b46b1fc05
--- /dev/null
+++ b/src/main/java/com/demcha/compose/document/templates/core/identity/package-info.java
@@ -0,0 +1,25 @@
+/**
+ *
Core — neutral identity (identity)
+ *
+ *
The family-neutral identity layer shared by every template family. A
+ * masthead is the same shape everywhere — a name, an optional tagline, a
+ * contact block, and a set of links — so the contract and the widgets that
+ * draw it live here rather than in any one family.
+ *
+ *
+ *
{@link com.demcha.compose.document.templates.core.identity.PartyIdentity}
+ * — the contract a family's identity record implements
+ * ({@code CvIdentity} for a CV, an org record for invoice / proposal).
+ *
{@link com.demcha.compose.document.templates.core.identity.Contact} /
+ * {@link com.demcha.compose.document.templates.core.identity.Link}
+ * — the contact-block and labelled-link value records.
+ *
{@link com.demcha.compose.document.templates.core.identity.Headline} /
+ * {@link com.demcha.compose.document.templates.core.identity.Subheadline} /
+ * {@link com.demcha.compose.document.templates.core.identity.ContactLine} /
+ * {@link com.demcha.compose.document.templates.core.identity.Masthead}
+ * — the header widgets that render a {@code PartyIdentity}.
+ *
{@link com.demcha.compose.document.templates.core.identity.SvgGlyph}
+ * — a small inline-SVG glyph helper used by the header widgets.
Required pieces have their own types ({@link CvName},
- * {@link CvContact}); optional links are accumulated through the
+ * {@link Contact}); optional links are accumulated through the
* builder's {@code link(...)} method — added when the author wants
* them, simply omitted otherwise.
Unlike {@link Headline} (one rendering shape, two text
+ *
Unlike {@link com.demcha.compose.document.templates.core.identity.Headline}
+ * (one rendering shape, two text
* transforms), section headers are structurally
* different per variant — soft-panel vs accentBottom vs plain
* paragraph. That's why each variant gets its own factory method
diff --git a/src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/package-info.java b/src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/package-info.java
index f170e9aec..4230eb462 100644
--- a/src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/package-info.java
+++ b/src/main/java/com/demcha/compose/document/templates/cv/v2/widgets/package-info.java
@@ -41,19 +41,19 @@
*
{@link com.demcha.compose.document.templates.core.identity.Subheadline}
* — secondary tagline under the name in 1 variant
* ({@code centeredSpacedCaps}).