{"id":8,"date":"2026-04-21T08:46:19","date_gmt":"2026-04-21T08:46:19","guid":{"rendered":"https:\/\/cv.jedelhauser.technology\/?page_id=8"},"modified":"2026-04-21T12:36:47","modified_gmt":"2026-04-21T12:36:47","slug":"cv-thomas-jedelhauser","status":"publish","type":"page","link":"https:\/\/cv.jedelhauser.technology\/?page_id=8","title":{"rendered":""},"content":{"rendered":"<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=DM+Sans:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');\n\n\/* \u2500\u2500 Scoped to this widget only \u2500\u2500 *\/\n#thomas-cv {\n  --bg-page: #f8fafc;\n  --bg-card: #ffffff;\n  --bg-hover: #f1f5f9;\n  --bg-filter: #fafbfc;\n  --text-primary: #111827;\n  --text-secondary: #4b5563;\n  --text-meta: #6b7280;\n  --text-muted: #9ca3af;\n  --accent: #17355C;\n  --accent-light: #c3d5ea;\n  --accent-bg: #dbeafe;\n  --border: #e2e8f0;\n  --border-strong: #cbd5e1;\n  --tag-bg: #f1f5f9;\n  --tag-text: #374151;\n  --pill-bg: #e8edf3;\n  --dot-current: #17355C;\n  --dot-past: #94a3b8;\n  --line: #cbd5e1;\n  --shadow: rgba(0,0,0,0.05);\n\n  position: relative;\n  font-family: 'DM Sans', sans-serif;\n  color: var(--text-primary);\n  max-width: 720px;\n  margin: 0 auto;\n  padding: 40px 20px;\n  background: var(--bg-page);\n  transition: background 0.3s, color 0.3s;\n  overflow: hidden;\n}\n\n#thomas-cv[data-theme=\"dark\"] {\n  --bg-page: #0f172a;\n  --bg-card: #1e293b;\n  --bg-hover: #334155;\n  --bg-filter: #1e293b;\n  --text-primary: #f8fafc;\n  --text-secondary: #e2e8f0;\n  --text-meta: #94a3b8;\n  --text-muted: #64748b;\n  --accent: #60a5fa;\n  --accent-light: rgba(96, 165, 250, 0.2);\n  --accent-bg: rgba(96, 165, 250, 0.15);\n  --border: #334155;\n  --border-strong: #475569;\n  --tag-bg: #334155;\n  --tag-text: #e2e8f0;\n  --pill-bg: #334155;\n  --dot-current: #60a5fa;\n  --dot-past: #475569;\n  --line: #334155;\n  --shadow: rgba(0,0,0,0.3);\n}\n\n#cv-particles {\n  position: absolute;\n  top: 0; left: 0;\n  width: 100%; height: 100%;\n  z-index: 0;\n  pointer-events: none;\n}\n#cv-content { position: relative; z-index: 1; }\n\n\/* Typography *\/\n#thomas-cv h1 { font-size: 32px; font-weight: 700; color: var(--accent); margin: 0 0 2px 0; letter-spacing: -0.02em; }\n#thomas-cv .cv-tagline { font-size: 16px; font-weight: 400; color: var(--text-meta); margin: 0 0 16px 0; }\n#thomas-cv .cv-profile { font-size: 13.5px; line-height: 1.65; color: var(--text-secondary); margin: 0; max-width: 580px; }\n#thomas-cv .cv-section-title { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; color: var(--text-muted); margin: 0 0 12px 0; }\n\n\/* Top bar *\/\n#thomas-cv .cv-topbar { display: flex; justify-content: flex-end; align-items: center; gap: 10px; margin-bottom: 24px; flex-wrap: wrap; }\n#thomas-cv .cv-lang-switch { display: inline-flex; border-radius: 8px; overflow: hidden; border: 1.5px solid var(--border-strong); background: var(--bg-hover); box-shadow: 0 1px 2px var(--shadow); }\n#thomas-cv .cv-lang-btn { padding: 6px 16px; border: none; cursor: pointer; font-family: 'DM Sans',sans-serif; font-size: 12px; font-weight: 600; letter-spacing: 0.05em; text-transform: uppercase; background: transparent; color: var(--text-meta); transition: all .2s; }\n#thomas-cv .cv-lang-btn.active { background: var(--accent); color: #fff; }\n#thomas-cv .cv-theme-btn,\n#thomas-cv .cv-download-btn { display: inline-flex; align-items: center; gap: 7px; padding: 6px 16px; border-radius: 8px; border: 1.5px solid var(--border-strong); background: var(--bg-hover); color: var(--accent); font-family: 'DM Sans',sans-serif; font-size: 12px; font-weight: 600; cursor: pointer; box-shadow: 0 1px 2px var(--shadow); transition: all .2s; }\n#thomas-cv .cv-theme-btn { padding: 0; width: 36px; height: 36px; justify-content: center; }\n#thomas-cv .cv-download-btn:hover,\n#thomas-cv .cv-theme-btn:hover { background: var(--accent); color: #fff; }\n\n\/* Education *\/\n#thomas-cv .cv-edu-pills { display: flex; flex-wrap: wrap; gap: 6px; }\n#thomas-cv .cv-edu-pill { font-size: 12px; padding: 5px 12px; border-radius: 8px; background: var(--tag-bg); color: var(--tag-text); border: 1px solid var(--border); }\n#thomas-cv .cv-edu-inst { color: var(--text-muted); }\n#thomas-cv .cv-edu-year { font-size: 10px; color: var(--text-muted); margin-left: 4px; }\n\n\/* Filters *\/\n#thomas-cv .cv-filters { margin-bottom: 28px; padding: 16px; border-radius: 14px; background: var(--bg-filter); border: 1px solid var(--border); }\n#thomas-cv .cv-filter-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }\n#thomas-cv .cv-clear-all { font-size: 11px; color: var(--text-meta); background: none; border: none; cursor: pointer; text-decoration: underline; font-family: 'DM Sans',sans-serif; }\n#thomas-cv .cv-filter-label { font-size: 11px; font-weight: 600; color: var(--text-meta); margin-bottom: 6px; }\n#thomas-cv .cv-filter-tags { display: flex; flex-wrap: wrap; gap: 5px; margin-bottom: 10px; }\n#thomas-cv .cv-filter-tag { padding: 4px 12px; border-radius: 100px; border: 1.5px solid var(--border-strong); background: transparent; color: var(--text-meta); font-size: 12px; font-family: 'DM Sans',sans-serif; font-weight: 400; cursor: pointer; transition: all .2s; white-space: nowrap; }\n#thomas-cv .cv-filter-tag.active { border-color: var(--accent); background: var(--accent); color: #fff; font-weight: 600; }\n\n\/* Timeline *\/\n#thomas-cv .cv-timeline-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; }\n#thomas-cv .cv-count { font-size: 12px; color: var(--text-muted); }\n#thomas-cv .cv-no-match { text-align: center; padding: 40px 20px; color: var(--text-muted); font-size: 14px; }\n\n\/* Jobs *\/\n#thomas-cv .cv-job { display: flex; gap: 20px; position: relative; }\n#thomas-cv .cv-job-track { display: flex; flex-direction: column; align-items: center; width: 20px; flex-shrink: 0; padding-top: 6px; }\n#thomas-cv .cv-job-dot { width: 10px; height: 10px; border-radius: 50%; background: var(--dot-past); border: 2px solid var(--border-strong); flex-shrink: 0; }\n#thomas-cv .cv-job-dot.current { width: 14px; height: 14px; background: var(--dot-current); border: 3px solid var(--accent-light); box-shadow: 0 0 0 4px var(--accent-bg); }\n#thomas-cv .cv-job-line { width: 2px; flex-grow: 1; background: linear-gradient(to bottom, var(--line) 0%, transparent 100%); margin-top: 4px; }\n#thomas-cv .cv-job-card { flex: 1; margin-bottom: 8px; border-radius: 12px; border: 1px solid transparent; transition: all .25s ease; overflow: hidden; }\n#thomas-cv .cv-job-card.open { background: var(--bg-card); border-color: var(--border); }\n#thomas-cv .cv-job-toggle { width: 100%; padding: 14px 16px; background: none; border: none; cursor: pointer; display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; text-align: left; font-family: inherit; color: inherit; }\n#thomas-cv .cv-job-summary { flex: 1; min-width: 0; }\n#thomas-cv .cv-job-meta-top { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 2px; }\n#thomas-cv .cv-job-date { font-size: 10px; font-family: 'JetBrains Mono',monospace; color: var(--text-meta); letter-spacing: 0.03em; white-space: nowrap; }\n#thomas-cv .cv-badge { font-size: 9px; font-weight: 700; color: var(--accent); background: var(--accent-bg); padding: 1px 8px; border-radius: 100px; letter-spacing: 0.08em; text-transform: uppercase; }\n#thomas-cv .cv-job-title { font-family: 'DM Sans',sans-serif; font-weight: 600; font-size: 15px; color: var(--text-primary); line-height: 1.3; }\n#thomas-cv .cv-job-company { font-family: 'DM Sans',sans-serif; font-size: 13px; color: var(--text-meta); margin-top: 1px; }\n#thomas-cv .cv-divider { margin: 0 6px; color: var(--border-strong); }\n#thomas-cv .cv-industry { font-size: 12px; }\n#thomas-cv .cv-chevron { color: var(--text-muted); padding-top: 14px; transition: transform .3s cubic-bezier(0.4,0,0.2,1); }\n#thomas-cv .cv-chevron.open { transform: rotate(180deg); }\n#thomas-cv .cv-job-body { padding: 0 16px 16px 16px; }\n#thomas-cv .cv-job-tags { display: flex; flex-wrap: wrap; gap: 5px; margin-bottom: 12px; }\n#thomas-cv .cv-tag-pill { font-size: 11px; font-family: 'DM Sans',sans-serif; padding: 2px 10px; border-radius: 6px; background: var(--pill-bg); color: var(--tag-text); }\n#thomas-cv .cv-job-details { margin: 0; padding-left: 18px; list-style: none; }\n#thomas-cv .cv-job-details li { position: relative; padding-left: 4px; margin-bottom: 6px; font-size: 13px; font-family: 'DM Sans',sans-serif; color: var(--text-secondary); line-height: 1.55; }\n#thomas-cv .cv-bullet { position: absolute; left: -14px; top: 8px; width: 4px; height: 4px; border-radius: 50%; background: var(--text-muted); }\n\n\/* Expand *\/\n#thomas-cv .cv-expand-wrap { text-align: center; margin-top: 8px; }\n#thomas-cv .cv-expand-btn { font-size: 12px; font-family: 'DM Sans',sans-serif; color: var(--text-meta); background: none; border: 1px solid var(--border); border-radius: 8px; padding: 6px 16px; cursor: pointer; transition: all .2s; }\n#thomas-cv .cv-expand-btn:hover { border-color: var(--accent); color: var(--accent); }\n\n@media print {\n  #thomas-cv .no-print { display: none !important; }\n  #thomas-cv { background: #fff !important; color: #000 !important; }\n  #cv-particles { display: none !important; }\n}\n<\/style>\n\n<div id=\"thomas-cv\">\n  <canvas id=\"cv-particles\"><\/canvas>\n  <div id=\"cv-content\"><\/div>\n<\/div>\n\n<script>\n(function(){\n  'use strict';\n\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     CONFIG \u2013 Edit once, updates everywhere\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n  const CONFIG = {\n    name: \"Thomas Jedelhauser\",\n    contact: {\n      address: \"Im Kugelfang 21, 4102 Binningen\",\n      phone: \"+41 78 811 97 35\",\n      email: \"hello@thomasjedelhauser.ch\"\n    }\n  };\n\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     TRANSLATIONS\n     Add new PDF downloads in the \"downloads\" array\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n  const TRANSLATIONS = {\n    en: {\n      tagline: \"Digital Marketing Manager\",\n      profile: \"Digital Marketing Manager with solid experience in SEO, website relaunches, CMS management, and digital campaigns. Strategic thinking, strong project management skills, and technical understanding of web technologies and MarTech. Experience in international corporate environments as well as with SMEs.\",\n      education: \"Education\",\n      filterExperience: \"Filter Experience\",\n      clearAll: \"Clear all\",\n      industry: \"Industry\",\n      expertise: \"Expertise\",\n      careerTimeline: \"Career Timeline\",\n      positions: \"positions\",\n      of: \"of\",\n      noMatch: \"No positions match the current filters.\",\n      collapseAll: \"Collapse all\",\n      expandAll: \"Expand all\",\n      current: \"Current\",\n      cvTitle: \"Curriculum Vitae\",\n      currentPosition: \"Current Position\",\n      professionalExperience: \"Professional Experience\",\n      additionalExperience: \"Additional Experience & Internships\",\n      expertiseIn: \"Expertise in\",\n      eduItems: [\n        { title: \"MAS Online Marketing Management\", institution: \"FHNW\", year: \"2016\" },\n        { title: \"CAS Digital Transformation\", institution: \"FHNW\", year: \"2025\" },\n        { title: \"Certified Marketing Manager\", institution: \"Federal Higher Examination\", year: \"2014\" },\n        { title: \"Google Project Management Certificate\", institution: \"Google\", year: \"\" },\n        { title: \"Apprenticeship in Mediamatics\", institution: \"Swiss Federal Diploma\", year: \"2003\" }\n      ],\n      skills: {\n        programming: { label: \"Programming Languages\", value: \"Python, HTML\/CSS, JavaScript, jQuery\" },\n        seo: { label: \"SEO & Digital Marketing Tools\", value: \"Google AdWords, Google Analytics, Webtrends, Facebook Ad Manager, Mailchimp, LinkedIn Marketing Tools, Sistrix, Zapier\" },\n        collab: { label: \"Collaboration Tools\", value: \"Office 365 (SharePoint, OneDrive, Teams), Trello, Slack, Jira, Confluence\" },\n        crm: { label: \"CRM & ERP\", value: \"Cobra CRM, MS Dynamics Business Central, Navision, HubSpot\" },\n        cms: { label: \"CMS\", value: \"Typo3, WordPress (DIVI, Elementor, WPBakery, Colibri WP), ModX, Sitecore 9, Memberspot\" }\n      },\n      downloads: [\n        { label: \"Download CV\", type: \"generated\" }\n      ]\n    },\n    de: {\n      tagline: \"Digital Marketing Manager\",\n      profile: \"Digital Marketing Manager mit fundierter Erfahrung in SEO, Website-Relaunches, CMS-Management und digitalen Kampagnen. Umfangreiche Erfahrung im internationalen Unternehmensumfeld wie auch mit KMU.\",\n      education: \"Ausbildung\",\n      filterExperience: \"Erfahrung filtern\",\n      clearAll: \"Alle zur\u00fccksetzen\",\n      industry: \"Branche\",\n      expertise: \"Fachgebiet\",\n      careerTimeline: \"Karriere-Timeline\",\n      positions: \"Positionen\",\n      of: \"von\",\n      noMatch: \"Keine Positionen entsprechen den aktuellen Filtern.\",\n      collapseAll: \"Alle zuklappen\",\n      expandAll: \"Alle aufklappen\",\n      current: \"Aktuell\",\n      cvTitle: \"Lebenslauf\",\n      currentPosition: \"Aktuelle Position\",\n      professionalExperience: \"Berufserfahrung\",\n      additionalExperience: \"Weitere Erfahrungen und Praktika\",\n      expertiseIn: \"Erfahrung in\",\n      eduItems: [\n        { title: \"MAS Online Marketing Management\", institution: \"FHNW\", year: \"2016\" },\n        { title: \"CAS Digitale Transformation\", institution: \"FHNW\", year: \"2025\" },\n        { title: \"Diplomierter Marketingmanager HF\", institution: \"H\u00f6here Fachpr\u00fcfung\", year: \"2014\" },\n        { title: \"Google Project Management Certificate\", institution: \"Google\", year: \"\" },\n        { title: \"EFZ Mediamatiker\", institution: \"Eidg. F\u00e4higkeitszeugnis\", year: \"2003\" }\n      ],\n      skills: {\n        programming: { label: \"Programmiersprachen\", value: \"Python, HTML\/CSS, JavaScript, jQuery\" },\n        seo: { label: \"SEO- und Digital Marketing-Tools\", value: \"Google AdWords, Google Analytics, Webtrends, Facebook Ad Manager, Mailchimp, LinkedIn Marketing Tools, Sistrix, Zapier\" },\n        collab: { label: \"Kollaborationstools\", value: \"Office 365 (SharePoint, OneDrive, Teams), Trello, Slack, Jira, Confluence\" },\n        crm: { label: \"CRM und ERP\", value: \"Cobra CRM, MS Dynamics Business Central, Navision, HubSpot\" },\n        cms: { label: \"CMS\", value: \"Typo3, WordPress (DIVI, Elementor, WPBakery, Colibri WP), ModX, Sitecore 9, Memberspot\" }\n      },\n      downloads: [\n        { label: \"Lebenslauf herunterladen\", type: \"generated\" }\n      ]\n    }\n  };\n\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     JOBS\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n  const JOBS = [\n    {\n      id: 1, section: \"current\",\n      en: { title: \"Digital Marketing Specialist (60%)\", details: [\n        \"Development of the digital marketing strategy and coordination with agencies\",\n        \"Development and implementation of the MarTech stack roadmap\"\n      ]},\n      de: { title: \"Digital Marketing Manager (60%)\", details: [\n        \"Erstellung der digitalen Marketingstrategie und Koordination mit Agenturen\",\n        \"Erstellung und Implementation MarTech-Stack Roadmap\"\n      ]},\n      company: \"Orthopartner AG\", startDate: \"2025-11\", endDate: null,\n      industry: \"Healthcare\", industryDe: \"Gesundheitswesen\",\n      tags: [\"Digital Marketing\", \"MarTech\", \"Strategy\"]\n    },\n    {\n      id: 2, section: \"professional\",\n      en: { title: \"Website Manager Europe\", details: [\n        \"Coordinated collaboration with external agencies to continuously support and maintain corporate websites\",\n        \"Independently published content across all European countries\",\n        \"Ensured website availability and proactively monitored performance to identify optimization opportunities\",\n        \"Streamlined internal processes and insourced key technical capabilities to reduce costs and increase operational flexibility\",\n        \"Developed and implemented a strategic technology roadmap to drive digital transformation and align IT initiatives with long-term business goals\"\n      ]},\n      de: { title: \"Website Manager Europe\", details: [\n        \"Zusammenarbeit mit externen Agenturen koordiniert, um die Unternehmenswebsites kontinuierlich zu unterst\u00fctzen und zu warten\",\n        \"Inhalte eigenst\u00e4ndig in allen europ\u00e4ischen L\u00e4ndern ver\u00f6ffentlicht\",\n        \"Website-Verf\u00fcgbarkeit sichergestellt und Leistung proaktiv \u00fcberwacht, um Optimierungsm\u00f6glichkeiten zu erkennen\",\n        \"Interne Prozesse optimiert und zentrale technische Kompetenzen ins Unternehmen geholt, um Kosten zu senken und die betriebliche Flexibilit\u00e4t zu erh\u00f6hen\",\n        \"Eine strategische Technologie-Roadmap entwickelt und umgesetzt, um die digitale Transformation voranzutreiben und IT-Initiativen an langfristigen Gesch\u00e4ftszielen auszurichten\"\n      ]},\n      company: \"Inspire Medical AG\", startDate: \"2024-06\", endDate: \"2025-12\",\n      industry: \"Healthcare\", industryDe: \"Gesundheitswesen\",\n      tags: [\"Web Management\", \"Digital Transformation\", \"Agency Coordination\"]\n    },\n    {\n      id: 3, section: \"professional\",\n      en: { title: \"Project Manager Digital Transformation\", details: [\n        \"Acted as Deputy Head of IT, demonstrating strong leadership and operational management skills\",\n        \"Led the successful implementation of MS Teams and Office 365 apps, transforming collaboration and productivity\",\n        \"Orchestrated the rollout of a cutting-edge digital expense tool tailored to sales representatives\",\n        \"Spearheaded the development and launch of the company intranet to enhance internal communication\",\n        \"Created and implemented multiple incident response plans to strengthen organizational crisis preparedness\"\n      ]},\n      de: { title: \"Projektmanager Digitale Transformation\", details: [\n        \"\u00dcbernahme der Position des stellvertretenden IT-Leiters mit F\u00fchrungsqualit\u00e4t und Expertise in der Verwaltung zentraler Betriebsabl\u00e4ufe\",\n        \"Leitung der erfolgreichen Implementierung von MS Teams und Office 365 Apps, die die Zusammenarbeit und Produktivit\u00e4t revolutionieren\",\n        \"Orchestrierung der Einf\u00fchrung eines digitalen Expense Tools, speziell f\u00fcr Vertriebsmitarbeiter entwickelt\",\n        \"Pionierarbeit bei der Entwicklung und Einf\u00fchrung des Intranets zur F\u00f6rderung von Kommunikation und Wissensaustausch\",\n        \"Formulierung und Umsetzung mehrerer Incident Response Plans zur St\u00e4rkung der Krisenvorbereitung\"\n      ]},\n      company: \"Iscador AG\", startDate: \"2022-06\", endDate: \"2024-05\",\n      industry: \"Pharma\", industryDe: \"Pharma\",\n      tags: [\"Project Management\", \"Digital Transformation\", \"IT Leadership\"]\n    },\n    {\n      id: 4, section: \"professional\",\n      en: { title: \"Digital Marketing Specialist\", details: [\n        \"Led the successful website relaunch through strategic planning, including conceptualization, CMS evaluation, and content marketing research\",\n        \"Conducted in-depth SEO research and leveraged web data analytics to boost visibility and drive targeted traffic\",\n        \"Contributed to various digital campaigns, supporting their overall impact and success\",\n        \"Managed the project implementation of a new CRM tool, ensuring smooth execution\"\n      ]},\n      de: { title: \"Digital Marketing Specialist\", details: [\n        \"Leitung des erfolgreichen Website-Relaunchs durch strategische Planung, einschliesslich Konzeptualisierung, CMS-Bewertung und Content Marketing Research\",\n        \"Durchf\u00fchrung umfassender SEO-Recherchen und Nutzung von Webdatenanalysen zur Optimierung der Online-Sichtbarkeit\",\n        \"Wertvolle Unterst\u00fctzung bei verschiedenen digitalen Kampagnen\",\n        \"Leitung der Implementierung eines neuen CRM-Tools f\u00fcr reibungslose Ausf\u00fchrung und optimale Ressourcennutzung\"\n      ]},\n      company: \"Iscador AG\", startDate: \"2020-05\", endDate: \"2022-06\",\n      industry: \"Pharma\", industryDe: \"Pharma\",\n      tags: [\"Digital Marketing\", \"SEO\", \"CMS\", \"CRM\"]\n    },\n    {\n      id: 5, section: \"professional\",\n      en: { title: \"Digital Marketing Manager\", details: [\n        \"Managed and optimized PPC campaigns, display ads, and social media marketing for Virtido and client accounts\",\n        \"Developed and executed effective marketing strategies to generate measurable results\",\n        \"Collaborated with internal designers and external agencies to develop and launch the Virtido website\"\n      ]},\n      de: { title: \"Digital Marketing Manager\", details: [\n        \"Verwaltung und Optimierung von PPC-Kampagnen, Display-Anzeigen und Social Media Marketing f\u00fcr Virtido und Kundenkonten\",\n        \"Entwicklung und Umsetzung effektiver Marketingstrategien zur Erzielung messbarer Ergebnisse\",\n        \"Zusammenarbeit mit internen Designern und externen Agenturen bei der Entwicklung und Einf\u00fchrung der Website\"\n      ]},\n      company: \"Virtido\", startDate: \"2018-06\", endDate: \"2020-01\",\n      industry: \"Tech \/ Startup\", industryDe: \"Tech \/ Startup\",\n      tags: [\"Digital Marketing\", \"PPC\", \"Social Media\"]\n    },\n    {\n      id: 6, section: \"professional\",\n      en: { title: \"Digital Channel Manager\", details: [\n        \"Managed global intranet channels to support seamless internal communication and collaboration\",\n        \"Designed and implemented internal websites tailored to stakeholder needs\",\n        \"Supported the launch and adoption of a new internal social media channel\",\n        \"Contributed to the structure and roadmap for a new global intranet\",\n        \"Led the planning and execution of the Corporate Center intranet migration\"\n      ]},\n      de: { title: \"Digital Channel Manager\", details: [\n        \"Verwaltung und Optimierung globaler Intranet-Channels zur Erleichterung nahtloser interner Kommunikation\",\n        \"Gestaltung und Implementierung interner Websites, zugeschnitten auf die Bed\u00fcrfnisse interner Stakeholder\",\n        \"Unterst\u00fctzung bei der erfolgreichen Einf\u00fchrung eines neuen internen Social Media Channels\",\n        \"Entwicklung der Struktur und Roadmap f\u00fcr ein neues globales Intranet\",\n        \"Leitung der Planung und Durchf\u00fchrung der Corporate Center Intranet-Migration\"\n      ]},\n      company: \"Zurich Insurance\", startDate: \"2018-06\", endDate: \"2019-11\",\n      industry: \"Insurance \/ Finance\", industryDe: \"Versicherung \/ Finanzen\",\n      tags: [\"Intranet\", \"Content Management\", \"SharePoint\"]\n    },\n    {\n      id: 7, section: \"professional\",\n      en: { title: \"Channel Manager zurich.com\", details: [\n        \"Approved all changes on zurich.com (content, layout, and structure)\",\n        \"Consulted stakeholders to improve segments based on goals, UX, SEO, and content strategy\",\n        \"Coordinated change requests with internal\/external developers and agencies\",\n        \"Produced web analytics reports independently and with the Digital Insights team\",\n        \"Implemented and tested marketing technology tools with developers\",\n        \"Created, edited, and published web pages, press releases, and blogs\",\n        \"Facilitated strategy workshops for zurich.com\",\n        \"Co-developed a new corporate intranet concept\"\n      ]},\n      de: { title: \"Channel Manager zurich.com\", details: [\n        \"Genehmigung aller \u00c4nderungen auf zurich.com (Inhalt, Layout und Struktur)\",\n        \"Beratung von Stakeholdern zur Verbesserung ihrer Segmente bez\u00fcglich Ziele, UX, SEO und Content Marketing\",\n        \"Koordination von \u00c4nderungsanfragen mit internen und externen Webentwicklern und Agenturen\",\n        \"Erstellung von Webanalyseberichten selbstst\u00e4ndig oder mit dem Digital Insights-Team\",\n        \"Implementierung und Test von Marketing Technology Tools mit Webentwicklern\",\n        \"Erstellung, Bearbeitung und Ver\u00f6ffentlichung von Webseiten, Pressemitteilungen und Blogbeitr\u00e4gen\",\n        \"Leitung von Strategieworkshops f\u00fcr zurich.com-Stakeholder\",\n        \"Mitentwicklung der Strategie f\u00fcr ein neues Corporate Intranet-Konzept\"\n      ]},\n      company: \"Zurich Insurance\", startDate: \"2016-08\", endDate: \"2018-05\",\n      industry: \"Insurance \/ Finance\", industryDe: \"Versicherung \/ Finanzen\",\n      tags: [\"Web Management\", \"SEO\", \"Analytics\", \"Content Management\"]\n    },\n    {\n      id: 8, section: \"professional\",\n      en: { title: \"SharePoint Editor\", details: [\n        \"Conducted editorial training sessions\",\n        \"Led and advised on intranet migration projects\"\n      ]},\n      de: { title: \"SharePoint-Editor\", details: [\n        \"Erstellung und Leitung von Redaktionsschulungen\",\n        \"Leitung und Beratung bei Intranet-Migrationsprojekten\"\n      ]},\n      company: \"Zurich Insurance\", startDate: \"2015-03\", endDate: \"2016-08\",\n      industry: \"Insurance \/ Finance\", industryDe: \"Versicherung \/ Finanzen\",\n      tags: [\"Intranet\", \"SharePoint\", \"Training\"]\n    },\n    {\n      id: 9, section: \"professional\",\n      en: { title: \"Project Manager Online Projects\", details: [\"Coordinated and managed website projects\"] },\n      de: { title: \"Projektmanager Online-Projekte\", details: [\"Koordination und Management von Website-Projekten\"] },\n      company: \"Allink GmbH\", startDate: \"2014-08\", endDate: \"2015-03\",\n      industry: \"Agency\", industryDe: \"Agentur\",\n      tags: [\"Project Management\", \"Web Management\"]\n    },\n    {\n      id: 10, section: \"professional\",\n      en: { title: \"Migration Specialist SharePoint\", details: [\n        \"Managed intranet migration projects\",\n        \"Trained and supported intranet editors\"\n      ]},\n      de: { title: \"Migrationsspezialist SharePoint\", details: [\n        \"Projektmanagement f\u00fcr die Migration des Intranets\",\n        \"Unterst\u00fctzung und Schulung von Intranet-Redakteuren\"\n      ]},\n      company: \"Zurich Insurance\", startDate: \"2013-08\", endDate: \"2014-04\",\n      industry: \"Insurance \/ Finance\", industryDe: \"Versicherung \/ Finanzen\",\n      tags: [\"SharePoint\", \"Intranet\", \"Training\"]\n    },\n    {\n      id: 11, section: \"additional\",\n      en: { title: \"Working Student - Marketing\", details: [\"Marketing support and assistance with the relaunch of swisslog.com\"] },\n      de: { title: \"Werkstudent - Marketingabteilung\", details: [\"Marketingunterst\u00fctzung und Hilfe beim Relaunch der Website swisslog.com\"] },\n      company: \"Swisslog AG\", startDate: \"2013-03\", endDate: \"2013-08\",\n      industry: \"Tech \/ Startup\", industryDe: \"Tech \/ Startup\",\n      tags: [\"Digital Marketing\", \"Web Management\"]\n    },\n    {\n      id: 12, section: \"additional\",\n      en: { title: \"Assistant Key Account Manager\", details: [\"Entered master and sales data into SAP; handled sales admin and offers\"] },\n      de: { title: \"Assistent Key Account Manager\", details: [\"Eingabe von Stamm- und Verkaufsdaten in das SAP-System sowie Verkaufsadministration und Angebotserstellung\"] },\n      company: \"Beiersdorf AG\", startDate: \"2006-05\", endDate: \"2007-12\",\n      industry: \"FMCG\", industryDe: \"FMCG\",\n      tags: [\"Sales\", \"SAP\"]\n    }\n  ];\n\n  const INDUSTRIES_EN = [...new Set(JOBS.map(j => j.industry))];\n  const INDUSTRIES_DE = [...new Set(JOBS.map(j => j.industryDe))];\n  const ALL_TAGS = [...new Set(JOBS.flatMap(j => j.tags))].sort();\n\n  const MONTHS_EN = [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"];\n  const MONTHS_DE = [\"Jan\",\"Feb\",\"M\u00e4r\",\"Apr\",\"Mai\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Okt\",\"Nov\",\"Dez\"];\n\n  function formatDate(d, lang) {\n    if (!d) return lang === \"de\" ? \"Aktuell\" : \"Present\";\n    const parts = d.split(\"-\");\n    const y = parts[0];\n    const m = parts[1];\n    const months = lang === \"de\" ? MONTHS_DE : MONTHS_EN;\n    return months[parseInt(m)-1] + \" \" + y;\n  }\n\n  \/* \u2500\u2500 PDF generation \u2500\u2500 *\/\n  function generatePdfHtml(lang) {\n    const t = TRANSLATIONS[lang];\n    const current = JOBS.filter(j => j.section === \"current\");\n    const professional = JOBS.filter(j => j.section === \"professional\");\n    const additional = JOBS.filter(j => j.section === \"additional\");\n    const sk = t.skills;\n\n    const jobBlock = (job) => {\n      const loc = job[lang];\n      const dates = formatDate(job.startDate, lang) + \" \u2013 \" + formatDate(job.endDate, lang);\n      return '<div class=\"job\">' +\n        '<div class=\"job-title\">' + loc.title + '<\/div>' +\n        '<div class=\"job-meta\">' + job.company + ', ' + dates + '<\/div>' +\n        '<ul>' + loc.details.map(d => '<li>' + d + '<\/li>').join(\"\") + '<\/ul>' +\n        '<\/div>';\n    };\n\n    const sectionHtml = (title, jobs) => {\n      if (!jobs.length) return \"\";\n      return '<h2>' + title + '<\/h2>' + jobs.map(jobBlock).join(\"\");\n    };\n\n    const eduHtml = t.eduItems.map(e =>\n      '<li><strong>' + e.title + '<\/strong> \u2014 ' + e.institution + (e.year ? ' (' + e.year + ')' : '') + '<\/li>'\n    ).join(\"\");\n\n    const skillsHtml = Object.values(sk).map(s =>\n      '<div class=\"skill-row\"><span class=\"skill-label\">' + s.label + ':<\/span> ' + s.value + '<\/div>'\n    ).join(\"\");\n\n    return '<!DOCTYPE html>' +\n'<html lang=\"' + lang + '\">' +\n'<head>' +\n'<meta charset=\"utf-8\"\/>' +\n'<title>' + CONFIG.name + ' \u2013 ' + t.cvTitle + '<\/title>' +\n'<style>' +\n'@page { size: A4; margin: 22mm 20mm 24mm 20mm; }' +\n'* { box-sizing: border-box; margin: 0; padding: 0; }' +\n\"body { font-family: 'Segoe UI', Arial, Helvetica, sans-serif; font-size: 9.5pt; color: #1a1a1a; line-height: 1.5; }\" +\n'h1 { font-size: 20pt; color: #17355C; margin: 0 0 1px 0; }' +\n'.subtitle { font-size: 11pt; color: #555; margin-bottom: 14px; }' +\n'h2 { font-size: 11pt; color: #17355C; border-bottom: 2px solid #17355C; padding-bottom: 3px; margin: 16px 0 8px 0; }' +\n'.job { margin-bottom: 10px; }' +\n'.job-title { font-weight: 700; font-size: 10pt; }' +\n'.job-meta { font-size: 9pt; color: #555; margin-bottom: 3px; }' +\n'ul { margin: 2px 0 0 18px; }' +\n'li { margin-bottom: 2px; }' +\n'.edu-list { margin: 4px 0 0 18px; }' +\n'.edu-list li { margin-bottom: 2px; }' +\n'.skill-row { margin-bottom: 3px; }' +\n'.skill-label { font-weight: 700; }' +\n'.footer { position: fixed; bottom: 0; left: 0; right: 0; text-align: center; font-size: 7.5pt; color: #999; border-top: 1px solid #ddd; padding-top: 4px; }' +\n'@media print { body { -webkit-print-color-adjust: exact; print-color-adjust: exact; } }' +\n'<\/style>' +\n'<\/head>' +\n'<body>' +\n'<h1>' + CONFIG.name + '<\/h1>' +\n'<div class=\"subtitle\">' + t.cvTitle + '<\/div>' +\n'<h2>' + t.education + '<\/h2>' +\n'<ul class=\"edu-list\">' + eduHtml + '<\/ul>' +\nsectionHtml(t.currentPosition, current) +\nsectionHtml(t.professionalExperience, professional) +\nsectionHtml(t.additionalExperience, additional) +\n'<h2>' + t.expertiseIn + '<\/h2>' +\nskillsHtml +\n'<div class=\"footer\">' + CONFIG.name + ' | ' + CONFIG.contact.address + ' | ' + CONFIG.contact.phone + '<\/div>' +\n'<scr' + 'ipt>window.onload=function(){window.print();}<\/scr' + 'ipt>' +\n'<\/body><\/html>';\n  }\n\n  \/* \u2500\u2500 State \u2500\u2500 *\/\n  const state = {\n    lang: 'en',\n    darkMode: false,\n    openJobs: new Set([1]),\n    selectedIndustries: new Set(),\n    selectedTags: new Set()\n  };\n\n  const container = document.getElementById('thomas-cv');\n  const contentDiv = document.getElementById('cv-content');\n  const canvas = document.getElementById('cv-particles');\n\n  function getFilteredJobs() {\n    return JOBS.filter(function(job){\n      if (state.selectedIndustries.size > 0) {\n        const label = state.lang === 'de' ? job.industryDe : job.industry;\n        if (!state.selectedIndustries.has(label)) return false;\n      }\n      if (state.selectedTags.size > 0 && !job.tags.some(function(tg){ return state.selectedTags.has(tg); })) return false;\n      return true;\n    });\n  }\n\n  function setLang(l) {\n    state.lang = l;\n    state.selectedIndustries.clear();\n    render();\n  }\n  function toggleJob(id) {\n    if (state.openJobs.has(id)) state.openJobs.delete(id);\n    else state.openJobs.add(id);\n    render();\n  }\n  function toggleIndustry(ind) {\n    if (state.selectedIndustries.has(ind)) state.selectedIndustries.delete(ind);\n    else state.selectedIndustries.add(ind);\n    render();\n  }\n  function toggleTag(tag) {\n    if (state.selectedTags.has(tag)) state.selectedTags.delete(tag);\n    else state.selectedTags.add(tag);\n    render();\n  }\n  function setOpenAll(open) {\n    const filtered = getFilteredJobs();\n    if (open) filtered.forEach(function(j){ state.openJobs.add(j.id); });\n    else filtered.forEach(function(j){ state.openJobs.delete(j.id); });\n    render();\n  }\n  function clearFilters() {\n    state.selectedIndustries.clear();\n    state.selectedTags.clear();\n    render();\n  }\n  function toggleDark() {\n    state.darkMode = !state.darkMode;\n    render();\n  }\n\n  \/* \u2500\u2500 Icons (inline SVG strings) \u2500\u2500 *\/\n  const ICON_CHEVRON = '<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"5 8 10 13 15 8\"\/><\/svg>';\n  const ICON_DOWNLOAD = '<svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"\/><polyline points=\"7 10 12 15 17 10\"\/><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"\/><\/svg>';\n  const ICON_SUN = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"5\"\/><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"\/><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"\/><line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"\/><line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"\/><line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"\/><line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"\/><line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"\/><line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"\/><\/svg>';\n  const ICON_MOON = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\"\/><\/svg>';\n\n  \/* \u2500\u2500 Render \u2500\u2500 *\/\n  function render() {\n    const t = TRANSLATIONS[state.lang];\n    const industries = state.lang === 'de' ? INDUSTRIES_DE : INDUSTRIES_EN;\n    const filtered = getFilteredJobs();\n    const hasFilters = state.selectedIndustries.size > 0 || state.selectedTags.size > 0;\n\n    container.setAttribute('data-theme', state.darkMode ? 'dark' : 'light');\n\n    let html = '';\n\n    \/* Controls *\/\n    html += '<div class=\"cv-topbar no-print\">';\n    html += '<div class=\"cv-lang-switch\">';\n    html += '<button class=\"cv-lang-btn ' + (state.lang==='en'?'active':'') + '\" data-action=\"lang-en\">EN<\/button>';\n    html += '<button class=\"cv-lang-btn ' + (state.lang==='de'?'active':'') + '\" data-action=\"lang-de\">DE<\/button>';\n    html += '<\/div>';\n    html += '<button class=\"cv-theme-btn\" data-action=\"toggle-dark\" title=\"' + (state.darkMode?'Light':'Dark') + '\">';\n    html += (state.darkMode ? ICON_SUN : ICON_MOON);\n    html += '<\/button>';\n    html += '<div class=\"cv-downloads\">';\n    t.downloads.forEach(function(dl, i){\n      html += '<button class=\"cv-download-btn\" data-action=\"download\" data-index=\"' + i + '\">' + ICON_DOWNLOAD + ' ' + dl.label + '<\/button>';\n    });\n    html += '<\/div><\/div>';\n\n    \/* Header *\/\n    html += '<div class=\"cv-header\">';\n    html += '<h1>' + CONFIG.name + '<\/h1>';\n    html += '<p class=\"cv-tagline\">' + t.tagline + '<\/p>';\n    html += '<p class=\"cv-profile\">' + t.profile + '<\/p>';\n    html += '<\/div>';\n\n    \/* Education *\/\n    html += '<div class=\"cv-education\">';\n    html += '<h2 class=\"cv-section-title\">' + t.education + '<\/h2>';\n    html += '<div class=\"cv-edu-pills\">';\n    t.eduItems.forEach(function(e){\n      html += '<span class=\"cv-edu-pill\"><strong>' + e.title + '<\/strong><span class=\"cv-edu-inst\"> \u2014 ' + e.institution + '<\/span>' + (e.year?'<span class=\"cv-edu-year\">(' + e.year + ')<\/span>':'') + '<\/span>';\n    });\n    html += '<\/div><\/div>';\n\n    \/* Filters *\/\n    html += '<div class=\"cv-filters no-print\">';\n    html += '<div class=\"cv-filter-header\">';\n    html += '<h2 class=\"cv-section-title\">' + t.filterExperience + '<\/h2>';\n    if (hasFilters) html += '<button class=\"cv-clear-all\" data-action=\"clear\">' + t.clearAll + '<\/button>';\n    html += '<\/div>';\n    html += '<div class=\"cv-filter-group\">';\n    html += '<div class=\"cv-filter-label\">' + t.industry + '<\/div>';\n    html += '<div class=\"cv-filter-tags\">';\n    industries.forEach(function(ind){\n      html += '<button class=\"cv-filter-tag ' + (state.selectedIndustries.has(ind)?'active':'') + '\" data-type=\"industry\" data-value=\"' + ind + '\">' + ind + '<\/button>';\n    });\n    html += '<\/div><\/div>';\n    html += '<div class=\"cv-filter-group\">';\n    html += '<div class=\"cv-filter-label\">' + t.expertise + '<\/div>';\n    html += '<div class=\"cv-filter-tags\">';\n    ALL_TAGS.forEach(function(tag){\n      html += '<button class=\"cv-filter-tag ' + (state.selectedTags.has(tag)?'active':'') + '\" data-type=\"tag\" data-value=\"' + tag + '\">' + tag + '<\/button>';\n    });\n    html += '<\/div><\/div><\/div>';\n\n    \/* Timeline header *\/\n    html += '<div class=\"cv-timeline-header\">';\n    html += '<h2 class=\"cv-section-title\">' + t.careerTimeline + '<\/h2>';\n    html += '<span class=\"cv-count\">' + filtered.length + ' ' + t.of + ' ' + JOBS.length + ' ' + t.positions + '<\/span>';\n    html += '<\/div>';\n\n    \/* Jobs *\/\n    if (filtered.length === 0) {\n      html += '<div class=\"cv-no-match\">' + t.noMatch + '<\/div>';\n    } else {\n      html += '<div class=\"cv-jobs\">';\n      filtered.forEach(function(job){\n        const isOpen = state.openJobs.has(job.id);\n        const isCurrent = !job.endDate;\n        const loc = job[state.lang];\n        const industryLabel = state.lang === 'de' ? job.industryDe : job.industry;\n\n        html += '<div class=\"cv-job\" data-id=\"' + job.id + '\">';\n        html += '<div class=\"cv-job-track\">';\n        html += '<div class=\"cv-job-dot ' + (isCurrent?'current':'') + '\"><\/div>';\n        html += '<div class=\"cv-job-line\"><\/div>';\n        html += '<\/div>';\n        html += '<div class=\"cv-job-card ' + (isOpen?'open':'') + '\">';\n        html += '<button class=\"cv-job-toggle\">';\n        html += '<div class=\"cv-job-summary\">';\n        html += '<div class=\"cv-job-meta-top\">';\n        html += '<span class=\"cv-job-date\">' + formatDate(job.startDate, state.lang) + ' \u2014 ' + formatDate(job.endDate, state.lang) + '<\/span>';\n        if (isCurrent) html += '<span class=\"cv-badge\">' + t.current + '<\/span>';\n        html += '<\/div>';\n        html += '<div class=\"cv-job-title\">' + loc.title + '<\/div>';\n        html += '<div class=\"cv-job-company\">' + job.company + ' <span class=\"cv-divider\">|<\/span> <span class=\"cv-industry\">' + industryLabel + '<\/span><\/div>';\n        html += '<\/div>';\n        html += '<div class=\"cv-chevron ' + (isOpen?'open':'') + '\">' + ICON_CHEVRON + '<\/div>';\n        html += '<\/button>';\n        html += '<div class=\"cv-job-body\" style=\"' + (isOpen?'':'display:none') + '\">';\n        html += '<div class=\"cv-job-tags\">';\n        job.tags.forEach(function(tg){\n          html += '<span class=\"cv-tag-pill\">' + tg + '<\/span>';\n        });\n        html += '<\/div>';\n        html += '<ul class=\"cv-job-details\">';\n        loc.details.forEach(function(d){\n          html += '<li><span class=\"cv-bullet\"><\/span>' + d + '<\/li>';\n        });\n        html += '<\/ul><\/div><\/div><\/div>';\n      });\n      html += '<\/div>';\n\n      const allOpen = filtered.every(function(j){ return state.openJobs.has(j.id); });\n      html += '<div class=\"cv-expand-wrap no-print\">';\n      html += '<button class=\"cv-expand-btn\" data-action=\"' + (allOpen?'collapse':'expand') + '\">' + (allOpen?t.collapseAll:t.expandAll) + '<\/button>';\n      html += '<\/div>';\n    }\n\n    contentDiv.innerHTML = html;\n    resizeCanvas();\n  }\n\n  \/* \u2500\u2500 Event delegation \u2500\u2500 *\/\n  contentDiv.addEventListener('click', function(e){\n    const btn = e.target.closest('[data-action]');\n    if (!btn) return;\n    const action = btn.dataset.action;\n\n    if (action === 'lang-en') setLang('en');\n    else if (action === 'lang-de') setLang('de');\n    else if (action === 'toggle-dark') toggleDark();\n    else if (action === 'clear') clearFilters();\n    else if (action === 'expand') setOpenAll(true);\n    else if (action === 'collapse') setOpenAll(false);\n    else if (action === 'download') {\n      const idx = parseInt(btn.dataset.index);\n      const dl = TRANSLATIONS[state.lang].downloads[idx];\n      if (dl.type === 'generated') {\n        const html = generatePdfHtml(state.lang);\n        const win = window.open('', '_blank');\n        if (win) { win.document.write(html); win.document.close(); }\n      } else if (dl.url) {\n        window.open(dl.url, '_blank');\n      }\n    }\n  });\n\n  contentDiv.addEventListener('click', function(e){\n    const toggle = e.target.closest('.cv-job-toggle');\n    if (toggle) {\n      const id = parseInt(toggle.closest('.cv-job').dataset.id);\n      toggleJob(id);\n    }\n  });\n\n  contentDiv.addEventListener('click', function(e){\n    const tag = e.target.closest('.cv-filter-tag');\n    if (tag) {\n      const type = tag.dataset.type;\n      const val = tag.dataset.value;\n      if (type === 'industry') toggleIndustry(val);\n      else if (type === 'tag') toggleTag(val);\n    }\n  });\n\n  \/* \u2500\u2500 Particles \u2500\u2500 *\/\n  let particlesInit = false;\n  function resizeCanvas() {\n    canvas.width = container.offsetWidth;\n    canvas.height = container.scrollHeight;\n  }\n  function initParticles() {\n    if (particlesInit) return;\n    if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n    particlesInit = true;\n    const ctx = canvas.getContext('2d');\n    const COUNT = 45;\n    const CONNECT_DIST = 140;\n    const MOUSE_DIST = 200;\n    const particles = [];\n\n    function Particle() {\n      this.x = Math.random() * canvas.width;\n      this.y = Math.random() * canvas.height;\n      this.vx = (Math.random() - 0.5) * 0.35;\n      this.vy = (Math.random() - 0.5) * 0.35;\n      this.r = Math.random() * 1.2 + 0.4;\n    }\n    Particle.prototype.update = function(mx, my) {\n      this.x += this.vx;\n      this.y += this.vy;\n      if (this.x < 0 || this.x > canvas.width) this.vx *= -1;\n      if (this.y < 0 || this.y > canvas.height) this.vy *= -1;\n      if (mx != null && my != null) {\n        const dx = this.x - mx;\n        const dy = this.y - my;\n        const d = Math.sqrt(dx*dx + dy*dy);\n        if (d < MOUSE_DIST) {\n          const f = (MOUSE_DIST - d) \/ MOUSE_DIST;\n          this.x += dx * f * 0.02;\n          this.y += dy * f * 0.02;\n        }\n      }\n    };\n    Particle.prototype.draw = function() {\n      ctx.beginPath();\n      ctx.arc(this.x, this.y, this.r, 0, Math.PI*2);\n      ctx.fillStyle = state.darkMode ? 'rgba(96,165,250,0.5)' : 'rgba(23,53,92,0.35)';\n      ctx.fill();\n    };\n\n    const mouse = { x: null, y: null };\n    function onMove(e) {\n      const rect = container.getBoundingClientRect();\n      mouse.x = e.clientX - rect.left;\n      mouse.y = e.clientY - rect.top + container.scrollTop;\n    }\n    function onLeave() { mouse.x = null; mouse.y = null; }\n\n    resizeCanvas();\n    for (let i = 0; i < COUNT; i++) particles.push(new Particle());\n\n    function animate() {\n      ctx.clearRect(0, 0, canvas.width, canvas.height);\n      particles.forEach(function(p){ p.update(mouse.x, mouse.y); p.draw(); });\n      for (let i = 0; i < particles.length; i++) {\n        for (let j = i + 1; j < particles.length; j++) {\n          const dx = particles[i].x - particles[j].x;\n          const dy = particles[i].y - particles[j].y;\n          const d = Math.sqrt(dx*dx + dy*dy);\n          if (d < CONNECT_DIST) {\n            ctx.beginPath();\n            ctx.moveTo(particles[i].x, particles[i].y);\n            ctx.lineTo(particles[j].x, particles[j].y);\n            const alpha = (1 - d \/ CONNECT_DIST) * 0.25;\n            const rgb = state.darkMode ? '96,165,250' : '23,53,92';\n            ctx.strokeStyle = 'rgba(' + rgb + ',' + alpha + ')';\n            ctx.lineWidth = 0.8;\n            ctx.stroke();\n          }\n        }\n      }\n      requestAnimationFrame(animate);\n    }\n    animate();\n    container.addEventListener('mousemove', onMove);\n    container.addEventListener('mouseleave', onLeave);\n    window.addEventListener('resize', resizeCanvas);\n  }\n\n  \/* \u2500\u2500 Boot \u2500\u2500 *\/\n  function boot() {\n    render();\n    initParticles();\n  }\n  if (document.readyState !== 'loading') boot();\n  else document.addEventListener('DOMContentLoaded', boot);\n})();\n<\/script>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-8","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>- CV TJ<\/title>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"- CV TJ\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cv.jedelhauser.technology\/?page_id=8\" \/>\n<meta property=\"og:site_name\" content=\"CV TJ\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-21T12:36:47+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data1\" content=\"1\u00a0Minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/cv.jedelhauser.technology\\\/?page_id=8\",\"url\":\"https:\\\/\\\/cv.jedelhauser.technology\\\/?page_id=8\",\"name\":\"- CV TJ\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/cv.jedelhauser.technology\\\/#website\"},\"datePublished\":\"2026-04-21T08:46:19+00:00\",\"dateModified\":\"2026-04-21T12:36:47+00:00\",\"inLanguage\":\"de-CH\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/cv.jedelhauser.technology\\\/?page_id=8\"]}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/cv.jedelhauser.technology\\\/#website\",\"url\":\"https:\\\/\\\/cv.jedelhauser.technology\\\/\",\"name\":\"CV TJ\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/cv.jedelhauser.technology\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de-CH\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"- CV TJ","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"de_DE","og_type":"article","og_title":"- CV TJ","og_url":"https:\/\/cv.jedelhauser.technology\/?page_id=8","og_site_name":"CV TJ","article_modified_time":"2026-04-21T12:36:47+00:00","twitter_card":"summary_large_image","twitter_misc":{"Gesch\u00e4tzte Lesezeit":"1\u00a0Minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/cv.jedelhauser.technology\/?page_id=8","url":"https:\/\/cv.jedelhauser.technology\/?page_id=8","name":"- CV TJ","isPartOf":{"@id":"https:\/\/cv.jedelhauser.technology\/#website"},"datePublished":"2026-04-21T08:46:19+00:00","dateModified":"2026-04-21T12:36:47+00:00","inLanguage":"de-CH","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cv.jedelhauser.technology\/?page_id=8"]}]},{"@type":"WebSite","@id":"https:\/\/cv.jedelhauser.technology\/#website","url":"https:\/\/cv.jedelhauser.technology\/","name":"CV TJ","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cv.jedelhauser.technology\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de-CH"}]}},"_links":{"self":[{"href":"https:\/\/cv.jedelhauser.technology\/index.php?rest_route=\/wp\/v2\/pages\/8","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cv.jedelhauser.technology\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cv.jedelhauser.technology\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cv.jedelhauser.technology\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cv.jedelhauser.technology\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8"}],"version-history":[{"count":6,"href":"https:\/\/cv.jedelhauser.technology\/index.php?rest_route=\/wp\/v2\/pages\/8\/revisions"}],"predecessor-version":[{"id":17,"href":"https:\/\/cv.jedelhauser.technology\/index.php?rest_route=\/wp\/v2\/pages\/8\/revisions\/17"}],"wp:attachment":[{"href":"https:\/\/cv.jedelhauser.technology\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}