.elementor img { height: 100%; } /* Namespace: nst = Nautigo Stepper */ .nst-root * { box-sizing: border-box; } .nst-root { font-family: 'Poppins', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; /* === Theme Gradient === */ background-color: #f8fafc; background-image: radial-gradient(ellipse 70% 40% at 0% 55%, rgba(1, 187, 254, 0.15) 0%, transparent 65%), radial-gradient(ellipse 55% 35% at 100% 85%, rgba(255, 240, 0, 0.13) 0%, transparent 65%); background-size: 100% 100%, 100% 100%; background-repeat: no-repeat, no-repeat; } /* Hero fade-in */ @keyframes nst-fadeInUp { from { opacity: 0; transform: translateY(24px); } to { opacity: 1; transform: translateY(0); } } .nst-fadeInUp { animation: nst-fadeInUp 0.6s ease-out forwards; } .nst-fadeInUp-d1 { animation: nst-fadeInUp 0.6s 0.15s ease-out forwards; opacity: 0; } .nst-fadeInUp-d2 { animation: nst-fadeInUp 0.6s 0.3s ease-out forwards; opacity: 0; } /* Step transitions */ .nst-step-panel { position: absolute; inset: 0; opacity: 0; transform: translateX(40px); pointer-events: none; transition: opacity 300ms ease, transform 300ms ease; } .nst-step-panel.nst-active { position: relative; opacity: 1; transform: translateX(0); pointer-events: auto; } .nst-step-panel.nst-exit-back { transform: translateX(40px); } .nst-step-panel.nst-exit-forward { transform: translateX(-40px); } /* Radio card selection */ .nst-radio-card.nst-selected { border-color: #01bbfe; background: linear-gradient(135deg, rgba(1, 187, 254, 0.04) 0%, transparent 100%); box-shadow: 0 0 0 3px rgba(1, 187, 254, 0.15); } /* FAQ Accordion */ .nst-faq-item { border-bottom: 1px solid #e4e4e7; } .nst-faq-item:last-child { border-bottom: none; } .nst-faq-item.nst-open .nst-faq-chevron { transform: rotate(180deg); color: #01bbfe; } .nst-faq-body { max-height: 0; overflow: hidden; transition: max-height 350ms cubic-bezier(0.16, 1, 0.3, 1), opacity 250ms ease; opacity: 0; } .nst-faq-item.nst-open .nst-faq-body { opacity: 1; } /* CTA Button: Aktivierungs-Animation */ @keyframes nst-cta-attention { 0%, 100% { transform: scale(1); } 4% { transform: scale(1.035) rotate(0.5deg); } 8% { transform: scale(1) rotate(-0.5deg); } 12% { transform: scale(1.02) rotate(0.3deg); } 16% { transform: scale(1) rotate(0deg); } } @keyframes nst-border-rotate { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* Shimmer-Sweep über den Button */ @keyframes nst-shimmer-sweep { 0% { transform: translateX(-100%) skewX(-15deg); } 100% { transform: translateX(200%) skewX(-15deg); } } /* Einmal-Pop wenn Button aktiv wird */ @keyframes nst-activate-pop { 0% { transform: scale(1); } 30% { transform: scale(1.08); } 50% { transform: scale(0.96); } 70% { transform: scale(1.03); } 100% { transform: scale(1); } } .nst-btn-checkout { position: relative; width: 100%; color: white; border-radius: 14px; padding: 20px 32px; font-size: 18px; font-weight: 700; line-height: 1.2; text-align: center; cursor: pointer; transition: all 0.5s cubic-bezier(0.16, 1, 0.3, 1); font-family: inherit; outline: none; box-sizing: border-box; border: none; background: #01bbfe; overflow: hidden; isolation: isolate; box-shadow: 0 12px 30px rgba(1, 187, 254, 0.35); animation: nst-cta-attention 3s ease-in-out infinite; } /* Rotating conic-gradient border glow */ .nst-btn-checkout::before { content: ''; position: absolute; inset: -150%; background: conic-gradient(rgba(1, 187, 254, 0) 0deg, #fff000 90deg, #01bbfe 180deg, #fff000 270deg, rgba(1, 187, 254, 0) 360deg); animation: nst-border-rotate 2.5s linear infinite; z-index: -1; transition: opacity 0.5s ease; } /* Inner fill */ .nst-btn-checkout::after { content: ''; position: absolute; inset: 2px; background: linear-gradient(135deg, #01bbfe 0%, #0098d6 100%); border-radius: 12px; z-index: -1; transition: background 0.5s ease; } /* Shimmer-Highlight (extra pseudo via wrapper) */ .nst-btn-checkout .nst-shimmer { position: absolute; inset: 0; overflow: hidden; border-radius: 14px; pointer-events: none; } .nst-btn-checkout .nst-shimmer::after { content: ''; position: absolute; top: 0; left: 0; width: 50%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.25), transparent); animation: nst-shimmer-sweep 2.5s ease-in-out infinite; animation-delay: 1s; } .nst-btn-checkout:hover:not(:disabled) { box-shadow: 0 20px 45px rgba(1, 187, 254, 0.5); transform: translateY(-3px) scale(1.03); } .nst-btn-checkout:active:not(:disabled) { transform: translateY(0) scale(0.96); } /* ---- DISABLED STATE: grau, stumm, leblos ---- */ .nst-btn-checkout:disabled { background: #d4d4d8; cursor: not-allowed; animation: none; transform: none; box-shadow: none; color: rgba(255, 255, 255, 0.6); font-size: 16px; padding: 18px 32px; } .nst-btn-checkout:disabled::before { opacity: 0; animation: none; } .nst-btn-checkout:disabled::after { background: #d4d4d8; } .nst-btn-checkout:disabled .nst-shimmer::after { animation: none; } /* Activation pop: JS fügt diese Klasse einmalig hinzu */ .nst-btn-checkout.nst-just-activated { animation: nst-activate-pop 0.5s cubic-bezier(0.16, 1, 0.3, 1) forwards; } /* Progress line fill with energy shimmer */ .nst-progress-line-fill { transition: width 600ms cubic-bezier(0.16, 1, 0.3, 1); background: linear-gradient(90deg, #01bbfe 0%, #01bbfe 60%, #4dd9ff 80%, #01bbfe 100%); background-size: 200% 100%; } .nst-progress-line-fill.nst-charging { animation: nst-line-charge 0.8s ease-out forwards; } @keyframes nst-line-charge { 0% { background-position: 100% 0; } 100% { background-position: 0% 0; } } /* Step circle: completion pop */ @keyframes nst-circle-complete { 0% { transform: scale(1); } 25% { transform: scale(1.25); } 50% { transform: scale(0.9); } 75% { transform: scale(1.08); } 100% { transform: scale(1); } } @keyframes nst-circle-glow { 0% { box-shadow: 0 0 0 0 rgba(1, 187, 254, 0.5); } 50% { box-shadow: 0 0 0 10px rgba(1, 187, 254, 0); } 100% { box-shadow: 0 0 0 0 rgba(1, 187, 254, 0); } } .nst-prog-complete { animation: nst-circle-complete 0.5s cubic-bezier(0.16, 1, 0.3, 1), nst-circle-glow 0.8s ease-out; } .nst-prog-activate { animation: nst-circle-complete 0.4s cubic-bezier(0.16, 1, 0.3, 1); } /* Animated checkmark inside completed circle */ @keyframes nst-draw-check { 0% { stroke-dashoffset: 20; } 100% { stroke-dashoffset: 0; } } .nst-check-drawn { stroke-dasharray: 20; stroke-dashoffset: 20; animation: nst-draw-check 0.35s 0.15s cubic-bezier(0.16, 1, 0.3, 1) forwards; } /* Spinner */ @keyframes nst-spin { to { transform: rotate(360deg); } } .nst-spinner { display: inline-block; width: 18px; height: 18px; border: 2px solid transparent; border-top-color: #ffffff; border-radius: 50%; animation: nst-spin 0.6s linear infinite; margin-left: 8px; vertical-align: text-top; } /* Scroll-Offset: hält Progress-Indikator bei Sprung zum Stepper sichtbar (Sticky-Header + Atemraum). Wirkt für scrollIntoView und :target. */ #stepper-form { scroll-margin-top: 120px; } /* Social proof pulse */ .nst-social-proof .nst-dot { width: 6px; height: 6px; border-radius: 50%; background: #10b981; animation: nst-breathe 2s ease-in-out infinite; } @keyframes nst-breathe { 0%, 100% { opacity: 0.4; transform: scale(0.8); } 50% { opacity: 1; transform: scale(1); } } /* Selection checkmark animation */ @keyframes nst-check-pop { 0% { transform: scale(0); opacity: 0; } 60% { transform: scale(1.15); } 100% { transform: scale(1); opacity: 1; } } .nst-selected .nst-check-anim { animation: nst-check-pop 0.3s cubic-bezier(0.16, 1, 0.3, 1) forwards; } /* Headlines: prevent orphaned words */ .nst-root h1, .nst-root h2 { text-wrap: balance; } /* Suppress browser focus outline on programmatically-focused headings (tabindex="-1") */ .nst-root h1[tabindex="-1"]:focus, .nst-root h2[tabindex="-1"]:focus { outline: none; } /* Fix: SVG-Checkmarks in Feature-Tags auf konsistente Größe setzen */ .nst-incl-tag svg { width: 12px; height: 12px; flex-shrink: 0; } /* ===== Impressionen Galerie ===== */ .nst-gallery-video-wrap video { width: 100%; height: 100%; display: block; object-fit: cover; } .nst-video-cover.nst-cover-hidden { opacity: 0; pointer-events: none; } .nst-video-play-btn:hover { background: #fff; } .nst-video-play-btn:hover .nst-play-circle { transform: scale(1.1); } /* Lightbox */ .nst-lightbox.nst-lb-open { opacity: 1; pointer-events: auto; } /* ===== Standorte Map ===== */ .nst-map-shimmer { position: absolute; inset: -40%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.65), transparent); transform: translateX(-100%); animation: nst-map-shimmer-anim 1.4s linear infinite; } @keyframes nst-map-shimmer-anim { to { transform: translateX(100%); } } .nst-map-wrap.nst-map-ready .nst-map-skeleton, .nst-map-wrap.nst-map-ready .nst-map-notice, .nst-map-wrap.nst-map-ready .nst-map-activate { display: none !important; } .nst-map-pill-active { background: #01bbfe !important; color: #fff !important; border-color: #01bbfe !important; } /* ===== Preis-Aufschlüsselungs-Modal ===== */ .nst-pm-overlay { position: fixed; inset: 0; z-index: 11000; display: flex; align-items: flex-end; justify-content: center; background: rgba(0, 0, 0, 0); pointer-events: none; visibility: hidden; /* verzögert bis nach dem Slide-Out (380ms Panel-Transition) */ transition: background 280ms ease, visibility 0s linear 420ms; padding: 0; } @media (min-width: 640px) { .nst-pm-overlay { align-items: center; padding: 20px; } } .nst-pm-overlay.nst-pm-open { background: rgba(0, 0, 0, 0.55); pointer-events: auto; visibility: visible; /* sofort sichtbar beim Öffnen */ transition: background 280ms ease, visibility 0s linear 0s; backdrop-filter: blur(2px); -webkit-backdrop-filter: blur(2px); } .nst-pm-panel { width: 100%; max-width: 480px; max-height: 88dvh; overflow-y: auto; background: #ffffff; border-radius: 24px 24px 0 0; transform: translateY(110%); transition: transform 380ms cubic-bezier(0.16, 1, 0.3, 1); overscroll-behavior: contain; -webkit-overflow-scrolling: touch; box-shadow: 0 -4px 40px rgba(0, 0, 0, 0.18); scrollbar-width: none; } .nst-pm-panel::-webkit-scrollbar { display: none; } @media (min-width: 640px) { .nst-pm-panel { border-radius: 24px; max-height: 80dvh; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2); } } .nst-pm-overlay.nst-pm-open .nst-pm-panel { transform: translateY(0); } .nst-pm-item+.nst-pm-item { border-top: 1px solid #f4f4f5; } .nst-pm-price-row+.nst-pm-price-row { border-top: 1px solid #f4f4f5; } /* === Mobile Stepper Compact (< 640px) === Blendet sekundäre Infos aus, damit der Stepper auf kleinen Screens in die Viewport-Höhe passt. */ @media (max-width: 639px) { .nst-radio-card { padding: 13px 15px; } .nst-incl-tags, .nst-social-proof, .nst-value-badge, .nst-feature-strip, .nst-trust-strip, .nst-mobile-hide { display: none !important; } } /* DSV / DMYV Verbands-Logos: harte Constraint, weil Tailwind h-9/h-10 + w-auto vom WP-Theme teilweise ueberschrieben werden (preflight=false, kein img-Reset). */ .nst-verband-logo { display: inline-block; height: 36px !important; width: auto !important; max-width: 120px !important; max-height: 36px !important; object-fit: contain; flex-shrink: 0; } @media (min-width: 640px) { .nst-verband-logo { height: 40px !important; max-height: 40px !important; max-width: 140px !important; } }
Bootsführerschein Kurs Hintergrund

*gesammelt auf Google, Trustpilot, App Store & Play Store (01/2023–10/2026).

Dein Weg zum Bootsführerschein

Ab 199€ / Theorie

Kein Chaos, kein Suchen — nur ein klarer Weg: moderne App, echte Praxisausbildung an 50+ Standorten und persönliche Betreuung bis du bestanden hast.

Ab 14 Tagen zum Bootsschein
365 Tage Zugang
Geld Zurück Garantie
Trailer ansehen
.elementor img { height: 100%; } /* Namespace: ncfg = Nautigo Konfigurator 2.0 (ersetzt nst-Stepper) */ .ncfg * { box-sizing: border-box; margin: 0; padding: 0; } .ncfg { font-family: 'Poppins', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; --nc-ink: #111113; --nc-text: #1a1a1a; --nc-muted: #66707f; --nc-line: #e6e8ec; --nc-line-strong: #d0d5dd; --nc-accent: #00a9f4; --nc-accent-deep: #0090d4; --nc-yellow: #ffd400; --nc-green: #12a150; background: #f5f6f8; color: var(--nc-text); padding: 40px 16px 56px; line-height: 1.5; } .ncfg .ncfg-wrap { max-width: 1120px; margin: 0 auto; } .ncfg .ncfg-grid { display: grid; grid-template-columns: 1fr; gap: 20px; align-items: start; } .ncfg .ncfg-step { background: #fff; border: 1px solid var(--nc-line); border-radius: 20px; box-shadow: 0 1px 2px rgba(17, 17, 19, .05), 0 8px 28px rgba(17, 17, 19, .06); padding: 20px 18px; } .ncfg .ncfg-step-head { display: flex; align-items: center; gap: 12px; } .ncfg .ncfg-step-no { width: 30px; height: 30px; border-radius: 999px; flex: none; background: var(--nc-ink); color: #fff; font-weight: 700; font-size: 14px; display: grid; place-items: center; } .ncfg h3.ncfg-q { font-size: 19px; font-weight: 700; letter-spacing: -.01em; color: var(--nc-ink); } .ncfg .ncfg-hint { color: var(--nc-muted); font-size: 13.5px; margin: 4px 0 14px 42px; } .ncfg .ncfg-opts { display: grid; gap: 10px; } .ncfg label.ncfg-opt { display: block; cursor: pointer; position: relative; } .ncfg .ncfg-opt input { position: absolute; opacity: 0; width: 1px; height: 1px; pointer-events: none; } .ncfg .ncfg-card { display: grid; grid-template-columns: 22px minmax(0, 1fr) auto; gap: 12px; align-items: start; border: 1.5px solid var(--nc-line); border-radius: 14px; background: #fff; padding: 14px 16px; min-height: 44px; transition: border-color .18s, box-shadow .18s; } .ncfg .ncfg-opt:hover .ncfg-card { border-color: var(--nc-line-strong); } .ncfg .ncfg-opt input:checked+.ncfg-card { border-color: var(--nc-accent); box-shadow: 0 0 0 3px rgba(0, 169, 244, .13); } .ncfg .ncfg-opt input:focus-visible+.ncfg-card { outline: 3px solid var(--nc-accent); outline-offset: 2px; } .ncfg .ncfg-radio { width: 22px; height: 22px; border-radius: 999px; border: 2px solid var(--nc-line-strong); margin-top: 1px; display: grid; place-items: center; transition: border-color .18s; } .ncfg .ncfg-radio::after { content: ""; width: 10px; height: 10px; border-radius: 999px; background: var(--nc-accent); transform: scale(0); transition: transform .15s; } .ncfg .ncfg-opt input:checked+.ncfg-card .ncfg-radio { border-color: var(--nc-accent); } .ncfg .ncfg-opt input:checked+.ncfg-card .ncfg-radio::after { transform: scale(1); } .ncfg .ncfg-card.ncfg-fixed { border-color: var(--nc-accent); box-shadow: 0 0 0 3px rgba(0, 169, 244, .13); } .ncfg .ncfg-check { width: 22px; height: 22px; border-radius: 999px; background: var(--nc-accent); margin-top: 1px; display: grid; place-items: center; } .ncfg .ncfg-t { font-weight: 700; font-size: 16px; color: var(--nc-ink); display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .ncfg .ncfg-d { color: var(--nc-muted); font-size: 13px; margin-top: 2px; } .ncfg .ncfg-f { display: flex; flex-wrap: wrap; gap: 4px 14px; margin-top: 8px; font-size: 12.5px; color: #3d4552; } .ncfg .ncfg-f span::before { content: "✓"; color: var(--nc-green); font-weight: 700; margin-right: 5px; } .ncfg .ncfg-p { text-align: right; white-space: nowrap; } .ncfg .ncfg-p .ncfg-pv { font-weight: 700; font-size: 18px; color: var(--nc-ink); font-variant-numeric: tabular-nums; } .ncfg .ncfg-p .ncfg-ps { display: block; font-size: 12px; color: var(--nc-muted); text-decoration: line-through; font-variant-numeric: tabular-nums; } .ncfg .ncfg-p .ncfg-pn { display: block; font-size: 11.5px; color: var(--nc-muted); font-variant-numeric: tabular-nums; } .ncfg .ncfg-badge { font-size: 10.5px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; padding: 3px 9px; border-radius: 999px; white-space: nowrap; background: var(--nc-ink); color: var(--nc-yellow); } .ncfg .ncfg-badge.ncfg-blue { background: #e3f5fe; color: #026ea0; } .ncfg .ncfg-chip { display: inline-flex; align-items: center; background: var(--nc-yellow); color: #151306; font-weight: 700; font-size: 12px; padding: 2px 10px; border-radius: 999px; white-space: nowrap; font-variant-numeric: tabular-nums; } /* Zusammenfassung */ .ncfg .ncfg-sum { position: static; } .ncfg .ncfg-sum-card { background: #fff; border: 1px solid var(--nc-line); border-radius: 20px; overflow: hidden; box-shadow: 0 1px 2px rgba(17, 17, 19, .05), 0 8px 28px rgba(17, 17, 19, .06); } .ncfg .ncfg-sum-head { background: var(--nc-ink); color: #fff; padding: 14px 20px; } .ncfg .ncfg-sum-eyebrow { font-size: 10.5px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: #9aa1ad; } .ncfg .ncfg-sum-pkg { font-size: 17px; font-weight: 700; letter-spacing: -.01em; margin-top: 2px; } .ncfg .ncfg-sum-body { padding: 18px 20px 20px; } .ncfg .ncfg-price-row { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; flex-wrap: wrap; } .ncfg .ncfg-price { font-size: 42px; font-weight: 700; letter-spacing: -.03em; line-height: 1; color: var(--nc-ink); font-variant-numeric: tabular-nums; } .ncfg .ncfg-price small { font-size: 17px; font-weight: 700; } .ncfg ul.ncfg-bd { list-style: none; margin: 0 0 12px; padding: 0 0 12px; border-bottom: 1px dashed var(--nc-line); display: grid; gap: 3px; } .ncfg ul.ncfg-bd li { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; font-size: 14px; color: var(--nc-ink); } .ncfg ul.ncfg-bd li b { font-weight: 600; white-space: nowrap; font-variant-numeric: tabular-nums; } .ncfg ul.ncfg-bd li.ncfg-bd-off { color: var(--nc-muted); } .ncfg ul.ncfg-bd li.ncfg-bd-off b { font-weight: 500; } .ncfg .ncfg-price-l { font-size: 14px; font-weight: 600; color: var(--nc-muted); } .ncfg .ncfg-cmp { color: var(--nc-muted); font-size: 13px; font-variant-numeric: tabular-nums; } .ncfg .ncfg-cmp s { color: #98a0ac; } .ncfg .ncfg-save { margin-top: 8px; } .ncfg ul.ncfg-inc { list-style: none; margin: 14px 0 0; display: grid; gap: 8px; } .ncfg ul.ncfg-inc li { display: flex; gap: 9px; font-size: 13.5px; align-items: flex-start; } .ncfg ul.ncfg-inc li::before { content: "✓"; color: var(--nc-green); font-weight: 700; flex: none; } .ncfg ul.ncfg-inc li.ncfg-off { color: #b3bac4; } .ncfg ul.ncfg-inc li.ncfg-off::before { content: "—"; color: #c9ced6; } .ncfg .ncfg-fees { margin-top: 14px; padding: 10px 13px; border-radius: 12px; background: #f2f4f7; font-size: 12px; color: var(--nc-muted); } .ncfg .ncfg-fees a { color: inherit; text-decoration: underline; } .ncfg a.ncfg-cta { position: relative; display: flex; align-items: center; justify-content: center; gap: 9px; width: 100%; margin-top: 14px; padding: 16px 20px; border-radius: 14px; background: var(--nc-accent); color: #fff !important; font-size: 16.5px; font-weight: 700; text-decoration: none; overflow: hidden; box-shadow: 0 12px 36px rgba(0, 169, 244, .25); transition: background .18s, transform .12s; } .ncfg a.ncfg-cta:hover { background: var(--nc-accent-deep); } .ncfg a.ncfg-cta:active { transform: scale(.985); } .ncfg a.ncfg-cta:focus-visible { outline: 3px solid var(--nc-ink); outline-offset: 2px; } .ncfg .ncfg-shine { position: absolute; inset: 0; pointer-events: none; background: linear-gradient(115deg, transparent 30%, rgba(255, 255, 255, .35) 50%, transparent 70%); transform: translateX(-110%); animation: ncfgShine 3.2s ease-in-out infinite; } @keyframes ncfgShine { 0%, 58% { transform: translateX(-110%); } 88%, 100% { transform: translateX(110%); } } .ncfg .ncfg-micro { display: flex; justify-content: center; gap: 6px 14px; flex-wrap: wrap; margin-top: 12px; font-size: 11.5px; color: var(--nc-muted); } .ncfg .ncfg-micro span::before { content: "✓"; color: var(--nc-green); font-weight: 700; margin-right: 4px; } .ncfg .ncfg-later { margin-top: 12px; border: 1.5px dashed var(--nc-line-strong); border-radius: 12px; padding: 11px 13px; font-size: 12px; color: var(--nc-muted); display: none; font-variant-numeric: tabular-nums; } .ncfg .ncfg-later b { color: var(--nc-text); } .ncfg .ncfg-later.ncfg-show { display: block; } /* Mobile Sticky-Leiste */ .ncfg-mbar { position: fixed; left: 0; right: 0; bottom: 0; z-index: 999; display: flex; align-items: center; justify-content: space-between; gap: 12px; background: rgba(255, 255, 255, .97); border-top: 1px solid #e6e8ec; padding: 10px 14px calc(10px + env(safe-area-inset-bottom)); font-family: 'Poppins', ui-sans-serif, system-ui, sans-serif; transform: translateY(110%); transition: transform .25s ease; } .ncfg-mbar.ncfg-on { transform: translateY(0); } .ncfg-mbar .ncfg-mp-l { font-size: 10.5px; color: #66707f; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; } .ncfg-mbar .ncfg-mp-v { font-size: 19px; font-weight: 700; color: #111113; letter-spacing: -.02em; font-variant-numeric: tabular-nums; } .ncfg-mbar a.ncfg-mgo { flex: none; display: inline-flex; align-items: center; gap: 7px; background: #00a9f4; color: #fff !important; border-radius: 12px; padding: 13px 18px; font-size: 14.5px; font-weight: 700; text-decoration: none; min-height: 44px; } @media (min-width: 960px) { .ncfg { padding: 56px 24px 72px; } .ncfg .ncfg-grid { grid-template-columns: minmax(0, 1fr) 360px; gap: 24px; } .ncfg .ncfg-steps { display: flex; flex-direction: column; gap: 22px; } .ncfg .ncfg-step { padding: 26px 28px; } .ncfg .ncfg-sum { position: sticky; top: 90px; } .ncfg-mbar { display: none; } } @media (prefers-reduced-motion: reduce) { .ncfg *, .ncfg-mbar { animation: none !important; transition: none !important; } } /* Complianz-Manage-Tab: kollidiert rechts unten mit dem Sticky-CTA dieser LP -> auf dieser Seite nach unten links; auf Mobile ueber die Sticky-Leiste heben */ button.cmplz-manage-consent.cmplz-show { right: auto !important; left: 16px !important; } @media (max-width: 959px) { button.cmplz-manage-consent.cmplz-show { left: 8px !important; bottom: 84px !important; } }

Dein Schein

Theorie-Onlinekurs, Prüfungssimulator & Lernmaterial sind immer dabei.

SBF See & Binnen Alle Gewässer weltweit – Küste & Binnen 4K-LernvideosPrüfungssimulatorKnotentrainerGratis Willkommensbox 199 €

Wie viel Praxis brauchst du?

Gruppenfahrten auf unserem Fahrschulboot – Prüfungsfahrt immer inklusive.

(function () { "use strict"; /* Produkt-IDs & Live-Preise (WooCommerce, Stand 07/2026) */ var THEORIE = { binnen: { price: 99, name: "SBF Binnen" }, see: { price: 149, name: "SBF See" }, kombi: { price: 199, name: "SBF See und Binnen" } }; var ZIEL = { none: { binnen: { cart: "105900", price: 99, pkg: "SBF Binnen Basispaket" }, see: { cart: "105897", price: 149, pkg: "SBF See Basispaket" }, kombi: { cart: "10378", price: 199, pkg: "SBF See und Binnen Basispaket" } }, komplett: { binnen: { cart: "36210", price: 299, pkg: "Premiumpaket SBF Binnen" }, see: { cart: "36206", price: 349, pkg: "Premiumpaket SBF See" }, kombi: { cart: "36196", price: 349, pkg: "Premiumpaket SBF See und Binnen", single: 398 } }, plus: { binnen: { cart: "105900%2C99744", price: 348, pkg: "SBF Binnen Basispaket + Praxis Pro+" }, see: { cart: "105897%2C99744", price: 398, pkg: "SBF See Basispaket + Praxis Pro+" }, kombi: { cart: "110029", price: 448, pkg: "Premiumpaket Plus SBF See und Binnen" } } }; var INC = { theorieBase: ["Theorie-Onlinekurs: 4K-Lernvideos, Prüfungssimulator, Knotentrainer", "365 Tage Zeit zu lernen & Sofort-Zugang", "Persönliche Betreuung bis zur Prüfung"], kombiExtra: "Gratis Willkommensbox", komplett: ["2 Praxisfahrten auf dem Fahrschulboot", "Prüfungsfahrt inklusive · 50+ Standorte"], plus: ["3 Praxisfahrten auf dem Fahrschulboot", "Prüfungsfahrt inklusive · 50+ Standorte"], noneOff: "Praxisfahrten (jederzeit nachbuchbar)" }; function eur(n) { return n.toLocaleString("de-DE") + " €"; } function q(sel) { return document.querySelector('[data-ncfg="' + sel + '"]'); } function val(name) { var el = document.querySelector('input[name="' + name + '"]:checked'); return el ? el.value : null; } function render() { var s = val("ncfg-schein") || "kombi"; var p = val("ncfg-praxis") || "komplett"; var t = THEORIE[s]; var z = ZIEL[p][s]; var href = "/kasse/?add-to-cart=" + z.cart; /* Schritt-2-Preise: Praxis-Aufpreis zum gewählten Schein */ q("p-komplett").innerHTML = "+ " + eur(ZIEL.komplett[s].price - t.price); q("p-plus").innerHTML = "+ " + eur(ZIEL.plus[s].price - t.price); q("p-none").innerHTML = "+ " + eur(ZIEL.none[s].price - t.price); /* Zusammenfassung: Theorie + Praxis = Gesamt */ q("pkg").textContent = z.pkg; var praxis = z.price - t.price; var bd = "
  • Theorie-Onlinekurs" + eur(t.price) + "
  • "; if (p === "komplett") bd += "
  • 2 Praxisfahrten à 120 Min.+ " + eur(praxis) + "
  • "; else if (p === "plus") bd += "
  • 3 Praxisfahrten à 120 Min.+ " + eur(praxis) + "
  • "; else bd += '
  • Praxisfahrtenjederzeit nachbuchbar
  • '; q("bd").innerHTML = bd; q("price").innerHTML = z.price.toLocaleString("de-DE") + " €"; var items = INC.theorieBase.slice(); if (s === "kombi") items.splice(1, 0, INC.kombiExtra); var off = null; if (p === "komplett") items = INC.komplett.concat(items); else if (p === "plus") items = INC.plus.concat(items); else off = INC.noneOff; q("inc").innerHTML = items.map(function (i) { return "
  • " + i + "
  • "; }).join("") + (off ? '
  • ' + off + "
  • " : ""); q("cta").setAttribute("href", href); q("mbar-cta").setAttribute("href", href); q("mbar-price").innerHTML = eur(z.price); q("mbar-pkg").textContent = p === "none" ? "Nur Theorie" : (p === "plus" ? "Plus-Paket" : "Komplett-Paket"); if (window.dataLayer) { window.dataLayer.push({ event: "ncfg_selection", ncfg_schein: s, ncfg_praxis: p, ncfg_value: z.price }); } } var radios = document.querySelectorAll('input[name="ncfg-schein"], input[name="ncfg-praxis"]'); for (var i = 0; i = 960) { mbar.classList.remove("ncfg-on"); return; } var r = section.getBoundingClientRect(); var c = cta.getBoundingClientRect(); var sectionActive = r.top 120; var ctaVisible = c.top 0; mbar.classList.toggle("ncfg-on", sectionActive && !ctaVisible); mbar.setAttribute("aria-hidden", mbar.classList.contains("ncfg-on") ? "false" : "true"); } window.addEventListener("scroll", mbarTick, { passive: true }); window.addEventListener("resize", mbarTick, { passive: true }); render(); mbarTick(); })(); (function () { "use strict"; function domReady(fn) { if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", fn); } else { fn(); } } domReady(function () { // ---- FAQ Accordion ---- var faqContainer = document.getElementById('nst-faq'); if (faqContainer) { faqContainer.addEventListener('click', function (e) { var trigger = e.target.closest('.nst-faq-trigger'); if (!trigger) return; var item = trigger.closest('.nst-faq-item'); if (!item) return; var body = item.querySelector('.nst-faq-body'); var inner = item.querySelector('.nst-faq-body-inner'); if (!body || !inner) return; var isOpen = item.classList.contains('nst-open'); // Alle anderen schließen faqContainer.querySelectorAll('.nst-faq-item.nst-open').forEach(function (openItem) { if (openItem !== item) { openItem.classList.remove('nst-open'); openItem.querySelector('.nst-faq-trigger').setAttribute('aria-expanded', 'false'); openItem.querySelector('.nst-faq-body').style.maxHeight = '0'; } }); if (isOpen) { item.classList.remove('nst-open'); trigger.setAttribute('aria-expanded', 'false'); body.style.maxHeight = '0'; } else { item.classList.add('nst-open'); trigger.setAttribute('aria-expanded', 'true'); body.style.maxHeight = inner.scrollHeight + 'px'; } }); } // ---- Preis-Aufschlüsselungs-Modal ---- }); })();
    Häufige Fragen

    Alles was du wissen musst

    Nein, du benötigst keinerlei theoretische oder praktische Vorkenntnisse. Die Lernvideos sind auf Anfänger zugeschnitten und wir erklären alles von Grund auf, auch wie der organisatorische Ablauf ist und wie du dich in der App zurechtfindest.

    Die meisten Schüler waren vorher noch nie auf einem Boot, deshalb helfen dir unsere Praxisvideos, die Zusammenhänge noch besser zu verstehen und dir die Nervosität vor deiner ersten Fahrstunde zu nehmen.

    Ja. Du lernst flexibel per App mit Videos, Trainer und Lernfortschritt – wann und wo du willst. Du kannst dich mit unseren Videos sogar perfekt auf deine Praxisausbildung vorbereiten.

    Zusätzlich kannst du an einigen Standorten als Ergänzung zur Onlinetheorie auch unsere Vor-Ort Theoriekurse für z.B. die Navigation besuchen. Die Buchung der Vor-Ort Termine geht ganz bequem über dein Kundenkonto.

    Deutschlandweit an 50+ Standorten – eigene Nautigo Standorte und Partner. Standort & Termine wählst du bequem in der App.

    Die Fahrstunden finden an fast allen Standorten ganzjährig und an 7 Tagen die Woche statt bis abends, sodass du immer einen passenden Termin findest. Prüfungstermine gibt es i.d.R. alle 14 Tage, wobei kleinere Regionen auch monatliche Termine anbieten.

    Die Fahrstunden und die Prüfung buchst du einfach online in deinem Kundenkonto, flexibel nach deinem Zeitplan.

    Die absolute Mehrheit unserer Schüler besteht im 1. Versuch – wir haben eine sehr hohe Bestehensquote! Solltest du die Prüfung ausnahmsweise nicht auf Anhieb bestehen, kannst du sie beliebig oft wiederholen – es gibt also keinen Grund sich unnötigen Druck zu machen. Du musst dann nur noch einmal die anteilige Prüfungsgebühr von dem Teil zahlen, den du nicht bestanden hast.

    Wir unterstützen dich mit zusätzlichem Lernmaterial und Tipps, um beim nächsten Mal erfolgreich zu sein!

    Ja, unsere Gruppenrabatte findest du hier und wir bieten spezielle Rabatte für Studenten. Bitte kontaktiere uns direkt für weitere Informationen.

    Die persönliche Unterstützung durch unser erfahrenes Team steht dir zu unseren regulären Öffnungszeiten an 6 Tagen die Woche per WhatsApp und Telefon zur Verfügung. Du erhältst jederzeit Zugang zu unserer Lernplattform mit Hilfe-Funktion.

    Warum Nautigo

    Nicht der billigste Einstieg zählt.
    Sondern der echte Gesamtweg.

    Viele vergleichen nur den Kaufpreis. Was sie übersehen: Reibung, Zeitverlust und unklare Abläufe können am Ende teurer werden als ein günstigerer Einstieg.

    Struktur statt Chaos

    Klare Abläufe von Buchung bis Prüfung — du weißt immer, wo du stehst und was als nächstes kommt.

    Echte Videos statt leerer Versprechen

    Sieh vorab, was dich erwartet: echte Boote, echte Standorte, echte Fahrlehrer und wie die App wirklich aussieht.

    Praxis mit System

    50+ Standorte deutschlandweit, geprüfte Ausbilder, flexible Terminbuchung — kein Suchen, kein eigenes Organisieren.

    Transparenz statt Überraschungen

    Was drin ist, steht drin. Keine versteckten Zusatzkosten, keine unklaren Schritte nach dem Kauf.

    Worauf du beim Vergleich wirklich achten solltest

    Was ist wirklich enthalten — und was kostet später extra?
    Wie läuft die Praxis ab — gibt es klare Abläufe oder musst du selbst organisieren?
    Siehst du vorab echte Inhalte — oder nur Behauptungen und leere Versprechen?
    Deswegen kannst du bei uns alles vorab kostenlos testen!
    Wer steht hinter dem Angebot — und gibt es echten Support wenn du Fragen hast?

    Alles aus einer Hand

    Premium-Komplettpaket

    Theorie, Praxis, Prüfung & persönliche Betreuung — alles inklusive, ein Preis. Kein Suchen, kein Organisieren, kein Stress.

    Premiumpaket entdecken
    50+ Standorte

    Dein Schein. Dein Standort.

    Mache deinen Bootsführerschein an einem der 50+ Standorte in Deutschland. Entweder direkt bei uns oder bei einem Partner.

    /*! flyingpress:no-rucss cloudflare:no-minify – Marquee-Keyframes & Reel-Animations dürfen nicht entfernt werden */ .elementor img { height: 100%; } /* ===== Reel Wall – Testimonial Video Gallery ===== */ /* ===== Marquee Keyframes ===== */ @keyframes nst-marquee-left { from { transform: translateX(0); } to { transform: translateX(-50%); } } @keyframes nst-marquee-right { from { transform: translateX(-50%); } to { transform: translateX(0); } } /* Fade-Edges + overflow clip */ .nst-reel-track-wrap { overflow: hidden; -webkit-mask-image: linear-gradient(to right, transparent 0px, black 48px, black calc(100% - 48px), transparent 100%); mask-image: linear-gradient(to right, transparent 0px, black 48px, black calc(100% - 48px), transparent 100%); } .nst-reel-track { display: flex; gap: 12px; width: max-content; padding: 8px 0 16px; animation: nst-marquee-left 65s linear infinite; will-change: transform; } .nst-reel-track:hover { animation-play-state: paused; } /* Einzelne Video-Kachel */ .nst-reel-item { flex: 0 0 auto; width: 160px; height: 340px; position: relative; border-radius: 1.25rem; overflow: hidden; background: #18181b; box-shadow: 0 2px 12px rgba(0, 0, 0, 0.10); transition: box-shadow 300ms ease; cursor: pointer; user-select: none; -webkit-user-select: none; } @media (min-width: 1024px) { .nst-reel-item { width: 180px; height: 380px; } } /* Aktives Video: Cyan Glow */ .nst-reel-item.nst-reel-active { box-shadow: 0 0 0 2px rgba(1, 187, 254, 0.5), 0 4px 32px rgba(1, 187, 254, 0.25), 0 2px 12px rgba(0, 0, 0, 0.12); } .nst-reel-item video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; } /* Poster-Bild */ .nst-reel-poster { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; z-index: 2; transition: opacity 400ms ease; } .nst-reel-item.nst-reel-playing .nst-reel-poster { opacity: 0; pointer-events: none; } /* Sound-Icon oben-rechts */ .nst-reel-sound-icon { position: absolute; top: 10px; right: 10px; z-index: 10; width: 28px; height: 28px; border-radius: 50%; background: rgba(0, 0, 0, 0.45); display: flex; align-items: center; justify-content: center; opacity: 0; transition: opacity 300ms ease; pointer-events: none; } .nst-reel-item.nst-reel-playing .nst-reel-sound-icon { opacity: 1; } .nst-reel-item.nst-reel-unmuted .nst-reel-sound-icon { background: rgba(1, 187, 254, 0.65); } .nst-reel-item.nst-reel-unmuted { box-shadow: 0 0 0 2.5px #01bbfe, 0 8px 40px rgba(1, 187, 254, 0.3), 0 2px 12px rgba(0, 0, 0, 0.12); z-index: 5; } /* Hint-Pill */ .nst-reel-hint { position: absolute; bottom: 12px; left: 50%; transform: translateX(-50%) translateY(6px); background: rgba(0, 0, 0, 0.65); color: #fff; font-size: 11px; font-weight: 500; padding: 4px 10px; border-radius: 99px; white-space: nowrap; z-index: 10; opacity: 0; transition: opacity 250ms ease, transform 250ms ease; pointer-events: none; font-family: inherit; } .nst-reel-item.nst-reel-hint-visible .nst-reel-hint { opacity: 1; transform: translateX(-50%) translateY(0); } /* Name-Overlay unten */ .nst-reel-name { position: absolute; bottom: 0; left: 0; right: 0; z-index: 3; padding: 32px 12px 12px; background: linear-gradient(to top, rgba(0, 0, 0, 0.72) 0%, transparent 100%); pointer-events: none; } .nst-reel-name-text { font-size: 12px; font-weight: 700; color: #fff; line-height: 1.3; display: block; } .nst-reel-name-course { font-size: 9.5px; font-weight: 400; color: rgba(255, 255, 255, 0.72); display: block; margin-top: 2px; } /* ===== Text-Rezensionen Strip ===== */ .nst-rev-strip { margin-top: 28px; overflow: hidden; -webkit-mask-image: linear-gradient(to right, transparent 0px, black 48px, black calc(100% - 48px), transparent 100%); mask-image: linear-gradient(to right, transparent 0px, black 48px, black calc(100% - 48px), transparent 100%); } .nst-rev-track { display: flex; gap: 12px; width: max-content; padding: 4px 0 16px; animation: nst-marquee-right 55s linear infinite; will-change: transform; } .nst-rev-track:hover { animation-play-state: paused; } .nst-rev-card { flex: 0 0 auto; width: 280px; background: #ffffff; border-radius: 16px; padding: 16px 18px 14px; box-shadow: 0 1px 8px rgba(0, 0, 0, 0.07), 0 0 0 1px rgba(0, 0, 0, 0.04); display: flex; flex-direction: column; } .nst-rev-stars { color: #f59e0b; font-size: 14px; letter-spacing: 2px; margin-bottom: 8px; line-height: 1; } .nst-rev-text { font-size: 12.5px; color: #3f3f46; line-height: 1.6; margin: 0 0 12px; flex: 1; display: -webkit-box; -webkit-line-clamp: 5; line-clamp: 5; -webkit-box-orient: vertical; overflow: hidden; font-family: inherit; } .nst-rev-meta { display: flex; align-items: center; justify-content: space-between; margin-top: auto; gap: 8px; } .nst-rev-name { font-size: 11.5px; font-weight: 600; color: #18181b; font-family: inherit; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .nst-rev-date { font-size: 10.5px; color: #a1a1aa; font-family: inherit; white-space: nowrap; flex-shrink: 0; } /* Footer */ .nst-reel-footer { text-align: center; padding: 0 16px; margin-top: 20px; } .nst-reel-disclaimer { font-size: 10.5px; color: #a1a1aa; line-height: 1.5; font-family: inherit; }

    Was unsere Absolventen
    wirklich sagen.

    Ungeschnittene Erfahrungsberichte von Kursteilnehmern

    Ben S. SBF See · Binnen · Funk · Skippertraining
    Ton an
    Alex I. SBF See · Binnen · Skippertraining
    Ton an
    Nico W. SBF See · Binnen
    Ton an
    Roberto F. SBF See · Binnen
    Ton an
    Nico K. SBF See · Binnen · Skippertraining
    Ton an
    Bekim H. SBF See · Binnen · Funk · Skippertraining
    Ton an
    Nils SBF See · Binnen
    Ton an
    Sebastian SBF See · Binnen
    Ton an
    Mark, Nic & Paul Bootsmiete
    Ton an
    Diverse Prüflinge SBF See · Binnen
    Ton an
    Alex Jetski Training
    Ton an
    Torben Boot & Jetski
    Ton an
    ★★★★★

    Julian hat mir vom Kaufen der richtigen Pakete bis hin zu Fragen zur Theorie am frühen Morgen immer sofort geantwortet. Die Videos sind einfach nur mega gut und lassen absolut keine Fragen offen. Durch das gute Hintergrundwissen war die Theorie dann ein Klacks – alles in allem eine sehr gute Fahrschule die ich jedem nur empfehlen kann.

    Stephan Mc Donald März 2026
    ★★★★★

    Heute SBF Binnen & See bestanden. Alles an einem Tag (Theorie & Praxis). Hat alles super geklappt – wir wurden Top auf die Prüfung vorbereitet. Nautigo und das ganze Team um Julian herum kann ich jedem empfehlen. Saison 2026 kann kommen!

    Michael Feb. 2026
    ★★★★★

    Der SKS-Kurs ist gut strukturiert und verständlich erklärt. Die KI-gestützte Auswertung meiner Antworten gibt gute Tipps zur Verbesserung. Ich war damit sehr gut auf die Prüfung vorbereitet und habe diese auch im ersten Versuch gleich komplett bestanden. Dank an Julian und sein Team!

    Uve Feb. 2026
    ★★★★★

    Ich habe mich mit der Plattform von Nautigo auf die Prüfungen für beide Funkscheine vorbereitet. Die Lektionen sind sehr gut erklärt. Ich habe beide Scheine bestanden, dank toller Lernplattform. Hast du mal eine Frage, meldet sich schnell das nette Nautigo-Team. Jetzt bereite ich mich auf den nächsten Schein vor.

    Rene V. Okt. 2025
    ★★★★★

    Die Mitarbeiter sind alle sehr freundlich, kompetent, hilfsbereit und schnell zu erreichen. Die Boote für die Praxisfahrstunden sind alle neuwertig und auch für das Fahren auf dem Rhein ausreichend motorisiert. Das Unternehmen ist gut aufgestellt und strukturiert.

    Udo Gottschling Nov. 2025
    ★★★★★

    Top Bootsschule mit sehr nettem Team. Bei Fragen jederzeit unkompliziert erreichbar. Gut ausgearbeitete Lernunterlagen und Videos für das Selbststudium. Sehr zu empfehlen wenn man entspannt zum Bootsführerschein kommen will.

    Fabian BelkeOkt. 2025
    ★★★★★

    Ich habe bei Nautigo den See- und Binnenführerschein mit Praxisteil und Prüfung in Leverkusen gemacht. Ich kann die Bootsschule jedem empfehlen – die Inhalte sind super erklärt und digital leicht zu lernen. Julian und sein Team sind immer erreichbar und sehr sympathisch.

    Alex IbakasapAug. 2025
    ★★★★★

    Super kompetent, Service weit über dem, was man erwartet. Für jede Frage mit Rat und Tat bereit. Mehr als glücklich und zufrieden meinen Schein mit Nautigo gemacht zu haben. Fahrstunde und Unterricht praxisnah und absolut verständlich.

    Nico KesslerAug. 2025
    ★★★★★

    Die Online-Ausbildung ist super strukturiert und in den Lernvideos alles bestens erklärt. Die Fahrstunden machen auch richtig Spaß! Engjell – bester Mann! Er erklärt alles mega entspannt und gibt jedem sofort ein gutes Gefühl. Da kann die Prüfung nicht mehr schief gehen!

    GuidoSept. 2025
    ★★★★★

    Der Service ist Top. Ich hatte ein bestimmtes Anliegen, weil ich den Schein verschenken wollte – jederzeit wurden meine Fragen telefonisch oder per WhatsApp beantwortet. Vielen Dank!

    Isabella KolbeSept. 2025
    .nst-final-cta { position: relative; padding: 80px 24px 88px; background: #0f172a; overflow: hidden; font-family: 'Poppins', ui-sans-serif, system-ui, sans-serif; text-align: center; } /* Radial Glow im Hintergrund */ .nst-final-cta::before { content: ''; position: absolute; top: -60px; left: 50%; transform: translateX(-50%); width: 600px; height: 400px; background: radial-gradient(ellipse at center, rgba(1, 187, 254, 0.12) 0%, transparent 70%); pointer-events: none; } .nst-final-cta h2 { font-size: clamp(1.875rem, 6vw, 3rem); font-weight: 800; color: #fff; line-height: 1.15; margin: 12px 0 16px; text-wrap: balance; letter-spacing: -0.02em; }

    Worauf
    wartest du?

    Konfiguriere deinen Kurs in 3 Minuten — oder lass dich von uns beraten. Wir antworten innerhalb von Minuten.

    Per WhatsApp beraten
    (function () { 'use strict'; function domReady(fn) { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', fn); } else { fn(); } } domReady(function () { var form = document.getElementById('nst-form'); if (!form) return; // ---- State ---- var STATE = { currentStep: 1, theorie: { id: '10378', price: 199, name: 'SBF See & Binnen ' }, praxis: { id: '99744', price: 249, name: '3x Praxis mit Sicherheit' } }; // ---- DOM Refs ---- var stepPanels = [ document.getElementById('nst-step-1'), document.getElementById('nst-step-2') ]; var progCircles = [ document.getElementById('nst-prog-1'), document.getElementById('nst-prog-2') ]; var progLines = [ document.getElementById('nst-line-1') ]; var progLabels = [ null, document.getElementById('nst-label-2') ]; var checkoutBtn = document.getElementById('nst-checkout'); var sumTheorieName = document.getElementById('nst-sum-theorie-name'); var sumTheoriePrice = document.getElementById('nst-sum-theorie-price'); var sumPraxisName = document.getElementById('nst-sum-praxis-name'); var sumPraxisPrice = document.getElementById('nst-sum-praxis-price'); var sumTotal = document.getElementById('nst-sum-total'); // ---- Helpers ---- function fmt(v) { return Number(v).toLocaleString('de-DE', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + '\u20AC'; } // ---- Step Navigation ---- function goToStep(step) { if (step 2) return; var direction = step > STATE.currentStep ? 'forward' : 'back'; var prevStep = STATE.currentStep; STATE.currentStep = step; // Animate panels stepPanels.forEach(function (panel, i) { if (!panel) return; var panelStep = i + 1; panel.classList.remove('nst-active', 'nst-exit-back', 'nst-exit-forward'); if (panelStep === step) { panel.classList.add('nst-active'); } else if (panelStep === prevStep) { panel.classList.add(direction === 'forward' ? 'nst-exit-forward' : 'nst-exit-back'); } }); updateProgress(); if (step === 2) { updateSummary(); } // Scroll to form (Offset hält Progress-Indikator unter Sticky-Header sichtbar) var formSection = document.getElementById('stepper-form'); if (formSection) { var offset = formSection.getBoundingClientRect().top + window.pageYOffset - 120; window.scrollTo({ top: offset, behavior: 'smooth' }); } trackStepProgression(step); // Focus management: move focus to new step heading setTimeout(function () { var activePanel = stepPanels[step - 1]; if (activePanel) { var heading = activePanel.querySelector('h2'); if (heading) { heading.setAttribute('tabindex', '-1'); heading.focus({ preventScroll: true }); } } }, 350); } var animatedCheckSvg = ''; function updateProgress() { var step = STATE.currentStep; progCircles.forEach(function (circle, i) { if (!circle) return; var circleStep = i + 1; circle.classList.remove('bg-primary', 'text-white', 'ring-4', 'ring-primary/20', 'bg-zinc-200', 'text-zinc-400', 'nst-prog-complete', 'nst-prog-activate'); if (circleStep lineAfterStep; line.style.width = shouldFill ? '100%' : '0%'; line.classList.remove('nst-charging'); if (shouldFill) { void line.offsetWidth; line.classList.add('nst-charging'); } }); // Labels if (progLabels[1]) { progLabels[1].classList.toggle('text-primary', step >= 2); progLabels[1].classList.toggle('text-zinc-400', step 0; if (sumPraxisRow) sumPraxisRow.style.display = hasPraxis ? '' : 'none'; if (hasPraxis) { if (sumPraxisName) sumPraxisName.textContent = STATE.praxis.name; if (sumPraxisPrice) sumPraxisPrice.textContent = fmt(STATE.praxis.price); } if (sumTotal) sumTotal.textContent = fmt(STATE.theorie.price + (hasPraxis ? STATE.praxis.price : 0)); } // ---- Card Selection UI ---- function updateCardSelection(name) { var cards = form.querySelectorAll('input[name="' + name + '"]'); cards.forEach(function (input) { var label = input.closest('[data-card]'); if (!label) return; if (input.checked) { label.classList.add('nst-selected'); } else { label.classList.remove('nst-selected'); } }); } // ---- Event Listeners ---- // Radio changes form.addEventListener('change', function (e) { var input = e.target; if (!input || !input.name) return; if (input.name === 'theorie') { STATE.theorie = { id: input.dataset.productId || '10378', price: Number(input.dataset.price) || 149, name: input.dataset.name || '' }; updateCardSelection('theorie'); updateSummary(); } if (input.name === 'praxis') { var rawId = input.dataset.productId; var rawPrice = Number(input.dataset.price); STATE.praxis = { id: (rawId !== undefined && rawId !== null) ? rawId : '99744', price: !isNaN(rawPrice) ? rawPrice : 249, name: input.dataset.name || 'Praxis' }; updateCardSelection('praxis'); updateSummary(); } }); // Navigation buttons var next1 = document.getElementById('nst-next-1'); var back2 = document.getElementById('nst-back-2'); if (next1) next1.addEventListener('click', function () { goToStep(2); }); if (back2) back2.addEventListener('click', function () { goToStep(1); }); // Checkout if (checkoutBtn) { checkoutBtn.addEventListener('click', function (e) { e.preventDefault(); handleCheckout(); }); } // Hero CTA scroll var heroCta = document.getElementById('nst-hero-cta'); if (heroCta) { heroCta.addEventListener('click', function (e) { e.preventDefault(); var target = document.getElementById('stepper-form'); if (target) { var offset = target.getBoundingClientRect().top + window.pageYOffset - 120; window.scrollTo({ top: offset, behavior: 'smooth' }); } }); } // Prevent form submit form.addEventListener('submit', function (e) { e.preventDefault(); }); // ---- Checkout Handler ---- function handleCheckout() { var productIds = [STATE.theorie.id]; if (STATE.praxis.id) productIds.push(STATE.praxis.id); var total = STATE.theorie.price + (STATE.praxis.id ? STATE.praxis.price : 0); // Fire tracking events fireCheckoutTracking(productIds, total); // Disable button + show loading (Pitfall: verhindert Doppel-Add-to-Cart) if (checkoutBtn) { checkoutBtn.disabled = true; checkoutBtn.innerHTML = 'Weiterleitung'; } // Redirect after short delay for tracking setTimeout(function () { var url = buildCheckoutURL(productIds); window.location.href = url; }, 350); } function buildCheckoutURL(productIds) { var currentParams = new URLSearchParams(window.location.search); var checkoutParams = new URLSearchParams(); checkoutParams.set('add-to-cart', productIds.join(',')); checkoutParams.set('nautigo_tracked', '1'); currentParams.forEach(function (value, key) { if (value && value.trim() !== '') { checkoutParams.set(key, value); } }); return '/kasse/?' + checkoutParams.toString(); } // ---- Init ---- updateCardSelection('theorie'); updateCardSelection('praxis'); updateSummary(); updateProgress(); // ---- FAQ Accordion ---- var faqContainer = document.getElementById('nst-faq'); if (faqContainer) { faqContainer.addEventListener('click', function (e) { var trigger = e.target.closest('.nst-faq-trigger'); if (!trigger) return; var item = trigger.closest('.nst-faq-item'); if (!item) return; var body = item.querySelector('.nst-faq-body'); var inner = item.querySelector('.nst-faq-body-inner'); if (!body || !inner) return; var isOpen = item.classList.contains('nst-open'); // Alle anderen schließen faqContainer.querySelectorAll('.nst-faq-item.nst-open').forEach(function (openItem) { if (openItem !== item) { openItem.classList.remove('nst-open'); openItem.querySelector('.nst-faq-trigger').setAttribute('aria-expanded', 'false'); openItem.querySelector('.nst-faq-body').style.maxHeight = '0'; } }); if (isOpen) { item.classList.remove('nst-open'); trigger.setAttribute('aria-expanded', 'false'); body.style.maxHeight = '0'; } else { item.classList.add('nst-open'); trigger.setAttribute('aria-expanded', 'true'); body.style.maxHeight = inner.scrollHeight + 'px'; } }); } // ---- Preis-Aufschlüsselungs-Modal ---- (function () { var pmOverlay = document.getElementById('nst-pm-overlay'); var pmTrigger = document.getElementById('nst-pm-trigger'); var pmClose = document.getElementById('nst-pm-close'); var pmBackdrop = document.getElementById('nst-pm-backdrop'); if (!pmOverlay || !pmTrigger) return; function syncModalPrices() { var thNameEl = document.getElementById('nst-pm-theorie-name'); var thPriceEl = document.getElementById('nst-pm-theorie-price'); var praxisRow = document.getElementById('nst-pm-praxis-row'); var prNameEl = document.getElementById('nst-pm-praxis-name'); var prPriceEl = document.getElementById('nst-pm-praxis-price'); var totalEl = document.getElementById('nst-pm-total'); if (thNameEl) thNameEl.textContent = STATE.theorie.name || 'Theorie-Paket'; if (thPriceEl) thPriceEl.textContent = STATE.theorie.price.toFixed(2).replace('.', ',') + '\u00a0\u20ac'; if (praxisRow) { if (STATE.praxis.id) { praxisRow.style.display = ''; if (prNameEl) prNameEl.textContent = STATE.praxis.name || 'Praxisausbildung'; if (prPriceEl) prPriceEl.textContent = STATE.praxis.price.toFixed(2).replace('.', ',') + '\u00a0\u20ac'; } else { praxisRow.style.display = 'none'; } } var total = STATE.theorie.price + (STATE.praxis.id ? STATE.praxis.price : 0); if (totalEl) totalEl.textContent = total.toFixed(2).replace('.', ',') + '\u00a0\u20ac'; } function openModal() { syncModalPrices(); pmOverlay.classList.add('nst-pm-open'); pmOverlay.setAttribute('aria-hidden', 'false'); document.body.style.overflow = 'hidden'; var focusEl = pmOverlay.querySelector('button'); if (focusEl) setTimeout(function () { focusEl.focus(); }, 50); } function closeModal() { pmOverlay.classList.remove('nst-pm-open'); pmOverlay.setAttribute('aria-hidden', 'true'); document.body.style.overflow = ''; if (pmTrigger) pmTrigger.focus(); } pmTrigger.addEventListener('click', openModal); if (pmClose) pmClose.addEventListener('click', closeModal); if (pmBackdrop) pmBackdrop.addEventListener('click', closeModal); pmOverlay.addEventListener('keydown', function (e) { if (e.key === 'Escape') closeModal(); }); })(); console.log('[Nautigo Stepper] Initialisiert'); }); })(); (function () { 'use strict'; var CURRENCY = 'EUR'; window.nautigoTracking = window.nautigoTracking || { firedEvents: new Set(), customImplementation: true }; var uuid = function () { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0; var v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); }; var canFireEvent = function (eventName, productIds) { var key = eventName + '_' + productIds.slice().sort().join('_'); if (window.nautigoTracking.firedEvents.has(key)) { return false; } window.nautigoTracking.firedEvents.add(key); return true; }; function isMetaPixelReady() { if (typeof fbq === 'undefined') { return false; } var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = cookies[i].trim(); if (cookie.indexOf('cmplz_marketing=') === 0) { return cookie.substring('cmplz_marketing='.length) === 'allow'; } } return false; } function hasStatisticsConsent() { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = cookies[i].trim(); if (cookie.indexOf('cmplz_statistics=') === 0) { return cookie.substring('cmplz_statistics='.length) === 'allow'; } } return false; } function getProductName(productId) { var input = document.querySelector('input[data-product-id="' + productId + '"]'); return input ? (input.dataset.name || '').trim() : String(productId); } // ---- Global tracking functions (called from stepper logic) ---- window.trackStepProgression = function (step) { if (typeof gtag !== 'undefined' && hasStatisticsConsent()) { gtag('event', 'stepper_step_reached', { event_category: 'stepper_konfigurator', event_label: 'step_' + step, value: step }); } console.log('[Nautigo Tracking] Step ' + step + ' erreicht'); }; window.fireCheckoutTracking = function (productIds, total) { var eventIdATC = uuid(); var eventIdIC = uuid(); // GA4 events via dataLayer (nur mit Statistics-Consent) if (hasStatisticsConsent()) { window.dataLayer = window.dataLayer || []; window.dataLayer.push({ ecommerce: null }); window.dataLayer.push({ event: 'add_to_cart', ecommerce: { currency: CURRENCY, value: total, items: productIds.map(function (id) { return { item_id: id, item_name: getProductName(id), item_brand: 'Nautigo', item_category: 'Stepper-Konfigurator', quantity: 1 }; }) } }); } // Meta Pixel if (isMetaPixelReady()) { var content_ids = productIds.slice(); var contents = productIds.map(function (id) { return { id: id, quantity: 1 }; }); if (canFireEvent('AddToCart', content_ids)) { fbq('track', 'AddToCart', { content_type: 'product', content_ids: content_ids, contents: contents, value: parseFloat(total.toFixed(2)), currency: CURRENCY }, { eventID: eventIdATC }); console.log('[Nautigo Tracking] Meta Pixel: AddToCart', content_ids); } if (canFireEvent('InitiateCheckout', content_ids)) { fbq('track', 'InitiateCheckout', { content_type: 'product', content_ids: content_ids, contents: contents, value: parseFloat(total.toFixed(2)), currency: CURRENCY, num_items: productIds.length }, { eventID: eventIdIC }); console.log('[Nautigo Tracking] Meta Pixel: InitiateCheckout', content_ids); } } // Tracking cookie for server-side dedup setTrackingCookie(eventIdATC, eventIdIC); }; function setTrackingCookie(eventIdATC, eventIdIC) { var data = JSON.stringify({ atc: eventIdATC, ic: eventIdIC, timestamp: Date.now() }); var expires = new Date(Date.now() + 5 * 60 * 1000).toUTCString(); document.cookie = 'nautigo_tracking_ids=' + encodeURIComponent(data) + '; expires=' + expires + '; path=/; SameSite=Lax'; } // ---- Initial ViewContent on page load ---- function trackInitialView() { var form = document.getElementById('nst-form'); if (!form) return; var theorie = form.querySelector('input[name="theorie"]:checked'); var praxis = form.querySelector('input[name="praxis"]:checked'); var theorieId = theorie ? (theorie.dataset.productId || '10378') : '10378'; var praxisId = praxis ? praxis.dataset.productId : '99744'; var theoriePrice = theorie ? Number(theorie.dataset.price || 199) : 199; var praxisPrice = praxis ? Number(praxis.dataset.price) : 249; var content_ids = praxisId ? [theorieId, praxisId] : [theorieId]; var total = theoriePrice + (praxisId ? praxisPrice : 0); if (isMetaPixelReady() && canFireEvent('ViewContent', content_ids)) { var eventId = uuid(); fbq('track', 'ViewContent', { content_type: 'product', content_ids: content_ids, contents: content_ids.map(function (id) { return { id: id, quantity: 1 }; }), value: parseFloat(total.toFixed(2)), currency: CURRENCY }, { eventID: eventId }); console.log('[Nautigo Tracking] Meta Pixel: ViewContent', content_ids); } } // Attempt 1: DOM-ready (falls fbq bereits geladen) if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', trackInitialView); } else { trackInitialView(); } // Attempt 2: cmplz_fire_categories (falls fbq erst nach Consent geladen wird) document.addEventListener('cmplz_fire_categories', function () { trackInitialView(); // canFireEvent() verhindert Doppel-Firing }); console.log('[Nautigo Tracking] Stepper Tracking initialisiert'); })(); (function () { 'use strict'; // domReady Helper (FlyingPress-kompatibel) function domReady(fn) { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', fn); } else { fn(); } } // Counter Animation beim Scrollen function animateCounter(element, target) { let current = 0; const increment = target / 60; // 60 steps für smooth animation const timer = setInterval(() => { current += increment; if (current >= target) { element.textContent = target.toLocaleString('de-DE') + '+'; clearInterval(timer); } else { element.textContent = Math.floor(current).toLocaleString('de-DE'); } }, 25); } domReady(function () { // Intersection Observer für Counter const counterObserver = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { const element = entry.target; const count = parseInt(element.dataset.counter); animateCounter(element, count); counterObserver.unobserve(element); } }); }, { threshold: 0.5 }); // Alle Counter beobachten document.querySelectorAll('[data-counter]').forEach(el => { counterObserver.observe(el); }); // Step Cards Hover Effekte document.querySelectorAll('.step-card').forEach((card, index) => { card.addEventListener('mouseenter', () => { setTimeout(() => { card.classList.add('success-bounce'); }, index * 100); }); card.addEventListener('mouseleave', () => { card.classList.remove('success-bounce'); }); }); // CTA Button Click Tracking const ctaButton = document.querySelector('.cta-button'); if (ctaButton) { ctaButton.addEventListener('click', () => { // CTA Button clicked tracking }); } // Progress Line Animation on Scroll const progressObserver = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { const lines = entry.target.querySelectorAll('.progress-line'); lines.forEach((line, index) => { setTimeout(() => { line.classList.add('draw'); }, index * 300); }); progressObserver.unobserve(entry.target); } }); }, { threshold: 0.3 }); // Section für Progress Animation beobachten const stepsSection = document.querySelector('.steps-section section'); if (stepsSection) { progressObserver.observe(stepsSection); } // Mobile Touch Feedback if ('ontouchstart' in window) { document.querySelectorAll('.step-card').forEach(card => { card.addEventListener('touchstart', () => { card.style.transform = 'translateY(0)'; }); card.addEventListener('touchend', () => { setTimeout(() => { card.style.transform = ''; }, 100); }); }); } }); // domReady Ende // Hero Video Play Functions — global, da per onclick aufgerufen // Inline-Logik statt NautigoVideo-Dependency (nur in premiumpaket-Widget definiert) window.playHeroVideo = function () { var video = document.getElementById('hero-video'); if (!video) return; video.muted = false; video.volume = 1; video.controls = true; video.style.objectFit = 'contain'; // Custom Controls ausblenden - native Controls uebernehmen var ctrl = document.getElementById('hero-video-controls'); if (ctrl) { ctrl.style.opacity = '0'; ctrl.style.pointerEvents = 'none'; } // Overlay entfernen mit Fade-Out var overlay = document.getElementById('video-overlay-btn'); if (overlay) { overlay.style.opacity = '0'; overlay.style.pointerEvents = 'none'; setTimeout(function () { if (overlay.parentNode) overlay.remove(); }, 500); } var p = video.play(); if (p !== undefined) { p.catch(function () { video.controls = true; }); } }; window.playDemoVideo = function () { var video = document.getElementById('demo-video'); if (!video) return; video.muted = false; video.volume = 1; video.controls = true; video.style.objectFit = 'contain'; var overlay = document.getElementById('demo-video-overlay-btn'); if (overlay) { overlay.style.opacity = '0'; overlay.style.pointerEvents = 'none'; setTimeout(function () { if (overlay.parentNode) overlay.remove(); }, 500); } var p = video.play(); if (p !== undefined) { p.then(function () { if (video.requestFullscreen) { video.requestFullscreen().catch(function () { }); } else if (video.webkitEnterFullscreen) { video.webkitEnterFullscreen(); } }).catch(function () { video.controls = true; }); } }; // Hero Video Autoplay + Custom Controls (FlyingPress-kompatibel) domReady(function () { var video = document.getElementById('hero-video'); var overlay = document.getElementById('video-overlay-btn'); var controls = document.getElementById('hero-video-controls'); var playPauseBtn = document.getElementById('hero-play-pause-btn'); var muteBtn = document.getElementById('hero-mute-btn'); var pauseIcon = document.getElementById('hero-pause-icon'); var playIcon = document.getElementById('hero-play-icon'); var mutedIcon = document.getElementById('hero-muted-icon'); var unmutedIcon = document.getElementById('hero-unmuted-icon'); if (!video || !controls) return; var autoplayStarted = false; var isMobile = window.innerWidth = 3 (HAVE_FUTURE_DATA) = genug Daten zum Abspielen if (video.readyState >= 3) { tryPlay(); } else { video.addEventListener('canplay', function onCanPlay() { video.removeEventListener('canplay', onCanPlay); tryPlay(); }); // Sicherheits-Fallback: Video laden erzwingen if (video.readyState === 0) video.load(); } } // Mobile: IntersectionObserver (Video komplett im Viewport) if (isMobile) { if ('IntersectionObserver' in window) { var observer = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { if (entry.isIntersecting && !autoplayStarted && !video.controls) { startAutoplay(); observer.disconnect(); } }); }, { threshold: 0.85 }); observer.observe(video); // FlyingPress js_delay: Script kann erst nach User-Scroll laufen. // Video ist dann evtl. bereits im Viewport — Observer feuert nicht mehr. // Daher: sofort pruefen ob Video bereits sichtbar ist. var rect = video.getBoundingClientRect(); if (rect.top 0) { startAutoplay(); observer.disconnect(); } } } else { // Desktop: Verzoegert nach Page Load // FlyingPress kann load-Event bereits gefeuert haben if (document.readyState === 'complete') { setTimeout(startAutoplay, 1500); } else { window.addEventListener('load', function () { setTimeout(startAutoplay, 1500); }); } } // Play/Pause Button playPauseBtn.addEventListener('click', function (e) { e.stopPropagation(); if (video.paused || video.ended) { video.play().then(function () { updatePlayPauseIcon(); }).catch(function () { }); } else { video.pause(); updatePlayPauseIcon(); } }); // Mute/Unmute Button muteBtn.addEventListener('click', function (e) { e.stopPropagation(); video.muted = !video.muted; if (!video.muted) video.volume = 1; updateMuteIcon(); }); // Video Events synchronisieren (nur wenn Custom Controls aktiv) video.addEventListener('play', function () { if (!video.controls) { updatePlayPauseIcon(); showControls(); } }); video.addEventListener('pause', function () { if (!video.controls) updatePlayPauseIcon(); }); video.addEventListener('ended', function () { if (!video.controls) { updatePlayPauseIcon(); showOverlay(); hideControls(); autoplayStarted = false; } }); video.addEventListener('volumechange', function () { if (!video.controls) updateMuteIcon(); }); }); // domReady Ende })(); // IIFE Ende (function () { 'use strict'; function domReady(fn) { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', fn); } else { fn(); } } domReady(function () { // ---- Video Cover ---- var videoCover = document.getElementById('nst-video-cover'); var galleryVideo = document.getElementById('nst-gallery-video'); if (videoCover && galleryVideo) { videoCover.addEventListener('click', function () { videoCover.classList.add('nst-cover-hidden'); galleryVideo.controls = true; galleryVideo.play(); }); // Show cover again if video ends galleryVideo.addEventListener('ended', function () { galleryVideo.controls = false; videoCover.classList.remove('nst-cover-hidden'); }); } // ---- Gallery Grid ---- var grid = document.getElementById('nst-gallery-grid'); var lightbox = document.getElementById('nst-lightbox'); var lbImg = document.getElementById('nst-lb-img'); var lbCaption = document.getElementById('nst-lb-caption'); var lbCounter = document.getElementById('nst-lb-counter'); var lbClose = document.getElementById('nst-lb-close'); var lbPrev = document.getElementById('nst-lb-prev'); var lbNext = document.getElementById('nst-lb-next'); if (!grid || !lightbox) return; var cards = Array.prototype.slice.call(grid.querySelectorAll('.nst-gallery-card')); var currentIdx = 0; var total = cards.length; function getCardData(idx) { var card = cards[idx]; var img = card.querySelector('img'); var caption = card.querySelector('.nst-gallery-caption'); return { src: img ? img.src : '', alt: img ? img.alt : '', caption: caption ? caption.textContent.trim() : '' }; } function openLightbox(idx) { currentIdx = (idx + total) % total; var data = getCardData(currentIdx); lbImg.src = data.src; lbImg.alt = data.alt; lbCaption.textContent = data.caption; lbCounter.textContent = (currentIdx + 1) + ' / ' + total; lightbox.classList.add('nst-lb-open'); lightbox.setAttribute('aria-hidden', 'false'); document.body.style.overflow = 'hidden'; lbClose.focus(); } function closeLightbox() { lightbox.classList.remove('nst-lb-open'); lightbox.setAttribute('aria-hidden', 'true'); document.body.style.overflow = ''; if (cards[currentIdx]) cards[currentIdx].focus(); } function navigate(dir) { currentIdx = (currentIdx + dir + total) % total; var data = getCardData(currentIdx); lbImg.style.opacity = '0'; setTimeout(function () { lbImg.src = data.src; lbImg.alt = data.alt; lbCaption.textContent = data.caption; lbCounter.textContent = (currentIdx + 1) + ' / ' + total; lbImg.style.opacity = '1'; }, 120); } // Open on click / Enter / Space grid.addEventListener('click', function (e) { var card = e.target.closest('.nst-gallery-card'); if (!card) return; var idx = parseInt(card.getAttribute('data-gallery-idx'), 10); openLightbox(idx); }); grid.addEventListener('keydown', function (e) { if (e.key !== 'Enter' && e.key !== ' ') return; var card = e.target.closest('.nst-gallery-card'); if (!card) return; e.preventDefault(); var idx = parseInt(card.getAttribute('data-gallery-idx'), 10); openLightbox(idx); }); // Lightbox controls lbClose.addEventListener('click', closeLightbox); lbPrev.addEventListener('click', function () { navigate(-1); }); lbNext.addEventListener('click', function () { navigate(1); }); // Close on backdrop click lightbox.addEventListener('click', function (e) { if (e.target === lightbox) closeLightbox(); }); // Keyboard navigation document.addEventListener('keydown', function (e) { if (!lightbox.classList.contains('nst-lb-open')) return; if (e.key === 'Escape') closeLightbox(); if (e.key === 'ArrowLeft') navigate(-1); if (e.key === 'ArrowRight') navigate(1); }); // Touch swipe var touchStartX = 0; lightbox.addEventListener('touchstart', function (e) { touchStartX = e.touches[0].clientX; }, { passive: true }); lightbox.addEventListener('touchend', function (e) { var dx = e.changedTouches[0].clientX - touchStartX; if (Math.abs(dx) > 50) navigate(dx < 0 ? 1 : -1); }, { passive: true }); }); })(); (function () { 'use strict'; function domReady(fn) { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', fn); } else { fn(); } } domReady(function () { var LOCATIONS = [ { title: 'Köln', lat: 50.8951278, lng: 6.9958818, place: 'Nautigo Bootsschule', bl: 'NRW' }, { title: 'Düsseldorf', lat: 51.2052305, lng: 6.7717578, place: 'Nautigo Bootsschule', bl: 'NRW' }, { title: 'Dortmund', lat: 51.5328413, lng: 7.4423293, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'NRW' }, { title: 'Bielefeld', lat: 52.0068764, lng: 8.5880011, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'NRW' }, { title: 'Duisburg', lat: 51.4397798, lng: 6.7633992, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'NRW' }, { title: 'Bonn', lat: 50.7337620, lng: 7.1052810, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'NRW' }, { title: 'Münster', lat: 51.9520863, lng: 7.6213414, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'NRW' }, { title: 'Bad Oeynhausen', lat: 52.2041803, lng: 8.8453871, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'NRW' }, { title: 'München', lat: 48.0582136, lng: 11.1031005, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Bayern' }, { title: 'Nürnberg', lat: 49.4314303, lng: 11.0167226, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Bayern' }, { title: 'Regensburg', lat: 49.0283951, lng: 12.1059856, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Bayern' }, { title: 'Hof/Saale', lat: 50.3191547, lng: 11.9683313, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Bayern' }, { title: 'Rieden am Forggensee', lat: 47.6348738, lng: 10.7366202, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Bayern' }, { title: 'Absberg', lat: 49.1405211, lng: 10.8971574, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Bayern' }, { title: 'Bamberg', lat: 49.9124068, lng: 10.8329397, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Bayern' }, { title: 'Rosenheim', lat: 47.8496331, lng: 12.1015002, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Bayern' }, { title: 'Würzburg', lat: 49.7920090, lng: 9.9334131, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Bayern' }, { title: 'Passau', lat: 48.5746398, lng: 13.4131699, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Bayern' }, { title: 'Mannheim/Ludwigshafen', lat: 49.4672033, lng: 8.4518965, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Baden-Württemberg' }, { title: 'Stuttgart', lat: 48.7224275, lng: 9.3430254, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Baden-Württemberg' }, { title: 'Bodensee', lat: 47.5862007, lng: 9.5605356, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Baden-Württemberg' }, { title: 'Karlsruhe', lat: 49.0380716, lng: 8.3085650, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Baden-Württemberg' }, { title: 'Freiburg', lat: 47.9884305, lng: 7.8324664, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Baden-Württemberg' }, { title: 'Hannover', lat: 52.3551680, lng: 9.7464303, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Niedersachsen' }, { title: 'Lingen (Ems)', lat: 52.5219640, lng: 7.3299985, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Niedersachsen' }, { title: 'Hüde', lat: 52.4943107, lng: 8.3567315, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Niedersachsen' }, { title: 'Braunschweig', lat: 52.3115529, lng: 10.4529535, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Niedersachsen' }, { title: 'Osnabrück', lat: 52.2724961, lng: 8.0547406, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Niedersachsen' }, { title: 'Emden', lat: 53.3484463, lng: 7.1552861, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Niedersachsen' }, { title: 'Rostock', lat: 54.0962160, lng: 12.1276906, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Mecklenburg-Vorpommern' }, { title: 'Waren (Müritz)', lat: 53.5113914, lng: 12.6954282, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Mecklenburg-Vorpommern' }, { title: 'Stralsund', lat: 54.3181141, lng: 13.0951547, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Mecklenburg-Vorpommern' }, { title: 'Wolgast', lat: 54.0520727, lng: 13.7801863, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Mecklenburg-Vorpommern' }, { title: 'Greifswald', lat: 54.1000748, lng: 13.3954650, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Mecklenburg-Vorpommern' }, { title: 'Schwerin', lat: 53.6323791, lng: 11.4231462, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Mecklenburg-Vorpommern' }, { title: 'Frankfurt a.M.', lat: 50.0900489, lng: 8.6100484, place: 'Nautigo Bootsschule', bl: 'Hessen' }, { title: 'Mainz/Wiesbaden', lat: 50.0248044, lng: 8.2613832, place: 'Nautigo Bootsschule', bl: 'Hessen' }, { title: 'Kassel', lat: 51.3163789, lng: 9.5088644, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Hessen' }, { title: 'Leipzig', lat: 51.2644570, lng: 12.3442760, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Sachsen' }, { title: 'Dresden', lat: 51.0581447, lng: 13.8077524, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Sachsen' }, { title: 'Chemnitz', lat: 50.8234537, lng: 12.9218727, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Sachsen' }, { title: 'Lübeck', lat: 53.8968842, lng: 10.7663436, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Schleswig-Holstein' }, { title: 'Kiel', lat: 54.4283300, lng: 10.1690100, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Schleswig-Holstein' }, { title: 'Wyk auf Föhr', lat: 54.6912732, lng: 8.5673008, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Schleswig-Holstein' }, { title: 'Koblenz', lat: 50.3641975, lng: 7.5821390, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Rheinland-Pfalz' }, { title: 'Trier', lat: 49.7578948, lng: 6.6340078, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Rheinland-Pfalz' }, { title: 'Hamburg', lat: 53.5333333, lng: 9.8794225, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Hamburg' }, { title: 'Bremen', lat: 53.0696577, lng: 8.8068809, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Bremen' }, { title: 'Berlin', lat: 52.4553581, lng: 13.3859582, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Berlin' }, { title: 'Potsdam', lat: 52.3894227, lng: 13.0989428, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Brandenburg' }, { title: 'Magdeburg', lat: 52.1195275, lng: 11.6205418, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Sachsen-Anhalt' }, { title: 'Erfurt', lat: 50.9748491, lng: 11.0187594, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Thüringen' }, { title: 'Saarbrücken', lat: 49.2235139, lng: 7.0160667, place: 'Bootsführerschein Ausbildung Anfragen', bl: 'Saarland' } ]; var ROOT = document.getElementById('nst-map-section'); var WRAP = document.getElementById('nst-mapwrap'); var CANVAS = document.getElementById('nst-map-canvas'); var PILLS_EL = document.getElementById('nst-map-pills'); if (!ROOT || !WRAP || !CANVAS || !PILLS_EL) return; // ---- Bundesland-Gruppen aufbauen ---- var blCount = {}; LOCATIONS.forEach(function (l) { blCount[l.bl] = (blCount[l.bl] || 0) + 1; }); var bundeslaender = ['Alle'].concat( Object.keys(blCount).sort(function (a, b) { return blCount[b] - blCount[a]; }) ); // ---- Pills erzeugen ---- bundeslaender.forEach(function (bl) { var btn = document.createElement('button'); btn.type = 'button'; var label = bl === 'Alle' ? 'Alle (' + LOCATIONS.length + ')' : bl + ' (' + blCount[bl] + ')'; btn.textContent = label; var baseClass = 'px-3 py-1 rounded-full text-xs font-semibold border transition-all duration-150 cursor-pointer focus:outline-none '; btn.className = baseClass + (bl === 'Alle' ? 'nst-map-pill-active' : 'bg-white text-zinc-600 border-zinc-200 hover:border-primary/60 hover:text-primary'); btn.dataset.bl = bl; btn.setAttribute('aria-pressed', bl === 'Alle' ? 'true' : 'false'); btn.addEventListener('click', function () { filterByBl(bl); }); PILLS_EL.appendChild(btn); }); // ---- Map State ---- var mapsLoaded = false, mapsLoading = false, mapInit = false; var loadQueue = []; var leafletMap = null; var allMarkers = []; function loadLeaflet(cb) { if (mapsLoaded) { if (cb) cb(); return; } if (cb) loadQueue.push(cb); if (mapsLoading) return; mapsLoading = true; var css = document.createElement('link'); css.rel = 'stylesheet'; css.href = 'https://unpkg.com/[email protected]/dist/leaflet.css'; css.integrity = 'sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY='; css.crossOrigin = ''; document.head.appendChild(css); var s = document.createElement('script'); s.src = 'https://unpkg.com/[email protected]/dist/leaflet.js'; s.integrity = 'sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo='; s.crossOrigin = ''; s.onload = function () { setTimeout(function () { mapsLoaded = true; mapsLoading = false; while (loadQueue.length) { (loadQueue.shift())(); } }, 100); }; s.onerror = function () { mapsLoading = false; }; document.head.appendChild(s); } function initMap() { if (mapInit || !window.L) return; mapInit = true; var nstIcon = L.icon({ iconUrl: 'https://nautigo-bootsschule.de/wp-content/uploads/2025/05/cropped-Logo-Rund-Icon-512x512-1.avif', iconSize: [24, 24], iconAnchor: [18, 18], popupAnchor: [0, -20] }); leafletMap = L.map(CANVAS).setView([51.1657, 10.4515], 6); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 19, attribution: '© OpenStreetMap' }).addTo(leafletMap); LOCATIONS.forEach(function (loc) { var marker = L.marker([loc.lat, loc.lng], { icon: nstIcon }); var msg = encodeURIComponent('Liebes Nautigo-Team,\n\nIch interessiere mich für den Bootsführerschein und würde gern wissen, wann ich in der Nähe von ' + loc.title + ' meinen SBF machen kann.\n\nVielen Dank!'); var waLink = 'https://wa.me/4915121277699?text=' + msg; marker.bindPopup('
    ' + loc.title + '
    ' + loc.place + '
    Anfragen
    '); marker._nstBl = loc.bl; marker.addTo(leafletMap); allMarkers.push(marker); }); fitMarkers(allMarkers); WRAP.classList.add('nst-map-ready'); } function fitMarkers(markers) { if (!leafletMap || !markers.length) return; var bounds = L.latLngBounds(markers.map(function (m) { return m.getLatLng(); })); leafletMap.fitBounds(bounds, { padding: [30, 30] }); } function filterByBl(bl) { // Pills updaten PILLS_EL.querySelectorAll('button').forEach(function (btn) { var active = btn.dataset.bl === bl; btn.classList.toggle('nst-map-pill-active', active); btn.classList.toggle('bg-white', !active); btn.classList.toggle('text-zinc-600', !active); btn.classList.toggle('border-zinc-200', !active); btn.setAttribute('aria-pressed', active ? 'true' : 'false'); }); if (!mapInit) return; var visible = []; allMarkers.forEach(function (m) { var show = bl === 'Alle' || m._nstBl === bl; if (show) { if (!leafletMap.hasLayer(m)) m.addTo(leafletMap); visible.push(m); } else { if (leafletMap.hasLayer(m)) leafletMap.removeLayer(m); } }); if (visible.length) fitMarkers(visible); } // ---- Aktivierung NUR per expliziten Klick ---- // Es werden keine Cookies gesetzt, daher kein Complianz-Marketing-Consent erforderlich. // Vor dem Klick gehen KEINE externen Requests raus (kein Auto-Load via Scroll/IO/Consent). window.nstActivateMap = function (e) { if (e) e.preventDefault(); loadLeaflet(initMap); }; }); })(); (function () { 'use strict'; var _initialized = false; function init() { if (_initialized) return true; var track = document.getElementById('nst-reel-track'); if (!track) return false; var wrapper = track.parentElement; var sectionEl = document.getElementById('nst-reel-section'); var items = Array.prototype.slice.call(track.querySelectorAll('.nst-reel-item[role="listitem"]')); if (!items.length) return false; var allItems = Array.prototype.slice.call(track.querySelectorAll('.nst-reel-item')); _initialized = true; // prefers-reduced-motion: Poster only, kein Video, kein Marquee if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) { track.style.animationPlayState = 'paused'; return true; } var activeUnmuted = null; var allPlaying = false; var visInterval = null; /* ---- Helpers ---- */ function setSoundIcon(item, muted) { var m = item.querySelector('.nst-reel-icon-muted'); var u = item.querySelector('.nst-reel-icon-unmuted'); if (m) m.style.display = muted ? '' : 'none'; if (u) u.style.display = muted ? 'none' : ''; } function showHint(item, text) { var hint = item.querySelector('.nst-reel-hint'); if (!hint) return; hint.textContent = text; item.classList.add('nst-reel-hint-visible'); if (item._ht) clearTimeout(item._ht); item._ht = setTimeout(function () { item.classList.remove('nst-reel-hint-visible'); item._ht = null; }, 1800); } /* ---- Poster-Gate: Poster erst ausblenden wenn Video-Frame gerendert ---- */ function attachReveal(item) { if (item._rv) return; item._rv = true; var video = item.querySelector('video'); if (!video) return; video.addEventListener('timeupdate', function () { if (!video.paused && video.currentTime > 0) { item.classList.add('nst-reel-playing'); } }); } /* ---- Sichtbarkeitspruefung: nur sichtbare Videos abspielen ---- */ function checkVisibleAndPlay() { if (!wrapper) return; var wr = wrapper.getBoundingClientRect(); allItems.forEach(function (item) { var video = item.querySelector('video'); if (!video) return; var r = item.getBoundingClientRect(); var isVisible = r.right > wr.left - 50 && r.left 0 && rect.top = 20) clearInterval(iv); }, 500); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', tryInit); } else { tryInit(); } })();

    Vertrag widerrufen