{"id":5819,"date":"2026-06-22T17:41:02","date_gmt":"2026-06-22T15:41:02","guid":{"rendered":"https:\/\/mvfaehrtgut.de\/?page_id=5819"},"modified":"2026-07-21T13:39:18","modified_gmt":"2026-07-21T11:39:18","slug":"rufbus","status":"publish","type":"page","link":"https:\/\/mvfaehrtgut.de\/en\/mobilitaetsoffensive\/rufbus\/","title":{"rendered":"Dial-a-bus"},"content":{"rendered":"\n<div class=\"wp-block-media-text alignfull has-media-on-the-right is-stacked-on-mobile is-vertically-aligned-center is-style-vmv-bogen-links\" style=\"grid-template-columns:auto 60%\"><div class=\"wp-block-media-text__content\">\n<div class=\"wp-block-group is-vertical is-content-justification-left is-layout-flex wp-container-core-group-is-layout-ada4c367 wp-block-group-is-layout-flex\" style=\"padding-top:var(--wp--preset--spacing--60);padding-right:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--0)\">\n<figure class=\"wp-block-image size-full is-resized\" style=\"margin-right:var(--wp--preset--spacing--60);margin-left:var(--wp--preset--spacing--60)\"><img decoding=\"async\" src=\"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/icon-rufbus-56.svg\" alt=\"\" class=\"wp-image-5860\" style=\"width:59px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\" style=\"margin-right:var(--wp--preset--spacing--60);margin-left:var(--wp--preset--spacing--60);font-style:normal;font-weight:600;line-height:1.2;text-transform:none\">Kommt wie gerufen \u2013<br>Der Rufbus MV<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\" style=\"margin-right:var(--wp--preset--spacing--60);margin-left:var(--wp--preset--spacing--60)\">Ihr flexibler Partner f\u00fcr Mobilit\u00e4t auf Abruf. Ob in der Stadt oder auf dem Land, wir bringen Sie sicher und bequem ans Ziel \u2013 genau dann, wenn Sie uns brauchen.<\/p>\n<\/div>\n<\/div><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"1100\" height=\"550\" src=\"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2025\/12\/Hero-Mobilitaetsoffensive-Rufbus-1100x550.jpg\" alt=\"\" class=\"wp-image-5034 size-full\" srcset=\"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2025\/12\/Hero-Mobilitaetsoffensive-Rufbus-1100x550.jpg 1100w, https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2025\/12\/Hero-Mobilitaetsoffensive-Rufbus-600x300.jpg 600w, https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2025\/12\/Hero-Mobilitaetsoffensive-Rufbus-768x384.jpg 768w, https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2025\/12\/Hero-Mobilitaetsoffensive-Rufbus-1536x768.jpg 1536w, https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2025\/12\/Hero-Mobilitaetsoffensive-Rufbus-2048x1024.jpg 2048w, https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2025\/12\/Hero-Mobilitaetsoffensive-Rufbus-18x9.jpg 18w\" sizes=\"auto, (max-width: 1100px) 100vw, 1100px\" \/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-group alignfull has-tertiary-background-color has-background has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--80);padding-bottom:var(--wp--preset--spacing--80)\">\n<h2 class=\"wp-block-heading has-text-align-center has-primary-color has-text-color has-link-color has-large-font-size wp-elements-7809381cb19d70ecaab4265029050666\" style=\"text-transform:none\">Individuelle Mobilit\u00e4t f\u00fcr jeden Bedarf<\/h2>\n\n\n\n<p class=\"has-text-align-center has-primary-color has-text-color has-link-color has-medium-font-size wp-elements-be5462545e88641f67104ce6776a06a3 wp-block-paragraph\">Der Rufbus MV erg\u00e4nzt den bestehenden \u00f6ffentlichen Personennahverkehr in Mecklenburg-Vorpommern und erm\u00f6glicht eine bequeme und zuverl\u00e4ssige Bef\u00f6rderung auf der \u201eletzten Meile\u201c. <\/p>\n\n\n\n<p class=\"has-text-align-center has-primary-color has-text-color has-link-color has-medium-font-size wp-elements-9a5af5a839a2c4776417e742832b280e wp-block-paragraph\">In fast allen Teilen des Landes stehen flexible Bef\u00f6rderungsoptionen zur Verf\u00fcgung, und in Regionen ohne Rufbus-Angebot wird dieser schrittweise eingef\u00fchrt. Wir informieren Sie laufend \u00fcber die aktuellen Entwicklungen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-align-center has-primary-color has-text-color has-link-color has-medium-font-size wp-elements-efab4bbf1cc118b682f555ea7e3f3771\">Planen Sie jetzt Ihre Fahrt \u2013 Anruf gen\u00fcgt!<\/h3>\n\n\n\n<div class=\"wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-88c01e81 wp-block-group-is-layout-flex\">\n<p class=\"has-primary-color has-text-color has-link-color has-medium-font-size wp-elements-d293e684a28f31e7f00ef5d9d14fc0f8 wp-block-paragraph\" style=\"font-style:normal;font-weight:600\">Fahrt buchen:<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"tel:+4938555573340\">0385 55573340<\/a><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<figure class=\"wp-block-image size-full\" style=\"margin-top:var(--wp--preset--spacing--70);margin-bottom:var(--wp--preset--spacing--70)\"><img decoding=\"async\" src=\"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/rufbus-kommt-wie-gerufen.svg\" alt=\"\" class=\"wp-image-5876\"\/><\/figure>\n\n\n\n<style>\n  .logo-grid {\n    display: flex;\n    width: 100%;\n    flex-direction: column;\n    align-items: center;\n    gap: 50px;\n  }\n  \n  .logo-row {\n    display: flex;\n    width: 100%;\n    justify-content: center;\n    flex-wrap: wrap;\n    gap: 50px;\n  }\n  \n  .logo-item {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }\n  \n  .logo-item img {\n    max-height: 50px;\n    width: auto;\n    display: block;\n  }\n  \n  \/* Mobile *\/\n  @media (max-width: 799px) {\n    .logo-row {\n      display: grid;\n      justify-content: center;\n      gap: 50px;\n      width: 100%;\n    }\n\n    .logo-row:first-child {\n      grid-template-columns: repeat(2, max-content);\n    }\n\n    .logo-row:last-child {\n      grid-template-columns: repeat(2, max-content);\n    }\n  \n    .logo-grid {\n      gap: 50px;\n    }\n  }\n\n  @media (max-width: 466px) {\n    .logo-row {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      gap: 50px;\n    }\n\n    .logo-grid {\n      gap: 50px;\n    }\n  }\n  <\/style>\n  \n  <div class=\"logo-grid\">\n  \n    <div class=\"logo-row\">\n      <a class=\"logo-item\" href=\"https:\/\/mvvg-bus.de\/mvvg-ilse-rufbus\/\" target=\"_blank\">\n        <img decoding=\"async\" src=\"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/logo-mvvg.svg\" alt=\"MVVG\">\n      <\/a>\n  \n      <a class=\"logo-item\" href=\"https:\/\/www.nahbus.de\/rufbus\" target=\"_blank\" rel=\"noopener noreferrer\">\n        <img decoding=\"async\" src=\"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/logo-nahbus.svg\" alt=\"Nahbus\">\n      <\/a>\n  \n      <a class=\"logo-item\" href=\"https:\/\/www.vlp-lup.de\/rufbus\/rufbus-bestellen\/\" target=\"_blank\">\n        <img decoding=\"async\" src=\"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/logo-vlp.svg\" alt=\"VLP\">\n      <\/a>\n  \n      <a class=\"logo-item\" href=\"https:\/\/vvr-bus.de\/rufbus\/\" target=\"_blank\" rel=\"noopener noreferrer\">\n        <img decoding=\"async\" src=\"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/07\/vvr-logo.svg\" alt=\"VVR\">\n      <\/a>\n  \n      <a class=\"logo-item\" href=\"https:\/\/www.rebus.de\" target=\"_blank\" rel=\"noopener noreferrer\">\n        <img decoding=\"async\" src=\"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/07\/rebus-logo.svg\" alt=\"rebus\">\n      <\/a>\n    <\/div>\n  \n    <div class=\"logo-row\">\n      <a class=\"logo-item\" href=\"https:\/\/ilse-bus.de\" target=\"_blank\" rel=\"noopener noreferrer\">\n        <img decoding=\"async\" src=\"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/logo-vvg.svg\" alt=\"VVG\">\n      <\/a>\n  \n      <a class=\"logo-item\" href=\"https:\/\/www.sw-greifswald.de\/friedrich\" target=\"_blank\" rel=\"noopener noreferrer\">\n        <img decoding=\"async\" src=\"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/logo-stadtwerke-greifswald.svg\" alt=\"Stadtwerke Greifswald\">\n      <\/a>\n    <\/div>\n  \n  <\/div>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--0);margin-bottom:var(--wp--preset--spacing--0);height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<style>\n.rufbus-card{\n    position:relative;\n    max-width:940px;\n    margin:auto;\n}\n\n.rufbus-content{\n    position:relative;\n    background:#002E63;\n    border-radius:20px;\n    padding:30px;\n    display:flex;\n    justify-content:space-between;\n    gap:30px;\n    overflow:visible;\n}\n\n.rufbus-text{\n    flex:1;\n}\n\n.rufbus-text h2{\n    margin:0 0 30px;\n    color:#fff;\n    font:700 28px\/32px Montserrat,sans-serif;\n    text-transform:none;\n}\n\n.rufbus-text p{\n    margin:0;\n    color:#fff;\n    font:300 20px\/28px Montserrat,sans-serif;\n    display:inline;\n}\n\n.rufbus-text strong{\n    display:inline;\n    color:#fff;\n    font:700 20px\/28px Montserrat,sans-serif;\n    margin-left:4px;\n}\n\n.rufbus-text strong a{\n    color:#fff;\n    text-decoration:none;\n    transition:color .2s ease;\n}\n\n.rufbus-text strong a:hover{\n    color:#00B2DC;\n}\n\n.rufbus-logo{\n    width:134px;\n    height:134px;\n    flex-shrink:0;\n}\n\n.rufbus-tail{\n    position:absolute;\n    width:151px;\n    height:57px;\n    right:80px;\n    bottom:-56px;\n}\n\n.rufbus-bus{\n    position:absolute;\n    width:260px;\n    left:295px;\n    top:157px;\n    z-index: 100;\n}\n\n@media (max-width: 817px) {\n    .rufbus-bus {\n        top: 200px;\n    }\n}\n\n@media (max-width: 626px) {\n\n    .rufbus-content{\n        display: grid;\n        grid-template-columns: 1fr auto;\n        grid-template-areas:\n            \"text text\"\n            \"bus logo\";\n        align-items: center;\n        justify-items: start;\n        gap: 20px;\n    }\n\n    .rufbus-text{\n        grid-area: text;\n    }\n\n    .rufbus-logo{\n        grid-area: logo;\n        width: 90px;\n        height: 90px;\n        justify-self: start;\n    }\n\n    .rufbus-bus{\n        grid-area: bus;\n        position: static;\n        width: 170px;\n        max-width: 260px;\n        margin: 0;\n        justify-self: start;\n    }\n\n    .rufbus-tail{\n        right: 20px;\n        bottom: -40px;\n        transform: scale(0.8);\n    }\n}\n\n@media (max-width: 349px) {\n    .rufbus-content {\n        grid-template-columns: 1fr;\n        grid-template-areas:\n            \"text\"\n            \"bus\"\n            \"logo\";\n    }\n\n    .rufbus-bus,\n    .rufbus-logo {\n        justify-self: start;\n        width: 100%;\n        max-width: 170px;\n        height: auto;\n    }\n\n    .rufbus-logo {\n        max-width: 90px;\n    }\n}\n<\/style>\n\n<div class=\"rufbus-card\">\n\n    <div class=\"rufbus-content\">\n\n        <div class=\"rufbus-text\">\n            <h2>Mit dem Rufbus MV einfach ans Ziel kommen.<\/h2>\n            <p>Online oder telefonisch bei Ihrem Verkehrsunternehmen bestellen<\/p>\n            <strong><a href=\"tel:+4938555573340\">unter 0385 55573340<\/a><\/strong>\n        <\/div>\n\n        <img decoding=\"async\" class=\"rufbus-bus\"\n             src=\"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/fahrzeug-rufbus-mv.svg\"\n             alt=\"\">\n\n        <img class=\"rufbus-logo\"\n\t\t\tsrc=\"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/icon-rufbus-134-outline.svg\"\n\t\t\talt=\"Rufbus\">\n\n        <svg class=\"rufbus-tail\" viewBox=\"0 0 151 57\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n            <path d=\"M5.91613 56.3994C2.55928 57.6231 -0.845878 54.7295 0.188588 51.5322L15.8887 0H150.934L5.91613 56.3994Z\" fill=\"#002E63\"\/>\n        <\/svg>\n\n    <\/div>\n\n<\/div>\n\n\n\n<div style=\"height:150px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading has-primary-color has-text-color has-link-color wp-elements-3ae79fca77e2cd6afcd18c4d70b8c2ca\">Finde einen Rufbus in deiner N\u00e4he<\/h3>\n\n\n\n<div id=\"app-In9g4bsr\" data-svg-url=\"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/ruf-karte-2.svg\" data-exclude-regions=\"rostock,schwerin\" data-ondemandbuses-url=\"https:\/\/mvfaehrtgut.de\/wp-json\/wp\/v2\/rufbus?per_page=100&amp;orderby=id&amp;order=asc&amp;_fields=id,slug,title,content,acf,_links,_embedded&amp;_embed=wp:featuredmedia,wp:term\">\n    <style>\n        #app-In9g4bsr * { box-sizing: border-box; margin: 0; padding: 0; }\n        #app-In9g4bsr {\n            position: relative;\n            aspect-ratio: 1024 \/ 768;\n            -webkit-tap-highlight-color: transparent;\n        }\n        #app-In9g4bsr svg {\n            display: block;\n            width: 100%;\n            height: 100%;\n            user-select: none;\n        }\n        \n        #app-In9g4bsr > svg > g[id] { outline: none !important; }\n        #app-In9g4bsr > svg > g[id][tabindex=\"0\"] { cursor: pointer; }\n\n        #app-In9g4bsr > svg > g[id]:focus,\n        #app-In9g4bsr > svg > g[id]:focus-visible,\n        #app-In9g4bsr > svg > g[id]:focus-within {\n            outline: none !important;\n            outline-style: none !important;\n            box-shadow: none !important;\n        }\n        #app-In9g4bsr > svg > g[id] [fill] { transition: fill .12s ease; }\n        #app-In9g4bsr > svg > g[id][tabindex=\"0\"]:is(:hover, .active) [fill='#d3ebd7'] { fill: #ffc800; }\n        #app-In9g4bsr > svg > g[id][tabindex=\"0\"]:is(:hover, .active) [fill='#979797'] { fill: #002e63; }\n\n#app-In9g4bsr > .rb-pop {\n            position: absolute;\n            z-index: 10;\n            \n            width: clamp(160px, 45vw, 295px);\n            background: #fff;\n            border-radius: 12px;\n            box-shadow: 0 6px 13.8px rgba(0,0,0,.25);\n            padding: 28px 30px 30px;\n            font-family: Montserrat, system-ui, -apple-system, sans-serif;\n            color: #002e63;\n            pointer-events: none;\n            opacity: 0;\n            transform: translateY(2px);\n            transition: opacity .12s ease, transform .12s ease;\n        }\n        @media (max-width: 600px) {\n            #app-In9g4bsr > .rb-pop { padding: 14px 16px 16px; border-radius: 8px; }\n            \n            #app-In9g4bsr > .rb-pop img.rb-logo { height: auto !important; margin-bottom: 6px !important; }\n            #app-In9g4bsr > .rb-pop h4 { font-size: 13px !important; margin: 0 0 2px !important; }\n            #app-In9g4bsr > .rb-pop .rb-tel { font-size: 13px !important; margin-bottom: 16px !important; text-underline-offset: 2px !important; }\n            #app-In9g4bsr > .rb-pop .rb-times { font-size: 11px !important; line-height: 1.3 !important; }\n        }\n        #app-In9g4bsr > .rb-pop.is-visible {\n            opacity: 1;\n            transform: translateY(0);\n            pointer-events: auto;\n        }\n        #app-In9g4bsr > .rb-pop img.rb-logo {\n            display: block;\n            height: 60px; max-width: 100%;\n            object-fit: contain; object-position: left center;\n            margin-bottom: 8px;   \n        }\n        #app-In9g4bsr > .rb-pop h4 {\n            font-size: 20px; font-weight: 700;\n            letter-spacing: -.01em; line-height: 1.15;\n            margin: 0 0 2px;      \n        }\n        #app-In9g4bsr > .rb-pop .rb-tel {\n            display: block; width: fit-content;\n            margin: 0 0 28px;\n            font-size: 20px; letter-spacing: -.01em; line-height: 1.15;\n            color: #002e63; text-decoration: underline;\n            text-underline-offset: 3px;\n        }\n        #app-In9g4bsr > .rb-pop .rb-tel:hover,\n        #app-In9g4bsr > .rb-pop .rb-tel:focus { color: #00b2dc; }\n        #app-In9g4bsr > .rb-pop .rb-book {\n            display: block; width: fit-content;\n            margin: 0 0 6px;\n            font-size: 20px; letter-spacing: -.01em; line-height: 1.15;\n            color: #002e63; text-decoration: underline;\n            text-underline-offset: 3px;\n        }\n        #app-In9g4bsr > .rb-pop .rb-book:hover,\n        #app-In9g4bsr > .rb-pop .rb-book:focus { color: #00b2dc; }\n        @media (max-width: 600px) {\n            #app-In9g4bsr > .rb-pop .rb-book { font-size: 13px !important; margin-bottom: 4px !important; text-underline-offset: 2px !important; }\n        }\n        #app-In9g4bsr > .rb-pop .rb-times {\n            font-size: 16px; letter-spacing: -.01em; line-height: 1.32;\n            white-space: pre-line;\n        }\n        #app-In9g4bsr > .rb-pop hr.rb-sep {\n            border: 0; border-top: 1px solid #E2E6EA;\n            margin: 14px -30px;\n        }\n    <\/style>\n    <script>(container => { 'use strict';\n\n        var CURSOR_INSET = 8;\n        var EDGE_TOLERANCE = 4;\n\n        var busesBySlug = {};\n        var svgEl = null, pop = null, active = null;\n        var rafPending = false, lastX = 0, lastY = 0;\n\n        pop = document.createElement('div');\n        pop.className = 'rb-pop';\n        pop.setAttribute('role', 'dialog');\n        pop.setAttribute('aria-live', 'polite');\n        pop.setAttribute('aria-label', 'Rufbus-Anbieter Detail');\n        container.appendChild(pop);\n\n        function htmlToText(html) {\n            if (!html) return '';\n            var div = document.createElement('div');\n            div.innerHTML = html\n                .replace(\/<\\s*br\\s*\\\/?>\/gi, '\\n')\n                .replace(\/<\\\/\\s*(p|div|li)\\s*>\/gi, '\\n');\n            return (div.textContent || '').split('\\n')\n                .map(function(s){ return s.trim(); })\n                .filter(Boolean).join('\\n');\n        }\n        function escapeHtml(s) {\n            return String(s||'').replace(\/[&<>\"']\/g, function(ch){\n                return ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'})[ch];\n            });\n        }\n        function getLandkreisSlugs(bus) {\n            var groups = (bus._embedded ? bus._embedded['wp:term'] : 0) || [];\n            var out = [];\n            for (var i=0; i<groups.length; i++) {\n                for (var j=0; j<groups[i].length; j++) {\n                    if (groups[i][j].taxonomy === 'landkreis') out.push(groups[i][j].slug);\n                }\n            }\n            return out;\n        }\n        function getAnbieterNames(bus) {\n            var groups = (bus._embedded ? bus._embedded['wp:term'] : 0) || [];\n            var out = [];\n            for (var i=0; i<groups.length; i++) {\n                for (var j=0; j<groups[i].length; j++) {\n                    if (groups[i][j].taxonomy === 'anbieter') out.push(groups[i][j].name);\n                }\n            }\n            return out.join(' \/ ');\n        }\n        function getLogo(bus) {\n\n            var fm = bus._embedded ? bus._embedded['wp:featuredmedia'] : 0;\n            if (fm) if (fm[0]) if (fm[0].source_url) return fm[0].source_url;\n            return (bus.acf ? (bus.acf.logo_svg || bus.acf.logo) : '') || '';\n        }\n\n        function renderPopup(buses, regionLabel) {\n            pop.innerHTML = buses.map(function(b){\n                var logo = getLogo(b);\n                var anb  = getAnbieterNames(b);\n                var title = escapeHtml((b.title ? b.title.rendered : 0) || anb || '');\n                var tel  = (b.acf ? b.acf.telefon : 0) || '';\n                var book = (b.acf ? b.acf['url_zur_online-bestellung'] : 0) || '';\n                var times = htmlToText((b.content ? b.content.rendered : 0) || '');\n                return ''\n                    + (logo ? '<img decoding=\"async\" class=\"rb-logo\" src=\"' + escapeHtml(logo) + '\" alt=\"\" loading=\"lazy\">' : '')\n                    + '<h4>' + title + '<\/h4>'\n                    + (book ? '<a class=\"rb-book\" href=\"' + escapeHtml(book) + '\" target=\"_blank\" rel=\"noopener noreferrer\">Online buchen<\/a>' : '')\n                    + (tel ? '<a class=\"rb-tel\" href=\"tel:' + escapeHtml(tel.replace(\/\\s+\/g,''))\n                           + '\">' + escapeHtml(tel) + '<\/a>' : '')\n                    + (times ? '<p class=\"rb-times\">' + escapeHtml(times) + '<\/p>' : '');\n            }).join('<hr class=\"rb-sep\">');\n        }\n\n        function placeAtMouse(mx, my) {\n            var crect = container.getBoundingClientRect();\n            var vw = window.innerWidth, vh = window.innerHeight;\n            var w = pop.offsetWidth, h = pop.offsetHeight;\n            var goRight = (mx + w + 8 <= vw) || (mx < vw \/ 2);\n            var goDown  = (my + h + 8 <= vh) || (my < vh \/ 2);\n            var x = goRight ? (mx - CURSOR_INSET) : (mx - w + CURSOR_INSET);\n            var y = goDown  ? (my - CURSOR_INSET) : (my - h + CURSOR_INSET);\n\n            x = Math.max(8, Math.min(x, vw - w - 8));\n            y = Math.max(8, Math.min(y, vh - h - 8));\n\n            pop.style.left = (x - crect.left) + 'px';\n            pop.style.top  = (y - crect.top)  + 'px';\n            pop.style.right = pop.style.bottom = 'auto';\n        }\n\n        function show(g, mx, my) {\n            var slug = g.id;\n            if (excludedRegions.indexOf(slug) > -1) { close(); return; }\n            var buses = Object.values(busesBySlug).filter(function(b){\n                return getLandkreisSlugs(b).indexOf(slug) > -1;\n            });\n\n            if (!buses.length) { close(); return; }\n\n            svgEl.querySelectorAll(':scope > g[id].active').forEach(function(x){ x.classList.remove('active'); });\n            g.classList.add('active');\n            active = g;\n            renderPopup(buses, slug);\n            pop.classList.add('is-visible');\n            placeAtMouse(mx, my);\n            requestAnimationFrame(function(){ placeAtMouse(mx, my); });\n        }\n        function close() {\n            if (active) active.classList.remove('active');\n            active = null;\n            pop.classList.remove('is-visible');\n        }\n        function inRect(r, x, y) {\n            if (x < r.left - EDGE_TOLERANCE) return false;\n            if (x > r.right + EDGE_TOLERANCE) return false;\n            if (y < r.top - EDGE_TOLERANCE) return false;\n            if (y > r.bottom + EDGE_TOLERANCE) return false;\n            return true;\n        }\n        function cursorIsOnTrack(x, y) {\n            if (pop.classList.contains('is-visible')) if (inRect(pop.getBoundingClientRect(), x, y)) return true;\n            if (active) if (inRect(active.getBoundingClientRect(), x, y)) return true;\n            return false;\n        }\n        function isOnAnyRegion(target) {\n            if (!svgEl) return false;\n            var groups = svgEl.querySelectorAll(':scope > g[id]');\n            for (var i=0; i<groups.length; i++) {\n                if (groups[i].contains(target)) return true;\n            }\n            return false;\n        }\n\n        function bindRegion(g) {\n            g.setAttribute('tabindex', '0');\n            g.setAttribute('role', 'button');\n            g.setAttribute('aria-label', g.id);\n            g.setAttribute('aria-haspopup', 'dialog');\n\n            g.addEventListener('pointerover', function(e){\n                if (e.pointerType === 'touch') return;\n                if (active === g) return;\n                show(g, e.clientX, e.clientY);\n            });\n\n            g.addEventListener('pointerdown', function(e){\n                if (active === g) return;\n                show(g, e.clientX, e.clientY);\n            });\n\n            g.addEventListener('keydown', function(e){\n                if (e.key !== 'Tab' || e.shiftKey) return;\n                if (!pop.classList.contains('is-visible')) return;\n                var first = pop.querySelector('a');\n                if (!first) return;\n                e.preventDefault();\n                first.focus();\n            });\n        }\n\n        var excludedRegions = (container.dataset.excludeRegions || '')\n            .split(',').map(function(s){ return s.trim(); }).filter(Boolean);\n\n        function applyTabindexFromData(){\n            if (!svgEl) return;\n            Array.from(svgEl.querySelectorAll(':scope > g[id]')).forEach(function(g){\n                var isExcluded = excludedRegions.indexOf(g.id) > -1;\n                var hasData = !isExcluded && Object.values(busesBySlug).some(function(b){\n                    return getLandkreisSlugs(b).indexOf(g.id) > -1;\n                });\n                g.setAttribute('tabindex', hasData ? '0' : '-1');\n            });\n        }\n\n        function allRegions(){\n            return svgEl ? Array.from(svgEl.querySelectorAll(':scope > g[id][tabindex=\"0\"]')) : [];\n        }\n        function showRegion(g){\n            var r = g.getBoundingClientRect();\n            show(g, r.left + r.width \/ 2, r.top + r.height \/ 2);\n        }\n\n        container.addEventListener('focusin', function(e){\n            var g = e.target;\n            if (g.parentNode !== svgEl || g.tagName.toLowerCase() !== 'g') return;\n            if (active === g) return;\n            showRegion(g);\n        });\n        container.addEventListener('focusout', function(e){\n\n            setTimeout(function(){\n                var ae = document.activeElement;\n                if (!ae || ae === document.body) { if (active) close(); return; }\n                if (pop.contains(ae)) return;\n                if (isOnAnyRegion(ae)) return;\n                if (active) close();\n            }, 0);\n        });\n\n        pop.addEventListener('keydown', function(e){\n            if (e.key !== 'Tab' || !active) return;\n            var links = Array.prototype.slice.call(pop.querySelectorAll('a'));\n            var idx = links.indexOf(e.target);\n            var atLast  = !e.shiftKey ? idx === links.length - 1 : false;\n            var atFirst =  e.shiftKey ? idx === 0                : false;\n            if (!atLast) if (!atFirst) return;\n            var regs = allRegions();\n            var i = regs.indexOf(active);\n            if (i < 0) return;\n            var next = e.shiftKey\n                ? regs[(i - 1 + regs.length) % regs.length]\n                : regs[(i + 1) % regs.length];\n            e.preventDefault();\n            showRegion(next);\n            next.focus();\n        });\n\n        document.addEventListener('pointermove', function(e){\n            if (e.pointerType === 'touch') return;\n            lastX = e.clientX; lastY = e.clientY;\n            if (!active) return;\n            if (rafPending) return;\n            rafPending = true;\n            requestAnimationFrame(function(){\n                rafPending = false;\n                if (active) if (!cursorIsOnTrack(lastX, lastY)) close();\n            });\n        }, { passive: true });\n\n        document.addEventListener('pointerdown', function(e){\n            if (!active) return;\n            if (pop.contains(e.target)) return;\n            if (isOnAnyRegion(e.target)) return;\n            close();\n        });\n\n        window.addEventListener('scroll', function(){ if (active) close(); }, { passive: true });\n        window.addEventListener('resize', function(){ if (active) close(); });\n\n        fetch(container.dataset.ondemandbusesUrl)\n            .then(function(resp){ return resp.json(); })\n            .then(function(buses){\n                for (var i=0; i<buses.length; i++) busesBySlug[buses[i].slug] = buses[i];\n                applyTabindexFromData();\n            })\n            .catch(function(e){ console.warn('[Rufbus] API-Fehler', e); });\n\n        function splitStadtRostock(svg) {\n            var lkrGroup = svg.querySelector('g#landkreis-rostock');\n            if (!lkrGroup) return;\n            var lkrPath = lkrGroup.querySelector('path');\n            if (!lkrPath) return;\n            var d = lkrPath.getAttribute('d') || '';\n            var idx = d.search(\/Z\\s*M\/);\n            if (idx < 0) return;\n            var outerD = d.slice(0, idx + 1);\n            var cityD = d.slice(idx + 1);\n            lkrPath.setAttribute('d', outerD);\n            var NS = 'http:\/\/www.w3.org\/2000\/svg';\n            var cityGroup = document.createElementNS(NS, 'g');\n            cityGroup.setAttribute('id', 'rostock');\n            var cityPath = document.createElementNS(NS, 'path');\n            cityPath.setAttribute('d', cityD);\n            cityPath.setAttribute('fill', lkrPath.getAttribute('fill') || '#d3ebd7');\n            cityPath.setAttribute('stroke', lkrPath.getAttribute('stroke') || '#fff');\n            cityPath.setAttribute('stroke-miterlimit', lkrPath.getAttribute('stroke-miterlimit') || '3.86');\n            cityGroup.appendChild(cityPath);\n            lkrGroup.parentNode.insertBefore(cityGroup, lkrGroup.nextSibling);\n        }\n\n        fetch(container.dataset.svgUrl)\n            .then(function(resp){ return resp.text(); })\n            .then(function(text){\n                var div = document.createElement('div');\n                div.innerHTML = text;\n                svgEl = div.firstElementChild;\n                splitStadtRostock(svgEl);\n                container.style.aspectRatio = svgEl.viewBox.baseVal.width + '\/' + svgEl.viewBox.baseVal.height;\n                svgEl.querySelectorAll(':scope > g[id]').forEach(bindRegion);\n                container.prepend(svgEl);\n                applyTabindexFromData();\n            })\n            .catch(function(e){ console.warn('[Rufbus] SVG-Fehler', e); });\n    })(document.currentScript.parentElement);<\/script>\n<\/div>\n\n\n\n<figure class=\"wp-block-image size-large has-custom-border no-hover has-custom-css wp-custom-css-28eab527\"><a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.mdv.VMVCompanion&amp;hl=de\"><img loading=\"lazy\" decoding=\"async\" width=\"1100\" height=\"620\" src=\"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/jetzt-herunterladen-1100x620.webp\" alt=\"\" class=\"wp-image-5957\" style=\"border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-left-radius:0px;border-bottom-right-radius:0px\" srcset=\"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/jetzt-herunterladen-1100x620.webp 1100w, https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/jetzt-herunterladen-600x338.webp 600w, https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/jetzt-herunterladen-768x433.webp 768w, https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/jetzt-herunterladen-1536x866.webp 1536w, https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/jetzt-herunterladen-18x10.webp 18w, https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/jetzt-herunterladen.webp 2000w\" sizes=\"auto, (max-width: 1100px) 100vw, 1100px\" \/><\/a><\/figure>\n\n\n\n<h4 class=\"wp-block-heading has-text-align-center has-primary-color has-text-color has-link-color wp-elements-bd66fc8915911bf30b910197caea85d4\" style=\"margin-top:var(--wp--preset--spacing--60);margin-bottom:var(--wp--preset--spacing--60)\">Unsere Angebote kurz erkl\u00e4rt<\/h4>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"1080\" style=\"aspect-ratio: 1920 \/ 1080;\" width=\"1920\" controls src=\"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/erklaerfilm_web.mp4\"><\/video><\/figure>\n\n\n\n<div class=\"wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-abed9ac5 wp-block-group-is-layout-flex\" style=\"margin-top:var(--wp--preset--spacing--60);margin-bottom:var(--wp--preset--spacing--60)\">\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/icon-regiobus-70.svg\" alt=\"\" class=\"wp-image-5864\"\/><\/figure>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"\/mobilitaetsoffensive\/regiobus\">zum Regiobus MV<\/a><\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group alignfull has-base-background-color has-background has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--80);padding-bottom:var(--wp--preset--spacing--80)\">\n<h4 class=\"wp-block-heading has-text-align-left has-primary-color has-text-color has-link-color has-large-font-size wp-elements-52d031efcc5aa46a8665b3a0bde916ac\"><strong>Unsere Meilensteine seit Einf\u00fchrung der <a href=\"\/mobilitaetsoffensive\" type=\"link\" id=\"\/mobilitaetsoffensive\">Mobilit\u00e4tsoffensive MV<\/a><\/strong><\/h4>\n\n\n\n<div id=\"app-TlRb42\" data-vmv-timeline=\"rufbus\">\n    <p class=\"tl-status\" role=\"status\" aria-live=\"polite\">Meilensteine werden geladen&nbsp;\u2026<\/p>\n    <div class=\"tl-mount\"><\/div>\n    <style>\n        #app-TlRb42, #app-TlRb42 * { box-sizing: border-box; }\n        #app-TlRb42 {\n            font-family: Montserrat, system-ui, -apple-system, sans-serif;\n            color: #002E63;\n            \/* WIDTH: 1000px content + 16px padding \u2014 matches the site's content\n               width so the timeline renders at the same scale as the template *\/\n            max-width: 1016px;\n            margin: 0 auto;\n            padding: 32px 8px;\n        }\n        #app-TlRb42 .tl-status {\n            text-align: center;\n            font-size: 15px;\n            padding: 40px 0;\n            margin: 0;\n        }\n        #app-TlRb42 .tl-empty { text-align: center; font-size: 16px; margin: 24px 0; }\n\n        \/* ---- Desktop stage (grid = Figma template, 1 unit = var(--u) px) ---- *\/\n        #app-TlRb42 .tl-wrap { position: relative; }\n        #app-TlRb42 .tl-scroll {\n            overflow-x: auto;\n            overflow-y: hidden;\n            scrollbar-width: none;\n            -webkit-overflow-scrolling: touch;\n            outline: none;\n        }\n        #app-TlRb42 .tl-scroll::-webkit-scrollbar { display: none; }\n        #app-TlRb42 .tl-stage { position: relative; }\n        #app-TlRb42 .tl-svg { position: absolute; left: 0; top: 0; width: 100%; height: 100%; display: block; }\n\n        #app-TlRb42 .tl-cluster {\n            position: absolute;\n            font-size: calc(var(--u, 1) * 17.5px);\n            line-height: 1.29;\n            color: #002E63;\n        }\n        #app-TlRb42 .tl-item { margin-top: calc(var(--u, 1) * 15px); }\n        #app-TlRb42 .tl-item:first-child { margin-top: 0; }\n        #app-TlRb42 .tl-item--hidden { display: none; }\n        #app-TlRb42 .tl-date  { font-weight: 400; margin: 0 0 calc(var(--u, 1) * 3px); }\n        #app-TlRb42 .tl-title { font-weight: 700; margin: 0 0 calc(var(--u, 1) * 11px); }\n        #app-TlRb42 .tl-title:last-child { margin-bottom: 0; }\n        \/* inline-block: the whole zusatz drops to its own line when it does not fit *\/\n        #app-TlRb42 .tl-zusatz { font-weight: 400; display: inline-block; }\n        #app-TlRb42 .tl-more {\n            display: inline-block;\n            font: inherit;\n            font-size: calc(var(--u, 1) * 16px);\n            font-weight: 700;\n            color: var(--dot, #002E63);\n            background: none;\n            border: 0;\n            padding: 0;\n            margin-top: calc(var(--u, 1) * 10px);\n            cursor: pointer;\n            text-decoration: underline;\n        }\n\n        \/* Fades hint that the timeline continues (scroll mode only) *\/\n        #app-TlRb42 .tl-fade {\n            position: absolute;\n            top: 0;\n            bottom: 0;\n            width: 60px;\n            pointer-events: none;\n            opacity: 0;\n            transition: opacity .25s;\n        }\n        #app-TlRb42 .tl-fade--l { left: 0;  background: linear-gradient(90deg,  #fff, rgba(255,255,255,0)); }\n        #app-TlRb42 .tl-fade--r { right: 0; background: linear-gradient(270deg, #fff, rgba(255,255,255,0)); }\n\n        #app-TlRb42 .tl-arrow {\n            position: absolute;\n            width: 40px;\n            height: 40px;\n            border-radius: 50%;\n            border: 2px solid #002E63;\n            background: #fff;\n            color: #002E63;\n            font-size: 22px;\n            line-height: 1;\n            cursor: pointer;\n            z-index: 3;\n            transform: translateY(-50%);\n        }\n        #app-TlRb42 .tl-arrow--l { left: 2px; }\n        #app-TlRb42 .tl-arrow--r { right: 2px; }\n        #app-TlRb42 .tl-arrow:hover { background: #002E63; color: #fff; }\n\n        \/* ---- Mobile: vertical list ---- *\/\n        #app-TlRb42 .tl-m { display: none; }\n        @media (max-width: 900px) {\n            #app-TlRb42 { padding: 20px 12px; }\n            #app-TlRb42 .tl-wrap { display: none; }\n\n            \/* ==========================================================\n               MOBILE ALIGNMENT \u2014 how the timeline sits on the page:\n                 margin: 0 auto;      -> centered (default)\n                 margin: 0 auto 0 0;  -> left\n                 margin: 0 0 0 auto;  -> right\n               max-width controls the column width.\n               ========================================================== *\/\n            #app-TlRb42 .tl-m {\n                display: block;\n                max-width: 560px;\n                margin: 0 auto;\n            }\n\n            \/* Bus flush with the timeline bar (left edge), above the list *\/\n            #app-TlRb42 .tl-m__bus {\n                display: block;\n                width: min(120px, 40%);\n                height: auto;\n                margin: 0 0 22px;\n            }\n            #app-TlRb42 .tl-m__list { position: relative; padding: 4px 0; }\n            #app-TlRb42 .tl-m__list::before {\n                content: \"\";\n                position: absolute;\n                left: 10px;\n                top: 6px;\n                bottom: 6px;\n                width: 8px;\n                border-radius: 4px;\n                background: linear-gradient(180deg, #28ADFF, #FFCC00 50%, #BBCF00);\n            }\n            #app-TlRb42 .tl-m__year { position: relative; padding: 0 0 30px 46px; }\n            #app-TlRb42 .tl-m__year:last-child { padding-bottom: 0; }\n            #app-TlRb42 .tl-m__year--end .tl-m__yr { margin-bottom: 0; }\n            #app-TlRb42 .tl-m__year--end .tl-m__yr::before { display: none; } \/* end year without dot, like desktop *\/\n            #app-TlRb42 .tl-m__yr {\n                position: relative;\n                font-size: 26px;\n                font-weight: 800;\n                line-height: 1;\n                letter-spacing: -0.5px;\n                color: var(--dot, #002E63);\n                margin: 0 0 14px;\n            }\n            #app-TlRb42 .tl-m__yr::before {\n                content: \"\";\n                position: absolute;\n                left: -43px;\n                top: 2px;\n                width: 22px;\n                height: 22px;\n                border-radius: 50%;\n                background: var(--dot, #28ADFF);\n                box-shadow: 0 0 0 4px #fff;\n            }\n            #app-TlRb42 .tl-m__item { margin-top: 13px; }\n            #app-TlRb42 .tl-m__item:first-of-type { margin-top: 0; }\n            #app-TlRb42 .tl-m__date  { font-size: 14px; font-weight: 400; margin: 0 0 3px; }\n            #app-TlRb42 .tl-m__title { font-size: 16px; font-weight: 700; line-height: 1.3; margin: 0 0 8px; }\n            #app-TlRb42 .tl-m__title:last-child { margin-bottom: 0; }\n            #app-TlRb42 .tl-m__zusatz { font-weight: 400; display: inline-block; }\n        }\n    <\/style>\n\n    <script>(container => { 'use strict';\n\n        \/* ================= Configuration ================= *\/\n\n        var API   = 'https:\/\/mvfaehrtgut.de\/wp-json'; \/* leave empty for same-origin *\/\n        var ROUTE = 'meilenstein';                    \/* REST base of the \"Meilenstein\" CPT *\/\n        var ART     = 'rufbus';          \/* which timeline: term slug of the taxonomy below *\/\n        var ART_TAX = 'meilenstein-vm';  \/* taxonomy that separates regiobus\/rufbus milestones *\/\n        var END_JAHR = 2026;             \/* right end-year label pinned like the template;\n                                            auto-extends once data passes it *\/\n\n        \/* Fallback data, used while the REST API \/ CPT is not available. *\/\n        var FALLBACK = [\n            { datum: '2023-12-01', titel: 'Start der Rufbus-Offensive MV' },\n            { datum: '2024-05-01', titel: 'Start ILSE MSE Rufbus' },\n            { datum: '2024-06-01', titel: 'Start VVR-Surfer' },\n            { datum: '2024-07-01', titel: 'rubi Rostock geht an den Start' },\n            \/* month is still a placeholder in the Figma template (\"Monat 2024\"): *\/\n            { datum: '2024-12-01', titel: 'Start Friedrich' },\n            { datum: '2024-12-01', titel: 'Start VLP' },\n            { datum: '2026-01-01', titel: 'Start ILSE Usedom' }\n        ];\n\n        \/* ==== Geometry, measured from the Figma template (viewBox 1005 x 725) ==== *\/\n\n        var VIEW_W     = 1005;  \/* visible width in grid units (1 unit = --u px) *\/\n        var BAR_X0     = 109;   \/* bar start x *\/\n        var BAR_MIN    = 786;   \/* bar length of the template (3 years) *\/\n        var PER_YEAR   = 262;   \/* minimum width per year (template density) *\/\n        var RIGHT_PAD  = 110;   \/* room for the end-year label on the right *\/\n        var BAR_SW     = 14;    \/* bar stroke width *\/\n        var DOT_R      = 13;    \/* dot radius *\/\n        var DOT_SW     = 4;     \/* white ring around dots *\/\n        var CONN_SW    = 3;     \/* connector stroke width *\/\n        var CONN_GAP   = 45;    \/* gap between bar center and connector start *\/\n        var YEAR_FS    = 34.2;  \/* year label font size (Montserrat SemiBold 600, like template) *\/\n        \/* dot positions as fractions of the bar length, measured from the template;\n           used when the number of years matches, otherwise dots spread evenly *\/\n        var DOT_POS    = [0.085, 0.365, 0.795];\n        var YEAR_GAP_L = 27.6;  \/* gap year label -> bar (left) *\/\n        var YEAR_GAP_R = 21.2;  \/* gap bar -> year label (right) *\/\n        var TEXT_DX    = 23.5;  \/* text offset right of the connector *\/\n        var TEXT_DY    = 43.6;  \/* text start below the bar center *\/\n        var CLUSTER_W  = 464;   \/* max text width (2 year slots, like template) *\/\n        var EDGE_PAD   = 10;    \/* safety gap at the stage edge *\/\n        var CAP        = 335;   \/* max cluster height before \"+N more\" collapses it *\/\n        var TOP_MIN    = 195;   \/* minimum space above the bar (bus) *\/\n        var BOT_MIN    = 90;    \/* minimum space below the bar *\/\n\n        var MONATE = ['Jan.', 'Feb.', 'M\u00e4rz', 'April', 'Mai', 'Juni', 'Juli', 'Aug.', 'Sep.', 'Okt.', 'Nov.', 'Dez.'];\n\n        var status = container.querySelector('.tl-status');\n        var mount  = container.querySelector('.tl-mount');\n        var state  = { years: [], expanded: {}, u: 1, scrolledOnce: false };\n\n        \/* ================= Helpers ================= *\/\n\n        function esc(s) {\n            return String(s == null ? '' : s).replace(\/[&<>\"']\/g, function (ch) {\n                return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[ch];\n            });\n        }\n        function unent(s) {\n            var d = document.createElement('div');\n            d.innerHTML = String(s == null ? '' : s);\n            return d.textContent;\n        }\n        function parseDatum(s) {\n            var t = String(s == null ? '' : s).trim();\n            if (\/^\\d{8}$\/.test(t)) t = t.slice(0, 4) + '-' + t.slice(4, 6) + '-' + t.slice(6, 8);\n            var d = new Date(\/^\\d{4}-\\d{2}-\\d{2}$\/.test(t) ? t + 'T12:00:00' : t);\n            return isNaN(d) ? null : d;\n        }\n        function lerp(a, b, u) { return Math.round(a + (b - a) * u); }\n        function colorAt(t) {\n            \/* dot colors of the template: #00B2DC -> #D8C62F -> #DACE01 *\/\n            var A = [0, 178, 220], B = [216, 198, 47], C = [218, 206, 1];\n            var p, q, u;\n            if (t < 0.5) { p = A; q = B; u = t * 2; } else { p = B; q = C; u = (t - 0.5) * 2; }\n            return 'rgb(' + lerp(p[0], q[0], u) + ',' + lerp(p[1], q[1], u) + ',' + lerp(p[2], q[2], u) + ')';\n        }\n        function n1(v) { return Math.round(v * 10) \/ 10; }\n        function ux(v) { return 'calc(var(--u, 1) * ' + n1(v) + 'px)'; }\n\n        \/* Van graphic: original paths from the Rufbus Figma template (1015 x 367 space) *\/\n        function BUS_PATHS() {\n            return ''\n                + '<g>'\n                + '<g>'\n                + '<path d=\"M132.373 163.793C124.576 163.793 118.142 163.449 118.078 163.446H17.4347L5.33875 162.815C2.93275 162.689 1.08675 160.602 1.13775 158.063C1.28575 150.737 1.62175 137.641 2.20975 132.244C2.77275 127.071 4.95075 118.681 6.19775 114.14C6.83975 111.809 8.72175 110.055 10.9958 109.675C13.6238 109.235 17.5458 108.712 21.3088 108.712H76.2927C101.411 108.712 107.271 109.801 110.904 112.241C113.914 114.263 126.92 123.427 132.372 127.273C134.12 128.505 136.02 129.476 138.021 130.156C141.73 131.416 148.65 134.022 153.327 137.312C158.056 140.637 158.976 152.732 159.152 157.779C159.218 159.667 158.058 161.321 156.331 161.802C153.776 162.513 150.285 163.037 145.953 163.359C142.075 163.647 137.506 163.794 132.372 163.794L132.373 163.793Z\" fill=\"white\"\/>'\n                + '<path d=\"M76.2943 109.911C100.976 109.911 106.924 110.988 110.295 113.252C113.292 115.264 126.291 124.424 131.741 128.269C133.577 129.565 135.573 130.583 137.674 131.297C141.327 132.539 148.136 135.101 152.697 138.309C155.675 140.403 157.664 147.698 158.017 157.822C158.063 159.146 157.251 160.305 156.041 160.642C153.555 161.334 150.134 161.845 145.874 162.162C142.022 162.448 137.479 162.593 132.372 162.593C124.607 162.593 118.2 162.252 118.136 162.248C118.097 162.246 118.058 162.245 118.019 162.245H17.4913L5.39628 161.618C3.60828 161.525 2.23828 159.975 2.27628 158.089C2.42328 150.787 2.75728 137.738 3.34028 132.382C3.89328 127.303 6.05328 118.982 7.29128 114.475C7.81028 112.588 9.33428 111.17 11.1753 110.862C13.7613 110.429 17.6183 109.913 21.3103 109.913H76.2943M76.2943 107.512H21.3093C17.5643 107.512 13.6853 108.01 10.8183 108.49C8.09628 108.946 5.87428 111.012 5.10628 113.805C3.72728 118.823 1.64028 126.96 1.08028 132.106C0.490281 137.533 0.153281 150.499 0.00128094 158.038C-0.0627191 161.21 2.27928 163.857 5.28328 164.014L17.4343 164.645H118.019C118.019 164.645 124.451 164.993 132.372 164.993C136.75 164.993 141.583 164.886 146.033 164.556C151.155 164.175 154.48 163.558 156.621 162.962C158.856 162.339 160.375 160.171 160.29 157.734C160.08 151.726 159.015 139.87 153.958 136.313C149.179 132.951 142.185 130.311 138.37 129.014C136.467 128.367 134.666 127.447 133.004 126.275C127.389 122.313 114.521 113.247 111.515 111.229C107.64 108.627 101.829 107.513 76.2933 107.513L76.2943 107.512Z\" fill=\"#002E63\"\/>'\n                + '<\/g>'\n                + '<g>'\n                + '<path d=\"M30.563 173.791C24.692 173.791 19.916 169.015 19.916 163.144C19.916 157.273 24.692 152.496 30.563 152.496C36.434 152.496 41.21 157.272 41.21 163.144C41.21 169.016 36.434 173.791 30.563 173.791Z\" fill=\"white\"\/>'\n                + '<path d=\"M30.564 155.869C34.575 155.869 37.839 159.133 37.839 163.144C37.839 167.155 34.575 170.419 30.564 170.419C26.553 170.419 23.289 167.155 23.289 163.144C23.289 159.133 26.553 155.869 30.564 155.869ZM30.564 149.123C22.821 149.123 16.543 155.4 16.543 163.144C16.543 170.888 22.82 177.165 30.564 177.165C38.308 177.165 44.585 170.888 44.585 163.144C44.585 155.4 38.308 149.123 30.564 149.123Z\" fill=\"#002E63\"\/>'\n                + '<\/g>'\n                + '<g>'\n                + '<path d=\"M131.361 173.791C125.489 173.791 120.713 169.015 120.713 163.144C120.713 157.273 125.489 152.496 131.361 152.496C137.233 152.496 142.008 157.272 142.008 163.144C142.008 169.016 137.232 173.791 131.361 173.791Z\" fill=\"white\"\/>'\n                + '<path d=\"M131.361 155.869C135.372 155.869 138.636 159.133 138.636 163.144C138.636 167.155 135.373 170.419 131.361 170.419C127.349 170.419 124.085 167.155 124.085 163.144C124.085 159.133 127.349 155.869 131.361 155.869ZM131.361 149.123C123.618 149.123 117.34 155.4 117.34 163.144C117.34 170.888 123.618 177.165 131.361 177.165C139.104 177.165 145.381 170.888 145.381 163.144C145.381 155.4 139.104 149.123 131.361 149.123Z\" fill=\"#002E63\"\/>'\n                + '<\/g>'\n                + '<path d=\"M83.999 117.596V129.427C83.999 131.124 82.902 132.512 81.5381 132.512H20.0458C18.9191 132.512 18 131.36 18 129.935L19.0229 117.088C19.0229 115.664 19.942 114.512 21.0687 114.512H81.5391C82.903 114.512 83.999 115.887 83.999 117.596Z\" fill=\"#002E63\"\/>'\n                + '<path d=\"M115 132.51L92.9744 132.51C91.8839 132.51 91 131.422 91 130.08V116.942C91 115.6 91.8839 114.512 92.9744 114.512H100.507C102.939 114.512 107.294 115.374 109.34 116.995L116.069 122.327C116.633 122.774 116.974 123.544 116.974 124.371L116.974 130.081C116.974 131.423 116.09 132.51 115 132.51Z\" fill=\"#002E63\"\/>'\n                + '<g>'\n                + '<path d=\"M45.0039 139.381H72.998C72.9278 131.707 66.6929 125.512 59.0009 125.512C51.309 125.512 45.074 131.707 45.0039 139.381Z\" fill=\"#FEC800\"\/>'\n                + '<path d=\"M72.998 139.381H45.004C45.004 139.381 45.003 139.381 45.002 139.381C45.002 139.424 45 139.468 45 139.511C45 147.247 51.2656 153.511 59 153.511C66.7344 153.511 73 147.211 73 139.511C73 139.468 72.999 139.424 72.998 139.381C72.998 139.381 72.997 139.381 72.996 139.381H72.998Z\" fill=\"#002E63\"\/>'\n                + '<path d=\"M58.4854 145.646C58.4854 146.303 58.5886 147.058 59.3848 147.058C59.8025 147.058 60.2822 146.897 60.2822 145.646V140.954H62.1982V145.582C62.1982 147.979 60.6688 148.482 59.3848 148.482C58.1006 148.482 56.5693 147.979 56.5693 145.582V140.954H58.4854V145.646ZM66.1152 140.825C66.8708 140.825 67.4778 140.92 67.9697 141.115L67.8877 142.525C67.5449 142.356 66.9558 142.166 66.3721 142.166C65.747 142.166 65.3889 142.431 65.3887 142.893C65.3887 143.302 65.6159 143.478 66.2559 143.768L67.1514 144.173C67.7677 144.456 68.3983 144.901 68.3984 146.041C68.3984 146.827 68.1299 147.442 67.6016 147.867C67.1028 148.27 66.369 148.482 65.5078 148.482C64.6465 148.482 63.9379 148.301 63.5566 148.203L63.5469 148.201L63.6602 146.624C63.914 146.76 64.6298 147.058 65.3252 147.058C66.0204 147.058 66.373 146.781 66.373 146.233C66.3729 145.717 66.0062 145.575 65.4512 145.358L65.0137 145.188C63.8719 144.741 63.4277 144.13 63.4277 143.011C63.4281 141.683 64.4827 140.825 66.1152 140.825ZM53.0195 140.954C54.5396 140.954 55.3446 141.555 55.3447 142.691C55.3447 143.685 54.9051 144.274 53.9639 144.503L53.9463 144.507V144.526L53.9668 144.529C54.9305 144.695 55.4618 145.333 55.4619 146.287C55.4617 147.621 54.6102 148.355 53.0635 148.355H50.2266V140.954H53.0195ZM52.1025 147.015H52.6582L52.6592 147.016C53.2597 147.016 53.5898 146.709 53.5898 146.139C53.5897 145.569 53.2735 145.229 52.7441 145.229H52.1025V147.015ZM52.1025 143.931H52.5205V143.932C53.3075 143.932 53.4727 143.471 53.4727 143.086C53.4724 142.564 53.16 142.252 52.6377 142.252H52.1025V143.931ZM59.1709 136.028C59.1709 136.559 59.33 136.813 59.7109 136.813C60.262 136.813 60.3789 136.314 60.3789 135.901V132.71H62.2871V137.323C62.2871 137.737 62.319 138.086 62.3506 138.234H60.5586L60.5596 138.233C60.528 138.011 60.5176 137.618 60.5176 137.311H60.4971C60.3914 137.608 60.0191 138.361 58.9375 138.361C57.9944 138.361 57.2628 137.799 57.2627 136.58V132.71H59.1709V136.028ZM65.6816 130.154C66.3174 130.154 66.7203 130.24 66.9219 130.282L66.8799 131.639V131.638C66.6784 131.564 66.5614 131.532 66.3916 131.532C65.9573 131.532 65.756 131.765 65.7559 132.253V132.71H66.7949V134.004H65.7559V138.234H63.8477V134.004H62.8711V132.71H63.8477V131.926C63.8477 130.643 64.5684 130.154 65.6816 130.154ZM54.0391 130.832C55.5345 130.832 56.3828 131.457 56.3828 132.825C56.3828 133.918 55.6079 134.363 54.9609 134.522V134.554C55.3846 134.692 55.6617 134.894 55.958 135.922L56.626 138.233H54.5693L54.0176 136.134C53.827 135.424 53.4977 135.338 53.1797 135.338H53.0742V138.233H51.0811V130.832H54.0391ZM52.9893 133.918H53.5723C53.9959 133.918 54.3894 133.6 54.3896 133.123C54.3896 132.614 54.1245 132.253 53.541 132.253H52.9893V133.918Z\" fill=\"white\"\/>'\n                + '<\/g>'\n                + '<\/g>';\n        }\n\n        \/* ================= Data loading ================= *\/\n\n        function normalize(list) {\n            var out = [];\n            (list ? list : []).forEach(function (row) {\n                var d = parseDatum(row.datum);\n                if (d === null) return;\n                if (!row.titel) return;\n                out.push({ d: d, titel: String(row.titel), zusatz: row.zusatz ? String(row.zusatz) : '' });\n            });\n            out.sort(function (a, b) { return a.d - b.d; });\n            return out;\n        }\n\n        function fetchPage(page) {\n            \/* order=asc: ties on the same datum keep their creation order *\/\n            return fetch(API + '\/wp\/v2\/' + ROUTE + '?per_page=100&_embed=wp:term&order=asc&page=' + page, { headers: { Accept: 'application\/json' } })\n                .then(function (resp) {\n                    if (!resp.ok) throw new Error('HTTP ' + resp.status);\n                    return resp.json();\n                });\n        }\n\n        function loadFromApi() {\n            var rows = [];\n            function step(page) {\n                return fetchPage(page).then(function (batch) {\n                    rows = rows.concat(batch);\n                    if (batch.length === 100) {\n                        if (page < 5) {\n                            \/* a 400 on the page after the last one is fine \u2014 keep what we have *\/\n                            return step(page + 1).catch(function () { return rows; });\n                        }\n                    }\n                    return rows;\n                });\n            }\n            return step(1).then(function (all) {\n                var mapped = all.map(function (post) {\n                    var acf = post.acf ? post.acf : {};\n                    var arten = [];\n                    var emb = post._embedded ? post._embedded['wp:term'] : null;\n                    (emb ? emb : []).forEach(function (group) {\n                        (group ? group : []).forEach(function (term) {\n                            if (term.taxonomy === ART_TAX) arten.push(term.slug);\n                        });\n                    });\n                    return {\n                        datum: acf.datum,\n                        titel: unent(post.title ? post.title.rendered : ''),\n                        zusatz: acf.zusatzinfo ? unent(acf.zusatzinfo) : '',\n                        arten: arten\n                    };\n                }).filter(function (row) {\n                    \/* posts without any art term count as \"regiobus\" (default) *\/\n                    if (!row.arten.length) return ART === 'regiobus';\n                    return row.arten.indexOf(ART) > -1;\n                });\n                var items = normalize(mapped);\n                if (!items.length) throw new Error('keine g\u00fcltigen Meilensteine in der API-Antwort');\n                return items;\n            });\n        }\n\n        \/* ================= Grouping ================= *\/\n\n        function groupYears(items) {\n            var byYear = {};\n            items.forEach(function (m) {\n                var y = m.d.getFullYear();\n                if (!byYear[y]) byYear[y] = [];\n                byYear[y].push(m);\n            });\n            return Object.keys(byYear).map(Number).sort(function (a, b) { return a - b; }).map(function (y) {\n                var months = [];\n                var seen = {};\n                byYear[y].forEach(function (m) {\n                    var label = MONATE[m.d.getMonth()] + ' ' + y;\n                    if (seen[label] === undefined) { seen[label] = months.length; months.push({ label: label, items: [] }); }\n                    months[seen[label]].items.push(m);\n                });\n                return { year: y, months: months };\n            });\n        }\n\n        \/* ================= Cluster HTML + measuring ================= *\/\n\n        function clusterInner(m, visibleCount, expanded, needToggle) {\n            var html = m.months.map(function (mo, idx) {\n                var hidden = idx >= visibleCount ? ' tl-item--hidden' : '';\n                return '<div class=\"tl-item' + hidden + '\">'\n                    + '<p class=\"tl-date\">' + esc(mo.label) + '<\/p>'\n                    + mo.items.map(function (it) {\n                        return '<p class=\"tl-title\">' + esc(it.titel)\n                            + (it.zusatz ? ' <span class=\"tl-zusatz\">(' + esc(it.zusatz) + ')<\/span>' : '')\n                            + '<\/p>';\n                    }).join('')\n                    + '<\/div>';\n            }).join('');\n            if (needToggle) {\n                var hiddenTitles = 0;\n                m.months.forEach(function (mo, idx) { if (idx >= visibleCount) hiddenTitles += mo.items.length; });\n                html += '<button type=\"button\" class=\"tl-more\" data-year=\"' + m.year + '\">'\n                    + (expanded ? '\u2212 weniger anzeigen' : '+ ' + hiddenTitles + ' weitere anzeigen')\n                    + '<\/button>';\n            }\n            return html;\n        }\n\n        \/* Renders clusters off-screen at scale 1 (1 unit = 1 px) and records their\n           heights. Because fonts and widths both scale with --u, the measured unit\n           heights stay valid at any container width. *\/\n        function measure(meta) {\n            var box = document.createElement('div');\n            box.style.cssText = 'position:absolute;left:-9999px;top:0;visibility:hidden;width:1200px;';\n            box.style.setProperty('--u', '1');\n            container.appendChild(box);\n\n            meta.forEach(function (m) {\n                var el = document.createElement('div');\n                el.className = 'tl-cluster';\n                el.style.position = 'relative'; \/* items' offsetTop must be cluster-relative *\/\n                el.style.width = m.w + 'px';\n                el.innerHTML = clusterInner(m, m.months.length, false, false);\n                box.appendChild(el);\n                m.fullH = el.offsetHeight;\n                m.itemBottoms = [].map.call(el.querySelectorAll('.tl-item'), function (it) {\n                    return it.offsetTop + it.offsetHeight;\n                });\n            });\n\n            var tg = document.createElement('div');\n            tg.className = 'tl-cluster';\n            tg.style.position = 'relative';\n            tg.innerHTML = '<button type=\"button\" class=\"tl-more\">+ 9 weitere anzeigen<\/button>';\n            box.appendChild(tg);\n            var toggleH = tg.offsetHeight;\n\n            container.removeChild(box);\n\n            \/* Collapse: keep as many month blocks as fit into CAP (incl. toggle) *\/\n            meta.forEach(function (m) {\n                m.toggleH = toggleH;\n                if (m.fullH <= CAP) { m.visible = m.months.length; m.collapsedH = m.fullH; return; }\n                var k = 1;\n                m.itemBottoms.forEach(function (bottom, idx) {\n                    if (idx === 0) return;\n                    if (bottom + toggleH <= CAP) k = idx + 1;\n                });\n                m.visible = k;\n                m.collapsedH = m.itemBottoms[k - 1] + toggleH;\n            });\n        }\n\n        function currentH(m) {\n            if (m.visible === m.months.length) return m.fullH;\n            return state.expanded[m.year] === true ? m.fullH + m.toggleH : m.collapsedH;\n        }\n\n        \/* ================= Desktop rendering ================= *\/\n\n        function drawDesktop(meta, stageW, barEnd, yStart, yEnd) {\n            var topNeed = TOP_MIN, botNeed = BOT_MIN;\n            meta.forEach(function (m) {\n                var need = currentH(m) + CONN_GAP + EDGE_PAD;\n                if (m.side === 'top') { if (need > topNeed) topNeed = need; }\n                else { if (need > botNeed) botNeed = need; }\n            });\n            var barY = n1(topNeed);\n            var vbH = n1(topNeed + botNeed);\n            var gid = 'tl-grad-TlRb42';\n\n            var svg = '<svg class=\"tl-svg\" viewBox=\"0 0 ' + stageW + ' ' + vbH + '\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\">'\n                + '<defs><linearGradient id=\"' + gid + '\" x1=\"' + BAR_X0 + '\" y1=\"0\" x2=\"' + barEnd + '\" y2=\"0\" gradientUnits=\"userSpaceOnUse\">'\n                + '<stop stop-color=\"#28ADFF\"\/><stop offset=\"0.495\" stop-color=\"#FFCC00\"\/><stop offset=\"1\" stop-color=\"#BBCF00\"\/>'\n                + '<\/linearGradient><\/defs>'\n                + '<g transform=\"translate(0 ' + n1(barY - 211.5) + ')\">' + BUS_PATHS() + '<\/g>'\n                + '<path d=\"M' + BAR_X0 + ' ' + barY + 'H' + barEnd + '\" stroke=\"url(#' + gid + ')\" stroke-width=\"' + BAR_SW + '\" stroke-linecap=\"round\"\/>'\n                + '<text x=\"' + n1(BAR_X0 - YEAR_GAP_L) + '\" y=\"' + n1(barY + 12.3) + '\" text-anchor=\"end\" font-family=\"Montserrat, sans-serif\" font-size=\"' + YEAR_FS + '\" font-weight=\"600\" fill=\"#00B2DC\">' + yStart + '<\/text>'\n                + '<text x=\"' + n1(barEnd + YEAR_GAP_R) + '\" y=\"' + n1(barY + 12.3) + '\" text-anchor=\"start\" font-family=\"Montserrat, sans-serif\" font-size=\"' + YEAR_FS + '\" font-weight=\"600\" fill=\"#BBCF00\">' + yEnd + '<\/text>';\n\n            meta.forEach(function (m) {\n                var h = currentH(m);\n                var y1, y2;\n                if (m.side === 'top') { y1 = n1(barY - CONN_GAP); y2 = n1(barY - CONN_GAP - Math.max(20, h - 6)); }\n                else { y1 = n1(barY + CONN_GAP); y2 = n1(barY + CONN_GAP + Math.max(20, h - 6)); }\n                svg += '<line x1=\"' + n1(m.dotX) + '\" y1=\"' + y1 + '\" x2=\"' + n1(m.dotX) + '\" y2=\"' + y2 + '\" stroke=\"' + m.color + '\" stroke-width=\"' + CONN_SW + '\"\/>';\n            });\n            meta.forEach(function (m) {\n                svg += '<circle cx=\"' + n1(m.dotX) + '\" cy=\"' + barY + '\" r=\"' + DOT_R + '\" fill=\"' + m.color + '\" stroke=\"white\" stroke-width=\"' + DOT_SW + '\"\/>';\n            });\n            svg += '<\/svg>';\n\n            var clusters = meta.map(function (m) {\n                var pos = m.side === 'top'\n                    ? 'bottom:' + ux(botNeed + CONN_GAP - 6) + ';'\n                    : 'top:' + ux(topNeed + TEXT_DY) + ';';\n                var needToggle = m.visible < m.months.length;\n                var expanded = state.expanded[m.year] === true;\n                var visibleNow = expanded ? m.months.length : m.visible;\n                return '<div class=\"tl-cluster\" style=\"left:' + ux(m.textX) + ';width:' + ux(m.w) + ';' + pos + '--dot:' + m.color + '\">'\n                    + clusterInner(m, visibleNow, expanded, needToggle)\n                    + '<\/div>';\n            }).join('');\n\n            var arrows = '<button type=\"button\" class=\"tl-arrow tl-arrow--l\" style=\"top:' + ux(topNeed) + '\" aria-label=\"Zeitleiste nach links scrollen\">\u2039<\/button>'\n                + '<button type=\"button\" class=\"tl-arrow tl-arrow--r\" style=\"top:' + ux(topNeed) + '\" aria-label=\"Zeitleiste nach rechts scrollen\">\u203a<\/button>';\n\n            return '<div class=\"tl-wrap\">'\n                + '<div class=\"tl-scroll\" tabindex=\"0\" role=\"region\" aria-label=\"Zeitleiste der Rufbus-Meilensteine\">'\n                + '<div class=\"tl-stage\" style=\"width:' + ux(stageW) + ';height:' + ux(vbH) + '\">' + svg + clusters + '<\/div>'\n                + '<\/div>'\n                + '<div class=\"tl-fade tl-fade--l\"><\/div><div class=\"tl-fade tl-fade--r\"><\/div>'\n                + arrows\n                + '<\/div>';\n        }\n\n        \/* ================= Mobile rendering ================= *\/\n\n        \/* Mobile lists chronologically ascending, same as desktop *\/\n        function drawMobile(meta) {\n            var lastYear = meta[meta.length - 1].year;\n            var yEnd = END_JAHR >= lastYear ? END_JAHR : lastYear + 1;\n            var list = meta.map(function (m) {\n                return '<section class=\"tl-m__year\" style=\"--dot:' + m.color + '\">'\n                    + '<h3 class=\"tl-m__yr\">' + m.year + '<\/h3>'\n                    + m.months.map(function (mo) {\n                        return '<div class=\"tl-m__item\">'\n                            + '<p class=\"tl-m__date\">' + esc(mo.label) + '<\/p>'\n                            + mo.items.map(function (it) {\n                                return '<p class=\"tl-m__title\">' + esc(it.titel)\n                                    + (it.zusatz ? ' <span class=\"tl-m__zusatz\">(' + esc(it.zusatz) + ')<\/span>' : '')\n                                    + '<\/p>';\n                            }).join('')\n                            + '<\/div>';\n                    }).join('')\n                    + '<\/section>';\n            }).join('');\n            \/* closing end-year marker, like the desktop label right of the bar *\/\n            if (yEnd > lastYear) {\n                list += '<section class=\"tl-m__year tl-m__year--end\" style=\"--dot:#BBCF00\">'\n                    + '<h3 class=\"tl-m__yr\">' + yEnd + '<\/h3>'\n                    + '<\/section>';\n            }\n            \/* vehicle on top: it \"drives in\" at the oldest year *\/\n            return '<div class=\"tl-m\">'\n                + '<svg class=\"tl-m__bus\" viewBox=\"0 106.5 162 72\" aria-hidden=\"true\">' + BUS_PATHS() + '<\/svg>'\n                + '<div class=\"tl-m__list\">' + list + '<\/div>'\n                + '<\/div>';\n        }\n\n        \/* ================= Interaction (scroll mode) ================= *\/\n\n        function initScroll() {\n            var scroller = mount.querySelector('.tl-scroll');\n            var arrowL = mount.querySelector('.tl-arrow--l');\n            var arrowR = mount.querySelector('.tl-arrow--r');\n            var fadeL = mount.querySelector('.tl-fade--l');\n            var fadeR = mount.querySelector('.tl-fade--r');\n\n            function maxScroll() { return scroller.scrollWidth - scroller.clientWidth; }\n            function scrollable() { return maxScroll() > 4; }\n\n            function sync() {\n                var can = scrollable();\n                var x = scroller.scrollLeft;\n                var atStart = x <= 4;\n                var atEnd = x >= maxScroll() - 4;\n                arrowL.style.display = can ? (atStart ? 'none' : '') : 'none';\n                \/* right arrow stays visible at the end \u2014 it wraps back to the start *\/\n                arrowR.style.display = can ? '' : 'none';\n                fadeL.style.opacity = can ? (atStart ? 0 : 1) : 0;\n                fadeR.style.opacity = can ? (atEnd ? 0 : 1) : 0;\n            }\n            sync();\n            scroller.addEventListener('scroll', sync);\n\n            arrowL.addEventListener('click', function () {\n                scroller.scrollBy({ left: -scroller.clientWidth * 0.6, behavior: 'smooth' });\n            });\n            arrowR.addEventListener('click', function () {\n                if (scroller.scrollLeft >= maxScroll() - 4) {\n                    scroller.scrollTo({ left: 0, behavior: 'smooth' }); \/* wrap around *\/\n                } else {\n                    scroller.scrollBy({ left: scroller.clientWidth * 0.6, behavior: 'smooth' });\n                }\n            });\n\n            \/* Mouse wheel -> horizontal; releases to normal page scroll at both ends *\/\n            scroller.addEventListener('wheel', function (ev) {\n                if (!scrollable()) return;\n                var d = Math.abs(ev.deltaX) > Math.abs(ev.deltaY) ? ev.deltaX : ev.deltaY;\n                if (d === 0) return;\n                var target = Math.max(0, Math.min(maxScroll(), scroller.scrollLeft + d));\n                if (target !== scroller.scrollLeft) {\n                    ev.preventDefault();\n                    scroller.scrollLeft = target;\n                }\n            }, { passive: false });\n\n            scroller.addEventListener('keydown', function (ev) {\n                if (ev.key === 'ArrowLeft') scroller.scrollBy({ left: -160, behavior: 'smooth' });\n                if (ev.key === 'ArrowRight') scroller.scrollBy({ left: 160, behavior: 'smooth' });\n            });\n\n            return scroller;\n        }\n\n        \/* ================= Build ================= *\/\n\n        function build() {\n            var yrs = state.years;\n            var n = yrs.length;\n            if (!n) {\n                mount.innerHTML = '<p class=\"tl-empty\">Noch keine Meilensteine eingetragen.<\/p>';\n                return;\n            }\n            var barLen = Math.max(BAR_MIN, n * PER_YEAR);\n            var barEnd = BAR_X0 + barLen;\n            var stageW = barEnd + RIGHT_PAD;\n            \/* scroll mode: extra tail so the wrap-around arrow never covers the end-year label *\/\n            if (stageW > VIEW_W) stageW += 55;\n            var meta = yrs.map(function (y, i) {\n                var t = n <= 1 ? 0 : i \/ (n - 1);\n                var frac = DOT_POS.length === n ? DOT_POS[i] : (i + 0.5) \/ n;\n                var dotX = BAR_X0 + frac * barLen;\n                var textX = dotX + TEXT_DX;\n                return {\n                    year: y.year, months: y.months,\n                    color: colorAt(t), dotX: dotX, textX: textX,\n                    w: Math.min(CLUSTER_W, stageW - textX - EDGE_PAD),\n                    side: i % 2 === 0 ? 'bottom' : 'top'\n                };\n            });\n            var yStart = meta[0].year;\n            var lastYear = meta[n - 1].year;\n            var yEnd = END_JAHR >= lastYear ? END_JAHR : lastYear + 1;\n\n            measure(meta);\n\n            var keepScroll = 0;\n            var oldScroller = mount.querySelector('.tl-scroll');\n            if (oldScroller) keepScroll = oldScroller.scrollLeft;\n\n            mount.innerHTML = drawDesktop(meta, stageW, barEnd, yStart, yEnd) + drawMobile(meta);\n            var scroller = initScroll();\n            if (keepScroll > 0) {\n                scroller.scrollLeft = keepScroll;\n            } else if (!state.scrolledOnce) {\n                \/* initial position: current year if present, otherwise the last year *\/\n                state.scrolledOnce = true;\n                var nowYear = new Date().getFullYear();\n                var target = meta[n - 1];\n                meta.forEach(function (m) { if (m.year === nowYear) target = m; });\n                var max = scroller.scrollWidth - scroller.clientWidth;\n                if (max > 4) {\n                    scroller.scrollLeft = Math.max(0, Math.min(max, target.dotX * state.u - scroller.clientWidth \/ 2));\n                }\n            }\n            scroller.dispatchEvent(new Event('scroll')); \/* refresh arrows\/fades *\/\n\n            [].forEach.call(mount.querySelectorAll('.tl-more'), function (btn) {\n                btn.addEventListener('click', function () {\n                    var y = btn.getAttribute('data-year');\n                    state.expanded[y] = state.expanded[y] === true ? false : true;\n                    build();\n                });\n            });\n        }\n\n        function setU() {\n            var w = container.clientWidth - 16; \/* inner width (2 x 8px padding) *\/\n            if (w < 200) w = 200;\n            state.u = w \/ VIEW_W;\n            container.style.setProperty('--u', String(state.u));\n        }\n\n        function start(items) {\n            state.years = groupYears(items);\n            status.style.display = 'none';\n            setU();\n            build();\n        }\n\n        setU();\n        if (typeof ResizeObserver === 'function') {\n            new ResizeObserver(setU).observe(container);\n        }\n        \/* safety net: themes may finish layout after the first measurement *\/\n        window.addEventListener('resize', setU);\n        window.addEventListener('load', setU);\n\n        \/* window.VMV_TIMELINE_DATA (array of {datum, titel, zusatz}) skips the API\n           call \u2014 used by the local preview scenarios *\/\n        if (window.VMV_TIMELINE_DATA) {\n            start(normalize(window.VMV_TIMELINE_DATA));\n        } else {\n            loadFromApi().then(start).catch(function (err) {\n                console.warn('[Timeline] REST-API nicht nutzbar (' + err.message + ') \u2013 eingebaute Fallback-Daten aktiv.');\n                start(normalize(FALLBACK));\n            });\n        }\n\n    })(document.currentScript ? document.currentScript.parentElement : document.querySelector('[data-vmv-timeline=\"rufbus\"]'));<\/script>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group is-style-default has-global-padding is-content-justification-left is-layout-constrained wp-container-core-group-is-layout-53039f06 wp-block-group-is-layout-constrained\" style=\"border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-left-radius:0px;border-bottom-right-radius:0px;min-height:30px;margin-top:var(--wp--preset--spacing--60);margin-bottom:var(--wp--preset--spacing--60);padding-top:var(--wp--preset--spacing--40);padding-right:var(--wp--preset--spacing--0);padding-bottom:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--0)\">\n<p class=\"has-primary-color has-text-color has-link-color has-large-font-size wp-elements-3ff7159ccbbb61ffde57c4800513ad65 wp-block-paragraph\" style=\"font-style:normal;font-weight:600\">Weitere Informationen und Downloads:<\/p>\n\n\n\n<h4 class=\"wp-block-heading has-primary-color has-text-color has-link-color has-medium-font-size wp-elements-f34f150f5d039c39452ac04066e56fe4\" style=\"padding-top:var(--wp--preset--spacing--0);padding-right:var(--wp--preset--spacing--0);padding-bottom:var(--wp--preset--spacing--0);padding-left:var(--wp--preset--spacing--0);font-style:normal;font-weight:700\">Ihr Vorteil f\u00fcr die Region<\/h4>\n<\/div>\n\n\n\n<ul style=\"margin-top:var(--wp--preset--spacing--60);margin-bottom:var(--wp--preset--spacing--60);padding-right:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50);line-height:1.8;text-decoration:none\" class=\"wp-block-list .custom-list has-custom-css wp-custom-css-267d2833\">\n<li style=\"font-style:normal;font-weight:400\"><a href=\"https:\/\/www.vmv-mbh.de\/die-vmv\/foerderung\/investitionsfoerderung-von-regiobusverkehren\/\" target=\"_blank\" rel=\"noreferrer noopener\">F\u00f6rderung Regiobusverkehre<\/a><\/li>\n\n\n\n<li class=\"has-montserrat-font-family has-medium-font-size\" style=\"font-style:normal;font-weight:400\"><a href=\"https:\/\/www.vmv-mbh.de\/die-vmv\/foerderung\/investitionsfoerderung-von-rufbusverkehren\/\" target=\"_blank\" rel=\"noreferrer noopener\">F\u00f6rderung Rufbusverkehre<\/a><\/li>\n\n\n\n<li class=\"has-montserrat-font-family has-medium-font-size\" style=\"font-style:normal;font-weight:400\"><a href=\"https:\/\/www.vmv-mbh.de\/die-vmv\/foerderung\/foerderung-individueller-bedarfsverkehr-2\/\" target=\"_blank\" rel=\"noreferrer noopener\">F\u00f6rderung Individueller Bedarfsverkehr<\/a><\/li>\n\n\n\n<li class=\"has-montserrat-font-family has-medium-font-size\" style=\"font-style:normal;font-weight:400\"><a href=\"https:\/\/www.vmv-mbh.de\/die-vmv\/foerderung\/investitionsfoerderung\/\" target=\"_blank\" rel=\"noreferrer noopener\">Investitionsf\u00f6rderung<\/a><\/li>\n\n\n\n<li class=\"has-montserrat-font-family has-medium-font-size\" style=\"font-style:normal;font-weight:400\"><a href=\"https:\/\/www.vmv-mbh.de\/die-vmv\/foerderung\/investitionsfoerderung\/\" target=\"_blank\" rel=\"noreferrer noopener\">SPNV Ersatzverkehr<\/a><\/li>\n\n\n\n<li class=\"has-montserrat-font-family has-medium-font-size\" style=\"font-style:normal;font-weight:400\"><a href=\"https:\/\/www.vmv-mbh.de\/die-vmv\/foerderung\/downloads\/\" target=\"_blank\" rel=\"noreferrer noopener\">Aktuelle Regelungen und Gesetzesgrundlagen zum Download<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Individuelle Mobilit\u00e4t f\u00fcr jeden Bedarf Der Rufbus MV erg\u00e4nzt den bestehenden \u00f6ffentlichen Personennahverkehr in Mecklenburg-Vorpommern und erm\u00f6glicht eine bequeme und zuverl\u00e4ssige Bef\u00f6rderung auf der \u201eletzten Meile\u201c. In fast allen Teilen des Landes stehen flexible Bef\u00f6rderungsoptionen zur Verf\u00fcgung, und in Regionen ohne Rufbus-Angebot wird dieser schrittweise eingef\u00fchrt. Wir informieren Sie laufend \u00fcber die aktuellen Entwicklungen. Planen [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":0,"parent":5879,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"mi-filters":[],"class_list":["post-5819","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Rufbus - MV f\u00e4hrt gut<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/mvfaehrtgut.de\/en\/mobilitaetsoffensive\/rufbus\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Rufbus - MV f\u00e4hrt gut\" \/>\n<meta property=\"og:description\" content=\"Individuelle Mobilit\u00e4t f\u00fcr jeden Bedarf Der Rufbus MV erg\u00e4nzt den bestehenden \u00f6ffentlichen Personennahverkehr in Mecklenburg-Vorpommern und erm\u00f6glicht eine bequeme und zuverl\u00e4ssige Bef\u00f6rderung auf der \u201eletzten Meile\u201c. In fast allen Teilen des Landes stehen flexible Bef\u00f6rderungsoptionen zur Verf\u00fcgung, und in Regionen ohne Rufbus-Angebot wird dieser schrittweise eingef\u00fchrt. Wir informieren Sie laufend \u00fcber die aktuellen Entwicklungen. Planen [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/mvfaehrtgut.de\/en\/mobilitaetsoffensive\/rufbus\/\" \/>\n<meta property=\"og:site_name\" content=\"MV f\u00e4hrt gut\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-21T11:39:18+00:00\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/mvfaehrtgut.de\\\/mobilitaetsoffensive\\\/rufbus\\\/\",\"url\":\"https:\\\/\\\/mvfaehrtgut.de\\\/mobilitaetsoffensive\\\/rufbus\\\/\",\"name\":\"Rufbus - MV f\u00e4hrt gut\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mvfaehrtgut.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/mvfaehrtgut.de\\\/mobilitaetsoffensive\\\/rufbus\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/mvfaehrtgut.de\\\/mobilitaetsoffensive\\\/rufbus\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/mvfaehrtgut.de\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/icon-rufbus-56.svg\",\"datePublished\":\"2026-06-22T15:41:02+00:00\",\"dateModified\":\"2026-07-21T11:39:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mvfaehrtgut.de\\\/mobilitaetsoffensive\\\/rufbus\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/mvfaehrtgut.de\\\/mobilitaetsoffensive\\\/rufbus\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/mvfaehrtgut.de\\\/mobilitaetsoffensive\\\/rufbus\\\/#primaryimage\",\"url\":\"https:\\\/\\\/mvfaehrtgut.de\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/icon-rufbus-56.svg\",\"contentUrl\":\"https:\\\/\\\/mvfaehrtgut.de\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/icon-rufbus-56.svg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mvfaehrtgut.de\\\/mobilitaetsoffensive\\\/rufbus\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"MV f\u00e4hrt gut\",\"item\":\"https:\\\/\\\/mvfaehrtgut.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mobilit\u00e4tsoffensive\",\"item\":\"https:\\\/\\\/mvfaehrtgut.de\\\/mobilitaetsoffensive\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Rufbus\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/mvfaehrtgut.de\\\/#website\",\"url\":\"https:\\\/\\\/mvfaehrtgut.de\\\/\",\"name\":\"MV f\u00e4hrt gut\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/mvfaehrtgut.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/mvfaehrtgut.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/mvfaehrtgut.de\\\/#organization\",\"name\":\"VMV \u2013 Verkehrsgesellschaft Mecklenburg-Vorpommern mbH\",\"url\":\"https:\\\/\\\/mvfaehrtgut.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/mvfaehrtgut.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/mvfaehrtgut.de\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/MV_faehrt_gut_mit_scrolleffekt.svg\",\"contentUrl\":\"https:\\\/\\\/mvfaehrtgut.de\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/MV_faehrt_gut_mit_scrolleffekt.svg\",\"caption\":\"VMV \u2013 Verkehrsgesellschaft Mecklenburg-Vorpommern mbH\"},\"image\":{\"@id\":\"https:\\\/\\\/mvfaehrtgut.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Rufbus - MV f\u00e4hrt gut","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/mvfaehrtgut.de\/en\/mobilitaetsoffensive\/rufbus\/","og_locale":"en_GB","og_type":"article","og_title":"Rufbus - MV f\u00e4hrt gut","og_description":"Individuelle Mobilit\u00e4t f\u00fcr jeden Bedarf Der Rufbus MV erg\u00e4nzt den bestehenden \u00f6ffentlichen Personennahverkehr in Mecklenburg-Vorpommern und erm\u00f6glicht eine bequeme und zuverl\u00e4ssige Bef\u00f6rderung auf der \u201eletzten Meile\u201c. In fast allen Teilen des Landes stehen flexible Bef\u00f6rderungsoptionen zur Verf\u00fcgung, und in Regionen ohne Rufbus-Angebot wird dieser schrittweise eingef\u00fchrt. Wir informieren Sie laufend \u00fcber die aktuellen Entwicklungen. Planen [&hellip;]","og_url":"https:\/\/mvfaehrtgut.de\/en\/mobilitaetsoffensive\/rufbus\/","og_site_name":"MV f\u00e4hrt gut","article_modified_time":"2026-07-21T11:39:18+00:00","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/mvfaehrtgut.de\/mobilitaetsoffensive\/rufbus\/","url":"https:\/\/mvfaehrtgut.de\/mobilitaetsoffensive\/rufbus\/","name":"Rufbus - MV f\u00e4hrt gut","isPartOf":{"@id":"https:\/\/mvfaehrtgut.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/mvfaehrtgut.de\/mobilitaetsoffensive\/rufbus\/#primaryimage"},"image":{"@id":"https:\/\/mvfaehrtgut.de\/mobilitaetsoffensive\/rufbus\/#primaryimage"},"thumbnailUrl":"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/icon-rufbus-56.svg","datePublished":"2026-06-22T15:41:02+00:00","dateModified":"2026-07-21T11:39:18+00:00","breadcrumb":{"@id":"https:\/\/mvfaehrtgut.de\/mobilitaetsoffensive\/rufbus\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/mvfaehrtgut.de\/mobilitaetsoffensive\/rufbus\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/mvfaehrtgut.de\/mobilitaetsoffensive\/rufbus\/#primaryimage","url":"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/icon-rufbus-56.svg","contentUrl":"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2026\/06\/icon-rufbus-56.svg"},{"@type":"BreadcrumbList","@id":"https:\/\/mvfaehrtgut.de\/mobilitaetsoffensive\/rufbus\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"MV f\u00e4hrt gut","item":"https:\/\/mvfaehrtgut.de\/"},{"@type":"ListItem","position":2,"name":"Mobilit\u00e4tsoffensive","item":"https:\/\/mvfaehrtgut.de\/mobilitaetsoffensive\/"},{"@type":"ListItem","position":3,"name":"Rufbus"}]},{"@type":"WebSite","@id":"https:\/\/mvfaehrtgut.de\/#website","url":"https:\/\/mvfaehrtgut.de\/","name":"MV on the move","description":"","publisher":{"@id":"https:\/\/mvfaehrtgut.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/mvfaehrtgut.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/mvfaehrtgut.de\/#organization","name":"VMV \u2013 Verkehrsgesellschaft Mecklenburg-Vorpommern mbH","url":"https:\/\/mvfaehrtgut.de\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/mvfaehrtgut.de\/#\/schema\/logo\/image\/","url":"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2025\/08\/MV_faehrt_gut_mit_scrolleffekt.svg","contentUrl":"https:\/\/mvfaehrtgut.de\/wp-content\/uploads\/2025\/08\/MV_faehrt_gut_mit_scrolleffekt.svg","caption":"VMV \u2013 Verkehrsgesellschaft Mecklenburg-Vorpommern mbH"},"image":{"@id":"https:\/\/mvfaehrtgut.de\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/mvfaehrtgut.de\/en\/wp-json\/wp\/v2\/pages\/5819","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mvfaehrtgut.de\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mvfaehrtgut.de\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mvfaehrtgut.de\/en\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/mvfaehrtgut.de\/en\/wp-json\/wp\/v2\/comments?post=5819"}],"version-history":[{"count":166,"href":"https:\/\/mvfaehrtgut.de\/en\/wp-json\/wp\/v2\/pages\/5819\/revisions"}],"predecessor-version":[{"id":6703,"href":"https:\/\/mvfaehrtgut.de\/en\/wp-json\/wp\/v2\/pages\/5819\/revisions\/6703"}],"up":[{"embeddable":true,"href":"https:\/\/mvfaehrtgut.de\/en\/wp-json\/wp\/v2\/pages\/5879"}],"wp:attachment":[{"href":"https:\/\/mvfaehrtgut.de\/en\/wp-json\/wp\/v2\/media?parent=5819"}],"wp:term":[{"taxonomy":"mi-filters","embeddable":true,"href":"https:\/\/mvfaehrtgut.de\/en\/wp-json\/wp\/v2\/mi-filters?post=5819"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}