{"id":4532,"date":"2024-11-17T19:23:18","date_gmt":"2024-11-17T18:23:18","guid":{"rendered":"https:\/\/fahrtauglich.ch\/?page_id=4532"},"modified":"2026-10-12T12:00:02","modified_gmt":"2026-10-12T10:00:02","slug":"trail-making-test","status":"publish","type":"page","link":"https:\/\/fahrtauglich.ch\/fr\/praxisportal\/trail-making-test\/","title":{"rendered":"Trail Making Test"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"4532\" class=\"elementor elementor-4532\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-279daf0 e-flex e-con-boxed e-con e-parent\" data-id=\"279daf0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1f2f64f elementor-widget elementor-widget-html\" data-id=\"1f2f64f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!--\r\n    Trail Making Test \u2014 fahrtauglich.ch\/praxisportal\/trail-making-test\/\r\n    Einbau: Inhalt dieser Datei vollstaendig in EIN Elementor-HTML-Widget einfuegen.\r\n    Das Snippet deckt die ganze Seite zwischen Header und Footer ab (Titel,\r\n    Einleitung mit Link auf trainmybrain.ch, Spiel, Spielanleitung, Texte, Quelle).\r\n    Alle uebrigen Elementor-Widgets der Seite werden geloescht. Kein\r\n    <html>\/<head>\/<body>: Header und Footer liefert das Theme.\r\n\r\n    Grundlage: trainmybrain-trailmaking.html. Spiellogik neu aufgebaut\r\n    (2026-10-12), weil dort vier Fehler stecken:\r\n      - jeder Klick auf \u00abNaechste Aufgabe\u00bb startete einen weiteren Timer\r\n      - Hoehenaenderung des Fensters (mobile Adressleiste) leerte das Spielfeld\r\n      - auf kleinen Bildschirmen fehlten Kreise (z. B. 9 statt 15)\r\n      - gezaehlt wurde nur die Anzahl Verbindungen: 14x 1->2 galt als geloest\r\n    Verhalten wie beim echten TMT (Entscheid User 2026-10-12): durchgehende\r\n    Linie, bei Fehler zurueck zum letzten richtigen Kreis, Zeit laeuft weiter.\r\n\r\n    Optik: fahrtauglich.ch \u2014 Poppins, Gelb #FFBF00, Flaechen #F3F5F8, Pill-Buttons.\r\n    Alles CSS haengt an #ftt, damit nichts in die Elementor-Seite durchschlaegt.\r\n-->\r\n<style>\r\n    #ftt {\r\n        --ftt-gelb: #FFBF00;\r\n        --ftt-gelb-dunkel: #E6AB00;\r\n        --ftt-schwarz: #000000;\r\n        --ftt-text: #1F2937;\r\n        --ftt-text-2: #4B5563;\r\n        --ftt-flaeche: #F3F5F8;\r\n        --ftt-linie: #C8D5DC;\r\n        --ftt-gruen: #047857;\r\n        --ftt-fehler: #B91C1C;\r\n\r\n        font-family: 'Poppins', sans-serif;\r\n        color: var(--ftt-text);\r\n        line-height: 1.5;\r\n        width: 100%;\r\n        max-width: 850px;\r\n        margin: 20px auto 60px;\r\n        box-sizing: border-box;\r\n    }\r\n    #ftt *, #ftt *::before, #ftt *::after { box-sizing: border-box; }\r\n    #ftt [hidden] { display: none !important; }\r\n\r\n    \/* ===== Seitenkopf \u2014 Masse wie die bisherigen Elementor-Widgets ===== *\/\r\n    #ftt .ftt-titel {\r\n        margin: 0;\r\n        font-family: inherit;\r\n        font-size: 48px;\r\n        font-weight: 600;\r\n        line-height: 1.2;\r\n        letter-spacing: 0;\r\n        text-align: center;\r\n        color: var(--ftt-schwarz);\r\n    }\r\n    #ftt .ftt-intro {\r\n        max-width: 760px;\r\n        margin: 50px auto 0;\r\n        font-size: 20px;\r\n        font-weight: 300;\r\n        line-height: 1.5;\r\n        text-align: center;\r\n        color: var(--ftt-schwarz);\r\n    }\r\n    \/* Links: schwarz mit gelber Unterstreichung \u2014 Gelb als Schrift auf Weiss\r\n       hielte nur 1.65:1. *\/\r\n    #ftt .ftt-intro a,\r\n    #ftt .ftt-box a {\r\n        color: var(--ftt-schwarz);\r\n        font-weight: 400;\r\n        text-decoration: underline;\r\n        text-decoration-color: var(--ftt-gelb);\r\n        text-decoration-thickness: 3px;\r\n        text-underline-offset: 3px;\r\n        overflow-wrap: anywhere;\r\n    }\r\n    #ftt .ftt-intro a:hover, #ftt .ftt-box a:hover,\r\n    #ftt .ftt-intro a:focus, #ftt .ftt-box a:focus { color: var(--ftt-schwarz); background: rgba(255, 191, 0, 0.18); }\r\n    #ftt a:focus-visible { outline: 3px solid var(--ftt-schwarz); outline-offset: 2px; }\r\n\r\n    \/* ===== Spielbereich ===== *\/\r\n    #ftt .ftt-spiel {\r\n        max-width: 680px;\r\n        margin: 34px auto 0;\r\n        text-align: center;\r\n    }\r\n\r\n    \/* Spielkarte (Optik wie Wordle auf fahrtauglich.ch) *\/\r\n    #ftt .ftt-karte {\r\n        position: relative;\r\n        overflow: hidden;\r\n        background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);\r\n        border: 2px solid #dee2e6;\r\n        border-radius: 20px;\r\n        box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);\r\n        padding: 30px;\r\n    }\r\n    #ftt .ftt-karte::before {\r\n        content: '';\r\n        position: absolute;\r\n        top: -50%; left: -50%;\r\n        width: 200%; height: 200%;\r\n        background: radial-gradient(circle, rgba(52, 58, 64, 0.05) 1px, transparent 1px);\r\n        background-size: 30px 30px;\r\n        animation: ftt-hintergrund 25s linear infinite;\r\n        z-index: 0;\r\n        pointer-events: none;\r\n    }\r\n    @keyframes ftt-hintergrund {\r\n        0%   { transform: translate(0, 0) rotate(0deg); }\r\n        100% { transform: translate(-30px, -30px) rotate(360deg); }\r\n    }\r\n    #ftt .ftt-panel {\r\n        position: relative;\r\n        z-index: 1;\r\n        display: flex;\r\n        flex-direction: column;\r\n        align-items: center;\r\n        gap: 20px;\r\n    }\r\n\r\n    #ftt .ftt-text {\r\n        max-width: 520px;\r\n        margin: 0;\r\n        font-size: 1.05rem;\r\n        color: var(--ftt-text);\r\n    }\r\n    #ftt .ftt-start-knoepfe {\r\n        display: flex;\r\n        gap: 12px;\r\n        flex-wrap: wrap;\r\n        justify-content: center;\r\n    }\r\n    #ftt .ftt-bestzeiten {\r\n        margin: 0;\r\n        font-size: 0.9rem;\r\n        color: var(--ftt-text-2);\r\n    }\r\n\r\n    \/* Statusleiste: Zeit, Fehler, naechster Kreis *\/\r\n    #ftt .ftt-status {\r\n        width: 100%;\r\n        display: grid;\r\n        grid-template-columns: repeat(3, 1fr);\r\n        gap: 10px;\r\n        padding: 12px 16px;\r\n        background: rgba(255, 255, 255, 0.7);\r\n        border: 1px solid rgba(0, 0, 0, 0.05);\r\n        border-radius: 12px;\r\n    }\r\n    #ftt .ftt-stat-zahl {\r\n        display: block;\r\n        font-size: 1.6rem;\r\n        font-weight: 600;\r\n        line-height: 1.15;\r\n        color: var(--ftt-text);\r\n        font-variant-numeric: tabular-nums;\r\n    }\r\n    #ftt .ftt-stat-label {\r\n        display: block;\r\n        margin-top: 2px;\r\n        font-size: 0.72rem;\r\n        text-transform: uppercase;\r\n        letter-spacing: 1px;\r\n        color: var(--ftt-text-2);\r\n    }\r\n\r\n    #ftt .ftt-meldung {\r\n        min-height: 1.5em;\r\n        margin: 0;\r\n        font-size: 1rem;\r\n        font-weight: 500;\r\n        color: var(--ftt-text);\r\n    }\r\n    #ftt .ftt-meldung.fehler  { color: var(--ftt-fehler); }\r\n    #ftt .ftt-meldung.erfolg  { color: var(--ftt-gruen); }\r\n\r\n    \/* Spielfeld *\/\r\n    #ftt .ftt-brett {\r\n        width: 100%;\r\n    }\r\n    #ftt .ftt-canvas {\r\n        display: block;\r\n        width: 100%;            \/* JS setzt die genaue Breite *\/\r\n        margin: 0 auto;\r\n        background: #ffffff;\r\n        border: 1px solid rgba(0, 0, 0, 0.08);\r\n        border-radius: 15px;\r\n        box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);\r\n        touch-action: none;   \/* Ziehen auf dem Spielfeld scrollt nicht die Seite *\/\r\n        cursor: crosshair;\r\n        -webkit-user-select: none;\r\n        user-select: none;\r\n    }\r\n\r\n    \/* ===== Buttons (Pill-Stil der fahrtauglich.ch-Buttons) ===== *\/\r\n    #ftt .ftt-kontrollen {\r\n        display: flex;\r\n        justify-content: center;\r\n        gap: 12px;\r\n        flex-wrap: wrap;\r\n    }\r\n    #ftt .ftt-knopf {\r\n        -webkit-appearance: none;\r\n        appearance: none;\r\n        margin: 0;\r\n        display: inline-flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        min-height: 48px;\r\n        padding: 10px 28px;\r\n        background: var(--ftt-gelb);\r\n        border: 2px solid var(--ftt-gelb);\r\n        border-radius: 100px;\r\n        box-shadow: none;\r\n        font-family: inherit;\r\n        font-size: 1rem;\r\n        font-weight: 500;\r\n        line-height: 1.2;\r\n        text-transform: none;\r\n        text-decoration: none;\r\n        color: var(--ftt-schwarz);\r\n        cursor: pointer;\r\n        transition: background 0.2s ease, border-color 0.2s ease, transform 0.2s ease;\r\n    }\r\n    #ftt .ftt-knopf:hover,\r\n    #ftt .ftt-knopf:focus {\r\n        background: var(--ftt-gelb-dunkel);\r\n        border-color: var(--ftt-gelb-dunkel);\r\n        color: var(--ftt-schwarz);\r\n    }\r\n    #ftt .ftt-knopf:hover { transform: translateY(-1px); }\r\n    #ftt .ftt-knopf-hell { background: #ffffff; border-color: var(--ftt-schwarz); }\r\n    #ftt .ftt-knopf-hell:hover,\r\n    #ftt .ftt-knopf-hell:focus { background: var(--ftt-flaeche); border-color: var(--ftt-schwarz); }\r\n    #ftt .ftt-knopf:disabled { opacity: 0.45; cursor: not-allowed; transform: none; }\r\n\r\n    #ftt .ftt-knopf:focus-visible,\r\n    #ftt .ftt-modal-schliessen:focus-visible,\r\n    #ftt summary:focus-visible {\r\n        outline: 3px solid var(--ftt-schwarz);\r\n        outline-offset: 2px;\r\n    }\r\n\r\n    \/* ===== Spielanleitung ===== *\/\r\n    #ftt .ftt-anleitung {\r\n        margin-top: 24px;\r\n        text-align: left;\r\n        background: #ffffff;\r\n        border-radius: 8px;\r\n        box-shadow: 0 0 10px rgba(0, 0, 0, 0.25);\r\n        padding: 15px 18px;\r\n    }\r\n    #ftt .ftt-anleitung summary {\r\n        cursor: pointer;\r\n        list-style: none;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: space-between;\r\n        gap: 1rem;\r\n        padding: 4px 0;\r\n        font-size: 1.15rem;\r\n        font-weight: 600;\r\n        color: var(--ftt-schwarz);\r\n        user-select: none;\r\n    }\r\n    #ftt .ftt-anleitung summary::-webkit-details-marker { display: none; }\r\n    #ftt .ftt-chev { width: 20px; height: 20px; flex: 0 0 auto; transition: transform 0.2s ease; }\r\n    #ftt .ftt-anleitung[open] .ftt-chev { transform: rotate(180deg); }\r\n    #ftt .ftt-anleitung-liste {\r\n        list-style: none;\r\n        margin: 12px 0 4px;\r\n        padding: 0;\r\n        display: grid;\r\n        gap: 8px;\r\n    }\r\n    #ftt .ftt-anleitung-liste li {\r\n        margin: 0;\r\n        padding: 10px 14px;\r\n        background: var(--ftt-flaeche);\r\n        border-left: 3px solid var(--ftt-gelb);\r\n        border-radius: 6px;\r\n        font-size: 0.95rem;\r\n        font-weight: 300;\r\n        line-height: 1.55;\r\n        color: var(--ftt-schwarz);\r\n    }\r\n    #ftt .ftt-anleitung-liste li strong { font-weight: 600; }\r\n\r\n    \/* ===== Textabschnitte (Kartenstil der bisherigen Textboxen) ===== *\/\r\n    #ftt .ftt-abschnitt { margin-top: 70px; }\r\n    #ftt .ftt-abschnitt h2 {\r\n        margin: 0 0 20px;\r\n        font-family: inherit;\r\n        font-size: 36px;\r\n        font-weight: 600;\r\n        line-height: 1.2;\r\n        letter-spacing: 0;\r\n        text-transform: none;\r\n        text-align: center;\r\n        color: var(--ftt-schwarz);\r\n    }\r\n    #ftt .ftt-box {\r\n        background: #ffffff;\r\n        border-radius: 8px;\r\n        box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\r\n        padding: 15px 20px;\r\n        font-size: 22px;\r\n        font-weight: 300;\r\n        line-height: 1.5;\r\n        color: var(--ftt-schwarz);\r\n        text-align: left;\r\n    }\r\n    #ftt .ftt-box p { margin: 0 0 14px; }\r\n    #ftt .ftt-box p:last-child { margin-bottom: 0; }\r\n    #ftt .ftt-box strong { font-weight: 500; }\r\n\r\n    #ftt .ftt-tipps { margin: 0; padding-left: 1.2em; }\r\n    #ftt .ftt-tipps li { margin: 0 0 14px; padding-left: 0.2em; }\r\n    #ftt .ftt-tipps li:last-child { margin-bottom: 0; }\r\n    #ftt .ftt-tipps li::marker { color: var(--ftt-gelb-dunkel); }\r\n    #ftt .ftt-tipps strong { display: block; }\r\n\r\n    #ftt .ftt-nutzen { list-style: none; margin: 6px 0 14px; padding: 0; }\r\n    #ftt .ftt-nutzen li {\r\n        display: grid;\r\n        grid-template-columns: 2.4em 1fr;\r\n        gap: 0 0.6em;\r\n        padding: 14px 0;\r\n        border-top: 1px solid var(--ftt-linie);\r\n    }\r\n    #ftt .ftt-nutzen li:last-child { border-bottom: 1px solid var(--ftt-linie); }\r\n    #ftt .ftt-nutzen-nr { font-weight: 600; line-height: 1.5; color: var(--ftt-gelb-dunkel); }\r\n    #ftt .ftt-nutzen strong { display: block; }\r\n    #ftt .ftt-vermerk {\r\n        padding: 10px 14px;\r\n        background: var(--ftt-flaeche);\r\n        border-left: 3px solid var(--ftt-gelb);\r\n        border-radius: 6px;\r\n        font-size: 0.85em;\r\n    }\r\n    #ftt .ftt-quellen-titel { margin-top: 20px !important; font-weight: 500; }\r\n    #ftt .ftt-quellen { list-style: none; margin: 0; padding: 0; font-size: 0.8em; }\r\n    #ftt .ftt-quellen li { margin: 0 0 10px; }\r\n    #ftt .ftt-quellen li:last-child { margin-bottom: 0; }\r\n\r\n    \/* ===== Dialog ===== *\/\r\n    #ftt .ftt-modal {\r\n        position: fixed;\r\n        inset: 0;\r\n        z-index: 100000;\r\n        display: none;\r\n        align-items: center;\r\n        justify-content: center;\r\n        padding: 20px;\r\n    }\r\n    #ftt .ftt-modal.active { display: flex; }\r\n    #ftt .ftt-modal-hintergrund {\r\n        position: absolute;\r\n        inset: 0;\r\n        background: rgba(0, 0, 0, 0.4);\r\n        backdrop-filter: blur(5px);\r\n    }\r\n    #ftt .ftt-modal-inhalt {\r\n        position: relative;\r\n        width: 100%;\r\n        max-width: 420px;\r\n        max-height: 85vh;\r\n        overflow-y: auto;\r\n        background: #ffffff;\r\n        border-radius: 15px;\r\n        box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);\r\n        padding: 32px 28px 28px;\r\n        text-align: center;\r\n        animation: ftt-modal-ein 0.25s ease;\r\n    }\r\n    @keyframes ftt-modal-ein {\r\n        from { opacity: 0; transform: scale(0.96) translateY(12px); }\r\n        to   { opacity: 1; transform: none; }\r\n    }\r\n    #ftt .ftt-modal-schliessen {\r\n        -webkit-appearance: none;\r\n        appearance: none;\r\n        position: absolute;\r\n        top: 8px;\r\n        right: 8px;\r\n        width: 44px;\r\n        height: 44px;\r\n        margin: 0;\r\n        padding: 0;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        background: none;\r\n        border: none;\r\n        border-radius: 50%;\r\n        font-family: inherit;\r\n        font-size: 28px;\r\n        line-height: 1;\r\n        color: #6B7280;\r\n        cursor: pointer;\r\n    }\r\n    #ftt .ftt-modal-schliessen:hover,\r\n    #ftt .ftt-modal-schliessen:focus { background: var(--ftt-flaeche); color: #374151; }\r\n    #ftt .ftt-modal h2 {\r\n        margin: 0 0 8px;\r\n        font-family: inherit;\r\n        font-size: 1.75rem;\r\n        font-weight: 600;\r\n        line-height: 1.2;\r\n        color: var(--ftt-text);\r\n    }\r\n    #ftt .ftt-modal p { margin: 0 0 6px; color: var(--ftt-text-2); }\r\n    #ftt .ftt-ergebnis {\r\n        display: flex;\r\n        justify-content: center;\r\n        gap: 28px;\r\n        margin: 18px 0 10px;\r\n        flex-wrap: wrap;\r\n    }\r\n    #ftt .ftt-ergebnis strong {\r\n        display: block;\r\n        font-size: 2rem;\r\n        font-weight: 700;\r\n        line-height: 1.1;\r\n        color: var(--ftt-schwarz);\r\n        font-variant-numeric: tabular-nums;\r\n    }\r\n    #ftt .ftt-ergebnis span { font-size: 0.85rem; color: var(--ftt-text-2); }\r\n    #ftt .ftt-modal-knoepfe {\r\n        display: flex;\r\n        gap: 10px;\r\n        justify-content: center;\r\n        flex-wrap: wrap;\r\n        margin-top: 18px;\r\n    }\r\n\r\n    #ftt .ftt-sr { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }\r\n\r\n    \/* ===== Responsive (Elementor: Tablet <= 1024px, Handy <= 767px) ===== *\/\r\n    @media (max-width: 1024px) {\r\n        #ftt .ftt-titel { font-size: 45px; }\r\n        #ftt .ftt-intro { font-size: 16px; margin-top: 30px; }\r\n        #ftt .ftt-box   { font-size: 16px; }\r\n    }\r\n    @media (max-width: 768px) {\r\n        #ftt { max-width: 95%; }\r\n        #ftt .ftt-karte { padding: 20px; }\r\n    }\r\n    @media (max-width: 767px) {\r\n        #ftt .ftt-titel { font-size: 28px; }\r\n        #ftt .ftt-intro { margin-top: 20px; }\r\n        #ftt .ftt-spiel { margin-top: 24px; }\r\n        #ftt .ftt-abschnitt { margin-top: 50px; }\r\n        #ftt .ftt-abschnitt h2 { font-size: 28px; }\r\n        #ftt .ftt-box   { padding: 15px; }\r\n    }\r\n    @media (max-width: 520px) {\r\n        #ftt .ftt-karte  { padding: 14px 8px; border-radius: 16px; }\r\n        #ftt .ftt-panel  { gap: 14px; }\r\n        #ftt .ftt-status { padding: 10px 8px; gap: 6px; }\r\n        #ftt .ftt-stat-zahl { font-size: 1.3rem; }\r\n        #ftt .ftt-stat-label { font-size: 0.66rem; letter-spacing: 0.5px; }\r\n        #ftt .ftt-kontrollen { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; width: 100%; }\r\n        #ftt .ftt-kontrollen .ftt-knopf:first-child { grid-column: 1 \/ -1; }\r\n        #ftt .ftt-knopf  { padding: 10px 14px; font-size: 0.95rem; }\r\n    }\r\n\r\n    @media (prefers-reduced-motion: reduce) {\r\n        #ftt *, #ftt *::before, #ftt *::after {\r\n            animation-duration: 0.01ms !important;\r\n            animation-iteration-count: 1 !important;\r\n            transition-duration: 0.01ms !important;\r\n        }\r\n    }\r\n<\/style>\r\n\r\n<div id=\"ftt\">\r\n\r\n    <div class=\"ftt-sr\" aria-live=\"polite\" aria-atomic=\"true\" id=\"ftt-sr\"><\/div>\r\n\r\n    <h1 class=\"ftt-titel\">Trail Making Test (TMT) zum \u00dcben<\/h1>\r\n\r\n    <p class=\"ftt-intro\">Verbinden Sie Zahlen, in Teil B abwechselnd Zahlen und Buchstaben, so schnell und fehlerfrei wie m\u00f6glich. Weitere Spiele f\u00fcr Ged\u00e4chtnis, Konzentration und Logik finden Sie auf <a href=\"https:\/\/trainmybrain.ch\/\">trainmybrain.ch<\/a>, unserer Plattform f\u00fcr kognitive Spiele.<\/p>\r\n\r\n    <div class=\"ftt-spiel\">\r\n\r\n        <section class=\"ftt-karte\" aria-label=\"Trail Making Test Spielbereich\">\r\n\r\n            <!-- Startauswahl -->\r\n            <div class=\"ftt-panel\" id=\"ftt-start\">\r\n                <p class=\"ftt-text\">W\u00e4hlen Sie einen Teil. <strong>Teil A<\/strong> pr\u00fcft vor allem das Tempo, <strong>Teil B<\/strong> zus\u00e4tzlich das Umschalten zwischen Zahlen und Buchstaben.<\/p>\r\n                <div class=\"ftt-start-knoepfe\">\r\n                    <button type=\"button\" id=\"ftt-start-a\" class=\"ftt-knopf\">Teil A starten<\/button>\r\n                    <button type=\"button\" id=\"ftt-start-b\" class=\"ftt-knopf ftt-knopf-hell\">Teil B starten<\/button>\r\n                <\/div>\r\n                <p class=\"ftt-bestzeiten\" id=\"ftt-bestzeiten\" hidden><\/p>\r\n            <\/div>\r\n\r\n            <!-- Spiel -->\r\n            <div class=\"ftt-panel\" id=\"ftt-spielfeld\" hidden>\r\n                <p class=\"ftt-text\" id=\"ftt-aufgabe\"><\/p>\r\n\r\n                <div class=\"ftt-status\" aria-label=\"Spielstand\">\r\n                    <div><span class=\"ftt-stat-zahl\" id=\"ftt-zeit\">0:00<\/span><span class=\"ftt-stat-label\">Zeit<\/span><\/div>\r\n                    <div><span class=\"ftt-stat-zahl\" id=\"ftt-fehler\">0<\/span><span class=\"ftt-stat-label\">Fehler<\/span><\/div>\r\n                    <div><span class=\"ftt-stat-zahl\" id=\"ftt-naechster\">1<\/span><span class=\"ftt-stat-label\">N\u00e4chster<\/span><\/div>\r\n                <\/div>\r\n\r\n                <div class=\"ftt-brett\" id=\"ftt-brett\">\r\n                    <canvas class=\"ftt-canvas\" id=\"ftt-canvas\" role=\"img\" aria-label=\"Spielfeld mit nummerierten Kreisen\"><\/canvas>\r\n                <\/div>\r\n\r\n                <p class=\"ftt-meldung\" id=\"ftt-meldung\" aria-live=\"polite\"><\/p>\r\n\r\n                <div class=\"ftt-kontrollen\">\r\n                    <button type=\"button\" id=\"ftt-weiter\" class=\"ftt-knopf\">N\u00e4chste Aufgabe<\/button>\r\n                    <button type=\"button\" id=\"ftt-loesung\" class=\"ftt-knopf ftt-knopf-hell\">L\u00f6sung zeigen<\/button>\r\n                    <button type=\"button\" id=\"ftt-zurueck\" class=\"ftt-knopf ftt-knopf-hell\">\u2190 Zur\u00fcck<\/button>\r\n                <\/div>\r\n            <\/div>\r\n\r\n        <\/section>\r\n\r\n        <!-- Spielanleitung -->\r\n        <details class=\"ftt-anleitung\" id=\"ftt-anleitung\">\r\n            <summary>\r\n                Spielanleitung\r\n                <svg class=\"ftt-chev\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M6 9l6 6 6-6\"\/><\/svg>\r\n            <\/summary>\r\n            <ul class=\"ftt-anleitung-liste\">\r\n                <li><strong>Teil A:<\/strong> Verbinden Sie die Kreise 1 bis 15 in aufsteigender Reihenfolge.<\/li>\r\n                <li><strong>Teil B:<\/strong> Verbinden Sie abwechselnd Zahlen und Buchstaben: 1 \u2013 A \u2013 2 \u2013 B \u2013 3 \u2013 C bis 11.<\/li>\r\n                <li><strong>Linie ziehen:<\/strong> Setzen Sie bei Kreis 1 an und ziehen Sie ohne abzusetzen von Kreis zu Kreis. Der n\u00e4chste richtige Kreis wird beim \u00dcberfahren erkannt. Absetzen ist erlaubt: Sie machen beim zuletzt verbundenen Kreis weiter.<\/li>\r\n                <li><strong>Zeit:<\/strong> Die Uhr startet, sobald Sie Kreis 1 ber\u00fchren, und stoppt beim letzten Kreis.<\/li>\r\n                <li><strong>Fehler:<\/strong> Bleiben Sie auf einem falschen Kreis stehen oder setzen Sie dort ab, leuchtet er rot auf und z\u00e4hlt als Fehler. Einen Kreis auf dem Weg zu durchfahren ist erlaubt. Ihr Fortschritt bleibt, Sie machen beim letzten richtigen Kreis weiter. Die Zeit l\u00e4uft dabei weiter, wie im echten Test.<\/li>\r\n                <li><strong>L\u00f6sung zeigen:<\/strong> Zeichnet den richtigen Weg ein. Danach geht es mit \u00abN\u00e4chste Aufgabe\u00bb weiter.<\/li>\r\n                <li><strong>N\u00e4chste Aufgabe:<\/strong> Ordnet die Kreise neu an. Jede Aufgabe ist anders.<\/li>\r\n            <\/ul>\r\n        <\/details>\r\n\r\n    <\/div><!-- \/.ftt-spiel -->\r\n\r\n    <!-- ===== Wie funktioniert der TMT? ===== -->\r\n    <section class=\"ftt-abschnitt\" aria-labelledby=\"ftt-h-regeln\">\r\n        <h2 id=\"ftt-h-regeln\">Wie funktioniert der Trail Making Test (TMT)?<\/h2>\r\n        <div class=\"ftt-box\">\r\n            <p>Der Trail Making Test ist ein neuropsychologisches Testverfahren. Er erfasst das Tempo bei der visuellen Suche und Verarbeitung sowie die F\u00e4higkeit, zwischen zwei Regeln zu wechseln. Gemessen wird die Zeit bis zum letzten Kreis.<\/p>\r\n            <p><strong>Teil A:<\/strong> Nummerierte Kreise sind zuf\u00e4llig verteilt. Sie verbinden sie so schnell wie m\u00f6glich in aufsteigender Reihenfolge (1 \u2013 2 \u2013 3 usw.). Das fordert vor allem visuelle Suche und Verarbeitungsgeschwindigkeit.<\/p>\r\n            <p><strong>Teil B:<\/strong> Zahlen und Buchstaben sind gemischt. Sie wechseln bei jedem Schritt zwischen beiden Reihen (1 \u2013 A \u2013 2 \u2013 B \u2013 3 \u2013 C usw.). Daf\u00fcr m\u00fcssen Sie zwei Abfolgen gleichzeitig im Kopf behalten, was zus\u00e4tzlich die geistige Flexibilit\u00e4t fordert.<\/p>\r\n            <p>Diese \u00dcbungsversion l\u00e4uft im Browser, kostenlos und ohne Anmeldung. Teil A hat 15 Kreise, Teil B 21, und jede Aufgabe wird neu angeordnet. Ihre Bestzeiten werden nur auf Ihrem Ger\u00e4t gespeichert.<\/p>\r\n        <\/div>\r\n    <\/section>\r\n\r\n    <!-- ===== Nutzen ===== -->\r\n    <section class=\"ftt-abschnitt\" aria-labelledby=\"ftt-h-nutzen\">\r\n        <h2 id=\"ftt-h-nutzen\">Was ist der Nutzen vom TMT?<\/h2>\r\n        <div class=\"ftt-box\">\r\n            <p>Der TMT geh\u00f6rt zu den am h\u00e4ufigsten eingesetzten neuropsychologischen Tests, weil er wenig Zeit und kein besonderes Material braucht:<\/p>\r\n            <ol class=\"ftt-nutzen\">\r\n                <li><span class=\"ftt-nutzen-nr\" aria-hidden=\"true\">01<\/span><div><strong>Einsch\u00e4tzung kognitiver Funktionen<\/strong>Der Test macht Aufmerksamkeit, visuelle Suche, Verarbeitungsgeschwindigkeit und das Umschalten zwischen Aufgaben sichtbar, also F\u00e4higkeiten, die im Alltag st\u00e4ndig gefordert sind.<\/div><\/li>\r\n                <li><span class=\"ftt-nutzen-nr\" aria-hidden=\"true\">02<\/span><div><strong>Einsatz in Klinik und Verkehrsmedizin<\/strong>Fachpersonen nutzen den TMT als einen Baustein unter mehreren, etwa bei Verdacht auf eine Beeintr\u00e4chtigung der Hirnleistung, in der Rehabilitation oder bei Abkl\u00e4rungen der Fahreignung.<\/div><\/li>\r\n                <li><span class=\"ftt-nutzen-nr\" aria-hidden=\"true\">03<\/span><div><strong>Verlaufskontrolle<\/strong>Wiederholte Messungen k\u00f6nnen zeigen, ob sich die Leistung \u00fcber die Zeit ver\u00e4ndert, etwa im Verlauf einer Therapie.<\/div><\/li>\r\n                <li><span class=\"ftt-nutzen-nr\" aria-hidden=\"true\">04<\/span><div><strong>Training von Tempo und Umschalten<\/strong>Wer \u00fcbt, lernt das Feld schneller zu \u00fcberblicken, vorauszuplanen und in Teil B den Wechsel zwischen Zahl und Buchstabe fl\u00fcssig zu halten.<\/div><\/li>\r\n            <\/ol>\r\n            <p class=\"ftt-vermerk\">Diese \u00dcbungsversion ist nicht normiert: Kreiszahl, Anordnung und Bildschirm unterscheiden sich vom standardisierten Papiertest. Ihre Zeiten lassen sich deshalb nicht mit Normwerten vergleichen und sagen nichts \u00fcber Ihre Fahreignung aus. Eine fachliche Abkl\u00e4rung ersetzt das \u00dcben nicht.<\/p>\r\n        <\/div>\r\n    <\/section>\r\n\r\n    <!-- ===== Tipps ===== -->\r\n    <section class=\"ftt-abschnitt\" aria-labelledby=\"ftt-h-tipps\">\r\n        <h2 id=\"ftt-h-tipps\">TMT-Tipps: Strategien zum L\u00f6sen<\/h2>\r\n        <div class=\"ftt-box\">\r\n            <ul class=\"ftt-tipps\">\r\n                <li><strong>\u00dcberblick verschaffen<\/strong>Nehmen Sie sich vor dem Start einen Moment, um das ganze Feld anzuschauen. Wer weiss, wo die n\u00e4chsten Kreise liegen, sucht sp\u00e4ter weniger.<\/li>\r\n                <li><strong>Vorausschauen<\/strong>Behalten Sie nicht nur den n\u00e4chsten, sondern schon den \u00fcbern\u00e4chsten Kreis im Blick. W\u00e4hrend Sie zu 3 ziehen, suchen Sie bereits die 4.<\/li>\r\n                <li><strong>Reihenfolge innerlich mitsprechen<\/strong>In Teil B hilft ein fester Rhythmus: \u00ab1 \u2013 A \u2013 2 \u2013 B \u2013 3 \u2013 C\u00bb. So bleibt der Wechsel auch unter Zeitdruck stabil.<\/li>\r\n                <li><strong>Tempo und Genauigkeit ausbalancieren<\/strong>Ein Fehler kostet mehr Zeit als ein ruhiger Zug. Ein gleichm\u00e4ssiges Tempo f\u00fchrt meist zum besten Ergebnis.<\/li>\r\n                <li><strong>Ruhig bleiben<\/strong>Lassen Sie sich von der Uhr oder einem Fehler nicht aus dem Konzept bringen. Zur\u00fcck zum letzten richtigen Kreis und weiter.<\/li>\r\n                <li><strong>Ausgeruht \u00fcben<\/strong>M\u00fcdigkeit und Stress verlangsamen die Reaktion deutlich. \u00dcben Sie, wenn Sie sich wach und konzentriert f\u00fchlen.<\/li>\r\n            <\/ul>\r\n        <\/div>\r\n    <\/section>\r\n\r\n    <!-- ===== Hintergrund ===== -->\r\n    <section class=\"ftt-abschnitt\" aria-labelledby=\"ftt-h-hintergrund\">\r\n        <h2 id=\"ftt-h-hintergrund\">Hintergrund<\/h2>\r\n        <div class=\"ftt-box\">\r\n            <p>Der Trail Making Test stammt urspr\u00fcnglich aus der Army Individual Test Battery der US-Armee (1944). Bekannt wurde er durch Ralph Reitan, der 1958 zeigte, dass die ben\u00f6tigte Zeit Hinweise auf eine organische Sch\u00e4digung des Gehirns geben kann.<\/p>\r\n            <p>Wie schnell Menschen den Test l\u00f6sen, h\u00e4ngt stark von Alter und Ausbildung ab. Normwerte werden deshalb nach diesen Merkmalen getrennt ausgewiesen (Tombaugh, 2004). Ein einzelnes Ergebnis ist nie eine Diagnose, sondern wird von Fachpersonen im Zusammenhang beurteilt.<\/p>\r\n            <p class=\"ftt-quellen-titel\">Quellen<\/p>\r\n            <ul class=\"ftt-quellen\">\r\n                <li>Reitan, R. M. (1958). Validity of the Trail Making Test as an indicator of organic brain damage. <em>Perceptual and Motor Skills, 8<\/em>(3), 271\u2013276. <a href=\"https:\/\/doi.org\/10.2466\/pms.1958.8.3.271\" target=\"_blank\" rel=\"noopener\">https:\/\/doi.org\/10.2466\/pms.1958.8.3.271<\/a><\/li>\r\n                <li>Tombaugh, T. N. (2004). Trail Making Test A and B: Normative data stratified by age and education. <em>Archives of Clinical Neuropsychology, 19<\/em>(2), 203\u2013214. <a href=\"https:\/\/doi.org\/10.1016\/S0887-6177(03)00039-8\" target=\"_blank\" rel=\"noopener\">https:\/\/doi.org\/10.1016\/S0887-6177(03)00039-8<\/a><\/li>\r\n            <\/ul>\r\n        <\/div>\r\n    <\/section>\r\n\r\n    <!-- Dialog: Aufgabe geloest -->\r\n    <div class=\"ftt-modal\" id=\"ftt-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"ftt-modal-titel\">\r\n        <div class=\"ftt-modal-hintergrund\"><\/div>\r\n        <div class=\"ftt-modal-inhalt\">\r\n            <button type=\"button\" class=\"ftt-modal-schliessen\" aria-label=\"Schliessen\">\u00d7<\/button>\r\n            <h2 id=\"ftt-modal-titel\">Geschafft!<\/h2>\r\n            <p id=\"ftt-modal-teil\">Teil A gel\u00f6st.<\/p>\r\n            <div class=\"ftt-ergebnis\">\r\n                <div><strong id=\"ftt-modal-zeit\">0:00<\/strong><span>Zeit<\/span><\/div>\r\n                <div><strong id=\"ftt-modal-fehler\">0<\/strong><span>Fehler<\/span><\/div>\r\n            <\/div>\r\n            <p id=\"ftt-modal-best\"><\/p>\r\n            <div class=\"ftt-modal-knoepfe\">\r\n                <button type=\"button\" id=\"ftt-modal-weiter\" class=\"ftt-knopf\">N\u00e4chste Aufgabe<\/button>\r\n                <button type=\"button\" id=\"ftt-modal-auswahl\" class=\"ftt-knopf ftt-knopf-hell\">Zur Auswahl<\/button>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n<\/div>\r\n\r\n<script>\r\n(function () {\r\n    'use strict';\r\n\r\n    \/\/ Elementor oder ein Optimierungs-Plugin kann das Skript nach\r\n    \/\/ DOMContentLoaded ausfuehren \u2014 dann wuerde ein reiner Listener nie feuern.\r\n    if (document.readyState === 'loading') {\r\n        document.addEventListener('DOMContentLoaded', fttStart);\r\n    } else {\r\n        fttStart();\r\n    }\r\n\r\n    function fttStart() {\r\n        const root = document.getElementById('ftt');\r\n        if (!root || root.dataset.fttBereit) return;\r\n        root.dataset.fttBereit = '1';\r\n\r\n        \/\/ \u2500\u2500 Farben (Canvas kennt keine CSS-Variablen) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n        const GELB     = '#FFBF00';\r\n        const SCHWARZ  = '#000000';\r\n        const GRUEN    = '#047857';   \/\/ verbundene Strecken, Loesung\r\n        const ROT      = '#B91C1C';   \/\/ falscher Kreis\r\n        const RAND     = 'rgba(0, 0, 0, 0.35)';\r\n\r\n        const ANZAHL = { A: 15, B: 21 };\r\n        const BEWEGUNG_REDUZIERT = window.matchMedia &&\r\n            window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n\r\n        \/\/ \u2500\u2500 DOM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n        const startPanel  = document.getElementById('ftt-start');\r\n        const spielPanel  = document.getElementById('ftt-spielfeld');\r\n        const brett       = document.getElementById('ftt-brett');\r\n        const canvas      = document.getElementById('ftt-canvas');\r\n        const ctx         = canvas.getContext('2d');\r\n        const aufgabeText = document.getElementById('ftt-aufgabe');\r\n        const zeitEl      = document.getElementById('ftt-zeit');\r\n        const fehlerEl    = document.getElementById('ftt-fehler');\r\n        const naechsterEl = document.getElementById('ftt-naechster');\r\n        const meldungEl   = document.getElementById('ftt-meldung');\r\n        const srEl        = document.getElementById('ftt-sr');\r\n        const btnWeiter   = document.getElementById('ftt-weiter');\r\n        const btnLoesung  = document.getElementById('ftt-loesung');\r\n        const btnZurueck  = document.getElementById('ftt-zurueck');\r\n        const bestEl      = document.getElementById('ftt-bestzeiten');\r\n        const modal       = document.getElementById('ftt-modal');\r\n\r\n        \/\/ \u2500\u2500 Zustand \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n        \/\/ Alle Koordinaten in CSS-Pixeln des Spielfelds. Gezeichnet wird immer\r\n        \/\/ komplett aus diesem Zustand \u2014 ein Neuaufbau des Canvas (Resize) kann\r\n        \/\/ so nichts mehr verlieren.\r\n        let teil        = 'A';\r\n        let phase       = 'aus';   \/\/ aus | bereit | laeuft | loesung | geloest\r\n        let kreise      = [];      \/\/ [{ wert, x, y }]\r\n        let fortschritt = 0;       \/\/ Index des zuletzt erreichten Kreises\r\n        let strecken    = [];      \/\/ gezogene, richtige Verbindungen: [[{x,y}, ...], ...]\r\n        let pfad        = [];      \/\/ aktuelle, noch offene Linie\r\n        let ziehen      = false;\r\n        let zeigerId    = null;\r\n        let fehler      = 0;\r\n        let blitz       = null;    \/\/ { index, bis }\r\n        let ruheAnker   = null;    \/\/ letzter Punkt mit deutlicher Bewegung\r\n        let ruheSeit    = 0;\r\n        let haltePruefer = null;\r\n        let startZeit   = 0;\r\n        let endZeit     = 0;\r\n        let loesungStart = 0;\r\n        let uhr         = null;\r\n        let schleife    = null;\r\n        let breite = 0, hoehe = 0, radius = 20;\r\n\r\n        \/\/ \u2500\u2500 Spielfeldgroesse \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n        \/\/ Breite folgt dem Container; schmale Bildschirme bekommen ein hoeheres\r\n        \/\/ Feld, damit alle Kreise mit fingertauglicher Groesse Platz finden.\r\n        \/\/ Ab 520px quadratisch, aber nie hoeher als das Fenster (minus Platz\r\n        \/\/ fuer den fixierten Seitenkopf), damit das ganze Feld sichtbar ist.\r\n        \/\/ innerHeight wird nur beim Erzeugen bzw. bei Breitenaenderung gelesen \u2014\r\n        \/\/ die mobile Adressleiste loest so keinen Neuaufbau aus.\r\n        function masse() {\r\n            const c = Math.round(brett.clientWidth);\r\n            const frei = window.innerHeight - kopfHoehe() - reserve();\r\n            if (c < 520) {\r\n                const h = Math.round(c * 1.25);\r\n                return { w: c, h: Math.max(c, Math.min(h, Math.round(frei))) };\r\n            }\r\n            const s = Math.min(c, Math.max(360, Math.round(frei)));\r\n            return { w: s, h: s };\r\n        }\r\n\r\n        \/\/ Platz, den Statusleiste, Meldung und Buttons um das Feld brauchen \u2014\r\n        \/\/ gemessen, damit alles zusammen ins Fenster passt. Vorher ragte bei\r\n        \/\/ 1440x900 \u00abNaechste Aufgabe\u00bb unten hinaus; wer hinscrollte, schob\r\n        \/\/ Kreis 1 oben aus dem Bild.\r\n        function reserve() {\r\n            const h = sel => { const el = root.querySelector(sel); return el ? el.getBoundingClientRect().height : 0; };\r\n            const abstand = parseFloat(getComputedStyle(spielPanel).rowGap) || 20;\r\n            return h('.ftt-status') + h('#ftt-meldung') + h('.ftt-kontrollen') + 3 * abstand + 16;\r\n        }\r\n\r\n        function radiusFuer(w) {\r\n            return Math.max(16, Math.min(24, Math.round(w \/ 26)));\r\n        }\r\n\r\n        function canvasAnpassen() {\r\n            const { w, h } = masse();\r\n            if (!w || (w === breite && h === hoehe)) return;\r\n\r\n            \/\/ Laufende Aufgabe proportional mitskalieren statt neu zu wuerfeln\r\n            if (breite && kreise.length) {\r\n                const sx = w \/ breite, sy = h \/ hoehe;\r\n                const skal = p => { p.x *= sx; p.y *= sy; };\r\n                kreise.forEach(skal);\r\n                strecken.forEach(s => s.forEach(skal));\r\n                pfad.forEach(skal);\r\n            }\r\n            breite = w;\r\n            hoehe  = h;\r\n            radius = radiusFuer(w);\r\n\r\n            const dpr = Math.min(window.devicePixelRatio || 1, 3);\r\n            canvas.style.width  = w + 'px';\r\n            canvas.style.height = h + 'px';\r\n            canvas.width  = Math.round(w * dpr);\r\n            canvas.height = Math.round(h * dpr);\r\n            ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\r\n            zeichnen();\r\n        }\r\n\r\n        if (window.ResizeObserver) {\r\n            new ResizeObserver(canvasAnpassen).observe(brett);\r\n        } else {\r\n            window.addEventListener('resize', canvasAnpassen);\r\n        }\r\n\r\n        \/\/ \u2500\u2500 Aufgabe erzeugen \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n        function reihenfolge(t) {\r\n            if (t === 'A') return Array.from({ length: ANZAHL.A }, (_, i) => String(i + 1));\r\n            const r = [];\r\n            for (let i = 1; r.length < ANZAHL.B; i++) {\r\n                r.push(String(i));\r\n                if (r.length < ANZAHL.B) r.push(String.fromCharCode(64 + i));\r\n            }\r\n            return r;   \/\/ 1 A 2 B ... 10 J 11\r\n        }\r\n\r\n        \/\/ Zufaellige Positionen mit Mindestabstand. Garantiert die volle Anzahl:\r\n        \/\/ gelingt keine Anordnung, wird der Abstand schrittweise verringert.\r\n        function positionen(n) {\r\n            const rand = radius + 6;\r\n            let abstand = 2 * radius + Math.max(14, radius);\r\n            for (let runde = 0; runde < 40; runde++) {\r\n                for (let versuch = 0; versuch < 25; versuch++) {\r\n                    const p = [];\r\n                    for (let k = 0; k < 2500 && p.length < n; k++) {\r\n                        const x = rand + Math.random() * (breite - 2 * rand);\r\n                        const y = rand + Math.random() * (hoehe  - 2 * rand);\r\n                        if (p.every(q => Math.hypot(q.x - x, q.y - y) >= abstand)) p.push({ x, y });\r\n                    }\r\n                    if (p.length === n) return p;\r\n                }\r\n                abstand *= 0.93;\r\n            }\r\n            \/\/ Notfall (praktisch unerreichbar): Raster\r\n            const spalten = Math.ceil(Math.sqrt(n));\r\n            return Array.from({ length: n }, (_, i) => ({\r\n                x: rand + (i % spalten + 0.5) * (breite - 2 * rand) \/ spalten,\r\n                y: rand + (Math.floor(i \/ spalten) + 0.5) * (hoehe - 2 * rand) \/ spalten\r\n            }));\r\n        }\r\n\r\n        function neueAufgabe() {\r\n            uhrStopp();\r\n            canvasAnpassen();\r\n            const werte = reihenfolge(teil);\r\n            kreise = positionen(werte.length).map((p, i) => ({ wert: werte[i], x: p.x, y: p.y }));\r\n            fortschritt = 0;\r\n            strecken = [];\r\n            pfad = [];\r\n            ziehen = false;\r\n            fehler = 0;\r\n            blitz = null;\r\n            startZeit = endZeit = 0;\r\n            phase = 'bereit';\r\n            btnLoesung.disabled = false;\r\n            zeitEl.textContent = '0:00';\r\n            statusAnzeigen();\r\n            meldung(`Setzen Sie bei \u00ab${kreise[0].wert}\u00bb an.`);\r\n            sr(`Neue Aufgabe, Teil ${teil}. ${kreise.length} Kreise. Beginnen Sie bei ${kreise[0].wert}.`);\r\n            schleifeStarten();\r\n        }\r\n\r\n        \/\/ \u2500\u2500 Zeichnen \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n        function linie(punkte, farbe, dicke) {\r\n            if (punkte.length < 2) return;\r\n            ctx.beginPath();\r\n            ctx.moveTo(punkte[0].x, punkte[0].y);\r\n            for (let i = 1; i < punkte.length; i++) ctx.lineTo(punkte[i].x, punkte[i].y);\r\n            ctx.strokeStyle = farbe;\r\n            ctx.lineWidth = dicke;\r\n            ctx.lineJoin = 'round';\r\n            ctx.lineCap = 'round';\r\n            ctx.stroke();\r\n        }\r\n\r\n        function zeichnen(jetzt) {\r\n            jetzt = jetzt || performance.now();\r\n            ctx.clearRect(0, 0, breite, hoehe);\r\n            if (!kreise.length) return;\r\n\r\n            strecken.forEach(s => linie(s, GRUEN, 4));\r\n\r\n            if (phase === 'loesung') {\r\n                const proStrecke = BEWEGUNG_REDUZIERT ? 0 : 160;\r\n                const verstrichen = jetzt - loesungStart;\r\n                for (let i = 0; i < kreise.length - 1; i++) {\r\n                    const a = kreise[i], b = kreise[i + 1];\r\n                    let t = proStrecke ? (verstrichen - i * proStrecke) \/ proStrecke : 1;\r\n                    if (t <= 0) break;\r\n                    t = Math.min(1, t);\r\n                    linie([a, { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t }], GRUEN, 3);\r\n                }\r\n            }\r\n\r\n            linie(pfad, SCHWARZ, 4);\r\n\r\n            const schrift = Math.max(13, Math.round(radius * 0.85));\r\n            kreise.forEach((k, i) => {\r\n                let r = radius;\r\n                const istStart = i === 0 && phase === 'bereit';\r\n                if (istStart && !BEWEGUNG_REDUZIERT) r = radius + 2.5 + 2.5 * Math.sin(jetzt \/ 260);\r\n                const rot = blitz && blitz.index === i && jetzt < blitz.bis;\r\n                const erreicht = phase !== 'bereit' && i <= fortschritt;\r\n\r\n                if (istStart) atom(k.x, k.y, r);\r\n\r\n                ctx.beginPath();\r\n                ctx.arc(k.x, k.y, r, 0, 2 * Math.PI);\r\n                ctx.fillStyle = rot ? ROT : GELB;\r\n                ctx.fill();\r\n                ctx.lineWidth = 1.5;\r\n                ctx.strokeStyle = RAND;\r\n                ctx.stroke();\r\n\r\n                \/\/ Verbundene Kreise gruen umrandet, der aktuelle schwarz\r\n                if (erreicht) {\r\n                    ctx.beginPath();\r\n                    ctx.arc(k.x, k.y, r + 2.5, 0, 2 * Math.PI);\r\n                    ctx.lineWidth = 3;\r\n                    ctx.strokeStyle = i === fortschritt && phase === 'laeuft' ? SCHWARZ : GRUEN;\r\n                    ctx.stroke();\r\n                }\r\n\r\n                ctx.fillStyle = rot ? '#ffffff' : SCHWARZ;\r\n                ctx.font = `600 ${schrift}px Poppins, sans-serif`;\r\n                ctx.textAlign = 'center';\r\n                ctx.textBaseline = 'middle';\r\n                ctx.fillText(k.wert, k.x, k.y + 1);\r\n            });\r\n        }\r\n\r\n        \/\/ Umlaufbahnen um den Startkreis (Erkennungszeichen aus der Vorlage)\r\n        function atom(x, y, r) {\r\n            ctx.save();\r\n            ctx.translate(x, y);\r\n            ctx.strokeStyle = 'rgba(0, 0, 0, 0.18)';\r\n            ctx.lineWidth = 1.5;\r\n            for (let i = 0; i < 3; i++) {\r\n                ctx.rotate(Math.PI \/ 3);\r\n                ctx.beginPath();\r\n                ctx.ellipse(0, 0, r + 10, r + 5, 0, 0, 2 * Math.PI);\r\n                ctx.stroke();\r\n            }\r\n            ctx.restore();\r\n        }\r\n\r\n        \/\/ Eine einzige Animationsschleife \u2014 laeuft nur, solange etwas animiert\r\n        \/\/ (Startkreis pulsiert, roter Blitz, Loesung wird gezeichnet).\r\n        function animiertGerade(jetzt) {\r\n            if (phase === 'bereit' && !BEWEGUNG_REDUZIERT) return true;\r\n            if (blitz && jetzt < blitz.bis) return true;\r\n            if (phase === 'loesung' && jetzt - loesungStart < (kreise.length) * 160 && !BEWEGUNG_REDUZIERT) return true;\r\n            return false;\r\n        }\r\n\r\n        function schleifeStarten() {\r\n            if (schleife) return;\r\n            const takt = (jetzt) => {\r\n                zeichnen(jetzt);\r\n                schleife = animiertGerade(jetzt) && phase !== 'aus' ? requestAnimationFrame(takt) : null;\r\n            };\r\n            schleife = requestAnimationFrame(takt);\r\n        }\r\n\r\n        function schleifeStopp() {\r\n            if (schleife) cancelAnimationFrame(schleife);\r\n            schleife = null;\r\n        }\r\n\r\n        \/\/ \u2500\u2500 Uhr \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n        function format(ms) {\r\n            const s = Math.floor(ms \/ 1000);\r\n            return `${Math.floor(s \/ 60)}:${String(s % 60).padStart(2, '0')}`;\r\n        }\r\n\r\n        function uhrStart() {\r\n            uhrStopp();\r\n            startZeit = performance.now();\r\n            uhr = setInterval(() => { zeitEl.textContent = format(performance.now() - startZeit); }, 250);\r\n        }\r\n\r\n        function uhrStopp() {\r\n            if (uhr) clearInterval(uhr);\r\n            uhr = null;\r\n        }\r\n\r\n        \/\/ \u2500\u2500 Eingabe (Pointer Events: Maus, Finger und Stift) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n        function punkt(e) {\r\n            const r = canvas.getBoundingClientRect();\r\n            return { x: (e.clientX - r.left) * breite \/ r.width, y: (e.clientY - r.top) * hoehe \/ r.height };\r\n        }\r\n\r\n        const TREFFER = 8;   \/\/ Toleranz um den Kreis fuer das Ziel (Finger)\r\n\r\n        canvas.addEventListener('pointerdown', e => {\r\n            if (phase !== 'bereit' && phase !== 'laeuft') return;\r\n            const p = punkt(e);\r\n            const aktuell = kreise[fortschritt];\r\n            if (Math.hypot(p.x - aktuell.x, p.y - aktuell.y) <= radius + TREFFER) {\r\n                e.preventDefault();\r\n                ziehen = true;\r\n                zeigerId = e.pointerId;\r\n                try { canvas.setPointerCapture(e.pointerId); } catch (err) {}\r\n                pfad = [{ x: aktuell.x, y: aktuell.y }, p];\r\n                ruheAnker = null;\r\n                ruheMerken(p);\r\n                haltePrueferStopp();\r\n                haltePruefer = setInterval(haltePruefen, 100);\r\n                if (phase === 'bereit') {\r\n                    phase = 'laeuft';\r\n                    statusAnzeigen();\r\n                    uhrStart();\r\n                    ftEvent({ event: 'trailmaking_start', trailmaking_teil: teil });\r\n                }\r\n                meldung('');\r\n                zeichnen();\r\n                return;\r\n            }\r\n            \/\/ Anderswo angesetzt: kein Fehler, nur ein Hinweis\r\n            const getroffen = kreise.findIndex(k => Math.hypot(p.x - k.x, p.y - k.y) <= radius);\r\n            if (getroffen >= 0) meldung(`Setzen Sie bei \u00ab${aktuell.wert}\u00bb an.`);\r\n        });\r\n\r\n        canvas.addEventListener('pointermove', e => {\r\n            if (!ziehen || e.pointerId !== zeigerId) return;\r\n            const ereignisse = e.getCoalescedEvents ? e.getCoalescedEvents() : [e];\r\n            for (const ev of (ereignisse.length ? ereignisse : [e])) {\r\n                if (!ziehen) break;\r\n                const q = punkt(ev);\r\n                ruheMerken(q);\r\n                bewegen(q);\r\n            }\r\n            zeichnen();\r\n        });\r\n\r\n        \/\/ Abstand Punkt\u2013Strecke: bei schneller Bewegung liegen die Messpunkte\r\n        \/\/ weit auseinander, ein Zielkreis dazwischen soll trotzdem zaehlen.\r\n        function abstandZurStrecke(k, a, b) {\r\n            const dx = b.x - a.x, dy = b.y - a.y;\r\n            const l2 = dx * dx + dy * dy;\r\n            const t = l2 ? Math.max(0, Math.min(1, ((k.x - a.x) * dx + (k.y - a.y) * dy) \/ l2)) : 0;\r\n            return Math.hypot(k.x - (a.x + t * dx), k.y - (a.y + t * dy));\r\n        }\r\n\r\n        function bewegen(p) {\r\n            const vorher = pfad[pfad.length - 1] || p;\r\n            pfad.push(p);\r\n            const ziel = kreise[fortschritt + 1];\r\n            if (abstandZurStrecke(ziel, vorher, p) <= radius + TREFFER) {\r\n                \/\/ Richtiger naechster Kreis erreicht: Strecke festhalten, weiter\r\n                pfad.push({ x: ziel.x, y: ziel.y });\r\n                strecken.push(pfad);\r\n                fortschritt++;\r\n                pfad = [{ x: ziel.x, y: ziel.y }];\r\n                statusAnzeigen();\r\n                if (fortschritt === kreise.length - 1) geloest();\r\n                return;\r\n            }\r\n            \/\/ KEIN Fehler beim blossen Durchfahren eines falschen Kreises \u2014\r\n            \/\/ im echten TMT ist der Fehler das Ansteuern, nicht das Streifen.\r\n            \/\/ Gezaehlt wird Stehenbleiben oder Absetzen (haltePruefen, loslassen).\r\n        }\r\n\r\n        \/\/ Falscher, noch offener Kreis unter dem Punkt? Nur der innere Bereich\r\n        \/\/ zaehlt, knappes Vorbeiziehen am Rand ist nie ein Fehler.\r\n        function falscherKreisBei(p) {\r\n            for (let j = fortschritt + 2; j < kreise.length; j++) {\r\n                const k = kreise[j];\r\n                if (Math.hypot(p.x - k.x, p.y - k.y) < radius * 0.75) return j;\r\n            }\r\n            return -1;\r\n        }\r\n\r\n        \/\/ Wer auf einem falschen Kreis stehen bleibt, hat ihn angesteuert.\r\n        \/\/ 400 ms ohne deutliche Bewegung (> 4px) gelten als Stehenbleiben \u2014\r\n        \/\/ langsames, aber stetiges Durchfahren bleibt erlaubt.\r\n        const HALTEZEIT = 400;\r\n\r\n        function ruheMerken(p) {\r\n            if (!ruheAnker || Math.hypot(p.x - ruheAnker.x, p.y - ruheAnker.y) > 4) {\r\n                ruheAnker = { x: p.x, y: p.y };\r\n                ruheSeit = performance.now();\r\n            }\r\n        }\r\n\r\n        function haltePruefen() {\r\n            if (!ziehen || !ruheAnker) return;\r\n            const j = falscherKreisBei(ruheAnker);\r\n            if (j >= 0 && performance.now() - ruheSeit >= HALTEZEIT) fehlerMelden(j);\r\n        }\r\n\r\n        function haltePrueferStopp() {\r\n            if (haltePruefer) clearInterval(haltePruefer);\r\n            haltePruefer = null;\r\n        }\r\n\r\n        function fehlerMelden(j) {\r\n            fehler++;\r\n            ziehen = false;\r\n            haltePrueferStopp();\r\n            pfad = [];\r\n            blitz = { index: j, bis: performance.now() + 700 };\r\n            statusAnzeigen();\r\n            const aktuell = kreise[fortschritt].wert, soll = kreise[fortschritt + 1].wert;\r\n            meldung(`Falsch: Nach \u00ab${aktuell}\u00bb kommt \u00ab${soll}\u00bb. Weiter ab \u00ab${aktuell}\u00bb.`, 'fehler');\r\n            sr(`Fehler. Nach ${aktuell} kommt ${soll}. Weiter ab ${aktuell}.`);\r\n            schleifeStarten();\r\n        }\r\n\r\n        function loslassen(e) {\r\n            if (!ziehen || (e && e.pointerId !== zeigerId)) return;\r\n            const letzter = pfad[pfad.length - 1];\r\n            const j = letzter ? falscherKreisBei(letzter) : -1;\r\n            if (j >= 0) { fehlerMelden(j); return; }   \/\/ auf falschem Kreis abgesetzt\r\n            haltePrueferStopp();\r\n            ziehen = false;\r\n            pfad = [];\r\n            zeichnen();\r\n        }\r\n        canvas.addEventListener('pointerup', loslassen);\r\n        canvas.addEventListener('pointercancel', loslassen);\r\n        canvas.addEventListener('lostpointercapture', loslassen);\r\n\r\n        \/\/ \u2500\u2500 Ende, Loesung \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n        function geloest() {\r\n            ziehen = false;\r\n            haltePrueferStopp();\r\n            pfad = [];\r\n            phase = 'geloest';\r\n            uhrStopp();\r\n            endZeit = performance.now() - startZeit;\r\n            zeitEl.textContent = format(endZeit);\r\n            btnLoesung.disabled = true;\r\n            zeichnen();\r\n\r\n            const sekunden = Math.round(endZeit \/ 100) \/ 10;\r\n            const bisher = bestzeiten()[teil];\r\n            const neu = !bisher || endZeit < bisher;\r\n            if (neu) bestzeitSpeichern(teil, endZeit);\r\n\r\n            meldung(`Geschafft in ${format(endZeit)}.`, 'erfolg');\r\n            sr(`Geschafft. Zeit ${format(endZeit)}, ${fehler} Fehler.`);\r\n            ftEvent({ event: 'trailmaking_geloest', trailmaking_teil: teil, trailmaking_sekunden: sekunden, trailmaking_fehler: fehler });\r\n\r\n            document.getElementById('ftt-modal-teil').textContent   = `Teil ${teil} gel\u00f6st.`;\r\n            document.getElementById('ftt-modal-zeit').textContent   = format(endZeit);\r\n            document.getElementById('ftt-modal-fehler').textContent = fehler;\r\n            document.getElementById('ftt-modal-best').textContent   = neu\r\n                ? (bisher ? 'Neue Bestzeit!' : 'Ihre erste Bestzeit f\u00fcr diesen Teil.')\r\n                : `Ihre Bestzeit: ${format(bisher)}`;\r\n            setTimeout(() => { if (phase === 'geloest') modalOeffnen(); }, 500);\r\n        }\r\n\r\n        function loesungZeigen() {\r\n            if (phase !== 'bereit' && phase !== 'laeuft') return;\r\n            uhrStopp();\r\n            ziehen = false;\r\n            pfad = [];\r\n            phase = 'loesung';\r\n            haltePrueferStopp();\r\n            loesungStart = performance.now();\r\n            btnLoesung.disabled = true;\r\n            meldung('L\u00f6sung angezeigt. Mit \u00abN\u00e4chste Aufgabe\u00bb geht es weiter.');\r\n            sr('L\u00f6sung angezeigt.');\r\n            ftEvent({ event: 'trailmaking_loesung', trailmaking_teil: teil });\r\n            schleifeStarten();\r\n            zeichnen();\r\n        }\r\n\r\n        \/\/ \u2500\u2500 Anzeigen \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n        function statusAnzeigen() {\r\n            fehlerEl.textContent = fehler;\r\n            \/\/ Vor dem Start ist Kreis 1 das Ziel, danach der naechste offene\r\n            const n = phase === 'bereit' ? kreise[0] : kreise[fortschritt + 1];\r\n            naechsterEl.textContent = n ? n.wert : '\u2713';\r\n        }\r\n\r\n        function meldung(text, art) {\r\n            meldungEl.textContent = text;\r\n            meldungEl.className = 'ftt-meldung' + (art ? ' ' + art : '');\r\n        }\r\n\r\n        function sr(text) { srEl.textContent = text; }\r\n\r\n        \/\/ \u2500\u2500 Bestzeiten (localStorage, Schluesselraum ft_*) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n        const BEST_KEY = 'ft_trailmaking_best_v1';\r\n\r\n        function bestzeiten() {\r\n            try {\r\n                const s = JSON.parse(localStorage.getItem(BEST_KEY) || '{}');\r\n                return { A: Number(s.A) || 0, B: Number(s.B) || 0 };\r\n            } catch (e) { return { A: 0, B: 0 }; }\r\n        }\r\n\r\n        function bestzeitSpeichern(t, ms) {\r\n            const b = bestzeiten();\r\n            b[t] = Math.round(ms);\r\n            try { localStorage.setItem(BEST_KEY, JSON.stringify(b)); } catch (e) {}\r\n        }\r\n\r\n        function bestzeitenAnzeigen() {\r\n            const b = bestzeiten();\r\n            const teile = [];\r\n            if (b.A) teile.push(`Teil A ${format(b.A)}`);\r\n            if (b.B) teile.push(`Teil B ${format(b.B)}`);\r\n            bestEl.hidden = !teile.length;\r\n            bestEl.textContent = teile.length ? 'Ihre Bestzeiten: ' + teile.join(' \u00b7 ') : '';\r\n        }\r\n\r\n        \/** Spielereignis an GTM (dataLayer). Nur Spieldaten, keine Personendaten. *\/\r\n        function ftEvent(daten) {\r\n            try {\r\n                window.dataLayer = window.dataLayer || [];\r\n                window.dataLayer.push(Object.assign({ spiel_seite: 'fahrtauglich' }, daten));\r\n            } catch (e) {}\r\n        }\r\n\r\n        \/\/ \u2500\u2500 Navigation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n        function starten(t) {\r\n            teil = t;\r\n            aufgabeText.textContent = t === 'A'\r\n                ? 'Teil A: Verbinden Sie die Zahlen 1 bis 15 in aufsteigender Reihenfolge.'\r\n                : 'Teil B: Verbinden Sie abwechselnd Zahlen und Buchstaben: 1 \u2013 A \u2013 2 \u2013 B \u2013 3 \u2013 C bis 11.';\r\n            startPanel.hidden = true;\r\n            spielPanel.hidden = false;\r\n            neueAufgabe();\r\n            feldSichtbarMachen();\r\n        }\r\n\r\n        \/\/ Hoehe eines fixierten\/klebenden Seitenkopfs (Theme), gemessen statt\r\n        \/\/ geraten: oberstes Element in der Fenstermitte und seine Vorfahren.\r\n        function kopfHoehe() {\r\n            let el = document.elementFromPoint(window.innerWidth \/ 2, 2);\r\n            while (el && el !== document.body && el !== document.documentElement) {\r\n                const pos = getComputedStyle(el).position;\r\n                if (pos === 'fixed' || pos === 'sticky') {\r\n                    const r = el.getBoundingClientRect();\r\n                    return r.top <= 2 ? Math.max(0, r.bottom) : 0;\r\n                }\r\n                el = el.parentElement;\r\n            }\r\n            return 0;\r\n        }\r\n\r\n        \/\/ Liegt das Spielfeld nicht ganz im Fenster, so scrollen, dass die\r\n        \/\/ Statusleiste direkt unter dem Seitenkopf steht.\r\n        function feldSichtbarMachen() {\r\n            const kopf = kopfHoehe();\r\n            const r = canvas.getBoundingClientRect();\r\n            const status = root.querySelector('.ftt-status').getBoundingClientRect();\r\n            \/\/ Statusleiste UND Feld muessen sichtbar sein \u2014 wer selbst zum\r\n            \/\/ Start-Button gescrollt hat, hat die Leiste sonst unter dem Kopf.\r\n            const unten = root.querySelector('.ftt-kontrollen').getBoundingClientRect().bottom;\r\n            if (status.top >= kopf + 4 && Math.max(r.bottom, unten) <= window.innerHeight) return;\r\n            window.scrollTo({\r\n                top: window.scrollY + status.top - kopf - 10,\r\n                behavior: BEWEGUNG_REDUZIERT ? 'auto' : 'smooth'\r\n            });\r\n        }\r\n\r\n        function zurAuswahl() {\r\n            uhrStopp();\r\n            schleifeStopp();\r\n            phase = 'aus';\r\n            ziehen = false;\r\n            haltePrueferStopp();\r\n            kreise = [];\r\n            spielPanel.hidden = true;\r\n            startPanel.hidden = false;\r\n            bestzeitenAnzeigen();\r\n        }\r\n\r\n        \/\/ Nach einem Mausklick den Fokus abgeben (wie bei Wordle), damit kein\r\n        \/\/ Button \u00abhaengen\u00bb bleibt. Tastaturbedienung (detail === 0) unveraendert.\r\n        function klick(btn, fn) {\r\n            btn.addEventListener('click', e => {\r\n                e.preventDefault();\r\n                if (e.detail > 0) btn.blur();\r\n                fn();\r\n            });\r\n        }\r\n\r\n        klick(document.getElementById('ftt-start-a'), () => starten('A'));\r\n        klick(document.getElementById('ftt-start-b'), () => starten('B'));\r\n        klick(btnWeiter,  neueAufgabe);\r\n        klick(btnLoesung, loesungZeigen);\r\n        klick(btnZurueck, zurAuswahl);\r\n        klick(document.getElementById('ftt-modal-weiter'),  () => { modalSchliessen(); neueAufgabe(); });\r\n        klick(document.getElementById('ftt-modal-auswahl'), () => { modalSchliessen(); zurAuswahl(); });\r\n\r\n        \/\/ \u2500\u2500 Dialog \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n        function modalOeffnen() {\r\n            modal.classList.add('active');\r\n            document.body.style.overflow = 'hidden';\r\n            const ziel = modal.querySelector('#ftt-modal-weiter');\r\n            if (ziel) ziel.focus();\r\n        }\r\n\r\n        function modalSchliessen() {\r\n            modal.classList.remove('active');\r\n            document.body.style.overflow = '';\r\n        }\r\n\r\n        modal.querySelector('.ftt-modal-schliessen').addEventListener('click', modalSchliessen);\r\n        modal.querySelector('.ftt-modal-hintergrund').addEventListener('click', modalSchliessen);\r\n        document.addEventListener('keydown', e => {\r\n            if (e.key === 'Escape' && modal.classList.contains('active')) {\r\n                e.preventDefault();\r\n                modalSchliessen();\r\n            }\r\n        });\r\n\r\n        \/\/ \u2500\u2500 Start \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n        bestzeitenAnzeigen();\r\n        try {\r\n            if (!localStorage.getItem('ft_trailmaking_seen')) {\r\n                document.getElementById('ftt-anleitung').open = true;\r\n                localStorage.setItem('ft_trailmaking_seen', '1');\r\n            }\r\n        } catch (e) {}\r\n    }\r\n})();\r\n<\/script>\r\n\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\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Spielen Sie Sudoku online mit individuell einstellbarem Fehlerlimit. Unser adaptives Sudoku wird nach jedem Erfolg schwieriger.<\/p>","protected":false},"author":1,"featured_media":0,"parent":1467,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"content-type":"","iawp_total_views":19102,"footnotes":""},"class_list":["post-4532","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Trail Making Test: Digitaler Trail Making Test (TMT) zum \u00dcben<\/title>\n<meta name=\"description\" content=\"\u00dcben Sie f\u00fcr die verkehrsmedizinische Untersuchung Stufe 1 den Trail Making Test (TMT). Steigern Sie Ihre kognitiven F\u00e4higkeiten!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fahrtauglich.ch\/fr\/praxisportal\/trail-making-test\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Trail Making Test: Digitaler Trail Making Test (TMT) zum \u00dcben\" \/>\n<meta property=\"og:description\" content=\"\u00dcben Sie f\u00fcr die verkehrsmedizinische Untersuchung Stufe 1 den Trail Making Test (TMT). Steigern Sie Ihre kognitiven F\u00e4higkeiten!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fahrtauglich.ch\/fr\/praxisportal\/trail-making-test\/\" \/>\n<meta property=\"og:site_name\" content=\"Fahrtauglich\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-12T10:00:02+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/fahrtauglich.ch\\\/praxisportal\\\/trail-making-test\\\/\",\"url\":\"https:\\\/\\\/fahrtauglich.ch\\\/praxisportal\\\/trail-making-test\\\/\",\"name\":\"Trail Making Test: Digitaler Trail Making Test (TMT) zum \u00dcben\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/fahrtauglich.ch\\\/#website\"},\"datePublished\":\"2024-11-17T18:23:18+00:00\",\"dateModified\":\"2026-10-12T10:00:02+00:00\",\"description\":\"\u00dcben Sie f\u00fcr die verkehrsmedizinische Untersuchung Stufe 1 den Trail Making Test (TMT). Steigern Sie Ihre kognitiven F\u00e4higkeiten!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/fahrtauglich.ch\\\/praxisportal\\\/trail-making-test\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/fahrtauglich.ch\\\/praxisportal\\\/trail-making-test\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/fahrtauglich.ch\\\/praxisportal\\\/trail-making-test\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/fahrtauglich.ch\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Praxisportal\",\"item\":\"https:\\\/\\\/fahrtauglich.ch\\\/praxisportal\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Trail Making Test\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/fahrtauglich.ch\\\/#website\",\"url\":\"https:\\\/\\\/fahrtauglich.ch\\\/\",\"name\":\"Fahrtauglich\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/fahrtauglich.ch\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/fahrtauglich.ch\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/fahrtauglich.ch\\\/#organization\",\"name\":\"Fahrtauglich\",\"url\":\"https:\\\/\\\/fahrtauglich.ch\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/fahrtauglich.ch\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/fahrtauglich.ch\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/cropped-Logo-2.jpg\",\"contentUrl\":\"https:\\\/\\\/fahrtauglich.ch\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/cropped-Logo-2.jpg\",\"width\":307,\"height\":188,\"caption\":\"Fahrtauglich\"},\"image\":{\"@id\":\"https:\\\/\\\/fahrtauglich.ch\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Trail Making Test: Digitaler Trail Making Test (TMT) zum \u00dcben","description":"\u00dcben Sie f\u00fcr die verkehrsmedizinische Untersuchung Stufe 1 den Trail Making Test (TMT). Steigern Sie Ihre kognitiven F\u00e4higkeiten!","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:\/\/fahrtauglich.ch\/fr\/praxisportal\/trail-making-test\/","og_locale":"fr_FR","og_type":"article","og_title":"Trail Making Test: Digitaler Trail Making Test (TMT) zum \u00dcben","og_description":"\u00dcben Sie f\u00fcr die verkehrsmedizinische Untersuchung Stufe 1 den Trail Making Test (TMT). Steigern Sie Ihre kognitiven F\u00e4higkeiten!","og_url":"https:\/\/fahrtauglich.ch\/fr\/praxisportal\/trail-making-test\/","og_site_name":"Fahrtauglich","article_modified_time":"2026-10-12T10:00:02+00:00","twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/fahrtauglich.ch\/praxisportal\/trail-making-test\/","url":"https:\/\/fahrtauglich.ch\/praxisportal\/trail-making-test\/","name":"Trail Making Test: Digitaler Trail Making Test (TMT) zum \u00dcben","isPartOf":{"@id":"https:\/\/fahrtauglich.ch\/#website"},"datePublished":"2024-11-17T18:23:18+00:00","dateModified":"2026-10-12T10:00:02+00:00","description":"\u00dcben Sie f\u00fcr die verkehrsmedizinische Untersuchung Stufe 1 den Trail Making Test (TMT). Steigern Sie Ihre kognitiven F\u00e4higkeiten!","breadcrumb":{"@id":"https:\/\/fahrtauglich.ch\/praxisportal\/trail-making-test\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fahrtauglich.ch\/praxisportal\/trail-making-test\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fahrtauglich.ch\/praxisportal\/trail-making-test\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/fahrtauglich.ch\/"},{"@type":"ListItem","position":2,"name":"Praxisportal","item":"https:\/\/fahrtauglich.ch\/praxisportal\/"},{"@type":"ListItem","position":3,"name":"Trail Making Test"}]},{"@type":"WebSite","@id":"https:\/\/fahrtauglich.ch\/#website","url":"https:\/\/fahrtauglich.ch\/","name":"Fahrtauglich","description":"","publisher":{"@id":"https:\/\/fahrtauglich.ch\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fahrtauglich.ch\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/fahrtauglich.ch\/#organization","name":"Fahrtauglich","url":"https:\/\/fahrtauglich.ch\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/fahrtauglich.ch\/#\/schema\/logo\/image\/","url":"https:\/\/fahrtauglich.ch\/wp-content\/uploads\/2024\/08\/cropped-Logo-2.jpg","contentUrl":"https:\/\/fahrtauglich.ch\/wp-content\/uploads\/2024\/08\/cropped-Logo-2.jpg","width":307,"height":188,"caption":"Fahrtauglich"},"image":{"@id":"https:\/\/fahrtauglich.ch\/#\/schema\/logo\/image\/"}}]}},"rttpg_featured_image_url":null,"rttpg_author":{"display_name":"fahrtauglich.ch","author_link":"https:\/\/fahrtauglich.ch\/fr\/blog\/author\/mintcream-quetzal-259960-hostingersite-com\/"},"rttpg_comment":0,"rttpg_category":null,"rttpg_excerpt":"Spielen Sie Sudoku online mit individuell einstellbarem Fehlerlimit. Unser adaptives Sudoku wird nach jedem Erfolg schwieriger.","_links":{"self":[{"href":"https:\/\/fahrtauglich.ch\/fr\/wp-json\/wp\/v2\/pages\/4532","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fahrtauglich.ch\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/fahrtauglich.ch\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/fahrtauglich.ch\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fahrtauglich.ch\/fr\/wp-json\/wp\/v2\/comments?post=4532"}],"version-history":[{"count":199,"href":"https:\/\/fahrtauglich.ch\/fr\/wp-json\/wp\/v2\/pages\/4532\/revisions"}],"predecessor-version":[{"id":8572,"href":"https:\/\/fahrtauglich.ch\/fr\/wp-json\/wp\/v2\/pages\/4532\/revisions\/8572"}],"up":[{"embeddable":true,"href":"https:\/\/fahrtauglich.ch\/fr\/wp-json\/wp\/v2\/pages\/1467"}],"wp:attachment":[{"href":"https:\/\/fahrtauglich.ch\/fr\/wp-json\/wp\/v2\/media?parent=4532"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}