{"id":4639,"date":"2026-09-10T13:27:15","date_gmt":"2026-09-10T11:27:15","guid":{"rendered":"https:\/\/pfaffinnovation.com\/historie\/"},"modified":"2026-10-30T11:52:28","modified_gmt":"2026-10-30T10:52:28","slug":"historie","status":"publish","type":"page","link":"https:\/\/pfaffinnovation.com\/de\/ueber-uns\/historie\/","title":{"rendered":"Historie"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"4639\" class=\"elementor elementor-4639 elementor-1196\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5205d159 e-con-full e-flex e-con e-parent\" data-id=\"5205d159\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-24d85293 e-flex e-con-boxed e-con e-child\" data-id=\"24d85293\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-59156c0a animated-slow elementor-invisible elementor-widget elementor-widget-heading\" data-id=\"59156c0a\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;}\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Die <img decoding=\"async\" src=\"https:\/\/pfaffinnovation.com\/wp-content\/uploads\/2026\/06\/pfaff-logo-weiss.svg\" alt=\"PFAFF\" style=\"height:0.8em;width:auto;vertical-align:baseline;display:inline-block\" \/> Historie<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-519063db elementor-position-inline-start elementor-widget__width-auto elementor-absolute e-transform scroll-icon-box elementor-mobile-position-inline-start elementor-view-default elementor-widget elementor-widget-icon-box\" data-id=\"519063db\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_position&quot;:&quot;absolute&quot;,&quot;_transform_rotateZ_effect&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:-90,&quot;sizes&quot;:[]},&quot;_transform_rotateZ_effect_laptop&quot;:{&quot;unit&quot;:&quot;deg&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;_transform_rotateZ_effect_tablet_extra&quot;:{&quot;unit&quot;:&quot;deg&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;_transform_rotateZ_effect_tablet&quot;:{&quot;unit&quot;:&quot;deg&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;_transform_rotateZ_effect_mobile_extra&quot;:{&quot;unit&quot;:&quot;deg&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;_transform_rotateZ_effect_mobile&quot;:{&quot;unit&quot;:&quot;deg&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\t\t\t<div class=\"elementor-icon-box-icon\">\n\t\t\t\t<a href=\"#content\" class=\"elementor-icon\" tabindex=\"-1\" aria-label=\"SCROLLEN\">\n\t\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"15\" height=\"10\" viewBox=\"0 0 15 10\" fill=\"none\"><path d=\"M14.5264 4.87427L0.526367 4.87427\" stroke=\"white\" stroke-linejoin=\"round\"><\/path><path d=\"M5.02077 0.353495L0.5 4.87427L5.00603 9.3803\" stroke=\"white\" stroke-linejoin=\"round\"><\/path><\/svg>\t\t\t\t<\/a>\n\t\t\t<\/div>\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<a href=\"#content\" >\n\t\t\t\t\t\t\tSCROLLEN\t\t\t\t\t\t<\/a>\n\t\t\t\t\t<\/span>\n\t\t\t\t\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-49e7d375 elementor-absolute elementor-widget elementor-widget-image\" data-id=\"49e7d375\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_position&quot;:&quot;absolute&quot;}\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"370\" height=\"337\" src=\"https:\/\/pfaffinnovation.com\/wp-content\/uploads\/2026\/07\/pfaff-muster-header.svg\" class=\"attachment-full size-full wp-image-4507\" alt=\"\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-362afe9 e-con-full e-flex e-con e-parent\" data-id=\"362afe9\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-1b998411 e-flex e-con-boxed e-con e-child\" data-id=\"1b998411\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-77337e5 e-con-full e-flex e-con e-child\" data-id=\"77337e5\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-96dfcf4 elementor-position-inline-start elementor-mobile-position-inline-start elementor-widget__width-auto animated-slow elementor-view-default elementor-invisible elementor-widget elementor-widget-icon-box\" data-id=\"96dfcf4\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;}\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\t\t\t<div class=\"elementor-icon-box-icon\">\n\t\t\t\t<span  class=\"elementor-icon\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-circle\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8z\"><\/path><\/svg>\t\t\t\t<\/span>\n\t\t\t<\/div>\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tHistorie\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-32bacbf9 elementor-widget elementor-widget-spacer\" data-id=\"32bacbf9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8f1d176 animated-slow elementor-invisible elementor-widget elementor-widget-heading\" data-id=\"8f1d176\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;}\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Von einer kleinen <br \/> Kfz-Reparatur\u00adwerkstatt zum Weltmarktf\u00fchrer.<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-86cd65e elementor-widget elementor-widget-spacer\" data-id=\"86cd65e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-39cd2ff7 animated-slow elementor-widget__width-initial elementor-invisible elementor-widget elementor-widget-text-editor\" data-id=\"39cd2ff7\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Was als kleine Kfz-Reparaturwerkstatt begann, hat sich zu einem Weltmarktf\u00fchrer f\u00fcr Werkzeugbaul\u00f6sungen in der Automobil-Dichtungsindustrie entwickelt.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-d227261 e-con-full e-flex e-con e-child\" data-id=\"d227261\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-4e53df2 e-con-full e-flex e-con e-child\" data-id=\"4e53df2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-277c5f4 elementor-widget elementor-widget-html\" data-id=\"277c5f4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- ============================================================\r\n  PFAFF Zeitstrahl \u2013 f\u00fcr WordPress (Block \"Eigenes HTML\")\r\n  1. Block \"Eigenes HTML\" einf\u00fcgen, kompletten Inhalt dieser Datei einf\u00fcgen.\r\n  2. Inhalte \u00e4ndern: Abschnitt \"EINTRAEGE\" im Script ganz unten.\r\n  3. Tempo \u00e4ndern: data-interval am Container (Millisekunden pro Eintrag).\r\n     Pause nach Klick: data-pause am Container (Millisekunden, 120000 = 2 Minuten).\r\n  4. Scroll-Modus: Der Bereich bleibt beim Scrollen stehen, und mit dem Scrollen wechselt das Jahr.\r\n     data-scroll=\"off\" schaltet ihn ab (dann l\u00e4uft der Zeitstrahl wie vorher von selbst durch).\r\n     data-step: Scrollstrecke pro Jahr in Pixeln.\r\n     data-top: Abstand oben. \"auto\" = die Kopfzeile der Seite wird automatisch erkannt (auch wenn sie beim Scrollen\r\n     ein- und ausf\u00e4hrt). Alternativ eine feste Zahl in Pixeln, z. B. data-top=\"110\".\r\n     data-gap: Mindestabstand zum oberen Rand in Pixeln, wenn der Header beim Runterscrollen ausgeblendet ist.\r\n  5. Fotoschatten: St\u00e4rke im CSS bei \".pz-img\" (box-shadow) \u00e4ndern.\r\n  6. Fotos werden immer in ihrem Originalformat gezeigt (quer, hoch, quadratisch), ohne Beschnitt.\r\n  7. Wei\u00dfer Fotorand: Breite im CSS bei \"--pz-frame\" \u00e4ndern (0px = kein Rand).\r\n  Keine externen Schriften, keine Bibliotheken, keine Cookies.\r\n============================================================ -->\r\n<div id=\"pfaff-zeitstrahl\" data-interval=\"6000\" data-pause=\"120000\" data-scroll=\"on\" data-step=\"200\" data-top=\"auto\" data-gap=\"48\">\r\n<style>\r\n\/* Optional: Montserrat lokal ausliefern (Dateien in die Mediathek hochladen, URLs eintragen, Kommentar entfernen)\r\n@font-face{font-family:'Montserrat';font-weight:400;font-display:swap;src:url('HIER-URL-montserrat-400.woff2') format('woff2')}\r\n@font-face{font-family:'Montserrat';font-weight:300;font-display:swap;src:url('HIER-URL-montserrat-300.woff2') format('woff2')}\r\n@font-face{font-family:'Montserrat';font-weight:700;font-display:swap;src:url('HIER-URL-montserrat-700.woff2') format('woff2')}\r\n*\/\r\n#pfaff-zeitstrahl{\r\n  --pz-green:#6DD44B; --pz-green-soft:#B9EBA6; --pz-black:#020203; --pz-text:#676768;\r\n  --pz-rail:#E3E6EC; --pz-ring:#BFC4D0; --pz-more:#A3A9BB; --pz-dur:6000ms;\r\n  --pz-frame:14px;       \/* wei\u00dfer Rand um die Fotos, wie bei einem alten Abzug *\/\r\n  --pz-text-size:19px;   \/* Beschreibungstext: gleiche Gr\u00f6\u00dfe wie der Text des Moduls dar\u00fcber (bei Abweichung hier \u00e4ndern) *\/\r\n  max-width:1280px; margin:0 auto; color:var(--pz-black);\r\n  font-family:Montserrat,Calibri,Arial,sans-serif; font-size:16px; line-height:1.5;\r\n  box-sizing:border-box;\r\n}\r\n#pfaff-zeitstrahl *,#pfaff-zeitstrahl *::before,#pfaff-zeitstrahl *::after{box-sizing:border-box}\r\n\r\n#pfaff-zeitstrahl .pz-runway{position:relative}\r\n#pfaff-zeitstrahl .pz-stick{background:#FFFFFF;padding:48px 40px 40px;overflow:hidden;box-sizing:border-box}\r\n\/* Scroll-Modus: der Bereich bleibt auf dem Bildschirm stehen, w\u00e4hrend man scrollt *\/\r\n#pfaff-zeitstrahl.is-scroll .pz-stick{position:sticky;top:var(--pz-top,0px);padding-top:24px;padding-bottom:24px}\r\n#pfaff-zeitstrahl.is-scroll.is-fixed .pz-stick{position:static;top:auto}\r\n#pfaff-zeitstrahl.is-scroll .pz-run{display:none}\r\n#pfaff-zeitstrahl.is-scroll .pz-list{overflow-y:hidden}\r\n\r\n#pfaff-zeitstrahl .pz-wrap{display:grid;grid-template-columns:250px minmax(0,1fr);gap:56px;align-items:start}\r\n#pfaff-zeitstrahl .pz-side{min-width:0}\r\n\r\n\/* ---------- Zeitstrahl (senkrecht) ---------- *\/\r\n\/* Zeitstrahl hat so viel H\u00f6he wie das Detailfeld und scrollt in sich (H\u00f6he setzt das Script) *\/\r\n#pfaff-zeitstrahl .pz-list{list-style:none;margin:0;padding:28px 0 124px 40px;position:relative;\r\n  overflow-y:auto;overflow-x:hidden;scrollbar-width:thin;scrollbar-color:#C3C7D3 transparent}\r\n#pfaff-zeitstrahl .pz-item{margin:0;padding:0;list-style:none;position:relative}\r\n#pfaff-zeitstrahl .pz-rail,\r\n#pfaff-zeitstrahl .pz-rail-fill,\r\n#pfaff-zeitstrahl .pz-run{position:absolute;left:54px;width:4px;pointer-events:none}\r\n#pfaff-zeitstrahl .pz-rail{background:var(--pz-rail)}\r\n#pfaff-zeitstrahl .pz-rail-fill{background:var(--pz-green);transition:height .6s ease}\r\n#pfaff-zeitstrahl .pz-run{background:var(--pz-green-soft);transform-origin:top center;transform:scaleY(0);animation:pzrun var(--pz-dur) linear forwards}\r\n#pfaff-zeitstrahl.is-paused .pz-run{animation-play-state:paused}\r\n@keyframes pzrun{from{transform:scaleY(0)}to{transform:scaleY(1)}}\r\n\r\n\/* Fortsetzung nach dem letzten Eintrag: einzelne Punkte und Pfeilspitze, die nacheinander gr\u00fcn werden *\/\r\n#pfaff-zeitstrahl .pz-more{position:absolute;left:46px;width:20px;display:flex;flex-direction:column;align-items:center;gap:10px;pointer-events:none}\r\n#pfaff-zeitstrahl .pz-mdot{display:block;width:7px;height:7px;border-radius:50%;background:var(--pz-more)}\r\n#pfaff-zeitstrahl .pz-marrow{display:block;width:16px;height:16px;margin-top:-4px;\r\n  border-right:4px solid var(--pz-more);border-bottom:4px solid var(--pz-more);transform:rotate(45deg)}\r\n#pfaff-zeitstrahl .pz-more.is-run .pz-mdot{animation:pzdot .35s ease forwards;animation-delay:calc(var(--pz-dur) * var(--i) \/ 5)}\r\n#pfaff-zeitstrahl .pz-more.is-run .pz-marrow{animation:pzarrow .35s ease forwards;animation-delay:calc(var(--pz-dur) * var(--i) \/ 5)}\r\n#pfaff-zeitstrahl.is-paused .pz-more.is-run .pz-mdot,\r\n#pfaff-zeitstrahl.is-paused .pz-more.is-run .pz-marrow{animation-play-state:paused}\r\n@keyframes pzdot{from{background:var(--pz-more)}to{background:var(--pz-green)}}\r\n@keyframes pzarrow{from{border-color:var(--pz-more)}to{border-color:var(--pz-green)}}\r\n\r\n#pfaff-zeitstrahl .pz-btn{\r\n  all:unset; display:block; width:100%; position:relative; cursor:pointer; box-sizing:border-box;\r\n  padding:8px 8px 8px 62px; font-family:inherit; font-size:28px; font-weight:300; line-height:1.2; white-space:nowrap;\r\n  font-variant-numeric:lining-nums tabular-nums; font-feature-settings:\"lnum\" 1,\"tnum\" 1; letter-spacing:0;\r\n  -webkit-text-size-adjust:100%; text-size-adjust:100%;\r\n  color:var(--pz-black);\r\n}\r\n#pfaff-zeitstrahl .pz-btn::before{\r\n  content:\"\"; position:absolute; left:16px; top:50%; width:18px; height:18px; border-radius:50%;\r\n  transform:translate(-50%,-50%); background:#fff; border:3px solid var(--pz-ring);\r\n  transition:width .25s ease,height .25s ease,background-color .25s ease,border-color .25s ease,box-shadow .25s ease;\r\n}\r\n#pfaff-zeitstrahl .pz-btn:hover::before{border-color:var(--pz-green)}\r\n#pfaff-zeitstrahl .pz-btn:focus-visible{outline:3px solid var(--pz-black);outline-offset:2px;border-radius:4px}\r\n#pfaff-zeitstrahl .pz-item.is-past .pz-btn::before{background:var(--pz-green);border-color:var(--pz-green)}\r\n#pfaff-zeitstrahl .pz-item.is-active .pz-btn{font-weight:700}\r\n#pfaff-zeitstrahl .pz-item.is-active .pz-btn::before{width:32px;height:32px;background:var(--pz-green);border-color:var(--pz-green);box-shadow:0 0 0 9px rgba(109,212,75,.28);animation:pzpulse 1.8s ease-out infinite}\r\n\/* Aktueller Punkt pulsiert: Ring breitet sich aus, der Punkt \"atmet\" leicht *\/\r\n@keyframes pzpulse{\r\n  0%{box-shadow:0 0 0 9px rgba(109,212,75,.28),0 0 0 9px rgba(109,212,75,.6);transform:translate(-50%,-50%) scale(1)}\r\n  70%{box-shadow:0 0 0 9px rgba(109,212,75,.28),0 0 0 32px rgba(109,212,75,0);transform:translate(-50%,-50%) scale(1.14)}\r\n  100%{box-shadow:0 0 0 9px rgba(109,212,75,.28),0 0 0 32px rgba(109,212,75,0);transform:translate(-50%,-50%) scale(1)}\r\n}\r\n\r\n\/* ---------- Detailfeld: Text oben, Foto darunter ---------- *\/\r\n#pfaff-zeitstrahl .pz-panel{\r\n  display:flex; flex-direction:column; gap:28px;\r\n  margin:0; padding:0; transition:opacity .2s ease,transform .2s ease;\r\n}\r\n#pfaff-zeitstrahl .pz-panel.is-swap{opacity:0;transform:translateY(8px)}\r\n#pfaff-zeitstrahl .pz-copy{min-width:0}\r\n#pfaff-zeitstrahl .pz-big{margin:0 0 10px;padding:0;font-family:inherit;font-weight:700;\r\n  font-size:28px;line-height:1.25;letter-spacing:0;color:var(--pz-black);text-transform:none}\r\n#pfaff-zeitstrahl .pz-text{max-width:64ch}\r\n#pfaff-zeitstrahl .pz-text p{margin:0 0 .6em;padding:0;font-size:var(--pz-text-size);font-weight:300;line-height:1.45;color:var(--pz-text)}\r\n#pfaff-zeitstrahl .pz-text p:last-child{margin-bottom:0}\r\n\r\n\/* Foto gerade, ohne Rahmen, im Originalformat (quer, hoch, quadratisch), ohne Beschnitt, linksb\u00fcndig.\r\n   Die Bildfl\u00e4che hat immer die gleiche H\u00f6he (die Seite springt nicht), das Foto passt sich darin an. Gr\u00f6\u00dfe setzt das Script. *\/\r\n#pfaff-zeitstrahl .pz-photo{margin:0;padding:0;background:none;border:0;box-shadow:none;transform:none}\r\n#pfaff-zeitstrahl .pz-img{display:block;width:100%;max-width:100%;height:auto;aspect-ratio:16\/10;object-fit:contain;margin:0;border:0;border-radius:0;\r\n  \/* Wei\u00dfer Rand wie bei einem alten Fotoabzug *\/\r\n  padding:var(--pz-frame);background:#FFFFFF;\r\n  \/* Schatten wie bei einem Foto, das auf einem Tisch liegt: feine Kante + weicher Schatten rundherum und nach unten *\/\r\n  box-shadow:0 0 0 1px rgba(0,0,0,.05),0 1px 3px rgba(0,0,0,.12),0 4px 12px rgba(0,0,0,.10),0 16px 26px -10px rgba(0,0,0,.30)}\r\n\/* Kein Rand und kein Schatten, wenn kein Bild hinterlegt ist *\/\r\n#pfaff-zeitstrahl .pz-img.is-empty{box-shadow:none;padding:0;background:transparent}\r\n\r\n\/* ---------- Tablet \/ Smartphone ---------- *\/\r\n@media (max-width:980px){\r\n  #pfaff-zeitstrahl .pz-wrap{grid-template-columns:200px minmax(0,1fr);gap:32px}\r\n  #pfaff-zeitstrahl .pz-btn{font-size:24px;padding-left:56px}\r\n  #pfaff-zeitstrahl .pz-big{font-size:26px}\r\n}\r\n@media (max-width:760px){\r\n  \/* Smartphone: Zeitstrahl waagerecht zum Wischen oben, Text und Foto direkt darunter *\/\r\n  #pfaff-zeitstrahl .pz-stick{padding:20px 0 24px}\r\n  #pfaff-zeitstrahl.is-scroll .pz-stick{padding-top:12px;padding-bottom:12px}\r\n  #pfaff-zeitstrahl .pz-wrap{grid-template-columns:1fr;gap:20px}\r\n  #pfaff-zeitstrahl .pz-side{max-width:none}\r\n  #pfaff-zeitstrahl .pz-list{display:flex;flex-direction:row;align-items:flex-start;overflow-x:auto;overflow-y:hidden;\r\n    padding:24px 28px 6px;-webkit-overflow-scrolling:touch;scrollbar-width:none;overscroll-behavior-x:contain;touch-action:pan-x pan-y;\r\n    -webkit-mask-image:linear-gradient(to right,transparent 0,#000 18px,#000 calc(100% - 28px),transparent 100%);\r\n    mask-image:linear-gradient(to right,transparent 0,#000 18px,#000 calc(100% - 28px),transparent 100%)}\r\n  #pfaff-zeitstrahl .pz-list::-webkit-scrollbar{display:none}\r\n  #pfaff-zeitstrahl .pz-item{flex:none}\r\n  #pfaff-zeitstrahl .pz-rail,\r\n  #pfaff-zeitstrahl .pz-rail-fill,\r\n  #pfaff-zeitstrahl .pz-run{top:50px;height:4px}\r\n  #pfaff-zeitstrahl .pz-rail-fill{transition:width .6s ease}\r\n  #pfaff-zeitstrahl .pz-run{transform-origin:left center;transform:scaleX(0);animation:pzrunx var(--pz-dur) linear forwards}\r\n  #pfaff-zeitstrahl .pz-more{top:43px;width:auto;height:18px;flex-direction:row;gap:9px;padding-right:44px}\r\n  #pfaff-zeitstrahl .pz-marrow{margin-top:0;margin-left:-4px;transform:rotate(-45deg)}\r\n  #pfaff-zeitstrahl .pz-btn{display:block;width:auto;padding:46px 14px 12px;text-align:center;font-size:20px;min-height:44px}\r\n  #pfaff-zeitstrahl .pz-btn::before{left:50%;top:28px;width:16px;height:16px;border-width:3px}\r\n  #pfaff-zeitstrahl .pz-item.is-active .pz-btn::before{width:28px;height:28px;box-shadow:0 0 0 7px rgba(109,212,75,.28);animation-name:pzpulsem}\r\n  #pfaff-zeitstrahl .pz-panel{position:static;gap:18px;margin:0 18px}\r\n  #pfaff-zeitstrahl .pz-big{font-size:24px}\r\n  #pfaff-zeitstrahl .pz-text p{font-size:calc(var(--pz-text-size) - 1px)}\r\n  #pfaff-zeitstrahl{--pz-frame:8px}\r\n}\r\n@keyframes pzrunx{from{transform:scaleX(0)}to{transform:scaleX(1)}}\r\n@keyframes pzpulsem{\r\n  0%{box-shadow:0 0 0 7px rgba(109,212,75,.28),0 0 0 7px rgba(109,212,75,.6);transform:translate(-50%,-50%) scale(1)}\r\n  70%{box-shadow:0 0 0 7px rgba(109,212,75,.28),0 0 0 22px rgba(109,212,75,0);transform:translate(-50%,-50%) scale(1.12)}\r\n  100%{box-shadow:0 0 0 7px rgba(109,212,75,.28),0 0 0 22px rgba(109,212,75,0);transform:translate(-50%,-50%) scale(1)}\r\n}\r\n@media (prefers-reduced-motion:reduce){\r\n  #pfaff-zeitstrahl *,#pfaff-zeitstrahl *::before{transition:none!important}\r\n  #pfaff-zeitstrahl .pz-item.is-active .pz-btn::before{animation:none!important}\r\n}\r\n<\/style>\r\n\r\n<div class=\"pz-runway\"><div class=\"pz-stick\">\r\n<div class=\"pz-wrap\">\r\n  <div class=\"pz-side\">\r\n    <ol class=\"pz-list\" aria-label=\"Zeitstrahl\"><\/ol>\r\n  <\/div>\r\n  <div class=\"pz-panel\" id=\"pz-panel\" role=\"region\" aria-label=\"Details zum ausgew\u00e4hlten Eintrag\">\r\n    <div class=\"pz-copy\">\r\n      <h3 class=\"pz-big\"><\/h3>\r\n      <div class=\"pz-text\"><\/div>\r\n    <\/div>\r\n    <figure class=\"pz-photo\"><img class=\"pz-img\" alt=\"\" width=\"1200\" height=\"750\"><\/figure>\r\n  <\/div>\r\n<\/div>\r\n<\/div><\/div>\r\n\r\n<script>\r\n(function () {\r\n  var root = document.getElementById('pfaff-zeitstrahl');\r\n  if (!root || root.getAttribute('data-ready')) return;\r\n  root.setAttribute('data-ready', '1');\r\n\r\n  \/* ============ HIER INHALTE \u00c4NDERN ============\r\n     jahr:      Jahreszahl\r\n     text:      Beschreibung (neuer Absatz = Leerzeile, also \\n\\n)\r\n     bild:      Bild-URL aus der WordPress-Mediathek (leer = wei\u00dfe Fl\u00e4che, es sieht aus als g\u00e4be es kein Bild)\r\n     alt:       Bildbeschreibung f\u00fcr Screenreader *\/\r\n  var EINTRAEGE = [\r\n    { jahr: '1957', text: 'Stefan Pfaff er\u00f6ffnet in Sch\u00fcttentobel bei Ebratshofen eine Kfz-Werkstatt und repariert Fahrzeuge aller Art.',\r\n      bild: 'https:\/\/pfaffinnovation.com\/wp-content\/uploads\/2026\/10\/pfaff-history-1957-schuettentobel.jpg', alt: 'Menschen vor einem alten Haus' },\r\n    { jahr: '1959', text: 'Die Lohnfertigung von Drehteilen erweitert das Gesch\u00e4ft \u2013 und bringt den ersten Kontakt zum Werkzeug- und Formenbau f\u00fcr die gummiverarbeitende Industrie.',\r\n      bild: 'https:\/\/pfaffinnovation.com\/wp-content\/uploads\/2026\/10\/pfaff-history-1959-lathe.jpg', alt: 'Alte Drehmaschine' },\r\n    { jahr: '1968', text: 'Das Unternehmen zieht nach R\u00f6thenbach-Oberh\u00e4user, wo bis heute unser Hauptsitz ist.',\r\n      bild: 'https:\/\/pfaffinnovation.com\/wp-content\/uploads\/2026\/10\/Bau-in-Roethenbach-1.jpg', alt: 'Bau des Werks in R\u00f6thenbach' },\r\n    { jahr: '1970', text: 'PFAFF baut Vulkanisationswerkzeuge f\u00fcr das Dach des M\u00fcnchner Olympiastadions.',\r\n      bild: 'https:\/\/pfaffinnovation.com\/wp-content\/uploads\/2026\/10\/Historisches-Olympiastadion-mit-Zeltdach.png', alt: 'Bau des Olympiastadions in M\u00fcnchen' },\r\n    { jahr: '1972', text: 'Voller Fokus auf den Werkzeugbau. PFAFF gibt die Reparatur von Autos und Landmaschinen auf und konzentriert sich auf komplexe Werkzeuge f\u00fcr die gummiverarbeitende Industrie \u2013 und bildet von Anfang an eigene Fachkr\u00e4fte aus.',\r\n      bild: 'https:\/\/pfaffinnovation.com\/wp-content\/uploads\/2026\/10\/Werkstatt-alt-scaled.jpg', alt: 'Alte Werkstatt' },\r\n    { jahr: '1978', text: 'F\u00fcr das Erodieren und Fr\u00e4sen kommen erstmals computergesteuerte Maschinen zum Einsatz.',\r\n      bild: 'https:\/\/pfaffinnovation.com\/wp-content\/uploads\/2026\/09\/Werkstatt-alt3-scaled-e1790845027399.jpg', alt: 'Alte Werkstatt' },\r\n    { jahr: '1981', text: 'PFAFF fertigt seine ersten Werkzeuge f\u00fcr die Scheibenumspritzung \u2013 der Beginn von mehr als vier Jahrzehnten Erfahrung rund um die Verglasung.',\r\n      bild: 'https:\/\/pfaffinnovation.com\/wp-content\/uploads\/2026\/10\/Erste-Glasumspritzungen.png', alt: 'Alte Glasumspritzform' },\r\n    { jahr: '1986', text: 'Aus dem Betrieb wird die Stefan Pfaff Werkzeug- und Formenbau GmbH & Co. KG. Stefan Pfaffs Sohn Armin steigt als gesch\u00e4ftsf\u00fchrender Gesellschafter ein, und PFAFF wird zum Systemlieferanten \u2013 von der Produktentwicklung und Konstruktion bis zur Bemusterung und zum Service \u2013 mit Dichtungssystemen f\u00fcr die Automobilindustrie als Kerngesch\u00e4ft.',\r\n      bild: 'https:\/\/pfaffinnovation.com\/wp-content\/uploads\/2026\/10\/Armin_und_Stefan.bmp', alt: 'Portr\u00e4t von Armin Pfaff und Stefan Pfaff' },\r\n    { jahr: '1996', text: 'PFAFF er\u00f6ffnet einen Servicestandort in Charlotte, North Carolina. Zwei Jahre sp\u00e4ter wird daraus ein eigenst\u00e4ndiges Unternehmen: PFAFF Molds L.P.',\r\n      bild: 'https:\/\/pfaffinnovation.com\/wp-content\/uploads\/2026\/09\/USA-scaled.png', alt: 'Das Firmengeb\u00e4ude in Charlotte' },\r\n    { jahr: '2003', text: 'Armin Pfaff wird alleiniger Inhaber und Gesch\u00e4ftsf\u00fchrer und f\u00fchrt das Familienunternehmen in der zweiten Generation.',\r\n      bild: 'https:\/\/pfaffinnovation.com\/wp-content\/uploads\/2026\/10\/Armin_und_Stefan.bmp', alt: 'Portr\u00e4t von Armin Pfaff und Stefan Pfaff' },\r\n    { jahr: '2008', text: 'Mit der Integration der SPT Sealing Projects & Tooling GmbH, heute PFAFF Notching Solutions GmbH, erweitert PFAFF sein Portfolio um Notching-Systeme und Oberfl\u00e4chentechnik.',\r\n      bild: 'https:\/\/pfaffinnovation.com\/wp-content\/uploads\/2026\/10\/IMG_9381-scaled.jpg', alt: 'Der Standort Erkelenz' },\r\n    { jahr: '2015', text: 'In Kunshan, China, wird PFAFF Molds gegr\u00fcndet \u2013 so sind wir n\u00e4her an unseren Kunden in Asien.',\r\n      bild: 'https:\/\/pfaffinnovation.com\/wp-content\/uploads\/2026\/09\/DSC_0037-scaled.jpg', alt: 'Das Firmengeb\u00e4ude in Kunshan' },\r\n    { jahr: '2020', text: 'Moritz Hummel, seit 2019 Gesch\u00e4ftsf\u00fchrer, \u00fcbernimmt das Familienunternehmen als Inhaber.',\r\n      bild: 'https:\/\/pfaffinnovation.com\/wp-content\/uploads\/2026\/10\/Uebergabe-an-Moritz-scaled.png', alt: 'Das F\u00fchrungsteam vor dem PFAFF-Geb\u00e4ude' },\r\n    { jahr: '2023', text: 'In Dornbirn, \u00d6sterreich, wird die PFAFF Automation GmbH gegr\u00fcndet. Sie \u00fcbernimmt von z-automation das Gesch\u00e4ft mit Beschnitt- und Transfersystemen f\u00fcr Automobildichtungen.',\r\n      bild: 'https:\/\/pfaffinnovation.com\/wp-content\/uploads\/2026\/10\/pfaff-innovation-dornbirn.jpg', alt: 'Gruppenfoto vor dem PFAFF-Geb\u00e4ude' },\r\n    { jahr: '2026', text: 'Wir machen KI zu einem zentralen Bestandteil unserer Arbeitsweise \u2013 von der Konstruktion und Entwicklung \u00fcber die Produktion bis hin zum Service. Unsere Teams nutzen k\u00fcnstliche Intelligenz, um schneller zu entwickeln, fundiertere Entscheidungen zu treffen und sich kontinuierlich weiterzuentwickeln. Dabei setzen wir auf Technologien, die den Menschen unterst\u00fctzen und seine F\u00e4higkeiten erweitern, anstatt ihn zu ersetzen.\\n\\nF\u00fcr uns ist KI kein zeitlich begrenztes Projekt, sondern das n\u00e4chste Kapitel in der Entwicklung von PFAFF. Und wir stehen erst am Anfang \u2013 f\u00fcr unsere Kunden und gemeinsam mit ihnen.',\r\n      bild: '', alt: '' }\r\n  ];\r\n  \/* ============ ENDE INHALTE ============ *\/\r\n\r\n  var interval = parseInt(root.getAttribute('data-interval'), 10) || 6000;\r\n  var pauseMs = parseInt(root.getAttribute('data-pause'), 10);\r\n  if (isNaN(pauseMs)) pauseMs = 120000;\r\n  root.style.setProperty('--pz-dur', interval + 'ms');\r\n\r\n  \/* Scroll-Modus *\/\r\n  var scrollWanted = root.getAttribute('data-scroll') !== 'off';\r\n  var scrollMode = scrollWanted;\r\n  var stickyBroken = false;\r\n  var pinMode = 'sticky';   \/* 'sticky' = CSS, 'fixed' = per Script festgehalten *\/\r\n  var END_FRAC = 0.9;   \/* das letzte Jahr ist nach 90 % der Scrollstrecke erreicht, der Rest ist Ausstieg *\/\r\n  var step = parseInt(root.getAttribute('data-step'), 10) || 200;\r\n  \/* Abstand oben: topOffset = gr\u00f6\u00dfte H\u00f6he der Kopfzeile (f\u00fcr Berechnungen), curTop = aktuelle H\u00f6he (f\u00fcr die Position) *\/\r\n  var topAttr = (root.getAttribute('data-top') || 'auto').trim();\r\n  var autoTop = topAttr === 'auto' || isNaN(parseInt(topAttr, 10));\r\n  var topOffset = autoTop ? 0 : parseInt(topAttr, 10);\r\n  var curTop = topOffset;\r\n  \/* Mindestabstand oben, damit der Bereich nicht direkt am Bildschirmrand klebt (wenn der Header weg ist) *\/\r\n  var gap = parseInt(root.getAttribute('data-gap'), 10);\r\n  if (isNaN(gap)) gap = 48;\r\n  function effTop() { return Math.max(curTop, gap); }\r\n  root.style.setProperty('--pz-top', effTop() + 'px');\r\n\r\n  \/* Feste Kopfzeile(n) oben auf der Seite finden und messen, wie weit sie nach unten reichen.\r\n     Erkennt auch mehrere \u00fcbereinanderliegende Leisten (z. B. WordPress-Adminleiste + Header). *\/\r\n  function measureHeader() {\r\n    var vw = window.innerWidth, vh = window.innerHeight, bottom = 0, guard = 0;\r\n    var xs = [Math.round(vw * 0.08), Math.round(vw * 0.5), Math.round(vw * 0.92)];\r\n    var found = true;\r\n    while (found && guard++ < 4) {\r\n      found = false;\r\n      for (var j = 0; j < xs.length; j++) {\r\n        var stack = document.elementsFromPoint ? document.elementsFromPoint(xs[j], bottom + 2) : [document.elementFromPoint(xs[j], bottom + 2)];\r\n        for (var q = 0; q < stack.length; q++) {\r\n          var el = stack[q];\r\n          if (!el || root.contains(el) || el === document.body || el === document.documentElement) continue;\r\n          for (var a = el; a && a !== document.body && a !== document.documentElement; a = a.parentElement) {\r\n            if (root.contains(a)) break;\r\n            var pos = window.getComputedStyle(a).position;\r\n            if (pos === 'fixed' || pos === 'sticky') {\r\n              var r = a.getBoundingClientRect();\r\n              if (r.height > 0 && r.height < vh * 0.5 && r.top <= bottom + 2 && r.bottom > bottom + 1) {\r\n                bottom = Math.round(r.bottom); found = true;\r\n              }\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    return Math.max(0, bottom);\r\n  }\r\n  function updateTop() {\r\n    if (!autoTop) return;\r\n    var b = measureHeader();\r\n    if (b > topOffset) topOffset = b;\r\n    if (b !== curTop) { curTop = b; root.style.setProperty('--pz-top', effTop() + 'px'); placeStick(); }\r\n  }\r\n  \/* Kopfzeilen fahren oft animiert ein und aus: nach dem Scrollen noch kurz weiter nachmessen *\/\r\n  var trackUntil = 0, tracking = false;\r\n  function trackHeader() {\r\n    if (!autoTop) return;\r\n    trackUntil = Date.now() + 700;\r\n    if (tracking) return;\r\n    tracking = true;\r\n    (function loop() {\r\n      updateTop();\r\n      if (Date.now() < trackUntil) window.requestAnimationFrame(loop); else tracking = false;\r\n    })();\r\n  }\r\n  var runway = root.querySelector('.pz-runway'), stick = root.querySelector('.pz-stick');\r\n  if (scrollMode) root.classList.add('is-scroll');\r\n\r\n  \/* Lange Texte bleiben l\u00e4nger stehen: ab 140 Zeichen kommen 30 ms pro Zeichen dazu *\/\r\n  function durationFor(e) { return interval + Math.max(0, String(e.text || '').length - 140) * 30; }\r\n\r\n  var list = root.querySelector('.pz-list');\r\n  var panel = root.querySelector('.pz-panel');\r\n  var imgEl = root.querySelector('.pz-img');\r\n  var figEl = root.querySelector('.pz-photo');\r\n  var bigEl = root.querySelector('.pz-big');\r\n  var textEl = root.querySelector('.pz-text');\r\n  var reduced = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n  var holdScrollUntil = 0;\r\n\r\n  \/* Smartphone-Ansicht (Zeitstrahl waagerecht) *\/\r\n  function isH() { return window.matchMedia && window.matchMedia('(max-width: 760px)').matches; }\r\n\r\n  \/* Ohne Bild: leere wei\u00dfe Fl\u00e4che in gleicher Gr\u00f6\u00dfe (die Seite springt nicht) *\/\r\n  function placeholder() {\r\n    return 'data:image\/svg+xml;charset=utf-8,' + encodeURIComponent('<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 1200 750\"><\/svg>');\r\n  }\r\n\r\n  \/* Linien: Grundlinie, durchlaufener Teil, laufender Abschnitt, Fortsetzung nach dem letzten Eintrag *\/\r\n  var rail = document.createElement('div'); rail.className = 'pz-rail';\r\n  var railFill = document.createElement('div'); railFill.className = 'pz-rail-fill';\r\n  var run = document.createElement('div'); run.className = 'pz-run';\r\n  var more = document.createElement('div'); more.className = 'pz-more'; more.setAttribute('aria-hidden', 'true');\r\n  var k, part;\r\n  for (k = 0; k < 4; k++) { part = document.createElement('span'); part.className = 'pz-mdot'; part.style.setProperty('--i', k); more.appendChild(part); }\r\n  part = document.createElement('span'); part.className = 'pz-marrow'; part.style.setProperty('--i', 4); more.appendChild(part);\r\n  list.appendChild(rail); list.appendChild(railFill); list.appendChild(more); list.appendChild(run);\r\n\r\n  var MORE_GAP = 30;\r\n\r\n  var lis = [], btns = [];\r\n  var GAP_V = 36, GAP_H = 26;   \/* gleicher Abstand zwischen allen Jahren (Bildschirm \/ Handy) *\/\r\n  EINTRAEGE.forEach(function (e, i) {\r\n    var li = document.createElement('li');\r\n    li.className = 'pz-item';\r\n    var b = document.createElement('button');\r\n    b.type = 'button';\r\n    b.className = 'pz-btn';\r\n    b.setAttribute('aria-controls', 'pz-panel');\r\n    b.setAttribute('aria-expanded', 'false');\r\n    b.textContent = e.jahr;\r\n    b.addEventListener('click', function () { userClick(i); });\r\n    li.appendChild(b);\r\n    list.appendChild(li);\r\n    lis.push(li); btns.push(b);\r\n  });\r\n\r\n  \/* Abst\u00e4nde zwischen den Jahren: \u00fcberall gleich gro\u00df *\/\r\n  function applyGaps() {\r\n    var h = isH();\r\n    lis.forEach(function (li, i) {\r\n      if (i > 0) {\r\n        var g = (h ? GAP_H : GAP_V) + 'px';\r\n        li.style.marginTop = h ? '' : g;\r\n        li.style.marginLeft = h ? g : '';\r\n      }\r\n    });\r\n  }\r\n\r\n  function center(i) {\r\n    return isH() ? lis[i].offsetLeft + btns[i].offsetWidth \/ 2 : lis[i].offsetTop + btns[i].offsetHeight \/ 2;\r\n  }\r\n\r\n  \/* Linienabschnitt setzen: senkrecht (top\/height) oder waagerecht (left\/width) *\/\r\n  function setSpan(el, start, len) {\r\n    if (isH()) { el.style.left = start + 'px'; el.style.width = len + 'px'; el.style.top = ''; el.style.height = ''; }\r\n    else { el.style.top = start + 'px'; el.style.height = len + 'px'; el.style.left = ''; el.style.width = ''; }\r\n  }\r\n\r\n  \/* Den aktiven Punkt in die Mitte des Zeitstrahls scrollen (nur der Streifen, nicht die Seite) *\/\r\n  function centerActive(force) {\r\n    if (idx < 0 || !list.scrollTo) return;\r\n    if (!force && !scrollMode && Date.now() < holdScrollUntil) return;\r\n    var behavior = (reduced || force === 'instant') ? 'auto' : 'smooth';\r\n    if (isH()) {\r\n      list.scrollTo({ left: Math.max(0, center(idx) - list.clientWidth \/ 2), behavior: behavior });\r\n    } else if (list.scrollHeight > list.clientHeight + 1) {\r\n      list.scrollTo({ top: Math.max(0, center(idx) - list.clientHeight \/ 2), behavior: behavior });\r\n    }\r\n  }\r\n  \/* Wischen im Zeitstrahl (Smartphone) oder Scrollen mit Mausrad, Trackpad oder Scrollbalken z\u00e4hlt wie ein Klick:\r\n     der automatische Durchlauf pausiert, der Streifen springt nicht zur\u00fcck. *\/\r\n  var touching = false, touchEndAt = 0;\r\n  function userMoved() { if (scrollMode) return; holdScrollUntil = Date.now() + pauseMs; holdAutoplay(); }\r\n  list.addEventListener('touchstart', function () { touching = true; }, { passive: true });\r\n  list.addEventListener('touchend', function () { touching = false; touchEndAt = Date.now(); }, { passive: true });\r\n  list.addEventListener('touchcancel', function () { touching = false; touchEndAt = Date.now(); }, { passive: true });\r\n  list.addEventListener('pointerdown', function (e) { if (e.target === list) touching = true; });\r\n  document.addEventListener('pointerup', function () { if (touching) { touching = false; touchEndAt = Date.now(); } });\r\n  list.addEventListener('wheel', userMoved, { passive: true });\r\n  list.addEventListener('scroll', function () {\r\n    if (touching || Date.now() - touchEndAt < 1500) userMoved();\r\n  }, { passive: true });\r\n\r\n  function fillPanel(e, textOnly) {\r\n    if (!textOnly) {\r\n      imgEl.onerror = function () { imgEl.onerror = null; imgEl.classList.add('is-empty'); imgEl.src = placeholder(); };\r\n      imgEl.classList.toggle('is-empty', !e.bild);\r\n      \/* Ohne Bild: Bildfl\u00e4che ausblenden, damit l\u00e4ngere Texte (z. B. 2026) den Platz nutzen k\u00f6nnen *\/\r\n      figEl.style.display = e.bild ? '' : 'none';\r\n      imgEl.src = e.bild || placeholder();\r\n      imgEl.alt = e.bild ? (e.alt || '') : '';\r\n    }\r\n    bigEl.textContent = e.jahr;\r\n    textEl.textContent = '';\r\n    String(e.text || '').split(\/\\n\\s*\\n\/).forEach(function (part) {\r\n      var p = document.createElement('p');\r\n      p.textContent = part.trim();\r\n      textEl.appendChild(p);\r\n    });\r\n  }\r\n\r\n  \/* Foto im Originalformat einpassen: so gro\u00df wie m\u00f6glich innerhalb der Bildfl\u00e4che, ohne Beschnitt.\r\n     Querformat f\u00fcllt die Breite, Hochformat die H\u00f6he. Die Bildfl\u00e4che selbst bleibt immer gleich hoch. *\/\r\n  var imgBoxH = 0;   \/* H\u00f6he der Bildfl\u00e4che (setzt equalize) *\/\r\n  function fitImage() {\r\n    var boxW = figEl.clientWidth;\r\n    if (!boxW) return;\r\n    var boxH = imgBoxH || Math.round(boxW * 10 \/ 16);\r\n    figEl.style.height = boxH + 'px';\r\n    var nw = imgEl.naturalWidth, nh = imgEl.naturalHeight, w = boxW, hh = boxH;\r\n    if (!imgEl.classList.contains('is-empty') && nw > 0 && nh > 0) {\r\n      \/* Der wei\u00dfe Rand liegt um das Foto herum: Platz daf\u00fcr abziehen, damit das Foto nicht verzerrt wird *\/\r\n      var f = 2 * (parseFloat(window.getComputedStyle(imgEl).paddingLeft) || 0);\r\n      var s = Math.min((boxW - f) \/ nw, (boxH - f) \/ nh);\r\n      w = Math.round(nw * s + f); hh = Math.round(nh * s + f);\r\n    }\r\n    imgEl.style.aspectRatio = 'auto';\r\n    imgEl.style.width = w + 'px';\r\n    imgEl.style.height = hh + 'px';\r\n  }\r\n  imgEl.addEventListener('load', fitImage);\r\n\r\n  var idx = -1, swapTimer = null;\r\n\r\n  function layoutLines(restart) {\r\n    var n = lis.length;\r\n    if (!n) return;\r\n    var h = isH();\r\n    var first = center(0);\r\n    setSpan(rail, first, center(n - 1) - first);\r\n    setSpan(railFill, first, idx < 0 ? 0 : center(idx) - first);\r\n    \/* Fortsetzung nach dem letzten Eintrag *\/\r\n    if (h) { more.style.left = (center(n - 1) + MORE_GAP) + 'px'; more.style.top = ''; }\r\n    else { more.style.top = (center(n - 1) + MORE_GAP) + 'px'; more.style.left = ''; }\r\n    \/* Beim letzten Eintrag l\u00e4uft keine Linie, stattdessen werden die Punkte der Fortsetzung nacheinander gr\u00fcn *\/\r\n    setSpan(run, idx < 0 ? first : center(idx), (idx < 0 || idx >= n - 1) ? 0 : center(idx + 1) - center(idx));\r\n    if (restart) {\r\n      run.style.animation = 'none';\r\n      more.classList.remove('is-run');\r\n      void run.offsetWidth;\r\n      run.style.animation = '';\r\n    }\r\n    if (idx >= n - 1) { more.classList.add('is-run'); } else { more.classList.remove('is-run'); }\r\n  }\r\n\r\n  function select(i, instant) {\r\n    if (i === idx) return;\r\n    idx = i;\r\n    root.style.setProperty('--pz-dur', durationFor(EINTRAEGE[i]) + 'ms');\r\n    lis.forEach(function (li, n) {\r\n      li.classList.toggle('is-active', n === i);\r\n      li.classList.toggle('is-past', n < i);\r\n      btns[n].setAttribute('aria-expanded', n === i ? 'true' : 'false');\r\n    });\r\n    layoutLines(true);\r\n    centerActive(instant ? 'instant' : false);\r\n    clearTimeout(swapTimer);\r\n    if (instant || reduced) {\r\n      fillPanel(EINTRAEGE[i]);\r\n    } else {\r\n      panel.classList.add('is-swap');\r\n      swapTimer = setTimeout(function () {\r\n        fillPanel(EINTRAEGE[idx]);\r\n        panel.classList.remove('is-swap');\r\n      }, 190);\r\n    }\r\n  }\r\n\r\n  function next() { select((idx + 1) % EINTRAEGE.length); }\r\n\r\n  \/* Weiter, sobald die Linie bis zum n\u00e4chsten Punkt gewachsen ist *\/\r\n  list.addEventListener('animationend', function (e) {\r\n    if (scrollMode) return;   \/* im Scroll-Modus wechselt das Jahr nur durch Scrollen oder Klicken *\/\r\n    if (e.animationName === 'pzrun' || e.animationName === 'pzrunx') next();\r\n  });\r\n\r\n  \/* Pausenlogik: Klick auf einen Punkt pausiert den Durchlauf, nach pauseMs ohne weiteren Klick l\u00e4uft er von selbst weiter.\r\n     Au\u00dferdem steht er still, solange der Bereich nicht sichtbar ist oder der Tab im Hintergrund liegt.\r\n     Wer reduzierte Bewegung eingestellt hat, bekommt keinen automatischen Durchlauf. *\/\r\n  var clickPaused = false, visible = true, resumeTimer = null;\r\n\r\n  function sync() {\r\n    root.classList.toggle('is-paused', !scrollMode && (reduced || clickPaused || !visible || document.hidden));\r\n  }\r\n\r\n  function holdAutoplay() {\r\n    clickPaused = true;\r\n    clearTimeout(resumeTimer);\r\n    resumeTimer = setTimeout(function () { clickPaused = false; sync(); }, pauseMs);\r\n    sync();\r\n  }\r\n\r\n  function userClick(i) {\r\n    if (scrollMode) {\r\n      \/* Klick auf ein Jahr: Seite an die passende Stelle scrollen, damit Scrollposition und Jahr zusammenpassen *\/\r\n      var pinStart = window.pageYOffset + runway.getBoundingClientRect().top - topOffset;\r\n      ignoreScrollUntil = Date.now() + 1200;\r\n      select(i);\r\n      centerActive(true);\r\n      window.scrollTo(0, Math.round(pinStart + (i \/ (EINTRAEGE.length - 1)) * END_FRAC * scrollRange() + 1));\r\n      setTimeout(function () { ignoreScrollUntil = 0; syncToScroll(); }, 1250);\r\n      return;\r\n    }\r\n    holdAutoplay();\r\n    if (i === idx) layoutLines(true); else select(i);\r\n    centerActive(true);\r\n    sync();\r\n  }\r\n\r\n  document.addEventListener('visibilitychange', sync);\r\n  if ('IntersectionObserver' in window) {\r\n    new IntersectionObserver(function (entries) {\r\n      visible = entries[0].isIntersecting; sync();\r\n    }, { threshold: 0.3 }).observe(root);\r\n  }\r\n\r\n  \/* Detailfeld auf die h\u00f6chste Variante festlegen, damit die Seite nicht springt.\r\n     Im Scroll-Modus wird zus\u00e4tzlich die Bildfl\u00e4che so hoch gemacht, dass der ganze Bereich auf den Bildschirm passt. *\/\r\n  function equalize() {\r\n    applyGaps();\r\n    var keep = idx;\r\n    var h = isH();\r\n    panel.style.minHeight = '';\r\n    list.style.maxHeight = '';\r\n    \/* Zum Messen der Texth\u00f6he die Bildfl\u00e4che kurz auf 0 setzen *\/\r\n    figEl.style.display = '';\r\n    figEl.style.height = '0px';\r\n    imgEl.style.width = '0px';\r\n    imgEl.style.height = '0px';\r\n    \/* Texth\u00f6he getrennt messen: Eintr\u00e4ge mit Bild (max) und ohne Bild (maxNoImg).\r\n       Eintr\u00e4ge ohne Bild haben die Bildfl\u00e4che f\u00fcr ihren Text zur Verf\u00fcgung, damit die Fotos der anderen Jahre nicht kleiner werden. *\/\r\n    var max = 0, maxNoImg = 0;\r\n    EINTRAEGE.forEach(function (e) {\r\n      fillPanel(e, true);\r\n      if (e.bild) max = Math.max(max, panel.offsetHeight); else maxNoImg = Math.max(maxNoImg, panel.offsetHeight);\r\n    });\r\n    var cur = EINTRAEGE[keep < 0 ? 0 : keep];\r\n    fillPanel(cur, true);\r\n    var natural = Math.round(panel.clientWidth * 10 \/ 16);\r\n    var imgH = natural;\r\n    if (scrollMode) {\r\n      var cs = window.getComputedStyle(stick);\r\n      var padV = (parseFloat(cs.paddingTop) || 0) + (parseFloat(cs.paddingBottom) || 0);\r\n      var rowGap = parseFloat(window.getComputedStyle(root.querySelector('.pz-wrap')).rowGap) || 0;\r\n      var avail = window.innerHeight - Math.max(topOffset, gap) - padV;\r\n      var used = max + (h ? list.offsetHeight + rowGap : 0);\r\n      imgH = Math.max(150, Math.min(natural, avail - used));\r\n    }\r\n    imgBoxH = imgH;\r\n    fitImage();\r\n    max = Math.max(max + imgH, maxNoImg);\r\n    figEl.style.display = cur.bild ? '' : 'none';\r\n    panel.style.minHeight = max + 'px';\r\n    list.style.maxHeight = h ? '' : Math.max(scrollMode ? 300 : 480, panel.offsetHeight) + 'px';\r\n    if (scrollMode) runway.style.height = (stick.offsetHeight + (EINTRAEGE.length - 1) * step) + 'px';\r\n    layoutLines(false);\r\n    centerActive('instant');\r\n  }\r\n\r\n  \/* ---------- Scroll-Modus: Scrollen schaltet die Jahre weiter ---------- *\/\r\n  var scrollTicking = false, ignoreScrollUntil = 0, stickyFails = 0;\r\n\r\n  function scrollRange() { return Math.max(1, runway.offsetHeight - stick.offsetHeight); }\r\n  function scrollProgress() {\r\n    return Math.min(1, Math.max(0, (topOffset - runway.getBoundingClientRect().top) \/ scrollRange()));\r\n  }\r\n  function syncToScroll() {\r\n    if (!scrollMode || Date.now() < ignoreScrollUntil) return;\r\n    var n = EINTRAEGE.length, p = scrollProgress();\r\n    \/* Bleibt der Bereich nicht stehen (z. B. wegen des Themes), wird der Scroll-Modus abgeschaltet *\/\r\n    if (p > 0.03 && p < 0.97) {\r\n      var top = stick.getBoundingClientRect().top;\r\n      if (!tracking && Math.abs(top - effTop()) > 8) {\r\n        stickyFails++;\r\n        if (stickyFails >= 2) {\r\n          stickyFails = 0;\r\n          if (pinMode === 'sticky') { pinMode = 'fixed'; root.classList.add('is-fixed'); placeStick(); }\r\n          else { disableScrollMode(); return; }\r\n        }\r\n      } else { stickyFails = 0; }\r\n    }\r\n    var target = Math.round(Math.min(1, p \/ END_FRAC) * (n - 1));\r\n    if (target !== idx) select(target);\r\n  }\r\n  function onScroll() {\r\n    if (!scrollMode) return;\r\n    trackHeader();\r\n    placeStick();\r\n    if (scrollTicking) return;\r\n    scrollTicking = true;\r\n    window.requestAnimationFrame(function () { scrollTicking = false; syncToScroll(); });\r\n  }\r\n  window.addEventListener('scroll', onScroll, { passive: true });\r\n\r\n  \/* Viele Themes setzen overflow:hidden auf Container um den Inhalt. Dadurch klebt nichts fest.\r\n     \"overflow:clip\" schneidet genauso ab, macht den Container aber nicht zum Scroll-Bereich. *\/\r\n  function repairSticky() {\r\n    var html = document.documentElement, body = document.body;\r\n    var hs = window.getComputedStyle(html);\r\n    \/* Ist html selbst \"visible\", \u00fcbernimmt das Browserfenster den overflow-Wert von body: dann body nicht anfassen *\/\r\n    var bodyIsViewport = hs.overflowX === 'visible' && hs.overflowY === 'visible';\r\n    var el = root.parentElement, cs;\r\n    while (el && el.nodeType === 1 && el !== html) {\r\n      if (!(el === body && bodyIsViewport)) {\r\n        cs = window.getComputedStyle(el);\r\n        if (\/hidden|scroll|auto\/.test(cs.overflowX + ' ' + cs.overflowY) && (el === body || el.scrollHeight <= el.clientHeight + 1)) {\r\n          el.style.setProperty('overflow', 'clip', 'important');\r\n        }\r\n      }\r\n      el = el.parentElement;\r\n    }\r\n  }\r\n\r\n  \/* Fixed-Modus: Der Bereich wird per Script festgehalten (wird gebraucht, wenn \"sticky\" nicht funktioniert) *\/\r\n  function placeStick() {\r\n    if (!scrollMode || pinMode !== 'fixed') return;\r\n    var r = runway.getBoundingClientRect(), sh = stick.offsetHeight, st = stick.style;\r\n    var t = effTop();\r\n    if (r.top > t) {\r\n      st.position = ''; st.top = ''; st.left = ''; st.width = ''; st.bottom = '';\r\n    } else if (r.bottom - sh >= t) {\r\n      st.position = 'fixed'; st.top = t + 'px'; st.bottom = 'auto'; st.left = r.left + 'px'; st.width = r.width + 'px';\r\n    } else {\r\n      st.position = 'absolute'; st.top = 'auto'; st.bottom = '0'; st.left = '0'; st.width = '100%';\r\n    }\r\n  }\r\n  function resetStick() {\r\n    var st = stick.style;\r\n    st.position = ''; st.top = ''; st.left = ''; st.width = ''; st.bottom = '';\r\n  }\r\n\r\n  \/* Scroll-Modus ein- oder ausschalten *\/\r\n  function setMode(on) {\r\n    scrollMode = on;\r\n    root.classList.toggle('is-scroll', on);\r\n    if (!on) { runway.style.height = ''; root.classList.remove('is-fixed'); resetStick(); }\r\n  }\r\n\r\n  function disableScrollMode() {\r\n    stickyBroken = true;\r\n    setMode(false);\r\n    equalize();\r\n    layoutLines(true);\r\n    sync();\r\n  }\r\n\r\n  \/* Passt der Bereich auf den Bildschirm, und ragt er nicht aus seinem Container heraus? Sonst k\u00e4me man nicht mehr an die Seite darunter. *\/\r\n  function modeFits() {\r\n    if (stick.offsetHeight > window.innerHeight - Math.max(topOffset, gap) + 4) return false;\r\n    var par = root.parentElement;\r\n    if (par && root.getBoundingClientRect().bottom - par.getBoundingClientRect().bottom > 40) return false;\r\n    return true;\r\n  }\r\n\r\n  function afterLayout() {\r\n    updateTop();\r\n    if (scrollWanted && !stickyBroken && !scrollMode) setMode(true);\r\n    equalize();\r\n    placeStick();\r\n    if (scrollMode && !modeFits()) { setMode(false); equalize(); layoutLines(true); sync(); return; }\r\n    syncToScroll();\r\n  }\r\n\r\n  \/* Auf dem Handy \u00e4ndert sich beim Scrollen die Fensterh\u00f6he (Adressleiste): nur bei echten \u00c4nderungen neu rechnen *\/\r\n  var resizeTimer, lastW = window.innerWidth, lastH = window.innerHeight;\r\n  window.addEventListener('resize', function () {\r\n    if (window.innerWidth === lastW && Math.abs(window.innerHeight - lastH) < 150) return;\r\n    lastW = window.innerWidth; lastH = window.innerHeight;\r\n    clearTimeout(resizeTimer);\r\n    resizeTimer = setTimeout(afterLayout, 150);\r\n  });\r\n  window.addEventListener('load', afterLayout);\r\n  if (document.fonts && document.fonts.ready) document.fonts.ready.then(afterLayout);\r\n\r\n  applyGaps();\r\n  if (scrollMode) repairSticky();\r\n  select(0, true);\r\n  afterLayout();\r\n  sync();\r\n})();\r\n<\/script>\r\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7b21515 elementor-widget elementor-widget-spacer\" data-id=\"7b21515\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-34851c2b e-con-full e-flex e-con e-parent\" data-id=\"34851c2b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-3026147f e-con-full e-flex e-con e-child\" data-id=\"3026147f\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-4eaddc92 pfaff-hero-text-container e-flex e-con-boxed e-con e-child\" data-id=\"4eaddc92\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;position&quot;:&quot;absolute&quot;,&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5cc85411 animated-slow elementor-invisible elementor-widget elementor-widget-heading\" data-id=\"5cc85411\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;}\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Unsere Geschichte geht weiter.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7f263940 elementor-widget elementor-widget-spacer\" data-id=\"7f263940\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-43042113 animated-slow elementor-widget__width-initial elementor-invisible elementor-widget elementor-widget-text-editor\" data-id=\"43042113\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h5>Seit unseren Anf\u00e4ngen hat sich viel ver\u00e4ndert. Entdecken Sie, was gleich geblieben ist und was PFAFF heute ausmacht. <\/h5>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5505d73f elementor-widget elementor-widget-spacer\" data-id=\"5505d73f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4c2f4804 elementor-widget elementor-widget-spacer\" data-id=\"4c2f4804\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b7faea1 animated-slow elementor-invisible elementor-widget elementor-widget-button\" data-id=\"b7faea1\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;}\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/pfaffinnovation.com\/de\/ueber-uns\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">\u00dcber uns<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Die Historie SCROLLEN Historie Von einer kleinen Kfz-Reparatur\u00adwerkstatt zum Weltmarktf\u00fchrer. Was als kleine Kfz-Reparaturwerkstatt begann, hat sich zu einem Weltmarktf\u00fchrer f\u00fcr Werkzeugbaul\u00f6sungen in der Automobil-Dichtungsindustrie entwickelt. Unsere Geschichte geht weiter. Seit unseren Anf\u00e4ngen hat sich viel ver\u00e4ndert. Entdecken Sie, was gleich geblieben ist und was PFAFF heute ausmacht. \u00dcber uns<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":4666,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-4639","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/pfaffinnovation.com\/de\/wp-json\/wp\/v2\/pages\/4639","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pfaffinnovation.com\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/pfaffinnovation.com\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/pfaffinnovation.com\/de\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/pfaffinnovation.com\/de\/wp-json\/wp\/v2\/comments?post=4639"}],"version-history":[{"count":10,"href":"https:\/\/pfaffinnovation.com\/de\/wp-json\/wp\/v2\/pages\/4639\/revisions"}],"predecessor-version":[{"id":5769,"href":"https:\/\/pfaffinnovation.com\/de\/wp-json\/wp\/v2\/pages\/4639\/revisions\/5769"}],"up":[{"embeddable":true,"href":"https:\/\/pfaffinnovation.com\/de\/wp-json\/wp\/v2\/pages\/4666"}],"wp:attachment":[{"href":"https:\/\/pfaffinnovation.com\/de\/wp-json\/wp\/v2\/media?parent=4639"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}