{% extends "_base.html" %} {% import "_recipient.html" as r %} {% block styles %} body { font-family: var(--font-body); font-weight: 400; font-size: 13px; line-height: 1.7; color: var(--color-doc-text); } /* Page header — letterhead band */ .page-header { display: flex; justify-content: space-between; align-items: flex-start; padding-bottom: 0; margin-bottom: 0; } .logo-group {} .logo { font-family: var(--font-headline); font-size: 24px; font-weight: 700; color: var(--color-black); letter-spacing: -0.02em; line-height: 1.1; } .logo span { color: var(--color-terracotta); } .header-tagline { font-family: var(--font-body); font-size: 11px; letter-spacing: 0.04em; text-transform: none; color: var(--color-subtle); margin-top: 3px; } .header-contact { text-align: right; font-size: 10px; color: var(--color-body); line-height: 1.55; } .header-contact strong { font-family: var(--font-headline); font-weight: 600; font-size: 11px; color: var(--color-black); } .accent-bar { height: 2px; background: var(--color-terracotta); margin-top: 14px; margin-bottom: 28px; } /* Meta strip — always shown for invoices */ .meta-strip { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 28px; padding-bottom: 16px; border-bottom: 0.5px solid var(--color-doc-border); } .meta-to { font-size: 12px; color: var(--color-body); line-height: 1.6; } .meta-to strong { font-family: var(--font-headline); font-size: 14px; font-weight: 600; color: var(--color-black); display: block; margin-bottom: 1px; } .meta-right { text-align: right; padding-top: 2px; } /* Two-column key/value: labels right-aligned, values left-aligned, one row each */ .meta-grid { display: inline-grid; grid-template-columns: auto auto; column-gap: 10px; row-gap: 3px; align-items: baseline; } .meta-label { font-family: var(--font-ui); font-size: 9px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; color: var(--color-subtle); text-align: right; white-space: nowrap; } .meta-value { font-size: 11px; color: var(--color-doc-text); text-align: right; white-space: nowrap; } .confidential-label { color: var(--color-terracotta); font-weight: 600; } /* Subject line */ .subject-line { border-left: 3px solid var(--color-terracotta); padding-left: 16px; margin-bottom: 24px; } .subject-label { display: none; } .subject-text { font-family: var(--font-headline); font-size: 17px; font-weight: 600; color: var(--color-black); line-height: 1.3; } /* Body content (markdown) */ .body-content p { margin-bottom: 12px; } .body-content strong { font-weight: 600; color: var(--color-black); } .body-content a { color: var(--color-terracotta); text-decoration: none; } /* Headings */ .body-content h1 { font-family: var(--font-headline); font-weight: 700; font-size: 22px; color: var(--color-black); margin-top: 28px; margin-bottom: 12px; line-height: 1.25; } .body-content h2 { font-family: var(--font-headline); font-weight: 700; font-size: 15px; color: var(--color-black); margin-top: 28px; margin-bottom: 10px; line-height: 1.3; letter-spacing: -0.01em; } .body-content h3 { font-family: var(--font-headline); font-weight: 600; font-size: 14px; color: var(--color-black); margin-top: 20px; margin-bottom: 8px; line-height: 1.35; } /* Lists */ .body-content ul, .body-content ol { margin-bottom: 12px; padding-left: 24px; } .body-content li { margin-bottom: 4px; } /* HR */ .body-content hr { border: none; margin: 20px 0; } /* Offer block / blockquote */ .body-content .offer-block, .body-content blockquote { border-left: 3px solid var(--color-terracotta); padding: 12px 16px; margin: 16px 0; background: var(--color-cream); border-radius: 0 6px 6px 0; } .body-content blockquote { color: var(--color-subtle); font-style: italic; background: transparent; } /* Tables — invoice line items */ .body-content table { width: 100%; border-collapse: collapse; margin: 4px 0 20px 0; font-size: 12.5px; background: var(--color-cream); border-left: 3px solid var(--color-terracotta); border-radius: 0 4px 4px 0; } .body-content thead th { font-family: var(--font-ui); font-weight: 600; font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--color-subtle); text-align: left; padding: 10px 14px 8px; border-bottom: 1px solid var(--color-doc-border); } .body-content thead th:last-child { text-align: right; } /* Collapse an empty header row (e.g. a key/value summary table with no headings) */ .body-content thead th:empty { padding: 0; border: none; line-height: 0; font-size: 0; height: 0; } .body-content td { padding: 10px 14px; border-bottom: 1px solid var(--color-light); vertical-align: top; } .body-content tbody tr:last-child td { border-bottom: none; } /* Amount column — right-aligned, monospace */ .body-content td:last-child { text-align: right; white-space: nowrap; font-family: 'JetBrains Mono', monospace; font-weight: 500; font-size: 12px; } /* Total-row emphasis comes from **bold** in the markdown (a ), not from the table position — so ordinary last line items are never bolded. */ .body-content tbody tr.total td { font-weight: 600; color: var(--color-black); } .body-content tbody tr.total td:last-child { font-family: 'JetBrains Mono', monospace; font-weight: 500; font-size: 13px; } /* Separator row (empty row before totals) */ .body-content tbody tr td[colspan] { padding: 0; height: 1px; border-bottom: 1.5px solid var(--color-doc-border); background: transparent; } /* Code */ .body-content code { font-family: 'Courier New', monospace; font-size: 11px; background: var(--color-light); padding: 1px 4px; border-radius: 3px; } .body-content pre { background: var(--color-light); padding: 14px; border-radius: 6px; overflow-x: auto; margin-bottom: 12px; } .body-content pre code { background: none; padding: 0; } h1, h2, h3 { break-after: avoid; } /* Payment block — auto-rendered from canonical BANK details (never hand-typed). Heading sits OUTSIDE the box, matching the body h2s (Leistungen, Zusammenfassung). */ .payment-heading { font-family: var(--font-headline); font-weight: 700; font-size: 15px; color: var(--color-black); margin-top: 28px; margin-bottom: 10px; line-height: 1.3; letter-spacing: -0.01em; break-after: avoid; } .payment-block { border-left: 3px solid var(--color-terracotta); background: var(--color-cream); border-radius: 0 4px 4px 0; padding: 14px 18px; margin-top: 4px; break-inside: avoid; page-break-inside: avoid; } .payment-terms { font-size: 12.5px; margin-bottom: 10px; color: var(--color-doc-text); } .payment-row { display: flex; gap: 12px; line-height: 1.65; } .payment-key { font-family: var(--font-ui); font-weight: 600; font-size: 10px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--color-subtle); width: 96px; flex-shrink: 0; padding-top: 2px; } .payment-val { font-size: 12.5px; color: var(--color-black); } .payment-val.mono { font-family: 'JetBrains Mono', monospace; font-size: 12px; } /* Signature */ .signature-block { margin-top: 1.5rem; font-size: 13px; color: var(--color-doc-text); line-height: 1.6; break-inside: avoid; page-break-inside: avoid; } .signature-block .closing { margin-bottom: 0.5rem; } .signature-block .name { font-weight: 600; color: var(--color-black); } .uid-line, .private-label { font-size: 11px; color: var(--color-body); } {% endblock %} {% block content %}
{# Meta strip always shown for invoices #}
{% if HAS_RECIPIENT %}{{ r.block(RECIPIENT_OBJ, STRINGS) }}{% endif %}
{{ STRINGS.invoice_date_label }}{{ DATE }} {% if REF %}{{ STRINGS.invoice_no_label }}{{ REF }}{% endif %} {% if SERVICE_DATE %}{{ STRINGS.service_date_label }}{{ SERVICE_DATE }}{% endif %}
{% if CONFIDENTIAL %}
{{ STRINGS.confidential_label }}
{% endif %}
{% if SUBJECT %}
{{ STRINGS.subject_label }}
{{ SUBJECT }}
{% endif %}
{{ CONTENT | safe }}
{% if PAYMENT %}
{{ STRINGS.payment_heading }}

{{ STRINGS.payment_terms_tpl | replace("{days}", PAYMENT.days) }}

{{ STRINGS.iban_label }}{{ PAYMENT.iban }}
{{ STRINGS.bic_label }}{{ PAYMENT.bic }}
{{ STRINGS.holder_label }}{{ PAYMENT.holder }}
{% endif %} {% if SHOW_SIGNATURE %}
{{ STRINGS.signature_closing }}
{{ STRINGS.signature_name }}
{{ STRINGS.signature_org }}
{% endif %} {% endblock %}