{"id":2448,"date":"2024-10-11T12:17:20","date_gmt":"2024-10-11T10:17:20","guid":{"rendered":"https:\/\/fahrtauglich.ch\/?page_id=2448"},"modified":"2026-10-12T14:57:55","modified_gmt":"2026-10-12T12:57:55","slug":"dual-n-back-test","status":"publish","type":"page","link":"https:\/\/fahrtauglich.ch\/fr\/praxisportal\/dual-n-back-test\/","title":{"rendered":"Dual N-Back-Test"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2448\" class=\"elementor elementor-2448\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8d4d7bf e-flex e-con-boxed e-con e-parent\" data-id=\"8d4d7bf\" 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-073745f elementor-widget elementor-widget-heading\" data-id=\"073745f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Dual N-Back-Test<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8fe7f66 e-flex e-con-boxed e-con e-parent\" data-id=\"8fe7f66\" 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-dc3b99f elementor-widget elementor-widget-heading\" data-id=\"dc3b99f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><br>Anleitung zum Test<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-837e227 elementor-arrows-position-outside elementor-pagination-position-outside elementor--h-position-center elementor--v-position-middle elementor-widget elementor-widget-slides\" data-id=\"837e227\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;autoplay_speed&quot;:10000,&quot;navigation&quot;:&quot;both&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;pause_on_hover&quot;:&quot;yes&quot;,&quot;pause_on_interaction&quot;:&quot;yes&quot;,&quot;infinite&quot;:&quot;yes&quot;,&quot;transition&quot;:&quot;slide&quot;,&quot;transition_speed&quot;:500}\" data-widget_type=\"slides.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-swiper\">\n\t\t\t\t\t<div class=\"elementor-slides-wrapper elementor-main-swiper swiper\" role=\"region\" aria-roledescription=\"carousel\" aria-label=\"Slider\" dir=\"ltr\" data-animation=\"fadeInUp\">\n\t\t\t\t<div class=\"swiper-wrapper elementor-slides\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-repeater-item-f79a63f swiper-slide\" role=\"group\" aria-roledescription=\"slide\"><div class=\"swiper-slide-bg\" role=\"img\" aria-label=\"Dual N-Back-Test-Erkla\u0308rung\"><\/div><div class=\"swiper-slide-inner\" ><div class=\"swiper-slide-contents\"><\/div><\/div><\/div><div class=\"elementor-repeater-item-f830e47 swiper-slide\" role=\"group\" aria-roledescription=\"slide\"><div class=\"swiper-slide-bg\" role=\"img\" aria-label=\"Dual N-Back-Test-Anleitung\"><\/div><div class=\"swiper-slide-inner\" ><div class=\"swiper-slide-contents\"><\/div><\/div><\/div><div class=\"elementor-repeater-item-06c7fbb swiper-slide\" role=\"group\" aria-roledescription=\"slide\"><div class=\"swiper-slide-bg\" role=\"img\" aria-label=\"Dual N-Back-Test_Schritt 3\"><\/div><div class=\"swiper-slide-inner\" ><div class=\"swiper-slide-contents\"><\/div><\/div><\/div><div class=\"elementor-repeater-item-608eb7b swiper-slide\" role=\"group\" aria-roledescription=\"slide\"><div class=\"swiper-slide-bg\" role=\"img\" aria-label=\"Dual N-Back-Test_Schritt 4\"><\/div><div class=\"swiper-slide-inner\" ><div class=\"swiper-slide-contents\"><\/div><\/div><\/div><div class=\"elementor-repeater-item-894b07d swiper-slide\" role=\"group\" aria-roledescription=\"slide\"><div class=\"swiper-slide-bg\" role=\"img\" aria-label=\"Dual N-Back-Test_Schritt 5\"><\/div><div class=\"swiper-slide-inner\" ><div class=\"swiper-slide-contents\"><\/div><\/div><\/div><div class=\"elementor-repeater-item-2a04758 swiper-slide\" role=\"group\" aria-roledescription=\"slide\"><div class=\"swiper-slide-bg\" role=\"img\" aria-label=\"Dual N-Back-Test_Schritt 6\"><\/div><div class=\"swiper-slide-inner\" ><div class=\"swiper-slide-contents\"><\/div><\/div><\/div><div class=\"elementor-repeater-item-73b919a swiper-slide\" role=\"group\" aria-roledescription=\"slide\"><div class=\"swiper-slide-bg\" role=\"img\" aria-label=\"Dual N-Back-Test-Anleitung-Erkla\u0308rung-Kopfho\u0308rer\"><\/div><div class=\"swiper-slide-inner\" ><div class=\"swiper-slide-contents\"><\/div><\/div><\/div>\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-prev\" role=\"button\" tabindex=\"0\" aria-label=\"Vorheriger Slide\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-eicon-chevron-left\" viewBox=\"0 0 1000 1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M646 125C629 125 613 133 604 142L308 442C296 454 292 471 292 487 292 504 296 521 308 533L604 854C617 867 629 875 646 875 663 875 679 871 692 858 704 846 713 829 713 812 713 796 708 779 692 767L438 487 692 225C700 217 708 204 708 187 708 171 704 154 692 142 675 129 663 125 646 125Z\"><\/path><\/svg>\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-next\" role=\"button\" tabindex=\"0\" aria-label=\"N\u00e4chster Slide\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-eicon-chevron-right\" viewBox=\"0 0 1000 1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M696 533C708 521 713 504 713 487 713 471 708 454 696 446L400 146C388 133 375 125 354 125 338 125 325 129 313 142 300 154 292 171 292 187 292 204 296 221 308 233L563 492 304 771C292 783 288 800 288 817 288 833 296 850 308 863 321 871 338 875 354 875 371 875 388 867 400 854L696 533Z\"><\/path><\/svg>\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"swiper-pagination\"><\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9458b50 elementor-widget elementor-widget-spacer\" data-id=\"9458b50\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-bfe5fde e-flex e-con-boxed e-con e-parent\" data-id=\"bfe5fde\" 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-d5869e8 elementor-widget elementor-widget-heading\" data-id=\"d5869e8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Der Test: Dual N-Back<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-6ee8008 e-flex e-con-boxed e-con e-parent\" data-id=\"6ee8008\" 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-e0303d2 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-spacer\" data-id=\"e0303d2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c21f1e3 elementor-widget elementor-widget-html\" data-id=\"c21f1e3\" 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    Dual N-Back \u2014 fahrtauglich.ch\/praxisportal\/dual-n-back-test\/\r\n    Einbau: Inhalt dieser Datei in das bestehende HTML-Widget unter\r\n    \u00abDer Test: Dual N-Back\u00bb einfuegen (ersetzt den alten Code). ANDERS als bei\r\n    den uebrigen Spielen deckt dieses Snippet NUR den Test ab: Titel, Einleitung\r\n    und die Erklaer-Slides bleiben als Elementor-Widgets stehen (Entscheid User).\r\n    Kein <html>\/<head>\/<body>.\r\n\r\n    Grundlage: trainmybrain-nback.html (Stand 2026-08-24). Uebernommen: Taktung\r\n    nach Jaeggi et al. (2008), feste Zahl von Zielen je Durchgang, Wertung je\r\n    Kanal mit Trennschaerfe (d'), automatische Stufe, Tonpruefung, Abbruch bei\r\n    Tab-Wechsel. Abweichung (Entscheid User 2026-10-12): drei Antwortknoepfe\r\n    Position \/ Sound \/ Beides wie auf den Slides. Gewertet wird trotzdem je\r\n    Kanal: \u00abBeides\u00bb zaehlt fuer Position UND Ton.\r\n\r\n    Optik: fahrtauglich.ch \u2014 Poppins, Gelb #FFBF00, Flaechen #F3F5F8, Pill-Buttons.\r\n    Alles CSS haengt an #ftnb, damit nichts in die Elementor-Seite durchschlaegt.\r\n-->\r\n<style>\r\n    #ftnb {\r\n        --ftnb-gelb: #FFBF00;\r\n        --ftnb-gelb-dunkel: #E6AB00;\r\n        --ftnb-gelb-hell: #FFF4CC;\r\n        --ftnb-schwarz: #000000;\r\n        --ftnb-text: #1F2937;\r\n        --ftnb-text-2: #4B5563;\r\n        --ftnb-flaeche: #F3F5F8;\r\n        --ftnb-linie: #C8D5DC;\r\n        --ftnb-zelle: #CFD8DC;\r\n        --ftnb-gruen: #047857;\r\n        --ftnb-fehler: #B91C1C;\r\n\r\n        font-family: 'Poppins', sans-serif;\r\n        color: var(--ftnb-text);\r\n        line-height: 1.5;\r\n        width: 100%;\r\n        max-width: 620px;\r\n        margin: 0 auto 40px;\r\n        box-sizing: border-box;\r\n        text-align: center;\r\n    }\r\n    #ftnb *, #ftnb *::before, #ftnb *::after { box-sizing: border-box; }\r\n    #ftnb [hidden] { display: none !important; }\r\n\r\n    \/* Spielkarte (Optik wie Wordle auf fahrtauglich.ch). overflow: clip statt\r\n       hidden \u2014 sonst verschiebt ein Fokus\/scrollIntoView den Karteninhalt. *\/\r\n    #ftnb .ftnb-karte {\r\n        position: relative;\r\n        overflow: clip;\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: 28px 28px 24px;\r\n    }\r\n    #ftnb .ftnb-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: ftnb-hintergrund 25s linear infinite;\r\n        z-index: 0;\r\n        pointer-events: none;\r\n    }\r\n    @keyframes ftnb-hintergrund {\r\n        0%   { transform: translate(0, 0) rotate(0deg); }\r\n        100% { transform: translate(-30px, -30px) rotate(360deg); }\r\n    }\r\n    #ftnb .ftnb-inhalt {\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: 18px;\r\n    }\r\n\r\n    \/* Stufe und Schritte *\/\r\n    #ftnb .ftnb-kontrollen {\r\n        display: flex;\r\n        flex-wrap: wrap;\r\n        justify-content: center;\r\n        align-items: center;\r\n        gap: 12px 28px;\r\n        width: 100%;\r\n    }\r\n    #ftnb .ftnb-stufe { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; justify-content: center; }\r\n    #ftnb .ftnb-etikett { font-size: 0.9rem; color: var(--ftnb-text-2); }\r\n    #ftnb .ftnb-stufe-wert { font-size: 1.35rem; font-weight: 600; color: var(--ftnb-schwarz); }\r\n    #ftnb .ftnb-hinweis-klein { font-size: 0.8rem; color: var(--ftnb-text-2); }\r\n    #ftnb .ftnb-schritte { display: flex; align-items: center; gap: 10px; }\r\n    #ftnb .ftnb-schritte label { font-size: 0.9rem; color: var(--ftnb-text-2); }\r\n    #ftnb .ftnb-schritte input[type=\"range\"] {\r\n        width: 130px;\r\n        margin: 0;\r\n        accent-color: var(--ftnb-gelb-dunkel);\r\n        cursor: pointer;\r\n    }\r\n    #ftnb .ftnb-schritte-wert { min-width: 2ch; font-weight: 600; color: var(--ftnb-schwarz); }\r\n\r\n    \/* Tonpruefung *\/\r\n    #ftnb .ftnb-tonpruefung {\r\n        width: 100%;\r\n        padding: 16px 18px;\r\n        background: #ffffff;\r\n        border-left: 4px solid var(--ftnb-gelb);\r\n        border-radius: 10px;\r\n        box-shadow: 0 2px 10px rgba(0, 0, 0, 0.06);\r\n        text-align: left;\r\n    }\r\n    #ftnb .ftnb-ton-text { margin: 0 0 12px; font-size: 0.95rem; color: var(--ftnb-text); }\r\n    #ftnb .ftnb-ton-text strong { font-weight: 600; color: var(--ftnb-schwarz); }\r\n    #ftnb .ftnb-ton-knoepfe { display: flex; gap: 10px; flex-wrap: wrap; }\r\n    #ftnb .ftnb-ton-status { min-height: 1.4em; margin: 10px 0 0; font-size: 0.88rem; color: var(--ftnb-text-2); }\r\n    #ftnb .ftnb-ton-status.ton-fehler { color: var(--ftnb-fehler); font-weight: 600; }\r\n\r\n    \/* Raster 3x3 (Mitte bleibt leer, wie im Standard mit 8 Positionen) *\/\r\n    #ftnb .ftnb-gitter {\r\n        display: grid;\r\n        grid-template-columns: repeat(3, 1fr);\r\n        gap: 10px;\r\n        width: 100%;\r\n        max-width: 330px;\r\n        aspect-ratio: 1;\r\n    }\r\n    #ftnb .ftnb-zelle {\r\n        background: var(--ftnb-zelle);\r\n        border-radius: 10px;\r\n        transition: background-color 0.08s linear;\r\n    }\r\n    #ftnb .ftnb-zelle.aktiv { background: var(--ftnb-gelb); box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.12) inset; }\r\n\r\n    \/* Antwortknoepfe *\/\r\n    #ftnb .ftnb-antworten {\r\n        display: grid;\r\n        grid-template-columns: repeat(3, 1fr);\r\n        gap: 10px;\r\n        width: 100%;\r\n        max-width: 420px;\r\n    }\r\n    #ftnb .ftnb-antwort {\r\n        -webkit-appearance: none;\r\n        appearance: none;\r\n        margin: 0;\r\n        min-height: 60px;\r\n        padding: 8px 6px;\r\n        display: flex;\r\n        flex-direction: column;\r\n        align-items: center;\r\n        justify-content: center;\r\n        gap: 2px;\r\n        background: #ffffff;\r\n        border: 2px solid var(--ftnb-schwarz);\r\n        border-radius: 14px;\r\n        box-shadow: none;\r\n        font-family: inherit;\r\n        font-size: 1rem;\r\n        font-weight: 600;\r\n        line-height: 1.15;\r\n        text-transform: none;\r\n        color: var(--ftnb-schwarz);\r\n        cursor: pointer;\r\n        touch-action: manipulation;\r\n        -webkit-user-select: none;\r\n        user-select: none;\r\n        transition: background 0.12s ease, border-color 0.12s ease;\r\n    }\r\n    #ftnb .ftnb-antwort:hover:not(:disabled),\r\n    #ftnb .ftnb-antwort:focus:not(:disabled) { background: var(--ftnb-flaeche); color: var(--ftnb-schwarz); }\r\n    #ftnb .ftnb-antwort[aria-pressed=\"true\"]:not(:disabled) { background: var(--ftnb-gelb); border-color: var(--ftnb-gelb); }\r\n    #ftnb .ftnb-antwort:disabled { border-color: var(--ftnb-linie); color: #9CA3AF; cursor: not-allowed; }\r\n    #ftnb .ftnb-antwort .ftnb-taste { font-size: 0.72rem; font-weight: 400; color: var(--ftnb-text-2); }\r\n    #ftnb .ftnb-antwort:disabled .ftnb-taste { color: #9CA3AF; }\r\n    @media (pointer: coarse) { #ftnb .ftnb-antwort .ftnb-taste { display: none; } }\r\n    \/* Kurze Rueckmeldung beim Druecken *\/\r\n    #ftnb .ftnb-antwort.blitz-richtig { background: #D1FAE5 !important; border-color: var(--ftnb-gruen) !important; }\r\n    #ftnb .ftnb-antwort.blitz-falsch  { background: #FEE2E2 !important; border-color: var(--ftnb-fehler) !important; }\r\n\r\n    #ftnb .ftnb-status { min-height: 1.5em; margin: 0; font-size: 0.95rem; font-weight: 500; color: var(--ftnb-text); }\r\n    #ftnb .ftnb-fuss { margin: 0; font-size: 0.8rem; color: var(--ftnb-text-2); }\r\n\r\n    \/* ===== Buttons (Pill-Stil der fahrtauglich.ch-Buttons) ===== *\/\r\n    #ftnb .ftnb-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(--ftnb-gelb);\r\n        border: 2px solid var(--ftnb-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(--ftnb-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    #ftnb .ftnb-knopf:hover,\r\n    #ftnb .ftnb-knopf:focus { background: var(--ftnb-gelb-dunkel); border-color: var(--ftnb-gelb-dunkel); color: var(--ftnb-schwarz); }\r\n    #ftnb .ftnb-knopf:hover { transform: translateY(-1px); }\r\n    #ftnb .ftnb-knopf-hell { background: #ffffff; border-color: var(--ftnb-schwarz); }\r\n    #ftnb .ftnb-knopf-hell:hover,\r\n    #ftnb .ftnb-knopf-hell:focus { background: var(--ftnb-flaeche); border-color: var(--ftnb-schwarz); }\r\n    #ftnb .ftnb-knopf:disabled { opacity: 0.5; cursor: not-allowed; transform: none; }\r\n    #ftnb .ftnb-steuerung { display: flex; gap: 10px; justify-content: center; }\r\n\r\n    #ftnb .ftnb-knopf:focus-visible,\r\n    #ftnb .ftnb-antwort:focus-visible,\r\n    #ftnb .ftnb-modal-schliessen:focus-visible,\r\n    #ftnb input:focus-visible { outline: 3px solid var(--ftnb-schwarz); outline-offset: 2px; }\r\n\r\n    \/* ===== Ergebnisdialog ===== *\/\r\n    #ftnb .ftnb-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    #ftnb .ftnb-modal.active { display: flex; }\r\n    #ftnb .ftnb-modal-hintergrund { position: absolute; inset: 0; background: rgba(0, 0, 0, 0.4); backdrop-filter: blur(5px); }\r\n    #ftnb .ftnb-modal-inhalt {\r\n        position: relative;\r\n        width: 100%;\r\n        max-width: 460px;\r\n        max-height: 88vh;\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: 30px 24px 24px;\r\n        text-align: center;\r\n        animation: ftnb-modal-ein 0.25s ease;\r\n    }\r\n    @keyframes ftnb-modal-ein {\r\n        from { opacity: 0; transform: scale(0.96) translateY(12px); }\r\n        to   { opacity: 1; transform: none; }\r\n    }\r\n    #ftnb .ftnb-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    #ftnb .ftnb-modal-schliessen:hover,\r\n    #ftnb .ftnb-modal-schliessen:focus { background: var(--ftnb-flaeche); color: #374151; }\r\n    #ftnb .ftnb-modal h2 { margin: 0 0 6px; font-family: inherit; font-size: 1.6rem; font-weight: 600; line-height: 1.2; color: var(--ftnb-text); }\r\n    #ftnb .ftnb-modal p { margin: 0 0 6px; color: var(--ftnb-text-2); }\r\n    #ftnb .ftnb-kanaele { display: grid; gap: 10px; margin: 16px 0 12px; }\r\n    #ftnb .ftnb-kanal { padding: 10px 12px; background: var(--ftnb-flaeche); border-radius: 10px; }\r\n    #ftnb .ftnb-kanal h3 { margin: 0 0 4px; font-family: inherit; font-size: 0.95rem; font-weight: 600; color: var(--ftnb-schwarz); }\r\n    #ftnb .ftnb-werte { display: flex; justify-content: center; gap: 22px; }\r\n    #ftnb .ftnb-werte strong { display: block; font-size: 1.5rem; font-weight: 700; line-height: 1.1; color: var(--ftnb-schwarz); font-variant-numeric: tabular-nums; }\r\n    #ftnb .ftnb-werte span { font-size: 0.8rem; color: var(--ftnb-text-2); }\r\n    #ftnb .ftnb-trenn { margin: 6px 0 4px; font-size: 1rem; color: var(--ftnb-text); }\r\n    #ftnb .ftnb-trenn strong { font-size: 1.2rem; font-weight: 700; color: var(--ftnb-schwarz); }\r\n    #ftnb .ftnb-trenn-hilfe { display: block; margin-top: 2px; font-size: 0.8rem; color: var(--ftnb-text-2); }\r\n    #ftnb .ftnb-stufen-satz { margin: 12px 0 0 !important; padding: 8px 12px; background: var(--ftnb-gelb-hell); border-radius: 8px; font-weight: 500; color: var(--ftnb-schwarz) !important; }\r\n    #ftnb .ftnb-modal-knoepfe { display: flex; gap: 10px; justify-content: center; flex-wrap: wrap; margin-top: 16px; }\r\n\r\n    #ftnb .ftnb-sr { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }\r\n\r\n    @media (max-width: 768px) {\r\n        #ftnb { max-width: 95%; }\r\n    }\r\n    @media (max-width: 520px) {\r\n        #ftnb .ftnb-karte { padding: 18px 12px 16px; border-radius: 16px; }\r\n        #ftnb .ftnb-inhalt { gap: 14px; }\r\n        #ftnb .ftnb-gitter { gap: 8px; max-width: 270px; }\r\n        #ftnb .ftnb-antwort { min-height: 56px; font-size: 0.95rem; }\r\n        #ftnb .ftnb-werte { gap: 14px; }\r\n    }\r\n\r\n    @media (prefers-reduced-motion: reduce) {\r\n        #ftnb *, #ftnb *::before, #ftnb *::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=\"ftnb\">\r\n\r\n    <div class=\"ftnb-sr\" aria-live=\"polite\" aria-atomic=\"true\" id=\"ftnb-sr\"><\/div>\r\n\r\n    <section class=\"ftnb-karte\" aria-label=\"Dual N-Back Test\">\r\n        <div class=\"ftnb-inhalt\">\r\n\r\n            <div class=\"ftnb-kontrollen\">\r\n                <div class=\"ftnb-stufe\">\r\n                    <span class=\"ftnb-etikett\">Stufe<\/span>\r\n                    <strong class=\"ftnb-stufe-wert\" id=\"ftnb-stufe\">N = 1<\/strong>\r\n                    <span class=\"ftnb-hinweis-klein\">passt sich automatisch an<\/span>\r\n                <\/div>\r\n                <div class=\"ftnb-schritte\">\r\n                    <label for=\"ftnb-schritte\">Schritte<\/label>\r\n                    <input type=\"range\" id=\"ftnb-schritte\" min=\"10\" max=\"30\" step=\"5\" value=\"20\">\r\n                    <span class=\"ftnb-schritte-wert\" id=\"ftnb-schritte-wert\">20<\/span>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <!-- Tonpruefung: ohne Ton ist der Test nicht spielbar -->\r\n            <div class=\"ftnb-tonpruefung\" id=\"ftnb-tonpruefung\">\r\n                <p class=\"ftnb-ton-text\"><strong>Dieser Test braucht Ton.<\/strong> Die Buchstaben werden gesprochen, nicht angezeigt. Setzen Sie Kopfh\u00f6rer auf oder schalten Sie den Lautsprecher ein.<\/p>\r\n                <div class=\"ftnb-ton-knoepfe\">\r\n                    <button type=\"button\" id=\"ftnb-ton-test\" class=\"ftnb-knopf ftnb-knopf-hell\">Probeton abspielen<\/button>\r\n                    <button type=\"button\" id=\"ftnb-ton-ok\" class=\"ftnb-knopf\" hidden>Geh\u00f6rt, los geht's<\/button>\r\n                <\/div>\r\n                <p class=\"ftnb-ton-status\" id=\"ftnb-ton-status\" role=\"status\"><\/p>\r\n            <\/div>\r\n\r\n            <div class=\"ftnb-steuerung\">\r\n                <button type=\"button\" id=\"ftnb-start\" class=\"ftnb-knopf\" disabled>Ton wird geladen \u2026<\/button>\r\n                <button type=\"button\" id=\"ftnb-stop\" class=\"ftnb-knopf ftnb-knopf-hell\" hidden>Abbrechen<\/button>\r\n            <\/div>\r\n\r\n            <div class=\"ftnb-gitter\" id=\"ftnb-gitter\" aria-hidden=\"true\">\r\n                <div class=\"ftnb-zelle\" id=\"ftnb-zelle-0\"><\/div>\r\n                <div class=\"ftnb-zelle\" id=\"ftnb-zelle-1\"><\/div>\r\n                <div class=\"ftnb-zelle\" id=\"ftnb-zelle-2\"><\/div>\r\n                <div class=\"ftnb-zelle\" id=\"ftnb-zelle-3\"><\/div>\r\n                <div class=\"ftnb-zelle\" id=\"ftnb-zelle-4\"><\/div>\r\n                <div class=\"ftnb-zelle\" id=\"ftnb-zelle-5\"><\/div>\r\n                <div class=\"ftnb-zelle\" id=\"ftnb-zelle-6\"><\/div>\r\n                <div class=\"ftnb-zelle\" id=\"ftnb-zelle-7\"><\/div>\r\n                <div class=\"ftnb-zelle\" id=\"ftnb-zelle-8\"><\/div>\r\n            <\/div>\r\n\r\n            <div class=\"ftnb-antworten\" id=\"ftnb-antworten\" role=\"group\" aria-label=\"Antwort: was stimmt mit dem Schritt vor N \u00fcberein?\">\r\n                <button type=\"button\" id=\"ftnb-position\" class=\"ftnb-antwort\" aria-pressed=\"false\" disabled>Position<span class=\"ftnb-taste\">Taste A<\/span><\/button>\r\n                <button type=\"button\" id=\"ftnb-sound\" class=\"ftnb-antwort\" aria-pressed=\"false\" disabled>Sound<span class=\"ftnb-taste\">Taste L<\/span><\/button>\r\n                <button type=\"button\" id=\"ftnb-beides\" class=\"ftnb-antwort\" aria-pressed=\"false\" disabled>Beides<span class=\"ftnb-taste\">Taste B<\/span><\/button>\r\n            <\/div>\r\n\r\n            <p class=\"ftnb-status\" id=\"ftnb-status\" aria-live=\"polite\">Bereit<\/p>\r\n            <p class=\"ftnb-fuss\">Stimmt nichts \u00fcberein, dr\u00fccken Sie nichts. Auch das ist eine Antwort.<\/p>\r\n\r\n        <\/div>\r\n    <\/section>\r\n\r\n    <!-- Ergebnisdialog -->\r\n    <div class=\"ftnb-modal\" id=\"ftnb-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"ftnb-erg-titel\">\r\n        <div class=\"ftnb-modal-hintergrund\"><\/div>\r\n        <div class=\"ftnb-modal-inhalt\">\r\n            <button type=\"button\" class=\"ftnb-modal-schliessen\" aria-label=\"Schliessen\">\u00d7<\/button>\r\n            <h2 id=\"ftnb-erg-titel\">Durchgang beendet<\/h2>\r\n            <p id=\"ftnb-erg-untertitel\">So ist es gelaufen.<\/p>\r\n            <div class=\"ftnb-kanaele\">\r\n                <div class=\"ftnb-kanal\">\r\n                    <h3>Position<\/h3>\r\n                    <div class=\"ftnb-werte\">\r\n                        <div><strong id=\"ftnb-erg-pos-treffer\">0<\/strong><span>erkannt<\/span><\/div>\r\n                        <div><strong id=\"ftnb-erg-pos-uebersehen\">0<\/strong><span>\u00fcbersehen<\/span><\/div>\r\n                        <div><strong id=\"ftnb-erg-pos-fehlgriff\">0<\/strong><span>Fehlgriffe<\/span><\/div>\r\n                    <\/div>\r\n                <\/div>\r\n                <div class=\"ftnb-kanal\">\r\n                    <h3>Sound<\/h3>\r\n                    <div class=\"ftnb-werte\">\r\n                        <div><strong id=\"ftnb-erg-ton-treffer\">0<\/strong><span>erkannt<\/span><\/div>\r\n                        <div><strong id=\"ftnb-erg-ton-uebersehen\">0<\/strong><span>\u00fcbersehen<\/span><\/div>\r\n                        <div><strong id=\"ftnb-erg-ton-fehlgriff\">0<\/strong><span>Fehlgriffe<\/span><\/div>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n            <p class=\"ftnb-trenn\">Trennsch\u00e4rfe <strong id=\"ftnb-erg-dprime\">\u2013<\/strong>\r\n                <span class=\"ftnb-trenn-hilfe\">Verrechnet Treffer und Fehlgriffe. Etwa 0 heisst: nicht besser als geraten. Ab 1 erkennbares K\u00f6nnen, ab 2 sehr gut.<\/span>\r\n            <\/p>\r\n            <p class=\"ftnb-stufen-satz\" id=\"ftnb-erg-stufe-satz\"><\/p>\r\n            <div class=\"ftnb-modal-knoepfe\">\r\n                <button type=\"button\" id=\"ftnb-weiter\" class=\"ftnb-knopf\">N\u00e4chster Durchgang<\/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', ftnbStart);\r\n    } else {\r\n        ftnbStart();\r\n    }\r\n\r\n    function ftnbStart() {\r\n        const root = document.getElementById('ftnb');\r\n        if (!root || root.dataset.ftnbBereit) return;\r\n        root.dataset.ftnbBereit = '1';\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        \/\/ Hoehe eines fixierten\/klebenden Seitenkopfs (Theme), gemessen statt geraten\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        \/\/ \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        const modal = document.getElementById('ftnb-modal');\r\n        const offenesModal = () => (modal.classList.contains('active') ? modal : null);\r\n        function zeigeModal() {\r\n            modal.classList.add('active');\r\n            document.body.style.overflow = 'hidden';\r\n            const ziel = document.getElementById('ftnb-weiter');\r\n            if (ziel) ziel.focus();\r\n        }\r\n        function schliesseModal() {\r\n            modal.classList.remove('active');\r\n            document.body.style.overflow = '';\r\n        }\r\n        modal.querySelector('.ftnb-modal-schliessen').addEventListener('click', schliesseModal);\r\n        modal.querySelector('.ftnb-modal-hintergrund').addEventListener('click', schliesseModal);\r\n        document.addEventListener('keydown', e => {\r\n            if (e.key === 'Escape' && offenesModal()) { e.preventDefault(); schliesseModal(); }\r\n        });\r\n\r\n        \/\/ \u2500\u2500 Konstanten \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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        \/\/ Taktung nach Jaeggi et al. 2008: 500 ms Reiz, 3000 ms Abstand. Der\r\n        \/\/ fr\u00fchere Takt von 2500 ms war enger als der Laborstandard \u2014 und liess\r\n        \/\/ auf dem Handy kaum Zeit, zwei Kn\u00f6pfe zu treffen.\r\n        const REIZ_MS = 500;\r\n        const TAKT_MS = 3000;\r\n        const MAX_N   = 9;\r\n\r\n        \/\/ 3x3-Raster ohne Mitte: 8 Positionen, wie im Standard\r\n        const POSITIONEN = [0, 1, 2, 3, 5, 6, 7, 8];\r\n\r\n        \/\/ Zielanteile je auswertbarem Schritt. Bei 20 Schritten ergibt das\r\n        \/\/ exakt die Standardverteilung 4 Positions-, 4 Ton- und 2 Doppelziele.\r\n        const ANTEIL_DOPPEL  = 0.10;\r\n        const ANTEIL_NUR_POS = 0.20;\r\n        const ANTEIL_NUR_TON = 0.20;\r\n\r\n        const SPEICHER_KEY = 'ft_nback_stats_v1';\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\r\n        \/\/ Ein einziger Phasen-Wert, den jeder verz\u00f6gerte R\u00fcckruf pr\u00fcft, bevor\r\n        \/\/ er handelt (Muster aus trainmybrain-merkkarussell.html).\r\n        let phase        = 'bereit';     \/\/ 'bereit' | 'laeuft' | 'fertig'\r\n        let folge        = [];\r\n        let antworten    = [];           \/\/ je auswertbarem Schritt {pos, ton}\r\n        let schritt      = 0;            \/\/ Anzahl bereits gezeigter Reize\r\n        let aktuellesN   = 1;\r\n        let blockLaenge  = 20;\r\n        let antwortPos   = false;\r\n        let antwortTon   = false;\r\n        let taktTimer    = null;\r\n        let reizTimer    = null;\r\n        let blitzTimer   = [];\r\n        let blockStart   = 0;\r\n        let tonGeprueft  = false;\r\n\r\n        \/\/ \u2500\u2500 Audio \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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        \/\/ Die Tondateien liegen unveraendert auf fahrtauglich.ch (bewusster\r\n        \/\/ Entscheid: Audio nicht anfassen). Faellt diese Domain aus, meldet\r\n        \/\/ der Ladefehler-Pfad das sauber und sperrt den Start.\r\n        const TON_BUCHSTABEN = ['H', 'C', 'Q', 'P', 'G', 'K', 'W', 'T'];\r\n        const AUDIO_BASIS = 'https:\/\/fahrtauglich.ch\/wp-content\/uploads\/2024\/10\/';\r\n        const audioStimuli = TON_BUCHSTABEN.map(b => new Audio(AUDIO_BASIS + b + '.wav'));\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\r\n        const startBtn        = document.getElementById('ftnb-start');\r\n        const stopBtn         = document.getElementById('ftnb-stop');\r\n        const positionBtn     = document.getElementById('ftnb-position');\r\n        const soundBtn        = document.getElementById('ftnb-sound');\r\n        const beidesBtn       = document.getElementById('ftnb-beides');\r\n        const stufeAnzeige    = document.getElementById('ftnb-stufe');\r\n        const stepCountInput  = document.getElementById('ftnb-schritte');\r\n        const stepCountDisplay= document.getElementById('ftnb-schritte-wert');\r\n        const stepCountEl     = document.getElementById('ftnb-status');\r\n        const spielmeldung    = document.getElementById('ftnb-sr');\r\n        const tonpruefung     = document.getElementById('ftnb-tonpruefung');\r\n        const tonTestBtn      = document.getElementById('ftnb-ton-test');\r\n        const tonOkBtn        = document.getElementById('ftnb-ton-ok');\r\n        const tonStatus       = document.getElementById('ftnb-ton-status');\r\n        const modalErgebnis   = document.getElementById('ftnb-modal');\r\n\r\n        \/\/ \u2500\u2500 Fortschritt merken \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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        \/\/ Ohne Speicherung startet jeder Besuch wieder bei N=1 und die\r\n        \/\/ Anpassung sammelt sich nie an. Defensiv gelesen wie in Wordle.\r\n        function ladeStand() {\r\n            try {\r\n                const roh = localStorage.getItem(SPEICHER_KEY);\r\n                if (roh) {\r\n                    const o = JSON.parse(roh);\r\n                    if (o && typeof o === 'object') {\r\n                        return {\r\n                            stufe:        Math.min(MAX_N, Math.max(1, Number(o.stufe) || 1)),\r\n                            durchgaenge:  Number(o.durchgaenge) || 0,\r\n                            besteTrenn:   Number(o.besteTrenn)  || 0,\r\n                        };\r\n                    }\r\n                }\r\n            } catch (e) {}\r\n            return { stufe: 1, durchgaenge: 0, besteTrenn: 0 };\r\n        }\r\n\r\n        function speichereStand(stand) {\r\n            try { localStorage.setItem(SPEICHER_KEY, JSON.stringify(stand)); } catch (e) {}\r\n        }\r\n\r\n        let stand = ladeStand();\r\n        aktuellesN = stand.stufe;\r\n\r\n        \/\/ \u2500\u2500 Reizfolge mit kontrollierten Zielen \u2500\u2500\u2500\u2500\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\r\n        function mischen(a) {\r\n            for (let i = a.length - 1; i > 0; i--) {\r\n                const j = Math.floor(Math.random() * (i + 1));\r\n                [a[i], a[j]] = [a[j], a[i]];\r\n            }\r\n            return a;\r\n        }\r\n\r\n        function zufallAusser(liste, ausgeschlossen) {\r\n            const rest = liste.filter(x => x !== ausgeschlossen);\r\n            return rest[Math.floor(Math.random() * rest.length)];\r\n        }\r\n\r\n        function zielZahlen(L) {\r\n            return {\r\n                doppel: Math.round(ANTEIL_DOPPEL  * L),\r\n                nurPos: Math.round(ANTEIL_NUR_POS * L),\r\n                nurTon: Math.round(ANTEIL_NUR_TON * L),\r\n            };\r\n        }\r\n\r\n        \/**\r\n         * Erzeugt eine Folge mit EXAKT vorgegebener Zielzahl.\r\n         *\r\n         * Der fr\u00fchere Generator zog Position und Ton rein zuf\u00e4llig und hoffte\r\n         * auf \u00dcbereinstimmungen. Im Standardblock entstanden dabei im Mittel\r\n         * nur zwei Ziele, und jeder zehnte Block enthielt gar keines \u2014 dort\r\n         * galt dann 0 === 0 als Erfolg und die Stufe stieg, ohne dass jemand\r\n         * einen Knopf ber\u00fchrt hatte.\r\n         *\r\n         * Jetzt werden die Ziele zuerst festgelegt und dann eingebaut.\r\n         * Entscheidend ist der else-Zweig: wo KEIN Ziel sein soll, wird aktiv\r\n         * ein abweichender Reiz gezogen. Ohne diesen Ausschluss entst\u00fcnden\r\n         * Zufallsziele und die Zahl stimmte wieder nicht.\r\n         *\/\r\n        function erzeugeFolge(n, L) {\r\n            const z = zielZahlen(L);\r\n            const frei   = mischen(Array.from({ length: L }, (_, k) => n + k));\r\n            const doppel = frei.splice(0, z.doppel);\r\n            const nurPos = frei.splice(0, z.nurPos);\r\n            const nurTon = frei.splice(0, z.nurTon);\r\n            const posZiel = new Set([...doppel, ...nurPos]);\r\n            const tonZiel = new Set([...doppel, ...nurTon]);\r\n\r\n            const f = [];\r\n            for (let i = 0; i < n + L; i++) {\r\n                if (i < n) {\r\n                    f.push({\r\n                        position: POSITIONEN[Math.floor(Math.random() * POSITIONEN.length)],\r\n                        ton:      Math.floor(Math.random() * TON_BUCHSTABEN.length),\r\n                    });\r\n                    continue;\r\n                }\r\n                const vorPos = f[i - n].position;\r\n                const vorTon = f[i - n].ton;\r\n                f.push({\r\n                    position: posZiel.has(i) ? vorPos : zufallAusser(POSITIONEN, vorPos),\r\n                    ton:      tonZiel.has(i) ? vorTon\r\n                                             : zufallAusser(TON_BUCHSTABEN.map((_, k) => k), vorTon),\r\n                });\r\n            }\r\n            return f;\r\n        }\r\n\r\n        function istZiel(i, kanal) {\r\n            if (i < aktuellesN) return false;\r\n            return kanal === 'pos'\r\n                ? folge[i].position === folge[i - aktuellesN].position\r\n                : folge[i].ton      === folge[i - aktuellesN].ton;\r\n        }\r\n\r\n        \/\/ \u2500\u2500 Auswertung \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\r\n        \/** Inverse Standardnormalverteilung (Acklam-N\u00e4herung). *\/\r\n        function zWert(p) {\r\n            if (p <= 0) return -Infinity;\r\n            if (p >= 1) return Infinity;\r\n            const a = [-3.969683028665376e+01, 2.209460984245205e+02, -2.759285104469687e+02,\r\n                        1.383577518672690e+02, -3.066479806614716e+01, 2.506628277459239e+00];\r\n            const b = [-5.447609879822406e+01, 1.615858368580409e+02, -1.556989798598866e+02,\r\n                        6.680131188771972e+01, -1.328068155288572e+01];\r\n            const c = [-7.784894002430293e-03, -3.223964580411365e-01, -2.400758277161838e+00,\r\n                       -2.549732539343734e+00, 4.374664141464968e+00, 2.938163982698783e+00];\r\n            const d = [7.784695709041462e-03, 3.224671290700398e-01, 2.445134137142996e+00,\r\n                       3.754408661907416e+00];\r\n            const pl = 0.02425, ph = 1 - pl;\r\n            let q, r;\r\n            if (p < pl) {\r\n                q = Math.sqrt(-2 * Math.log(p));\r\n                return (((((c[0]*q+c[1])*q+c[2])*q+c[3])*q+c[4])*q+c[5]) \/\r\n                       ((((d[0]*q+d[1])*q+d[2])*q+d[3])*q+1);\r\n            }\r\n            if (p > ph) {\r\n                q = Math.sqrt(-2 * Math.log(1 - p));\r\n                return -(((((c[0]*q+c[1])*q+c[2])*q+c[3])*q+c[4])*q+c[5]) \/\r\n                        ((((d[0]*q+d[1])*q+d[2])*q+d[3])*q+1);\r\n            }\r\n            q = p - 0.5; r = q * q;\r\n            return (((((a[0]*r+a[1])*r+a[2])*r+a[3])*r+a[4])*r+a[5])*q \/\r\n                   (((((b[0]*r+b[1])*r+b[2])*r+b[3])*r+b[4])*r+1);\r\n        }\r\n\r\n        \/**\r\n         * Trennsch\u00e4rfe d' = z(Trefferquote) \u2212 z(Fehlgriffquote), mit\r\n         * Loglinear-Korrektur (Hautus 1995) gegen unendliche Werte bei\r\n         * Quoten von exakt 0 oder 1.\r\n         *\r\n         * Der Kern der Reparatur: Ohne Fehlgriffe in der Rechnung h\u00e4tte, wer\r\n         * auf jeden Schritt dr\u00fcckt, eine perfekte Trefferquote und null K\u00f6nnen.\r\n         *\/\r\n        function dPrime(treffer, ziele, fehlgriffe, nichtZiele) {\r\n            if (ziele === 0 || nichtZiele === 0) return null;\r\n            const h = (treffer    + 0.5) \/ (ziele      + 1);\r\n            const f = (fehlgriffe + 0.5) \/ (nichtZiele + 1);\r\n            return zWert(h) - zWert(f);\r\n        }\r\n\r\n        function werteAus() {\r\n            const leer = () => ({ treffer: 0, uebersehen: 0, fehlgriff: 0, ausgelassen: 0 });\r\n            const r = { pos: leer(), ton: leer() };\r\n\r\n            for (let i = aktuellesN; i < folge.length; i++) {\r\n                const a = antworten[i - aktuellesN] || { pos: false, ton: false };\r\n                for (const k of ['pos', 'ton']) {\r\n                    const ziel = istZiel(i, k);\r\n                    if (ziel && a[k])       r[k].treffer++;\r\n                    else if (ziel && !a[k]) r[k].uebersehen++;\r\n                    else if (!ziel && a[k]) r[k].fehlgriff++;\r\n                    else                    r[k].ausgelassen++;\r\n                }\r\n            }\r\n            for (const k of ['pos', 'ton']) {\r\n                r[k].dPrime = dPrime(r[k].treffer, r[k].treffer + r[k].uebersehen,\r\n                                     r[k].fehlgriff, r[k].fehlgriff + r[k].ausgelassen);\r\n            }\r\n            r.fehler = r.pos.uebersehen + r.pos.fehlgriff + r.ton.uebersehen + r.ton.fehlgriff;\r\n            const g = [r.pos.dPrime, r.ton.dPrime].filter(v => v !== null);\r\n            r.dPrimeGesamt = g.length ? g.reduce((x, y) => x + y, 0) \/ g.length : null;\r\n            return r;\r\n        }\r\n\r\n        \/**\r\n         * Stufenregelung nach Jaeggi: unter 3 Fehlern hinauf, \u00fcber 5 hinunter.\r\n         * Als Anteil formuliert trifft das bei 20 Schritten exakt diese Werte\r\n         * und skaliert f\u00fcr 10 und 30 mit. Anders als bisher geht es auch\r\n         * wieder abw\u00e4rts \u2014 vorher stieg N nur und sank nie.\r\n         *\/\r\n        function naechsteStufe(fehler) {\r\n            if (fehler < 0.15 * blockLaenge) return Math.min(aktuellesN + 1, MAX_N);\r\n            if (fehler > 0.25 * blockLaenge) return Math.max(aktuellesN - 1, 1);\r\n            return aktuellesN;\r\n        }\r\n\r\n        \/\/ \u2500\u2500 Darstellung \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\r\n        function meldung(text) { if (spielmeldung) spielmeldung.textContent = text; }\r\n\r\n        function alleTimerLoeschen() {\r\n            clearTimeout(taktTimer);  taktTimer = null;\r\n            clearTimeout(reizTimer);  reizTimer = null;\r\n            blitzTimer.forEach(clearTimeout);\r\n            blitzTimer = [];\r\n        }\r\n\r\n        function zellenLoeschen() {\r\n            root.querySelectorAll('.ftnb-zelle').forEach(el => el.classList.remove('aktiv'));\r\n        }\r\n\r\n        function knoepfeZuruecksetzen() {\r\n            [positionBtn, soundBtn, beidesBtn].forEach(b => {\r\n                b.setAttribute('aria-pressed', 'false');\r\n                b.classList.remove('gedrueckt', 'blitz-richtig', 'blitz-falsch');\r\n            });\r\n        }\r\n\r\n        function knoepfeAktiv(an) {\r\n            [positionBtn, soundBtn, beidesBtn].forEach(b => { b.disabled = !an; });\r\n        }\r\n\r\n        function aktualisiereStufenAnzeige() {\r\n            stufeAnzeige.textContent = 'N = ' + aktuellesN;\r\n        }\r\n\r\n        function spieleTon(index) {\r\n            const clip = audioStimuli[index];\r\n            if (!clip) return;\r\n            \/\/ currentTime auf einem noch ungeladenen Element wirft auf iOS \u2014\r\n            \/\/ und ein Wurf davor haette das play() gleich mitverhindert.\r\n            try { if (clip.readyState > 0) clip.currentTime = 0; } catch (e) {}\r\n            try { clip.play().catch(() => {}); } catch (e) {}\r\n        }\r\n\r\n        function zeigeReiz(i) {\r\n            zellenLoeschen();\r\n            const zelle = document.getElementById('ftnb-zelle-' + folge[i].position);\r\n            if (zelle) {\r\n                zelle.classList.add('aktiv');\r\n                reizTimer = setTimeout(() => {\r\n                    if (phase === 'laeuft') zelle.classList.remove('aktiv');\r\n                }, REIZ_MS);\r\n            }\r\n            spieleTon(folge[i].ton);\r\n        }\r\n\r\n        \/\/ \u2500\u2500 Ablauf \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\r\n        function starteBlock() {\r\n            alleTimerLoeschen();\r\n            blockLaenge = parseInt(stepCountInput.value, 10);\r\n            folge     = erzeugeFolge(aktuellesN, blockLaenge);\r\n            antworten = Array.from({ length: blockLaenge }, () => ({ pos: false, ton: false }));\r\n            schritt   = 0;\r\n            antwortPos = antwortTon = false; wahl = null;\r\n            phase = 'laeuft';\r\n\r\n            \/\/ Einstellungen w\u00e4hrend des Durchgangs sperren \u2014 vorher konnte man\r\n            \/\/ N und L\u00e4nge mitten im Test \u00e4ndern, w\u00e4hrend die Wertung noch mit\r\n            \/\/ den alten Werten rechnete.\r\n            stepCountInput.disabled = true;\r\n            startBtn.hidden = true;\r\n            stopBtn.hidden  = false;\r\n            tonpruefung.hidden = true;\r\n            knoepfeZuruecksetzen();\r\n            knoepfeAktiv(false);\r\n            aktualisiereStufenAnzeige();\r\n\r\n            \/\/ Fokus vom Start-Knopf loesen: er wird gleich ausgeblendet, und die\r\n            \/\/ Tastensteuerung soll ohne Umweg funktionieren.\r\n            if (document.activeElement && document.activeElement.blur) document.activeElement.blur();\r\n\r\n            meldung(`Durchgang gestartet. Stufe N gleich ${aktuellesN}, ${blockLaenge} Schritte.`);\r\n            ftEvent({ event: 'nback_start', nback_n: aktuellesN, nback_schritte: blockLaenge });\r\n            testSichtbarMachen();\r\n            blockStart = performance.now();\r\n            naechsterSchritt();\r\n        }\r\n\r\n        \/**\r\n         * Ein Schritt des Takts. Die Folgeschritte werden gegen eine absolute\r\n         * Zeitachse geplant, damit der Reiz nicht gegen\u00fcber dem Ton wegdriftet.\r\n         *\/\r\n        function naechsterSchritt() {\r\n            if (phase !== 'laeuft') return;\r\n\r\n            \/\/ Antwort des eben abgelaufenen Schritts festhalten\r\n            if (schritt > 0) {\r\n                const vorheriger = schritt - 1;\r\n                if (vorheriger >= aktuellesN) {\r\n                    antworten[vorheriger - aktuellesN] = { pos: antwortPos, ton: antwortTon };\r\n                }\r\n                antwortPos = antwortTon = false; wahl = null;\r\n                knoepfeZuruecksetzen();\r\n            }\r\n\r\n            if (schritt >= folge.length) { beendeBlock(); return; }\r\n\r\n            zeigeReiz(schritt);\r\n            schritt++;\r\n\r\n            \/\/ Ab dem Schritt N+1 gibt es etwas zu vergleichen\r\n            knoepfeAktiv(schritt > aktuellesN);\r\n            if (schritt <= aktuellesN) {\r\n                stepCountEl.textContent = `Merken \u2026 Schritt ${schritt} von ${folge.length}`;\r\n            } else {\r\n                stepCountEl.textContent = `Schritt ${schritt} von ${folge.length}`;\r\n            }\r\n\r\n            const soll = blockStart + schritt * TAKT_MS;\r\n            taktTimer = setTimeout(naechsterSchritt, Math.max(0, soll - performance.now()));\r\n        }\r\n\r\n        function blitz(knopf, richtig) {\r\n            const klasse = richtig ? 'blitz-richtig' : 'blitz-falsch';\r\n            knopf.classList.add(klasse);\r\n            blitzTimer.push(setTimeout(() => knopf.classList.remove(klasse), 350));\r\n        }\r\n\r\n        \/**\r\n         * Drei Knoepfe wie auf den Erklaer-Slides der Seite (Entscheid User\r\n         * 2026-10-12): Position, Sound oder Beides. Gewertet wird weiterhin je\r\n         * Kanal \u2014 \u00abBeides\u00bb zaehlt fuer Position UND Ton, \u00abPosition\u00bb allein\r\n         * laesst den Ton auf \u00abkein Ziel\u00bb. Wer bei einer reinen Positions-\r\n         * uebereinstimmung \u00abPosition\u00bb drueckt, ist also richtig, auch wenn der\r\n         * Ton zufaellig ebenfalls passt (dann zaehlt nur der Ton als uebersehen).\r\n         * Derselbe Knopf nochmals nimmt die Antwort zurueck, ein anderer\r\n         * ersetzt sie.\r\n         *\/\r\n        const WAHL = { position: [true, false], sound: [false, true], beides: [true, true] };\r\n        let wahl = null;\r\n\r\n        function waehleAntwort(neu) {\r\n            if (phase !== 'laeuft') return;\r\n            const i = schritt - 1;\r\n            if (i < aktuellesN) return;\r\n            wahl = wahl === neu ? null : neu;\r\n            [antwortPos, antwortTon] = wahl ? WAHL[wahl] : [false, false];\r\n            const knoepfe = { position: positionBtn, sound: soundBtn, beides: beidesBtn };\r\n            Object.entries(knoepfe).forEach(([k, b]) => {\r\n                b.setAttribute('aria-pressed', String(k === wahl));\r\n                b.classList.remove('blitz-richtig', 'blitz-falsch');\r\n            });\r\n            \/\/ Gruen, wenn jeder gewaehlte Kanal wirklich ein Ziel ist\r\n            if (wahl) blitz(knoepfe[wahl], (!antwortPos || istZiel(i, 'pos')) && (!antwortTon || istZiel(i, 'ton')));\r\n        }\r\n\r\n        function beendeBlock() {\r\n            phase = 'fertig';\r\n            alleTimerLoeschen();\r\n            zellenLoeschen();\r\n            knoepfeAktiv(false);\r\n            knoepfeZuruecksetzen();\r\n            stepCountInput.disabled = false;\r\n            stopBtn.hidden  = true;\r\n            startBtn.hidden = false;\r\n\r\n            const r = werteAus();\r\n            const neueStufe = naechsteStufe(r.fehler);\r\n\r\n            stand.durchgaenge++;\r\n            if (r.dPrimeGesamt !== null && r.dPrimeGesamt > stand.besteTrenn) {\r\n                stand.besteTrenn = r.dPrimeGesamt;\r\n            }\r\n            stand.stufe = neueStufe;\r\n            speichereStand(stand);\r\n\r\n            ftEvent({ event: 'nback_ergebnis', nback_n: aktuellesN, nback_fehler: r.fehler,\r\n                      nback_dprime: r.dPrimeGesamt === null ? null : Math.round(r.dPrimeGesamt * 100) \/ 100, nback_neue_stufe: neueStufe });\r\n            zeigeErgebnis(r, neueStufe);\r\n            aktuellesN = neueStufe;\r\n            aktualisiereStufenAnzeige();\r\n        }\r\n\r\n        function brichAb(grund) {\r\n            if (phase !== 'laeuft') return;\r\n            phase = 'bereit';\r\n            alleTimerLoeschen();\r\n            zellenLoeschen();\r\n            knoepfeAktiv(false);\r\n            knoepfeZuruecksetzen();\r\n            stepCountInput.disabled = false;\r\n            stopBtn.hidden  = true;\r\n            startBtn.hidden = false;\r\n            stepCountEl.textContent = 'Durchgang abgebrochen';\r\n            meldung(grund);\r\n        }\r\n\r\n        function zeigeErgebnis(r, neueStufe) {\r\n            const setz = (id, wert) => { document.getElementById(id).textContent = wert; };\r\n            setz('ftnb-erg-pos-treffer',    r.pos.treffer);\r\n            setz('ftnb-erg-pos-uebersehen', r.pos.uebersehen);\r\n            setz('ftnb-erg-pos-fehlgriff',  r.pos.fehlgriff);\r\n            setz('ftnb-erg-ton-treffer',    r.ton.treffer);\r\n            setz('ftnb-erg-ton-uebersehen', r.ton.uebersehen);\r\n            setz('ftnb-erg-ton-fehlgriff',  r.ton.fehlgriff);\r\n            setz('ftnb-erg-dprime', r.dPrimeGesamt === null ? '\u2013' : r.dPrimeGesamt.toFixed(1));\r\n\r\n            let titel, unter, satz;\r\n            if (neueStufe > aktuellesN) {\r\n                titel = 'Sehr gut!';\r\n                unter = `${r.fehler} Fehler \u2014 das reicht f\u00fcr die n\u00e4chste Stufe.`;\r\n                satz  = `N\u00e4chster Durchgang: N = ${neueStufe}`;\r\n            } else if (neueStufe < aktuellesN) {\r\n                titel = 'Eine Stufe zur\u00fcck';\r\n                unter = `${r.fehler} Fehler \u2014 wir gehen eine Stufe zur\u00fcck, damit es wieder passt.`;\r\n                satz  = `N\u00e4chster Durchgang: N = ${neueStufe}`;\r\n            } else {\r\n                titel = 'Durchgang beendet';\r\n                unter = `${r.fehler} Fehler \u2014 noch etwas \u00fcben auf dieser Stufe.`;\r\n                satz  = `N\u00e4chster Durchgang: weiterhin N = ${neueStufe}`;\r\n            }\r\n            document.getElementById('ftnb-erg-titel').textContent      = titel;\r\n            document.getElementById('ftnb-erg-untertitel').textContent  = unter;\r\n            document.getElementById('ftnb-erg-stufe-satz').textContent  = satz;\r\n\r\n            meldung(`Durchgang beendet. Position: ${r.pos.treffer} erkannt, ${r.pos.uebersehen} \u00fcbersehen, ` +\r\n                    `${r.pos.fehlgriff} Fehlgriffe. Sound: ${r.ton.treffer} erkannt, ${r.ton.uebersehen} \u00fcbersehen, ` +\r\n                    `${r.ton.fehlgriff} Fehlgriffe. ${satz}.`);\r\n            zeigeModal();\r\n        }\r\n\r\n        \/\/ \u2500\u2500 Ton: Laden, Entsperren, Pr\u00fcfen \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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        \/\/ Der Test ist ohne Ton nicht spielbar \u2014 die Buchstaben werden\r\n        \/\/ gesprochen, nicht angezeigt. Deshalb wird der Ton VOR dem ersten\r\n        \/\/ Durchgang gepr\u00fcft, statt jemanden 60 Sekunden lang raten zu lassen.\r\n\r\n        \/\/ iOS Safari laedt Audio ohne Nutzergeste haeufig gar nicht \u2014 dann feuert\r\n        \/\/ canplaythrough nie. Die Ladeereignisse dienen deshalb nur der Anzeige\r\n        \/\/ und der Fehlererkennung; die eigentliche Freigabe kommt aus dem\r\n        \/\/ Probeton, den der Nutzer selbst ausloest. Vor jedem Abspielen wird\r\n        \/\/ zusaetzlich auf Bereitschaft gewartet (mit Zeitlimit), damit der erste\r\n        \/\/ Reiz auf langsamen Verbindungen nicht stumm bleibt.\r\n        let tonFehler = false;\r\n\r\n        function zeigeTonFehler() {\r\n            tonFehler = true;\r\n            tonStatus.textContent = 'Die Tondateien liessen sich nicht laden. Bitte Seite neu laden.';\r\n            tonStatus.classList.add('ton-fehler');\r\n            tonTestBtn.disabled = true;\r\n            tonOkBtn.hidden = true;\r\n            startBtn.textContent = 'Ton nicht verf\u00fcgbar';\r\n            startBtn.disabled = true;\r\n        }\r\n\r\n        audioStimuli.forEach(a => {\r\n            a.preload = 'auto';\r\n            a.addEventListener('error', zeigeTonFehler, { once: true });\r\n        });\r\n\r\n        Promise.all(audioStimuli.map(a => new Promise(fertig => {\r\n            if (a.readyState >= 3) { fertig(); return; }\r\n            a.addEventListener('canplaythrough', fertig, { once: true });\r\n            a.addEventListener('error', fertig, { once: true });\r\n        }))).then(() => {\r\n            if (tonFehler) return;\r\n            if (startBtn.disabled) startBtn.textContent = 'Start';\r\n            if (!tonGeprueft) tonStatus.textContent = 'Ton geladen. Bitte den Probeton anh\u00f6ren.';\r\n        });\r\n\r\n        \/** Wartet, bis alle Clips abspielbereit sind (readyState >= 3) \u2014 oder das Zeitlimit greift. *\/\r\n        function wartAufTon(clips, limitMs) {\r\n            return new Promise(fertig => {\r\n                const start = performance.now();\r\n                (function pruefe() {\r\n                    if (tonFehler) { fertig(false); return; }\r\n                    if (clips.every(c => c.readyState >= 3)) { fertig(true); return; }\r\n                    if (performance.now() - start > limitMs) { fertig(false); return; }\r\n                    setTimeout(pruefe, 100);\r\n                })();\r\n            });\r\n        }\r\n\r\n        \/**\r\n         * Entsperrt die Wiedergabe auf Mobilger\u00e4ten: stumm abspielen innerhalb\r\n         * der Nutzergeste, dann Ton freigeben. Auf iOS stoesst das zugleich das\r\n         * Laden an. Einzige Autoplay-Behandlung im Theme, unveraendert.\r\n         *\/\r\n        function entsperreAudio() {\r\n            return Promise.all(audioStimuli.map(a => {\r\n                a.muted = true;\r\n                return a.play()\r\n                    .then(() => { a.pause(); a.currentTime = 0; })\r\n                    .catch(() => {});\r\n            })).then(() => { audioStimuli.forEach(a => { a.muted = false; }); });\r\n        }\r\n\r\n        tonTestBtn.addEventListener('click', function () {\r\n            if (tonFehler) return;\r\n            tonTestBtn.disabled = true;\r\n            tonStatus.textContent = 'Ton wird vorbereitet \u2026';\r\n            const idx = Math.floor(Math.random() * audioStimuli.length);\r\n            entsperreAudio()\r\n                .then(() => wartAufTon([audioStimuli[idx]], 6000))\r\n                .then(bereit => {\r\n                    tonTestBtn.disabled = tonFehler;\r\n                    if (tonFehler) return;\r\n                    spieleTon(idx);\r\n                    tonOkBtn.hidden = false;\r\n                    tonStatus.textContent = bereit\r\n                        ? 'Nichts geh\u00f6rt? Lautst\u00e4rke pr\u00fcfen und nochmals antippen.'\r\n                        : 'Der Ton l\u00e4dt noch \u2014 bitte gleich nochmals antippen.';\r\n                });\r\n        });\r\n\r\n        tonOkBtn.addEventListener('click', function () {\r\n            if (tonFehler) return;\r\n            tonGeprueft = true;\r\n            tonpruefung.hidden = true;\r\n            startBtn.textContent = 'Start';\r\n            startBtn.disabled = false;\r\n            startBtn.focus();\r\n            meldung('Ton best\u00e4tigt. Der Test kann starten.');\r\n        });\r\n\r\n        \/\/ \u2500\u2500 Start \/ Abbruch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\r\n        startBtn.addEventListener('click', function () {\r\n            if (phase === 'laeuft' || tonFehler) return;\r\n            startBtn.disabled = true;\r\n            startBtn.textContent = 'Ton wird vorbereitet \u2026';\r\n            (tonGeprueft ? Promise.resolve() : entsperreAudio())\r\n                .then(() => wartAufTon(audioStimuli, 4000))\r\n                .then(() => {\r\n                    startBtn.textContent = 'Start';\r\n                    startBtn.disabled = false;\r\n                    if (!tonFehler) starteBlock();\r\n                });\r\n        });\r\n\r\n        stopBtn.addEventListener('click', function () {\r\n            brichAb('Durchgang abgebrochen.');\r\n        });\r\n\r\n        stepCountInput.addEventListener('input', function () {\r\n            blockLaenge = parseInt(this.value, 10);\r\n            stepCountDisplay.textContent = blockLaenge;\r\n            if (phase !== 'laeuft') {\r\n                stepCountEl.textContent = `Bereit \u2014 ${blockLaenge} Schritte bei N = ${aktuellesN}`;\r\n            }\r\n        });\r\n\r\n        \/\/ \u2500\u2500 Antwortkn\u00f6pfe \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\r\n        [[positionBtn, 'position'], [soundBtn, 'sound'], [beidesBtn, 'beides']].forEach(([knopf, w]) => {\r\n            knopf.addEventListener('click', function (e) {\r\n                if (e.detail > 0) this.blur();   \/\/ nach echtem Mausklick Fokus abgeben\r\n                waehleAntwort(w);\r\n            });\r\n        });\r\n\r\n        \/\/ \u2500\u2500 Tastatur: A Position, L Sound, B Beides \u2500\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        \/\/ F\u00fcnf W\u00e4chter nach dem Muster aus trainmybrain-wordle.html\r\n        document.addEventListener('keydown', function (e) {\r\n            if (phase !== 'laeuft') return;\r\n            if (e.ctrlKey || e.altKey || e.metaKey) return;\r\n            if (offenesModal()) return;\r\n\r\n            \/\/ Nur Elemente ausschliessen, die Buchstaben tatsaechlich verbrauchen.\r\n            \/\/ Knoepfe und Links gehoeren NICHT dazu: sie reagieren auf Enter und\r\n            \/\/ Leertaste, nicht auf A oder L. Ein zu breiter Waechter blockierte\r\n            \/\/ hier jede Eingabe, solange der Fokus noch auf dem Start-Knopf lag.\r\n            const fokus = document.activeElement;\r\n            if (fokus && fokus.closest('input, select, textarea, [contenteditable]')) return;\r\n\r\n            const k = e.key.toLowerCase();\r\n            if (k === 'a') { e.preventDefault(); waehleAntwort('position'); }\r\n            else if (k === 'l') { e.preventDefault(); waehleAntwort('sound'); }\r\n            else if (k === 'b') { e.preventDefault(); waehleAntwort('beides'); }\r\n        });\r\n\r\n        \/\/ \u2500\u2500 Tab-Wechsel bricht den Durchgang ab \u2500\u2500\u2500\u2500\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        \/\/ Hintergrund-Tabs drosseln Timer auf mindestens eine Sekunde. Die\r\n        \/\/ Reizfolge liefe dann still gegen den Ton aus dem Takt und der Block\r\n        \/\/ w\u00e4re wertlos, ohne dass es jemand merkt. Ein unterbrochener\r\n        \/\/ Durchgang ist ohnehin keine g\u00fcltige Messung.\r\n        document.addEventListener('visibilitychange', function () {\r\n            if (document.hidden && phase === 'laeuft') {\r\n                brichAb('Durchgang abgebrochen \u2014 der Test braucht Ihre ungeteilte Aufmerksamkeit.');\r\n            }\r\n        });\r\n\r\n        \/\/ Raster und Antwortknoepfe muessen waehrend des Durchgangs ganz sichtbar\r\n        \/\/ sein. Sofort scrollen (nicht weich): Elementor setzt scroll-behavior:\r\n        \/\/ smooth, sonst liefe der erste Reiz waehrend des Scrollens.\r\n        function testSichtbarMachen() {\r\n            const kopf = kopfHoehe();\r\n            const oben  = document.getElementById('ftnb-stufe').getBoundingClientRect().top;\r\n            const unten = document.getElementById('ftnb-status').getBoundingClientRect().bottom;\r\n            if (oben >= kopf + 4 && unten <= window.innerHeight) return;\r\n            const ziel = window.scrollY + document.getElementById('ftnb-gitter').getBoundingClientRect().top - kopf - 80;\r\n            try { window.scrollTo({ top: ziel, behavior: 'instant' }); } catch (e) { window.scrollTo(0, ziel); }\r\n        }\r\n\r\n        document.getElementById('ftnb-weiter').addEventListener('click', function () {\r\n            schliesseModal();\r\n            starteBlock();\r\n        });\r\n\r\n        \/\/ Anfangszustand\r\n        aktualisiereStufenAnzeige();\r\n        stepCountEl.textContent = `Bereit \u2014 ${blockLaenge} Schritte bei N = ${aktuellesN}`;\r\n\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<div class=\"elementor-element elementor-element-e111882 elementor-widget-mobile__width-inherit elementor-widget elementor-widget-spacer\" data-id=\"e111882\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Entdecken Sie den Dual N-Back-Test: Effektives Training f\u00fcr Arbeitsged\u00e4chtnis und kognitive Flexibilit\u00e4t.<\/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":5720,"footnotes":""},"class_list":["post-2448","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>Dual N-Back-Test: Steigert nachweislich Ihre Intelligenz!<\/title>\n<meta name=\"description\" content=\"Entdecken Sie den Dual N-Back-Test: Effektives Training f\u00fcr Arbeitsged\u00e4chtnis und kognitive Flexibilit\u00e4t.\" \/>\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\/dual-n-back-test\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dual N-Back-Test: Steigert nachweislich Ihre Intelligenz!\" \/>\n<meta property=\"og:description\" content=\"Entdecken Sie den Dual N-Back-Test: Effektives Training f\u00fcr Arbeitsged\u00e4chtnis und kognitive Flexibilit\u00e4t.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fahrtauglich.ch\/fr\/praxisportal\/dual-n-back-test\/\" \/>\n<meta property=\"og:site_name\" content=\"Fahrtauglich\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-12T12:57:55+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=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/fahrtauglich.ch\\\/praxisportal\\\/dual-n-back-test\\\/\",\"url\":\"https:\\\/\\\/fahrtauglich.ch\\\/praxisportal\\\/dual-n-back-test\\\/\",\"name\":\"Dual N-Back-Test: Steigert nachweislich Ihre Intelligenz!\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/fahrtauglich.ch\\\/#website\"},\"datePublished\":\"2024-10-11T10:17:20+00:00\",\"dateModified\":\"2026-10-12T12:57:55+00:00\",\"description\":\"Entdecken Sie den Dual N-Back-Test: Effektives Training f\u00fcr Arbeitsged\u00e4chtnis und kognitive Flexibilit\u00e4t.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/fahrtauglich.ch\\\/praxisportal\\\/dual-n-back-test\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/fahrtauglich.ch\\\/praxisportal\\\/dual-n-back-test\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/fahrtauglich.ch\\\/praxisportal\\\/dual-n-back-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\":\"Dual N-Back-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":"Dual N-Back-Test: Steigert nachweislich Ihre Intelligenz!","description":"Entdecken Sie den Dual N-Back-Test: Effektives Training f\u00fcr Arbeitsged\u00e4chtnis und kognitive Flexibilit\u00e4t.","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\/dual-n-back-test\/","og_locale":"fr_FR","og_type":"article","og_title":"Dual N-Back-Test: Steigert nachweislich Ihre Intelligenz!","og_description":"Entdecken Sie den Dual N-Back-Test: Effektives Training f\u00fcr Arbeitsged\u00e4chtnis und kognitive Flexibilit\u00e4t.","og_url":"https:\/\/fahrtauglich.ch\/fr\/praxisportal\/dual-n-back-test\/","og_site_name":"Fahrtauglich","article_modified_time":"2026-10-12T12:57:55+00:00","twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/fahrtauglich.ch\/praxisportal\/dual-n-back-test\/","url":"https:\/\/fahrtauglich.ch\/praxisportal\/dual-n-back-test\/","name":"Dual N-Back-Test: Steigert nachweislich Ihre Intelligenz!","isPartOf":{"@id":"https:\/\/fahrtauglich.ch\/#website"},"datePublished":"2024-10-11T10:17:20+00:00","dateModified":"2026-10-12T12:57:55+00:00","description":"Entdecken Sie den Dual N-Back-Test: Effektives Training f\u00fcr Arbeitsged\u00e4chtnis und kognitive Flexibilit\u00e4t.","breadcrumb":{"@id":"https:\/\/fahrtauglich.ch\/praxisportal\/dual-n-back-test\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fahrtauglich.ch\/praxisportal\/dual-n-back-test\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fahrtauglich.ch\/praxisportal\/dual-n-back-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":"Dual N-Back-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":"Entdecken Sie den Dual N-Back-Test: Effektives Training f\u00fcr Arbeitsged\u00e4chtnis und kognitive Flexibilit\u00e4t.","_links":{"self":[{"href":"https:\/\/fahrtauglich.ch\/fr\/wp-json\/wp\/v2\/pages\/2448","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=2448"}],"version-history":[{"count":836,"href":"https:\/\/fahrtauglich.ch\/fr\/wp-json\/wp\/v2\/pages\/2448\/revisions"}],"predecessor-version":[{"id":8593,"href":"https:\/\/fahrtauglich.ch\/fr\/wp-json\/wp\/v2\/pages\/2448\/revisions\/8593"}],"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=2448"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}