feat(branding): embed slohmaier logo on cover + running page header

- branding/: light + dark logo SVG sources and 1600x452 PNG renders
- build_word_template.py: replace [LOGO] placeholder with add_picture
  on cover (7 cm wide, right-aligned) plus a 2.8 cm logo as a second
  paragraph in the running page header so derived pandoc-generated
  templates inherit the branding on every page

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Stefan Lohmaier
2026-05-18 22:47:08 -07:00
parent 247b8311f3
commit 5a1ee8cc43
16 changed files with 101 additions and 4 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

+42
View File
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
slohmaier.com Dokument-Logo (Dark) — Braille-Icon + Wortmarke
mit Accent-Border. Für Word/PDF-Letterheads (280320 px Breite).
-->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 780 220" width="780" height="220"
role="img" aria-label="slohmaier">
<defs>
<radialGradient id="bgGradient" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#2a3f5f"/>
<stop offset="100%" stop-color="#1a2330"/>
</radialGradient>
<radialGradient id="dotGradient" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#ffffff" stop-opacity="1"/>
<stop offset="100%" stop-color="#c8dcff" stop-opacity="0.6"/>
</radialGradient>
<linearGradient id="wmDark" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#D4A574"/>
<stop offset="100%" stop-color="#5BA5D6"/>
</linearGradient>
</defs>
<rect x="10" y="10" width="760" height="200" rx="10" ry="10"
fill="#21273a" stroke="#D4A574" stroke-width="3"/>
<!-- Icon (2E) — 160×160 bei (30,30), scale 160/512 = 0.3125 -->
<g transform="translate(30 30) scale(0.3125)">
<rect x="18" y="18" width="476" height="476" rx="92" ry="92" fill="#ffffff"/>
<rect x="30" y="30" width="452" height="452" rx="80" ry="80" fill="url(#bgGradient)"/>
<circle cx="94" cy="256" r="36" fill="url(#dotGradient)"/>
<circle cx="94" cy="371" r="36" fill="url(#dotGradient)"/>
<circle cx="184" cy="141" r="36" fill="url(#dotGradient)"/>
<circle cx="329" cy="141" r="36" fill="url(#dotGradient)"/>
<circle cx="329" cy="256" r="36" fill="url(#dotGradient)"/>
<circle cx="329" cy="371" r="36" fill="url(#dotGradient)"/>
</g>
<text x="220" y="148" font-family="Aptos, Inter, Helvetica Neue, Arial, sans-serif"
font-size="110" font-weight="700" letter-spacing="-2">
<tspan fill="url(#wmDark)">sl</tspan><tspan fill="#eaedf3">ohmaier</tspan>
</text>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

+42
View File
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
slohmaier.com Dokument-Logo (Light) — Braille-Icon + Wortmarke
mit Accent-Border. Für Word/PDF-Letterheads (280320 px Breite).
-->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 780 220" width="780" height="220"
role="img" aria-label="slohmaier">
<defs>
<radialGradient id="bgGradient" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#2a3f5f"/>
<stop offset="100%" stop-color="#1a2330"/>
</radialGradient>
<radialGradient id="dotGradient" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#ffffff" stop-opacity="1"/>
<stop offset="100%" stop-color="#c8dcff" stop-opacity="0.6"/>
</radialGradient>
<linearGradient id="wmLight" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#5BA5D6"/>
<stop offset="100%" stop-color="#D4A574"/>
</linearGradient>
</defs>
<rect x="10" y="10" width="760" height="200" rx="10" ry="10"
fill="#ffffff" stroke="#5BA5D6" stroke-width="3"/>
<!-- Icon (2E) — 160×160 bei (30,30), scale 160/512 = 0.3125 -->
<g transform="translate(30 30) scale(0.3125)">
<rect x="18" y="18" width="476" height="476" rx="92" ry="92" fill="#ffffff"/>
<rect x="30" y="30" width="452" height="452" rx="80" ry="80" fill="url(#bgGradient)"/>
<circle cx="94" cy="256" r="36" fill="url(#dotGradient)"/>
<circle cx="94" cy="371" r="36" fill="url(#dotGradient)"/>
<circle cx="184" cy="141" r="36" fill="url(#dotGradient)"/>
<circle cx="329" cy="141" r="36" fill="url(#dotGradient)"/>
<circle cx="329" cy="256" r="36" fill="url(#dotGradient)"/>
<circle cx="329" cy="371" r="36" fill="url(#dotGradient)"/>
</g>
<text x="220" y="148" font-family="Aptos, Inter, Helvetica Neue, Arial, sans-serif"
font-size="110" font-weight="700" letter-spacing="-2">
<tspan fill="url(#wmLight)">sl</tspan><tspan fill="#282728">ohmaier</tspan>
</text>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+17 -4
View File
@@ -246,6 +246,11 @@ def build_header_footer(doc, doc_id_placeholder="<DOC-ID>", classification="CONF
r3 = header_para.add_run(doc_id_placeholder)
r3.font.size = Pt(9)
r3.font.color.rgb = RGBColor(0x59, 0x59, 0x59)
if LOGO_PATH.exists():
logo_para = header.add_paragraph()
logo_para.alignment = WD_ALIGN_PARAGRAPH.RIGHT
logo_run = logo_para.add_run()
logo_run.add_picture(str(LOGO_PATH), width=Cm(2.8))
# --- Default footer (skipped on cover page) ---
footer = section.footer
@@ -283,13 +288,21 @@ def build_header_footer(doc, doc_id_placeholder="<DOC-ID>", classification="CONF
# Content
# ---------------------------------------------------------------------------
REPO_ROOT = Path(__file__).resolve().parent.parent
LOGO_PATH = REPO_ROOT / "branding" / "logo-doc-light.png"
def add_cover_page(doc):
# Top logo placeholder
# Top logo (right-aligned, ~7 cm wide)
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
r = p.add_run("[LOGO]")
r.font.size = Pt(10)
r.font.color.rgb = RGBColor(0x80, 0x80, 0x80)
if LOGO_PATH.exists():
run = p.add_run()
run.add_picture(str(LOGO_PATH), width=Cm(7))
else:
r = p.add_run("[LOGO]")
r.font.size = Pt(10)
r.font.color.rgb = RGBColor(0x80, 0x80, 0x80)
# Vertical space
for _ in range(8):