Skip to content

classic_theme

color_common_description = 'The color can be specified either with their name (https://www.w3.org/TR/SVG11/types.html#ColorKeywords), hexadecimal value, RGB value, or HSL value.' module-attribute

color_common_examples = ['Black', '7fffd4', 'rgb(0,79,144)', 'hsl(270, 60%, 70%)'] module-attribute

length_common_description = 'It can be specified with units (cm, in, pt, mm, ex, em). For example, `0.1cm`.' module-attribute

Alignment = Literal['left', 'center', 'right']

BodyAlignment = Literal['left', 'justified', 'justified-with-no-hyphenation']

Bullet = Literal['●', '•', '◦', '-', '◆', '★', '■', '—', '○']

PageSize = Literal['a4', 'a5', 'us-letter', 'us-executive']

PhoneNumberFormatType = Literal['national', 'international', 'E164']

SectionTitleType = Literal['with_partial_line', 'with_full_line', 'without_line', 'moderncv']

Bold

Bases: BaseModelWithoutExtraKeys

connections = pydantic.Field(default=False, description='Whether to make connections bold. The default value is `false`.') class-attribute instance-attribute

headline = pydantic.Field(default=False, description='Whether to make the headline bold. The default value is `false`.') class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

name = pydantic.Field(default=True, description='Whether to make the name bold. The default value is `true`.') class-attribute instance-attribute

section_titles = pydantic.Field(default=True, description='Whether to make section titles bold. The default value is `true`.') class-attribute instance-attribute

ClassicTheme

Bases: BaseModelWithoutExtraKeys

colors = pydantic.Field(default_factory=Colors) class-attribute instance-attribute

entries = pydantic.Field(default_factory=Entries) class-attribute instance-attribute

header = pydantic.Field(default_factory=Header) class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

page = pydantic.Field(default_factory=Page) class-attribute instance-attribute

section_titles = pydantic.Field(default_factory=SectionTitles) class-attribute instance-attribute

sections = pydantic.Field(default_factory=Sections) class-attribute instance-attribute

templates = pydantic.Field(default_factory=Templates) class-attribute instance-attribute

theme = 'classic' class-attribute instance-attribute

typography = pydantic.Field(default_factory=Typography) class-attribute instance-attribute

Colors

Bases: BaseModelWithoutExtraKeys

body = pydantic.Field(default=(Color('rgb(0, 0, 0)')), description=(color_common_description + ' The default value is `rgb(0, 0, 0)`.'), examples=color_common_examples) class-attribute instance-attribute

connections = pydantic.Field(default=(Color('rgb(0, 79, 144)')), description=(color_common_description + ' The default value is `rgb(0, 79, 144)`.'), examples=color_common_examples) class-attribute instance-attribute

footer = pydantic.Field(default=(Color('rgb(128, 128, 128)')), description=(color_common_description + ' The default value is `rgb(128, 128, 128)`.'), examples=color_common_examples) class-attribute instance-attribute

headline = pydantic.Field(default=(Color('rgb(0, 79, 144)')), description=(color_common_description + ' The default value is `rgb(0, 79, 144)`.'), examples=color_common_examples) class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

name = pydantic.Field(default=(Color('rgb(0, 79, 144)')), description=(color_common_description + ' The default value is `rgb(0, 79, 144)`.'), examples=color_common_examples) class-attribute instance-attribute

section_titles = pydantic.Field(default=(Color('rgb(0, 79, 144)')), description=(color_common_description + ' The default value is `rgb(0, 79, 144)`.'), examples=color_common_examples) class-attribute instance-attribute

top_note = pydantic.Field(default=(Color('rgb(128, 128, 128)')), description=(color_common_description + ' The default value is `rgb(128, 128, 128)`.'), examples=color_common_examples) class-attribute instance-attribute

Connections

Bases: BaseModelWithoutExtraKeys

display_urls_instead_of_usernames = pydantic.Field(default=False, description='Display full URLs instead of labels. The default value is `false`.') class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

phone_number_format = pydantic.Field(default='national', description='Phone number format. The default value is `national`.') class-attribute instance-attribute

separator = pydantic.Field(default='', description="Character(s) to separate contact items (e.g., '|' or '•'). Leave empty for no separator. The default value is `''`.") class-attribute instance-attribute

show_icons = pydantic.Field(default=True, description='Show icons next to contact information. The default value is `true`.') class-attribute instance-attribute

space_between_connections = pydantic.Field(default='0.5cm', description=('Horizontal space between contact items. ' + length_common_description + ' The default value is `0.5cm`.')) class-attribute instance-attribute

EducationEntry

Bases: BaseModelWithoutExtraKeys

date_and_location_column = pydantic.Field(default='LOCATION\nDATE', description='Template for education entry date/location column. Available placeholders:\n- `INSTITUTION`: Institution name\n- `AREA`: Field of study/major\n- `DEGREE`: Degree type (e.g., BS, PhD)\n- `SUMMARY`: Summary text\n- `HIGHLIGHTS`: Bullet points list\n- `LOCATION`: Location text\n- `DATE`: Formatted date or date range\n\nYou can also add arbitrary keys to entries and use them as UPPERCASE placeholders.\n\nThe default value is `LOCATION\\nDATE`.') class-attribute instance-attribute

degree_column = pydantic.Field(default='**DEGREE**', description='Optional degree column template. If provided, displays degree in separate column. If `null`, no degree column is shown. Available placeholders:\n- `INSTITUTION`: Institution name\n- `AREA`: Field of study/major\n- `DEGREE`: Degree type (e.g., BS, PhD)\n- `SUMMARY`: Summary text\n- `HIGHLIGHTS`: Bullet points list\n- `LOCATION`: Location text\n- `DATE`: Formatted date or date range\n\nYou can also add arbitrary keys to entries and use them as UPPERCASE placeholders.\n\nThe default value is `**DEGREE**`.') class-attribute instance-attribute

main_column = pydantic.Field(default='**INSTITUTION**, AREA\nSUMMARY\nHIGHLIGHTS', description='Template for education entry main column. Available placeholders:\n- `INSTITUTION`: Institution name\n- `AREA`: Field of study/major\n- `DEGREE`: Degree type (e.g., BS, PhD)\n- `SUMMARY`: Summary text\n- `HIGHLIGHTS`: Bullet points list\n- `LOCATION`: Location text\n- `DATE`: Formatted date or date range\n\nYou can also add arbitrary keys to entries and use them as UPPERCASE placeholders.\n\nThe default value is `**INSTITUTION**, AREA\\nSUMMARY\\nHIGHLIGHTS`.') class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

Entries

Bases: BaseModelWithoutExtraKeys

allow_page_break = pydantic.Field(default=False, description="Allow page breaks within entries. If false, entries that don't fit will move to a new page. The default value is `false`.") class-attribute instance-attribute

date_and_location_width = pydantic.Field(default='4.15cm', description=('Width of the date/location column. ' + length_common_description + ' The default value is `4.15cm`.')) class-attribute instance-attribute

highlights = pydantic.Field(default_factory=Highlights, description='Highlights settings.') class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

short_second_row = pydantic.Field(default=True, description='Shorten the second row to align with the date/location column. The default value is `true`.') class-attribute instance-attribute

side_space = pydantic.Field(default='0.2cm', description=('Left and right margins. ' + length_common_description + ' The default value is `0.2cm`.')) class-attribute instance-attribute

space_between_columns = pydantic.Field(default='0.1cm', description=('Space between main content and date/location columns. ' + length_common_description + ' The default value is `0.1cm`.')) class-attribute instance-attribute

summary = pydantic.Field(default_factory=Summary, description='Summary text settings.') class-attribute instance-attribute

ExperienceEntry

Bases: BaseModelWithoutExtraKeys

date_and_location_column = pydantic.Field(default='LOCATION\nDATE', description='Template for experience entry date/location column. Available placeholders:\n- `COMPANY`: Company name\n- `POSITION`: Job title/position\n- `SUMMARY`: Summary text\n- `HIGHLIGHTS`: Bullet points list\n- `LOCATION`: Location text\n- `DATE`: Formatted date or date range\n\nYou can also add arbitrary keys to entries and use them as UPPERCASE placeholders.\n\nThe default value is `LOCATION\\nDATE`.') class-attribute instance-attribute

main_column = pydantic.Field(default='**COMPANY**, POSITION\nSUMMARY\nHIGHLIGHTS', description='Template for experience entry main column. Available placeholders:\n- `COMPANY`: Company name\n- `POSITION`: Job title/position\n- `SUMMARY`: Summary text\n- `HIGHLIGHTS`: Bullet points list\n- `LOCATION`: Location text\n- `DATE`: Formatted date or date range\n\nYou can also add arbitrary keys to entries and use them as UPPERCASE placeholders.\n\nThe default value is `**COMPANY**, POSITION\\nSUMMARY\\nHIGHLIGHTS`.') class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

FontFamily

Bases: BaseModelWithoutExtraKeys

body = pydantic.Field(default='Source Sans 3', description='The font family for body text. The default value is `Source Sans 3`.') class-attribute instance-attribute

connections = pydantic.Field(default='Source Sans 3', description='The font family for connections. The default value is `Source Sans 3`.') class-attribute instance-attribute

headline = pydantic.Field(default='Source Sans 3', description='The font family for the headline. The default value is `Source Sans 3`.') class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

name = pydantic.Field(default='Source Sans 3', description='The font family for the name. The default value is `Source Sans 3`.') class-attribute instance-attribute

section_titles = pydantic.Field(default='Source Sans 3', description='The font family for section titles. The default value is `Source Sans 3`.') class-attribute instance-attribute

FontSize

Bases: BaseModelWithoutExtraKeys

body = pydantic.Field(default='10pt', description='The font size for body text. The default value is `10pt`.') class-attribute instance-attribute

connections = pydantic.Field(default='10pt', description='The font size for connections. The default value is `10pt`.') class-attribute instance-attribute

headline = pydantic.Field(default='10pt', description='The font size for the headline. The default value is `10pt`.') class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

name = pydantic.Field(default='30pt', description='The font size for the name. The default value is `30pt`.') class-attribute instance-attribute

section_titles = pydantic.Field(default='1.4em', description='The font size for section titles. The default value is `1.4em`.') class-attribute instance-attribute

Header

Bases: BaseModelWithoutExtraKeys

alignment = pydantic.Field(default='center', description="Header alignment. Options: 'left', 'center', 'right'. The default value is `center`.") class-attribute instance-attribute

connections = pydantic.Field(default_factory=Connections, description='Contact information settings.') class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

photo_position = pydantic.Field(default='left', description='Photo position (left or right). The default value is `left`.') class-attribute instance-attribute

photo_space_left = pydantic.Field(default='0.4cm', description=('Space to the left of the photo. ' + length_common_description + ' The default value is `0.4cm`.')) class-attribute instance-attribute

photo_space_right = pydantic.Field(default='0.4cm', description=('Space to the right of the photo. ' + length_common_description + ' The default value is `0.4cm`.')) class-attribute instance-attribute

photo_width = pydantic.Field(default='3.5cm', description=('Photo width. ' + length_common_description + ' The default value is `3.5cm`.')) class-attribute instance-attribute

space_below_connections = pydantic.Field(default='0.7cm', description=('Space below contact information. ' + length_common_description + ' The default value is `0.7cm`.')) class-attribute instance-attribute

space_below_headline = pydantic.Field(default='0.7cm', description=('Space below the headline. ' + length_common_description + ' The default value is `0.7cm`.')) class-attribute instance-attribute

space_below_name = pydantic.Field(default='0.7cm', description=('Space below your name. ' + length_common_description + ' The default value is `0.7cm`.')) class-attribute instance-attribute

Highlights

Bases: BaseModelWithoutExtraKeys

bullet = pydantic.Field(default='•', description='Bullet character for highlights. The default value is `•`.') class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

nested_bullet = pydantic.Field(default='•', description='Bullet character for nested highlights. The default value is `•`.') class-attribute instance-attribute

space_above = pydantic.Field(default='0cm', description=('Space above highlights. ' + length_common_description + ' The default value is `0cm`.')) class-attribute instance-attribute

space_between_bullet_and_text = pydantic.Field(default='0.5em', description=('Space between bullet and text. ' + length_common_description + ' The default value is `0.5em`.')) class-attribute instance-attribute

space_between_items = pydantic.Field(default='0cm', description=('Space between highlight items. ' + length_common_description + ' The default value is `0cm`.')) class-attribute instance-attribute

space_left = pydantic.Field(default='0.15cm', description=('Left indentation. ' + length_common_description + ' The default value is `0.15cm`.')) class-attribute instance-attribute

Bases: BaseModelWithoutExtraKeys

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

underline = pydantic.Field(default=False, description='Underline hyperlinks. The default value is `false`.') class-attribute instance-attribute

NormalEntry

Bases: BaseModelWithoutExtraKeys

date_and_location_column = pydantic.Field(default='LOCATION\nDATE', description='Template for normal entry date/location column. Available placeholders:\n- `NAME`: Entry name/title\n- `SUMMARY`: Summary text\n- `HIGHLIGHTS`: Bullet points list\n- `LOCATION`: Location text\n- `DATE`: Formatted date or date range\n\nYou can also add arbitrary keys to entries and use them as UPPERCASE placeholders.\n\nThe default value is `LOCATION\\nDATE`.') class-attribute instance-attribute

main_column = pydantic.Field(default='**NAME**\nSUMMARY\nHIGHLIGHTS', description='Template for normal entry main column. Available placeholders:\n- `NAME`: Entry name/title\n- `SUMMARY`: Summary text\n- `HIGHLIGHTS`: Bullet points list\n- `LOCATION`: Location text\n- `DATE`: Formatted date or date range\n\nYou can also add arbitrary keys to entries and use them as UPPERCASE placeholders.\n\nThe default value is `**NAME**\\nSUMMARY\\nHIGHLIGHTS`.') class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

OneLineEntry

Bases: BaseModelWithoutExtraKeys

main_column = pydantic.Field(default='**LABEL:** DETAILS', description='Template for one-line entries. Available placeholders:\n- `LABEL`: The label text (e.g., "Languages", "Citizenship")\n- `DETAILS`: The details text (e.g., "English (native), Spanish (fluent)")\n\nYou can also add arbitrary keys to entries and use them as UPPERCASE placeholders.\n\nThe default value is `**LABEL:** DETAILS`.') class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

Page

Bases: BaseModelWithoutExtraKeys

bottom_margin = pydantic.Field(default='0.7in', description=(length_common_description + ' The default value is `0.7in`.')) class-attribute instance-attribute

left_margin = pydantic.Field(default='0.7in', description=(length_common_description + ' The default value is `0.7in`.')) class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

right_margin = pydantic.Field(default='0.7in', description=(length_common_description + ' The default value is `0.7in`.')) class-attribute instance-attribute

show_top_note = pydantic.Field(default=True, description='Show the top note at the top of the first page. The default value is `true`.') class-attribute instance-attribute

size = pydantic.Field(default='us-letter', description="The page size. Use 'a4' (international standard) or 'us-letter' (US standard). The default value is `us-letter`.") class-attribute instance-attribute

top_margin = pydantic.Field(default='0.7in', description=(length_common_description + ' The default value is `0.7in`.')) class-attribute instance-attribute

PublicationEntry

Bases: BaseModelWithoutExtraKeys

date_and_location_column = pydantic.Field(default='DATE', description='Template for publication entry date column. Available placeholders:\n- `TITLE`: Publication title\n- `AUTHORS`: List of authors (formatted as comma-separated string)\n- `SUMMARY`: Summary/abstract text\n- `DOI`: Digital Object Identifier\n- `URL`: Publication URL (if DOI not provided)\n- `JOURNAL`: Journal/conference/venue name\n- `DATE`: Formatted date\n\nYou can also add arbitrary keys to entries and use them as UPPERCASE placeholders.\n\nThe default value is `DATE`.') class-attribute instance-attribute

main_column = pydantic.Field(default='**TITLE**\nSUMMARY\nAUTHORS\nURL (JOURNAL)', description='Template for publication entry main column. Available placeholders:\n- `TITLE`: Publication title\n- `AUTHORS`: List of authors (formatted as comma-separated string)\n- `SUMMARY`: Summary/abstract text\n- `DOI`: Digital Object Identifier\n- `URL`: Publication URL (if DOI not provided)\n- `JOURNAL`: Journal/conference/venue name\n- `DATE`: Formatted date\n\nYou can also add arbitrary keys to entries and use them as UPPERCASE placeholders.\n\nThe default value is `**TITLE**\\nSUMMARY\\nAUTHORS\\nURL (JOURNAL)`.') class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

SectionTitles

Bases: BaseModelWithoutExtraKeys

line_thickness = pydantic.Field(default='0.5pt', description=(length_common_description + ' The default value is `0.5pt`.')) class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

space_above = pydantic.Field(default='0.5cm', description=(length_common_description + ' The default value is `0.5cm`.')) class-attribute instance-attribute

space_below = pydantic.Field(default='0.3cm', description=(length_common_description + ' The default value is `0.3cm`.')) class-attribute instance-attribute

type = pydantic.Field(default='with_partial_line', description="Section title visual style. Use 'with_partial_line' for a line next to the title, 'with_full_line' for a line across the page, 'without_line' for no line, or 'moderncv' for the ModernCV style. The default value is `with_partial_line`.") class-attribute instance-attribute

Sections

Bases: BaseModelWithoutExtraKeys

allow_page_break = pydantic.Field(default=True, description="Allow page breaks within sections. If false, sections that don't fit will start on a new page. The default value is `true`.") class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

show_time_spans_in = pydantic.Field(default=['experience'], description="Section titles where time spans (e.g., '2 years 3 months') should be displayed. The default value is `['experience']`.", examples=[['Experience'], ['Experience', 'Education']]) class-attribute instance-attribute

space_between_regular_entries = pydantic.Field(default='1.2em', description=('Vertical space between entries. ' + length_common_description + ' The default value is `1.2em`.')) class-attribute instance-attribute

space_between_text_based_entries = pydantic.Field(default='0.3em', description=('Vertical space between text-based entries. ' + length_common_description + ' The default value is `0.3em`.')) class-attribute instance-attribute

convert_section_titles_to_snake_case(value) classmethod

Source code in src/rendercv/schema/models/design/classic_theme.py
@pydantic.field_validator(
    # "page_break_before",
    "show_time_spans_in",
    mode="after",
)
@classmethod
def convert_section_titles_to_snake_case(cls, value: list[str]) -> list[str]:
    return [section_title.lower().replace(" ", "_") for section_title in value]

SmallCaps

Bases: BaseModelWithoutExtraKeys

connections = pydantic.Field(default=False, description='Whether to use small caps for connections. The default value is `false`.') class-attribute instance-attribute

headline = pydantic.Field(default=False, description='Whether to use small caps for the headline. The default value is `false`.') class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

name = pydantic.Field(default=False, description='Whether to use small caps for the name. The default value is `false`.') class-attribute instance-attribute

section_titles = pydantic.Field(default=False, description='Whether to use small caps for section titles. The default value is `false`.') class-attribute instance-attribute

Summary

Bases: BaseModelWithoutExtraKeys

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

space_above = pydantic.Field(default='0cm', description=('Space above summary text. ' + length_common_description + ' The default value is `0cm`.')) class-attribute instance-attribute

space_left = pydantic.Field(default='0cm', description=('Left margin for summary text. ' + length_common_description + ' The default value is `0cm`.')) class-attribute instance-attribute

Templates

Bases: BaseModelWithoutExtraKeys

date_range = pydantic.Field(default='START_DATE – END_DATE', description='Template for date ranges. Available placeholders:\n- `START_DATE`: Formatted start date based on `design.templates.single_date`\n- `END_DATE`: Formatted end date based on `design.templates.single_date` (or "present"/"ongoing" for current positions)\n\nThe default value is `START_DATE – END_DATE`.') class-attribute instance-attribute

education_entry = pydantic.Field(default_factory=EducationEntry, description='Template for education entries.') class-attribute instance-attribute

experience_entry = pydantic.Field(default_factory=ExperienceEntry, description='Template for experience entries.') class-attribute instance-attribute

footer = pydantic.Field(default='*NAME -- PAGE_NUMBER/TOTAL_PAGES*', description="Template for the footer. Available placeholders:\n- `NAME`: The CV owner's name from `cv.name`\n- `PAGE_NUMBER`: Current page number\n- `TOTAL_PAGES`: Total number of pages\n- `CURRENT_DATE`: Formatted date based on `design.templates.single_date`\n- `MONTH_NAME`: Full month name (e.g., January)\n- `MONTH_ABBREVIATION`: Abbreviated month name (e.g., Jan)\n- `MONTH`: Month number (e.g., 1)\n- `MONTH_IN_TWO_DIGITS`: Zero-padded month (e.g., 01)\n- `YEAR`: Full year (e.g., 2025)\n- `YEAR_IN_TWO_DIGITS`: Two-digit year (e.g., 25)\n\nThe default value is `*NAME -- PAGE_NUMBER/TOTAL_PAGES*`.") class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

normal_entry = pydantic.Field(default_factory=NormalEntry, description='Template for normal entries.') class-attribute instance-attribute

one_line_entry = pydantic.Field(default_factory=OneLineEntry, description='Template for one-line entries.') class-attribute instance-attribute

publication_entry = pydantic.Field(default_factory=PublicationEntry, description='Template for publication entries.') class-attribute instance-attribute

single_date = pydantic.Field(default='MONTH_ABBREVIATION YEAR', description='Template for single dates. Available placeholders:\n- `MONTH_NAME`: Full month name (e.g., January)\n- `MONTH_ABBREVIATION`: Abbreviated month name (e.g., Jan)\n- `MONTH`: Month number (e.g., 1)\n- `MONTH_IN_TWO_DIGITS`: Zero-padded month (e.g., 01)\n- `YEAR`: Full year (e.g., 2025)\n- `YEAR_IN_TWO_DIGITS`: Two-digit year (e.g., 25)\n\nThe default value is `MONTH_ABBREVIATION YEAR`.') class-attribute instance-attribute

time_span = pydantic.Field(default='HOW_MANY_YEARS YEARS HOW_MANY_MONTHS MONTHS', description='Template for time spans (duration calculations). Available placeholders:\n- `HOW_MANY_YEARS`: Number of years (e.g., 2)\n- `YEARS`: Localized word for "years" from `locale.years` (or singular "year")\n- `HOW_MANY_MONTHS`: Number of months (e.g., 3)\n- `MONTHS`: Localized word for "months" from `locale.months` (or singular "month")\n\nThe default value is `HOW_MANY_YEARS YEARS HOW_MANY_MONTHS MONTHS`.') class-attribute instance-attribute

top_note = pydantic.Field(default='*LAST_UPDATED CURRENT_DATE*', description='Template for the top note. Available placeholders:\n- `LAST_UPDATED`: Localized "last updated" text from `locale.last_updated`\n- `CURRENT_DATE`: Formatted date based on `design.templates.single_date`\n- `NAME`: The CV owner\'s name from `cv.name`\n- `MONTH_NAME`: Full month name (e.g., January)\n- `MONTH_ABBREVIATION`: Abbreviated month name (e.g., Jan)\n- `MONTH`: Month number (e.g., 1)\n- `MONTH_IN_TWO_DIGITS`: Zero-padded month (e.g., 01)\n- `YEAR`: Full year (e.g., 2025)\n- `YEAR_IN_TWO_DIGITS`: Two-digit year (e.g., 25)\n\nThe default value is `*LAST_UPDATED CURRENT_DATE*`.') class-attribute instance-attribute

Typography

Bases: BaseModelWithoutExtraKeys

alignment = pydantic.Field(default='justified', description="Text alignment. Options: 'left', 'justified' (spreads text across full width), 'justified-with-no-hyphenation' (justified without word breaks). The default value is `justified`.") class-attribute instance-attribute

bold = pydantic.Field(default_factory=Bold, description='Bold styling for different elements.') class-attribute instance-attribute

date_and_location_column_alignment = pydantic.Field(default='right', description="Alignment for dates and locations in entries. Options: 'left', 'center', 'right'. The default value is `right`.") class-attribute instance-attribute

font_family = pydantic.Field(default_factory=FontFamily, description="The font family. You can provide a single font name as a string (applies to all elements), or a dictionary with keys 'body', 'name', 'headline', 'connections', and 'section_titles' to customize each element. Any system font can be used.") class-attribute instance-attribute

font_size = pydantic.Field(default_factory=FontSize, description='Font sizes for different elements.') class-attribute instance-attribute

line_spacing = pydantic.Field(default='0.6em', description='Space between lines of text. Larger values create more vertical space. The default value is `0.6em`.') class-attribute instance-attribute

model_config = pydantic.ConfigDict(extra='forbid', validate_default=True) class-attribute instance-attribute

small_caps = pydantic.Field(default_factory=SmallCaps, description='Small caps styling for different elements.') class-attribute instance-attribute

validate_font_family(font_family) classmethod

Convert string font to FontFamily object with uniform styling.

Why

Users can provide simple string "Latin Modern Roman" for all text, or specify per-element fonts via FontFamily dict. Validator accepts both, expanding strings to full FontFamily objects.

Parameters:

Returns:

  • FontFamily

    FontFamily object with all fields populated.

Source code in src/rendercv/schema/models/design/classic_theme.py
@pydantic.field_validator(
    "font_family", mode="plain", json_schema_input_type=FontFamily | FontFamilyType
)
@classmethod
def validate_font_family(
    cls, font_family: FontFamily | FontFamilyType
) -> FontFamily:
    """Convert string font to FontFamily object with uniform styling.

    Why:
        Users can provide simple string "Latin Modern Roman" for all text,
        or specify per-element fonts via FontFamily dict. Validator accepts
        both, expanding strings to full FontFamily objects.

    Args:
        font_family: String font name or FontFamily object.

    Returns:
        FontFamily object with all fields populated.
    """
    if isinstance(font_family, str):
        return FontFamily(
            body=font_family,
            name=font_family,
            headline=font_family,
            connections=font_family,
            section_titles=font_family,
        )

    return FontFamily.model_validate(font_family)