{"id":9606,"date":"2026-10-20T21:32:23","date_gmt":"2026-10-20T19:32:23","guid":{"rendered":"https:\/\/tausendberlin.com\/?page_id=9606"},"modified":"2026-11-03T17:34:46","modified_gmt":"2026-11-03T16:34:46","slug":"test-v5","status":"publish","type":"page","link":"https:\/\/tausendberlin.com\/en\/","title":{"rendered":"Bar Tausend"},"content":{"rendered":"\r\n<div class=\"et_pb_section_0 et_pb_section et_section_regular et_block_section et_pb_section_parallax bt-startbanner\" id=\"home\"><span class=\"et-pb-parallax-wrapper\"><span class=\"et-pb-parallax-background et-pb-parallax-background--css et-pb-parallax-background-module--divi-section-0 et_parallax_bg_tablet_exist et_parallax_bg_phone_exist\" style=\"background-image:url(https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-BG17-1.webp)\"><\/span><\/span><span class=\"et-pb-parallax-wrapper\"><span class=\"et-pb-parallax-background et-pb-parallax-background--css et-pb-parallax-background_tablet et-pb-parallax-background_tablet-module--divi-section-0 et_parallax_bg_phone_exist\" style=\"background-image:url(https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-BG17-1.webp)\"><\/span><\/span><span class=\"et-pb-parallax-wrapper\"><span class=\"et-pb-parallax-background et-pb-parallax-background--css et-pb-parallax-background_phone et-pb-parallax-background_phone-module--divi-section-0 et_parallax_bg_tablet_exist\" style=\"background-image:url(https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-BG17-01-1280.webp)\"><\/span><\/span>\r\n<div class=\"et_pb_row_0 et_pb_row et_block_row bt-menu-row\">\r\n<div class=\"et_pb_column_0 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_0 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"startmenu-1\"><div class=\"et_pb_text_inner\"><nav class=\"menu-inline\" aria-label=\"Hauptmen\u00fc\"><a href=\"https:\/\/tausendberlin.com\/#about\">\u00dcber Uns<\/a><br \/><a href=\"https:\/\/tausendberlin.com\/#musik\">Musik<\/a><br \/><a href=\"https:\/\/tausendberlin.com\/#bar\">Bar<\/a><br \/><a href=\"https:\/\/tausendberlin.com\/#cantina\">Cantina<\/a><br \/><a href=\"https:\/\/tausendberlin.com\/#art\">Kunst<\/a><br \/><a href=\"https:\/\/tausendberlin.com\/#event\">Event<\/a><br \/><a href=\"https:\/\/tausendberlin.com\/#presse\">Presse<\/a><br \/><a href=\"https:\/\/tausendberlin.com\/#kontakt\">Kontakt<\/a><br \/><a href=\"https:\/\/tausendberlin.com\/en\/\">En<\/a><\/nav>\n<\/div><\/div>\r\n<div class=\"et_pb_code_0 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style id=\"bt-hero-downrow-stable-v2\">\n\/* Position the existing lower arrow before Divi's footer stylesheet arrives. *\/\nhtml body.home.page-id-9606:not(.et-fb):not(.et_fb) #home > .et_pb_row_2{\n position:absolute!important;\n top:auto!important;right:auto!important;bottom:0!important;left:50%!important;\n height:auto!important;min-height:0!important;\n transform:translateX(-50%)!important;\n}\n<\/style>\n<!-- TAUSEND \u00b7 Stabile Startgeometrie \u00b7 23.10.2026 -->\n<style id=\"bt-start-geometry-v2\">\nhtml body.home.page-id-9606:not(.et-fb):not(.et_fb) #page-container{padding-top:0!important;}\nhtml body.home.page-id-9606:not(.et-fb):not(.et_fb) :is(#et-main-area,#main-content){padding-top:0!important;margin-top:0!important;}\nhtml body.home.page-id-9606.admin-bar:not(.et-fb):not(.et_fb) #page-container{margin-top:calc(-1 * var(--wp-admin--admin-bar--height,32px))!important;}\n@media(min-width:981px){\n html body.page-id-9606:not(.et-fb):not(.et_fb) #home{--bt-start-height:100vh;position:relative;height:100vh!important;min-height:100vh!important;margin:0!important;padding:0!important;}\n html body.page-id-9606 #home .bt-menu-row{position:absolute;top:0;left:0;right:0;z-index:50;}\n html body.page-id-9606 #home .bt-video-row{position:absolute!important;inset:0!important;width:100%!important;max-width:100%!important;height:100%!important;min-height:100%!important;padding:0!important;margin:0!important;}\n html body.page-id-9606 #home .bt-video-row :is(.et_pb_column,.bt-video-code,.et_pb_code_inner){position:relative;width:100%!important;height:100%!important;min-height:100%!important;padding:0!important;margin:0!important;}\n html body.page-id-9606 #home .bt-video-wrap{position:absolute!important;left:50%!important;top:50%!important;width:320px!important;height:320px!important;flex:0 0 320px!important;transform:translate(calc(-50% + var(--logo-shift-x,0px)),calc(-50% + var(--logo-shift-y,0px)))!important;}\n html body.page-id-9606 #home .bt-video-wrap img{position:absolute;inset:0;width:100%;height:100%;display:block;object-fit:contain;}\n}\nhtml.bt-refresh-positioning body::before{opacity:1!important;transition:none!important;}\n<\/style>\n<script id=\"bt-refresh-anchor-v1\" data-no-optimize=\"1\" data-nowprocket=\"1\">\n(function(){\n 'use strict';\n var w=window,d=document,root=d.documentElement;\n if(!\/^\\\/(?:en\\\/?)?$\/.test(location.pathname)||\/[?&](et_fb|et_bfb|trp-edit-translation|preview)=\/.test(location.search))return;\n var key='bt-refresh-position:'+location.pathname+location.search;\n \/* Store once when leaving; no scroll listener or animation loop. *\/\n w.addEventListener('pagehide',function(){\n  try{sessionStorage.setItem(key,JSON.stringify({x:w.scrollX,y:w.scrollY,time:Date.now()}));}catch(ignore){}\n });\n var entries=performance.getEntriesByType?performance.getEntriesByType('navigation'):[],entry=entries[0];\n var reload=entry?entry.type==='reload':performance.navigation&&performance.navigation.type===1;\n if(!reload)return;\n var saved=null;\n try{saved=JSON.parse(sessionStorage.getItem(key));}catch(ignore){}\n if(!saved||!Number.isFinite(saved.y)||Date.now()-saved.time>300000)return;\n if('scrollRestoration' in history)history.scrollRestoration='manual';\n if(location.hash&&history.replaceState)history.replaceState(history.state,'',location.pathname+location.search);\n root.classList.add('bt-refresh-positioning');\n var cancelled=false;\n function cancel(){cancelled=true;root.classList.remove('bt-refresh-positioning');}\n ['wheel','touchstart','pointerdown','keydown'].forEach(function(type){w.addEventListener(type,cancel,{once:true,passive:true});});\n function restore(){\n  if(!cancelled&&Math.abs(w.scrollY-saved.y)>1)w.scrollTo({left:saved.x||0,top:saved.y,behavior:'instant'});\n }\n function ready(){\n  restore();\n  requestAnimationFrame(function(){restore();root.classList.remove('bt-refresh-positioning');});\n }\n if(d.readyState==='loading')d.addEventListener('DOMContentLoaded',ready,{once:true});else ready();\n w.addEventListener('load',function(){\n  restore();\n  if('scrollRestoration' in history)history.scrollRestoration='auto';\n  root.classList.remove('bt-refresh-positioning');\n },{once:true});\n})();\n<\/script>\n<style>\nhtml, body {\n  background:#000 !important;\n}\n<\/style>\n<!-- =========================================================\n     BAR TAUSEND \u00b7 VIDEOS ERST KURZ VORHER LADEN \u00b7 V2\n\n     EINBAU\n     Ganz ans ENDE des obersten Code-Moduls der Seite setzen\n     (das Modul mit \u201ehtml, body { background:#000 }\u201c).\n     Wichtig: ganz oben auf der Seite, damit der Code vor den\n     Videos da ist. Kein neues Modul n\u00f6tig.\n\n     WAS ES MACHT\n     - Hintergrund-Videos laden erst, wenn man bis etwa eine\n       Bildschirmh\u00f6he an sie heranscrollt\n     - jedes Ger\u00e4t l\u00e4dt nur seine eigene Version\n       (Handy-Video am Handy, Desktop-Video am Desktop)\n     - Videos weit au\u00dferhalb des Bildschirms pausieren (spart Akku)\n     - Videos blenden weich ein, sobald das erste Bild da ist\n     - \u201eweniger Bewegung\u201c im System eingestellt: Video bleibt als\n       ruhiges Standbild stehen (Barrierefreiheit)\n\n     NEU IN V2\n     - Gemessen wird die Sektion, nicht das Video selbst.\n       Auf Handy\/iPad stehen die Videos fest (Parallax) und galten\n       dadurch immer als \u201esichtbar\u201c \u2013 alle Handy-Videos luden\n       sofort beim Seitenstart mit (ca. 2,4 MB). Das ist behoben.\n========================================================= -->\n<style>\nvideo.bt-vid-wait{ opacity: 0; }\nvideo.bt-vid-wait.bt-vid-ready{ opacity: 1; transition: opacity .9s ease; }\n<\/style>\n<script>\n(function () {\n  \"use strict\";\n\n  var w = window, d = document;\n  if (w.__btVideoLazy) return;\n  if (\/[?&]et_fb=1\/.test(location.search)) return;\n  if (d.body && d.body.classList.contains(\"et-fb\")) return;\n  if (!(\"IntersectionObserver\" in w) || !(\"MutationObserver\" in w) || !w.HTMLMediaElement) return;\n  w.__btVideoLazy = true;\n\n  var proto = HTMLMediaElement.prototype;\n  var preloadProp = Object.getOwnPropertyDescriptor(proto, \"preload\");\n  var setAttr = Element.prototype.setAttribute;\n  function setPreload(v, val) {\n    if (preloadProp && preloadProp.set) preloadProp.set.call(v, val);\n    else setAttr.call(v, \"preload\", val);\n  }\n  var mqPhone = w.matchMedia(\"(max-width: 767px)\");\n  var mqTablet = w.matchMedia(\"(min-width: 768px) and (max-width: 980px)\");\n  var mqReduce = w.matchMedia(\"(prefers-reduced-motion: reduce)\");\n  var list = [];\n\n  \/* Divi: gibt es f\u00fcr dieses Ger\u00e4t eine eigene Video-Version? *\/\n  function variantOK(v) {\n    var box = v.closest(\".et_pb_section_video_bg, .et_pb_row_video_bg, .et-pb-background-video\");\n    if (!box) return true;\n    var cl = box.classList, parent = box.parentElement;\n    var phone = mqPhone.matches, tablet = mqTablet.matches;\n    function has(suffix) {\n      return !!(parent && parent.querySelector(\":scope > .et_pb_section_video_bg_\" + suffix + \", :scope > .et_pb_row_video_bg_\" + suffix + \", :scope > .et-pb-background-video_\" + suffix));\n    }\n    if (cl.contains(\"et_pb_section_video_bg_phone\") || cl.contains(\"et_pb_row_video_bg_phone\") || cl.contains(\"et-pb-background-video_phone\")) return phone;\n    if (cl.contains(\"et_pb_section_video_bg_tablet\") || cl.contains(\"et_pb_row_video_bg_tablet\") || cl.contains(\"et-pb-background-video_tablet\")) return tablet || (phone && !has(\"phone\"));\n    if (cl.contains(\"et_pb_section_video_bg_hover\") || cl.contains(\"et_pb_row_video_bg_hover\") || cl.contains(\"et-pb-background-video_hover\")) return false;\n    if (phone && (has(\"phone\") || has(\"tablet\"))) return false;\n    if (tablet && has(\"tablet\")) return false;\n    return true;\n  }\n\n  function allowed(v) { return !!v.__btNear && variantOK(v); }\n\n  \/* Old Cuban: cooperate with the earlier lazy play\/load guard. *\/\n  function primeDrink(v) {\n    if (!v.closest(\"#cocktail-slider\")) return;\n    v.setAttribute(\"data-bt-loaded\", \"1\");\n    var changed = false;\n    var src = v.getAttribute(\"data-src\");\n    if (src && !v.getAttribute(\"src\")) { v.setAttribute(\"src\", src); changed = true; }\n    Array.prototype.forEach.call(v.querySelectorAll(\"source[data-src]\"), function (source) {\n      var url = source.getAttribute(\"data-src\");\n      if (url && source.getAttribute(\"src\") !== url) {\n        source.setAttribute(\"src\", url); changed = true;\n      }\n    });\n    v.muted = true;\n    v.playsInline = true;\n    if (changed) { try { v.load(); } catch (e) {} }\n  }\n\n  function update(v) {\n    if (allowed(v)) {\n      primeDrink(v);\n      if (mqReduce.matches) {\n        \/* weniger Bewegung: nur das erste Bild zeigen *\/\n        if (!v.__btPrimed) {\n          v.__btPrimed = true;\n          setPreload(v, \"metadata\");\n          try { v.load(); } catch (e) {}\n        }\n        if (!v.paused) proto.pause.call(v);\n        return;\n      }\n      setPreload(v, \"auto\");\n      if (v.paused) {\n        var p = proto.play.call(v);\n        if (p && p.catch) p.catch(function () {});\n      }\n    } else if (!v.paused) {\n      proto.pause.call(v);\n    }\n  }\n\n  \/* V2: beobachtet wird die Sektion (bzw. Zeile), nicht das Video.\n     Feste Parallax-Videos zaehlen sonst immer als sichtbar. *\/\n  var io = new IntersectionObserver(function (entries) {\n    entries.forEach(function (e) {\n      var vids = e.target.__btVids || [e.target];\n      vids.forEach(function (v) {\n        v.__btNear = e.isIntersecting;\n        update(v);\n      });\n    });\n  }, { rootMargin: \"100% 0px 100% 0px\" });\n\n  function watchTarget(v) {\n    var t = v.closest(\".et_pb_section\") || v.closest(\".et_pb_row\") || v;\n    if (t === v) { io.observe(v); return; }\n    if (!t.__btVids) {\n      t.__btVids = [];\n      io.observe(t);\n    }\n    t.__btVids.push(v);\n  }\n\n  function ready(v) { v.classList.add(\"bt-vid-ready\"); }\n\n  function manage(v) {\n    if (v.__btManaged) return;\n    v.__btManaged = true;\n    v.__btNear = false;\n    list.push(v);\n\n    \/* Autostart aus, nichts vorladen \u2013 und andere Skripte d\u00fcrfen\n       das nicht wieder einschalten (sonst l\u00e4dt der Browser alles) *\/\n    v.muted = true;\n    v.removeAttribute(\"autoplay\");\n    setPreload(v, \"none\");\n    try {\n      Object.defineProperty(v, \"autoplay\", { configurable: true, get: function () { return false; }, set: function () {} });\n      Object.defineProperty(v, \"preload\", { configurable: true,\n        get: function () { return preloadProp && preloadProp.get ? preloadProp.get.call(v) : v.getAttribute(\"preload\"); },\n        set: function () {} });\n    } catch (e) {}\n    v.setAttribute = function (name, value) {\n      var n = String(name).toLowerCase();\n      if (n === \"autoplay\" || n === \"preload\") return;\n      return setAttr.call(v, name, value);\n    };\n    v.classList.add(\"bt-vid-wait\");\n    if (v.readyState >= 2) ready(v);\n    v.addEventListener(\"loadeddata\", function () { ready(v); });\n    v.addEventListener(\"playing\", function () { ready(v); });\n    if (v.closest(\"#cocktail-slider\")) {\n      var retryTimer = null, reloads = 0;\n      function recoverDrink(e) {\n        clearTimeout(retryTimer);\n        retryTimer = setTimeout(function () {\n          if (!allowed(v) || d.hidden) return;\n          var section = v.closest(\".et_pb_section\"), rect = section && section.getBoundingClientRect();\n          if (rect && (rect.bottom <= 0 || rect.top >= w.innerHeight)) return;\n          primeDrink(v);\n          if ((v.error || e.type === \"stalled\") && reloads < 2) {\n            reloads++;\n            try { v.load(); } catch (err) {}\n          }\n          update(v);\n        }, e.type === \"pause\" ? 200 : 1200);\n      }\n      [\"pause\", \"stalled\", \"error\"].forEach(function (event) { v.addEventListener(event, recoverDrink); });\n      v.addEventListener(\"loadeddata\", function () { reloads = 0; });\n    }\n\n\n    \/* andere Skripte d\u00fcrfen play() rufen, es spielt aber nur, wenn das Video dran ist *\/\n    v.play = function () {\n      if (!allowed(v) || mqReduce.matches) return Promise.resolve();\n      primeDrink(v);\n      setPreload(v, \"auto\");\n      return proto.play.call(v);\n    };\n\n    \/* hat der Browser schon angefangen zu laden: abbrechen *\/\n    if (v.networkState === 2 || !v.paused) {\n      proto.pause.call(v);\n      try { v.load(); } catch (e) {}\n    }\n    watchTarget(v);\n  }\n\n  function scan(root) {\n    if (!root || root.nodeType !== 1) return;\n    if (root.tagName === \"VIDEO\") { manage(root); return; }\n    if (root.querySelectorAll) Array.prototype.forEach.call(root.querySelectorAll(\"video\"), manage);\n  }\n\n  \/* Videos schon beim Aufbau der Seite abfangen (auch sp\u00e4ter eingef\u00fcgte) *\/\n  new MutationObserver(function (records) {\n    records.forEach(function (r) { Array.prototype.forEach.call(r.addedNodes, scan); });\n  }).observe(d.documentElement, { childList: true, subtree: true });\n  scan(d.documentElement);\n\n  \/* Ger\u00e4t gedreht \/ Fenster ver\u00e4ndert: richtige Version w\u00e4hlen *\/\n  var t = null;\n  function recheck() {\n    clearTimeout(t);\n    t = setTimeout(function () { list.forEach(update); }, 150);\n  }\n  [mqPhone, mqTablet, mqReduce].forEach(function (mq) {\n    if (mq.addEventListener) mq.addEventListener(\"change\", recheck);\n    else if (mq.addListener) mq.addListener(recheck);\n  });\n  d.addEventListener(\"visibilitychange\", function () { if (!d.hidden) recheck(); });\n  w.addEventListener(\"pageshow\", recheck);\n})();\n<\/script>\n<style id=\"bt-v5-phone-menu-design\">\n@media(max-width:767px){\nbody.page-id-9606 #kb-mobile-burger{width:48px!important;height:48px!important;top:max(14px,env(safe-area-inset-top,0px))!important;right:14px!important;color:#d0cdc7!important}\nbody.page-id-9606 #kb-mobile-burger .bar{width:20px!important;height:1.5px!important;margin:4px auto!important;border-radius:2px!important;transition:transform .3s ease,opacity .25s ease!important}\nhtml.kb-menu-open body.page-id-9606 #kb-mobile-burger .bar:nth-child(1){transform:translateY(5.5px) rotate(45deg)!important}\nhtml.kb-menu-open body.page-id-9606 #kb-mobile-burger .bar:nth-child(3){transform:translateY(-5.5px) rotate(-45deg)!important}\n\/* Mobile polish 22 October: compact controls, stable type and once-only claim. *\/\nhtml body.page-id-9606 #page-container #about#about .bt-about-bar-hours{font-size:clamp(16px,4.7vw,20px)!important;line-height:1.35!important;margin:0!important}\nhtml body.page-id-9606 #page-container #about#about .bt-hours-line{display:block!important;white-space:nowrap!important}\nhtml body.page-id-9606 #page-container #about#about .bt-hours-en{display:none!important}\nhtml[lang^=\"en\"] body.page-id-9606 #page-container #about#about .bt-hours-de{display:none!important}\nhtml[lang^=\"en\"] body.page-id-9606 #page-container #about#about .bt-hours-en{display:block!important}\nhtml body.page-id-9606 #page-container #about .bt-claim-phone{opacity:0;translate:0 8px;transition:opacity .85s ease,translate .85s cubic-bezier(.22,1,.36,1)}\nhtml body.page-id-9606 #page-container #about .bt-claim-phone.bt-claim-phone-ready{opacity:1;translate:0 0}\nhtml body.page-id-9606 :is(#bt-v4-phone-reserve,#btcg2-dock)>button.btcg2-reserve{box-sizing:border-box!important;width:auto!important;min-width:104px!important;max-width:132px!important;height:34px!important;min-height:34px!important;padding:6px 13px!important;font:500 14px\/1.2 \"Oswald\",sans-serif!important;letter-spacing:0!important}\nhtml body.page-id-9606 :is(#bt-v4-phone-reserve,#btcg2-dock)>button.btcg2-reserve *{font-size:14px!important}\nhtml body.page-id-9606.bt-phone-footer-visible :is(#bt-v4-phone-reserve,#btcg2-dock){opacity:0!important;visibility:hidden!important;pointer-events:none!important;transition:opacity .35s ease,visibility 0s linear .35s!important}\nhtml body.page-id-9606 #page-container #footer#footer{height:auto!important;min-height:0!important}\nhtml body.page-id-9606 #page-container #footer#footer .et_pb_text:has(.bt-footer-newsletter-title){width:100%!important;margin-left:auto!important;margin-right:auto!important}\nhtml body.page-id-9606 #page-container #footer#footer h2.bt-footer-newsletter-title{display:block!important;width:100%!important;margin:0 auto 14px!important;text-align:center!important;font-size:24px!important;line-height:1.25!important;translate:none!important}\nhtml body.page-id-9606 #page-container #footer#footer #tausend-newsletter-new input.input{border:1px solid rgba(185,182,176,.2)!important;border-radius:8px!important;background:rgba(255,255,255,.012)!important;box-shadow:none!important;min-height:44px!important;padding:11px 15px!important;font-size:13px!important}\nhtml body.page-id-9606 #page-container #footer#footer #tausend-newsletter-new input.input::placeholder{color:rgba(185,182,176,.55)!important}\nhtml body.page-id-9606 #page-container #footer#footer #tausend-newsletter-new input.input:focus{border-bottom-color:#c27a50!important;outline:none!important}\nhtml body.page-id-9606 #page-container #footer#footer #tausend-newsletter-new input.input.et_contact_error{border-bottom-color:#ea0b5f!important}\nhtml body.page-id-9606 #page-container #footer#footer #tausend-newsletter-new .et_contact_bottom_container{width:40px!important;height:40px!important;min-width:40px!important;min-height:40px!important;margin:18px auto 0!important;border-width:1px!important;translate:none!important}\nhtml body.page-id-9606 #page-container #footer#footer #tausend-newsletter-new .et_pb_contact_submit{width:40px!important;height:40px!important;min-height:40px!important;padding:0!important}\nhtml body.page-id-9606 #page-container #footer#footer #tausend-newsletter-new .et_contact_bottom_container::after{width:9px!important;height:9px!important}\nhtml body.page-id-9606 #page-container p.copyright{font-size:11px!important;line-height:1.65!important;padding:14px 18px!important}\nhtml body.page-id-9606 #page-container p.copyright>span:first-child{display:block!important;margin-bottom:5px!important}\nhtml body.page-id-9606 #page-container p.copyright .bt-copyright-separator{display:none!important}\nhtml body.page-id-9606 #page-container #cantina-chef#cantina-chef::before,html body.page-id-9606 #page-container #cantina-chef#cantina-chef::after{background-image:none!important}\nhtml body.page-id-9606 #page-container #cantina-chef#cantina-chef .et_pb_image.bt-eva-phone-logo{display:block!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;width:84px!important;max-width:84px!important;height:auto!important;margin:0 0 22px!important;order:-1!important}\nhtml body.page-id-9606 #page-container #cantina-chef#cantina-chef .bt-eva-phone-logo img{display:block!important;width:84px!important;height:84px!important;object-fit:contain!important}\nhtml body.page-id-9606 #page-container #kontakt#kontakt #kontakt1{padding-top:64px!important;padding-bottom:48px!important;translate:none!important}\nhtml body.page-id-9606 #page-container #kontakt#kontakt #kontakt1>.et_pb_column:first-child>.et_pb_text>.et_pb_text_inner h2.bt-contact-v2{font-size:32px!important;line-height:1.2!important}\nhtml body.page-id-9606 #page-container #kontakt#kontakt #kontakt1>.et_pb_column:first-child>.et_pb_text>.et_pb_text_inner h3.bt-contact-cantina-title{font-size:26px!important;line-height:1.2!important}\nhtml body.page-id-9606 #page-container #kontakt#kontakt #kontakt1>.et_pb_column:first-child>.et_pb_text>.et_pb_text_inner :is(.bt-contact-address,.bt-live-opening-hours,.bt-contact-cantina-hours,.bt-contactlinks__title){font-size:17px!important;line-height:1.45!important}\nhtml body.page-id-9606 #page-container #kontakt#kontakt #kontakt1 .bt-contact-en{display:none!important}\nhtml[lang^=\"en\"] body.page-id-9606 #page-container #kontakt#kontakt #kontakt1 .bt-contact-de{display:none!important}\nhtml[lang^=\"en\"] body.page-id-9606 #page-container #kontakt#kontakt #kontakt1 .bt-contact-en{display:inline!important}\nhtml body.page-id-9606 #page-container #kontakt#kontakt #kontakt1 .bt-contactlinks__item{min-height:44px!important}\n\nbody.page-id-9606 #bt-v4-phone-reserve button{min-height:34px!important;height:34px!important;min-width:104px!important;padding:6px 13px!important;font:500 14px\/1.2 \"Oswald\",sans-serif!important;letter-spacing:.025em!important;border-width:1px!important;position:relative!important}\nbody.page-id-9606 #bt-v4-phone-reserve button *{font-size:15px!important}\nbody.page-id-9606 #bt-v4-phone-reserve button::before{content:\"\";position:absolute;inset:-3px;pointer-events:auto}\nbody.page-id-9606 #kb-mobile-menu{background:rgba(0,0,0,.7)!important;transition:opacity .28s ease!important}\nbody.page-id-9606 #kb-mobile-panel{width:100%!important;max-width:420px!important;height:100dvh!important;max-height:100dvh!important;box-sizing:border-box!important;padding:max(26px,env(safe-area-inset-top,0px)) 26px max(24px,env(safe-area-inset-bottom,0px))!important;background:#101010!important;color:#d0cdc7!important;overflow-y:auto!important;overscroll-behavior:contain;transform:translateX(100%);transition:transform .32s cubic-bezier(.22,.61,.36,1)!important;display:flex!important;flex-direction:column!important;gap:0!important}\nhtml.kb-menu-open body.page-id-9606 #kb-mobile-panel{transform:translateX(0)!important}\nbody.page-id-9606 .bt-phone-menu-heading{margin:0 48px 22px 0!important;flex-shrink:0}\nbody.page-id-9606 .bt-phone-menu-heading strong{display:block;font:400 26px\/1.2 \"Oswald\",sans-serif!important;letter-spacing:.035em;color:#ebebeb}\nbody.page-id-9606 .bt-phone-menu-heading span{display:block;margin-top:7px;font:400 9px\/1.5 \"Poppins\",sans-serif!important;letter-spacing:.16em;color:#837e77}\nbody.page-id-9606 #kb-mobile-panel nav{width:100%;flex-shrink:0}\nbody.page-id-9606 #kb-mobile-menu-list{list-style:none!important;margin:0!important;padding:0!important}\nbody.page-id-9606 #kb-mobile-menu-list li{margin:0!important;padding:0!important;border:0!important;list-style:none!important}\nbody.page-id-9606 #kb-mobile-menu-list a{display:flex!important;align-items:center!important;min-height:44px!important;box-sizing:border-box!important;padding:7px 0!important;border-bottom:1px solid #ffffff0d!important;background:transparent!important;color:#c6c2bc!important;text-decoration:none!important;font:400 21px\/1.25 \"Oswald\",sans-serif!important;letter-spacing:.025em!important;transition:color .5s ease,padding-left .5s ease!important}\nbody.page-id-9606 #kb-mobile-menu-list a:is(:hover,:focus-visible),body.page-id-9606 #kb-mobile-menu-list a[aria-current]{color:#f1efeb!important;padding-left:6px!important}\nbody.page-id-9606 #kb-mobile-menu-list a[href=\"#cantina\"]{color:#c27a50!important}\nbody.page-id-9606 #kb-mobile-menu-list a.bt-phone-language{margin-top:8px!important;border:0!important;font:400 12px\/1.4 \"Poppins\",sans-serif!important;letter-spacing:.13em!important;min-height:38px!important;width:max-content!important}\nbody.page-id-9606 #kb-mobile-panel a:focus-visible,body.page-id-9606 #kb-mobile-panel button:focus-visible{outline:1px solid #c27a50!important;outline-offset:3px!important}\nbody.page-id-9606 .bt-phone-menu-footer{margin-top:auto!important;padding-top:22px!important;flex-shrink:0}\nbody.page-id-9606 .bt-phone-menu-reserve{display:flex!important;align-items:center!important;justify-content:center!important;width:100%!important;min-height:44px!important;box-sizing:border-box!important;border:1px solid #c27a5080!important;border-radius:8px!important;background:#c27a5008!important;color:#c27a50!important;padding:10px 16px!important;font:400 15px\/1.3 \"Oswald\",sans-serif!important;letter-spacing:.025em!important;transition:color .6s ease,border-color .6s ease,background-color .6s ease!important}\nbody.page-id-9606 .bt-phone-menu-reserve:is(:hover,:focus-visible){color:#e1c7b7!important;border-color:#c27a50!important;background:#c27a5012!important}\nbody.page-id-9606:has(#kb-mobile-menu:not([hidden])) #bt-v4-phone-reserve{opacity:0!important;visibility:hidden!important;pointer-events:none!important}\n}\n@media(max-width:767px) and (max-height:660px){body.page-id-9606 .bt-phone-menu-heading{margin-bottom:14px!important}body.page-id-9606 #kb-mobile-panel{padding-top:22px!important;padding-bottom:20px!important}body.page-id-9606 #kb-mobile-menu-list a{font-size:19px!important;min-height:42px!important}body.page-id-9606 .bt-phone-menu-footer{padding-top:14px!important}}\n@media(prefers-reduced-motion:reduce){body.page-id-9606 #kb-mobile-menu,body.page-id-9606 #kb-mobile-panel,body.page-id-9606 #kb-mobile-menu-list a,body.page-id-9606 #kb-mobile-burger .bar{transition:none!important}}\n<\/style>\n<script id=\"bt-v5-phone-menu-interaction\">\n(function(){\n'use strict';\nif(!document.body.classList.contains('page-id-9606')||document.body.classList.contains('et-fb'))return;\nfunction init(){\nvar burger=document.getElementById('kb-mobile-burger'),overlay=document.getElementById('kb-mobile-menu'),panel=document.getElementById('kb-mobile-panel'),list=document.getElementById('kb-mobile-menu-list');\nif(!burger||!overlay||!panel||!list||panel.dataset.btV5MenuReady)return;\npanel.dataset.btV5MenuReady='1';\nvar root=document.documentElement,mq=matchMedia('(max-width:767px)'),en=\/^en\/i.test(root.lang),opened=false,closeTimer=0,openFrame=0,savedBodyOverflow='',savedRootOverflow='';\npanel.setAttribute('aria-label',en?'Main navigation':'Hauptnavigation');\nvar heading=document.createElement('div');heading.className='bt-phone-menu-heading';\nvar brand=document.createElement('strong'),claim=document.createElement('span');brand.textContent='BAR TAUSEND';claim.textContent='BERLIN \u00b7 DRINKS & MUSIC';heading.append(brand,claim);panel.insertBefore(heading,panel.firstChild);\nvar foot=document.createElement('div'),reserve=document.createElement('button');foot.className='bt-phone-menu-footer';reserve.type='button';reserve.className='bt-phone-menu-reserve';reserve.textContent=en?'Reserve a table':'Tisch reservieren';reserve.setAttribute('aria-haspopup','dialog');reserve.setAttribute('aria-controls','bt-reservation-modal');foot.appendChild(reserve);panel.appendChild(foot);\nfunction build(){\nvar source=document.querySelector('#top-menu')||document.querySelector('#mobile_menu');\nif(!source)return;\nlist.textContent='';\nArray.from(source.querySelectorAll('a[href]')).forEach(function(a){\nvar li=document.createElement('li'),link=a.cloneNode(true);link.removeAttribute('id');\nif(\/^(EN|DE)$\/i.test(link.textContent.trim()))link.classList.add('bt-phone-language');\nli.appendChild(link);list.appendChild(li);\n});list.dataset.built='1';\n}\nbuild();\nfunction setButton(on){burger.setAttribute('aria-expanded',String(on));burger.setAttribute('aria-label',on?(en?'Close menu':'Men\u00fc schlie\u00dfen'):(en?'Open menu':'Men\u00fc \u00f6ffnen'));}\nfunction close(restoreFocus){\nif(!opened)return;\nopened=false;cancelAnimationFrame(openFrame);clearTimeout(closeTimer);root.classList.remove('kb-menu-open');overlay.setAttribute('aria-hidden','true');overlay.inert=true;setButton(false);\ndocument.body.style.overflow=savedBodyOverflow;root.style.overflow=savedRootOverflow;\ncloseTimer=setTimeout(function(){if(!opened)overlay.hidden=true;},320);\nif(restoreFocus)burger.focus({preventScroll:true});\n}\nfunction open(){\nclearTimeout(closeTimer);cancelAnimationFrame(openFrame);build();opened=true;savedBodyOverflow=document.body.style.overflow;savedRootOverflow=root.style.overflow;overlay.hidden=false;overlay.inert=false;overlay.setAttribute('aria-hidden','false');setButton(true);document.body.style.overflow='hidden';root.style.overflow='hidden';\nvar hash=location.hash||'#home';list.querySelectorAll('a').forEach(function(a){if(a.getAttribute('href')===hash)a.setAttribute('aria-current','location');else a.removeAttribute('aria-current');});\noverlay.getBoundingClientRect();\nopenFrame=requestAnimationFrame(function(){if(!opened)return;root.classList.add('kb-menu-open');var first=list.querySelector('a');if(first)first.focus({preventScroll:true});});\n}\ndocument.addEventListener('pointerdown',function(e){if(mq.matches&&opened&&panel.contains(e.target)&&e.target.closest('a[href],button'))e.stopImmediatePropagation();},{capture:true,passive:true});\ndocument.addEventListener('click',function(e){\nif(!mq.matches)return;\nif(e.target.closest('#kb-mobile-burger')){e.preventDefault();e.stopImmediatePropagation();opened?close(true):open();return;}\nif(!opened)return;\nif(e.target===overlay){e.preventDefault();e.stopImmediatePropagation();close(true);return;}\nif(e.target.closest('.bt-phone-menu-reserve')){e.preventDefault();e.stopImmediatePropagation();close(false);var source=document.querySelector('#cantina .cantina-reservation-button');if(source)source.click();return;}\nvar a=e.target.closest('#kb-mobile-menu-list a[href]');if(!a)return;\ne.stopImmediatePropagation();var href=a.getAttribute('href')||'';close(false);\nif(href.charAt(0)==='#'&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey){e.preventDefault();var target=document.getElementById(decodeURIComponent(href.slice(1)));if(target){history.pushState(null,'',href);target.scrollIntoView({block:'start',behavior:matchMedia('(prefers-reduced-motion:reduce)').matches?'instant':'smooth'});}}\n},true);\ndocument.addEventListener('keydown',function(e){\nif(!mq.matches||!opened)return;\nif(e.key==='Escape'){e.preventDefault();e.stopImmediatePropagation();close(true);return;}\nif(e.key!=='Tab')return;\nvar stops=[burger].concat(Array.from(panel.querySelectorAll('a[href],button:not([disabled])'))),first=stops[0],last=stops[stops.length-1];\nif(e.shiftKey&&document.activeElement===first){e.preventDefault();last.focus();}else if(!e.shiftKey&&document.activeElement===last){e.preventDefault();first.focus();}\n},true);\nfunction breakpoint(){if(!mq.matches&&opened)close(false);}\nif(mq.addEventListener)mq.addEventListener('change',breakpoint);else mq.addListener(breakpoint);\n}\nif(document.readyState==='loading')document.addEventListener('DOMContentLoaded',init,{once:true});else init();\n})();\n<\/script>\n<style id=\"bt-v5-phone-sound-off\">\nhtml.bt-phone-sound-off body.page-id-9606 :is(#bt-music-logo,#bt-mini-eq-control,#bt-player-compact-wrap,#btpc-stand-host,#btpc-stand-placeholder,#btpc-floating-player,.btpc-floating,.bt-lsb-play,.bt-lsb-back){display:none!important}\n<\/style>\n<script id=\"bt-v5-phone-sound-guard\">\n(function(){\n'use strict';\nif(!document.body.classList.contains('page-id-9606')||document.body.classList.contains('et-fb'))return;\nvar root=document.documentElement,bound=new WeakSet();\nfunction phone(){var coarse=matchMedia('(pointer:coarse)').matches,shortSide=Math.min(screen.width||0,screen.height||0);return coarse&&shortSide>0?shortSide<600:innerWidth<600;}\nfunction silence(){\nvar off=phone();root.classList.toggle('bt-phone-sound-off',off);\nif(!off)return;\ndocument.querySelectorAll('audio').forEach(function(a){a.pause();a.muted=true;});\ndocument.querySelectorAll('video').forEach(function(v){v.muted=true;});\nif(window.SC&&window.SC.Widget)document.querySelectorAll('iframe[src*=\"w.soundcloud.com\"]').forEach(function(f){try{var widget=window.SC.Widget(f);widget.pause();if(!bound.has(f)){bound.add(f);widget.bind(window.SC.Widget.Events.PLAY,function(){if(phone())widget.pause();});}}catch(e){}});\n}\nsilence();\ndocument.addEventListener('play',function(e){if(!phone())return;var m=e.target;if(m.tagName==='AUDIO'){m.pause();m.muted=true;}else if(m.tagName==='VIDEO')m.muted=true;},true);\ndocument.addEventListener('click',function(e){if(phone()&&e.target.closest('#bt-music-logo,#bt-mini-eq-control,#bt-player-compact-wrap,#btpc-stand-host,.bt-lsb-play,.bt-lsb-back')){e.preventDefault();e.stopImmediatePropagation();}},true);\naddEventListener('resize',silence,{passive:true});document.addEventListener('DOMContentLoaded',silence,{once:true});\nnew MutationObserver(function(records){if(!phone())return;if(records.some(function(r){return r.type==='attributes'||Array.from(r.addedNodes).some(function(n){return n.nodeType===1&&(n.matches('audio,video,iframe')||n.querySelector('audio,video,iframe'));});}))silence();}).observe(document.body,{childList:true,subtree:true,attributes:true,attributeFilter:['src']});\n})();\n<\/script>\n<script id=\"bt-archive-prefetch-v1\" data-no-optimize=\"1\" data-nowprocket=\"1\">\n(function(){\n 'use strict';\n var d=document,w=window,started=false,observer;\n if(!d.body||!d.body.classList.contains('page-id-9606')||d.body.classList.contains('et-fb')||d.body.classList.contains('logged-in')||d.body.classList.contains('admin-bar'))return;\n var connection=navigator.connection||navigator.mozConnection||navigator.webkitConnection;\n if(connection&&connection.saveData)return;\n function prepare(){\n  if(started||d.hidden)return;\n  var target=d.querySelector('a.bt-archiv-text[href]');\n  if(!target)return;\n  var url;\n  try{url=new URL(target.href,location.href);}catch(e){return;}\n  if(url.origin!==location.origin||url.search)return;\n  started=true;\n  if(observer)observer.disconnect();\n  var hint=d.createElement('link');\n  hint.id='bt-archive-document-prefetch';\n  hint.rel='prefetch';hint.as='document';hint.href=url.href;\n  hint.setAttribute('fetchpriority','low');\n  hint.setAttribute('data-bt-state','loading');\n  hint.addEventListener('load',function(){hint.setAttribute('data-bt-state','ready');},{once:true});\n  hint.addEventListener('error',function(){hint.setAttribute('data-bt-state','failed');},{once:true});\n  d.head.appendChild(hint);\n }\n function idle(){\n  if(started||d.hidden)return;\n  if(w.requestIdleCallback)w.requestIdleCallback(prepare,{timeout:2500});\n  else setTimeout(prepare,1200);\n }\n function setup(){\n  var target=d.querySelector('a.bt-archiv-text[href]');\n  if(!target)return;\n  target.addEventListener('pointerenter',prepare,{once:true,passive:true});\n  target.addEventListener('focus',prepare,{once:true});\n  target.addEventListener('touchstart',prepare,{once:true,passive:true});\n  if(w.matchMedia('(min-width:981px)').matches){\n   idle();\n   d.addEventListener('visibilitychange',function(){if(!d.hidden)idle();});\n  }else if('IntersectionObserver' in w){\n   observer=new IntersectionObserver(function(entries){\n    if(entries.some(function(entry){return entry.isIntersecting;}))prepare();\n   },{rootMargin:'300px 0px'});\n   observer.observe(target);\n  }\n }\n if(d.readyState==='complete')setup();else w.addEventListener('load',setup,{once:true});\n})();\n<\/script>\n<style id=\"bt-speisekarte-anchor-style\">\nbody.page-id-9606 #bt-speisekarte-flow-anchor{display:block!important;position:relative!important;width:100%;height:0!important;min-height:0!important;margin:0!important;padding:0!important;border:0!important;pointer-events:none}\nbody.page-id-9606 #speisekarte{scroll-margin-top:0!important}\n<\/style>\n<script id=\"bt-speisekarte-native-anchor\">\n(function(w,d){\n'use strict';\nif(!d.body.classList.contains('page-id-9606')||d.body.classList.contains('et-fb')||\/[?&](?:et_fb|et_bfb|trp-edit-translation)=\/.test(location.search))return;\nvar menu,anchor;\nfunction setup(){\n menu=d.getElementById('speisekarte');if(!menu)return;\n anchor=d.getElementById('bt-speisekarte-flow-anchor');if(anchor)return;\n \/* The zero-height marker retains the true flow position while the menu is sticky. *\/\n anchor=d.createElement('span');anchor.id='bt-speisekarte-flow-anchor';anchor.setAttribute('aria-hidden','true');\n menu.parentNode.insertBefore(anchor,menu);\n}\nif(d.readyState==='loading')d.addEventListener('DOMContentLoaded',setup,{once:true});else setup();\nvar moving=false,frame=0;\nfunction cancel(){\n if(!moving)return;\n moving=false;cancelAnimationFrame(frame);frame=0;\n w.scrollTo({top:w.scrollY,left:w.scrollX,behavior:'instant'});\n}\nw.addEventListener('wheel',cancel,{capture:true,passive:true});\nw.addEventListener('touchstart',cancel,{capture:true,passive:true});\nw.addEventListener('keydown',function(e){if(['Escape','ArrowUp','ArrowDown','PageUp','PageDown','Home','End',' '].indexOf(e.key)>-1)cancel();},true);\n\nw.addEventListener('click',function(e){\n if(e.button||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;\n var link=e.target.closest&&e.target.closest('a[href]');\n if(!link||link.hasAttribute('download')||(link.target&&link.target!=='_self'))return;\n var url;try{url=new URL(link.href,location.href);}catch(ignore){return;}\n if(url.origin!==location.origin||url.pathname!==location.pathname||url.hash!=='#speisekarte')return;\n if(!anchor)setup();if(!anchor)return;\n e.preventDefault();e.stopImmediatePropagation();cancel();\n d.documentElement.classList.remove('k-anchor-active');\n var admin=d.getElementById('wpadminbar');\n var offset=admin?Math.max(0,admin.getBoundingClientRect().bottom):0;\n var top=Math.max(0,anchor.getBoundingClientRect().top+w.scrollY-offset);\n if(location.hash!==url.hash)history.pushState(null,'',url.hash);\n moving=true;\n var from=w.scrollY,start=null,reduced=w.matchMedia('(prefers-reduced-motion:reduce)').matches;\n var duration=reduced?0:Math.min(1000,Math.max(450,Math.abs(top-from)*.5));\n function step(now){\n  if(!moving)return;\n  if(start===null)start=now;\n  var progress=duration?Math.min(1,(now-start)\/duration):1;\n  var eased=progress<.5?4*progress*progress*progress:1-Math.pow(-2*progress+2,3)\/2;\n  w.scrollTo({top:from+(top-from)*eased,left:w.scrollX,behavior:'instant'});\n  if(progress<1){frame=w.requestAnimationFrame(step);return;}\n  \/* Re-read the flow marker once after sticky\/placeholder layout has settled. *\/\n  var finalOffset=admin?Math.max(0,admin.getBoundingClientRect().bottom):0;\n  w.scrollTo({top:Math.max(0,anchor.getBoundingClientRect().top+w.scrollY-finalOffset),left:w.scrollX,behavior:'instant'});\n  moving=false;frame=0;\n }\n frame=w.requestAnimationFrame(step);\n},true);\n})(window,document);\n<\/script>\n<\/div><\/div>\r\n<div class=\"et_pb_code_1 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n@media (max-width:980px){\n  #drinks-banner{\n    padding-top:0 !important;\n    padding-bottom:0 !important;\n    margin-top:0 !important;\n    margin-bottom:0 !important;\n  }\n  #drinks-banner .et_pb_row,\n  #drinks-banner .et_pb_module{\n    padding-top:0 !important;\n    padding-bottom:0 !important;\n    margin-top:0 !important;\n    margin-bottom:0 !important;\n  }\n  #drinks-banner .et_pb_section_video_bg_wrap{\n    margin:0 !important;\n  }\n}\n<\/style>\n\n\n\n\n\n<style>\n\/* =========================================================\n   BAR TAUSEND \u00b7 GLOBAL DESKTOP WIDTH RESET\n   entfernt eine \u00e4u\u00dfere Divi-\/Boxed-Layout-Begrenzung\n   ========================================================= *\/\n\n@media (min-width:981px){\n\n  body.et_boxed_layout #page-container,\n  #page-container,\n  #et-main-area,\n  #main-content,\n  .et-l--body,\n  .et_builder_inner_content{\n    width:100% !important;\n    max-width:none !important;\n\n    margin-left:0 !important;\n    margin-right:0 !important;\n  }\n\n  \/* Nur die gro\u00dfen Hauptsektionen freigeben.\n     Die einzelnen Rows\/Karten bleiben unangetastet. *\/\n  #main-content > .et_builder_inner_content > .et_pb_section,\n  .et-l--body .et_builder_inner_content > .et_pb_section{\n    width:100% !important;\n    max-width:none !important;\n    margin-left:0 !important;\n    margin-right:0 !important;\n  }\n\n}\n<\/style>\n\n\n<\/div><\/div>\r\n<div class=\"et_pb_code_2 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n\/* =========================================================\n   BAR TAUSEND \u00b7 XL SCREEN SYSTEM v1\n   Gro\u00dfe Desktop-Monitore \/ Ultrawide \/ TV\n   Bestehender Code bleibt unangetastet\n   ========================================================= *\/\n\n\n\/* =========================================================\n   XL DESKTOP \u00b7 ab 1600px\n   ========================================================= *\/\n\n@media (min-width:1600px){\n\n  .bt-startbanner .bt-video-row .bt-video-wrap{\n    width:clamp(320px, 20vw, 560px) !important;\n    height:clamp(320px, 20vw, 560px) !important;\n    flex:0 0 clamp(320px, 20vw, 560px) !important;\n  }\n\n}\n<\/style>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<style>\n\/* =========================================================\n   BAR TAUSEND \u00b7 XL SCREEN SYSTEM\n   ABOUT \u00b7 LEFT CONTENT BLOCK\n   ========================================================= *\/\n\n@media (min-width:1600px){\n\n  #about > .et_pb_row > .et_pb_column:first-child{\n    transform-origin:left center !important;\n    transform:scale(var(--bt-about-xl-scale, 1)) !important;\n  }\n\n}\n<\/style>\n\n<script>\n(function(){\n\n  function updateAboutXL(){\n\n    const root = document.documentElement;\n    const w = window.innerWidth || 1600;\n\n    \/* Bereich:\n       1600px  = normale Desktopgr\u00f6\u00dfe\n       3200px+ = maximale XL\/TV-Gr\u00f6\u00dfe\n    *\/\n    const minWidth = 1600;\n    const maxWidth = 3200;\n\n    const minScale = 1.00;\n    const maxScale = 1.32;\n\n    const progress = Math.max(\n      0,\n      Math.min(1, (w - minWidth) \/ (maxWidth - minWidth))\n    );\n\n    const scale =\n      minScale +\n      (maxScale - minScale) * progress;\n\n    root.style.setProperty(\n      '--bt-about-xl-scale',\n      scale.toFixed(4)\n    );\n  }\n\n  updateAboutXL();\n\n  window.addEventListener(\n    'resize',\n    updateAboutXL,\n    {passive:true}\n  );\n\n})();\n<\/script>\n\n\n\n\n\n\n\n\n<style>\n\/* =========================================================\n   BAR TAUSEND \u00b7 XL SCREEN SYSTEM\n   MUSIK CAROUSEL \u00b7 5 KARTEN\n   ========================================================= *\/\n\n@media (min-width:1800px){\n\n  #musik .bt-lineup-track > .et_pb_row.lineup-row{\n    width:calc((100% - 5 * 18px) \/ 6) !important;\n    max-width:none !important;\n  }\n\n}\n<\/style>\n\n\n\n\n\n\n\n<style>\n\n\/* =========================================================\n   BAR TAUSEND \u00b7 XL SCREEN SYSTEM\n   T\u00dcR-CLAIM \u00b7 DYNAMISCHE SCHRIFTGR\u00d6SSE\n   ========================================================= *\/\n\n@media (min-width:1600px){\n\n  #banner-tuer h3{\n    font-size:clamp(26px, 1.65vw, 44px) !important;\n    line-height:1.12 !important;\n  }\n\n  #banner-tuer h4{\n    font-size:clamp(12px, .75vw, 20px) !important;\n    line-height:1.25 !important;\n    margin-top:8px !important;\n  }\n\n}\n\n<\/style><\/div><\/div>\r\n<div class=\"et_pb_code_3 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n\/* =========================================================\n   BAR TAUSEND \u00b7 HOME + \u00dcBER UNS \u00b7 SCROLL-LAYER v2\n   Start: 70 % Schwarz \u00b7 FADE_END bleibt bei 1\n========================================================= *\/\n\n#home,\n#about {\n  position: relative !important;\n}\n\n#home .bt-video-code {\n  background-color: transparent !important;\n}\n\n\/* Schwarzer Layer unter den Inhalten *\/\n#home::before,\n#about::before {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  background: #000;\n  opacity: var(--bt-home-about-opacity, 0.7);\n  pointer-events: none;\n  z-index: 4;\n  transition: none;\n  will-change: opacity;\n}\n\n\/* St\u00e4rker als die sp\u00e4tere mobile Divi-Regel mit z-index: 2 *\/\n#home.bt-startbanner > .bt-video-row {\n  z-index: 5 !important;\n}\n\n\/* Handy und Tablets mit dem vorhandenen mobilen Standbild *\/\n@media (max-width: 980px) {\n  #home.bt-startbanner {\n    background-color: #000 !important;\n  }\n\n  #home.bt-startbanner > .bt-menu-row {\n    z-index: 10 !important;\n  }\n\n  \/*\n   * Bild nicht bei jedem Wiedereintritt neu einblenden.\n   * Der Zuschnitt h\u00e4lt auch das feststehende Bild im Banner.\n   *\/\n  #home.bt-startbanner .bt-standbild-layer {\n    opacity: 1 !important;\n    transition: none !important;\n    background-color: #000;\n    -webkit-clip-path: inset(0);\n    clip-path: inset(0);\n    pointer-events: none;\n  }\n}\n<\/style>\n\n<script>\n(function () {\n  \"use strict\";\n\n  if (window.__btHomeAboutScrollLayerV2) return;\n  window.__btHomeAboutScrollLayerV2 = true;\n\n  function initScrollLayer() {\n    if (document.body.classList.contains(\"et-fb\")) return;\n\n    var home = document.getElementById(\"home\");\n    var about = document.getElementById(\"about\");\n    if (!home || !about) return;\n\n    var root = document.documentElement;\n    var ticking = false;\n    var lastOpacity = \"\";\n    var bounds = null;\n\n    \/* EINSTELLUNGEN *\/\n    var START_OPACITY = 0.7;\n    var FADE_END = 1;\n    \/* 1 = 100 % sichtbar; 0.5 = 50 % sichtbar *\/\n\n    function clamp(value, min, max) {\n      return Math.max(min, Math.min(max, value));\n    }\n\n    function updateLayer() {\n      ticking = false;\n\n      \/* Cache section geometry; scrolling changes only its viewport position. *\/\n      var scrollTop = window.scrollY || window.pageYOffset || 0;\n      if (!bounds) {\n        var measured = about.getBoundingClientRect();\n        bounds = {\n          top: measured.top + scrollTop,\n          height: measured.height,\n          viewportHeight: window.innerHeight || root.clientHeight || 1\n        };\n      }\n      var rect = {\n        top: bounds.top - scrollTop,\n        bottom: bounds.top - scrollTop + bounds.height,\n        height: bounds.height\n      };\n      var viewportHeight = bounds.viewportHeight;\n\n      var visibleHeight = Math.max(\n        0,\n        Math.min(rect.bottom, viewportHeight) -\n        Math.max(rect.top, 0)\n      );\n\n      var referenceHeight = Math.max(\n        1,\n        Math.min(rect.height, viewportHeight)\n      );\n\n      var visibleRatio = clamp(\n        visibleHeight \/ referenceHeight, 0, 1\n      );\n\n      var progress = clamp(visibleRatio \/ FADE_END, 0, 1);\n      progress = progress * progress * (3 - 2 * progress);\n\n      \/* Phone only: retain 50% black at the end; tablet\/desktop keep original fade. *\/\n      var endOpacity = window.matchMedia(\"(max-width: 767px)\").matches ? 0.5 : 0;\n      var opacity = (endOpacity + (START_OPACITY - endOpacity) * (1 - progress)).toFixed(4);\n\n      if (opacity !== lastOpacity) {\n        \/* Keep this scroll value out of the carousel and the rest of the document. *\/\n        home.style.setProperty(\"--bt-home-about-opacity\", opacity);\n        about.style.setProperty(\"--bt-home-about-opacity\", opacity);\n        lastOpacity = opacity;\n      }\n    }\n\n    function requestUpdate() {\n      if (ticking) return;\n      ticking = true;\n      window.requestAnimationFrame(updateLayer);\n    }\n\n    function requestGeometryUpdate() {\n      bounds = null;\n      requestUpdate();\n    }\n\n    updateLayer();\n\n    window.addEventListener(\"scroll\", requestUpdate, { passive: true });\n    window.addEventListener(\"resize\", requestGeometryUpdate, { passive: true });\n    window.addEventListener(\"load\", requestGeometryUpdate, { passive: true });\n    window.addEventListener(\"pageshow\", requestGeometryUpdate, { passive: true });\n\n    if (\"ResizeObserver\" in window) {\n      var geometryObserver = new ResizeObserver(requestGeometryUpdate);\n      geometryObserver.observe(home);\n      geometryObserver.observe(about);\n    }\n    if (document.fonts && document.fonts.ready) {\n      document.fonts.ready.then(requestGeometryUpdate).catch(function () {});\n    }\n\n    if (window.visualViewport) {\n      window.visualViewport.addEventListener(\n        \"resize\", requestGeometryUpdate, { passive: true }\n      );\n    }\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\n      \"DOMContentLoaded\", initScrollLayer, { once: true }\n    );\n  } else {\n    initScrollLayer();\n  }\n})();\n<\/script>\n\n<style id=\"bt-mobile-banner-stable-v3\">\n@media(max-width:980px){\n  body #page-container #home.bt-startbanner{\n    --bt-start-height:100svh;\n    height:100svh!important;min-height:100svh!important;\n  }\n  body #page-container #home.bt-startbanner > .bt-video-row{\n    position:absolute!important;inset:0!important;\n    height:100%!important;min-height:100%!important;\n    width:100%!important;max-width:100%!important;\n    margin:0!important;padding:0!important;transform:none!important;\n  }\n  body #page-container #home.bt-startbanner .bt-video-row > .et_pb_column,\n  body #page-container #home.bt-startbanner .bt-video-code,\n  body #page-container #home.bt-startbanner .bt-video-code > .et_pb_code_inner{\n    position:static!important;inset:auto!important;\n    height:100%!important;min-height:0!important;\n    width:100%!important;max-width:100%!important;\n    margin:0!important;padding:0!important;transform:none!important;\n  }\n  body #page-container #home.bt-startbanner .bt-video-wrap{\n    position:absolute!important;\n    left:50%!important;top:50%!important;\n    transform:translate(calc(-50% + var(--logo-shift-x,0px)),calc(-50% + var(--logo-shift-y,0px)))!important;\n  }\n  body #page-container #home.bt-startbanner .bt-standbild-layer img{\n    position:fixed!important;top:0!important;left:0!important;\n    width:100vw!important;height:100svh!important;\n    max-width:none!important;max-height:none!important;\n    object-fit:cover!important;object-position:center center!important;\n  }\n  body #page-container #about.bt-about-section{\n    background-image:url(\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-BG17-01-1280.webp\")!important;\n    background-attachment:fixed!important;\n    background-repeat:no-repeat!important;\n    background-size:max(100vw,150.0586166svh) auto!important;\n    background-position:center calc(50svh - max(50svh,33.3203125vw))!important;\n  }\n  body #page-container #about.bt-about-section :is(.et_parallax_bg_wrap,.et-pb-parallax-wrapper),\n  body #page-container #about.bt-about-section .bt_zoom_layer{\n    display:none!important;\n  }\n}\n<\/style>\n\n\n<style id=\"bt-hero-downrow-phone-v1\">\n\/* Claude 17.10.2026: DOWN-BUTTON-Zeile (#home > .et_pb_row_2) am Handy wie am Desktop\n   unten mittig und ohne eigene Bildschirmhoehe. Live gemessen war sie mobil relativ\n   und 823px hoch (PSI: Hauptverursacher der Layout-Verschiebung). Pfeiltext ist am\n   Handy ohnehin ausgeblendet, sichtbar aendert sich nichts. Ruecknahme: Block loeschen. *\/\n@media (max-width:767px){\n  body #page-container #home.bt-startbanner > .et_pb_row_2{\n    position:absolute!important;\n    top:auto!important;right:auto!important;bottom:0!important;left:50%!important;\n    height:auto!important;min-height:0!important;\n    transform:translateX(-50%)!important;\n  }\n}\n<\/style><\/div><\/div>\r\n<div class=\"et_pb_code_4 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><script>\n\/* V5: section links stay inside this test page, including the mobile menu. *\/\n(function(d,w){\n  if(!d.body || !d.body.classList.contains('page-id-9606')) return;\n  if(d.body.classList.contains('et-fb') || \/[?&]et_fb=1\/.test(w.location.search)) return;\n  function localise(a){\n    if(!a) return;\n    var u;\n    try{u=new URL(a.getAttribute('href'),w.location.href);}catch(e){return;}\n    if(u.origin!==w.location.origin || !\/^\\\/(?:en\\\/)?$\/.test(u.pathname) || !u.hash) return;\n    var id;\n    try{id=decodeURIComponent(u.hash.slice(1));}catch(e){return;}\n    if(!d.getElementById(id)) return;\n    a.setAttribute('href',u.hash);\n  }\n  function ready(){d.querySelectorAll('a[href]').forEach(localise);}\n  if(d.readyState==='loading')d.addEventListener('DOMContentLoaded',ready,{once:true});else ready();\n  ['pointerdown','click'].forEach(function(type){w.addEventListener(type,function(e){localise(e.target.closest&&e.target.closest('a[href]'));},true);});\n})(document,window);\n<\/script><\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_1 et_pb_row et_block_row bt-video-row\">\r\n<div class=\"et_pb_column_1 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_code_5 et_pb_code et_pb_module bt-video-code\"><div class=\"et_pb_code_inner\"><div class=\"bt-video-wrap\" aria-label=\"Bar Tausend Logo\">\n  <img\n    class=\"bt-logo-static\"\n    src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Logo-Ani-Frame-03.webp\"\n    alt=\"Bar Tausend Logo\"\n    width=\"320\"\n    height=\"320\"\n    loading=\"eager\"\n    decoding=\"async\"\n    fetchpriority=\"high\">\n\n  <img\n    class=\"bt-logo-ani\"\n    data-src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Logo-Ani-03.webp\"\n    alt=\"\"\n    aria-hidden=\"true\"\n    width=\"320\"\n    height=\"320\"\n    decoding=\"async\">\n<\/div>\n\n<style>\n\/* =========================================================\nBAR TAUSEND \u2014 LOGO LAYER v3.0\n- Startframe (33 KB, transparent) kommt sofort\n- Animation (940 KB, transparent) wird erst nach dem Laden der Seite geholt\n  und weich ueber den Startframe geblendet\n- Bei \"Bewegung reduzieren\" (Barrierefreiheit) bleibt der Startframe stehen\n========================================================= *\/\n\n\/* Show the small static logo at first paint; retain the later animated-logo crossfade. *\/\n\/* Desktop: urspr\u00fcngliche Startblende bis bt-hero-ready erhalten. *\/\nhtml body.page-id-9606:not(.et-fb) #home{\n  position:relative;\n  height:var(--bt-start-height,100svh);\n  min-height:var(--bt-start-height,100svh);\n}\nhtml body.page-id-9606 #home .bt-menu-row{\n  position:absolute;top:0;left:0;right:0;z-index:50;\n}\nhtml body.page-id-9606 #home .bt-video-row{\n  position:absolute;inset:0;width:100%;max-width:100%;height:100%;padding:0;margin:0;\n}\nhtml body.page-id-9606 #home .bt-video-row :is(.et_pb_column,.bt-video-code,.et_pb_code_inner){\n  position:relative;width:100%;height:100%;min-height:100%;padding:0;margin:0;\n}\n@keyframes btLogoFirstPaint{\n  from{opacity:.4;filter:none;}\n  to{opacity:1;filter:none;}\n}\nhtml body.page-id-9606 #home .bt-video-wrap{\n  position:absolute;\n  left:50%;top:50%;transform:translate(-50%,-50%);\n  width:320px;\n  height:320px;\n  flex:0 0 320px;\n  opacity:.4;\n  animation:btLogoFirstPaint .85s ease-out both!important;\n}\n@media(prefers-reduced-motion:reduce){\n  html body.page-id-9606 #home .bt-video-wrap{opacity:1!important;animation:none!important;}\n}\n\n.bt-video-wrap img{\n  position:absolute;\n  inset:0;\n  width:100%;\n  height:100%;\n  display:block;\n  object-fit:contain;\n}\n\n.bt-logo-static{\n  z-index:1;\n}\n\n.bt-logo-ani{\n  z-index:2;\n  opacity:0;\n  transition:opacity 1.2s ease;\n}\n\n.bt-logo-ani.is-ready{\n  opacity:1;\n}\n\n@keyframes btFadeIn{\n  from{\n    opacity:0;\n    filter:blur(6px);\n  }\n  to{\n    opacity:1;\n    filter:none;\n  }\n}\n\n\/* MOBILE *\/\n@media (max-width:980px){\n  #home{\n    position:relative !important;\n  }\n\n  #home .bt-video-wrap{\n    position:absolute !important;\n    left:50% !important;\n    top:48% !important;\n    transform:translate(-50%, -50%) !important;\n\n    width:260px !important;\n    height:260px !important;\n    flex:none !important;\n\n    z-index:50 !important;\n    pointer-events:none !important;\n\n    animation-delay:1.05s;\n  }\n}\n\n@media (max-width:390px){\n  #home .bt-video-wrap{\n    width:230px !important;\n    height:230px !important;\n    top:47% !important;\n  }\n}\n<\/style>\n\n<script>\n(function(){\n  var ani = document.querySelector('.bt-video-wrap .bt-logo-ani');\n  if(!ani) return;\n\n  \/* Barrierefreiheit: keine Animation bei \"Bewegung reduzieren\" *\/\n  if(window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n\n  var started = false;\n\n  function start(){\n    if(started) return;\n    started = true;\n    var src = ani.getAttribute('data-src');\n    if(!src) return;\n    ani.addEventListener('load', function(){\n      ani.classList.add('is-ready');\n    }, { once:true });\n    ani.setAttribute('src', src);\n  }\n\n  function later(){\n    setTimeout(start, 300);\n  }\n\n  if(document.readyState === 'complete'){\n    later();\n  } else {\n    window.addEventListener('load', later, { once:true });\n    \/* Sicherheitsnetz: spaetestens nach 8 Sekunden starten *\/\n    setTimeout(start, 8000);\n  }\n})();\n<\/script><\/div><\/div>\r\n<div class=\"et_pb_code_6 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><!-- =========================================================\n   BAR TAUSEND \u2014 LOGO HOVER + ABOUT + PLAYER PATCH v1.0\n   - Hover: soft scale + blur\n   - Klick: smooth scroll zu #about\n   - Logo: nur About-Anker; Musik im Startmenue startet den Player\n   - Patch only \/ bestehender Logo-Code bleibt\n   ========================================================= -->\n\n<style>\n\/* =========================================================\n   BT \u2014 LOGO INTERACTION PATCH\n   ========================================================= *\/\n\n.bt-video-wrap{\n  cursor:pointer;\n  pointer-events:auto !important;\n  will-change:transform, filter;\n}\n\n.bt-video-wrap img{\n  transition:\n    transform 1.15s cubic-bezier(.22,1,.36,1),\n    filter 1.15s ease,\n    opacity 1.15s ease;\n  will-change:transform, filter;\n}\n\n.bt-video-wrap:hover img{\n  transform:scale(1.055);\n  filter:blur(2.4px);\n}\n\n.bt-video-wrap:focus-visible{\n  outline:2px solid #ea0b5f;\n  outline-offset:8px;\n  border-radius:999px;\n}\n\n\/* Mobile bleibt klickbar, aber ohne Hover-Effekt *\/\n@media (max-width:980px){\n  #home .bt-video-wrap{\n    pointer-events:auto !important;\n  }\n\n  #home .bt-video-wrap:hover img{\n    transform:none;\n    filter:none;\n  }\n}\n\n\/* Accessibility *\/\n@media (prefers-reduced-motion:reduce){\n  .bt-video-wrap img{\n    transition:none !important;\n  }\n\n  .bt-video-wrap:hover img{\n    transform:none !important;\n    filter:none !important;\n  }\n}\n<\/style>\n\n<style>\n\/* =========================================================\n   BT \u2014 GLOBAL FOCUS RING CLEANUP\n   - entfernt magenta \/ browser focus rings\n   - betrifft Men\u00fc + Logo + Buttons\n   - frontend only\n   ========================================================= *\/\n\nbody:not(.et-fb) a,\nbody:not(.et-fb) button,\nbody:not(.et-fb) .bt-video-wrap,\nbody:not(.et-fb) [tabindex]{\n  -webkit-tap-highlight-color:transparent;\n}\n\nbody:not(.et-fb) a:focus,\nbody:not(.et-fb) button:focus,\nbody:not(.et-fb) .bt-video-wrap:focus,\nbody:not(.et-fb) [tabindex]:focus{\n  outline:none !important;\n  box-shadow:none !important;\n}\n\nbody:not(.et-fb) a:focus-visible,\nbody:not(.et-fb) button:focus-visible,\nbody:not(.et-fb) .bt-video-wrap:focus-visible,\nbody:not(.et-fb) [tabindex]:focus-visible{\n  outline:none !important;\n  box-shadow:none !important;\n}\n<\/style>\n\n\n\n\n\n<script>\n\/* =========================================================\n   BAR TAUSEND \u2014 LOGO TO ABOUT + START MENU MUSIC v1.2\n   ========================================================= *\/\n\n(function(){\n  \"use strict\";\n\n  if(window.__btLogoClickAboutPlayV1) return;\n  window.__btLogoClickAboutPlayV1 = true;\n\n  function getLogo(){\n    return document.querySelector(\".bt-video-wrap\");\n  }\n\n  function getPlayerButton(){\n    return document.querySelector(\"#bt-player-compact .btpc-play\");\n  }\n\n  function playerIsPlaying(){\n    var btn = getPlayerButton();\n    return !!(btn && btn.classList.contains(\"is-playing\"));\n  }\n\n  function startPlayer(){\n    if(typeof window.btPlayerPlay === \"function\"){\n      window.btPlayerPlay();\n      return;\n    }\n    var btn = getPlayerButton();\n\n    if(!btn) return;\n    if(playerIsPlaying()) return;\n\n    btn.click();\n  }\n\n  var cancelLogoScroll = null;\n  function scrollToAbout(){\n    var about = document.getElementById(\"about\");\n    if(!about){\n      window.location.hash = \"about\";\n      return;\n    }\n    if(cancelLogoScroll) cancelLogoScroll();\n    var startY = window.scrollY || window.pageYOffset || 0;\n    var startX = window.scrollX || 0;\n    var targetY = Math.max(0, startY + about.getBoundingClientRect().top);\n    var distance = targetY - startY;\n    if(window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches){\n      window.scrollTo({top:targetY,left:startX,behavior:\"instant\"});\n      return;\n    }\n    \/* Handy: nativer Scrolllauf statt JavaScript-Arbeit in jedem Einzelbild. *\/\n    if(window.matchMedia(\"(max-width: 980px)\").matches){\n      window.scrollTo({top:targetY,left:startX,behavior:\"smooth\"});\n      return;\n    }\n    var duration = Math.min(650, Math.max(380, Math.abs(distance) * .6)), started = performance.now(), frame = 0;\n    function stop(){\n      if(frame) cancelAnimationFrame(frame);\n      frame = 0;\n      window.removeEventListener(\"wheel\", stop);\n      window.removeEventListener(\"touchstart\", stop);\n      window.removeEventListener(\"pointerdown\", stop);\n      cancelLogoScroll = null;\n    }\n    function step(now){\n      var t = Math.min(1, (now - started) \/ duration);\n      \/\/ Sanfter Start und sanftes Abbremsen, ohne harten Geschwindigkeitssprung.\n      var eased = 1 - Math.pow(1 - t, 3);\n      window.scrollTo({top:startY + distance * eased,left:startX,behavior:\"instant\"});\n      if(t < 1) frame = requestAnimationFrame(step);\n      else stop();\n    }\n    cancelLogoScroll = stop;\n    window.addEventListener(\"wheel\", stop, {passive:true});\n    window.addEventListener(\"touchstart\", stop, {passive:true});\n    window.addEventListener(\"pointerdown\", stop, {passive:true});\n    frame = requestAnimationFrame(step);\n  }\n\n  function init(){\n    \/* Synchronous click preserves the browser's audio user gesture. *\/\n    document.addEventListener(\"click\", function(e){\n      var target = e.target;\n      var link = target && target.closest ? target.closest(\"#home .menu-inline a[href]\") : null;\n      if(!link || link.hash !== \"#musik\") return;\n      startPlayer();\n    }, true);\n\n    var logo = getLogo();\n\n    if(!logo) return;\n\n    logo.setAttribute(\"role\", \"button\");\n    logo.setAttribute(\"tabindex\", \"0\");\n    logo.setAttribute(\"aria-label\", \/^en\\b\/i.test(document.documentElement.lang) ? \"Scroll to About\" : \"Zum About Bereich scrollen\");\n\n   logo.addEventListener(\"click\", function(e){\n  e.preventDefault();\n\n  scrollToAbout();\n\n});\n\n    logo.addEventListener(\"keydown\", function(e){\n      if(e.key !== \"Enter\" && e.key !== \" \") return;\n\n      e.preventDefault();\n\n      scrollToAbout();\n\n    });\n  }\n\n  if(document.readyState === \"loading\"){\n    document.addEventListener(\"DOMContentLoaded\", init);\n  } else {\n    init();\n  }\n\n})();\n<\/script>\n\n<!-- V5 \u00b7 Logo-Klick: urspr\u00fcngliche Musik-Navigation aus V3, vollst\u00e4ndig im passenden Code-Modul. -->\n<script id=\"bt-mini-eq-early-logo-intent\">(function(){\n if(window.__btMiniEqIntentInstalled)return;window.__btMiniEqIntentInstalled=true;\n document.addEventListener('click',function(e){if(e.target.closest&&e.target.closest('#home .bt-video-wrap'))window.__btMiniEqLogoIntent=true;},true);\n})();<\/script>\n<style id=\"bt-mini-eq-music-navigation\">\n#bt-mini-eq-button .bt-mini-eq-nav-label{display:none}\n#bt-mini-eq-control.bt-mini-eq-navigation{display:block!important;visibility:visible!important;opacity:1!important;pointer-events:auto!important;left:var(--bt-music-dock-x,30px)!important;top:var(--bt-music-dock-y,70vh)!important;bottom:auto!important;transform:none!important}\n#bt-mini-eq-control.bt-mini-eq-navigation #bt-mini-eq-button{visibility:visible!important;opacity:1!important;width:auto!important;min-width:84px!important;height:44px!important;padding:0 18px!important;border:1px solid #ffffff38!important;border-radius:999px!important;background:rgba(0,0,0,.62)!important;-webkit-backdrop-filter:blur(16px)!important;backdrop-filter:blur(16px)!important;color:#ebebeb!important;font:400 12px\/1.2 \"Oswald\",sans-serif!important;letter-spacing:.09em!important;text-decoration:none!important;box-shadow:none!important;animation:btMusicDockIn .65s cubic-bezier(.22,1,.36,1) both}\n#bt-mini-eq-control.bt-mini-eq-navigation .bt-mini-eq-bars{display:none!important}\n#bt-mini-eq-control.bt-mini-eq-navigation .bt-mini-eq-nav-label{display:block}\n#bt-mini-eq-control.bt-mini-eq-navigation #bt-mini-eq-button:hover{background:rgba(0,0,0,.82)!important;border-color:#ea0b5f!important;color:#fff!important;box-shadow:none!important}\n#bt-mini-eq-control.bt-mini-eq-navigation #bt-mini-eq-button:focus-visible{outline:2px solid #ea0b5f!important;outline-offset:4px!important}\n#about .bt-about-music-slot{height:44px;margin-top:28px;margin-bottom:44px;pointer-events:none}\n@keyframes btMusicDockIn{from{opacity:0;translate:-18px 10px}to{opacity:1;translate:0 0}}\n@media(max-width:767px){#about{height:auto!important;min-height:100svh!important}#about .bt-about-music-slot{display:block;margin-top:28px;margin-bottom:44px}}\n@media(prefers-reduced-motion:reduce){#bt-mini-eq-control.bt-mini-eq-navigation #bt-mini-eq-button{animation:none!important}}\n\n<\/style>\n<script id=\"bt-v5-logo-music-navigation\">\n(function(){\n\"use strict\";\nif(!document.body.classList.contains(\"page-id-9606\")||\/[?&]et_fb=1\/.test(location.search))return;\nif(window.__btMiniEqNavigationV3)return;window.__btMiniEqNavigationV3=true;\nfunction init(){\nif(document.body.classList.contains('et-fb'))return;\nvar control=document.getElementById('bt-mini-eq-control'),button=document.getElementById('bt-mini-eq-button'),about=document.getElementById('about'),music=document.getElementById('musik');\nif(!control||!button||!about||!music)return;\nvar armed=Boolean(window.__btMiniEqLogoIntent),entered=false,frame=0,en=\/^en\\b\/i.test(document.documentElement.lang);\nvar label=document.createElement('span');label.className='bt-mini-eq-nav-label';label.textContent=en?'MUSIC':'MUSIK';label.setAttribute('aria-hidden','true');button.appendChild(label);\nvar column=about.querySelector('.et_pb_column'),slot=document.createElement('div');slot.className='bt-about-music-slot';slot.setAttribute('aria-hidden','true');column.appendChild(slot);\nvar copy=Array.from(column.querySelectorAll('.et_pb_text')).find(function(e){return e.textContent.length>220;});\nfunction update(){\n frame=0;\n var inAbout=false;\n if(armed){var rect=about.getBoundingClientRect();inAbout=rect.top<innerHeight*.65&&rect.bottom>innerHeight*.25;}\n if(armed&&entered&&!inAbout){armed=false;entered=false;}\n var nav=armed&&inAbout;\n if(nav){\n  entered=true;\n  var sr=slot.getBoundingClientRect(),target=copy&&copy.querySelector('.et_pb_text_inner'),tr=target?target.getBoundingClientRect():sr;\n  control.style.setProperty('--bt-music-dock-x',Math.round(tr.left)+'px');\n  control.style.setProperty('--bt-music-dock-y',Math.round(sr.top)+'px');\n }\n if(control.classList.contains('bt-mini-eq-navigation')!==nav){control.classList.toggle('bt-mini-eq-navigation',nav);document.dispatchEvent(new Event('bt:mini-eq-navigation-change'));}\n if(nav){\n  var title=en?'Go to Music':'Zum Musikbereich';\n  if(button.getAttribute('aria-label')!==title)button.setAttribute('aria-label',title);\n  if(button.hasAttribute('aria-pressed'))button.removeAttribute('aria-pressed');\n }else{\n  var play=document.querySelector('#bt-player-compact .btpc-play'),playing=!!(play&&play.classList.contains('is-playing'));\n  var title2=en?(playing?'Pause music':'Play music'):(playing?'Musik pausieren':'Musik abspielen');\n  if(button.getAttribute('aria-label')!==title2)button.setAttribute('aria-label',title2);\n  if(button.getAttribute('aria-pressed')!==String(playing))button.setAttribute('aria-pressed',String(playing));\n }\n}\nfunction schedule(){if(!frame)frame=requestAnimationFrame(update);}\nfunction arm(){armed=true;entered=false;schedule();}\ndocument.addEventListener('click',function(event){\n var target=event.target.closest?event.target:null;if(!target)return;\n if(target.closest('#home .bt-video-wrap')){arm();return;}\n if(!target.closest('#bt-mini-eq-button')||!control.classList.contains('bt-mini-eq-navigation'))return;\n event.preventDefault();event.stopImmediatePropagation();\n \/* Start in this user gesture; keep the pill while it fades into the music section. *\/\n var playerButton=document.querySelector('#bt-player-compact .btpc-play');\n if(typeof window.btPlayerPlay==='function')window.btPlayerPlay();\n else if(playerButton&&!playerButton.classList.contains('is-playing'))playerButton.click();\n music.scrollIntoView({behavior:matchMedia('(prefers-reduced-motion: reduce)').matches?'instant':'smooth',block:'start'});\n history.replaceState(null,'','#musik');if(event.detail===0){if(!music.hasAttribute('tabindex'))music.setAttribute('tabindex','-1');music.focus({preventScroll:true});}else{button.blur();}schedule();\n},true);\nwindow.addEventListener('keydown',function(event){\n var target=event.target.closest?event.target:null;if(!target)return;\n var logo=target.closest('#home .bt-video-wrap');\n if(logo&&(event.key==='Enter'||event.key===' '))arm();\n if((event.key===' '||event.key==='Enter')&&(logo||(target.closest('#bt-mini-eq-button')&&control.classList.contains('bt-mini-eq-navigation')))){\n  event.preventDefault();event.stopImmediatePropagation();(logo||button).click();\n }\n},true);\nwindow.addEventListener('scroll',function(){if(armed||control.classList.contains('bt-mini-eq-navigation'))schedule();},{passive:true});window.addEventListener('resize',schedule,{passive:true});\nvar observer=new MutationObserver(schedule);observer.observe(button,{attributes:true,attributeFilter:['aria-label','aria-pressed']});\nvar playBtnRef=document.querySelector('#bt-player-compact .btpc-play');\nif(playBtnRef)new MutationObserver(schedule).observe(playBtnRef,{attributes:true,attributeFilter:['class']});\nif(window.ResizeObserver){new ResizeObserver(schedule).observe(column);}\nif(document.fonts&&document.fonts.ready)document.fonts.ready.then(schedule);\nupdate();\n\n}\nif(document.readyState===\"loading\")document.addEventListener(\"DOMContentLoaded\",init,{once:true});else init();\n})();\n<\/script><\/div><\/div>\r\n<div class=\"et_pb_code_7 et_pb_code et_pb_module bt-news-ticker-module\"><div class=\"et_pb_code_inner\"><!-- =========================================================\n   BT \u2014 WEEKLY LINEUP TICKER v19.6\n\n   SONNTAG\n   - kein Ticker (au\u00dfer 00:00 bis 02:00 = Samstags-Gig)\n\n   MONTAG \/ DIENSTAG ab 10:00\n   - THIS WEDNESDAY\n   - NAME\n   - VERANSTALTUNG FROM ZEIT\n   - CHECK LINEUP\n   - 1 Durchgang\n\n   MITTWOCH \/ DONNERSTAG \/ FREITAG \/ SAMSTAG\n   - 10:00 bis Gigbeginn:\n     TONIGHT \/ NAME \/ VERANSTALTUNG FROM ZEIT\n   - Gigbeginn bis 02:00 (auch nach Mitternacht):\n     NOW PLAYING \/ NAME\n   - 2 Durchg\u00e4nge\n   - danach CHECK LINEUP\n\n   BLOCKIERT\n   - Closed Event\n   - Bar Night\n\n   v19.3\n   - Fix: NOW PLAYING l\u00e4uft nach Mitternacht bis 02:00 weiter\n   - Code ohne Backslashes (Divi-sicher)\n\n   Animation + Mobile + I-Patch bleiben erhalten\n   ========================================================= -->\n\n<a id=\"bt-tonight-ticker-v19\"\n   class=\"notranslate\"\n   translate=\"no\"\n   href=\"#musik\"\n   aria-label=\"Zum Lineup springen\"><\/a>\n\n<style>\n#bt-tonight-ticker-v10,\n#bt-tonight-ticker-v11,\n#bt-tonight-ticker-v12,\n#bt-tonight-ticker-v13,\n#bt-tonight-ticker-v14,\n#bt-tonight-ticker-v15,\n#bt-tonight-ticker-v16,\n#bt-tonight-ticker-v17,\n#bt-tonight-ticker-v18{\n  display:none !important;\n  visibility:hidden !important;\n  opacity:0 !important;\n  pointer-events:none !important;\n}\n\n#bt-tonight-ticker-v19{\n  position:absolute !important;\n  left:50% !important;\n  transform:translateX(-50%) !important;\n\n  width:100vw !important;\n  height:58px !important;\n  z-index:99999 !important;\n\n  display:none;\n  align-items:center !important;\n  justify-content:center !important;\n\n  opacity:0;\n  overflow:visible !important;\n\n  cursor:pointer !important;\n  pointer-events:auto !important;\n\n  text-decoration:none !important;\n  -webkit-tap-highlight-color:transparent !important;\n\n  transition:opacity 1.2s ease !important;\n}\n\n#bt-tonight-ticker-v19:focus,\n#bt-tonight-ticker-v19:active{\n  outline:none !important;\n  box-shadow:none !important;\n}\n\n#bt-tonight-ticker-v19 .bt-board{\n  display:flex !important;\n  align-items:center !important;\n  justify-content:center !important;\n  gap:.70em !important;\n}\n\n#bt-tonight-ticker-v19 .bt-word-part{\n  display:inline-flex !important;\n  align-items:center !important;\n  justify-content:center !important;\n\n  white-space:nowrap !important;\n  gap:.30em !important;\n}\n\n#bt-tonight-ticker-v19 .bt-word-part.is-space-word{\n  width:.25em !important;\n  min-width:.25em !important;\n  gap:0 !important;\n}\n\n#bt-tonight-ticker-v19 .bt-slot{\n  display:inline-flex !important;\n  align-items:center !important;\n  justify-content:center !important;\n\n  width:1ch !important;\n  min-width:1ch !important;\n  max-width:1ch !important;\n\n  color:#fff !important;\n\n  font-size:24px !important;\n  line-height:1 !important;\n  letter-spacing:0 !important;\n\n  text-transform:uppercase !important;\n  white-space:pre !important;\n\n  opacity:.96;\n  transform:translateY(0);\n\n  transition:\n    opacity .38s cubic-bezier(.22,.61,.36,1),\n    transform .38s cubic-bezier(.22,.61,.36,1),\n    color .75s ease;\n}\n\n#bt-tonight-ticker-v19 .bt-slot.is-empty{\n  opacity:0;\n}\n\n#bt-tonight-ticker-v19.is-out .bt-slot{\n  opacity:0;\n  transform:translateY(-6px);\n}\n\n#bt-tonight-ticker-v19.is-final-link .bt-slot{\n  color:#ea0b5f !important;\n}\n\n#bt-tonight-ticker-v19.is-final-link:hover .bt-slot{\n  color:#f7f5f0 !important;\n}\n\n@media(max-width:767px){\n\n  #bt-tonight-ticker-v19{\n    width:92vw !important;\n    height:auto !important;\n    min-height:72px !important;\n\n    left:50% !important;\n    transform:translateX(-50%) !important;\n\n    align-items:flex-start !important;\n  }\n\n  #bt-tonight-ticker-v19 .bt-board{\n    display:flex !important;\n    flex-wrap:wrap !important;\n\n    width:92vw !important;\n    max-width:92vw !important;\n\n    justify-content:center !important;\n    align-items:center !important;\n\n    column-gap:.55em !important;\n    row-gap:.45em !important;\n\n    margin:0 auto !important;\n  }\n\n  #bt-tonight-ticker-v19 .bt-word-part{\n    display:inline-flex !important;\n    white-space:nowrap !important;\n    gap:.20em !important;\n  }\n\n  #bt-tonight-ticker-v19 .bt-word-part.is-space-word{\n    display:none !important;\n    width:0 !important;\n    min-width:0 !important;\n    gap:0 !important;\n  }\n\n  #bt-tonight-ticker-v19 .bt-slot{\n    font-size:16px !important;\n    line-height:1.25 !important;\n    letter-spacing:0 !important;\n  }\n}\n<\/style>\n\n<script>\n(function(){\n  \/* Keep TranslatePress editing free of animated text mutations. *\/\n  if(\/[?&]trp-(?:edit|string)-translation(?:=|&|$)\/i.test(window.location.search)) return;\n\n\n  if(document.body.classList.contains(\"et-fb\")) return;\n  if(window.__btWeeklyTickerV19) return;\n\n  window.__btWeeklyTickerV19 = true;\n\n  [\n    \"__btTonightTickerAutoV10\",\n    \"__btTonightTickerAutoV102\",\n    \"__btTonightTickerAutoV103\",\n    \"__btTonightTickerAutoV104\",\n    \"__btTonightTickerAutoV105\",\n    \"__btTonightTickerAutoV106\",\n    \"__btTonightTickerAutoV107\",\n    \"__btTonightTickerAutoCleanV111\",\n    \"__btTonightTickerV12\",\n    \"__btTonightTickerV13\",\n    \"__btTonightTickerV14\",\n    \"__btTonightTickerV15\",\n    \"__btTonightTickerV161\",\n    \"__btTonightTickerV162\",\n    \"__btTonightTickerV17\",\n    \"__btTonightTickerV18\",\n    \"__btTonightTickerV183Clean\",\n    \"__btTonightTickerV184Clean\"\n  ].forEach(function(key){\n    window[key] = true;\n  });\n\n  document.querySelectorAll(\n    \"#bt-tonight-ticker-v10,\" +\n    \"#bt-tonight-ticker-v11,\" +\n    \"#bt-tonight-ticker-v12,\" +\n    \"#bt-tonight-ticker-v13,\" +\n    \"#bt-tonight-ticker-v14,\" +\n    \"#bt-tonight-ticker-v15,\" +\n    \"#bt-tonight-ticker-v16,\" +\n    \"#bt-tonight-ticker-v17,\" +\n    \"#bt-tonight-ticker-v18\"\n  ).forEach(function(element){\n    element.remove();\n  });\n\n  var ticker =\n    document.getElementById(\"bt-tonight-ticker-v19\");\n\n  var logo =\n    document.querySelector(\".bt-video-wrap\");\n\n  var hero =\n    document.querySelector(\"#home\") ||\n    document.querySelector(\"#start\");\n\n  if(!ticker || !logo || !hero) return;\n\n  hero.style.position = \"relative\";\n  hero.style.overflow = \"visible\";\n\n  if(ticker.parentNode !== hero){\n    hero.appendChild(ticker);\n  }\n\n  var finalWord = \"CHECK LINEUP\";\n  var timers = [];\n\n  \/* Gig-Abend endet um 02:00 am Folgetag *\/\n  var SHOW_END_HOUR = 2;\n\n  \/* Hilfszeichen ohne Backslashes (Divi-sicher) *\/\n  var NBSP = String.fromCharCode(160);\n\n  var WS_RE = new RegExp(\n    \"[\" + String.fromCharCode(9, 10, 11, 12, 13, 32, 160) + \"]+\",\n    \"g\"\n  );\n\n  var LINEBREAK_RE = new RegExp(\n    \"[\" + String.fromCharCode(10, 13) + \"]+\"\n  );\n\n  var DATE_RE =\n    \/(^|[^0-9])([0-9]{1,2})[.]([0-9]{1,2})[.]\/;\n\n  function wait(ms){\n    return new Promise(function(resolve){\n      var timer = setTimeout(resolve, ms);\n      timers.push(timer);\n    });\n  }\n\n  function clearTimers(){\n    timers.forEach(function(timer){\n      clearTimeout(timer);\n    });\n\n    timers = [];\n  }\n\n  function clean(value){\n    return String(value || \"\")\n      .replace(WS_RE, \" \")\n      .trim();\n  }\n\n  function sameCalendarDay(dateA, dateB){\n    return (\n      dateA.getFullYear() === dateB.getFullYear() &&\n      dateA.getMonth() === dateB.getMonth() &&\n      dateA.getDate() === dateB.getDate()\n    );\n  }\n\n  function getBerlinNow(){\n    var values = {};\n    new Intl.DateTimeFormat(\"en-GB\", {\n      timeZone:\"Europe\/Berlin\",\n      year:\"numeric\", month:\"2-digit\", day:\"2-digit\",\n      hour:\"2-digit\", minute:\"2-digit\", second:\"2-digit\", hourCycle:\"h23\"\n    }).formatToParts(new Date()).forEach(function(part){\n      values[part.type] = part.value;\n    });\n    return new Date(\n      Number(values.year), Number(values.month) - 1, Number(values.day),\n      Number(values.hour), Number(values.minute), Number(values.second)\n    );\n  }\n\n  function parseDateFromText(text){\n    var match = clean(text).match(DATE_RE);\n\n    if(!match) return null;\n\n    var now = getBerlinNow();\n\n    var day = parseInt(match[2], 10);\n    var month = parseInt(match[3], 10) - 1;\n    var year = now.getFullYear();\n\n    var date = new Date(\n      year,\n      month,\n      day,\n      0,\n      0,\n      0,\n      0\n    );\n\n    var sixMonthsAgo = new Date(now.getTime());\n    sixMonthsAgo.setMonth(sixMonthsAgo.getMonth() - 6);\n\n    if(date < sixMonthsAgo){\n      date.setFullYear(year + 1);\n    }\n\n    return date;\n  }\n\n  function parseTimeFromText(text){\n    var timeRe =\n      \/([0-9]{1,2})(?::([0-9]{2}))? *(H|UHR|AM|PM)(?![A-Z0-9])\/ig;\n\n    var matches = Array.from(\n      clean(text).matchAll(timeRe)\n    );\n\n    if(!matches.length) return null;\n\n    var match = matches[0];\n\n    var hour = parseInt(match[1], 10);\n    var minute = match[2]\n      ? parseInt(match[2], 10)\n      : 0;\n    var timeType = match[3].toUpperCase();\n\n    if(timeType === \"PM\" && hour < 12){\n      hour += 12;\n    }\n\n    if(timeType === \"AM\" && hour === 12){\n      hour = 0;\n    }\n\n    if(hour > 24 || minute > 59 || (hour === 24 && minute !== 0)) return null;\n    var clockHour = hour === 24 ? 0 : hour;\n    var displayHour = clockHour % 12 || 12;\n    var meridiem = clockHour < 12 ? \"AM\" : \"PM\";\n\n    return {\n      hour:hour,\n      minute:minute,\n      label:\n        displayHour +\n        (\n          minute\n            ? \":\" + String(minute).padStart(2, \"0\")\n            : \"\"\n        ) +\n        \" \" + meridiem\n    };\n  }\n\n  function isBlockedCard(text){\n    return \/closed *event|bar *night\/i.test(\n      clean(text)\n    );\n  }\n\n  function getLineupCards(){\n    var musik = document.querySelector(\"#musik\");\n\n    if(!musik) return [];\n\n    var cards = Array.from(\n      musik.querySelectorAll(\n        \".bt-lineup-track .et_pb_row.lineup-row,\" +\n        \".et_pb_row.lineup-row\"\n      )\n    );\n\n    return cards.filter(function(card, index, array){\n      return array.indexOf(card) === index;\n    });\n  }\n\n  function getCardData(card){\n    var rawText =\n      card.innerText ||\n      card.textContent ||\n      \"\";\n\n    var text = clean(rawText);\n\n    if(isBlockedCard(text)){\n      return null;\n    }\n\n    \/* The Lineup schedule heading is the sole start-time source. *\/\n    var schedule = card.querySelector(\"h3\");\n    if(!schedule) return null;\n    var scheduleText = clean(schedule.textContent);\n    var date = parseDateFromText(scheduleText);\n    var time = parseTimeFromText(scheduleText);\n    if(!date || !time) return null;\n\n    var headings = Array.from(\n      card.querySelectorAll(\"h1,h2,h3,h4,h5,h6\")\n    )\n      .map(function(element){\n        return clean(element.textContent);\n      })\n      .filter(Boolean);\n\n    var dateIndex = headings.findIndex(function(value){\n      return DATE_RE.test(value);\n    });\n\n    var eventName = \"\";\n    var artistName = \"\";\n\n    if(dateIndex > -1){\n      eventName =\n        headings[dateIndex - 1] || \"\";\n\n      artistName =\n        headings[dateIndex + 1] || \"\";\n    }\n\n    if(!eventName || !artistName){\n      var lines = String(rawText)\n        .split(LINEBREAK_RE)\n        .map(clean)\n        .filter(Boolean);\n\n      var dateLineIndex = lines.findIndex(function(value){\n        return DATE_RE.test(value);\n      });\n\n      if(dateLineIndex > -1){\n        eventName =\n          eventName ||\n          lines[dateLineIndex - 1] ||\n          \"\";\n\n        artistName =\n          artistName ||\n          lines[dateLineIndex + 1] ||\n          \"\";\n      }\n    }\n\n    if(\n      !eventName ||\n      !artistName ||\n      isBlockedCard(eventName) ||\n      isBlockedCard(artistName)\n    ){\n      return null;\n    }\n\n    return {\n      card:card,\n      date:date,\n      time:time,\n      eventName:eventName,\n      artistName:artistName\n    };\n  }\n\n  function getAllEvents(){\n    return getLineupCards()\n      .map(getCardData)\n      .filter(Boolean)\n      .sort(function(a, b){\n        return a.date - b.date;\n      });\n  }\n\n  function getNextWednesdayDate(now){\n    var wednesday = new Date(now.getTime());\n\n    var daysUntilWednesday =\n      (3 - wednesday.getDay() + 7) % 7;\n\n    wednesday.setDate(\n      wednesday.getDate() + daysUntilWednesday\n    );\n\n    wednesday.setHours(0, 0, 0, 0);\n\n    return wednesday;\n  }\n\n  function findEventForDate(events, targetDate){\n    for(var index = 0; index < events.length; index++){\n      if(sameCalendarDay(events[index].date, targetDate)){\n        return events[index];\n      }\n    }\n\n    return null;\n  }\n\n  function getTodayEvent(events, now){\n    return findEventForDate(events, now);\n  }\n\n  \/*\n   * NACH MITTERNACHT (00:00 bis 02:00)\n   * Gig vom Vorabend (Mi \/ Do \/ Fr \/ Sa) l\u00e4uft noch\n   *\/\n  function getAfterMidnightPlan(events, now){\n    if(now.getHours() >= SHOW_END_HOUR){\n      return null;\n    }\n\n    var yesterday = new Date(now.getTime());\n\n    yesterday.setDate(\n      yesterday.getDate() - 1\n    );\n\n    yesterday.setHours(0, 0, 0, 0);\n\n    var yesterdayWeekday = yesterday.getDay();\n\n    if(\n      yesterdayWeekday !== 3 &&\n      yesterdayWeekday !== 4 &&\n      yesterdayWeekday !== 5 &&\n      yesterdayWeekday !== 6\n    ){\n      return null;\n    }\n\n    var lateEvent =\n      findEventForDate(events, yesterday);\n\n    if(!lateEvent){\n      return null;\n    }\n\n    return {\n      words:[\n        \"NOW PLAYING\",\n        lateEvent.artistName\n      ],\n      rounds:2\n    };\n  }\n\n  function getTickerPlan(){\n    var now = getBerlinNow();\n    var weekday = now.getDay();\n    var hour = now.getHours();\n\n    var events = getAllEvents();\n\n    if(!events.length){\n      return null;\n    }\n\n    \/* 00:00 bis 02:00 \u2013 Gig vom Vorabend *\/\n    var latePlan =\n      getAfterMidnightPlan(events, now);\n\n    if(latePlan){\n      return latePlan;\n    }\n\n    \/* Sonntag *\/\n    if(weekday === 0){\n      return null;\n    }\n\n    \/* Vor 10 Uhr *\/\n    if(hour < 10){\n      return null;\n    }\n\n    \/*\n     * MONTAG + DIENSTAG\n     * kommenden Mittwoch ank\u00fcndigen\n     *\/\n    if(\n      weekday === 1 ||\n      weekday === 2\n    ){\n      var wednesdayDate =\n        getNextWednesdayDate(now);\n\n      var wednesdayEvent =\n        findEventForDate(\n          events,\n          wednesdayDate\n        );\n\n      if(!wednesdayEvent){\n        return null;\n      }\n\n      return {\n        words:[\n          \"THIS WEDNESDAY\",\n          wednesdayEvent.artistName,\n          wednesdayEvent.eventName +\n            \" FROM \" +\n            wednesdayEvent.time.label\n        ],\n        rounds:1\n      };\n    }\n\n    \/*\n     * MITTWOCH \/ DONNERSTAG \/ FREITAG \/ SAMSTAG\n     *\/\n    if(\n      weekday === 3 ||\n      weekday === 4 ||\n      weekday === 5 ||\n      weekday === 6\n    ){\n      var todayEvent =\n        getTodayEvent(events, now);\n\n      if(!todayEvent){\n        return null;\n      }\n\n      var gigStart =\n        new Date(todayEvent.date.getTime());\n\n      gigStart.setHours(\n        todayEvent.time.hour,\n        todayEvent.time.minute,\n        0,\n        0\n      );\n\n      if(now >= gigStart){\n        return {\n          words:[\n            \"NOW PLAYING\",\n            todayEvent.artistName\n          ],\n          rounds:2\n        };\n      }\n\n      return {\n        words:[\n          \"TONIGHT\",\n          todayEvent.artistName,\n          todayEvent.eventName +\n            \" FROM \" +\n            todayEvent.time.label\n        ],\n        rounds:2\n      };\n    }\n\n    return null;\n  }\n\n  function randChar(){\n    var pool =\n      \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n\n    return pool.charAt(\n      Math.floor(Math.random() * pool.length)\n    );\n  }\n\n  function makeBoard(text){\n    ticker.innerHTML = \"\";\n\n    var board =\n      document.createElement(\"span\");\n\n    board.className =\n      \"bt-board notranslate\";\n\n    board.setAttribute(\n      \"translate\",\n      \"no\"\n    );\n\n    \/* Keep the full time phrase together when the mobile line wraps. *\/\n    var groupedText = String(text).replace(\n      \/\\bFROM +[0-9]{1,2}(?::[0-9]{2})? +(AM|PM|UHR|H)\\b\/gi,\n      function(timePhrase){ return timePhrase.replace(\/ +\/g, NBSP); }\n    );\n    var parts = groupedText.split(\/( +)\/);\n\n    parts.forEach(function(part){\n      if(part === \"\") return;\n\n      var word =\n        document.createElement(\"span\");\n\n      word.className =\n        \"bt-word-part notranslate\";\n\n      word.setAttribute(\n        \"translate\",\n        \"no\"\n      );\n\n      if(\/^ +$\/.test(part)){\n        word.classList.add(\n          \"is-space-word\"\n        );\n      }\n\n      for(\n        var index = 0;\n        index < part.length;\n        index++\n      ){\n        var slot =\n          document.createElement(\"span\");\n\n        slot.className =\n          \"bt-slot is-empty notranslate\";\n\n        slot.setAttribute(\n          \"translate\",\n          \"no\"\n        );\n\n        slot.dataset.target =\n          part.charAt(index);\n\n        slot.textContent =\n          NBSP;\n\n        word.appendChild(slot);\n      }\n\n      board.appendChild(word);\n    });\n\n    ticker.appendChild(board);\n\n    return Array.from(\n      board.querySelectorAll(\".bt-slot\")\n    );\n  }\n\n  async function showText(text){\n    ticker.classList.remove(\"is-out\");\n\n    var slots = makeBoard(text);\n\n    slots.forEach(function(slot, index){\n      var target =\n        slot.dataset.target || \"\";\n\n      setTimeout(function(){\n\n        if(target === \" \" || target === NBSP){\n          slot.textContent = NBSP;\n          slot.classList.remove(\"is-empty\");\n          return;\n        }\n\n        slot.classList.remove(\"is-empty\");\n\n        var count = 0;\n        var flips = 5;\n\n        var interval =\n          setInterval(function(){\n\n            slot.textContent =\n              count >= flips\n                ? target\n                : randChar();\n\n            count++;\n\n            if(count > flips){\n              clearInterval(interval);\n              slot.textContent = target;\n            }\n\n          }, 45);\n\n      }, 25 + index * 26);\n    });\n\n    await wait(\n      900 + String(text).length * 26\n    );\n  }\n\n  async function hideText(){\n    ticker.classList.add(\"is-out\");\n\n    await wait(520);\n\n    ticker.innerHTML = \"\";\n    ticker.classList.remove(\"is-out\");\n  }\n\n  function placeTicker(){\n    var logoRect =\n      logo.getBoundingClientRect();\n\n    var heroRect =\n      hero.getBoundingClientRect();\n\n    ticker.style.top =\n      (\n        logoRect.bottom -\n        heroRect.top +\n        68\n      ) + \"px\";\n  }\n\n  async function run(){\n    clearTimers();\n\n    var plan = getTickerPlan();\n\n    if(\n      !plan ||\n      !plan.words ||\n      !plan.words.length\n    ){\n      ticker.style.display = \"none\";\n      ticker.style.opacity = \"0\";\n      ticker.style.pointerEvents = \"none\";\n      return;\n    }\n\n    var sequence = [];\n\n    for(\n      var round = 0;\n      round < plan.rounds;\n      round++\n    ){\n      sequence =\n        sequence.concat(plan.words);\n    }\n\n    ticker.style.display = \"flex\";\n    ticker.style.opacity = \"0\";\n    ticker.style.pointerEvents = \"auto\";\n\n    ticker.classList.remove(\n      \"is-final-link\"\n    );\n\n    placeTicker();\n\n    await wait(3000);\n\n    ticker.style.opacity = \"1\";\n\n    await wait(450);\n\n    for(\n      var index = 0;\n      index < sequence.length;\n      index++\n    ){\n      await showText(sequence[index]);\n      await wait(1700);\n      await hideText();\n    }\n\n    ticker.classList.add(\n      \"is-final-link\"\n    );\n\n    await showText(finalWord);\n    await wait(3000);\n\n    ticker.style.opacity = \"0\";\n    ticker.style.pointerEvents = \"none\";\n\n    await wait(700);\n\n    ticker.style.display = \"none\";\n  }\n\n  ticker.addEventListener(\n    \"click\",\n    function(event){\n\n      var target =\n        document.querySelector(\"#musik\");\n\n      if(!target) return;\n\n      event.preventDefault();\n\n      target.scrollIntoView({\n        behavior:\"smooth\",\n        block:\"start\"\n      });\n    }\n  );\n\n  if(document.readyState === \"loading\"){\n    document.addEventListener(\n      \"DOMContentLoaded\",\n      run,\n      {once:true}\n    );\n  }else{\n    run();\n  }\n\n  window.addEventListener(\n    \"resize\",\n    placeTicker,\n    {passive:true}\n  );\n\n})();\n<\/script>\n\n\n<!-- =========================================================\n   BT \u2014 TICKER I-SPACING PATCH v1.0\n   ========================================================= -->\n\n<style>\n#bt-tonight-ticker-v19 .bt-slot.bt-char-i{\n  margin-left:-4px !important;\n  margin-right:-4px !important;\n}\n\n#bt-tonight-ticker-v19 .bt-slot.bt-char-i.bt-i-start{\n  margin-left:0 !important;\n  margin-right:-4px !important;\n}\n\n#bt-tonight-ticker-v19 .bt-slot.bt-char-i.bt-i-end{\n  margin-left:-4px !important;\n  margin-right:0 !important;\n}\n\n#bt-tonight-ticker-v19 .bt-slot.bt-char-i.bt-i-start.bt-i-end{\n  margin-left:0 !important;\n  margin-right:0 !important;\n}\n<\/style>\n\n<script>\n(function(){\n  \/* Keep TranslatePress editing free of animated text mutations. *\/\n  if(\/[?&]trp-(?:edit|string)-translation(?:=|&|$)\/i.test(window.location.search)) return;\n\n\n  if(window.__btTickerISpacingPatchV1) return;\n  window.__btTickerISpacingPatchV1 = true;\n\n  function applyIPatch(){\n\n    var ticker =\n      document.getElementById(\"bt-tonight-ticker-v19\");\n\n    if(!ticker) return;\n\n    var slots = Array.from(\n      ticker.querySelectorAll(\".bt-slot\")\n    );\n\n    if(!slots.length) return;\n\n    slots.forEach(function(slot){\n      slot.classList.remove(\n        \"bt-char-i\",\n        \"bt-i-start\",\n        \"bt-i-end\"\n      );\n    });\n\n    var visibleSlots = slots.filter(function(slot){\n      var target =\n        slot.dataset.target ||\n        slot.textContent ||\n        \"\";\n\n      return String(target).trim() !== \"\";\n    });\n\n    if(!visibleSlots.length) return;\n\n    var firstSlot = visibleSlots[0];\n    var lastSlot =\n      visibleSlots[visibleSlots.length - 1];\n\n    visibleSlots.forEach(function(slot){\n\n      var target =\n        slot.dataset.target ||\n        slot.textContent ||\n        \"\";\n\n      if(String(target).toUpperCase() !== \"I\"){\n        return;\n      }\n\n      slot.classList.add(\"bt-char-i\");\n\n      if(slot === firstSlot){\n        slot.classList.add(\"bt-i-start\");\n      }\n\n      if(slot === lastSlot){\n        slot.classList.add(\"bt-i-end\");\n      }\n\n    });\n  }\n\n  function startObserver(){\n\n    var ticker =\n      document.getElementById(\"bt-tonight-ticker-v19\");\n\n    if(!ticker){\n      setTimeout(startObserver, 500);\n      return;\n    }\n\n    applyIPatch();\n\n    var observer = new MutationObserver(function(){\n      requestAnimationFrame(applyIPatch);\n    });\n\n    observer.observe(ticker, {\n      childList:true,\n      subtree:true,\n      characterData:true\n    });\n  }\n\n  if(document.readyState === \"loading\"){\n    document.addEventListener(\n      \"DOMContentLoaded\",\n      startObserver,\n      {once:true}\n    );\n  }else{\n    startObserver();\n  }\n\n})();\n<\/script><\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_2 et_pb_row et_block_row\">\r\n<div class=\"et_pb_column_2 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_1 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"down-button-1\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\"><a href=\"https:\/\/tausendberlin.com\/#about\">\u25bc<\/a><\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_code_8 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n\/* =========================================================\n   BAR TAUSEND \u2014 DOWN BUTTON DELAY REVEAL\n   - erscheint nach 4s weich\n   - bleibt 4s sichtbar\n   - verschwindet danach elegant\n   ========================================================= *\/\n\n#down-button-1{\n  opacity:0;\n  transform:translateY(20px);\n\n  animation:\n    btDownFadeIn 1.5s ease forwards,\n    btDownFadeOut 1.5s ease forwards;\n\n  animation-delay:\n    4s,\n    8s;\n}\n\n@keyframes btDownFadeIn{\n  from{\n    opacity:0;\n    transform:translateY(20px);\n  }\n  to{\n    opacity:1;\n    transform:translateY(0);\n  }\n}\n\n@keyframes btDownFadeOut{\n  from{\n    opacity:1;\n    transform:translateY(0);\n  }\n  to{\n    opacity:0;\n    transform:translateY(20px);\n    pointer-events:none;\n  }\n}\n<\/style><\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_1 et_pb_section et_section_regular et_block_section et_pb_section_parallax bt-about-section\" id=\"about\"><span class=\"et-pb-parallax-wrapper\"><span class=\"et-pb-parallax-background et-pb-parallax-background--css et-pb-parallax-background-module--divi-section-1 et_parallax_bg_phone_exist\" style=\"background-image:url(https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-BG17-1.webp)\"><\/span><\/span><span class=\"et-pb-parallax-wrapper\"><span class=\"et-pb-parallax-background et-pb-parallax-background--css et-pb-parallax-background_phone et-pb-parallax-background_phone-module--divi-section-1\" style=\"background-image:url(https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-BG17-1.webp)\"><\/span><\/span>\r\n<div class=\"et_pb_row_3 et_pb_row et_block_row\">\r\n<div class=\"et_pb_column_3 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_2 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h1>Bar TAUSEND<\/h1>\n<\/div><\/div>\r\n<div class=\"et_pb_text_3 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module finest-font\"><div class=\"et_pb_text_inner\" data-et-mv-hidden-tablet=\"true\" data-et-mv-hidden-phone=\"true\"><h2 class=\"finest-font\" style=\"font-size: 39px!important;\">Berlin\u2019s finest Drinks &amp; Music<\/h2>\n<\/div><\/div>\r\n<div class=\"et_pb_code_9 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><!-- =========================================================\n     BAR TAUSEND \u00b7 HANDSCHRIFT \u201eBerlin\u2019s finest Drinks & Music\u201c V10\n     echte Feder: die Schrift wird Strich f\u00fcr Strich geschrieben\n\n     NEU IN V10 (Handy-Fix)\n     - Divi tauscht auf dem Handy den Claim-Text aus, sobald sich die\n       Fenstergr\u00f6\u00dfe \u00e4ndert (beim Scrollen blendet sich die Adressleiste\n       ein und aus). Bisher hat das die laufende Feder gel\u00f6scht.\n       Jetzt liegt die Feder \u00dcBER dem Text statt darin \u2013 Divi kann den\n       Text austauschen, die Feder schreibt ungest\u00f6rt weiter.\n     - kein 4-Sekunden-Abbruch mehr, wenn die Schrift langsam l\u00e4dt\n       (Handy\/Mobilnetz): die Feder wartet, bis man beim Claim ankommt.\n       Ist die Schrift dann immer noch nicht da, steht der Claim normal.\n     - der echte Text bleibt f\u00fcr Screenreader und Google immer im Code\n\n     NEU IN V9 (Firefox-Fix)\n     Firefox hat den Apostroph doppelt gezeigt. Jetzt wird die Zeile\n     ohne Apostroph gezeichnet und der Apostroph als eigenes Zeichen\n     an seine feste Stelle gesetzt \u2013 in allen Browsern gleich.\n\n     AUS V8\n     Neuer Claim mit Apostroph: \u201eBerlin\u2019s\u201c (Variante B2).\n     Zwischen n und s ist eine echte Unterbrechung, der Apostroph\n     steht mittig in der L\u00fccke. Die Feder schreibt \u201eBerlin\u201c, setzt\n     ab, schreibt den Apostroph, setzt wieder ab und schreibt dann\n     das s und den Rest. Positionen in Chrome neu gemessen.\n     Der Code erkennt den Claim auch, wenn im Text-Modul \u00b4 oder '\n     statt \u2019 steht \u2013 gezeigt wird immer der richtige Apostroph \u2019.\n\n     AUS V6\n     Das Code-Modul blendet sich selbst aus \u2013 kein Divi-Abstand\n     mehr unter dem Claim. Die Animation l\u00e4uft trotzdem.\n\n     AUS V5 (Firefox-Fix)\n     \u201eregina\u201c gibt es nur in normaler St\u00e4rke \u2013 das Fett rechnet\n     jeder Browser selbst dazu. Firefox macht die Buchstaben dabei\n     breiter, die Schrift l\u00e4uft auseinander und die Feder-Maske\n     sitzt daneben.\n     Jetzt steht jeder Buchstabe fest an seiner Position (in Chrome\n     gemessen) \u2013 in jedem Browser gleich. Ist das Fett im Browser\n     kr\u00e4ftiger, wird die Feder automatisch etwas breiter.\n     Dazu: eigener Takt f\u00fcr die Feder, am Schluss steht immer\n     garantiert die ganze Schrift.\n\n     EINBAU\n     Eigenes Code-Modul, direkt UNTER dem Claim-Text-Modul.\n     Im Text-Modul mit \u201eBerlin\u2019s finest \u2026\u201c: Klasse finest-font,\n     Design \u2192 Animation \u2192 Keine.\n\n     WICHTIG: Dieses Modul enth\u00e4lt absichtlich KEINEN Backslash.\n========================================================= -->\n\n<i class=\"bt-ink-hook\" hidden><\/i>\n\n<style>\n\/* dieses Code-Modul selbst ausblenden: kein Abstand unter dem Claim *\/\n.et_pb_module:has(.bt-ink-hook){\n  display: none !important;\n}\n\/* bis die Feder bereit ist: Text unsichtbar, aber f\u00fcr Screenreader lesbar\n   (nur mit JavaScript; die Feder liegt sp\u00e4ter dar\u00fcber) *\/\nhtml.bt-ink-js .finest-font > .et_pb_text_inner,\nhtml.bt-ink-js .et_pb_text_inner > .finest-font,\n.bt-ink-box.bt-ink-on > .et_pb_text_inner{\n  opacity: 0 !important;\n}\n.bt-ink-box{\n  position: relative;\n}\n.bt-ink-box > .bt-ink-svg{\n  position: absolute;\n  margin: 0;\n}\n\/* Divi-Einblendung vom Text-Modul abschalten, das Schreiben \u00fcbernimmt *\/\n.et_pb_module.et_animated:has(.finest-font){\n  opacity: 1 !important;\n  animation: none !important;\n}\n.bt-ink-svg{\n  display: block;\n  overflow: visible;\n  pointer-events: none;\n}\n.bt-ink-svg .bt-ink-full{\n  opacity: 0;\n  transition: opacity .8s ease;\n}\n.bt-ink-svg .bt-ink-full.is-on{\n  opacity: 1;\n}\n<\/style>\n\n<script>\n(function () {\n  \"use strict\";\n\n  var w = window, d = document;\n  if (w.__btInk) return;\n  w.__btInk = true;\n\n  \/* Text nie versteckt lassen *\/\n  function done() {\n    d.documentElement.classList.remove(\"bt-ink-js\");\n  }\n\n  if (\/[?&]et_fb=1\/.test(location.search)) { done(); return; }\n\n  var VX = 3200;   \/* Tempo nach rechts (kleiner = langsamer) *\/\n  var VS = 6500;   \/* Tempo der Feder im Buchstaben *\/\n  var START = 250; \/* Pause, wenn die Zeile ins Bild kommt (ms) *\/\n  var LIFT = 0.12; \/* Feder absetzen vor dem Apostroph (s) *\/\n  var LIFT2 = 0.24; \/* Feder absetzen vor dem s, nach dem Apostroph (s) *\/\n\n  \/* typografischer Apostroph (\u2019), ohne Sonderzeichen im Code *\/\n  var AP = String.fromCharCode(8217);\n\n  \/* Federweg der Schrift (1 em = 1000), gemessen an \u201eregina\u201c fett *\/\n  var D = {\n    text: \"Berlin\" + AP + \"s finest Drinks & Music\",\n    \/* gezeichnet wird die Zeile ohne Apostroph, der Apostroph kommt\n       als eigenes Zeichen dazu (Firefox-Fix: sonst doppelt) *\/\n    t0: \"Berlins finest Drinks & Music\",\n    l1: \"Berlins finest\", l2: \"Drinks & Music\",\n    ax: 2704,\n    adv: 12117, pre: 5615, l1w: 5390,\n    asc: 750, desc: 525, ls: -51.28, sw: 150,\n    \/* Startpunkt jedes Buchstabens ohne Apostroph (in Chrome gemessen) *\/\n    p: \"0 886 1184 1531 1839 2123 2797 3102 3326 3661 3945 4467 4765 5070 5390 5615 6569 6916 7200 7721 8223 8528 8753 9201 9426 10685 11172 11477 11761\",\n    p2: \"0 955 1301 1585 2107 2609 2913 3138 3587 3811 5070 5558 5863 6146\",\n    \/* Breite der ganzen Zeile ohne Abstand, normales Fett (Chrome) *\/\n    w0: 13449.4,\n    s: \"5 -410 25 -370 80 -325 125 -315 190 -315 260 -330 500 -450 565 -475 605 -480 615 -460 615 -435 590 -405 575 -360 560 -355 505 -310 495 -310 470 -285 460 -285 420 -245 360 -200 270 -110 225 -55 220 -40;380 -95 415 -55 445 -35 490 -20 555 -5 700 -5 775 -25 855 -70 885 -55 980 -80 1005 -75 1015 -95 1060 -105 1095 -155 1140 -170 1195 -165 1195 -140 1175 -115 1140 -100 1105 -95 1090 -95 1075 -110;495 -300 550 -235 555 -240 705 -240 710 -245 795 -240 810 -220 825 -215 855 -185 865 -165 870 -140 865 -75;580 -360 615 -365 605 -375 600 -365;600 -355 605 -350 635 -355 765 -425 865 -460 965 -470 980 -455 990 -420 975 -365 925 -315 875 -290 820 -275 795 -250 805 -255;1000 -70 1005 -30 1010 -20 1030 -10 1080 -10 1165 -25 1180 -40 1235 -60 1255 -80 1315 -115 1355 -155 1365 -180;1330 -125 1360 -150 1390 -110 1395 -80 1380 -40 1390 -10 1495 -20 1585 -60 1595 -75 1630 -85 1655 -80 1655 -90 1770 -210 1830 -250 1870 -250 1875 -260 1865 -265 1870 -255;1650 -75 1655 -40 1670 -15 1760 -15 1815 -25 1825 -35 1890 -60 1905 -80 1935 -95 1955 -100 1975 -90 1995 -95 2060 -160;1675 -115 1690 -130;1740 -185 1760 -205;1840 -265 1850 -295 1975 -400 2065 -455 2090 -465 2135 -465 2140 -445 2130 -415 2075 -360 1940 -270 1890 -245 1870 -245;1855 -295 1880 -320;1890 -325 1910 -345;1925 -355 1940 -370;1955 -85 1970 -85 1970 -90;1985 -70 1990 -90;1985 -65 1985 -30 1995 -10 2090 -20 2120 -40 2165 -55 2190 -80 2220 -95 2240 -100 2260 -90 2300 -95 2330 -120 2340 -155;2075 -365 2095 -385;2240 -85 2255 -85 2255 -90;2250 -25 2275 -50 2285 -85;2330 -115 2335 -110 2375 -115 2380 -125 2370 -130 2375 -120;2375 -110 2395 -110 2485 -165 2540 -175 2550 -160 2550 -135 2545 -115 2505 -55 2505 -30 2515 -10 2555 -10 2625 -25 2640 -40 2670 -50;2778 -25 2793 -40 2823 -50 2868 -55 2878 -80 2893 -95 2953 -125 2973 -145 2973 -165;2868 -50 2893 -10 2928 -5 2973 -15 2978 -25 3013 -15 3098 -30 3153 -50;2953 -130 2968 -145;2978 -140 2988 -130 2993 -85 2988 -80 2988 -30;3053 435 3088 360 3128 300 3228 170 3373 10 3393 -35 3403 -45 3428 -45 3453 -20 3443 55 3413 145 3368 225 3313 300 3183 435 3153 450 3133 470 3103 485 3063 490 3053 475 3053 440;3183 430 3208 405;3273 115 3288 100;3278 340 3298 320;3303 80 3333 50;3318 -45 3358 -60 3373 -50 3398 -50;3338 40 3368 10;3358 -45 3373 -45 3368 -35 3358 -40;3428 -55 3438 -65 3473 -70 3513 -35 3548 -20 3623 -25 3713 -60 3728 -80 3758 -95 3798 -105 3818 -95 3883 -160;3473 -80 3493 -130 3563 -200 3633 -245 3668 -235 3713 -250 3798 -305 3808 -305 3898 -375 3938 -415 3948 -460 3943 -465 3878 -460 3798 -410 3688 -320 3653 -285 3643 -250;3503 -135 3563 -195;3693 -325 3708 -340;3808 -70 3813 -90;3808 -65 3808 -30 3818 -10 3888 -15 3928 -25 3943 -40 3998 -60 4013 -80 4043 -95 4073 -100 4083 -90 4093 -95 4113 -90 4138 -110 4173 -95 4213 -105 4318 -170 4363 -175 4373 -160 4373 -135 4368 -115 4328 -55 4328 -30 4338 -10 4378 -10 4448 -25 4463 -40 4518 -60 4568 -65 4598 -95 4648 -110 4663 -140 4688 -160 4718 -170 4768 -170 4778 -165 4773 -130 4723 -100 4688 -100 4658 -110;3878 -355 3893 -370;3903 -375 3928 -400;4063 -85 4078 -85 4078 -90;4073 -25 4093 -45 4108 -85;4148 -120 4163 -160;4578 -65 4588 -25 4613 -10 4658 -10 4743 -25 4788 -50 4838 -55 4848 -80 4863 -95 4898 -120 4908 -120 4938 -150 4938 -170;4683 -120 4693 -115 4688 -105 4683 -115 4688 -110;4838 -50 4858 -10 4923 -10 4948 -25 4968 -15 5043 -25 5128 -65 5168 -75 5193 -70 5203 -25 5228 -10 5343 -20 5443 -50;4918 -125 4938 -145 4953 -130 4958 -30;5193 -80 5238 -145 5353 -265 5363 -300 5348 -315 5313 -320;5253 -165 5283 -195;5368 -300 5463 -340 5473 -350 5483 -385 5528 -430 5558 -450;5473 -340 5483 -330 5568 -330 5573 -325;5618 -415 5633 -380 5693 -325 5743 -315 5808 -315 5913 -345 6153 -465 6183 -475 6223 -470 6233 -440 6228 -425 6198 -395 6188 -360 6073 -280 5958 -185 5868 -90 5833 -45 5833 -35;5643 -365 5663 -345;5943 -55 6018 -20 6098 -5 6253 -5 6358 -35 6443 -75 6503 -125 6513 -125 6558 -170 6598 -225 6628 -285 6643 -340 6638 -430 6633 -445 6613 -465 6598 -470 6513 -465 6398 -425 6248 -345 6188 -350;5963 -190 5978 -205;6218 -365 6228 -360 6223 -350 6218 -360 6223 -355;6488 -105 6503 -120;6513 -130 6553 -170;6563 -50 6603 -60 6663 -90 6708 -125 6718 -125 6743 -150 6748 -170;6718 -130 6738 -150;6748 -145 6778 -100 6768 -25 6783 -10 6808 -10 6898 -25 6913 -40 6958 -55 6983 -80 7013 -95 7053 -105 7073 -95 7138 -160;7063 -70 7068 -90;7063 -65 7063 -30 7073 -10 7168 -20 7198 -40 7253 -60 7268 -80 7298 -95 7333 -100 7368 -90 7393 -110 7403 -110 7418 -95 7468 -105 7533 -150 7588 -175 7618 -175 7628 -160 7623 -115 7583 -55 7583 -25 7593 -10 7663 -15 7703 -25 7733 -45 7803 -50 7868 -95 7888 -100 7898 -100 7923 -75 7928 -55 7963 -40 8008 -35 8028 -60 8083 -75 8128 -115 8133 -165 8123 -175 8078 -170 7963 -115 7923 -120 7903 -115 7898 -105;7318 -85 7333 -85 7338 -90 7333 -90;7328 -25 7348 -45 7363 -85;7403 -120 7418 -160;7903 -130 7913 -160 7958 -205 7988 -220 8038 -260 8048 -295 8078 -325 8208 -425 8288 -465 8333 -465 8323 -410 8278 -365 8193 -305 8088 -245 8038 -250 8038 -255;7928 -130 7943 -125 7933 -135;8008 -30 8018 -15 8033 -10 8123 -10 8203 -25 8218 -40 8248 -50 8293 -55 8313 -90 8363 -125 8373 -125 8398 -150 8398 -170;8053 -295 8078 -320;8063 -265 8073 -260 8068 -250 8063 -260 8068 -255;8088 -325 8113 -350;8123 -355 8138 -370;8278 -370 8318 -410;8293 -50 8318 -10 8353 -5 8398 -15 8413 -30 8418 -80 8413 -135 8403 -145;8373 -130 8393 -150;8413 -25 8423 -15 8473 -20 8543 -35 8578 -50;8783 -70 8793 -100 8843 -145 8938 -175 8948 -190 9003 -200;8783 -65 8793 -25 8808 -10 8843 0 8908 0 8988 -15 9093 -60 9108 -75 9118 -100 9108 -115 9068 -115 9038 -95;8798 -110 8818 -130;8918 -260 8923 -280 8938 -295 9003 -330 9123 -360 9213 -355 9223 -340 9218 -310 9168 -280 9083 -260;8918 -255 8943 -195 8938 -185;9123 -100 9193 -95 9218 -110;9388 -415 9403 -380 9448 -335 9508 -315 9568 -315 9628 -325 9693 -350 9933 -470 9973 -480 9993 -475 10003 -440 9998 -425 9968 -395 9958 -360 9808 -245 9718 -165 9613 -55 9603 -40 9603 -20;9413 -365 9438 -340;9723 -170 9743 -190;9783 -225 9798 -240;9958 -350 10013 -345 10188 -440 10273 -470 10333 -475 10353 -435 10348 -400 10308 -340 10298 -295 10108 -110 10048 -35;9988 -365 9998 -360 9998 -355 9988 -360;10233 -230 10248 -245;10298 -285 10318 -280 10363 -295 10468 -375 10593 -450 10633 -465 10693 -470 10708 -435 10693 -380 10603 -270 10553 -220 10488 -135 10473 -95 10473 -65 10488 -25 10518 -10 10593 -10 10653 -20 10683 -40 10738 -60 10753 -80 10798 -105 10833 -115 10858 -110 10908 -160;10843 -50 10858 -105;10843 -45 10848 -15 10868 -15 10898 -20 10978 -65 11013 -75 11033 -70 11078 -115 11098 -145;11033 -65 11033 -40 11053 -10 11138 -20 11168 -40 11243 -55 11253 -80 11268 -95 11328 -125 11348 -145 11348 -165;11058 -100 11073 -115;11243 -50 11268 -10 11303 -5 11348 -15 11353 -25 11373 -15 11448 -25 11528 -60 11543 -80 11573 -95 11593 -100 11613 -90 11633 -95 11698 -165;11328 -130 11343 -145;11353 -140 11363 -130 11368 -85 11363 -80 11363 -30;11593 -85 11608 -85 11608 -90;11623 -70 11628 -90;11623 -65 11623 -30 11633 -10 11703 -15 11743 -25 11758 -40 11808 -55 11838 -80 11863 -85 11888 -80 11888 -90 11933 -135 12013 -175 12038 -180 12083 -175 12093 -145 12088 -130 12078 -125;11883 -75 11893 -25 11918 -10 12038 -15 12118 -30 12168 -50;2135 -270 2170 -270;3958 -270 3993 -270;7208 -270 7243 -270;11773 -270 11808 -270\",\n    \/* Apostroph: eigener Federstrich *\/\n    a: \"2761 -395 2726 -320\",\n    \/* hier setzt die Feder ab: alles rechts davon (das s und der Rest) *\/\n    gx: 2752\n  };\n\n  if (!(\"IntersectionObserver\" in w) || !w.SVGElement || !w.requestAnimationFrame) { done(); return; }\n  if (w.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) { done(); return; }\n  \/* Handy: originale zweizeilige Federanimation wieder verwenden. *\/\n  d.documentElement.classList.add(\"bt-ink-js\");\n\n  var NS = \"http:\/\/www.w3.org\/2000\/svg\";\n  function sv(tag, attrs) {\n    var e = d.createElementNS(NS, tag);\n    for (var k in attrs) e.setAttribute(k, attrs[k]);\n    return e;\n  }\n\n  var strokes = (D.s + \";\" + D.a).split(\";\").map(function (part, idx, all) {\n    var n = part.trim().split(\" \").map(Number), pts = [];\n    for (var i = 0; i + 1 < n.length; i += 2) pts.push([n[i], n[i + 1]]);\n    var minX = Infinity, sumX = 0;\n    pts.forEach(function (p) { if (p[0] < minX) minX = p[0]; sumX += p[0]; });\n    var dx0 = pts[pts.length - 1][0] - pts[0][0], dy0 = pts[pts.length - 1][1] - pts[0][1];\n    \/* i-Punkte: kurze Striche, kommen wie beim Schreiben erst nach dem Wort *\/\n    var dot = pts.length === 2 && Math.abs(dy0) < 5 && Math.abs(dx0) < 60;\n    \/* der letzte Strich ist der Apostroph *\/\n    var ap = idx === all.length - 1;\n    \/* L\u00e4nge selbst ausrechnen (Firefox misst Linien in Masken nicht) *\/\n    var len = 0;\n    for (var j = 1; j < pts.length; j++) len += Math.sqrt(Math.pow(pts[j][0] - pts[j - 1][0], 2) + Math.pow(pts[j][1] - pts[j - 1][1], 2));\n    return { pts: pts, minX: minX, cx: sumX \/ pts.length, dot: dot && !ap, ap: ap, len: Math.max(1, len) + 2 };\n  });\n\n  function pathD(pts, dx, dy) {\n    return \"M\" + pts.map(function (p) { return (p[0] + dx) + \" \" + (p[1] + dy); }).join(\"L\");\n  }\n\n  \/* weiche Federbewegung, wie cubic-bezier(.35,.1,.45,1) *\/\n  function bezier(x1, y1, x2, y2) {\n    return function (x) {\n      if (x <= 0) return 0;\n      if (x >= 1) return 1;\n      var t = x;\n      for (var i = 0; i < 8; i++) {\n        var it = 1 - t;\n        var cx = 3 * x1 * t * it * it + 3 * x2 * t * t * it + t * t * t - x;\n        var dx = 3 * x1 * it * it + 6 * (x2 - x1) * t * it + 3 * (1 - x2) * t * t;\n        if (Math.abs(dx) < 0.000001) break;\n        t = Math.min(1, Math.max(0, t - cx \/ dx));\n      }\n      var u = 1 - t;\n      return 3 * y1 * t * u * u + 3 * y2 * t * t * u + t * t * t;\n    };\n  }\n  var ease = bezier(0.35, 0.1, 0.45, 1);\n\n  var uid = 0;\n  function build(h) {\n    var cs = getComputedStyle(h);\n    var fs = parseFloat(cs.fontSize) || 39;\n    var lh = parseFloat(cs.lineHeight) || fs;\n    var lhU = lh \/ fs * 1000;\n    var two = !!h.querySelector(\"br\") || (D.adv \/ 1000 * fs > h.clientWidth + 2);\n    var pAll = D.p.split(\" \");\n    var lines = two\n      ? [{ t: D.l1, xs: pAll.slice(0, D.l1.length).join(\" \"), dx: 0, dy: 0, w: D.l1w, pick: function (s) { return s.cx < D.pre; } },\n         { t: D.l2, xs: D.p2, dx: -D.pre, dy: lhU, w: D.adv - D.pre, pick: function (s) { return s.cx >= D.pre; } }]\n      : [{ t: D.t0, xs: D.p, dx: 0, dy: 0, w: D.adv, pick: function () { return true; } }];\n    var wU = Math.max.apply(null, lines.map(function (l) { return l.w; }));\n    var base = (lhU - (D.asc + D.desc)) \/ 2 + D.asc;\n    var id = \"btInkM\" + (++uid);\n\n    var svg = sv(\"svg\", {\n      \"class\": \"bt-ink-svg\", \"aria-hidden\": \"true\", focusable: \"false\",\n      viewBox: \"0 \" + (-base) + \" \" + wU + \" \" + (lhU * lines.length),\n      width: (wU \/ 1000 * fs).toFixed(2), height: (lh * lines.length).toFixed(2)\n    });\n    var mask = sv(\"mask\", { id: id, maskUnits: \"userSpaceOnUse\", x: -2000, y: -3000, width: wU + 4000, height: lhU * lines.length + 6000 });\n    var pen = sv(\"g\", { fill: \"none\", stroke: \"#fff\", \"stroke-width\": D.sw, \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\" });\n    mask.appendChild(pen);\n    var defs = sv(\"defs\", {});\n    defs.appendChild(mask);\n    svg.appendChild(defs);\n\n    function textEl(t, dy, xs) {\n      \/* jeder Buchstabe fest an seiner Stelle: in allen Browsern gleich *\/\n      var te = sv(\"text\", { x: xs || 0, y: dy });\n      te.textContent = t;\n      te.style.setProperty(\"font-family\", cs.fontFamily, \"important\");\n      te.style.setProperty(\"font-weight\", cs.fontWeight, \"important\");\n      te.style.setProperty(\"font-style\", cs.fontStyle, \"important\");\n      te.style.setProperty(\"font-size\", \"1000px\", \"important\");\n      te.style.setProperty(\"letter-spacing\", \"0px\", \"important\");\n      te.style.setProperty(\"fill\", \"currentColor\", \"important\");\n      return te;\n    }\n    var inked = sv(\"g\", { mask: \"url(#\" + id + \")\" });\n    var full = sv(\"g\", { \"class\": \"bt-ink-full\" });\n    var paths = [];\n    lines.forEach(function (l, li) {\n      inked.appendChild(textEl(l.t, l.dy, l.xs));\n      full.appendChild(textEl(l.t, l.dy, l.xs));\n      if (li === 0) {\n        \/* Apostroph als eigenes Zeichen in der ersten Zeile *\/\n        inked.appendChild(textEl(AP, l.dy, D.ax));\n        full.appendChild(textEl(AP, l.dy, D.ax));\n      }\n      strokes.filter(l.pick).forEach(function (s) {\n        var L = s.len;\n        \/* Startwerte als Attribut: Strich noch unsichtbar *\/\n        var p = sv(\"path\", {\n          d: pathD(s.pts, l.dx, l.dy),\n          \"stroke-dasharray\": L + \" \" + (L + 10),\n          \"stroke-dashoffset\": L\n        });\n        pen.appendChild(p);\n        paths.push({ el: p, pts: s.pts, dx: l.dx, dy: l.dy, x: s.minX + l.dx, line: lines.indexOf(l), dot: s.dot, len: L,\n          ap: s.ap, gap: !s.ap && lines.indexOf(l) === 0 && s.minX >= D.gx });\n      });\n    });\n    svg.appendChild(inked);\n    svg.appendChild(full);\n    return { svg: svg, pen: pen, paths: paths, full: full, inked: inked, lines: lines.length, textEl: textEl };\n  }\n\n  \/* Fett-Ausgleich: Messen, wie breit der Browser die Schrift fett\n     rechnet. Chrome = Referenz, nichts \u00e4ndern. Ist das Fett breiter\n     (Firefox), wird die Feder etwas breiter und r\u00fcckt mittig nach. *\/\n  function boldFix(b) {\n    try {\n      var probe = b.textEl(D.t0, 0, 0);\n      b.inked.appendChild(probe);\n      var len = probe.getComputedTextLength();\n      probe.remove();\n      var extra = (len - D.w0) \/ D.t0.length;\n      if (!(extra > 3)) return;\n      extra = Math.min(extra, 90);\n      b.pen.setAttribute(\"stroke-width\", D.sw + extra);\n      b.paths.forEach(function (p) {\n        p.el.setAttribute(\"d\", pathD(p.pts, p.dx + extra \/ 2, p.dy));\n      });\n    } catch (e) {}\n  }\n\n  function play(b) {\n    \/* Zeitplan: die Feder wandert gleichm\u00e4\u00dfig nach rechts,\n       jeder Strich wird in seinem eigenen Tempo gezogen *\/\n    var lineEnd = 0;\n    for (var ln = 0; ln < b.lines; ln++) {\n      var offset = ln ? lineEnd + 0.05 : 0;\n      b.paths.forEach(function (p) {\n        if (p.line !== ln) return;\n        \/* Unterbrechung: nach dem n absetzen, Apostroph, wieder absetzen, dann das s *\/\n        p.start = offset + Math.max(0, p.x) \/ VX + (p.dot ? 0.45 : 0) + (p.ap ? LIFT : 0) + (p.gap ? LIFT2 : 0);\n        p.dur = Math.max(0.09, p.len \/ VS);\n        p.last = p.len;\n        p.fin = false;\n        lineEnd = Math.max(lineEnd, p.start + p.dur);\n      });\n    }\n    var end = lineEnd;\n\n    \/* zum Schluss die ganze Schrift sanft satt machen (nur einmal) *\/\n    var finished = false;\n    function finish() {\n      if (finished) return;\n      finished = true;\n      b.paths.forEach(function (p) { p.el.setAttribute(\"stroke-dashoffset\", 0); });\n      b.full.classList.add(\"is-on\");\n      setTimeout(function () { if (b.inked.parentNode) b.inked.remove(); }, 900);\n    }\n\n    \/* eigener Takt: Werte direkt als Attribut setzen,\n       so zeichnet auch Firefox die Maske jedes Mal neu *\/\n    var t0 = null;\n    function frame(now) {\n      if (finished) return;\n      if (t0 === null) t0 = now;\n      var el = (now - t0) \/ 1000;\n      var open = 0;\n      for (var i = 0; i < b.paths.length; i++) {\n        var p = b.paths[i];\n        if (p.fin) continue;\n        open++;\n        if (el < p.start) continue;\n        var k = Math.min(1, (el - p.start) \/ p.dur);\n        var off = Math.round(p.len * (1 - ease(k)) * 10) \/ 10;\n        if (off !== p.last) {\n          p.el.setAttribute(\"stroke-dashoffset\", off);\n          p.last = off;\n        }\n        if (k >= 1) p.fin = true;\n      }\n      if (open === 0 || el > end + 0.15) {\n        setTimeout(finish, 150);\n        return;\n      }\n      w.requestAnimationFrame(frame);\n    }\n    w.requestAnimationFrame(frame);\n\n    \/* Sicherheitsnetz: auch ohne Takt (z. B. Tab im Hintergrund)\n       steht am Ende die ganze Schrift *\/\n    setTimeout(finish, (end + 1.5) * 1000);\n    return end;\n  }\n\n  \/* Die Feder liegt \u00dcBER dem Text (eigenes SVG im Modul, nicht im Text).\n     Divi darf den Text jederzeit austauschen \u2013 die Feder bleibt. *\/\n  function run(box) {\n    var h = box.querySelector(\".finest-font\") || box.querySelector(\"h1, h2, h3, p\");\n    if (!h || norm(h.textContent) !== norm(D.text)) { done(); return; }\n    var b;\n    try { b = build(h); } catch (e) { done(); return; }\n\n    \/* Position der Textzeile im Modul *\/\n    var hr = h.getBoundingClientRect(), br = box.getBoundingClientRect();\n    \/* Phone: SVG and final native claim share the measured text width. *\/\n    if (w.matchMedia(\"(max-width:767px)\").matches && b.lines === 1) {\n      try {\n        var textRange = d.createRange(); textRange.selectNodeContents(h);\n        var actualWidth = textRange.getBoundingClientRect().width;\n        if (actualWidth > 0) {\n          b.svg.setAttribute(\"width\", Math.min(actualWidth, h.clientWidth).toFixed(2));\n          b.svg.setAttribute(\"preserveAspectRatio\", \"none\");\n        }\n      } catch (ignore) {}\n    }\n    box.classList.add(\"bt-ink-box\");\n    b.svg.style.left = (hr.left - br.left) + \"px\";\n    b.svg.style.top = (hr.top - br.top) + \"px\";\n    var color = getComputedStyle(h).color;\n    if (color) b.svg.style.color = color;\n\n    box.appendChild(b.svg);\n    boldFix(b);\n    box.classList.add(\"bt-ink-on\");\n    var total = play(b);\n    \/* danach nichts mehr verstecken (die Feder bleibt als Schrift stehen) *\/\n    setTimeout(done, (total + 2) * 1000);\n\n    \/* Handy gedreht \/ Fenster deutlich breiter oder schmaler:\n       Feder weg, echter Text wieder sichtbar *\/\n    var wStart = w.innerWidth;\n    w.addEventListener(\"resize\", function () {\n      if (Math.abs(w.innerWidth - wStart) < 40 || !b.svg.parentNode) return;\n      b.svg.remove();\n      box.classList.remove(\"bt-ink-on\");\n      done();\n    });\n  }\n\n  function norm(s) { return String(s).replace(\/[^A-Za-z&]\/g, \"\"); }\n\n  function setup() {\n    if (d.body.classList.contains(\"et-fb\")) { done(); return; }\n    var first = d.querySelector(\".finest-font\");\n    if (!first) { done(); return; }\n    var box = first.closest(\".et_pb_module\") || first.parentNode;\n\n    \/* Schrift laden \u2013 ohne Zeitlimit; gepr\u00fcft wird erst beim Claim *\/\n    var fontReady = false, waiters = [];\n    var ready = d.fonts && d.fonts.load ? d.fonts.load(\"700 40px regina\") : Promise.resolve();\n    ready.then(function () {\n      fontReady = true;\n      waiters.splice(0).forEach(function (fn) { fn(true); });\n    }, function () {\n      waiters.splice(0).forEach(function (fn) { fn(false); });\n    });\n\n    \/* Claim im Bild: Schrift da = schreiben; sonst noch max. 2,5 s warten *\/\n    function whenFont(cb) {\n      if (fontReady) { cb(true); return; }\n      var called = false;\n      function once(ok) { if (called) return; called = true; cb(ok); }\n      waiters.push(once);\n      setTimeout(function () { once(fontReady); }, 2500);\n    }\n\n    var io = new IntersectionObserver(function (entries) {\n      entries.forEach(function (e) {\n        if (!e.isIntersecting) return;\n        io.disconnect();\n        whenFont(function (ok) {\n          if (!ok) { done(); return; }\n          setTimeout(function () {\n            try { run(box); } catch (err) { done(); }\n          }, START);\n        });\n      });\n    }, { threshold: 0.5 });\n    io.observe(box);\n  }\n\n  if (d.readyState === \"complete\") setup();\n  else w.addEventListener(\"load\", setup, { once: true });\n})();\n<\/script><\/div><\/div>\r\n<div class=\"et_pb_text_4 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h2 class=\"bt-about-bar-hours\"><span class=\"bt-hours-de\" data-no-translation><span class=\"bt-hours-line\">Mittwoch ab 21 Uhr<\/span><span class=\"bt-hours-line bt-hours-thursday\">Donnerstag bis Samstag ab 19 Uhr<\/span><\/span><span class=\"bt-hours-en\" lang=\"en\" data-no-translation><span class=\"bt-hours-line\">Wednesday from 9 PM<\/span><span class=\"bt-hours-line bt-hours-thursday\">Thursday to Saturday from 7 PM<\/span><\/span><\/h2>\n<\/div><\/div>\r\n<div class=\"et_pb_text_5 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p>Hinter einer unscheinbaren Stahlt\u00fcr am S-Bahnhof Friedrichstra\u00dfe verbirgt sich ein Ort voller Geheimnisse: die Bar Tausend \u2013 Cocktailbar, Tanzbar und Treffpunkt f\u00fcr internationale DJ-Kultur im Berliner Nachtleben.<\/p>\n<p>Seit Jahren ist sie ein Magnet f\u00fcr alle, die das Besondere suchen. Hier wurde Geschichte geschrieben, hier wurden Trends gesetzt. Unz\u00e4hlige Abende voller Musik, Lichter und Leidenschaft haben die Mauern der Bar erlebt. Ob legend\u00e4re Live-Acts, exklusive Filmproduktionen oder ein Dinner in der <a href=\"#cantina\">Cantina by CHEHUB<\/a> \u2013 die Bar Tausend ist Schauplatz unvergesslicher Momente.<\/p>\n<p>Tauchen Sie ein in eine Welt voller Geschichten und lassen Sie sich von der Magie dieses Ortes verzaubern.<\/p>\n<p>Und nein, wir erw\u00e4hnen keinen Namen \u2013 Diskretion ist bei uns das A und O.<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_6 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module\"><div class=\"et_pb_text_inner\" data-et-mv-hidden-tablet=\"true\" data-et-mv-hidden-phone=\"true\"><div class=\"social-logos\">\n<p><a class=\"maps-logo\" href=\"https:\/\/www.google.com\/maps\/dir\/\/BAR+TAUSEND,+Schiffbauerdamm+11,+10117+Berlin\/\" target=\"_blank\" rel=\"noopener\" aria-label=\"Google Maps \u00f6ffnen\"><br \/><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/GoogleMaps-Logo-03.png\" alt=\"Google Maps\" width=\"150\" height=\"150\" \/><br \/><\/a><\/p>\n<p><a class=\"instagram-logo\" href=\"https:\/\/www.instagram.com\/bar.tausend.berlin\/\" target=\"_blank\" rel=\"noopener\" aria-label=\"Instagram \u00f6ffnen\"><br \/><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/Instagram-Logo-02.png\" alt=\"Instagram\" width=\"150\" height=\"150\" \/><br \/><\/a><\/p>\n<p><a class=\"resident-advisor-logo\" href=\"https:\/\/de.ra.co\/clubs\/13913\" target=\"_blank\" rel=\"noopener\" aria-label=\"Resident Advisor \u00f6ffnen\"><br \/><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/ResidentAdvisor_logo_2.png\" alt=\"Resident Advisor\" width=\"150\" height=\"150\" \/><br \/><\/a><\/p>\n<\/div>\n<\/div><\/div>\r\n<div class=\"et_pb_code_10 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n\/* 1) #about volle Breite wie #home *\/\n#about{\n  width: 100% !important;\n  max-width: 100% !important;\n  margin-left: 0 !important;\n  margin-right: 0 !important;\n\n  position: relative !important;\n  overflow: hidden !important;\n\n  background-position: center center !important;\n}\n#about :is(.et_parallax_bg_wrap, .et-pb-parallax-wrapper){\n  overflow: hidden !important;\n}\n\n#about :is(.et_parallax_bg_wrap, .et-pb-parallax-wrapper) :is(.et_parallax_bg, .et-pb-parallax-background){\n  background-position: center center !important;\n  background-size: cover !important;\n  background-repeat: no-repeat !important;\n}\n\n\/* 2) Zoom-Overlay \u00fcber Parallax *\/\n#about .bt_zoom_layer{\n  position: absolute !important;\n  inset: 0 !important;\n  pointer-events: none !important;\n  z-index: 2 !important;\n\n  background-size: cover !important;\n  background-position: center center !important;\n  background-repeat: no-repeat !important;\n\n  \/* Vorw\u00e4rmen ohne Transparenz-Effekt *\/\n  opacity: 0; \/* wirklich unsichtbar *\/\n  transform: translate3d(0,0,0) scale(1);\n  transform-origin: center center;\n  will-change: transform, opacity;\n  backface-visibility: hidden;\n}\n\n\/* Content nach vorne \u2013 Row-Position von Divi NICHT \u00fcberschreiben *\/\n#about > .et_pb_row{\n  z-index: 5 !important;\n}\n\n#about .et_pb_row_inner,\n#about .et_pb_module{\n  position: relative !important;\n  z-index: 5 !important;\n}\n\n\n\n\n\/* &#x2705; HANDY: Zoom-Layer sicher ausblenden (nur Phone) *\/\n@media (max-width: 767px){\n  #about .bt_zoom_layer{ display:none !important; }\n}\n<\/style>\n\n<script>\n(function(){\n  \/* &#x2705; HANDY: Script komplett abschalten (nur Phone) *\/\n  if (window.matchMedia && window.matchMedia(\"(max-width: 767px)\").matches) return;\n\n  const about = document.getElementById(\"about\");\n  if(!about) return;\n\n  const parBg = Array.from(about.querySelectorAll(\".et_parallax_bg, .et-pb-parallax-background\"))\n    .find(el => getComputedStyle(el).display !== \"none\" && el.getClientRects().length);\n  const wrap = parBg && parBg.closest(\".et_parallax_bg_wrap, .et-pb-parallax-wrapper\");\n  if(!wrap || !parBg) return;\n\n  let zoom = wrap.querySelector(\".bt_zoom_layer\");\n  if(!zoom){\n    zoom = document.createElement(\"div\");\n    zoom.className = \"bt_zoom_layer\";\n    wrap.appendChild(zoom);\n  }\n\n  function syncBg(){\n    const cs = getComputedStyle(parBg);\n    zoom.style.backgroundImage    = cs.backgroundImage;\n    zoom.style.backgroundSize     = cs.backgroundSize;\n    zoom.style.backgroundRepeat   = cs.backgroundRepeat;\n    zoom.style.backgroundPosition = cs.backgroundPosition;\n\n    \/* \u201cprewarm\u201d ohne Sichtbarkeit: einmal kurz auf 0.0001 setzen,\n       dann wieder 0 \u2013 dadurch wird es gerendert, aber bleibt unsichtbar *\/\n    zoom.style.opacity = \"0.0001\";\n    requestAnimationFrame(()=>{ zoom.style.opacity = \"0\"; });\n  }\n\n  \/\/ ===== Einstellungen =====\n  const MAX_SCALE      = 1.40; \/\/ mehr Zoom: 1.26\u20131.36\n  const RANGE_VH       = 1.10; \/\/ Zoom l\u00e4uft \u00fcber 1.1 Viewports\n  const START_DELAY_PX = 50;   \/\/ verhindert den Start-Ruckler\n  \/\/ =========================\n\n  function clamp(v,min,max){ return Math.max(min, Math.min(max, v)); }\n  function smoothstep(t){ return t*t*(3-2*t); }\n\n  let ticking = false;\n\n  function update(){\n    ticking = false;\n\n    const rect = about.getBoundingClientRect();\n    const vh   = window.innerHeight || 1;\n\n    \/\/ Start: erst wenn #about oben anliegt\n    if(rect.top > 0){\n      zoom.style.opacity = \"0\";\n      zoom.style.transform = \"translate3d(0,0,0) scale(1)\";\n      return;\n    }\n\n    const passedPxRaw = -rect.top;\n    const passedPx = Math.max(0, passedPxRaw - START_DELAY_PX);\n\n    const rangePx  = Math.max(1, vh * RANGE_VH);\n\n    let p = clamp(passedPx \/ rangePx, 0, 1);\n    p = smoothstep(p);\n\n    const scale = 1 + (MAX_SCALE - 1) * p;\n\n    \/\/ Sobald aktiv: volle Deckkraft (keine Transparenz!)\n    zoom.style.opacity = \"1\";\n    zoom.style.transform = \"translate3d(0,0,0) scale(\" + scale.toFixed(4) + \")\";\n  }\n\n  function requestTick(){\n    if(!ticking){\n      ticking = true;\n      requestAnimationFrame(update);\n    }\n  }\n\n  syncBg();\n  update();\n\n  window.addEventListener(\"scroll\", requestTick, {passive:true});\n  window.addEventListener(\"resize\", function(){ syncBg(); requestTick(); });\n  window.addEventListener(\"load\",   function(){ syncBg(); requestTick(); });\n})();\n<\/script>\n\n\n\n\n\n\n\n<style id=\"bt-about-wide-desktop-fix\">\n\n\/* =========================================================\n   BAR TAUSEND \u2014 ABOUT WIDE DESKTOP FIX\n   verhindert Divi-Maxbreite \/ falsche Center-Positionierung\n   ========================================================= *\/\n\n@media (min-width:981px){\n\n  \/* Section immer echte volle Breite *\/\n  #about{\n    width:100% !important;\n    max-width:none !important;\n    margin-left:0 !important;\n    margin-right:0 !important;\n  }\n\n  \/* Hintergrund-\/Parallax-Ebene immer volle Sectionbreite *\/\n  #about :is(.et_parallax_bg_wrap, .et-pb-parallax-wrapper){\n    left:0 !important;\n    right:0 !important;\n    width:100% !important;\n    max-width:none !important;\n    margin-left:0 !important;\n    margin-right:0 !important;\n  }\n\n  #about :is(.et_parallax_bg_wrap, .et-pb-parallax-wrapper) :is(.et_parallax_bg, .et-pb-parallax-background){\n    left:0 !important;\n    width:100% !important;\n    max-width:none !important;\n  }\n\n  \/* Hauptzeile: volle Breite, vertikal mittig *\/\n  #about > .et_pb_row{\n    position:absolute !important;\n\n    top:50% !important;\n    left:0 !important;\n    right:auto !important;\n\n    width:100% !important;\n    max-width:none !important;\n\n    margin-left:0 !important;\n    margin-right:0 !important;\n\n    transform:translateY(-50%) !important;\n  }\n\n}\n\n<\/style><\/div><\/div>\r\n<div class=\"et_pb_code_11 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style id=\"bt-v5-about-type-spacing\">\n\/* About: native content remains editable; typography and offsets stay with its section. *\/\nbody.page-id-9606 #page-container #about .et_pb_text:has(h1),\nbody.page-id-9606 #page-container #about .et_pb_text:has(h2.finest-font){translate:0 8px}\nbody.page-id-9606 #page-container #about .bt-about-bar-hours{font-family:\"Oswald\",sans-serif!important;font-size:30px!important;line-height:1.15!important;letter-spacing:-.025em!important;text-transform:uppercase!important;color:#ebebeb!important;margin:0!important;padding:0!important}\nbody.page-id-9606 #about .bt-about-bar-hours .bt-hours-line{display:block;white-space:nowrap}\nbody.page-id-9606 #about .bt-about-bar-hours .bt-hours-thursday{margin-top:6px}\n@media(max-width:767px){\n body.page-id-9606 #page-container #about h2.finest-font{font-size:clamp(18px,6vw,26px)!important;line-height:1.35!important;white-space:nowrap!important}\n body.page-id-9606 #page-container #about .bt-about-bar-hours{font-size:clamp(18px,6vw,24px)!important;line-height:1.2!important}\n}\n<\/style>\n<style id=\"bt-v5-about-desktop-pass-2\">\n\/* Second desktop pass: complete copy +8px, heading\/claim +8px, upper group +5px. *\/\n@media(min-width:768px){\n html body.page-id-9606 #page-container #about .et_pb_column:first-child>.et_pb_text{translate:0 8px!important}\n html body.page-id-9606 #page-container #about .et_pb_column:first-child>.et_pb_text:has(h1),\n html body.page-id-9606 #page-container #about .et_pb_column:first-child>.et_pb_text:has(h2.finest-font){translate:0 29px!important}\n html body.page-id-9606 #page-container #about .et_pb_column:first-child>.et_pb_text:has(.bt-about-bar-hours){translate:0 13px!important}\n}\nhtml body.page-id-9606 #bt-mini-eq-control.bt-mini-eq-navigation #bt-mini-eq-button{color:#b9b6b0!important;border-color:#b9b6b0!important;opacity:.65!important;transition:opacity .65s ease,color 1.1s ease,border-color 1.1s ease!important}\nhtml body.page-id-9606 #bt-mini-eq-control.bt-mini-eq-navigation #bt-mini-eq-button:is(:hover,:focus-visible){opacity:1!important;color:#ea0b5f!important;border-color:#ea0b5f!important}\n<\/style>\n<style id=\"bt-v5-about-phone-readability\">\n@media(max-width:767px){\nhtml body.page-id-9606 #page-container #about#about.et_pb_section::before{opacity:clamp(.55,calc(var(--bt-home-about-opacity,.7) * 1.75 - .325),.9)!important}\nhtml body.page-id-9606 #page-container #about .et_pb_text:has(.bt-about-bar-hours){margin-bottom:13px!important}\n}\n<\/style>\n<style id=\"bt-v5-phone-ink-visible\">@media(max-width:767px){html body.page-id-9606 #about#about .bt-ink-box>.bt-ink-svg{display:block!important}html body.page-id-9606 #about#about .bt-ink-box.bt-ink-on>.et_pb_text_inner{opacity:0!important}}<\/style><\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_4 et_pb_column et_pb_column_1_2 et-last-child et_block_column et_pb_column_empty et_pb_css_mix_blend_mode_passthrough\"><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_2 et_pb_section et_section_regular et_block_section musik-bg-video\" id=\"musik\">\r\n<div class=\"et_pb_row_4 et_pb_row et_pb_gutters1 et_block_row\">\r\n<div class=\"et_pb_column_5 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_code_12 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><!-- =========================================================\n     BAR TAUSEND \u00b7 MUSIC LOGO + EQUALIZER \u00b7 V11\n     Ersetzt: Bild-Modul \"MUSIC LOGO\" + Code-Modul \"MUSIC LOGO ANNI KLICK\"\n     - 10 breite, eckige, wei\u00dfe EQ-Balken, nur durch eine feine Linie getrennt, steigen ruhig von unten im Kreis auf\n     - \"MUSIC\" invertiert sich automatisch \u00fcber den Balken (wei\u00df auf schwarz, schwarz auf wei\u00df)\n     - Der Kreis schneidet die Balken sauber ab\n     - Mini-EQ unten links verschwindet erst, wenn Logo oder Player wirklich im Bild sind\n       (V11: sobald Logo oder Player auftauchen \u2013 die Logo-Zeile mit Abstand z\u00e4hlt nicht)\n     Logo-Bild tauschen: src unten bei class=\"btml-logo\" \u00e4ndern\n========================================================= -->\n\n<button type=\"button\" id=\"bt-music-logo\" class=\"btml\" aria-label=\"Musik starten\">\n  <span class=\"btml-stage\">\n\n    <span class=\"btml-clip\" aria-hidden=\"true\">\n      <span class=\"btml-eq\">\n        <span style=\"--m:.46;--d:.86s;--o:-.10s\"><\/span>\n        <span style=\"--m:.60;--d:.68s;--o:-.45s\"><\/span>\n        <span style=\"--m:.72;--d:.78s;--o:-.20s\"><\/span>\n        <span style=\"--m:.64;--d:.72s;--o:-.55s\"><\/span>\n        <span style=\"--m:.80;--d:.92s;--o:-.30s\"><\/span>\n        <span style=\"--m:.74;--d:.70s;--o:-.05s\"><\/span>\n        <span style=\"--m:.82;--d:.84s;--o:-.60s\"><\/span>\n        <span style=\"--m:.66;--d:.74s;--o:-.25s\"><\/span>\n        <span style=\"--m:.76;--d:.88s;--o:-.50s\"><\/span>\n        <span style=\"--m:.54;--d:.66s;--o:-.15s\"><\/span>\n      <\/span>\n    <\/span>\n\n    <picture class=\"btml-picture\">\n      <source media=\"(max-width:767px)\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-Music-Logo-300x300.png\">\n      <img loading=\"lazy\" class=\"btml-logo\"\n         src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Music-Logo-02.webp\"\n         alt=\"\" width=\"160\" height=\"160\" decoding=\"async\" draggable=\"false\">\n    <\/picture>\n  <\/span>\n<\/button>\n\n<style>\n\/* =========================================================\n   MUSIC LOGO \u00b7 V11\n========================================================= *\/\n\n#bt-music-logo {\n  --btml-size: 160px;                    \/* Logo-Breite *\/\n  --btml-inset: 14.8%;                   \/* Abstand zum Wellenring: kleiner = n\u00e4her dran (min. 14.2%) *\/\n  --btml-bar: #ffffff;                   \/* Balkenfarbe *\/\n  --btml-tempo: 1.5;                     \/* Ruhe der Bewegung: gr\u00f6\u00dfer = langsamer *\/\n  --btml-gap: 1px;                       \/* Feine Trennlinie zwischen den Balken *\/\n  --btml-shift: 22px;                    \/* Logo nach unten verschieben *\/\n  --btml-ease: cubic-bezier(.22, 1, .36, 1);\n\n  -webkit-appearance: none;\n  appearance: none;\n  display: block;\n  position: relative;\n  top: var(--btml-shift);\n  width: var(--btml-size);\n  height: var(--btml-size);\n  max-width: 100%;\n  margin: 0 auto;\n  padding: 0;\n  border: 0;\n  border-radius: 50%;\n  background: transparent;\n  color: inherit;\n  font: inherit;\n  line-height: 0;\n  cursor: pointer;\n  -webkit-tap-highlight-color: transparent;\n}\n\n#bt-music-logo:focus { outline: none; }\n\n#bt-music-logo:focus-visible {\n  outline: 2px solid rgb(234, 11, 95);\n  outline-offset: 6px;\n}\n\n\/* ---------- B\u00fchne + Hover (Soft Blur + Scale wie bisher) ---------- *\/\n\n#bt-music-logo .btml-stage {\n  display: block;\n  position: absolute;\n  inset: 0;\n  transform: scale(1);\n  transform-origin: center;\n  isolation: isolate;\n  filter: blur(0);\n  opacity: 1;\n  transition:\n    transform 850ms cubic-bezier(.16, 1, .3, 1),\n    filter 850ms cubic-bezier(.16, 1, .3, 1),\n    opacity 850ms cubic-bezier(.16, 1, .3, 1);\n  will-change: transform, filter, opacity;\n}\n\n@media (hover: hover) and (pointer: fine) {\n  #bt-music-logo:hover .btml-stage {\n    transform: scale(1.075);\n    filter: blur(1.5px);\n    opacity: .86;\n  }\n}\n\n#bt-music-logo:active .btml-stage {\n  transform: scale(1.035);\n  transition-duration: 180ms;\n}\n\n\/* ---------- Logo (oben) ---------- *\/\n\n#bt-music-logo .btml-logo {\n  display: block;\n  position: absolute;\n  z-index: 3;\n  inset: 0;\n  width: 100%;\n  height: 100%;\n  max-width: none;\n  pointer-events: none;\n  -webkit-user-select: none;\n  user-select: none;\n  -webkit-user-drag: none;\n  mix-blend-mode: difference;   \/* Schrift invertiert sich \u00fcber den hellen Balken *\/\n}\n\n\/* ---------- Kreis: schneidet die Balken sauber ab ---------- *\/\n\n#bt-music-logo .btml-clip {\n  position: absolute;\n  z-index: 1;\n  inset: var(--btml-inset);\n  border-radius: 50%;\n  overflow: hidden;\n  -webkit-mask-image: -webkit-radial-gradient(white, black);   \/* Safari: sauberer Rundschnitt *\/\n  pointer-events: none;\n}\n\n\/* ---------- Equalizer: breite Balken, steigen von unten auf ---------- *\/\n\n#bt-music-logo .btml-eq {\n  position: absolute;\n  inset: 0;\n  display: flex;\n  align-items: flex-end;\n  justify-content: space-between;\n  gap: var(--btml-gap);\n  opacity: 0;\n  transform: translateY(100%);\n  transition:\n    opacity 900ms var(--btml-ease),\n    transform 1400ms var(--btml-ease);\n}\n\n#bt-music-logo .btml-eq > span {\n  display: block;\n  flex: 1 1 0;\n  min-width: 0;\n  height: calc(var(--m) * 60%);\n  border-radius: 0;\n  background: var(--btml-bar);\n  animation-duration: calc(var(--d, .8s) * var(--btml-tempo));\n  animation-delay: calc(var(--o, 0s) * var(--btml-tempo));\n  animation-timing-function: cubic-bezier(.45, 0, .55, 1);\n  animation-iteration-count: infinite;\n  animation-play-state: paused;\n}\n\n#bt-music-logo .btml-eq > span:nth-child(3n+1) { animation-name: btmlEqA; }\n#bt-music-logo .btml-eq > span:nth-child(3n+2) { animation-name: btmlEqB; }\n#bt-music-logo .btml-eq > span:nth-child(3n)   { animation-name: btmlEqC; }\n\n@keyframes btmlEqA {\n  0%, 100% { height: calc(var(--m) * 42%); }\n  50%      { height: calc(var(--m) * 100%); }\n}\n\n@keyframes btmlEqB {\n  0%, 100% { height: calc(var(--m) * 92%); }\n  50%      { height: calc(var(--m) * 38%); }\n}\n\n@keyframes btmlEqC {\n  0%, 100% { height: calc(var(--m) * 60%); }\n  35%      { height: calc(var(--m) * 100%); }\n  70%      { height: calc(var(--m) * 30%); }\n}\n\n\/* ---------- Zustand: Musik l\u00e4uft ---------- *\/\n\n#bt-music-logo.is-playing .btml-eq {\n  opacity: 1;\n  transform: translateY(0);\n}\n\n#bt-music-logo.is-playing .btml-eq > span {\n  animation-play-state: running;\n}\n\n\/* ---------- Mini-EQ unten links: ausblenden, solange Logo\/Player im Bild ---------- *\/\n\n#bt-mini-eq-control.bt-mini-eq-away {\n  opacity: 0 !important;\n  transform: translate3d(0, 14px, 0) scale(.96) !important;\n  pointer-events: none !important;\n}\n\/* Keep the MUSIC pill geometry during its exit; audio keeps playing. *\/\n#bt-mini-eq-control.bt-mini-eq-navigation.bt-mini-eq-away {\n  opacity: 0 !important;\n  pointer-events: none !important;\n  transform: none !important;\n  transition: opacity .55s ease !important;\n}\n\n\/* ---------- Barrierefreiheit: weniger Bewegung ---------- *\/\n\n@media (prefers-reduced-motion: reduce) {\n  #bt-music-logo .btml-stage,\n  #bt-music-logo .btml-eq { transition-duration: 1ms; }\n\n  #bt-music-logo .btml-eq > span {\n    animation: none;\n    height: calc(var(--m) * 70%);\n  }\n\n  #bt-music-logo:hover .btml-stage { filter: none; }\n}\n\n\n\n\n\n\n\n\n#musik .lineup-row h2 > .bt-lu-name {\n  font-family: inherit !important;\n}\n@media (max-width: 980px) {\n  #bt-music-logo {\n    --btml-size: 140px;\n    margin-bottom: 20px;\n  }\n}\n@media (max-width: 767px) {\n  #bt-music-logo {\n    --btml-size: 120px;\n    margin-bottom: 46px;\n  }\n}\n<\/style>\n\n<script>\n\/* =========================================================\n   MUSIC LOGO \u00b7 PLAY\/PAUSE + EQ-SYNC + SOFT SCROLL + MINI-EQ AUSBLENDEN\n========================================================= *\/\n\n(function () {\n  \"use strict\";\n\n  if (window.__btMusicLogoEqV11) return;\n  window.__btMusicLogoEqV11 = true;\n\n  if (window.matchMedia('(max-width:767px)').matches) { var phoneLogo = document.getElementById('bt-music-logo'); if (phoneLogo) { phoneLogo.setAttribute('role','img'); phoneLogo.setAttribute('aria-label','Music'); phoneLogo.setAttribute('tabindex','-1'); phoneLogo.style.pointerEvents='none'; } return; } var SCROLL_MAX_MS = 1200;\n  var MINI_HIDE_RATIO = 0;      \/* Anteil von Logo\/Player im Bild, ab dem der Mini-EQ ausblendet: 0 = sobald sichtbar, 0.25 = etwas sp\u00e4ter, 1 = erst wenn ganz im Bild *\/\n  var LABEL_PLAY = \"Musik starten\";\n  var LABEL_PAUSE = \"Musik pausieren\";\n\n  var logo = null;\n  var watchedBtn = null;\n  var classObserver = null;\n  var scrollRaf = 0;\n  var stopScrollFn = null;\n  var miniAway = false;\n\n  function getPlayButton() {\n    return document.querySelector(\"#bt-player-compact .btpc-play\");\n  }\n\n  function isPlaying() {\n    var btn = getPlayButton();\n    if (!btn) return false;\n    return btn.classList.contains(\"is-playing\");\n  }\n\n  function render() {\n    if (!logo) return;\n    var playing = isPlaying();\n    logo.classList.toggle(\"is-playing\", playing);\n    logo.setAttribute(\"aria-label\", playing ? LABEL_PAUSE : LABEL_PLAY);\n  }\n\n  \/* EQ folgt dem echten Player-Status, egal wo gestartet wird *\/\n  function watchPlayer() {\n    var btn = getPlayButton();\n    if (!btn) return false;\n    if (watchedBtn === btn) return true;\n\n    if (classObserver) classObserver.disconnect();\n    classObserver = new MutationObserver(render);\n    classObserver.observe(btn, { attributes: true, attributeFilter: [\"class\"] });\n\n    watchedBtn = btn;\n    observeHideTarget(document.getElementById(\"bt-player-compact\"));\n    render();\n    return true;\n  }\n\n  function prefersReducedMotion() {\n    if (!window.matchMedia) return false;\n    return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n  }\n\n  function easeInOutCubic(t) {\n    return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) \/ 2;\n  }\n\n  \/* Weiches Sliden zum Ankerpunkt *\/\n  function softScrollTo(target) {\n    if (!target) return;\n    if (stopScrollFn) stopScrollFn();\n\n    var root = document.documentElement;\n    var margin = parseFloat(window.getComputedStyle(target).scrollMarginTop) || 0;\n    var startY = window.pageYOffset;\n    var endY = Math.max(0, target.getBoundingClientRect().top + startY - margin);\n    var dist = endY - startY;\n\n    if (Math.abs(dist) < 2) return;\n\n    if (prefersReducedMotion()) {\n      window.scrollTo(0, endY);\n      return;\n    }\n\n    var duration = Math.min(SCROLL_MAX_MS, 500 + Math.abs(dist) * 0.45);\n    var prevBehavior = root.style.scrollBehavior;\n    var t0 = null;\n\n    root.style.scrollBehavior = \"auto\";\n\n    function stop() {\n      if (scrollRaf) cancelAnimationFrame(scrollRaf);\n      scrollRaf = 0;\n      root.style.scrollBehavior = prevBehavior;\n      window.removeEventListener(\"wheel\", stop);\n      window.removeEventListener(\"touchstart\", stop);\n      stopScrollFn = null;\n    }\n\n    function step(now) {\n      if (t0 === null) t0 = now;\n      var p = Math.min(1, (now - t0) \/ duration);\n      window.scrollTo(0, startY + dist * easeInOutCubic(p));\n      if (p < 1) {\n        scrollRaf = requestAnimationFrame(step);\n      } else {\n        stop();\n      }\n    }\n\n    \/* Nutzer scrollt selbst -> Animation sofort freigeben *\/\n    window.addEventListener(\"wheel\", stop, { passive: true });\n    window.addEventListener(\"touchstart\", stop, { passive: true });\n\n    stopScrollFn = stop;\n    scrollRaf = requestAnimationFrame(step);\n  }\n\n  function onActivate(event) {\n    event.preventDefault();\n\n    var btn = getPlayButton();\n    if (btn) btn.click();\n\n    render();\n    window.setTimeout(render, 150);\n    window.setTimeout(render, 700);\n\n    softScrollTo(document.getElementById(\"musik\"));\n  }\n\n  \/* Mini-EQ unten links weich aus- und einblenden *\/\n  function setMiniAway(away) {\n    var mini = document.getElementById(\"bt-mini-eq-control\");\n    if (!mini) return;\n    if (away === miniAway && mini.classList.contains(\"bt-mini-eq-away\") === away) return;\n    miniAway = away;\n\n    mini.classList.toggle(\"bt-mini-eq-away\", away);\n\n    if (away) {\n      mini.setAttribute(\"aria-hidden\", \"true\");\n      mini.setAttribute(\"inert\", \"\");\n    } else {\n      mini.removeAttribute(\"aria-hidden\");\n      mini.removeAttribute(\"inert\");\n    }\n  }\n\n  \/* Ausblenden, sobald das Logo selbst oder der Player zu MINI_HIDE_RATIO im Bild sind.\n     Die Logo-Zeile mit ihrem Abstand z\u00e4hlt nicht mehr mit (About-Bereich bleibt frei). *\/\n  var hideIo = null;\n  var hideTargets = [];\n  var hideVisible = [];\n\n  function observeHideTarget(el) {\n    if (!hideIo || !el || hideTargets.indexOf(el) !== -1) return;\n    hideTargets.push(el);\n    hideVisible.push(false);\n    hideIo.observe(el);\n  }\n\n  function watchLogoRow() {\n    if (!(\"IntersectionObserver\" in window)) return;\n\n    hideIo = new IntersectionObserver(function (entries) {\n      entries.forEach(function (entry) {\n        var i = hideTargets.indexOf(entry.target);\n        if (i !== -1) hideVisible[i] = entry.isIntersecting && entry.intersectionRect.height > 1 && entry.intersectionRatio >= MINI_HIDE_RATIO;\n      });\n      setMiniAway(hideVisible.indexOf(true) !== -1);\n    }, { threshold: [0, 0.001, 0.25, 0.5, 0.75, 1] });\n\n    observeHideTarget(document.getElementById(\"musik\"));\n    observeHideTarget(document.getElementById(\"bt-player-compact\"));\n  }\n\n  function init() {\n    logo = document.getElementById(\"bt-music-logo\");\n    if (!logo) return;\n\n    logo.addEventListener(\"click\", onActivate);\n    render();\n\n    if (!watchPlayer()) {\n      var bodyObserver = new MutationObserver(function () {\n        if (watchPlayer()) bodyObserver.disconnect();\n      });\n      bodyObserver.observe(document.body, { childList: true, subtree: true });\n    }\n\n    window.setTimeout(watchPlayer, 600);\n    window.setTimeout(watchPlayer, 1500);\n\n    watchLogoRow();\n    document.addEventListener(\"bt:mini-eq-navigation-change\", function(){\n      setMiniAway(hideVisible.indexOf(true) !== -1);\n    });\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", init);\n  } else {\n    init();\n  }\n})();\n<\/script>\n<style id=\"bt-phone-music-still-v1\">\n@media(max-width:767px){\n #bt-music-logo .btml-clip{display:none!important;}\n #bt-music-logo .btml-logo{mix-blend-mode:normal!important;}\n}\n<\/style>\n<\/div><\/div>\r\n<div class=\"et_pb_text_7 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module\"><div class=\"et_pb_text_inner\" data-et-mv-hidden-tablet=\"true\" data-et-mv-hidden-phone=\"true\"><p class=\"bt-archiv-link\"><a class=\"bt-archiv-text\" href=\"https:\/\/tausendberlin.com\/archiv\/\">Tausend Archiv<\/a><a class=\"bt-lineup-grid\" href=\"https:\/\/tausendberlin.com\/lineup\/\" title=\"Lineup\"><span class=\"bt-sr\">Lineup<\/span><\/a><\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_code_13 et_pb_code et_animated et_pb_module\" id=\"mp3player01\"><div class=\"et_pb_code_inner\"><!-- =========================================================\n     BAR TAUSEND \u00b7 COMPACT PLAYER \u00b7 V11 (Lazy SoundCloud)\n\n     EINBAU\n     Den KOMPLETTEN Inhalt von \u201eCODE MP3 PLAYER by Sherdin\u201c\n     durch diesen Code ersetzen.\n\n     NEU IN V11\n     - SoundCloud wird NICHT mehr beim Seitenaufruf geladen\n       (Google-Test und alte Handys laden die Seite ohne SoundCloud)\n     - SoundCloud l\u00e4dt, sobald:\n       \u00b7 man auf dem Computer\/Tablet nach dem Laden die Maus bewegt,\n         scrollt, tippt oder eine Taste dr\u00fcckt\n       \u00b7 man auf Play, Vor\/Zur\u00fcck, das Logo oder den Equalizer klickt\n       \u00b7 der Player-Bereich sichtbar wird\n       \u2192 Wenn man im Musik-Bereich ankommt, ist die Setlist l\u00e4ngst da\n       \u2192 Klick vor dem Laden: Player l\u00e4dt und spielt dann los\n     - auf dem Handy (Player ausgeblendet) wird SoundCloud gar nicht geladen\n     - Optik, Zufallsstart, Floating-Player und Offline-Meldung wie V10\n\n     TEXTE \u00c4NDERN: oben im Script bei OFFLINE_DE \/ OFFLINE_EN\n     POSITION \u00c4NDERN: oben im Script bei OFFSET_X \/ OFFSET_Y\n       (minus = nach links \/ oben, plus = nach rechts \/ unten)\n\n     WICHTIG: Dieses Modul enth\u00e4lt absichtlich KEINEN Backslash.\n========================================================= -->\n\n<div id=\"bt-player-compact-wrap\"\n     data-fallback-artist=\"BAR TAUSEND\"\n     data-fallback-track=\"LIVE SETS\">\n\n  <div id=\"bt-player-compact\" class=\"btpc-player btpc-player--stand\">\n\n    <div class=\"btpc-left\">\n      <button class=\"btpc-btn btpc-prev\" type=\"button\" aria-label=\"Previous\">\u00ab<\/button>\n\n      <button class=\"btpc-play\" type=\"button\" aria-label=\"Play\/Pause\">\n        <span class=\"btpc-icon btpc-icon-play\" aria-hidden=\"true\">\n          <svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\">\n            <path d=\"M8 5v14l12-7z\"><\/path>\n          <\/svg>\n        <\/span>\n\n        <span class=\"btpc-icon btpc-icon-pause\" aria-hidden=\"true\" style=\"display:none;\">\n          <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\">\n            <path d=\"M7 5h4v14H7zM13 5h4v14h-4z\"><\/path>\n          <\/svg>\n        <\/span>\n      <\/button>\n\n      <button class=\"btpc-btn btpc-next\" type=\"button\" aria-label=\"Next\">\u00bb<\/button>\n    <\/div>\n\n    <div class=\"btpc-meta\">\n      <div class=\"btpc-artist\">BAR TAUSEND<\/div>\n      <div class=\"btpc-track\">LIVE SETS<\/div>\n\n      <a class=\"btpc-sc-link\"\n         href=\"https:\/\/soundcloud.com\/bartausend\/sets\/bar-tausend-live-sets\"\n         target=\"_blank\"\n         rel=\"noopener noreferrer\"\n         aria-label=\"Open Bar Tausend Playlist on SoundCloud\">\n         SOUNDCLOUD\n      <\/a>\n    <\/div>\n\n    <iframe\n      id=\"btpc-sc-widget\"\n      title=\"SoundCloud Player\"\n      allow=\"autoplay; encrypted-media\"\n      scrolling=\"no\"\n      frameborder=\"no\"\n      data-src=\"https:\/\/w.soundcloud.com\/player\/?url=https%3A\/\/soundcloud.com\/bartausend\/sets\/bar-tausend-live-sets&auto_play=false&hide_related=true&show_comments=false&show_user=false&show_reposts=false&visual=false\">\n    <\/iframe>\n\n  <\/div>\n<\/div>\n\n\n<style>\n\n#bt-player-compact-wrap{\n  position:relative;\n  z-index:20;\n  opacity:0;\n  visibility:hidden;\n  transition:opacity .9s ease;\n}\n\n\/* SoundCloud noch nicht bereit \/ gest\u00f6rt: Kn\u00f6pfe ruhig zur\u00fcckgenommen *\/\n.btpc-player.btpc-waiting .btpc-btn,\n.btpc-player.btpc-waiting .btpc-play{\n  opacity:.35 !important;\n  cursor:progress !important;\n}\n.btpc-player .btpc-track{\n  transition:opacity .45s ease;\n}\n.btpc-player.btpc-swap .btpc-track{\n  opacity:0 !important;\n}\n\n.btpc-player{\n  max-width:520px;\n  width:100%;\n  margin:0 auto;\n  padding:14px 16px;\n  display:flex;\n  align-items:center;\n  gap:14px;\n  color:#464646;\n  position:relative;\n  z-index:20;\n  box-sizing:border-box;\n}\n\n.btpc-left{\n  display:flex;\n  align-items:center;\n  gap:10px;\n  flex:0 0 auto;\n}\n\n.btpc-btn{\n  width:34px;\n  height:34px;\n  border-radius:999px;\n  border:1px solid rgba(203,203,203,.35);\n  background:transparent;\n  color:#595959;\n  display:grid;\n  place-items:center;\n  cursor:pointer;\n  font-size:18px;\n  line-height:1;\n  opacity:.85;\n  padding:0;\n}\n\n.btpc-play{\n  width:56px;\n  height:56px;\n  border-radius:999px;\n  border:0;\n  background:#464646;\n  color:#121212;\n  cursor:pointer;\n  display:grid;\n  place-items:center;\n  padding:0;\n  line-height:1;\n  position:relative;\n  flex:0 0 auto;\n}\n\n.btpc-icon{\n  display:grid;\n  place-items:center;\n  width:100%;\n  height:100%;\n}\n\n.btpc-icon-play svg,\n.btpc-icon-pause svg{\n  display:block;\n  fill:currentColor;\n}\n\n.btpc-icon-play svg{\n  transform:translateX(1px);\n}\n\n.btpc-meta{\n  display:flex !important;\n  flex-direction:column;\n  min-width:0 !important;\n  flex:1 1 auto !important;\n  width:auto !important;\n  overflow:hidden;\n}\n\n.btpc-artist{\n  display:block !important;\n  visibility:visible !important;\n  font-size:12px;\n  letter-spacing:.12em;\n  text-transform:uppercase;\n  color:#464646 !important;\n  opacity:.9 !important;\n  white-space:nowrap;\n  overflow:hidden;\n  text-overflow:ellipsis;\n  margin-bottom:3px !important;\n  line-height:1.2;\n}\n\n.btpc-track{\n  display:block !important;\n  visibility:visible !important;\n  font-size:16px;\n  letter-spacing:0;\n  text-transform:uppercase;\n  color:#464646 !important;\n  opacity:1 !important;\n  white-space:nowrap;\n  overflow:hidden;\n  text-overflow:ellipsis;\n  line-height:1.2;\n}\n\n.btpc-sc-link{\n  display:inline-block;\n  font-size:10px;\n  letter-spacing:.2em;\n  text-transform:uppercase;\n  text-decoration:none;\n  color:#ea0b5f;\n  opacity:1;\n  margin-top:3px;\n  margin-left:2px;\n  line-height:1.1;\n  transition:color .75s ease, opacity .75s ease;\n}\n\n.btpc-sc-link:hover{\n  color:#ebebeb;\n  opacity:1;\n}\n\n.btpc-btn,\n.btpc-play{\n  transition:\n    background-color .75s ease,\n    border-color .75s ease,\n    color .75s ease,\n    transform .75s ease,\n    box-shadow .75s ease,\n    opacity .75s ease;\n}\n\n.btpc-btn:hover{\n  border-color:#ea0b5f;\n  color:#ea0b5f;\n  box-shadow:0 0 12px rgba(234,11,95,.25);\n  transform:translateY(-1px);\n}\n\n.btpc-play:hover{\n  background:#ea0b5f;\n  color:#464646;\n  box-shadow:0 8px 20px rgba(234,11,95,.35);\n  transform:scale(1.05);\n}\n\n.btpc-play.is-playing{\n  background:#ea0b5f !important;\n  color:#121212 !important;\n  transform:none !important;\n  animation:btpc-breathe 4.8s ease-in-out infinite !important;\n}\n\n.btpc-play.is-playing:hover{\n  background:#ea0b5f !important;\n  color:#121212 !important;\n}\n\n@keyframes btpc-breathe{\n  0%{\n    box-shadow:\n      0 0 6px rgba(234,11,95,.18),\n      0 0 14px rgba(234,11,95,.10);\n  }\n\n  50%{\n    box-shadow:\n      0 0 16px rgba(234,11,95,.35),\n      0 0 36px rgba(234,11,95,.18);\n  }\n\n  100%{\n    box-shadow:\n      0 0 6px rgba(234,11,95,.18),\n      0 0 14px rgba(234,11,95,.10);\n  }\n}\n\n#btpc-sc-widget{\n  position:absolute;\n  width:1px;\n  height:1px;\n  opacity:0;\n  pointer-events:none;\n  left:-9999px;\n  top:0;\n  border:0;\n}\n\n#btpc-stand-host{\n  position:absolute;\n  z-index:30;\n  pointer-events:none;\n  min-width:520px;\n  max-width:520px;\n}\n\n#btpc-stand-host #bt-player-compact-wrap{\n  position:relative !important;\n  z-index:30 !important;\n  width:100% !important;\n  pointer-events:auto !important;\n}\n\n#btpc-stand-host #bt-player-compact{\n  width:520px !important;\n  max-width:520px !important;\n  min-width:520px !important;\n  margin:0 auto !important;\n  box-sizing:border-box !important;\n}\n\n#btpc-stand-placeholder{\n  display:block;\n  width:100%;\n  min-height:1px;\n  pointer-events:none;\n}\n\n#btpc-floating-host{\n  position:fixed;\n  left:50%;\n  bottom:20px;\n  transform:translateX(-50%);\n  width:min(520px, calc(100vw - 24px));\n  z-index:2147483647 !important;\n  pointer-events:none;\n}\n\n#btpc-floating-host.is-visible{\n  pointer-events:auto;\n}\n\n#btpc-floating-player{\n  width:100%;\n  margin:0;\n  background:rgba(0,0,0,.20);\n  backdrop-filter:blur(14px);\n  -webkit-backdrop-filter:blur(14px);\n  border:1px solid rgba(234,11,95,.16);\n  border-radius:18px;\n  box-shadow:\n    0 12px 40px rgba(0,0,0,.30),\n    0 0 24px rgba(234,11,95,.08);\n\n  opacity:0;\n  transform:translateY(42px);\n\n  transition:\n    opacity .70s ease,\n    transform .70s cubic-bezier(.22,1,.36,1),\n    background-color .70s ease,\n    border-color .70s ease,\n    box-shadow .70s ease;\n\n  will-change:transform, opacity;\n}\n\n#btpc-floating-host.is-visible #btpc-floating-player{\n  opacity:1;\n  transform:translateY(0);\n}\n\n#btpc-floating-host.is-hiding #btpc-floating-player{\n  opacity:0;\n  transform:translateY(42px);\n}\n\n@media (max-width:767px){\n\n  .btpc-player{\n    gap:12px;\n    padding:12px 14px;\n  }\n\n  .btpc-play{\n    width:52px;\n    height:52px;\n  }\n\n  .btpc-track{\n    font-size:16px;\n  }\n\n  #btpc-floating-host{\n    width:calc(100vw - 20px);\n    bottom:14px;\n  }\n\n  #bt-player-compact-wrap,\n  #btpc-stand-host,\n  #btpc-floating-host,\n  #btpc-stand-placeholder{\n    display:none !important;\n    visibility:hidden !important;\n    opacity:0 !important;\n    pointer-events:none !important;\n    height:0 !important;\n    min-height:0 !important;\n    max-height:0 !important;\n    margin:0 !important;\n    padding:0 !important;\n    overflow:hidden !important;\n  }\n}\n\n<\/style>\n\n\n<script>\n(() => {\n  if(document.documentElement.classList.contains('bt-phone-sound-off')) return;\n\n  if(window.__btCompactPlayerV11 || window.__btCompactPlayerV10) return;\n  window.__btCompactPlayerV11 = true;\n  window.__btCompactPlayerV10 = true;\n  window.__btCompactPlayerRandomStartV9 = true;\n\n  \/* Text in der Titelzeile, wenn SoundCloud nicht antwortet *\/\n  const OFFLINE_DE = \"SOUNDCLOUD MACHT GERADE PAUSE\";\n  const OFFLINE_EN = \"SOUNDCLOUD IS TAKING A BREAK\";\n\n  \/* Feinposition des Players (px): minus = links \/ oben, plus = rechts \/ unten *\/\n  const OFFSET_X = -20;\n  const OFFSET_Y = 11;\n\n  \/* nach wie vielen Sekunden ohne Antwort die Meldung kommt *\/\n  const OFFLINE_AFTER_MS = 10000;\n  \/* wie oft im Hintergrund neu versucht wird (Abstand \/ Anzahl) *\/\n  const RETRY_MS = 45000;\n  const RETRY_MAX = 8;\n\n  const isEN =\n    \/^en\/i.test(document.documentElement.lang || \"\") ||\n    location.pathname.indexOf(\"\/en\/\") === 0 ||\n    location.pathname === \"\/en\";\n\n  let sounds = [];\n  let playerVisible = false;\n\n  \/*\n   * NUR daf\u00fcr da, das k\u00fcnstliche PLAY beim\n   * zuf\u00e4lligen Starttrack zu ignorieren.\n   *\/\n  let selectingStartTrack = true;\n\n  const standWrap   = document.getElementById(\"bt-player-compact-wrap\");\n  const standPlayer = document.getElementById(\"bt-player-compact\");\n  const iframe      = document.getElementById(\"btpc-sc-widget\");\n\n  if(\n    !standWrap ||\n    !standPlayer ||\n    !iframe\n  ){\n    return;\n  }\n\n  let widget = null;\n\n  \/* Lazy-Load-Zustand *\/\n  const API_URL = \"https:\/\/w.soundcloud.com\/player\/api.js\";\n  let loadStarted = false;\n  let pendingPlay = false;\n\n  const playlistUrl =\n    \"https:\/\/soundcloud.com\/bartausend\/sets\/bar-tausend-live-sets\";\n\n  const fallbackArtist =\n    (standWrap.dataset.fallbackArtist || \"BAR TAUSEND\").toUpperCase();\n\n  const fallbackTrack =\n    (standWrap.dataset.fallbackTrack || \"LIVE SETS\").toUpperCase();\n\n\n  const placeholder = document.createElement(\"div\");\n  placeholder.id = \"btpc-stand-placeholder\";\n  standWrap.parentNode.insertBefore(placeholder, standWrap);\n\n  const standHost = document.createElement(\"div\");\n  standHost.id = \"btpc-stand-host\";\n  document.body.appendChild(standHost);\n  standHost.appendChild(standWrap);\n\n  standWrap.style.margin = \"0\";\n  standWrap.style.width = \"100%\";\n  standWrap.style.pointerEvents = \"auto\";\n\n\n  function syncStandHost(){\n  if(!playerShown()) return;\n  const parent = placeholder.parentElement;\n  const rect = parent ? parent.getBoundingClientRect() : placeholder.getBoundingClientRect();\n  const topRect = placeholder.getBoundingClientRect();\n  const docY = window.pageYOffset || document.documentElement.scrollTop || 0;\n  const docX = window.pageXOffset || document.documentElement.scrollLeft || 0;\n  const h = standWrap.offsetHeight + \"px\";\n  const l = (rect.left + docX + OFFSET_X) + \"px\";\n  const t = (topRect.top + docY + OFFSET_Y) + \"px\";\n  const w = rect.width + \"px\";\n  if(placeholder.style.height !== h) placeholder.style.height = h;\n  if(standHost.style.left !== l) standHost.style.left = l;\n  if(standHost.style.top !== t) standHost.style.top = t;\n  if(standHost.style.width !== w) standHost.style.width = w;\n}\n\n  const floatingHost = document.createElement(\"div\");\n  floatingHost.id = \"btpc-floating-host\";\n\n  const floatingPlayer = standPlayer.cloneNode(true);\n  floatingPlayer.id = \"btpc-floating-player\";\n\n  const floatingIframe =\n    floatingPlayer.querySelector(\"#btpc-sc-widget\");\n\n  if(floatingIframe){\n    floatingIframe.remove();\n  }\n\n  floatingHost.appendChild(floatingPlayer);\n  document.body.appendChild(floatingHost);\n\n\n  function collectRefs(){\n\n    return [standPlayer, floatingPlayer].map(player => ({\n\n      btnPlay:\n        player.querySelector(\".btpc-play\"),\n\n      btnPrev:\n        player.querySelector(\".btpc-prev\"),\n\n      btnNext:\n        player.querySelector(\".btpc-next\"),\n\n      scLink:\n        player.querySelector(\".btpc-sc-link\"),\n\n      iconPlay:\n        player.querySelector(\".btpc-icon-play\"),\n\n      iconPause:\n        player.querySelector(\".btpc-icon-pause\"),\n\n      artist:\n        player.querySelector(\".btpc-artist\"),\n\n      track:\n        player.querySelector(\".btpc-track\"),\n\n      meta:\n        player.querySelector(\".btpc-meta\")\n    }));\n  }\n\n\n  const refs = collectRefs();\n\n  \/* Shared seek timeline: compact and floating player use the active SoundCloud widget. *\/\n  const btTimeline = (() => {\n    const states = new WeakMap();\n    const controls = [];\n    let active = null, preview = null;\n    const clean = n => Number.isFinite(Number(n)) ? Math.max(0, Number(n)) : 0;\n    const clock = ms => {\n      const seconds = Math.floor(clean(ms) \/ 1000);\n      const h = Math.floor(seconds \/ 3600), m = Math.floor(seconds \/ 60) % 60, s = seconds % 60;\n      return (h ? h + \":\" + String(m).padStart(2, \"0\") : String(m)) + \":\" + String(s).padStart(2, \"0\");\n    };\n    function text(el, value) {\n      if (el.textContent === value && el.firstElementChild) return;\n      const chars = Array.from(value);\n      if (el.children.length !== chars.length) {\n        const cells = chars.map(char => {\n          const cell = document.createElement(\"span\");\n          cell.className = char === \":\" ? \"btpc-time-separator\" : \"btpc-time-digit\";\n          cell.textContent = char;\n          return cell;\n        });\n        el.replaceChildren(...cells);\n        return;\n      }\n      chars.forEach((char, index) => {\n        const cell = el.children[index];\n        const kind = char === \":\" ? \"btpc-time-separator\" : \"btpc-time-digit\";\n        if (cell.className !== kind) cell.className = kind;\n        if (cell.textContent !== char) cell.textContent = char;\n      });\n    }\n    function attr(el, key, value) { if (el.getAttribute(key) !== value) el.setAttribute(key, value); }\n    function paint() {\n      if (document.hidden) return;\n      const state = active && states.get(active);\n      const duration = state ? state.duration : 0;\n      const position = Math.min(duration, preview && preview.widget === active ? preview.position : state ? state.position : 0);\n      const fraction = duration ? Math.min(1, position \/ duration) : 0;\n      const value = String(Math.round(fraction * 1000));\n      const progress = (fraction * 100).toFixed(3) + \"%\";\n      controls.forEach(control => {\n        control.row.classList.toggle(\"is-playing\", !!(state && state.playing));\n        control.range.disabled = !duration;\n        if (control.range.value !== value) control.range.value = value;\n        if (control.range.style.getPropertyValue(\"--btpc-progress\") !== progress) control.range.style.setProperty(\"--btpc-progress\", progress);\n        text(control.elapsed, clock(position));\n        text(control.total, duration ? clock(duration) : \"\u2013:\u2013\u2013\");\n        attr(control.range, \"aria-valuetext\", clock(position) + (isEN ? \" of \" : \" von \") + (duration ? clock(duration) : isEN ? \"unknown duration\" : \"unbekannter Dauer\"));\n      });\n    }\n    function track(state, sound) {\n      if (!sound) return;\n      const key = String(sound.id || sound.permalink_url || sound.title || \"\");\n      if (key && key !== state.key) {\n        state.key = key; state.version++; state.position = 0; state.duration = 0;\n        if (preview && preview.widget === state.widget) preview = null;\n      }\n      if (clean(sound.duration)) state.duration = clean(sound.duration);\n    }\n    function refresh(state) {\n      const wd = state.widget;\n      try {\n        wd.getCurrentSound(sound => {\n          track(state, sound);\n          const version = state.version;\n          try { wd.getDuration(duration => { if (version !== state.version) return; state.duration = clean(duration); if (active === wd) paint(); }); } catch (_) {}\n          try { wd.getPosition(position => { if (version !== state.version) return; state.position = clean(position); if (active === wd) paint(); }); } catch (_) {}\n          if (active === wd) paint();\n        });\n      } catch (_) {}\n    }\n    function watch(wd) {\n      let state = states.get(wd);\n      if (state) return state;\n      state = {widget:wd, key:\"\", version:0, duration:0, position:0, playing:false};\n      states.set(wd, state);\n      const E = SC.Widget.Events;\n      wd.bind(E.READY, () => refresh(state));\n      wd.bind(E.PLAY, () => { state.playing = true; refresh(state); if (active === wd) paint(); });\n      wd.bind(E.PAUSE, () => { state.playing = false; if (active === wd) paint(); });\n      wd.bind(E.FINISH, () => { state.playing = false; state.position = state.duration; if (active === wd) paint(); });\n      function progress(event) {\n        state.position = clean(event.currentPosition);\n        if (!state.duration && event.relativePosition > 0) state.duration = state.position \/ event.relativePosition;\n        if (active === wd) paint();\n      }\n      wd.bind(E.PLAY_PROGRESS, progress);\n      wd.bind(E.SEEK, progress);\n      return state;\n    }\n    function use(wd, playing, sound) {\n      if (!wd) { active = null; preview = null; paint(); return; }\n      const changed = active !== wd;\n      const state = watch(wd);\n      if (sound) track(state, sound);\n      if (changed) preview = null;\n      active = wd; state.playing = !!playing;\n      paint();\n      if (changed) refresh(state);\n    }\n    [standPlayer, floatingPlayer].forEach(player => {\n      const meta = player.querySelector(\".btpc-meta\"), title = player.querySelector(\".btpc-track\");\n      if (!meta || !title) return;\n      const row = document.createElement(\"div\"); row.className = \"btpc-timeline\";\n      const eq = document.createElement(\"span\"); eq.className = \"btpc-timeline-eq\"; eq.setAttribute(\"aria-hidden\", \"true\");\n      for (let n = 0; n < 4; n++) eq.appendChild(document.createElement(\"i\"));\n      const elapsed = document.createElement(\"span\"); elapsed.className = \"btpc-time\"; elapsed.setAttribute(\"aria-hidden\", \"true\");\n      const range = document.createElement(\"input\"); range.className = \"btpc-seek\"; range.type = \"range\";\n      range.min = \"0\"; range.max = \"1000\"; range.step = \"1\"; range.value = \"0\"; range.disabled = true;\n      range.setAttribute(\"aria-label\", isEN ? \"Track position\" : \"Wiedergabeposition\");\n      const total = document.createElement(\"span\"); total.className = \"btpc-time\"; total.setAttribute(\"aria-hidden\", \"true\");\n      row.append(eq, elapsed, range, total); title.insertAdjacentElement(\"afterend\", row);\n      const control = {row, range, elapsed, total}; controls.push(control);\n      range.addEventListener(\"input\", () => {\n        const state = active && states.get(active); if (!state || !state.duration) return;\n        control.inputWidget = active;\n        preview = {widget:active, position:state.duration * Number(range.value) \/ 1000}; paint();\n      });\n      range.addEventListener(\"change\", () => {\n        const state = active && states.get(active);\n        if (!state || !state.duration || control.inputWidget && control.inputWidget !== active || preview && preview.widget !== active) { control.inputWidget = null; preview = null; paint(); return; }\n        const position = preview ? preview.position : state.duration * Number(range.value) \/ 1000;\n        control.inputWidget = null; preview = null; state.version++;\n        try { active.seekTo(position); state.position = position; } catch (_) {}\n        paint();\n      });\n      range.addEventListener(\"pointercancel\", () => { control.inputWidget = null; preview = null; paint(); });\n    });\n    document.addEventListener(\"visibilitychange\", () => { if (!document.hidden) { if (active) refresh(states.get(active)); paint(); } });\n    paint();\n    return {use, useBase(playing) { use(widget, playing); }, track(wd, sound) { if (!wd) return; const state = watch(wd); track(state, sound); if (active === wd) paint(); }};\n  })();\n  window.btPlayerTimeline = btTimeline;\n\n\n  let isPlaying = false;\n  let isReady = false;\n  let floatingMounted = false;\n  let hideTimer = null;\n  let ticking = false;\n\n\n  \/* ---------- Zustand: wartet \/ gest\u00f6rt \/ bereit ---------- *\/\n  let offlineTimer = null;\n  let retryTimer = null;\n  let retries = 0;\n  let isOffline = false;\n\n  function players(){\n    return [standPlayer, floatingPlayer];\n  }\n\n  function setWaiting(on){\n    players().forEach(p => {\n      p.classList.toggle(\"btpc-waiting\", on);\n      p.setAttribute(\"aria-busy\", on ? \"true\" : \"false\");\n    });\n  }\n\n  function swapTrackText(text){\n    players().forEach(p => p.classList.add(\"btpc-swap\"));\n    setTimeout(() => {\n      refs.forEach(ref => {\n        if(ref.track) ref.track.textContent = text;\n      });\n      players().forEach(p => p.classList.remove(\"btpc-swap\"));\n    }, 450);\n  }\n\n  function showOffline(){\n    if(isReady || isOffline) return;\n    isOffline = true;\n    swapTrackText(isEN ? OFFLINE_EN : OFFLINE_DE);\n    scheduleRetry();\n  }\n\n  function scheduleRetry(){\n    if(isReady || retries >= RETRY_MAX) return;\n    clearTimeout(retryTimer);\n    retryTimer = setTimeout(() => {\n      if(isReady) return;\n      retries++;\n      try{\n        if(!widget){\n          \/* api.js kam nicht an: noch einmal laden *\/\n          loadStarted = false;\n          startLoading();\n        }else{\n          \/* SoundCloud im Hintergrund neu laden *\/\n          const src = iframe.getAttribute(\"src\");\n          if(src) iframe.setAttribute(\"src\", src);\n        }\n      }catch(err){}\n      scheduleRetry();\n    }, RETRY_MS);\n  }\n\n  function forcePlaylistLinks(){\n\n    refs.forEach(ref => {\n\n      if(!ref.scLink) return;\n\n      ref.scLink.href = playlistUrl;\n      ref.scLink.target = \"_blank\";\n      ref.scLink.rel = \"noopener noreferrer\";\n\n      ref.scLink.setAttribute(\n        \"aria-label\",\n        \"Open Bar Tausend Playlist on SoundCloud\"\n      );\n    });\n  }\n\n\n  function applyMeta(artistText, trackText){\n\n    refs.forEach(ref => {\n\n      if(ref.meta){\n        ref.meta.style.display = \"flex\";\n        ref.meta.style.visibility = \"visible\";\n        ref.meta.style.opacity = \"1\";\n      }\n\n      if(ref.artist){\n        ref.artist.textContent =\n          artistText || fallbackArtist;\n      }\n\n      if(ref.track){\n        ref.track.textContent =\n          trackText || fallbackTrack;\n      }\n    });\n\n    forcePlaylistLinks();\n  }\n\n\n  function updateMeta(sound){\n    if(sound && widget) btTimeline.track(widget, sound);\n\n    if(!sound){\n      applyMeta(\n        fallbackArtist,\n        fallbackTrack\n      );\n      return;\n    }\n\n    const artist =\n      sound.user &&\n      sound.user.username\n        ? String(sound.user.username).toUpperCase()\n        : fallbackArtist;\n\n    const title =\n      sound.title\n        ? String(sound.title).toUpperCase()\n        : fallbackTrack;\n\n    applyMeta(\n      artist,\n      title\n    );\n  }\n\n\n  function refreshMeta(){\n\n    try{\n\n      widget.getCurrentSound(sound => {\n\n        if(sound){\n          updateMeta(sound);\n        }else{\n          applyMeta(\n            fallbackArtist,\n            fallbackTrack\n          );\n        }\n\n      });\n\n    }catch(err){\n\n      applyMeta(\n        fallbackArtist,\n        fallbackTrack\n      );\n    }\n  }\n\n\n  function refreshMetaSequence(){\n\n    refreshMeta();\n\n    setTimeout(refreshMeta,120);\n    setTimeout(refreshMeta,260);\n    setTimeout(refreshMeta,520);\n    setTimeout(refreshMeta,900);\n  }\n\n\n  function setUI(play){\n\n    isPlaying = !!play;\n    if(!standPlayer.classList.contains(\"bt-lsb-on\")) btTimeline.use(widget, isPlaying);\n\n    refs.forEach(ref => {\n\n      if(ref.iconPlay){\n        ref.iconPlay.style.display =\n          isPlaying ? \"none\" : \"grid\";\n      }\n\n      if(ref.iconPause){\n        ref.iconPause.style.display =\n          isPlaying ? \"grid\" : \"none\";\n      }\n\n      if(ref.btnPlay){\n        ref.btnPlay.classList.toggle(\n          \"is-playing\",\n          isPlaying\n        );\n      }\n    });\n\n    updateFloatingState();\n  }\n\n\n  \/* =========================================================\n     ZUFALLSGENERATOR\n  ========================================================= *\/\n\n  function randomIndex(){\n\n    if(!sounds.length){\n      return 0;\n    }\n\n    return Math.floor(\n      Math.random() * sounds.length\n    );\n  }\n\n\n  function playRandomTrack(){\n\n    if(!isReady) return;\n\n    const nextIndex =\n      randomIndex();\n\n    try{\n\n      widget.skip(nextIndex);\n\n      setTimeout(() => {\n\n        widget.play();\n        refreshMetaSequence();\n\n      },180);\n\n    }catch(err){\n\n      widget.next();\n\n      setTimeout(() => {\n        widget.play();\n      },180);\n\n      refreshMetaSequence();\n    }\n  }\n\n\n  function isStandPlayerInViewport(){\n\n    const rect =\n      placeholder.getBoundingClientRect();\n\n    const vh =\n      window.innerHeight ||\n      document.documentElement.clientHeight;\n\n    return (\n      rect.bottom > 0 &&\n      rect.top < vh\n    );\n  }\n\n\n  function showFloating(){\n\n    if(!playerVisible) return;\n\n    if(hideTimer){\n      clearTimeout(hideTimer);\n      hideTimer = null;\n    }\n\n    floatingHost.classList.remove(\n      \"is-hiding\"\n    );\n\n    floatingMounted = true;\n\n    requestAnimationFrame(() => {\n\n      floatingHost.classList.add(\n        \"is-visible\"\n      );\n\n    });\n  }\n\n\n  function hideFloating(){\n\n    floatingHost.classList.remove(\n      \"is-visible\"\n    );\n\n    if(!floatingMounted){\n\n      floatingHost.classList.remove(\n        \"is-hiding\"\n      );\n\n      return;\n    }\n\n    floatingHost.classList.add(\n      \"is-hiding\"\n    );\n\n    if(hideTimer){\n      clearTimeout(hideTimer);\n    }\n\n    hideTimer = setTimeout(() => {\n\n      floatingHost.classList.remove(\n        \"is-hiding\"\n      );\n\n      floatingMounted = false;\n\n    },720);\n  }\n\n\n  function updateFloatingState(){\n\n    if(!playerVisible){\n\n      hideFloating();\n      return;\n    }\n\n    const shouldShow =\n      isPlaying &&\n      !isStandPlayerInViewport();\n\n    if(shouldShow){\n      showFloating();\n    }else{\n      hideFloating();\n    }\n  }\n\n\n  function revealPlayer(){\n\n    playerVisible = true;\n\n    standWrap.style.opacity = \"1\";\n    standWrap.style.visibility = \"visible\";\n\n    updateFloatingState();\n  }\n\n\n  function safeBlur(el){\n\n    if(\n      !el ||\n      typeof el.blur !== \"function\"\n    ){\n      return;\n    }\n\n    requestAnimationFrame(() => {\n\n      try{\n        el.blur();\n      }catch(err){}\n\n    });\n  }\n\n\n  function bindControls(ref){\n\n    if(ref.btnPlay){\n\n      ref.btnPlay.addEventListener(\n        \"click\",\n        () => {\n\n          if(!isReady){\n            requestPlay();\n            return;\n          }\n\n          if(isPlaying){\n            widget.pause();\n          }else{\n            widget.play();\n          }\n\n          safeBlur(\n            ref.btnPlay\n          );\n        }\n      );\n    }\n\n\n    if(ref.btnPrev){\n\n      ref.btnPrev.addEventListener(\n        \"click\",\n        () => {\n\n          if(!isReady){\n            requestPlay();\n            return;\n          }\n\n          playRandomTrack();\n\n          safeBlur(\n            ref.btnPrev\n          );\n        }\n      );\n    }\n\n\n    if(ref.btnNext){\n\n      ref.btnNext.addEventListener(\n        \"click\",\n        () => {\n\n          if(!isReady){\n            requestPlay();\n            return;\n          }\n\n          playRandomTrack();\n\n          safeBlur(\n            ref.btnNext\n          );\n        }\n      );\n    }\n\n\n    if(ref.scLink){\n\n      ref.scLink.addEventListener(\n        \"click\",\n        () => {\n\n          forcePlaylistLinks();\n\n          safeBlur(\n            ref.scLink\n          );\n        }\n      );\n    }\n  }\n\n\n  refs.forEach(\n    bindControls\n  );\n\n\n  \/* =========================================================\n     SOUNDCLOUD READY\n  ========================================================= *\/\n\n  function bindWidget(){\n\n  widget.bind(\n    SC.Widget.Events.READY,\n    () => {\n\n      isReady = true;\n\n      clearTimeout(offlineTimer);\n      clearTimeout(retryTimer);\n      isOffline = false;\n      setWaiting(false);\n\n      \/*\n       * Genau wie dein urspr\u00fcnglicher Code:\n       * Der normale Player wird sichtbar.\n       *\/\n      applyMeta(\n        fallbackArtist,\n        fallbackTrack\n      );\n\n      forcePlaylistLinks();\n\n      revealPlayer();\n\n      syncStandHost();\n\n      updateFloatingState();\n\n\n      \/*\n       * Jetzt komplette Playlist holen.\n       *\/\n      try{\n\n        widget.getSounds(list => {\n\n          sounds =\n            Array.isArray(list)\n              ? list\n              : [];\n\n\n          \/*\n           * Wenn SoundCloud keine Liste liefert,\n           * bleibt alles trotzdem sichtbar.\n           *\/\n          if(!sounds.length){\n\n            selectingStartTrack = false;\n\n            if(pendingPlay){\n              pendingPlay = false;\n              widget.play();\n            }\n\n            refreshMetaSequence();\n\n            return;\n          }\n\n\n          \/*\n           * Zuf\u00e4lliger Starttrack\n           *\/\n          const startIndex =\n            randomIndex();\n\n\n          try{\n\n            widget.skip(\n              startIndex\n            );\n\n\n            setTimeout(() => {\n\n              \/*\n               * Wurde vor dem Laden schon Play gedr\u00fcckt\n               * (Play, Logo, Equalizer): jetzt losspielen.\n               *\/\n              if(pendingPlay){\n                pendingPlay = false;\n                selectingStartTrack = false;\n                widget.play();\n                setUI(true);\n                refreshMetaSequence();\n                return;\n              }\n\n              \/*\n               * Starttrack bleibt PAUSIERT.\n               *\/\n              widget.pause();\n\n              isPlaying = false;\n\n\n              refs.forEach(ref => {\n\n                if(ref.iconPlay){\n                  ref.iconPlay.style.display = \"grid\";\n                }\n\n                if(ref.iconPause){\n                  ref.iconPause.style.display = \"none\";\n                }\n\n                if(ref.btnPlay){\n                  ref.btnPlay.classList.remove(\n                    \"is-playing\"\n                  );\n                }\n\n              });\n\n\n              \/*\n               * Zufallsstart ist fertig.\n               *\/\n              selectingStartTrack = false;\n\n              refreshMetaSequence();\n\n              updateFloatingState();\n\n            },350);\n\n\n          }catch(err){\n\n            selectingStartTrack = false;\n\n            if(pendingPlay){\n              pendingPlay = false;\n              widget.play();\n            }\n\n            refreshMetaSequence();\n          }\n\n        });\n\n\n      }catch(err){\n\n        selectingStartTrack = false;\n\n        refreshMetaSequence();\n      }\n\n    }\n  );\n\n\n  \/* =========================================================\n     PLAY\n  ========================================================= *\/\n\n  widget.bind(\n    SC.Widget.Events.PLAY,\n    () => {\n\n      \/*\n       * WICHTIG:\n       *\n       * SoundCloud kann beim widget.skip()\n       * kurz PLAY melden.\n       *\n       * Genau dieses k\u00fcnstliche Start-PLAY\n       * ignorieren wir.\n       *\n       * Der normale Player bleibt sichtbar.\n       * Der Floating Player bleibt geschlossen.\n       *\/\n      if(selectingStartTrack){\n        return;\n      }\n\n      setUI(true);\n\n      refreshMetaSequence();\n    }\n  );\n\n\n  widget.bind(\n    SC.Widget.Events.PAUSE,\n    () => {\n\n      if(selectingStartTrack){\n        return;\n      }\n\n      setUI(false);\n\n      refreshMetaSequence();\n    }\n  );\n\n\n  widget.bind(\n    SC.Widget.Events.FINISH,\n    () => {\n\n      if(selectingStartTrack){\n        return;\n      }\n\n      setTimeout(\n        playRandomTrack,\n        180\n      );\n    }\n  );\n\n\n  }\n  \/* Ende bindWidget *\/\n\n\n  function onScrollResize(){\n  if(!playerShown()) return;\n  if(ticking) return;\n  ticking = true;\n  requestAnimationFrame(() => {\n    updateFloatingState();\n    syncStandHost();\n    ticking = false;\n  });\n}\n\n  window.addEventListener(\n    \"scroll\",\n    onScrollResize,\n    {\n      passive:true\n    }\n  );\n\n  window.addEventListener(\n    \"resize\",\n    onScrollResize\n  );\n\n  window.addEventListener(\n    \"orientationchange\",\n    onScrollResize\n  );\n\n  document.addEventListener(\n    \"visibilitychange\",\n    onScrollResize\n  );\n\n\n  applyMeta(\n    fallbackArtist,\n    fallbackTrack\n  );\n\n  forcePlaylistLinks();\n\n\n  requestAnimationFrame(\n    syncStandHost\n  );\n\n  setTimeout(\n    syncStandHost,\n    0\n  );\n\n  setTimeout(\n    syncStandHost,\n    120\n  );\n\n  setTimeout(\n    syncStandHost,\n    400\n  );\n\n  setTimeout(\n    syncStandHost,\n    900\n  );\n\n\n  \/* Player sofort zeigen (SoundCloud kommt erst bei Bedarf) *\/\n\n  function revealEarly(){\n    if(playerVisible) return;\n    syncStandHost();\n    revealPlayer();\n  }\n  if(document.readyState === \"complete\"){\n    setTimeout(revealEarly, 300);\n  }else{\n    window.addEventListener(\"load\", () => setTimeout(revealEarly, 300), { once:true });\n    setTimeout(revealEarly, 2500);\n  }\n\n  \/* =========================================================\n     LAZY LOAD \u2014 SoundCloud erst bei Bedarf\n  ========================================================= *\/\n\n  function playerShown(){\n    \/* auf dem Handy (bis 767px) ist der Player ausgeblendet *\/\n    return !(window.matchMedia && window.matchMedia(\"(max-width:767px)\").matches);\n  }\n\n  function initWidget(){\n\n    if(widget) return;\n\n    if(typeof SC === \"undefined\" || !SC.Widget){\n      showOffline();\n      return;\n    }\n\n    const src = iframe.getAttribute(\"data-src\");\n    if(src && !iframe.getAttribute(\"src\")){\n      iframe.setAttribute(\"src\", src);\n    }\n\n    widget = SC.Widget(iframe);\n    bindWidget();\n    if(!standPlayer.classList.contains(\"bt-lsb-on\")) btTimeline.use(widget, false);\n  }\n\n  function startLoading(){\n\n    if(loadStarted) return;\n    loadStarted = true;\n\n    setWaiting(true);\n\n    \/* SoundCloud antwortet nicht: ruhige Meldung in der Titelzeile *\/\n    offlineTimer = setTimeout(showOffline, OFFLINE_AFTER_MS);\n\n    if(typeof SC !== \"undefined\" && SC.Widget){\n      initWidget();\n      return;\n    }\n\n    const s = document.createElement(\"script\");\n    s.src = API_URL;\n    s.async = true;\n    s.onload = initWidget;\n    s.onerror = showOffline;\n    document.head.appendChild(s);\n  }\n\n  \/* Klick auf Play \/ Vor \/ Zur\u00fcck \/ Logo \/ Equalizer vor dem Laden *\/\n  function requestPlay(){\n    pendingPlay = true;\n    startLoading();\n  }\n\n  \/* f\u00fcr andere Module (z. B. Equalizer): window.btPlayerLoad() *\/\n  window.btPlayerLoad = startLoading;\n  window.btPlayerPlay = function(){\n    if(isReady){\n      if(!isPlaying) widget.play();\n    }else{\n      requestPlay();\n    }\n  };\n\n  \/* Vorladen bei der ersten Aktivit\u00e4t nach dem Seitenaufbau *\/\n  const WARM_EVENTS = [\"pointermove\", \"pointerdown\", \"wheel\", \"scroll\", \"keydown\", \"touchstart\"];\n\n  function warmUp(){\n    WARM_EVENTS.forEach(ev => window.removeEventListener(ev, warmUp));\n    if(playerShown()) startLoading();\n  }\n\n  function armWarmUp(){\n    WARM_EVENTS.forEach(ev =>\n      window.addEventListener(ev, warmUp, { passive:true })\n    );\n\n    \/* falls man direkt im Musik-Bereich landet (z. B. Link #musik) *\/\n    if(\"IntersectionObserver\" in window){\n      const io = new IntersectionObserver(entries => {\n        if(entries.some(e => e.isIntersecting) && playerShown()){\n          io.disconnect();\n          startLoading();\n        }\n      });\n      io.observe(placeholder);\n    }\n  }\n\n  if(document.readyState === \"complete\"){\n    setTimeout(armWarmUp, 300);\n  }else{\n    window.addEventListener(\"load\", () => setTimeout(armWarmUp, 300), { once:true });\n  }\n\n  updateFloatingState();\n\n})();\n<\/script><\/div><\/div>\r\n<div class=\"et_pb_code_14 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><!-- =========================\n     FC READMORE \u2013 POLISH (DIVI)\n========================= -->\n\n<style>\n\/* Wrapper *\/\n.fc-readmore{ position: relative; }\n\n\/* Text area (animated) *\/\n.fc-readmore .et_pb_text_inner{\n  position: relative;\n  overflow: hidden;\n  transition: height 900ms cubic-bezier(0.25, 0.8, 0.25, 1);\n  will-change: height;\n\n  \/* IMPORTANT: keep spacing stable *\/\n  padding-bottom: 0;\n}\n\n\/* Normalize typography INSIDE this module (fixes \u201cfirst lines\u201d issues) *\/\n.fc-readmore .et_pb_text_inner,\n.fc-readmore .et_pb_text_inner *{\n  opacity: 1 !important;\n}\n\n.fc-readmore .et_pb_text_inner{\n  color: #fff !important;\n  line-height: 1.55;              \/* stabil + elegant *\/\n}\n\n.fc-readmore .et_pb_text_inner p{\n  line-height: inherit;\n  margin: 0 0 0.15em 0!important;           \/* consistent paragraph spacing *\/\n}\n\n.fc-readmore .et_pb_text_inner p:last-child{\n  margin-bottom: 0 !important;    \/* IMPORTANT: makes \u201c\u2026MEHR\u201d spacing uniform *\/\n}\n\n\/* Toggle row *\/\n.fc-readmore .fc-toggle-row{\n  text-align: right;\n\n  \/* distance between text container and toggle (uniform) *\/\n  margin-top: 10px;\n  padding-top: 0;\n}\n\n\/* Toggle link *\/\n.fc-readmore .fc-toggle{\n  display: inline-block;\n  white-space: nowrap;\n  font-weight: 300 !important;\n  text-decoration: none;\n  color: #ea0b5f !important;\n  transition: color 0.7s ease;\n\n  \/* smaller as requested *\/\n  font-size: 12px!important;\n  letter-spacing: 0.02em;\n}\n\n.fc-readmore .fc-toggle:hover{ color: #ffffff !important; }\n\n\/* If not truncated *\/\n.fc-readmore.is-short .fc-toggle-row{ display: none !important; }\n\n\/* When expanded: keep \u201cWENIGER\u201d closer *\/\n.fc-readmore.is-expanded .fc-toggle-row{\n  margin-top: 8px;\n}\n\n\/* kill Divi paragraph spacing patterns inside this module *\/\n.fc-readmore .et_pb_text_inner p{\n  margin: 0 0 0.59em 0 !important;\n  padding: 0 !important;\n}\n.fc-readmore .et_pb_text_inner p + p{\n  margin-top: 0 !important;   \/* Divi setzt das gern extra *\/\n}\n<\/style>\n\n\n\n\n\n<style>\n\/* Bild-Modul (ID: lineup-photo) fix \u201cschmal\u201d machen + Rundung + vertikal mittig *\/\n#lineup-photo{\n  height: 260px !important;          \/* <<< H\u00f6he hier anpassen *\/\n  overflow: hidden !important;\n  border-radius: 18px !important;     \/* <<< Rundung hier anpassen *\/\n}\n\n\/* Divi Image Wrapper komplett f\u00fcllen *\/\n#lineup-photo .et_pb_image,\n#lineup-photo .et_pb_image_wrap{\n  width: 100% !important;\n  height: 100% !important;\n  overflow: hidden !important;\n  border-radius: 18px !important;\n}\n\n\/* Bild: f\u00fcllt den Rahmen, vertikal + horizontal mittig *\/\n#lineup-photo img{\n  width: 100% !important;\n  height: 100% !important;\n  display: block !important;\n  object-fit: cover !important;\n  object-position: center center !important; \/* vertikal mittig *\/\n}\n<\/style>\n\n\n\n\n\n\n\n<script>\n(() => {\n  const COLLAPSED_LINES = 10;     \/\/ \u201c\u2026MEHR\u201d nach 15 Zeilen\n  const CLIP_BUFFER_PX  = 13;     \/\/ &#x2705; mehr Puffer gegen halbe Zeile\n\n  function getLineHeightPx(el){\n    const cs = getComputedStyle(el);\n    let lh = parseFloat(cs.lineHeight);\n    if(!lh || Number.isNaN(lh)){\n      const fs = parseFloat(cs.fontSize) || 16;\n      lh = fs * 1.55;\n    }\n    return lh;\n  }\n\n  function setHeightAutoAfterTransition(el){\n    const handler = (e) => {\n      if(e.propertyName !== \"height\") return;\n      el.style.height = \"auto\";\n      el.removeEventListener(\"transitionend\", handler);\n    };\n    el.addEventListener(\"transitionend\", handler);\n  }\n\n  function closeBlock(block){\n    const inner = block.querySelector(\".et_pb_text_inner\");\n    const toggle = block.querySelector(\".fc-toggle\");\n    if(!inner || !toggle) return;\n\n    const h = Number(block.dataset.collapsedH || 0);\n\n    const startH = inner.getBoundingClientRect().height;\n    inner.style.height = startH + \"px\";\n\n    block.classList.remove(\"is-expanded\");\n    toggle.textContent = \"\u2026MEHR\";\n\n    requestAnimationFrame(() => {\n      inner.style.height = h + \"px\";\n    });\n  }\n\n  function openBlock(block){\n    const inner = block.querySelector(\".et_pb_text_inner\");\n    const toggle = block.querySelector(\".fc-toggle\");\n    if(!inner || !toggle) return;\n\n    const startH = inner.getBoundingClientRect().height;\n    inner.style.height = startH + \"px\";\n\n    block.classList.add(\"is-expanded\");\n    toggle.textContent = \"\u2026WENIGER\";\n\n    requestAnimationFrame(() => {\n      const targetH = inner.scrollHeight;\n      inner.style.height = targetH + \"px\";\n      setHeightAutoAfterTransition(inner);\n    });\n  }\n\n  function computeCollapsedH(block){\n    const inner = block.querySelector(\".et_pb_text_inner\");\n    if(!inner) return;\n\n    const lh = getLineHeightPx(inner);\n\n    \/\/ &#x2705; exakte Zeilenh\u00f6he + Buffer (gegen half-line clipping)\n    const collapsedH = Math.ceil(lh * COLLAPSED_LINES + CLIP_BUFFER_PX);\n    block.dataset.collapsedH = String(collapsedH);\n\n    \/\/ &#x2705; tolerant: wenn nur minimal h\u00f6her, dann ist es \"short\" => \u2026MEHR weg\n    const tolerance = Math.max(10, lh * 0.75); \/\/ ~3\/4 Zeile\n    const isShort = inner.scrollHeight <= (collapsedH + tolerance);\n\n    const row = block.querySelector(\".fc-toggle-row\");\n\n    if(isShort){\n      block.classList.add(\"is-short\");\n      block.classList.remove(\"is-expanded\");\n      inner.style.height = \"auto\";\n      if(row) row.style.display = \"none\";\n      return;\n    }\n\n    block.classList.remove(\"is-short\");\n    if(row) row.style.display = \"\";\n\n    if(!block.classList.contains(\"is-expanded\")){\n      inner.style.height = collapsedH + \"px\";\n    }\n  }\n\n  function initBlock(block){\n    const inner = block.querySelector(\".et_pb_text_inner\");\n    if(!inner) return;\n\n    \/\/ Toggle Row + Link einmalig bauen\n    let toggleRow = block.querySelector(\".fc-toggle-row\");\n    let toggle = block.querySelector(\".fc-toggle\");\n\n    if(!toggleRow){\n      toggleRow = document.createElement(\"div\");\n      toggleRow.className = \"fc-toggle-row\";\n      block.appendChild(toggleRow);\n    }\n    if(!toggle){\n      toggle = document.createElement(\"a\");\n      toggle.className = \"fc-toggle\";\n      toggle.href = \"#\";\n      toggleRow.appendChild(toggle);\n    }\n\n    \/\/ Start collapsed\n    block.classList.remove(\"is-expanded\");\n    toggle.textContent = \"\u2026MEHR\";\n\n    requestAnimationFrame(() => computeCollapsedH(block));\n\n    if(block.dataset.bound) return;\n    block.dataset.bound = \"1\";\n\n    toggle.addEventListener(\"click\", (e) => {\n      e.preventDefault();\n\n      \/\/ Accordion: andere schlie\u00dfen\n      document.querySelectorAll(\".fc-readmore.is-expanded\").forEach(other => {\n        if(other !== block) closeBlock(other);\n      });\n\n      if(block.classList.contains(\"is-expanded\")) closeBlock(block);\n      else openBlock(block);\n    });\n\n    window.addEventListener(\"resize\", () => computeCollapsedH(block));\n  }\n\n  function init(){\n    document.querySelectorAll(\".fc-readmore:not(#musik .fc-readmore)\").forEach(initBlock);\n\n    if(document.fonts && document.fonts.ready){\n      document.fonts.ready.then(() => {\n        document.querySelectorAll(\".fc-readmore:not(#musik .fc-readmore)\").forEach(computeCollapsedH);\n      });\n    }\n\n    window.addEventListener(\"load\", () => {\n      document.querySelectorAll(\".fc-readmore:not(#musik .fc-readmore)\").forEach(computeCollapsedH);\n      setTimeout(() => {\n        document.querySelectorAll(\".fc-readmore:not(#musik .fc-readmore)\").forEach(computeCollapsedH);\n      }, 250);\n    });\n  }\n\n  if(document.readyState === \"loading\"){\n    document.addEventListener(\"DOMContentLoaded\", init);\n  } else {\n    init();\n  }\n})();\n<\/script><\/div><\/div>\r\n<div class=\"et_pb_code_15 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><!-- =========================================================\n   BT \u2014 MINI EQUALIZER CONTROL v2.1\n   ---------------------------------------------------------\n   \u2022 kleiner & eleganter\n   \u2022 SPACE Taste steuert bestehenden Player\n   \u2022 eigener kleiner Equalizer unten links\n   \u2022 liegt garantiert auf oberster Ebene\n   \u2022 softer delayed fade-in\n   \u2022 accessibility friendly\n   \u2022 beeinflusst keine anderen Scripts\n   ========================================================= -->\n\n<div id=\"bt-mini-eq-control\" aria-live=\"polite\">\n  <button\n    id=\"bt-mini-eq-button\"\n    type=\"button\"\n    aria-label=\"Musik abspielen\"\n    aria-pressed=\"false\">\n\n    <span class=\"bt-mini-eq-bars\" aria-hidden=\"true\">\n      <span><\/span>\n      <span><\/span>\n      <span><\/span>\n      <span><\/span>\n    <\/span>\n\n  <\/button>\n<\/div>\n\n<style>\n\/* =========================================================\n   BT \u2014 MINI EQ WRAPPER\n   ========================================================= *\/\n\n#bt-mini-eq-control{\n  position:fixed !important;\n  left:22px !important;\n  bottom:22px !important;\n\n  z-index:999999999999 !important;\n  isolation:isolate !important;\n\n  pointer-events:auto !important;\n\n  opacity:0;\n\n  transform:\n    translate3d(0,14px,0)\n    scale(.96);\n\n  transition:\n    opacity 1.2s ease,\n    transform 1.2s cubic-bezier(.22,1,.36,1);\n}\n\n#bt-mini-eq-control.bt-mini-eq-ready{\n  opacity:1;\n\n  transform:\n    translate3d(0,0,0)\n    scale(1);\n}\n\n\/* =========================================================\n   BT \u2014 BUTTON\n   ========================================================= *\/\n\n#bt-mini-eq-button{\n  position:relative;\n  z-index:1;\n\n  width:42px;\n  height:42px;\n\n  border-radius:999px;\n\n  border:1px solid rgba(255,255,255,0);\n\n  background:rgba(0,0,0,.22);\n\n  backdrop-filter:blur(14px);\n  -webkit-backdrop-filter:blur(14px);\n\n  display:grid;\n  place-items:center;\n\n  padding:0;\n  margin:0;\n\n  cursor:pointer;\n\n  color:#ebebeb;\n\n  box-sizing:border-box;\n\n  transition:\n    background-color .7s ease,\n    border-color .7s ease,\n    box-shadow .7s ease,\n    transform .7s ease,\n    opacity .7s ease;\n}\n\n#bt-mini-eq-button:hover{\n  background:rgba(0,0,0,.34);\n\n  border-color:#ea0b5f;\n\n  box-shadow:\n    0 0 12px rgba(234,11,95,.18),\n    0 0 22px rgba(234,11,95,.08);\n\n  transform:translateY(-1px);\n}\n\n#bt-mini-eq-button:focus-visible{\n  outline:2px solid #ea0b5f;\n  outline-offset:4px;\n}\n\n\/* =========================================================\n   BT \u2014 BARS\n   ========================================================= *\/\n\n.bt-mini-eq-bars{\n  height:18px;\n\n  display:flex;\n  align-items:flex-end;\n  justify-content:center;\n\n  gap:3px;\n}\n\n.bt-mini-eq-bars span{\n  display:block;\n\n  width:3px;\n  height:8px;\n\n  border-radius:999px;\n\n  background:#ebebeb;\n\n  opacity:.92;\n\n  transform-origin:bottom center;\n}\n\n\/* =========================================================\n   BT \u2014 PLAYING STATE\n   ========================================================= *\/\n\n#bt-mini-eq-control.is-playing #bt-mini-eq-button{\n  background:rgba(0,0,0,.30);\n\n  border-color:rgba(234,11,95,.52);\n\n  box-shadow:\n    0 0 10px rgba(234,11,95,.20),\n    0 0 22px rgba(234,11,95,.08);\n}\n\n#bt-mini-eq-control.is-playing .bt-mini-eq-bars span:nth-child(1){\n  animation:bt-mini-eq-1 .82s ease-in-out infinite;\n}\n\n#bt-mini-eq-control.is-playing .bt-mini-eq-bars span:nth-child(2){\n  animation:bt-mini-eq-2 .62s ease-in-out infinite;\n}\n\n#bt-mini-eq-control.is-playing .bt-mini-eq-bars span:nth-child(3){\n  animation:bt-mini-eq-3 .74s ease-in-out infinite;\n}\n\n#bt-mini-eq-control.is-playing .bt-mini-eq-bars span:nth-child(4){\n  animation:bt-mini-eq-4 .68s ease-in-out infinite;\n}\n\n\/* =========================================================\n   BT \u2014 BAR ANIMATION\n   ========================================================= *\/\n\n@keyframes bt-mini-eq-1{\n  0%,100%{ height:7px; }\n  50%{ height:17px; }\n}\n\n@keyframes bt-mini-eq-2{\n  0%,100%{ height:14px; }\n  50%{ height:6px; }\n}\n\n@keyframes bt-mini-eq-3{\n  0%,100%{ height:10px; }\n  50%{ height:18px; }\n}\n\n@keyframes bt-mini-eq-4{\n  0%,100%{ height:13px; }\n  50%{ height:8px; }\n}\n\n\/* =========================================================\n   ACCESSIBILITY\n   ========================================================= *\/\n\n@media (prefers-reduced-motion:reduce){\n\n  #bt-mini-eq-control,\n  #bt-mini-eq-button,\n  .bt-mini-eq-bars span{\n    transition:none !important;\n    animation:none !important;\n  }\n\n  #bt-mini-eq-control{\n    opacity:1;\n    transform:none;\n  }\n\n  #bt-mini-eq-control.is-playing .bt-mini-eq-bars span{\n    height:14px;\n  }\n}\n\n\/* =========================================================\n   MOBILE\n   ========================================================= *\/\n\n@media (max-width:767px){\n\n  #bt-mini-eq-control{\n    left:16px !important;\n    bottom:16px !important;\n  }\n\n  #bt-mini-eq-button{\n    width:40px;\n    height:40px;\n  }\n}\n<\/style>\n<style>\n\/* =========================================================\n   BT \u2014 MINI EQ OFF ON MOBILE\n   ========================================================= *\/\n\n@media (max-width:767px){\n\n  #bt-mini-eq-control{\n    display:none !important;\n    visibility:hidden !important;\n    opacity:0 !important;\n    pointer-events:none !important;\n  }\n}\n<\/style>\n\n<script>\n\/* =========================================================\n   BT \u2014 MINI EQ CONTROL SCRIPT v2.2\n   ========================================================= *\/\n\n(function(){\n\n  \"use strict\";\n\n  if(window.__btMiniEqControlV21) return;\n  window.__btMiniEqControlV21 = true;\n\n  const control = document.getElementById(\"bt-mini-eq-control\");\n  const button  = document.getElementById(\"bt-mini-eq-button\");\n\n  if(!control || !button) return;\n\n  document.body.appendChild(control);\n\n  function isTypingTarget(el){\n    if(!el) return false;\n    const tag = (el.tagName || \"\").toLowerCase();\n\n    return (\n      tag === \"input\" ||\n      tag === \"textarea\" ||\n      tag === \"select\" ||\n      el.isContentEditable\n    );\n  }\n\n  function getMainPlayButton(){\n    return document.querySelector(\"#bt-player-compact .btpc-play\");\n  }\n\n  function triggerPlayer(){\n    const playBtn = getMainPlayButton();\n    if(!playBtn) return;\n    playBtn.click();\n  }\n\n  function syncState(){\n    const playBtn = getMainPlayButton();\n\n    const isPlaying = !!(\n      playBtn &&\n      playBtn.classList.contains(\"is-playing\")\n    );\n\n    control.classList.toggle(\"is-playing\", isPlaying);\n\n    button.setAttribute(\"aria-pressed\", isPlaying ? \"true\" : \"false\");\n    button.setAttribute(\"aria-label\", isPlaying ? \"Musik pausieren\" : \"Musik abspielen\");\n  }\n\n  button.addEventListener(\"click\", function(){\n    triggerPlayer();\n    setTimeout(syncState, 100);\n    button.blur();\n  });\n\n  document.addEventListener(\"keydown\", function(e){\n    if(e.code !== \"Space\" && e.key !== \" \") return;\n    if(isTypingTarget(document.activeElement)) return;\n\n    e.preventDefault();\n    e.stopPropagation();\n\n    triggerPlayer();\n    setTimeout(syncState, 100);\n  }, true);\n\n  const observer = new MutationObserver(syncState);\n\n  function observePlayer(){\n    const playBtn = getMainPlayButton();\n    if(!playBtn) return;\n\n    observer.observe(playBtn, {\n      attributes:true,\n      attributeFilter:[\"class\"]\n    });\n\n    syncState();\n  }\n\n  observePlayer();\n\n  setTimeout(observePlayer, 300);\n  setTimeout(syncState, 600);\n  setTimeout(syncState, 1200);\n\n  setTimeout(function(){\n    control.classList.add(\"bt-mini-eq-ready\");\n  }, 1800);\n\n})();\n<\/script><\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_5 et_pb_row et_block_row bt-lineup-shell\">\r\n<div class=\"et_pb_column_6 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_code_16 et_pb_code et_pb_module bt-lineup-track\"><div class=\"et_pb_code_inner\"><!-- =========================================================\n     BAR TAUSEND \u00b7 LINEUP \u00b7 CAROUSEL V26\n\n     EINBAU\n     Den KOMPLETTEN Inhalt des Moduls \u201eCode-Carousel-Container\u201c\n     durch diesen Code ersetzen. Sonst nichts \u00e4ndern.\n\n     NEU IN V26 (nur Leistung, Optik und Verhalten wie V25)\n     - Messen erst, wenn das Line-up in die N\u00e4he des Bildschirms kommt\n       (beim Seitenaufbau rechnet es nicht mehr mit)\n     - alle Messungen geb\u00fcndelt: erst lesen, dann schreiben\n       (der Browser rechnet das Layout einmal statt viele Male)\n     - mehrere Messw\u00fcnsche kurz hintereinander werden zusammengefasst\n     Zur\u00fcck zu V25: einfach den V25-Code wieder einsetzen.\n\n     NEU IN V25 (Test f\u00fcr Rob)\n     - Fotos flacher: Bildformat 16 \/ 9 statt 16 \/ 10\n     - Vorschautext eine Zeile l\u00e4nger (Desktop 10, Handy 11)\n     Zur\u00fcck zu V24: --bt-img-ratio 16 \/ 10, --bt-text-lines 9\n     (Handy-Block unten: 10)\n\n     WAS DAS MODUL MACHT\n     - sortiert die Karten nach Datum, der aktuelle Act steht links\n       (ein Abend z\u00e4hlt bis 03:00 Uhr am Folgetag)\n     - Klick auf eine Karte: Vorschautext gleitet nach unten weg,\n       der Kopf wandert nach rechts, darunter gleitet der ganze Text\n       herein, das Bild f\u00fcllt die linke Seite. Handy: Text klappt auf.\n       Klick in den offenen Text schlie\u00dft die Karte wieder\n       (Links und SoundCloud-Logos bleiben klickbar).\n     - Namen immer einzeilig (minimal kleiner, sonst sanftes\n       Durchlaufen bei Hover), \u201eEvent \u00f6ffnen\u201c steht immer auf einer\n       H\u00f6he. In der offenen Karte ist der ganze Name zu sehen.\n     - Handy: bei zwei- oder dreizeiligen Namen zeigt der Vorschautext\n       automatisch weniger Zeilen, bei einzeiligen etwas mehr. So sind\n       alle Karten gleich lang und das \u201e+\u201c steht \u00fcberall gleich hoch.\n     - rechter Pfeil gleitet am Rand zur Maus, links erscheint der\n       Pfeil nur am Rand, Pfeiltasten bl\u00e4ttern. Am Ende des Line-ups\n       f\u00fchrt \u201eweiter\u201c zur\u00fcck zum aktuellen Act.\n     - ZWEITES FOTO: einfach im Builder das Bild-Modul der Karte\n       duplizieren und das neue Foto einsetzen. Die Fotos wechseln\n       dann sanft von selbst (bei Maus dar\u00fcber h\u00e4lt der Wechsel an).\n     - FOTO-AUSSCHNITT IN DER OFFENEN KARTE: im Bild-Modul unter\n       Erweitert > CSS-ID & Klassen > CSS-Klasse eintragen:\n       bt-x-0 = ganz links, bt-x-50 = Mitte, bt-x-100 = ganz rechts\n       (jeder Wert dazwischen geht, z. B. bt-x-30)\n     - barrierefrei: Tastatur, Screenreader, weniger Bewegung\n\n     WICHTIG\n     Dieses Modul enth\u00e4lt absichtlich KEINEN Backslash.\n     Divi verdoppelt Backslashes bei jedem Speichern.\n\n     STELLSCHRAUBEN (erster CSS-Block \u201eTOKENS\u201c)\n     --bt-gap          Abstand zwischen den Karten\n     --bt-img-ratio    Bildformat (16 \/ 9 = flacher, 16 \/ 10 = V24,\n                       2 \/ 1 = noch flacher)\n     --bt-radius       Rundung der Karten unten\n     --bt-card-bg      Hintergrund der Karten (Verlauf: unten schwarz, oben transparent)\n     --bt-text-lines   Zeilen im Vorschautext (endet mit \u201e\u2026\u201c),\n                       am Handy gilt der Wert f\u00fcr einzeilige Namen\n     --bt-speed        Tempo beim \u00d6ffnen\n     --bt-accent       Pink\n     --bt-cursor       TAUSEND-Mauszeiger zwischen den Karten (wie auf der Seite)\n     --bt-cursor-hot   TAUSEND-Mauszeiger auf Karten, Plus\/Minus und Pfeilen\n                       (wie bei Links). Werden die Cursor-Bilder im Theme\n                       getauscht, hier die neuen Adressen eintragen.\n========================================================= -->\n\n<style>\n\/* =========================================================\n   1 \u00b7 TOKENS\n   ========================================================= *\/\n#musik .et_pb_row.bt-lineup-shell{\n  font-family: \"Poppins\", sans-serif;\n  --bt-gap: 24px;\n  --bt-side: clamp(48px, 3.6vw, 64px);\n  --bt-per-view: 4;\n  --bt-img-ratio: 16 \/ 9;\n  --bt-radius: 14px;\n  --bt-card-bg: linear-gradient(to top, #000 0%, rgba(0,0,0,0) 100%);\n  --bt-open-bg: rgba(255,255,255,.035);\n  --bt-accent: #ea0b5f;\n  --bt-ink: rgba(243,239,230,.92);\n  --bt-text-lines: 10;\n  --bt-text-lh: 1.55;\n  --bt-speed: 760ms;\n  --bt-name-pad: 30px 10px 25px 30px;\n  --bt-text-pad: 23px 28px 75px;\n  --bt-img-gap: 6px;\n  --bt-cursor: url(\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/Cursor-3.png\") 8 8, grab;\n  --bt-cursor-hot: url(\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/Cursor-4.png\") 8 8, pointer;\n\n  position: relative !important;\n  padding: 0 var(--bt-side) !important;\n  overflow: visible !important;\n}\n\n\/* =========================================================\n   2 \u00b7 TRACK (das Code-Modul selbst ist der Track)\n   ========================================================= *\/\n#musik .bt-lineup-shell .bt-lineup-track{\n  display: flex !important;\n  flex-wrap: nowrap !important;\n  align-items: stretch !important;\n  gap: var(--bt-gap) !important;\n  width: 100% !important;\n  margin: 0 !important;\n  padding: 0 0 12px !important;\n  overflow-x: auto !important;\n  overflow-y: hidden !important;\n  overscroll-behavior-x: contain;\n  scroll-snap-type: none !important;\n  scroll-padding-inline: 0;\n  scrollbar-width: none !important;\n  -ms-overflow-style: none !important;\n  -webkit-overflow-scrolling: touch;\n  touch-action: pan-x pan-y pinch-zoom;\n  overflow-anchor: none;\n  outline: none;\n\n  \/* unsichtbar bis Sortierung + Startposition fertig sind\n     (Fallback: nach 2,5 s sichtbar, falls JS ausf\u00e4llt) *\/\n  opacity: 0;\n  animation: btLuReveal 0s linear 2.5s forwards;\n}\n#musik .bt-lineup-shell .bt-lineup-track::-webkit-scrollbar{ display: none !important; }\n#musik .bt-lineup-shell.bt-lu-ready .bt-lineup-track{\n  opacity: 1;\n  animation: none;\n  transition: opacity .35s ease;\n}\n@keyframes btLuReveal{ to{ opacity: 1; } }\n#musik .bt-lineup-shell .bt-lineup-track:focus-visible{\n  outline: 2px solid var(--bt-accent);\n  outline-offset: 6px;\n}\n\n\/* Code-Inhalt + Altlasten nie anzeigen *\/\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_code_inner,\n#musik .bt-lineup-shell .bt-lineup-nav,\n#musik .bt-lineup-shell .bt-lineup-swipe-arrow,\n#musik .bt-lineup-track .fc-toggle-row,\n#musik .bt-lineup-track .bt-morewrap,\n.bt-lineup-float-nav{\n  display: none !important;\n}\n\n\/* =========================================================\n   3 \u00b7 KARTE\n   ========================================================= *\/\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row{\n  --bt-card-w: calc((100% - (var(--bt-per-view) - 1) * var(--bt-gap)) \/ var(--bt-per-view));\n\n  flex: 0 0 var(--bt-cw, var(--bt-card-w)) !important;\n  width: var(--bt-cw, var(--bt-card-w)) !important;\n  max-width: none !important;\n  min-width: 0 !important;\n  height: auto !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  position: relative !important;\n\n  background: var(--bt-card-bg) !important;\n  border: 0 !important;\n  border-radius: 0 0 var(--bt-radius) var(--bt-radius) !important;\n  box-shadow: none !important;\n\n  display: grid !important;\n  grid-template-columns: 100% !important;\n  grid-template-rows: auto auto 1fr !important;\n  row-gap: 0 !important;\n\n  scroll-snap-align: start;\n  scroll-snap-stop: normal;\n  overflow-anchor: none;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row::after{\n  display: none !important;\n}\n\/* ruhiger Hintergrund nur f\u00fcr die ge\u00f6ffnete Karte *\/\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row::before{\n  content: \"\" !important;\n  display: block !important;\n  position: absolute !important;\n  inset: 0 !important;\n  background: var(--bt-open-bg) !important;\n  border-radius: inherit !important;\n  opacity: var(--bt-open, 0);\n  pointer-events: none !important;\n  z-index: 0 !important;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-open{ --bt-open: 1; }\n\n\/* Name: Buchstabenabstand w\u00e4chst und schrumpft mit der Schriftgr\u00f6\u00dfe\n   (vorher fest -2 px, dadurch r\u00fcckten kleine Namen zu eng zusammen) *\/\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row h2{\n  letter-spacing: -0.05em !important;\n}\n\n\/* Divi-Spalten: Name \/ Foto \/ Text *\/\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column{\n  float: none !important;\n  width: 100% !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  min-width: 0 !important;\n  position: relative !important;\n  z-index: 1;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:nth-child(1){\n  grid-column: 1 !important;\n  grid-row: 1 !important;\n  min-height: var(--bt-head-h, 0px);\n  container-type: inline-size;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:nth-child(3){\n  grid-column: 1 !important;\n  grid-row: 2 !important;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:nth-child(2){\n  grid-column: 1 !important;\n  grid-row: 3 !important;\n  display: flex !important;\n  flex-direction: column !important;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row .et_pb_module{ margin: 0 !important; }\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row p{\n  margin: 6px 0 0 !important;\n  padding: 0 !important;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:nth-child(1) > .et_pb_module{\n  padding: var(--bt-name-pad) !important;\n}\n\n\/* =========================================================\n   4 \u00b7 BILD \u2014 randlos, eckig\n   ========================================================= *\/\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:nth-child(3) .et_pb_image{\n  width: 100% !important;\n  max-width: none !important;\n  height: auto !important;\n  padding: 0 !important;\n  margin: 0 0 var(--bt-img-gap) !important;\n  border-radius: 0 !important;\n  overflow: hidden !important;\n  text-align: left !important;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:nth-child(3) .et_pb_image_wrap{\n  display: block !important;\n  width: 100% !important;\n  height: auto !important;\n  border-radius: 0 !important;\n  overflow: hidden !important;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:nth-child(3) img{\n  display: block !important;\n  width: 100% !important;\n  max-width: none !important;\n  height: auto !important;\n  aspect-ratio: var(--bt-img-ratio);\n  object-fit: cover !important;\n  object-position: center center !important;\n  border-radius: 0 !important;\n  -webkit-user-drag: none;\n  user-select: none;\n  -webkit-user-select: none;\n  transform: scale(1);\n  transition: transform 2.8s cubic-bezier(.2,.55,.25,1), object-position var(--bt-speed) ease;\n}\n\/* Maus \u00fcber der Karte: Foto wird langsam und sanft gr\u00f6\u00dfer *\/\n@media (hover: hover) and (pointer: fine){\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row:hover > .et_pb_column:nth-child(3) img{\n    transform: scale(1.12);\n  }\n}\n\/* zweites (drittes \u2026) Foto liegt \u00fcber dem ersten und blendet sanft ein *\/\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:nth-child(3) .et_pb_image ~ .et_pb_image{\n  position: absolute !important;\n  top: 0;\n  left: 0;\n  right: 0;\n  z-index: 1;\n  opacity: 0 !important;\n  transition: opacity 1.8s ease !important;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:nth-child(3) .et_pb_image ~ .et_pb_image.is-active{\n  opacity: 1 !important;\n}\n\n\/* =========================================================\n   5 \u00b7 VORSCHAUTEXT\n   ========================================================= *\/\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:nth-child(2) > .et_pb_text{\n  padding: var(--bt-text-pad) !important;\n  display: flex !important;\n  flex-direction: column !important;\n  transition: opacity .22s ease, transform .26s cubic-bezier(.4,0,.2,1);\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:nth-child(2) > .et_pb_text.is-leaving{\n  opacity: 0;\n  transform: translateY(26px);\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:nth-child(2) > .et_pb_text.is-entering{\n  opacity: 0;\n  transform: translateY(26px);\n  transition: none !important;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:nth-child(2) > .et_pb_text > .et_pb_text_inner{\n  position: relative;\n  color: #fff !important;\n  line-height: var(--bt-text-lh) !important;\n  \/* Sicherheitsnetz, falls ein Browser die Zeilenk\u00fcrzung nicht kann *\/\n  max-height: var(--bt-mh, calc((var(--bt-text-lines) * var(--bt-text-lh) + 1) * 1em));\n  overflow: hidden !important;\n  overflow: clip !important;\n  overflow-anchor: none;\n  transition: max-height var(--bt-speed) cubic-bezier(.25,.8,.25,1);\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:nth-child(2) > .et_pb_text > .et_pb_text_inner p{\n  line-height: inherit !important;\n}\n\/* alte Absatz-K\u00fcrzung aus den Theme-Optionen neutralisieren *\/\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:nth-child(2) > .et_pb_text > .et_pb_text_inner > p{\n  display: block !important;\n  -webkit-line-clamp: unset !important;\n  -webkit-box-orient: initial !important;\n  overflow: visible !important;\n  position: static !important;\n  max-height: none !important;\n  padding-bottom: 0 !important;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:nth-child(2) > .et_pb_text > .et_pb_text_inner > p::after{\n  content: none !important;\n  display: none !important;\n}\n#musik .bt-lineup-shell .bt-lu-text.is-short > .et_pb_text_inner,\n#musik .bt-lineup-shell .bt-lu-text.is-open:not(.is-animating) > .et_pb_text_inner{\n  --bt-mh: none;\n}\n\/* Vorschau: genau X ganze Zeilen, am Ende \u201e\u2026\u201c *\/\n#musik .bt-lineup-shell .bt-lu-text.is-clamped:not(.is-open):not(.is-animating):not(.is-measure) > .et_pb_text_inner{\n  display: -webkit-box !important;\n  -webkit-box-orient: vertical !important;\n  -webkit-line-clamp: var(--bt-text-lines);\n}\n\/* zum Messen kurz ohne K\u00fcrzung *\/\n#musik .bt-lineup-shell .bt-lu-text.is-measure > .et_pb_text_inner{\n  display: block !important;\n  -webkit-line-clamp: none !important;\n  max-height: none !important;\n  transition: none !important;\n}\n#musik .bt-lineup-shell .bt-lu-text.is-animating.is-closing > .et_pb_text_inner{\n  -webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - 2.2em), transparent);\n          mask-image: linear-gradient(to bottom, #000 calc(100% - 2.2em), transparent);\n}\n\n\/* =========================================================\n   6 \u00b7 GE\u00d6FFNETE KARTE (Tablet + Desktop)\n   Bild f\u00fcllt die linke Seite, Kopf wandert nach rechts,\n   darunter gleitet der ganze Text herein\n   ========================================================= *\/\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-drawer{\n  grid-template-columns: var(--bt-w-px) calc(var(--bt-w-px) + var(--bt-gap)) !important;\n  grid-template-rows: auto 1fr !important;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-drawer.is-tween{\n  overflow: hidden !important;\n  overflow: clip !important;\n}\n\/* Kopf (Kategorie, Datum, Name, Link) *\/\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-drawer > .et_pb_column:nth-child(1){\n  grid-column: 2 !important;\n  grid-row: 1 !important;\n  width: var(--bt-w-px) !important;\n  transform: translateX(calc(var(--bt-w-px) * (var(--bt-p, 1) - 1)));\n  z-index: 3 !important;\n}\n\/* Bild: ganze linke Seite *\/\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-drawer > .et_pb_column:nth-child(3){\n  grid-column: 1 !important;\n  grid-row: 1 \/ 3 !important;\n  min-height: 0 !important;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-drawer > .et_pb_column:nth-child(3) .et_pb_image{\n  position: absolute !important;\n  left: 0 !important;\n  right: 0 !important;\n  top: var(--bt-img-top, 0px) !important;\n  height: var(--bt-img-h, 100%) !important;\n  margin: 0 !important;\n  border-radius: 0 0 0 var(--bt-radius) !important;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-drawer > .et_pb_column:nth-child(3) .et_pb_image_wrap,\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-drawer > .et_pb_column:nth-child(3) img{\n  height: 100% !important;\n  aspect-ratio: auto !important;\n}\n\/* Ausschnitt pro Foto (CSS-Klasse bt-x-0 \u2026 bt-x-100 im Bild-Modul) *\/\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-drawer > .et_pb_column:nth-child(3) img{\n  object-position: var(--bt-img-x, 50%) 50% !important;\n}\n\/* ganzer Text unter dem Kopf *\/\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-drawer > .et_pb_column:nth-child(2){\n  grid-column: 2 !important;\n  grid-row: 2 !important;\n  min-height: 0 !important;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-drawer > .et_pb_column:nth-child(2) > .et_pb_text{\n  position: absolute !important;\n  inset: -8px 0 0 0 !important;\n  padding: 4px 28px 60px 30px !important;\n  overflow-x: hidden !important;\n  overflow-y: auto !important;\n  overscroll-behavior-x: auto;\n  overscroll-behavior-y: contain;\n  \/* eigener, feiner Scrollbalken (siehe unten) statt dem vom Browser *\/\n  scrollbar-width: none;\n  -ms-overflow-style: none;\n  cursor: var(--bt-cursor-hot, pointer);\n  opacity: var(--bt-panel, 1);\n  transform: translateY(calc((1 - var(--bt-panel, 1)) * 26px));\n  transition: none !important;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-drawer > .et_pb_column:nth-child(2) > .et_pb_text::-webkit-scrollbar{\n  display: none;\n  width: 0;\n}\n\/* passt der Text fast ganz, wird gar nicht gescrollt *\/\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-drawer > .et_pb_column:nth-child(2) > .et_pb_text.is-fit{\n  overflow-y: hidden !important;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-drawer > .et_pb_column:nth-child(2) > .et_pb_text > .et_pb_text_inner{\n  --bt-mh: none;\n  display: block !important;\n  -webkit-line-clamp: none !important;\n  -webkit-mask-image: none !important;\n          mask-image: none !important;\n  transition: none !important;\n}\n\n\/* Scroll-Hinweis: vier feine Punkte untereinander, gleiten mit dem Text.\n   Erscheint nur, wenn der Text wirklich l\u00e4nger ist *\/\n#musik .bt-lineup-shell .bt-lu-bar{\n  position: absolute;\n  top: -2px;\n  right: 8px;\n  bottom: 66px;\n  width: 12px;\n  z-index: 3;\n  opacity: 0;\n  visibility: hidden;\n  cursor: var(--bt-cursor-hot, pointer);\n  transition: opacity .5s ease, visibility 0s linear .5s;\n}\n#musik .bt-lineup-shell .lineup-row.is-drawer.is-open.has-scroll .bt-lu-bar{\n  opacity: 1;\n  visibility: visible;\n  transition: opacity .5s ease, visibility 0s linear 0s;\n}\n#musik .bt-lineup-shell .bt-lu-thumb{\n  position: absolute;\n  top: 0;\n  left: 50%;\n  width: 4px;\n  height: 24px;\n  margin-left: -2px;\n  color: rgba(255,255,255,.12);\n  background: radial-gradient(circle, currentColor 1.1px, transparent 1.5px) 50% 0 \/ 4px 6px repeat-y;\n  transition: color .6s ease;\n  will-change: transform;\n}\n#musik .bt-lineup-shell .lineup-row.is-drawer .et_pb_column:nth-child(2):hover .bt-lu-thumb{\n  color: rgba(255,255,255,.26);\n}\n#musik .bt-lineup-shell .bt-lu-bar:hover .bt-lu-thumb,\n#musik .bt-lineup-shell .bt-lu-bar.is-dragging .bt-lu-thumb{\n  color: rgba(255,255,255,.45);\n}\n\/* langer Text liest sich linksb\u00fcndig ruhiger *\/\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-drawer > .et_pb_column:nth-child(2) > .et_pb_text > .et_pb_text_inner p{\n  text-align: center !important;\n}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-drawer > .et_pb_column:nth-child(2) > .et_pb_text:focus-visible{\n  outline: 2px solid var(--bt-accent);\n  outline-offset: -2px;\n}\n\n\/* =========================================================\n   7 \u00b7 PLUS \/ MINUS\n   ========================================================= *\/\n#musik .bt-lineup-shell .bt-lu-toggle{\n  position: absolute !important;\n  left: calc(50% - 22px);\n  right: auto;\n  bottom: 21px;\n  z-index: 4;\n  width: 44px;\n  height: 44px;\n  margin: 0;\n  padding: 0;\n  border: 0 !important;\n  border-radius: 50%;\n  background: none !important;\n  box-shadow: none !important;\n  color: var(--bt-ink);\n  opacity: .4;\n  cursor: var(--bt-cursor-hot, pointer);\n  -webkit-appearance: none;\n  appearance: none;\n  transition: color .6s ease, opacity .6s ease !important;\n  -webkit-tap-highlight-color: transparent;\n}\n#musik .bt-lineup-shell .bt-lu-toggle::before,\n#musik .bt-lineup-shell .bt-lu-toggle::after{\n  content: \"\";\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  width: 12px;\n  height: 1.5px;\n  margin: -0.75px 0 0 -6px;\n  border-radius: 1px;\n  background: currentColor;\n  transition: transform .5s cubic-bezier(.22,1,.36,1);\n}\n\/* offene Karte: Minus gleitet mit dem \u00d6ffnen nach links unten aufs Foto *\/\n#musik #bt-lu-track > .et_pb_row.lineup-row.is-drawer > .bt-lu-toggle{\n  left: calc((var(--bt-w-px) \/ 2 - 22px) * (1 - var(--bt-p, 1)) + 12px * var(--bt-p, 1));\n  filter: drop-shadow(0 1px 3px rgba(0,0,0,.55));\n}\n#musik .bt-lineup-shell .bt-lu-toggle::after{ transform: rotate(90deg); }\n#musik .bt-lineup-shell .lineup-row.is-open .bt-lu-toggle::after{ transform: rotate(180deg); }\n@media (max-width: 767px){\n#musik .bt-lineup-shell .lineup-row.is-short .bt-lu-toggle{ display: none; }\n}\n\/* Plus: normal leicht zur\u00fcckgenommen, Maus \u00fcber der Karte: sanft pink mit zartem Kreis *\/\n@media (hover: hover){\n  #musik .bt-lineup-shell .lineup-row:hover .bt-lu-toggle,\n  #musik .bt-lineup-shell .bt-lu-toggle:hover{\n    color: var(--bt-accent);\n    opacity: 1;\n  }\n  #musik .bt-lineup-shell .lineup-row:hover .bt-lu-ring,\n  #musik .bt-lineup-shell .bt-lu-toggle:hover .bt-lu-ring{\n    opacity: 1;\n    transform: none;\n  }\n}\n\/* zarter Ring mit Luft um Plus\/Minus (Klickfl\u00e4che bleibt 44 px) *\/\n#musik .bt-lineup-shell .bt-lu-ring{\n  position: absolute;\n  inset: 5px;\n  border-radius: 50%;\n  box-shadow: inset 0 0 0 1px rgba(234,11,95,.5);\n  opacity: 0;\n  transform: scale(.86);\n  transition: opacity .8s ease, transform .8s cubic-bezier(.22,1,.36,1);\n  pointer-events: none;\n}\n#musik .bt-lineup-shell .lineup-row.is-open .bt-lu-toggle,\n#musik .bt-lineup-shell .bt-lu-toggle:focus-visible{ opacity: 1; }\n#musik .bt-lineup-shell .bt-lu-toggle:focus-visible,\n#musik .bt-lineup-shell .bt-lineup-track a:focus-visible{\n  outline: 2px solid var(--bt-accent);\n  outline-offset: 2px;\n}\n\n\/* =========================================================\n   8 \u00b7 PFEILE \u2014 fein, wei\u00df 40 %, bei Maus sanft pink\n   rechts: steht im Seitenrand und gleitet am Rand zur Maus\n   links: erscheint nur am Rand als Maus-Pfeil (und bei Tastaturfokus)\n   ========================================================= *\/\n#musik .bt-lineup-shell .bt-lu-nav{\n  position: absolute;\n  top: 50%;\n  z-index: 6;\n  width: 44px;\n  height: 44px;\n  margin-top: -22px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 0;\n  border: 0;\n  border-radius: 50%;\n  background: transparent;\n  color: #fff;\n  cursor: var(--bt-cursor-hot, pointer);\n  opacity: .4;\n  visibility: visible;\n  transition: opacity .6s ease, visibility 0s linear 0s, color .6s ease;\n  -webkit-tap-highlight-color: transparent;\n  will-change: transform;\n}\n#musik .bt-lineup-shell .bt-lu-nav svg{\n  display: block;\n  width: 26px;\n  height: 20px;\n  transition: transform .45s cubic-bezier(.22,1,.36,1);\n}\n#musik .bt-lineup-shell .bt-lu-nav.prev svg{ transform: rotate(180deg); }\n#musik .bt-lineup-shell .bt-lu-nav.prev{ left: calc((var(--bt-side) - 44px) \/ 2); }\n#musik .bt-lineup-shell .bt-lu-nav.next{ right: calc((var(--bt-side) - 44px) \/ 2); }\n@media (hover: hover){\n  #musik .bt-lineup-shell .bt-lu-nav:hover{ color: var(--bt-accent); opacity: 1; }\n  #musik .bt-lineup-shell .bt-lu-nav.next:hover svg{ transform: translateX(3px); }\n  #musik .bt-lineup-shell .bt-lu-nav.prev:hover svg{ transform: rotate(180deg) translateX(3px); }\n}\n#musik .bt-lineup-shell .bt-lu-nav:focus-visible{\n  outline: 2px solid var(--bt-accent);\n  outline-offset: 2px;\n  opacity: 1;\n}\n\/* linker Pfeil: unsichtbar, bis die Maus an den Rand kommt *\/\n@media (hover: hover) and (pointer: fine){\n  #musik .bt-lineup-shell .bt-lu-nav.prev{ opacity: 0; }\n  #musik .bt-lineup-shell.is-edge-prev .bt-lu-nav.prev,\n  #musik .bt-lineup-shell .bt-lu-nav.prev:focus-visible{ opacity: 1; }\n}\n\/* Pfeil folgt der Maus: wird sanft pink, System- und TAUSEND-Cursor treten zur\u00fcck *\/\n#musik .bt-lineup-shell.is-edge-next .bt-lu-nav.next,\n#musik .bt-lineup-shell.is-edge-prev .bt-lu-nav.prev{\n  color: var(--bt-accent) !important;\n  opacity: 1;\n}\n#musik .bt-lineup-shell.is-edge-next .bt-lu-nav.next svg{ transform: none !important; }\n#musik .bt-lineup-shell.is-edge-prev .bt-lu-nav.prev svg{ transform: rotate(180deg) !important; }\n#musik .bt-lineup-shell.is-edge-next,\n#musik .bt-lineup-shell.is-edge-next *,\n#musik .bt-lineup-shell.is-edge-prev,\n#musik .bt-lineup-shell.is-edge-prev *{\n  cursor: none !important;\n}\n#bt-theme-cursor.bt-lu-cursor-hidden{ opacity: 0 !important; }\n\n#musik .bt-lineup-shell .bt-lu-nav.is-hidden{\n  opacity: 0 !important;\n  visibility: hidden;\n  pointer-events: none;\n  transition: opacity .45s ease, visibility 0s linear .45s;\n}\n\/* einmaliges, leises Anstupsen des rechten Pfeils *\/\n#musik .bt-lineup-shell .bt-lu-nav.next.is-nudge svg{\n  animation: btLuNudge 1.6s cubic-bezier(.45,0,.2,1) 1;\n}\n@keyframes btLuNudge{\n  0%, 100%{ transform: none; }\n  35%{ transform: translateX(7px); }\n  60%{ transform: translateX(0); }\n  78%{ transform: translateX(3px); }\n}\n\n\/* Maus *\/\n@media (hover: hover) and (pointer: fine){\n  \/* TAUSEND-Mauszeiger (Logo) auch im Line-up *\/\n  #musik .bt-lineup-shell .bt-lineup-track{ cursor: var(--bt-cursor, grab); }\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row{ cursor: var(--bt-cursor-hot, pointer); }\n  #musik .bt-lineup-shell .bt-lineup-track a{ cursor: var(--bt-cursor-hot, pointer); }\n  #musik .bt-lineup-shell .bt-lineup-track.is-dragging,\n  #musik .bt-lineup-shell .bt-lineup-track.is-dragging > .et_pb_row.lineup-row{\n    cursor: var(--bt-cursor-hot, grabbing);\n    user-select: none;\n    -webkit-user-select: none;\n  }\n  body.bt-theme-cursor-active #musik .bt-lineup-shell,\n  body.bt-theme-cursor-active #musik .bt-lineup-shell *{ cursor: none !important; }\n}\n\n\/* Screenreader-Text *\/\n#musik .bt-lineup-shell .bt-lu-sr{\n  position: absolute !important;\n  width: 1px !important;\n  height: 1px !important;\n  margin: -1px !important;\n  padding: 0 !important;\n  overflow: hidden !important;\n  clip: rect(0 0 0 0) !important;\n  clip-path: inset(50%) !important;\n  white-space: nowrap !important;\n  border: 0 !important;\n}\n\n\/* Swipe-Hinweis (Handy\/Tablet, einmalig) *\/\n#musik .bt-lineup-shell .bt-lu-hint{\n  position: absolute;\n  right: 6px;\n  top: 50%;\n  z-index: 9;\n  width: 30px;\n  height: 22px;\n  margin-top: -11px;\n  color: var(--bt-accent);\n  pointer-events: none;\n  opacity: 0;\n  transform: translateX(-8px);\n  transition: opacity 1.2s cubic-bezier(.22,1,.36,1), transform 1.2s cubic-bezier(.22,1,.36,1);\n  filter: drop-shadow(0 1px 2px rgba(0,0,0,.65));\n}\n#musik .bt-lineup-shell .bt-lu-hint svg{ display: block; width: 30px; height: 22px; }\n#musik .bt-lineup-shell .bt-lu-hint.is-visible{ opacity: .9; transform: none; }\n#musik .bt-lineup-shell .bt-lu-hint.is-gone{ opacity: 0; transform: translateX(6px); }\n\n\/* =========================================================\n   9 \u00b7 HEADLINES \u2014 skalieren mit der Kartenbreite\n   Name immer einzeilig: bei langen Namen minimal kleiner,\n   reicht das nicht, l\u00e4uft der Name bei Hover sanft durch\n   ========================================================= *\/\n@media (min-width: 768px){\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row h2{\n    font-size: calc(clamp(32px, 10.5cqi, 40px) * var(--bt-name-scale, 1)) !important;\n    \/* kleinerer Name: gleiche Zeilenh\u00f6he, Schrift sitzt unten auf derselben Linie *\/\n    padding-top: calc(clamp(32px, 10.5cqi, 40px) * (1 - var(--bt-name-scale, 1))) !important;\n    line-height: 1 !important;\n    white-space: nowrap !important;\n    overflow: hidden !important;\n    overflow-x: clip !important;\n    overflow-y: visible !important;\n  }\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row h3{\n    font-size: clamp(25px, 8.2cqi, 30px) !important;\n    line-height: 1 !important;\n  }\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row h2 > .bt-lu-name{\n    display: inline-block;\n    vertical-align: top;\n    white-space: nowrap;\n    transform-origin: 0 100%;\n    font-family: inherit !important;\n    font-weight: inherit !important;\n    font-size: inherit !important;\n    font-style: inherit !important;\n    letter-spacing: inherit !important;\n    line-height: inherit !important;\n    text-transform: inherit !important;\n    color: inherit !important;\n    transition: transform var(--bt-name-dur, 2s) cubic-bezier(.45,0,.25,1);\n  }\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-name-long h2{\n    -webkit-mask-image: linear-gradient(to right, transparent, #000 22px, #000 calc(100% - 26px), transparent);\n            mask-image: linear-gradient(to right, transparent, #000 22px, #000 calc(100% - 26px), transparent);\n    -webkit-mask-size: calc(100% + 22px) 100%;\n            mask-size: calc(100% + 22px) 100%;\n    -webkit-mask-repeat: no-repeat;\n            mask-repeat: no-repeat;\n    -webkit-mask-position: -22px 0;\n            mask-position: -22px 0;\n    transition: opacity .5s ease, -webkit-mask-position .5s ease, mask-position .5s ease, -webkit-mask-size .5s ease, mask-size .5s ease;\n  }\n  \/* Namenswechsel beim \u00d6ffnen\/Schlie\u00dfen: weich aus- und wieder einblenden *\/\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row h2{\n    transition: opacity .5s ease, -webkit-mask-position .5s ease, mask-position .5s ease, -webkit-mask-size .5s ease, mask-size .5s ease;\n  }\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-name-fade h2{\n    opacity: 0 !important;\n    transition-duration: .22s;\n  }\n}\n@media (min-width: 768px) and (hover: hover){\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-name-long:hover h2,\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-name-long:focus-within h2{\n    -webkit-mask-position: 0 0;\n            mask-position: 0 0;\n  }\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-name-long:hover h2 > .bt-lu-name,\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-name-long:focus-within h2 > .bt-lu-name{\n    transform: translateX(var(--bt-name-shift, 0px));\n    transition-delay: .2s;\n  }\n}\n\/* ge\u00f6ffnete Karte: ganzer Name sichtbar, immer einzeilig.\n   Er bleibt stehen, gleitet weich an den Anfang, wird wenn n\u00f6tig\n   sanft etwas kleiner, und die Verl\u00e4ufe am Rand gleiten hinaus.\n   Nur extrem lange Namen brechen um (kurzes \u00dcberblenden). *\/\n@media (min-width: 768px){\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-name-full h2{\n    margin-right: calc(18px - var(--bt-gap)) !important;\n    -webkit-mask-size: calc(100% + 140px) 100% !important;\n            mask-size: calc(100% + 140px) 100% !important;\n    -webkit-mask-position: -70px 0 !important;\n            mask-position: -70px 0 !important;\n    transition: opacity .5s ease, -webkit-mask-position .8s ease, mask-position .8s ease, -webkit-mask-size .8s ease, mask-size .8s ease !important;\n  }\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-name-full h2 > .bt-lu-name{\n    transform: translateX(0) scale(var(--bt-name-open, 1)) !important;\n    transition: transform .9s cubic-bezier(.45,0,.25,1) !important;\n  }\n  \/* beim Schlie\u00dfen gleitet der Name genauso weich zur\u00fcck *\/\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-name-back h2 > .bt-lu-name{\n    transform: translateX(0) !important;\n    transition: transform .9s cubic-bezier(.45,0,.25,1) !important;\n  }\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-name-wrap h2{\n    margin-right: calc(18px - var(--bt-gap)) !important;\n    white-space: normal !important;\n    overflow: visible !important;\n    -webkit-mask-image: none !important;\n            mask-image: none !important;\n  }\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-name-wrap h2 > .bt-lu-name{\n    display: inline !important;\n    white-space: normal !important;\n    transform: none !important;\n    transition: none !important;\n  }\n}\n\n\/* =========================================================\n   10 \u00b7 BREAKPOINTS\n   ========================================================= *\/\n@media (min-width: 1800px){\n  #musik .et_pb_row.bt-lineup-shell{ --bt-per-view: 6; }\n}\n@media (min-width: 981px) and (max-width: 1199px){\n  #musik .et_pb_row.bt-lineup-shell{ --bt-per-view: 3; }\n}\n@media (max-width: 980px){\n  #musik .et_pb_row.bt-lineup-shell{\n    --bt-per-view: 2.12;\n    --bt-gap: 18px;\n    padding: 0 !important;\n  }\n  #musik .bt-lineup-shell .bt-lineup-track{\n    padding: 0 24px 12px !important;\n    scroll-padding-inline: 24px;\n    \/* Wischen: Karten rasten immer sauber und weich ein *\/\n    scroll-snap-type: x mandatory !important;\n  }\n  #musik .bt-lineup-shell .bt-lu-nav{ display: none; }\n}\n@media (max-width: 767px){\n  #musik .et_pb_row.bt-lineup-shell{\n    --bt-gap: 10px;\n    \/* Zeilen bei einzeiligem Namen, l\u00e4ngere Namen bekommen automatisch weniger *\/\n    --bt-text-lines: 11;\n    --bt-text-lh: 1.43;\n    --bt-name-pad: 22px 12px 17px;\n    --bt-text-pad: 28px 12px 75px;\n    --bt-img-gap: 0px;\n  }\n  #musik .bt-lineup-shell .bt-lineup-track{\n    align-items: flex-start !important;\n    \/* Luft unter den Karten *\/\n    padding: 0 16px 42px !important;\n    scroll-padding-inline: 16px;\n  }\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row{\n    --bt-card-w: 86vw;\n    scroll-snap-align: center;\n    scroll-snap-stop: always;\n    \/* alle Karten so lang wie die l\u00e4ngste, Plus \u00fcberall auf einer H\u00f6he *\/\n    min-height: var(--bt-card-min, 0px);\n  }\n  \/* Handy: Name etwas kleiner und kompakter *\/\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row h2{\n    font-size: clamp(28px, 8.6vw, 36px) !important;\n    line-height: .96 !important;\n  }\n  \/* \u201eEvent \u00f6ffnen\u201c etwas n\u00e4her an den Namen *\/\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row h2 + p{\n    margin-top: -4px !important;\n  }\n}\n\n\/* =========================================================\n   11 \u00b7 BARRIEREFREIHEIT \u00b7 weniger Bewegung\n   ========================================================= *\/\n@media (prefers-reduced-motion: reduce){\n  #musik .bt-lineup-shell .bt-lineup-track,\n  #musik .bt-lineup-shell .bt-lineup-track *,\n  #musik .bt-lineup-shell .bt-lineup-track *::before,\n  #musik .bt-lineup-shell .bt-lineup-track *::after,\n  #musik .bt-lineup-shell .bt-lu-nav,\n  #musik .bt-lineup-shell .bt-lu-nav svg,\n  #musik .bt-lineup-shell .bt-lu-hint{\n    transition: none !important;\n    animation: none !important;\n    scroll-behavior: auto !important;\n  }\n  #musik .bt-lineup-shell .bt-lineup-track .et_animated{\n    opacity: 1 !important;\n    transform: none !important;\n  }\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row h2{\n    white-space: normal !important;\n  }\n}\n\n#musik .bt-lineup-shell.bt-lu-measuring .bt-lineup-track *{ transition: none !important; }\n\nbody.et-fb #musik .bt-lineup-shell .bt-lineup-track{ opacity: 1 !important; animation: none !important; }\nbody.et-fb #musik .bt-lineup-shell .bt-lineup-track > .et_pb_code_inner{ display: block !important; }\n\n\/* TAUSEND: centered preview, left-aligned expanded biography. *\/\n#musik .bt-lineup-shell .lineup-row:not(.is-open):not(.is-drawer) > .et_pb_column:nth-child(2) .et_pb_text_inner,\n#musik .bt-lineup-shell .lineup-row:not(.is-open):not(.is-drawer) > .et_pb_column:nth-child(2) .et_pb_text_inner p,\n#musik .bt-lineup-shell .lineup-row:not(.is-open):not(.is-drawer) > .et_pb_column:nth-child(2) .et_pb_text_inner div {\n  text-align:center !important;\n}\n#musik #bt-lu-track > .et_pb_row.lineup-row.is-open > .et_pb_column:nth-child(2) .et_pb_text_inner,\n#musik #bt-lu-track > .et_pb_row.lineup-row.is-open > .et_pb_column:nth-child(2) .et_pb_text_inner p,\n#musik #bt-lu-track > .et_pb_row.lineup-row.is-open > .et_pb_column:nth-child(2) .et_pb_text_inner div,\n#musik #bt-lu-track > .et_pb_row.lineup-row.is-drawer > .et_pb_column:nth-child(2) .et_pb_text_inner,\n#musik #bt-lu-track > .et_pb_row.lineup-row.is-drawer > .et_pb_column:nth-child(2) .et_pb_text_inner p,\n#musik #bt-lu-track > .et_pb_row.lineup-row.is-drawer > .et_pb_column:nth-child(2) .et_pb_text_inner div {\n  text-align:left !important;\n}\n#musik .bt-lineup-shell .bt-image-soon { position:relative; background:#000; }\n#musik .bt-lineup-shell .bt-image-soon::after {\n  content:\"IMAGE SOON\"; position:absolute; inset:0; display:flex;\n  align-items:center; justify-content:center; pointer-events:none;\n  color:#3b3b3b; font:400 12px\/1.4 Poppins,sans-serif; letter-spacing:2px;\n  text-align:center; z-index:1;\n}\n\n\n\/* Handy: Karteninhalte ohne zusaetzliche Divi-Einblendung. *\/\n@media(max-width:980px){\n  #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column > :is(.et_pb_text,.et_pb_image).et_animated{\n    animation:none!important;\n    opacity:1!important;\n    transform:none!important;\n  }\n}\n\n\n\/* Phone names: stable line box shared with the live countdown. *\/\n@media(max-width:767px){\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row h2{font-size:var(--bt-mobile-name-size,clamp(28px,8.6vw,36px))!important;line-height:1.02!important;letter-spacing:-.025em!important;padding-top:2px!important;padding-bottom:4px!important;margin:0!important;}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row h2 > .bt-lu-name{display:block;white-space:normal;font-family:inherit!important;font-weight:inherit!important;font-size:inherit!important;font-style:inherit!important;letter-spacing:inherit!important;line-height:inherit!important;text-transform:inherit!important;color:inherit!important;}\n}\n\n\/* Phone: common category, date and name rows keep all photos aligned. *\/\n@media(max-width:767px){\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:first-child h4{box-sizing:border-box;min-height:var(--bt-mobile-category-h,0px)!important;}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:first-child h3{box-sizing:border-box;min-height:var(--bt-mobile-date-h,0px)!important;}\n#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row > .et_pb_column:first-child h2{box-sizing:border-box;min-height:var(--bt-mobile-name-h,0px)!important;}\n}\n<\/style>\n<style id=\"bt-p1-mobile-carousel-stable\">\n@media(max-width:767px){\nhtml body.page-id-9606 #musik .bt-lineup-shell{--bt-text-lines:8;--bt-mobile-name-size:30px}\nhtml body.page-id-9606 #musik .bt-lineup-shell .bt-lineup-track{opacity:1!important;touch-action:pan-x pan-y pinch-zoom!important;overflow-anchor:none!important}\nhtml body.page-id-9606 #musik .bt-lineup-shell .bt-live-ring{display:none!important}\nhtml body.page-id-9606 #about .et_pb_row,\nhtml body.page-id-9606 #about .et_pb_column,\nhtml body.page-id-9606 #about .et_pb_module,\nhtml body.page-id-9606 #about .et_pb_text_inner{opacity:1!important;visibility:visible!important;animation:none!important}\nhtml body.page-id-9606 #about .bt-ink-svg{display:block!important}\n}\n<\/style>\n\n\n<style id=\"bt-phone-closed-card-alignment\">\n@media(max-width:767px){\nhtml body.page-id-9606 #musik .bt-lineup-shell .bt-lineup-track>.lineup-row:not(.is-open):not(.is-drawer){min-height:var(--bt-card-min,0px)!important;}\nhtml body.page-id-9606 #musik .bt-lineup-shell .bt-lineup-track>.lineup-row.is-open{min-height:0!important;}\nhtml body.page-id-9606 #musik .bt-lineup-shell .bt-lineup-track>.lineup-row h2>.bt-lu-name{overflow:visible!important;text-overflow:clip!important;-webkit-line-clamp:unset!important;}\n}\n<\/style>\n<script consent-skip-blocker=\"1\">\n\/* =========================================================\n   BT \u00b7 LINEUP \u00b7 CAROUSEL V25 \u2014 Logik\n   ========================================================= *\/\n(function () {\n  \"use strict\";\n\n  var d = document;\n  var w = window;\n\n  if (w.__btLineupV25) return;\n  if (\/[?&]et_fb=1\/.test(location.search)) return;\n  if (d.body && d.body.classList.contains(\"et-fb\")) return;\n  w.__btLineupV25 = true;\n\n  \/* Alte Lineup-Module stilllegen, falls noch welche auf der Seite sind *\/\n  [\n    \"__btLineupV5\", \"__btLineupV6\", \"__btLineupV7\", \"__btLineupV8\", \"__btLineupV9\", \"__btLineupV10\", \"__btLineupV11\", \"__btLineupV12\", \"__btLineupV13\", \"__btLineupV14\", \"__btLineupV15\", \"__btLineupV16\", \"__btLineupV17\", \"__btLineupV18\", \"__btLineupV19\", \"__btLineupV20\", \"__btLineupV21\", \"__btLineupV22\", \"__btLineupV23\", \"__btLineupV24\",\n    \"__btLineupDesktopInputV1\", \"__btLineupNativeInputV4\", \"__btLineupMasterStableV3\",\n    \"__btLineupPastSortV43_CLEAN\", \"__btLineupPastSortV44_FIXED\", \"__btLineupOverrideV11Clean\",\n    \"__btLineupFinalStartPatchV2\", \"__btLineupRescueLastPatchV2\", \"__btLineupEmergencyFinal\",\n    \"__btLineupHardFixV1\", \"__btLineupForceMaster12\", \"__btLineupStartFix2706\",\n    \"__btLineupENTranslatePressPatch3006\", \"__btLineupFloatArrowsCLAMP\", \"__btLineupReadmore_V16\",\n    \"__btReadmoreBufferOnlyV1\", \"__btStopScrollOnReadmore\", \"__btReadmoreKeepX_V5\",\n    \"__btReadmoreFirstLoadFixSafeV1\", \"__btSwipeArrowOnlySafeV1\", \"__btLineupFastSwipeLockA\",\n    \"__btLineupSetTimeoutPatchedA\"\n  ].forEach(function (k) { w[k] = true; });\n\n  var script = d.currentScript;\n  var musik = d.getElementById(\"musik\");\n  var shell = (script && script.closest(\".et_pb_row\")) ||\n              (musik && musik.querySelector(\".et_pb_row.bt-lineup-shell\"));\n  if (!shell) return;\n  var track = shell.querySelector(\".bt-lineup-track\") ||\n              (script && script.closest(\".et_pb_code\"));\n  if (!track) return;\n  var section = shell.closest(\".et_pb_section\") || musik || shell.parentElement;\n\n  shell.classList.add(\"bt-lineup-shell\");\n  track.classList.add(\"bt-lineup-track\");\n  track.dataset.built = \"1\";\n  if (!track.id) track.id = \"bt-lu-track\";\n\n  \/* ---------- Sprache ---------- *\/\n  var isEN = \/^en\/i.test(d.documentElement.lang || \"\") || \/^[\/]en([\/]|$)\/.test(location.pathname);\n  var T = isEN ? {\n    details: \"Details\", prev: \"Previous acts\", next: \"Next acts\", restart: \"Back to the current act\",\n    region: \"Line-up\", carousel: \"carousel\", slide: \"slide\", of: \"of\", past: \"past\",\n    track: \"Line-up, scroll with the arrow keys\", newTab: \"(opens in a new tab)\", on: \"on\",\n    text: \"Info text\"\n  } : {\n    details: \"Details zu\", prev: \"Vorherige Acts\", next: \"N\u00e4chste Acts\", restart: \"Zur\u00fcck zum aktuellen Act\",\n    region: \"Line-up\", carousel: \"Karussell\", slide: \"Karte\", of: \"von\", past: \"vergangen\",\n    track: \"Line-up, mit den Pfeiltasten bl\u00e4ttern\", newTab: \"(\u00f6ffnet in neuem Tab)\", on: \"auf\",\n    text: \"Infotext\"\n  };\n  var WS = new RegExp(\"[ \" + String.fromCharCode(9, 10, 13, 160) + \"]+\", \"g\");\n  var CUTOFF_HOUR = 3;\n  var ARROW_SVG = '<svg viewBox=\"0 0 32 24\" aria-hidden=\"true\" focusable=\"false\">' +\n    '<path d=\"M3 12h26M23 6l6 6-6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" ' +\n    'stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>';\n\n  var mqReduce = w.matchMedia(\"(prefers-reduced-motion: reduce)\");\n  var mqDrawer = w.matchMedia(\"(min-width: 768px)\");\n  function reduced() { return mqReduce.matches; }\n  function behavior() { return reduced() ? \"auto\" : \"smooth\"; }\n  function squish(s) { return String(s || \"\").replace(WS, \" \").trim(); }\n  function isCard(el) {\n    return !!(el && el.nodeType === 1 && el.classList &&\n      el.classList.contains(\"et_pb_row\") && el.classList.contains(\"lineup-row\"));\n  }\n  function cards() { return Array.prototype.filter.call(track.children, isCard); }\n  function px(v) { return parseFloat(v) || 0; }\n\n  \/* =======================================================\n     A \u00b7 KARTEN EINSAMMELN \u2014 schon w\u00e4hrend die Seite l\u00e4dt\n     ======================================================= *\/\n  function neutralizeOldReadmore(el) {\n    if (el.nodeType !== 1) return;\n    if (el.classList.contains(\"fc-readmore\")) {\n      el.classList.remove(\"fc-readmore\");\n      el.classList.add(\"bt-lu-text\");\n    }\n    if (el.querySelectorAll) {\n      el.querySelectorAll(\".fc-readmore\").forEach(function (m) {\n        m.classList.remove(\"fc-readmore\");\n        m.classList.add(\"bt-lu-text\");\n      });\n    }\n  }\n  function adopt(row) {\n    if (row.parentNode !== track) track.appendChild(row);\n    neutralizeOldReadmore(row);\n  }\n  function sweep() {\n    if (section) section.querySelectorAll(\".et_pb_row.lineup-row\").forEach(adopt);\n  }\n  var parseObserver = null;\n  if (d.readyState === \"loading\" && section && \"MutationObserver\" in w) {\n    parseObserver = new MutationObserver(function (list) {\n      list.forEach(function (m) {\n        m.addedNodes.forEach(function (n) {\n          if (isCard(n)) adopt(n);\n          else neutralizeOldReadmore(n);\n        });\n      });\n    });\n    parseObserver.observe(section, { childList: true, subtree: true });\n  }\n  sweep();\n\n  \/* =======================================================\n     B \u00b7 DATUM, SORTIERUNG, AKTUELLER ACT\n     ======================================================= *\/\n  function norm(s) { return String(s || \"\").replace(\/[^0-9A-Za-z|:.]+\/g, \" \").trim(); }\n\n  function parseStart(card) {\n    var h3 = card.querySelector(\"h3\");\n    \/* Keep midnight event timing identical in every display language. *\/\n    var fixedStart = h3 && h3.getAttribute(\"data-bt-start\");\n    if (fixedStart) {\n      var fixedDate = new Date(fixedStart);\n      if (!isNaN(fixedDate.getTime())) return fixedDate;\n    }\n    var nameCol = card.querySelector(\":scope > .et_pb_column\");\n    var text = norm(h3 ? h3.textContent : (nameCol ? nameCol.textContent : \"\"));\n    var dm = text.match(\/([0-9]{1,2})[.]([0-9]{1,2})[.]?([0-9]{2,4})?\/);\n    if (!dm) return null;\n    var now = new Date();\n    var day = parseInt(dm[1], 10);\n    var month = parseInt(dm[2], 10) - 1;\n    var year = now.getFullYear();\n    if (dm[3]) {\n      year = parseInt(dm[3], 10);\n      if (year < 100) year += 2000;\n    } else {\n      var diff = month - now.getMonth();\n      if (diff < -6) year += 1;\n      else if (diff > 6) year -= 1;\n    }\n    var hour = 21, minute = 0;\n    var tm = text.match(\/[|] *([0-9]{1,2})(?:[:.]([0-9]{2}))? *(AM|PM|UHR|H)(?![A-Za-z])\/i);\n    if (tm) {\n      hour = parseInt(tm[1], 10);\n      minute = parseInt(tm[2] || \"0\", 10) || 0;\n      var unit = tm[3].toUpperCase();\n      if (unit === \"PM\" && hour < 12) hour += 12;\n      if (unit === \"AM\" && hour === 12) hour = 0;\n    }\n    var date = new Date(year, month, day, hour, minute, 0, 0);\n    return isNaN(date.getTime()) ? null : date;\n  }\n  function activeUntil(start) {\n    var end = new Date(start.getTime());\n    \/* Midnight belongs to the preceding event night: expire at 03:00 the same date. *\/\n    if (start.getHours() >= CUTOFF_HOUR) end.setDate(end.getDate() + 1);\n    end.setHours(CUTOFF_HOUR, 0, 0, 0);\n    return end;\n  }\n\n  var startCard = null;\n  var startIndex = 0;\n  var cardInfo = new Map();\n\n  function sortCards() {\n    var list = cards();\n    var dated = [], undated = [];\n    list.forEach(function (card, i) {\n      var start = parseStart(card);\n      if (start) dated.push({ card: card, start: start, i: i });\n      else undated.push(card);\n    });\n    dated.sort(function (a, b) { return (a.start - b.start) || (a.i - b.i); });\n    var ordered = dated.map(function (x) { return x.card; }).concat(undated);\n    if (ordered.some(function (c, i) { return list[i] !== c; })) {\n      ordered.forEach(function (c) { track.appendChild(c); });\n    }\n    var now = new Date();\n    startCard = null;\n    cardInfo = new Map();\n    dated.forEach(function (x) {\n      var past = now >= activeUntil(x.start);\n      cardInfo.set(x.card, { start: x.start, past: past });\n      if (!startCard && !past) startCard = x.card;\n    });\n    if (!startCard && dated.length) startCard = dated[dated.length - 1].card;\n    if (!startCard) startCard = ordered[0] || null;\n    startIndex = Math.max(0, ordered.indexOf(startCard));\n  }\n\n  \/* =======================================================\n     C \u00b7 KARTE VORBEREITEN (ARIA, Links, Plus\/Minus)\n     ======================================================= *\/\n  var items = [];\n  var itemByCard = new Map();\n\n  function platformName(a) {\n    var s = ((a.getAttribute(\"href\") || \"\") + \" \" + a.className).toLowerCase();\n    var map = [\n      [\"soundcloud\", \"SoundCloud\"], [\"spotify\", \"Spotify\"], [\"mixcloud\", \"Mixcloud\"],\n      [\"bandcamp\", \"Bandcamp\"], [\"instagram\", \"Instagram\"], [\"youtube\", \"YouTube\"],\n      [\"youtu.be\", \"YouTube\"], [\"ra.co\", \"Resident Advisor\"], [\"residentadvisor\", \"Resident Advisor\"],\n      [\"beatport\", \"Beatport\"], [\"facebook\", \"Facebook\"], [\"apple\", \"Apple Music\"]\n    ];\n    for (var i = 0; i < map.length; i++) { if (s.indexOf(map[i][0]) > -1) return map[i][1]; }\n    return \"Link\";\n  }\n  function srSpan(text) {\n    var s = d.createElement(\"span\");\n    s.className = \"bt-lu-sr\";\n    s.textContent = text;\n    return s;\n  }\n  function fixLinks(card, name) {\n    card.querySelectorAll(\"a[href]\").forEach(function (a) {\n      var target = a.getAttribute(\"target\") || \"\";\n      if (target && target !== \"_blank\" && target.indexOf(\"_blank\") === 0) a.setAttribute(\"target\", \"_blank\");\n      var newTab = a.getAttribute(\"target\") === \"_blank\";\n      if (newTab) {\n        var rel = (a.getAttribute(\"rel\") || \"\").split(\" \").filter(Boolean);\n        if (rel.indexOf(\"noopener\") < 0) rel.push(\"noopener\");\n        a.setAttribute(\"rel\", rel.join(\" \"));\n      }\n      if (a.querySelector(\".bt-lu-sr\")) return;\n      var hasText = squish(a.textContent) !== \"\" || a.getAttribute(\"aria-label\") ||\n                    a.querySelector(\"img[alt]:not([alt=''])\");\n      if (!hasText) {\n        a.appendChild(srSpan(name + \" \" + T.on + \" \" + platformName(a) + (newTab ? \" \" + T.newTab : \"\")));\n      } else if (newTab) {\n        a.appendChild(srSpan(\" \" + T.newTab));\n      }\n    });\n  }\n\n  function setupCard(card, index, name) {\n    var col = card.querySelector(\":scope > .et_pb_column:nth-child(2)\");\n    var mod = col && col.querySelector(\":scope > .et_pb_text\");\n    var inner = mod && mod.querySelector(\":scope > .et_pb_text_inner\");\n    if (!inner) return null;\n\n    mod.classList.remove(\"fc-readmore\");\n    mod.classList.add(\"bt-lu-text\");\n    mod.removeAttribute(\"data-bound\");\n    mod.removeAttribute(\"data-collapsed-h\");\n    mod.querySelectorAll(\".fc-toggle-row, .bt-morewrap, .bt-lu-more\").forEach(function (n) { n.remove(); });\n    var clamp = inner.querySelector(\":scope > .bt-clamp\");\n    if (clamp) {\n      while (clamp.firstChild) inner.insertBefore(clamp.firstChild, clamp);\n      clamp.remove();\n    }\n    inner.classList.remove(\"bt-rm-inner\");\n    inner.removeAttribute(\"style\");\n    inner.id = \"bt-lu-text-\" + index;\n    mod.id = \"bt-lu-panel-\" + index;\n\n    var btn = card.querySelector(\":scope > .bt-lu-toggle\");\n    if (!btn) {\n      btn = d.createElement(\"button\");\n      btn.type = \"button\";\n      btn.className = \"bt-lu-toggle\";\n      card.appendChild(btn);\n    }\n    if (!btn.querySelector(\".bt-lu-ring\")) {\n      var ring = d.createElement(\"span\");\n      ring.className = \"bt-lu-ring\";\n      ring.setAttribute(\"aria-hidden\", \"true\");\n      btn.appendChild(ring);\n    }\n    btn.setAttribute(\"aria-controls\", mod.id);\n    btn.setAttribute(\"aria-label\", T.details + \" \" + name);\n    btn.setAttribute(\"aria-expanded\", \"false\");\n\n    var img = card.querySelector(\":scope > .et_pb_column:nth-child(3) img\");\n    var imgMod = card.querySelector(\":scope > .et_pb_column:nth-child(3) .et_pb_image\");\n    \/* Foto-Ausschnitt in der offenen Karte: CSS-Klasse bt-x-0 \u2026 bt-x-100 *\/\n    card.querySelectorAll(\":scope > .et_pb_column:nth-child(3) .et_pb_image\").forEach(function (m) {\n      Array.prototype.forEach.call(m.classList, function (c) {\n        if (c.indexOf(\"bt-x-\") !== 0) return;\n        var v = parseFloat(c.slice(5));\n        if (!isNaN(v)) m.style.setProperty(\"--bt-img-x\", Math.max(0, Math.min(100, v)) + \"%\");\n      });\n    });\n    var bar = col.querySelector(\":scope > .bt-lu-bar\");\n    if (!bar) {\n      bar = d.createElement(\"span\");\n      bar.className = \"bt-lu-bar\";\n      bar.setAttribute(\"aria-hidden\", \"true\");\n      bar.innerHTML = '<span class=\"bt-lu-thumb\"><\/span>';\n      col.appendChild(bar);\n    }\n    var item = { card: card, col: col, mod: mod, inner: inner, btn: btn, img: img, imgMod: imgMod,\n                 bar: bar, thumb: bar.firstChild, name: name, open: false, token: 0 };\n    bindBar(item);\n    setupSlides(item);\n\n    btn.addEventListener(\"click\", function (e) {\n      e.preventDefault();\n      e.stopPropagation();\n      toggle(item);\n    });\n\n    \/* Klick irgendwo auf die Karte (nicht auf Links, nicht beim Ziehen) *\/\n    card.addEventListener(\"click\", function (e) {\n      if (e.defaultPrevented) return;\n      var t = e.target;\n      if (t.closest && t.closest(\"a, button, input, select, textarea, label, iframe, [role='button'], [onclick], .bt-lu-bar\")) return;\n      if (item.open && mod.contains(t)) {\n        \/* Klick auf den Scrollbalken z\u00e4hlt nicht *\/\n        var mr = mod.getBoundingClientRect();\n        if (e.clientX > mr.left + mod.clientLeft + mod.clientWidth) return;\n      }\n      if (String(w.getSelection ? w.getSelection() : \"\").trim()) return;\n      toggle(item);\n    });\n\n    \/* Escape schlie\u00dft, Fokus bleibt auf Plus\/Minus *\/\n    card.addEventListener(\"keydown\", function (e) {\n      if (e.key === \"Escape\" && item.open) {\n        e.preventDefault();\n        toggle(item);\n        btn.focus();\n      }\n    });\n\n    \/* Tastatur: Fokus auf versteckten Link im Vorschautext \u00f6ffnet die Karte *\/\n    inner.addEventListener(\"focusin\", function (e) {\n      if (item.open || card.classList.contains(\"is-short\")) return;\n      var r = e.target.getBoundingClientRect();\n      var top = inner.getBoundingClientRect().top - inner.scrollTop;\n      var cut = inner.clientHeight;\n      inner.scrollTop = 0;\n      if (r.bottom - top > cut) toggle(item, true);\n    });\n\n    itemByCard.set(card, item);\n    return item;\n  }\n\n  \/* Zweites (drittes \u2026) Foto: einfach das Bild-Modul im Builder duplizieren.\n     Die Fotos wechseln ruhig; bei Maus\/Fokus auf der Karte, au\u00dferhalb\n     des Bildschirms und bei \u201eweniger Bewegung\u201c steht der Wechsel still. *\/\n  var SLIDE_MS = 6500;\n  var slideshows = [];\n  var lineupVisible = true;\n  function setupSlides(item) {\n    var mods = item.card.querySelectorAll(\":scope > .et_pb_column:nth-child(3) .et_pb_image\");\n    if (mods.length < 2) return;\n    var extra = Array.prototype.slice.call(mods, 1);\n    extra.forEach(function (m) {\n      m.classList.add(\"bt-lu-slide\");\n      m.querySelectorAll(\"img\").forEach(function (img) { img.setAttribute(\"draggable\", \"false\"); });\n    });\n    slideshows.push({ card: item.card, first: mods[0], extra: extra, idx: 0,\n                      next: 0, delay: slideshows.length * 900 });\n  }\n  function tickSlides() {\n    if (!slideshows.length || reduced() || d.hidden || !lineupVisible) return;\n    var now = performance.now();\n    slideshows.forEach(function (sl) {\n      \/* erst loslegen, wenn das erste Foto geladen und fertig eingeblendet ist *\/\n      if (!sl.next) {\n        var im = sl.first.querySelector(\"img\");\n        if (!im || !im.complete || !im.naturalWidth || sl.first.classList.contains(\"et_animated\")) return;\n        sl.next = now + SLIDE_MS + sl.delay;\n        return;\n      }\n      if (now < sl.next) return;\n      if (sl.card.matches(\":hover\") || sl.card.contains(d.activeElement)) { sl.next = now + 1500; return; }\n      sl.idx = (sl.idx + 1) % (sl.extra.length + 1);\n      sl.extra.forEach(function (m, i) { m.classList.toggle(\"is-active\", i === sl.idx - 1); });\n      sl.next = now + SLIDE_MS;\n    });\n  }\n  function startSlides() {\n    if (!slideshows.length) return;\n    if (\"IntersectionObserver\" in w) {\n      new IntersectionObserver(function (entries) {\n        lineupVisible = entries.some(function (e) { return e.isIntersecting; });\n      }).observe(shell);\n    }\n    setInterval(tickSlides, 500);\n  }\n\n  \/* Scroll-Hinweis (vier Punkte) der ge\u00f6ffneten Karte *\/\n  var FIT = 44;\n  function updateBar(item) {\n    var card = item.card, m = item.mod;\n    if (!card.classList.contains(\"is-drawer\") || !card.classList.contains(\"is-open\")) return;\n    var over = m.scrollHeight - m.clientHeight;\n    var fits = over <= FIT;\n    m.classList.toggle(\"is-fit\", fits);\n    card.classList.toggle(\"has-scroll\", !fits);\n    if (fits) { m.scrollTop = 0; return; }\n    var trackH = item.bar.clientHeight;\n    var thumbH = item.thumb.offsetHeight || 24;\n    var top = (trackH - thumbH) * (m.scrollTop \/ over);\n    item.thumb.style.transform = \"translateY(\" + top.toFixed(1) + \"px)\";\n  }\n  function bindBar(item) {\n    var m = item.mod, bar = item.bar, ticking = false;\n    m.addEventListener(\"scroll\", function () {\n      if (ticking) return;\n      ticking = true;\n      requestAnimationFrame(function () { ticking = false; updateBar(item); });\n    }, { passive: true });\n    \/* Keep scrolling inside only while text can move in that direction. *\/\n    var lastTouchY = null;\n    m.addEventListener(\"touchstart\", function (e) {\n      lastTouchY = e.touches.length === 1 ? e.touches[0].clientY : null;\n    }, { passive: true });\n    function keepInside(e) {\n      var dy = e.deltaY || 0;\n      if (e.type === \"touchmove\") {\n        if (e.touches.length !== 1) { lastTouchY = null; return; }\n        var y = e.touches[0].clientY;\n        dy = lastTouchY === null ? 0 : lastTouchY - y;\n        lastTouchY = y;\n      }\n      if (!item.card.classList.contains(\"has-scroll\")) return;\n      var max = Math.max(0, m.scrollHeight - m.clientHeight);\n      if ((dy > 0 && m.scrollTop < max - 1) || (dy < 0 && m.scrollTop > 1)) e.stopPropagation();\n    }\n    m.addEventListener(\"wheel\", keepInside, { passive: true });\n    m.addEventListener(\"touchmove\", keepInside, { passive: true });\n    var dragging = null;\n    bar.addEventListener(\"pointerdown\", function (e) {\n      if (e.button !== 0) return;\n      e.preventDefault();\n      e.stopPropagation();\n      var over = m.scrollHeight - m.clientHeight;\n      var trackH = bar.clientHeight, thumbH = item.thumb.offsetHeight;\n      var tr = item.thumb.getBoundingClientRect();\n      if (e.clientY < tr.top || e.clientY > tr.bottom) {\n        \/* Klick neben den Griff: eine Seite weiter *\/\n        m.scrollBy({ top: (e.clientY < tr.top ? -1 : 1) * m.clientHeight * 0.85, behavior: behavior() });\n        return;\n      }\n      dragging = { id: e.pointerId, y: e.clientY, top: m.scrollTop, ratio: over \/ Math.max(1, trackH - thumbH) };\n      bar.classList.add(\"is-dragging\");\n      try { bar.setPointerCapture(e.pointerId); } catch (err) {}\n    });\n    bar.addEventListener(\"pointermove\", function (e) {\n      if (!dragging || e.pointerId !== dragging.id) return;\n      m.scrollTop = dragging.top + (e.clientY - dragging.y) * dragging.ratio;\n    });\n    function stop() {\n      if (!dragging) return;\n      try { bar.releasePointerCapture(dragging.id); } catch (err) {}\n      dragging = null;\n      bar.classList.remove(\"is-dragging\");\n    }\n    bar.addEventListener(\"pointerup\", stop);\n    bar.addEventListener(\"pointercancel\", stop);\n    bar.addEventListener(\"lostpointercapture\", stop);\n    bar.addEventListener(\"click\", function (e) { e.stopPropagation(); });\n  }\n\n  function setExpanded(item, open) {\n    item.open = open;\n    item.btn.setAttribute(\"aria-expanded\", open ? \"true\" : \"false\");\n  }\n\n  function prepareAll() {\n    var list = cards();\n    items = [];\n    itemByCard = new Map();\n    shell.setAttribute(\"role\", \"region\");\n    shell.setAttribute(\"aria-roledescription\", T.carousel);\n    shell.setAttribute(\"aria-label\", T.region);\n    track.setAttribute(\"tabindex\", \"0\");\n    track.setAttribute(\"role\", \"group\");\n    track.setAttribute(\"aria-label\", T.track);\n\n    list.forEach(function (card, i) {\n      var h2 = card.querySelector(\"h2\");\n      var name = squish(h2 ? h2.textContent : \"\") || (T.slide + \" \" + (i + 1));\n      var info = cardInfo.get(card);\n      card.classList.toggle(\"is-past\", !!(info && info.past));\n      card.setAttribute(\"role\", \"group\");\n      card.setAttribute(\"aria-roledescription\", T.slide);\n      card.setAttribute(\"aria-label\", (i + 1) + \" \" + T.of + \" \" + list.length + \": \" + name +\n        (info && info.past ? \" (\" + T.past + \")\" : \"\"));\n      card.querySelectorAll(\"img\").forEach(function (img) { img.setAttribute(\"draggable\", \"false\"); });\n      fixLinks(card, name);\n      var item = setupCard(card, i + 1, name);\n      if (item) items.push(item);\n    });\n  }\n\n  \/* =======================================================\n     D \u00b7 MESSEN: Kopfzeilen auf eine Linie, Vorschautext ohne halbe Zeilen\n     ======================================================= *\/\n  function cssVar(el, name) { return getComputedStyle(el).getPropertyValue(name); }\n  function gapPx() { return px(getComputedStyle(track).columnGap) || 32; }\n  function textLines() { var v = px(cssVar(shell, \"--bt-text-lines\")); return v > 0 ? v : 7; }\n  function imgRatio() {\n    var parts = String(cssVar(shell, \"--bt-img-ratio\") || \"4 \/ 3\").split(\"\/\");\n    var a = px(parts[0]), b = px(parts[1]);\n    return (a > 0 && b > 0) ? b \/ a : 0.75;\n  }\n  function collapsedWidth() {\n    var list = cards();\n    for (var i = 0; i < list.length; i++) {\n      var it = itemByCard.get(list[i]);\n      if (!it || !it.open) return list[i].getBoundingClientRect().width;\n    }\n    return list.length ? list[0].getBoundingClientRect().width : 0;\n  }\n\n  \/* Namen einzeilig: erst minimal verkleinern, sonst bei Hover sanft durchlaufen *\/\n  var NAME_MIN = 0.82;\n  var NAME_OPEN_MIN = 0.6;\n  function nameSpan(h2) {\n    var s = h2.querySelector(\":scope > .bt-lu-name\");\n    if (s) return s;\n    s = d.createElement(\"span\");\n    s.className = \"bt-lu-name\";\n    while (h2.firstChild) s.appendChild(h2.firstChild);\n    h2.appendChild(s);\n    return s;\n  }\n  \/* Perf 22.10.: share cached fitting; at most five batched layout rounds. *\/\n  var sharedNameFitCache = new WeakMap();\n  var nameFontEpoch = 0;\n  if (d.fonts && d.fonts.addEventListener) {\n    d.fonts.addEventListener(\"loadingdone\", function () { nameFontEpoch++; });\n  }\n  function fitNameRows(rows) {\n    rows.forEach(function (r) {\n      var cs = getComputedStyle(r.h2);\n      r.key = r.h2.clientWidth + \"|\" + w.innerWidth + \"|\" + r.span.textContent + \"|\" +\n        cs.fontFamily + \"|\" + cs.fontWeight + \"|\" + cs.fontStyle + \"|\" +\n        nameFontEpoch + \"|\" + (d.fonts ? d.fonts.status : \"\");\n      r.known = sharedNameFitCache.get(r.h2);\n    });\n    var todo = rows.filter(function (r) { return !r.known || r.known.key !== r.key; });\n    rows.forEach(function (r) {\n      if (r.known && r.known.key === r.key &&\n          r.h2.style.getPropertyValue(\"--bt-fan-name\") !== r.known.scale) {\n        r.h2.style.setProperty(\"--bt-fan-name\", r.known.scale);\n      }\n    });\n    todo.forEach(function (r) { r.h2.style.setProperty(\"--bt-fan-name\", \"1\"); });\n    var pending = [];\n    todo.forEach(function (r) {\n      r.lo = 0; r.hi = 0;\n      if (r.span.getClientRects().length > 2) {\n        r.lo = 1; r.hi = 16; pending.push(r);\n      }\n    });\n    while (pending.length) {\n      pending.forEach(function (r) {\n        r.mid = Math.floor((r.lo + r.hi) \/ 2);\n        r.h2.style.setProperty(\"--bt-fan-name\", ((40 - r.mid) \/ 40).toFixed(3));\n      });\n      pending.forEach(function (r) {\n        if (r.span.getClientRects().length <= 2) r.hi = r.mid;\n        else r.lo = r.mid + 1;\n      });\n      pending = pending.filter(function (r) { return r.lo < r.hi; });\n    }\n    todo.forEach(function (r) {\n      var scale = ((40 - r.hi) \/ 40).toFixed(3);\n      r.h2.style.setProperty(\"--bt-fan-name\", scale);\n      sharedNameFitCache.set(r.h2, { key: r.key, scale: scale });\n    });\n  }\n  w.__btLuFitNameRowsV1 = fitNameRows;\n  function fitNames() {\n    var rows = [];\n    cards().forEach(function (card) {\n      var h2 = card.querySelector(\"h2\");\n      if (!h2) return;\n      var span = nameSpan(h2);\n      card.classList.remove(\"is-name-long\", \"is-name-wrap\", \"is-name-full\");\n      card.btNameWrap = false;\n      [\"--bt-name-scale\", \"--bt-name-shift\", \"--bt-name-dur\", \"--bt-name-open\"].forEach(function (v) {\n        h2.style.removeProperty(v);\n      });\n      if (mqDrawer.matches) rows.push({ h2: h2, span: span });\n    });\n    fitNameRows(rows);\n  }\n\n  \/* Phone: keep the common name row compact; fit only long names to two lines. *\/\n  var phoneNameFits = new WeakMap();\n  function fitPhoneNames() {\n    if (mqDrawer.matches) return;\n    var rows = [];\n    cards().forEach(function (card) {\n      var h2 = card.querySelector(\"h2\");\n      if (!h2) return;\n      rows.push({h2:h2,span:nameSpan(h2)});\n    });\n    rows.forEach(function (r) {\n      var cs = getComputedStyle(r.h2);\n      r.key = r.h2.clientWidth + \"|\" + r.span.textContent + \"|\" + cs.fontFamily +\n        \"|\" + cs.fontWeight + \"|\" + nameFontEpoch + \"|\" + (d.fonts ? d.fonts.status : \"\");\n      r.known = phoneNameFits.get(r.h2);\n    });\n    var todo = [];\n    rows.forEach(function (r) {\n      if (r.known && r.known.key === r.key) {\n        if (r.h2.style.getPropertyValue(\"--bt-mobile-name-size\") !== r.known.size) {\n          r.h2.style.setProperty(\"--bt-mobile-name-size\", r.known.size);\n        }\n      } else {\n        r.h2.style.setProperty(\"--bt-mobile-name-size\", \"30px\");\n        todo.push(r);\n      }\n    });\n    var pending = [];\n    todo.forEach(function (r) {\n      r.lo = 0; r.hi = 0;\n      if (r.span.getBoundingClientRect().height > 84.5) {\n        r.lo = 1; r.hi = 16; pending.push(r);\n      }\n    });\n    while (pending.length) {\n      pending.forEach(function (r) {\n        r.mid = Math.floor((r.lo + r.hi) \/ 2);\n        r.h2.style.setProperty(\"--bt-mobile-name-size\", (30 - r.mid * 0.5) + \"px\");\n      });\n      pending.forEach(function (r) {\n        if (r.span.getBoundingClientRect().height <= 84.5) r.hi = r.mid;\n        else r.lo = r.mid + 1;\n      });\n      pending = pending.filter(function (r) { return r.lo < r.hi; });\n    }\n    todo.forEach(function (r) {\n      var size = (30 - r.hi * 0.5) + \"px\";\n      r.h2.style.setProperty(\"--bt-mobile-name-size\", size);\n      phoneNameFits.set(r.h2, {key:r.key,size:size});\n    });\n  }\n\n  function equalizeHeads() {\n    var mobile = !mqDrawer.matches;\n    var slots = [\n      { selector: \"h4\", property: \"--bt-mobile-category-h\", max: mobile ? 24 : 0 },\n      { selector: \"h3\", property: \"--bt-mobile-date-h\", max: mobile ? 38 : 0 },\n      { selector: \"h2\", property: \"--bt-mobile-name-h\", max: mobile ? 90 : 0 }\n    ];\n    var list = cards();\n    shell.style.setProperty(\"--bt-head-h\", \"0px\");\n    slots.forEach(function (slot) { shell.style.setProperty(slot.property, \"0px\"); });\n\n    {\n      \/* Shared category, date and name slots also align desktop event links. *\/\n      list.forEach(function (card) {\n        var head = card.querySelector(\":scope > .et_pb_column:nth-child(1)\");\n        if (!head) return;\n        slots.forEach(function (slot) {\n          var node = head.querySelector(slot.selector);\n          if (node) {\n            var natural = node.getBoundingClientRect().height;\n            if (!mobile && slot.selector === \"h2\") {\n              var cs = getComputedStyle(node);\n              var scale = parseFloat(cs.getPropertyValue(\"--bt-fan-name\")) || 1;\n              natural = Math.max(natural, px(cs.lineHeight) * 2 \/ scale);\n            }\n            slot.max = Math.max(slot.max, natural);\n          }\n        });\n      });\n      slots.forEach(function (slot) {\n        shell.style.setProperty(slot.property, Math.ceil(slot.max) + \"px\");\n      });\n    }\n    var max = 0;\n    list.forEach(function (card) {\n      var col = card.querySelector(\":scope > .et_pb_column:nth-child(1)\");\n      if (col) max = Math.max(max, col.getBoundingClientRect().height);\n    });\n    if (max > 0) shell.style.setProperty(\"--bt-head-h\", Math.ceil(max) + \"px\");\n  }\n\n  \/* Handy: Vorschautext passt sich der Namensh\u00f6he an.\n     Einzeiliger Name = volle Zeilenzahl, jede weitere Namenszeile\n     nimmt dem Text so viele Zeilen weg, wie sie Platz braucht. *\/\n  function fitTextLines() {\n    items.forEach(function (it) { it.mod.style.removeProperty(\"--bt-text-lines\"); });\n    if (mqDrawer.matches) return;\n    var base = textLines(), heads = [], lhs = [], min = Infinity;\n    items.forEach(function (it) {\n      var col = it.card.querySelector(\":scope > .et_pb_column:nth-child(1)\");\n      var h = col ? col.getBoundingClientRect().height : 0;\n      heads.push(h);\n      lhs.push(px(getComputedStyle(it.inner).lineHeight) || 20);\n      if (h > 0) min = Math.min(min, h);\n    });\n    if (!isFinite(min)) return;\n    items.forEach(function (it, i) {\n      var lh = lhs[i];\n      var less = Math.round((heads[i] - min) \/ lh);\n      if (less > 0) it.mod.style.setProperty(\"--bt-text-lines\", String(Math.max(3, base - less)));\n    });\n  }\n  function itemLines(item) {\n    var v = px(cssVar(item.mod, \"--bt-text-lines\"));\n    return v > 0 ? v : textLines();\n  }\n\n  \/* Handy: alle Karten so lang wie die l\u00e4ngste (Plus auf einer H\u00f6he) *\/\n  function equalizeCards() {\n    shell.style.removeProperty(\"--bt-card-min\");\n    if (mqDrawer.matches) return;\n    var max = 0;\n    items.forEach(function (it) {\n      if (!it.open) max = Math.max(max, it.card.getBoundingClientRect().height);\n    });\n    if (max > 0) shell.style.setProperty(\"--bt-card-min\", Math.ceil(max) + \"px\");\n  }\n\n  \/* alle Karten auf einmal: erst schreiben, dann lesen, dann schreiben *\/\n  function measureAll() {\n    var list = items.filter(function (it) { return !it.open; });\n    \/* Scroll setters can flush layout: finish them before measurement classes. *\/\n    list.forEach(function (it) { it.inner.scrollTop = 0; });\n    list.forEach(function (it) { it.mod.classList.add(\"is-measure\"); });\n    var res = list.map(function (it) {\n      var lh = px(getComputedStyle(it.inner).lineHeight) || 20;\n      return { lh: lh, full: it.inner.scrollHeight, lines: itemLines(it) };\n    });\n    list.forEach(function (it, i) {\n      var r = res[i];\n      it.mod.classList.remove(\"is-measure\");\n      var isShort = r.full <= r.lines * r.lh + Math.max(8, r.lh * 0.75);\n      it.card.classList.toggle(\"is-short\", isShort);\n      it.mod.classList.toggle(\"is-short\", isShort);\n      it.mod.classList.toggle(\"is-clamped\", !isShort);\n    });\n  }\n\n  function measure(item) {\n    if (item.open) return;\n    var inner = item.inner, mod = item.mod;\n    inner.scrollTop = 0;\n    mod.classList.add(\"is-measure\");\n    var lh = px(getComputedStyle(inner).lineHeight) || 20;\n    var full = inner.scrollHeight;\n    mod.classList.remove(\"is-measure\");\n    var isShort = full <= itemLines(item) * lh + Math.max(8, lh * 0.75);\n    item.card.classList.toggle(\"is-short\", isShort);\n    mod.classList.toggle(\"is-short\", isShort);\n    mod.classList.toggle(\"is-clamped\", !isShort);\n  }\n\n  var headSelf = 0;\n  function layoutAll() {\n    \/* Phone: fit full names once per width\/font, then share every row height. *\/\n    if (w.matchMedia('(max-width: 767px)').matches) {\n      var mobileWidth = collapsedWidth();\n      if (mobileWidth > 0) track.style.setProperty('--bt-w-px', Math.round(mobileWidth) + 'px');\n      fitPhoneNames();\n      equalizeHeads();\n      measureAll();\n      equalizeCards();\n      return;\n    }\n    headSelf++;\n    shell.classList.add(\"bt-lu-measuring\");\n    var photoWidth = collapsedWidth();\n    track.style.setProperty(\"--bt-w-px\", Math.round(photoWidth * 100) \/ 100 + \"px\");\n    \/* Divi kennt nur die Seitenbreite; das Foto braucht die Kartenbreite. *\/\n    if (photoWidth > 0) {\n      var photoSizes = Math.ceil(photoWidth) + \"px\";\n      track.querySelectorAll(\".lineup-row > .et_pb_column:nth-child(3) img[srcset]\").forEach(function (img) {\n        if (img.getAttribute(\"sizes\") !== photoSizes) img.setAttribute(\"sizes\", photoSizes);\n      });\n    }\n    fitNames();\n    fitPhoneNames();\n    equalizeHeads();\n    fitTextLines();\n    measureAll();\n    equalizeCards();\n    requestAnimationFrame(function () {\n      requestAnimationFrame(function () {\n        shell.classList.remove(\"bt-lu-measuring\");\n        headSelf = Math.max(0, headSelf - 1);\n      });\n    });\n  }\n\n  \/* Messen erst, wenn das Line-up in der N\u00e4he ist,\n     und mehrere Messw\u00fcnsche zu einem zusammenfassen *\/\n  var nearView = !(\"IntersectionObserver\" in w);\n  var layoutPending = false, layoutStart = false, layoutRaf = 0, startPositioned = false;\n  \/* Prepare once while the visitor is still above the carousel and input is quiet. *\/\n  var layoutFontReady = false;\n  var prewarmTimer = 0, prewarmIdle = 0, prewarmListening = false, prewarmQuietUntil = 0;\n  var prewarmEvents = ['scroll', 'wheel', 'touchstart', 'pointerdown'];\n  var prewarmFontLimit = Date.now() + 3000; \/* Perf 22.10.: hoechstens 3 s auf Schriften warten *\/\n  function postponePrewarm() { prewarmQuietUntil = Date.now() + 250; }\n  function stopPrewarm() {\n    clearTimeout(prewarmTimer); prewarmTimer = 0;\n    if (prewarmIdle && typeof w.cancelIdleCallback === 'function') w.cancelIdleCallback(prewarmIdle);\n    prewarmIdle = 0;\n    if (prewarmListening) {\n      prewarmEvents.forEach(function (type) { w.removeEventListener(type, postponePrewarm); });\n      prewarmListening = false;\n    }\n  }\n  function queuePrewarm() {\n    if (typeof w.requestIdleCallback !== 'function' ||\n        !w.matchMedia('(min-width:981px) and (hover:hover) and (pointer:fine)').matches ||\n        startPositioned || nearView || !layoutPending || prewarmTimer || prewarmIdle) return;\n    if (!prewarmListening) {\n      prewarmEvents.forEach(function (type) { w.addEventListener(type, postponePrewarm, {passive:true}); });\n      prewarmListening = true;\n      postponePrewarm();\n    }\n    prewarmTimer = setTimeout(function () {\n      prewarmTimer = 0;\n      if (startPositioned || nearView || !layoutPending || d.hidden) { stopPrewarm(); return; }\n      prewarmIdle = w.requestIdleCallback(function (deadline) {\n        prewarmIdle = 0;\n        if (startPositioned || nearView || !layoutPending || d.hidden) { stopPrewarm(); return; }\n        if (prewarmQuietUntil > Date.now() ||\n            (!deadline.didTimeout && 6 > deadline.timeRemaining()) ||\n            (d.fonts && d.fonts.status !== 'loaded' && prewarmFontLimit > Date.now())) {\n          queuePrewarm(); return;\n        }\n        runLayout();\n      }, {timeout:1500});\n    }, 250);\n  }\n  function runLayout() {\n    layoutRaf = 0;\n    if (!layoutPending) return;\n    if (busy || items.some(function (it) { return it.open; })) { layoutPending = false; layoutStart = false; return; }\n    var withStart = layoutStart;\n    layoutPending = false;\n    layoutStart = false;\n    layoutAll();\n    layoutFontReady = !d.fonts || d.fonts.status === \"loaded\";\n    if (withStart || !startPositioned) positionStart();\n    updateArrows();\n    if (!startPositioned) {\n      startPositioned = true;\n      stopPrewarm();\n      shell.setAttribute(\"data-bt-start-index\", String(startIndex));\n      shell.classList.add(\"bt-lu-ready\");\n      try { d.dispatchEvent(new CustomEvent(\"bt:lineup-layout-ready\", { detail: w.BTLineup })); } catch (err) {}\n    }\n  }\n  function requestLayout(withStart) {\n    layoutPending = true;\n    if (withStart) layoutStart = true;\n    if (!nearView) { queuePrewarm(); return; }\n    if (layoutRaf) return;\n    layoutRaf = requestAnimationFrame(runLayout);\n  }\n  function watchNear() {\n    if (!(\"IntersectionObserver\" in w)) return;\n    new IntersectionObserver(function (entries) {\n      nearView = entries.some(function (e) { return e.isIntersecting; });\n      if (nearView && layoutPending && !layoutRaf) layoutRaf = requestAnimationFrame(runLayout);\n    }, { rootMargin: \"600px 0px\" }).observe(shell);\n  }\n\n  \/* =======================================================\n     E \u00b7 \u00d6FFNEN \/ SCHLIESSEN\n     ======================================================= *\/\n  var busy = false;\n  var lockLeft = 0, lockUntil = 0, pointerActive = false;\n\n  function ease(t) { return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) \/ 2; }\n  function tween(ms, step, done) {\n    if (reduced() || ms <= 0) { step(1); if (done) done(); return; }\n    var t0 = performance.now();\n    function frame(now) {\n      var t = Math.min(1, (now - t0) \/ ms);\n      step(ease(t));\n      if (t < 1) requestAnimationFrame(frame);\n      else if (done) done();\n    }\n    requestAnimationFrame(frame);\n  }\n  function later(ms, fn) { if (reduced()) fn(); else setTimeout(fn, ms); }\n\n  function viewBounds() {\n    var tr = track.getBoundingClientRect();\n    var cs = getComputedStyle(track);\n    var padL = px(cs.scrollPaddingLeft) || px(cs.paddingLeft);\n    var padR = px(cs.scrollPaddingRight) || px(cs.paddingRight);\n    return { left: tr.left + track.clientLeft + padL, right: tr.left + track.clientLeft + track.clientWidth - padR };\n  }\n\n  function panelFocusable(item) {\n    var m = item.mod;\n    if (item.open && item.card.classList.contains(\"has-scroll\")) {\n      m.setAttribute(\"tabindex\", \"0\");\n      m.setAttribute(\"role\", \"region\");\n      m.setAttribute(\"aria-label\", T.text + \" \" + item.name);\n    } else {\n      m.removeAttribute(\"tabindex\");\n      m.removeAttribute(\"role\");\n      m.removeAttribute(\"aria-label\");\n    }\n  }\n\n  function clearDrawer(item) {\n    var c = item.card;\n    c.classList.remove(\"is-drawer\", \"is-open\", \"is-tween\", \"has-scroll\", \"is-name-wrap\", \"is-name-fade\", \"is-name-full\", \"is-name-back\", \"bt-lu-changing\");\n    item.mod.classList.remove(\"is-fit\");\n    [\"--bt-cw\", \"--bt-p\", \"--bt-img-top\", \"--bt-img-h\", \"--bt-panel\", \"--bt-open\"].forEach(function (p) {\n      c.style.removeProperty(p);\n    });\n    item.mod.classList.remove(\"is-leaving\", \"is-entering\");\n    item.mod.scrollTop = 0;\n    setExpanded(item, false);\n    panelFocusable(item);\n  }\n\n  function holdPhoto(item) {\n    item.photoPose = [];\n    item.card.querySelectorAll(\":scope > .et_pb_column:nth-child(3) img\").forEach(function (img) {\n      var cs = getComputedStyle(img);\n      item.photoPose.push({ img: img, transform: img.style.transform, transition: img.style.transition });\n      img.style.setProperty(\"transform\", cs.transform === \"none\" ? \"scale(1)\" : cs.transform);\n      img.style.setProperty(\"transition\", \"none\", \"important\");\n    });\n  }\n  function releasePhoto(item) {\n    (item.photoPose || []).forEach(function (pose) {\n      if (pose.transition) pose.img.style.transition = pose.transition;\n      else pose.img.style.removeProperty(\"transition\");\n      if (pose.transform) pose.img.style.transform = pose.transform;\n      else pose.img.style.removeProperty(\"transform\");\n    });\n    item.photoPose = null;\n  }\n\n  function openDrawer(item, done) {\n    busy = true;\n    var card = item.card, mod = item.mod;\n    var W = collapsedWidth();\n    var g = gapPx();\n    lockX(1600);\n    setExpanded(item, true);\n    card.classList.add(\"bt-lu-changing\");\n\n    \/* 1 \u00b7 Vorschautext gleitet nach unten weg,\n           ein langer Name blendet kurz aus (wird gleich umbrochen) *\/\n    mod.classList.add(\"is-leaving\");\n    var longName = card.classList.contains(\"is-name-long\");\n    var fadeName = longName && card.btNameWrap;\n    if (fadeName) card.classList.add(\"is-name-fade\");\n    else if (longName) card.classList.add(\"is-name-full\");\n\n    later(230, function () {\n      var cr = card.getBoundingClientRect();\n      var ir = item.imgMod ? item.imgMod.getBoundingClientRect() : cr;\n      var H = cr.height;\n      var top0 = ir.top - cr.top;\n      var h0 = ir.height;\n      item.closedPhoto = { top: top0, height: h0, width: W };\n      holdPhoto(item);\n\n      card.style.setProperty(\"--bt-cw\", W + \"px\");\n      card.style.setProperty(\"--bt-p\", \"0\");\n      card.style.setProperty(\"--bt-panel\", \"0\");\n      card.style.setProperty(\"--bt-open\", \"0\");\n      card.style.setProperty(\"--bt-img-top\", top0 + \"px\");\n      card.style.setProperty(\"--bt-img-h\", h0 + \"px\");\n      card.classList.add(\"is-drawer\", \"is-tween\", \"is-open\");\n      if (fadeName) card.classList.add(\"is-name-wrap\");\n      mod.classList.remove(\"is-leaving\");\n      if (fadeName) later(40, function () { card.classList.remove(\"is-name-fade\"); });\n\n      var vb = viewBounds();\n      var s0 = track.scrollLeft, s1 = s0;\n      var endRight = cr.left + 2 * W + g;\n      if (endRight > vb.right) s1 = s0 + (endRight - vb.right);\n      if (cr.left - (s1 - s0) < vb.left) s1 = s0 + (cr.left - vb.left);\n      track.style.setProperty(\"scroll-snap-type\", \"none\", \"important\");\n\n      \/* 2 \u00b7 Karte wird breiter, Kopf wandert nach rechts,\n             Bild w\u00e4chst \u00fcber die ganze linke Seite, Text gleitet herein *\/\n      tween(parseFloat(cssVar(shell, \"--bt-speed\")) || 760, function (p) {\n        card.style.setProperty(\"--bt-cw\", (W + p * (W + g)) + \"px\");\n        card.style.setProperty(\"--bt-p\", String(p));\n        card.style.setProperty(\"--bt-img-top\", (top0 * (1 - p)) + \"px\");\n        card.style.setProperty(\"--bt-img-h\", (h0 + (H - h0) * p) + \"px\");\n        card.style.setProperty(\"--bt-panel\", String(Math.max(0, (p - 0.45) \/ 0.55)));\n        card.style.setProperty(\"--bt-open\", String(p));\n        track.scrollLeft = s0 + p * (s1 - s0);\n        lockLeft = track.scrollLeft;\n      }, function () {\n        card.classList.remove(\"is-tween\", \"bt-lu-changing\");\n        releasePhoto(item);\n        card.style.setProperty(\"--bt-cw\", (2 * W + g) + \"px\");\n        [\"--bt-p\", \"--bt-panel\", \"--bt-open\", \"--bt-img-top\", \"--bt-img-h\"].forEach(function (v) {\n          card.style.removeProperty(v);\n        });\n        track.style.removeProperty(\"scroll-snap-type\");\n        lockUntil = 0;\n        updateBar(item);\n        panelFocusable(item);\n        busy = false;\n        afterMove();\n        if (done) done();\n      });\n    });\n  }\n\n  function closeDrawer(item, done) {\n    busy = true;\n    var card = item.card, mod = item.mod;\n    card.classList.add(\"bt-lu-changing\");\n    later(200, function () {\n    var W = px(cssVar(track, \"--bt-w-px\")) || collapsedWidth();\n    var cr = card.getBoundingClientRect();\n    var wNow = cr.width;\n    var H = cr.height;\n    var head = card.querySelector(\":scope > .et_pb_column:nth-child(1)\");\n    \/* Zielh\u00f6he des Kopfs = H\u00f6he im geschlossenen Zustand\n       (in der offenen Karte darf der Name zweizeilig sein) *\/\n    var top0 = px(shell.style.getPropertyValue(\"--bt-head-h\")) ||\n               (head ? head.getBoundingClientRect().height : 0);\n    var saved = item.closedPhoto;\n    if (saved && Math.abs(saved.width - W) < 1) top0 = saved.top;\n    var h0 = saved && Math.abs(saved.width - W) < 1 ? saved.height : W * imgRatio();\n    holdPhoto(item);\n    lockX(1400);\n    setExpanded(item, false);\n    card.style.setProperty(\"--bt-cw\", wNow + \"px\");\n    card.style.setProperty(\"--bt-p\", \"1\");\n    card.style.setProperty(\"--bt-panel\", \"1\");\n    card.style.setProperty(\"--bt-open\", \"1\");\n    card.style.setProperty(\"--bt-img-top\", \"0px\");\n    card.style.setProperty(\"--bt-img-h\", H + \"px\");\n    card.classList.add(\"is-tween\");\n    card.classList.remove(\"is-open\", \"has-scroll\");\n    \/* langer Name gleitet weich zur\u00fcck *\/\n    if (card.classList.contains(\"is-name-full\")) {\n      card.classList.remove(\"is-name-full\");\n      card.classList.add(\"is-name-back\");\n    }\n    \/* zweizeiliger Name: kurz ausblenden, einzeilig stellen, gleich wieder einblenden *\/\n    if (card.classList.contains(\"is-name-wrap\")) {\n      card.classList.add(\"is-name-fade\");\n      later(420, function () { card.classList.remove(\"is-name-wrap\"); });\n      later(470, function () { card.classList.remove(\"is-name-fade\"); });\n    }\n\n    tween(parseFloat(cssVar(shell, \"--bt-speed\")) || 760, function (q) {\n      var p = 1 - q;\n      card.style.setProperty(\"--bt-cw\", (W + p * (wNow - W)) + \"px\");\n      card.style.setProperty(\"--bt-p\", String(p));\n      card.style.setProperty(\"--bt-img-top\", (top0 * (1 - p)) + \"px\");\n      card.style.setProperty(\"--bt-img-h\", (h0 + (H - h0) * p) + \"px\");\n      card.style.setProperty(\"--bt-panel\", String(Math.max(0, (p - 0.6) \/ 0.4)));\n      card.style.setProperty(\"--bt-open\", String(p));\n    }, function () {\n      clearDrawer(item);\n      releasePhoto(item);\n      \/* 3 \u00b7 Vorschautext gleitet von unten wieder herein *\/\n      mod.classList.add(\"is-entering\");\n      measure(item);\n      void mod.offsetHeight;\n      mod.classList.remove(\"is-entering\");\n      lockUntil = 0;\n      busy = false;\n      afterMove();\n      if (done) done();\n    });\n    });\n  }\n\n  \/* Handy: Text klappt nach unten auf *\/\n  function afterTransition(el, token, item, done) {\n    var dur = px(getComputedStyle(el).transitionDuration);\n    var finished = false;\n    function finish() {\n      if (finished || token !== item.token) return;\n      finished = true;\n      el.removeEventListener(\"transitionend\", onEnd);\n      done();\n    }\n    function onEnd(e) { if (e.target === el && e.propertyName === \"max-height\") finish(); }\n    if (dur <= 0 || reduced()) { finish(); return; }\n    el.addEventListener(\"transitionend\", onEnd);\n    setTimeout(finish, dur * 1000 + 120);\n  }\n  function openVertical(item) {\n    var inner = item.inner, mod = item.mod;\n    var token = ++item.token;\n    lockX(1200);\n    item.clampH = inner.getBoundingClientRect().height;\n    inner.style.setProperty(\"--bt-mh\", item.clampH + \"px\");\n    mod.classList.remove(\"is-closing\");\n    mod.classList.add(\"is-open\", \"is-animating\");\n    item.card.classList.add(\"is-open\");\n    setExpanded(item, true);\n    void inner.offsetHeight;\n    inner.style.setProperty(\"--bt-mh\", inner.scrollHeight + \"px\");\n    afterTransition(inner, token, item, function () {\n      inner.style.removeProperty(\"--bt-mh\");\n      mod.classList.remove(\"is-animating\");\n    });\n  }\n  function closeVertical(item) {\n    var inner = item.inner, mod = item.mod;\n    var token = ++item.token;\n    lockX(1200);\n    inner.style.setProperty(\"--bt-mh\", inner.getBoundingClientRect().height + \"px\");\n    mod.classList.add(\"is-animating\", \"is-closing\");\n    mod.classList.remove(\"is-open\");\n    item.card.classList.remove(\"is-open\");\n    setExpanded(item, false);\n    void inner.offsetHeight;\n    inner.style.setProperty(\"--bt-mh\", (item.clampH || itemLines(item) * (px(getComputedStyle(inner).lineHeight) || 20)) + \"px\");\n    afterTransition(inner, token, item, function () {\n      inner.style.removeProperty(\"--bt-mh\");\n      mod.classList.remove(\"is-animating\", \"is-closing\");\n      measure(item);\n      var r = item.card.getBoundingClientRect();\n      if (r.top < 0) w.scrollBy({ top: r.top - 24, behavior: behavior() });\n    });\n  }\n\n  function toggle(item, forceOpen) {\n    if (busy || (!mqDrawer.matches && item.card.classList.contains(\"is-short\"))) return;\n    var willOpen = forceOpen ? true : !item.open;\n    if (willOpen === item.open) return;\n\n    if (!mqDrawer.matches) {\n      if (willOpen) {\n        items.forEach(function (o) { if (o !== item && o.open) closeVertical(o); });\n        openVertical(item);\n      } else {\n        closeVertical(item);\n      }\n      return;\n    }\n\n    if (!willOpen) { closeDrawer(item); return; }\n    var other = null;\n    items.forEach(function (o) { if (o !== item && o.open) other = o; });\n    if (other) closeDrawer(other, function () { openDrawer(item); });\n    else openDrawer(item);\n  }\n\n  function resetAll() {\n    items.forEach(function (it) {\n      it.token++;\n      clearDrawer(it);\n      it.mod.classList.remove(\"is-open\", \"is-animating\", \"is-closing\");\n      it.inner.style.removeProperty(\"--bt-mh\");\n    });\n    busy = false;\n  }\n\n  \/* =======================================================\n     F \u00b7 NAVIGATION\n     ======================================================= *\/\n  var userMoved = false;\n  var lastIndex = 0;\n  var prevBtn = null, nextBtn = null;\n\n  function lockX(ms) {\n    lockLeft = track.scrollLeft;\n    lockUntil = performance.now() + ms;\n  }\n  function maxScroll() { return Math.max(0, track.scrollWidth - track.clientWidth); }\n  function xFor(card) {\n    var cs = getComputedStyle(card);\n    var tr = track.getBoundingClientRect();\n    var cr = card.getBoundingClientRect();\n    var base = track.scrollLeft + cr.left - tr.left - track.clientLeft;\n    var x;\n    if ((cs.scrollSnapAlign || \"\").indexOf(\"center\") > -1) {\n      x = base - (track.clientWidth - cr.width) \/ 2;\n    } else {\n      var tcs = getComputedStyle(track);\n      var pad = parseFloat(tcs.scrollPaddingLeft);\n      if (isNaN(pad)) pad = px(tcs.paddingLeft);\n      x = base - pad;\n    }\n    return Math.max(0, Math.min(Math.round(x), maxScroll()));\n  }\n  function currentIndex() {\n    var list = cards(), left = track.scrollLeft, best = 0, bestD = Infinity;\n    list.forEach(function (c, i) {\n      var dd = Math.abs(xFor(c) - left);\n      if (dd < bestD) { bestD = dd; best = i; }\n    });\n    return best;\n  }\n  function goTo(i, smooth) {\n    var list = cards();\n    if (!list.length) return;\n    i = Math.max(0, Math.min(i, list.length - 1));\n    lastIndex = i;\n    warmMobileImages(i);\n    track.scrollTo({ left: xFor(list[i]), behavior: smooth ? behavior() : \"auto\" });\n  }\n  function step(dir, minIndex) {\n    var list = cards(), left = track.scrollLeft, i;\n    var lo = typeof minIndex === \"number\" ? minIndex : 0;\n    if (dir > 0) {\n      \/* am Ende: zur\u00fcck zum aktuellen Act *\/\n      if (left >= maxScroll() - 4) { goTo(startIndex, true); return; }\n      for (i = 0; i < list.length; i++) { if (xFor(list[i]) > left + 4) { goTo(i, true); return; } }\n      goTo(list.length - 1, true);\n    } else {\n      for (i = list.length - 1; i >= lo; i--) { if (xFor(list[i]) < left - 4) { goTo(i, true); return; } }\n      goTo(lo, true);\n    }\n  }\n  function positionStart() {\n    if (userMoved || !startCard) return;\n    var i = cards().indexOf(startCard);\n    if (i < 0) return;\n    lastIndex = i;\n    track.scrollLeft = xFor(startCard);\n  }\n  function updateArrows() {\n    if (!prevBtn) return;\n    var left = track.scrollLeft, max = maxScroll();\n    var avail = left > 2;\n    prevBtn.classList.toggle(\"is-available\", avail);\n    prevBtn.classList.toggle(\"is-hidden\", !avail);\n    var atEnd = left >= max - 2;\n    nextBtn.classList.toggle(\"is-hidden\", max < 4);\n    if (atEnd !== nextBtn.classList.contains(\"is-restart\")) {\n      nextBtn.classList.toggle(\"is-restart\", atEnd);\n      nextBtn.setAttribute(\"aria-label\", atEnd ? T.restart : T.next);\n    }\n  }\n  function afterMove() {\n    updateArrows();\n    lastIndex = currentIndex();\n  }\n  function makeArrow(cls, label, onClick) {\n    var b = d.createElement(\"button\");\n    b.type = \"button\";\n    b.className = \"bt-lu-nav \" + cls;\n    b.setAttribute(\"aria-label\", label);\n    b.setAttribute(\"aria-controls\", track.id);\n    b.innerHTML = ARROW_SVG;\n    b.addEventListener(\"click\", function () {\n      if (b.classList.contains(\"is-hidden\")) return;\n      userMoved = true;\n      onClick();\n    });\n    return b;\n  }\n  function buildArrows() {\n    shell.querySelectorAll(\":scope > .bt-lu-nav, :scope > .bt-lu-hint\").forEach(function (n) { n.remove(); });\n    var column = track.parentElement;\n    prevBtn = makeArrow(\"prev\", T.prev, function () { step(-1); });\n    nextBtn = makeArrow(\"next\", T.next, function () { step(1); });\n    shell.insertBefore(prevBtn, column);\n    shell.appendChild(nextBtn);\n  }\n\n  function bindInput() {\n    function interacted() { userMoved = true; }\n    var dragId = null, startX = 0, startLeft = 0, dragged = false, dragIdx = 0, lastDx = 0;\n    function interactive(t) {\n      return t && t.closest && t.closest(\"a, button, input, textarea, select, label, [contenteditable], .et_pb_button, .bt-lu-bar\");\n    }\n    track.addEventListener(\"pointerdown\", function (e) {\n      pointerActive = true;\n      interacted();\n      if (e.pointerType !== \"mouse\" || e.button !== 0) return;\n      dragged = false;\n      if (interactive(e.target)) return;\n      dragId = e.pointerId;\n      startX = e.clientX;\n      startLeft = track.scrollLeft;\n      dragIdx = currentIndex();\n      lastDx = 0;\n    }, { passive: true });\n    track.addEventListener(\"pointermove\", function (e) {\n      if (dragId === null || e.pointerId !== dragId) return;\n      var dx = e.clientX - startX;\n      if (!dragged && Math.abs(dx) <= 5) return;\n      if (!dragged) {\n        dragged = true;\n        track.classList.add(\"is-dragging\");\n        try { track.setPointerCapture(dragId); } catch (err) {}\n      }\n      if (e.cancelable) e.preventDefault();\n      lastDx = dx;\n      track.scrollLeft = startLeft - dx;\n    }, { passive: false });\n    function endDrag() {\n      pointerActive = false;\n      var wasDrag = dragId !== null && dragged;\n      if (dragId !== null) {\n        try { if (track.hasPointerCapture(dragId)) track.releasePointerCapture(dragId); } catch (err) {}\n      }\n      dragId = null;\n      track.classList.remove(\"is-dragging\");\n      \/* nach dem Ziehen sanft auf die n\u00e4chste Karte einrasten *\/\n      if (wasDrag) {\n        var target = currentIndex();\n        if (target === dragIdx && Math.abs(lastDx) > 40) target += lastDx < 0 ? 1 : -1;\n        goTo(target, true);\n      }\n    }\n    track.addEventListener(\"pointerup\", endDrag);\n    track.addEventListener(\"pointercancel\", endDrag);\n    track.addEventListener(\"lostpointercapture\", endDrag);\n    w.addEventListener(\"blur\", endDrag);\n    track.addEventListener(\"click\", function (e) {\n      if (dragged && !interactive(e.target)) { e.preventDefault(); e.stopPropagation(); }\n      dragged = false;\n    }, true);\n    track.addEventListener(\"dragstart\", function (e) { e.preventDefault(); });\n    track.addEventListener(\"touchstart\", function () { pointerActive = true; lockUntil = 0; interacted(); }, { passive: true });\n    track.addEventListener(\"touchend\", function () { pointerActive = false; }, { passive: true });\n    track.addEventListener(\"touchcancel\", function () { pointerActive = false; }, { passive: true });\n    track.addEventListener(\"wheel\", function (e) {\n      if (Math.abs(e.deltaX) > Math.abs(e.deltaY)) {\n        interacted(); lockUntil = 0;\n        \/* Divi-Smoothscroll w\u00fcrde waagerechtes Wischen sonst abfangen *\/\n        e.stopPropagation();\n      }\n    }, { passive: true });\n\n    track.addEventListener(\"keydown\", function (e) {\n      if (e.target !== track) return;\n      var k = e.key;\n      if (k === \"Home\") goTo(0, true);\n      else if (k === \"End\") goTo(cards().length - 1, true);\n      else return;\n      interacted();\n      e.preventDefault();\n    });\n\n    var ticking = false, settleTimer = null;\n    track.addEventListener(\"scroll\", function () {\n      if (lockUntil && performance.now() < lockUntil && !pointerActive && !busy &&\n          Math.abs(track.scrollLeft - lockLeft) > 1) {\n        track.scrollLeft = lockLeft;\n      }\n      if (!ticking) {\n        ticking = true;\n        requestAnimationFrame(function () { ticking = false; updateArrows(); });\n      }\n      clearTimeout(settleTimer);\n      settleTimer = setTimeout(function () {\n        lastIndex = currentIndex();\n        warmMobileImages(lastIndex);\n      }, 140);\n    }, { passive: true });\n\n    \/* nur echte Breiten\u00e4nderungen (Handy-Adressleiste \u00e4ndert nur die H\u00f6he) *\/\n    var lastWidth = track.clientWidth, resizeTimer = null;\n    function onWidthChange() {\n      resetAll();\n      layoutAll();\n      if (userMoved) goTo(lastIndex, false);\n      else positionStart();\n      updateArrows();\n    }\n    function check() {\n      var wNow = track.clientWidth;\n      if (Math.abs(wNow - lastWidth) < 1) return;\n      lastWidth = wNow;\n      clearTimeout(resizeTimer);\n      resizeTimer = setTimeout(onWidthChange, 140);\n    }\n    if (\"ResizeObserver\" in w) new ResizeObserver(check).observe(track);\n    else w.addEventListener(\"resize\", check);\n  }\n\n  \/* =======================================================\n     F2 \u00b7 RAND-PFEILE AN DER MAUS + PFEILTASTEN\n     ======================================================= *\/\n  var edgeDir = 0;\n  var hovering = false;\n\n  function prevAvailable() { return !!(prevBtn && prevBtn.classList.contains(\"is-available\")); }\n  function blockedTarget(t) {\n    return !!(t && t.closest && (\n      t.closest(\"a, input, select, textarea, label, .bt-lu-toggle, .bt-lu-bar\") ||\n      t.closest(\".lineup-row.is-open .bt-lu-text\")\n    ));\n  }\n  \/* TAUSEND-Cursor: im ganzen Line-up in der aktiven (halbtransparenten)\n     Form, denn hier ist alles klickbar *\/\n  var CURSOR_ACTIVE = \"is-interactive\";\n  var cursorObs = null, cursorEl = null, cursorSet = false;\n  function keepCursorActive() {\n    if (!cursorEl || !hovering || edgeDir) return;\n    if (!cursorEl.classList.contains(CURSOR_ACTIVE)) {\n      cursorSet = true;\n      cursorEl.classList.add(CURSOR_ACTIVE);\n    }\n  }\n  function watchThemeCursor() {\n    var el = d.getElementById(\"bt-theme-cursor\");\n    if (!el) return;\n    if (el !== cursorEl) {\n      if (cursorObs) cursorObs.disconnect();\n      cursorEl = el;\n      cursorObs = \"MutationObserver\" in w ? new MutationObserver(keepCursorActive) : null;\n    }\n    if (cursorObs) cursorObs.observe(cursorEl, { attributes: true, attributeFilter: [\"class\"] });\n    keepCursorActive();\n  }\n  function releaseThemeCursor() {\n    if (cursorObs) cursorObs.disconnect();\n    if (cursorEl && cursorSet) cursorEl.classList.remove(CURSOR_ACTIVE);\n    cursorSet = false;\n  }\n\n  function inView() {\n    var r = shell.getBoundingClientRect();\n    var vh = w.innerHeight || d.documentElement.clientHeight;\n    var visible = Math.min(r.bottom, vh) - Math.max(r.top, 0);\n    return visible > Math.min(r.height, vh) * 0.5;\n  }\n\n  function initEdgeArrows() {\n    if (!prevBtn || !nextBtn) return;\n    var fine = w.matchMedia(\"(hover: hover) and (pointer: fine)\");\n    var mqNav = w.matchMedia(\"(min-width: 981px)\");\n    var state = [\n      { b: prevBtn, x: 0, y: 0, tx: 0, ty: 0 },\n      { b: nextBtn, x: 0, y: 0, tx: 0, ty: 0 }\n    ];\n    var raf = 0;\n\n    function frame() {\n      raf = 0;\n      var moving = false;\n      var k = reduced() ? 1 : 0.2;\n      state.forEach(function (s) {\n        s.x += (s.tx - s.x) * k;\n        s.y += (s.ty - s.y) * k;\n        if (Math.abs(s.tx - s.x) > 0.3 || Math.abs(s.ty - s.y) > 0.3) moving = true;\n        else { s.x = s.tx; s.y = s.ty; }\n        s.b.style.transform = (s.x || s.y) ? \"translate(\" + s.x.toFixed(1) + \"px,\" + s.y.toFixed(1) + \"px)\" : \"\";\n      });\n      if (moving) raf = requestAnimationFrame(frame);\n    }\n    function kick() { if (!raf) raf = requestAnimationFrame(frame); }\n\n    function setEdge(dir, x, y) {\n      edgeDir = dir;\n      shell.classList.toggle(\"is-edge-next\", dir === 1);\n      shell.classList.toggle(\"is-edge-prev\", dir === -1);\n      var tc = d.getElementById(\"bt-theme-cursor\");\n      if (tc) tc.classList.toggle(\"bt-lu-cursor-hidden\", dir !== 0);\n      if (!dir) keepCursorActive();\n      state.forEach(function (s) {\n        var active = (dir === 1 && s.b === nextBtn) || (dir === -1 && s.b === prevBtn);\n        if (active) {\n          var cx = s.b.offsetLeft + s.b.offsetWidth \/ 2;\n          var cy = s.b.offsetTop + s.b.offsetHeight \/ 2;\n          s.tx = x - cx;\n          s.ty = y - cy;\n        } else {\n          s.tx = 0;\n          s.ty = 0;\n        }\n      });\n      kick();\n    }\n\n    shell.addEventListener(\"pointermove\", function (e) {\n      if (e.pointerType !== \"mouse\" || !fine.matches || !mqNav.matches ||\n          track.classList.contains(\"is-dragging\")) {\n        if (edgeDir) setEdge(0);\n        return;\n      }\n      var r = shell.getBoundingClientRect();\n      var x = e.clientX - r.left, y = e.clientY - r.top;\n      var zone = Math.max(90, px(getComputedStyle(shell).paddingRight) + 56);\n      var dir = 0;\n      if (x >= r.width - zone && !nextBtn.classList.contains(\"is-hidden\")) dir = 1;\n      else if (x <= zone && prevAvailable()) dir = -1;\n      if (dir && blockedTarget(e.target)) dir = 0;\n      if (dir) setEdge(dir, x, y);\n      else if (edgeDir) setEdge(0);\n    }, { passive: true });\n    shell.addEventListener(\"pointerenter\", function (e) {\n      hovering = true;\n      if (e.pointerType === \"mouse\") { d.body.classList.add(\"bt-lu-hover\"); watchThemeCursor(); }\n    });\n    shell.addEventListener(\"pointerleave\", function () {\n      hovering = false;\n      if (edgeDir) setEdge(0);\n      if (d.body.classList.contains(\"bt-lu-hover\")) d.body.classList.remove(\"bt-lu-hover\");\n      releaseThemeCursor();\n    });\n\n    \/* Klick im Randbereich bl\u00e4ttert (auch wenn der Pfeil gerade nachgleitet) *\/\n    shell.addEventListener(\"click\", function (e) {\n      if (!edgeDir) return;\n      var t = e.target;\n      if (t.closest && t.closest(\".bt-lu-nav\")) return;\n      if (blockedTarget(t)) return;\n      e.preventDefault();\n      e.stopPropagation();\n      userMoved = true;\n      if (edgeDir > 0) step(1);\n      else step(-1);\n    }, true);\n  }\n\n  \/* Pfeiltasten: wenn der Fokus im Line-up ist, die Maus dar\u00fcber steht\n     oder das Line-up gut sichtbar ist und nichts anderes den Fokus hat *\/\n  function initKeys() {\n    d.addEventListener(\"keydown\", function (e) {\n      if (e.defaultPrevented || e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) return;\n      if (e.key !== \"ArrowLeft\" && e.key !== \"ArrowRight\") return;\n      var t = e.target;\n      if (t && t.closest && t.closest(\"input, textarea, select, [contenteditable='true'], [contenteditable='']\")) return;\n      var inside = shell.contains(t);\n      var idle = !t || t === d.body || t === d.documentElement;\n      if (!inside && !(idle && (hovering || inView()))) return;\n      e.preventDefault();\n      userMoved = true;\n      step(e.key === \"ArrowRight\" ? 1 : -1);\n    });\n  }\n\n  \/* leiser Hinweis: Handy = Pfeil am Rand, Desktop = rechter Pfeil stupst einmal *\/\n  function buildHints() {\n    if (!(\"IntersectionObserver\" in w)) return;\n    var hint = null;\n    if (w.matchMedia(\"(max-width: 980px)\").matches) {\n      hint = d.createElement(\"div\");\n      hint.className = \"bt-lu-hint\";\n      hint.setAttribute(\"aria-hidden\", \"true\");\n      hint.innerHTML = ARROW_SVG;\n      shell.appendChild(hint);\n    }\n    var io = new IntersectionObserver(function (entries) {\n      if (!entries.some(function (e) { return e.isIntersecting; })) return;\n      io.disconnect();\n      if (userMoved || reduced()) return;\n      if (hint) {\n        requestAnimationFrame(function () { hint.classList.add(\"is-visible\"); });\n        setTimeout(function () { hint.classList.remove(\"is-visible\"); hint.classList.add(\"is-gone\"); }, 4200);\n      } else if (nextBtn) {\n        setTimeout(function () {\n          nextBtn.classList.add(\"is-nudge\");\n          setTimeout(function () { nextBtn.classList.remove(\"is-nudge\"); }, 1800);\n        }, 900);\n      }\n    }, { threshold: 0.5 });\n    io.observe(shell);\n  }\n\n  \/* =======================================================\n     G \u00b7 DATEN F\u00dcR TICKER \/ TV-SCREEN\n     window.BTLineup.events  +  Event \"bt:lineup-ready\"\n     ======================================================= *\/\n  function publish() {\n    var list = cards();\n    var events = list.map(function (card, i) {\n      var info = cardInfo.get(card) || {};\n      var h4 = card.querySelector(\"h4\"), h3 = card.querySelector(\"h3\"), h2 = card.querySelector(\"h2\");\n      var link = card.querySelector(\":scope > .et_pb_column:nth-child(1) a[href]\");\n      var img = card.querySelector(\":scope > .et_pb_column:nth-child(3) img\");\n      var inner = card.querySelector(\":scope > .et_pb_column:nth-child(2) .et_pb_text_inner\");\n      var text = \"\";\n      if (inner) inner.querySelectorAll(\"p\").forEach(function (p) {\n        var c = p.cloneNode(true);\n        c.querySelectorAll(\".bt-lu-sr\").forEach(function (n) { n.remove(); });\n        text += (text ? \" \" : \"\") + squish(c.textContent);\n      });\n      return {\n        index: i,\n        id: card.id || \"\",\n        category: squish(h4 && h4.textContent),\n        dateLabel: squish(h3 && h3.textContent),\n        name: squish(h2 && h2.textContent),\n        start: info.start ? info.start.toISOString() : null,\n        past: !!info.past,\n        current: card === startCard,\n        url: link ? link.href : \"\",\n        image: img ? (img.currentSrc || img.src) : \"\",\n        images: Array.prototype.map.call(\n          card.querySelectorAll(\":scope > .et_pb_column:nth-child(3) img\"),\n          function (im) { return im.currentSrc || im.src; }),\n        text: text\n      };\n    });\n    w.BTLineup = { version: 25, events: events, current: startIndex };\n    try { d.dispatchEvent(new CustomEvent(\"bt:lineup-ready\", { detail: w.BTLineup })); } catch (err) {}\n  }\n\n  \/* =======================================================\n     H \u00b7 START\n     ======================================================= *\/\n  \/* Aktuellen Act und zwei Nachbarn frueh laden, statt erst am Bildrand. *\/\n  function warmMobileImages(index) {\n    if (!w.matchMedia(\"(max-width: 980px)\").matches) return;\n    var first = typeof index === \"number\" ? index : startIndex;\n    cards().slice(first, first + 3).forEach(function (card) {\n      card.querySelectorAll(\":scope > .et_pb_column:nth-child(3) img\").forEach(function (img) {\n        if (img.getAttribute(\"loading\") === \"eager\") return;\n        img.setAttribute(\"loading\", \"eager\");\n        img.setAttribute(\"decoding\", \"async\");\n        if (typeof img.decode === \"function\") img.decode().catch(function () {});\n      });\n    });\n  }\n\n  \/* Temporary admin-only navigation to the entry profiler. *\/\n  if (d.body.classList.contains('logged-in') && new URLSearchParams(location.search).get('bt-entry') !== '20261022') {\n    var entryLink = d.createElement('a');entryLink.id='bt-entry-link';\n    entryLink.href='https:\/\/tausendberlin.com\/?bt-entry=20261022';entryLink.textContent='Carousel Eintritt messen';\n    entryLink.style.cssText='position:fixed;top:45px;right:12px;z-index:2147483647;background:white;color:black;padding:8px;font:12px monospace';\n    d.body.appendChild(entryLink);\n  }\n  \/* Temporary entry profiler; exact query only, no output for normal visitors. *\/\n  if (new URLSearchParams(location.search).get('bt-entry') === '20261022') {\n    (function () {\n      var records = [], frames = [], longs = [], loafs = [], start = performance.now(), last = 0;\n      var scrolls = 0, wheels = 0, firstY = scrollY, lastY = scrollY;\n      var panel = d.createElement('section');\n      panel.id = 'bt-entry-panel'; panel.setAttribute('aria-label', 'Carousel Eintritt Diagnose');\n      panel.style.cssText = 'position:fixed;top:45px;right:12px;z-index:2147483647;width:390px;max-height:40vh;overflow:auto;background:white;color:black;padding:10px;font:11px\/1.3 monospace';\n      var reset = d.createElement('button'); reset.textContent = 'Neue Eintrittsmessung';\n      var show = d.createElement('button'); show.textContent = 'Eintrittsmesswerte anzeigen';\n      var out = d.createElement('pre'); out.id = 'bt-entry-result';out.textContent='Messung seit Seitenstart';out.style.cssText='white-space:pre-wrap;color:black;font:11px monospace';\n      panel.appendChild(reset); panel.appendChild(show); panel.appendChild(out);d.body.appendChild(panel);\n      function frame(t) { if(last) frames.push(t-last);last=t;if(frames.length>5000)frames.shift();requestAnimationFrame(frame); }requestAnimationFrame(frame);\n      w.addEventListener('scroll',function(){scrolls++;lastY=scrollY;},{passive:true});\n      w.addEventListener('wheel',function(){wheels++;},{passive:true});\n      try{new PerformanceObserver(function(list){list.getEntries().forEach(function(e){if(e.startTime>=start)longs.push({start:e.startTime-start,duration:e.duration});});}).observe({type:'longtask',buffered:true});}catch(e){}\n      try{new PerformanceObserver(function(list){list.getEntries().forEach(function(e){if(e.startTime>=start)loafs.push({start:e.startTime-start,duration:e.duration,render:e.renderStart?e.startTime+e.duration-e.renderStart:0,layout:e.styleAndLayoutStart?e.startTime+e.duration-e.styleAndLayoutStart:0,scripts:Array.from(e.scripts||[]).map(function(s){return{invoker:s.invoker,url:s.sourceURL,functionName:s.sourceFunctionName,charPosition:s.sourceCharPosition,duration:s.duration,forcedLayout:s.forcedStyleAndLayoutDuration};})});});}).observe({type:'long-animation-frame',buffered:true});}catch(e){}\n      w.__btEntryTimed = function(label,fn) {\n        return function(){var t=performance.now();try{return fn.apply(this,arguments);}finally{records.push({label:label,start:t-start,duration:performance.now()-t,y:lastY});}};\n      };\n      reset.addEventListener('click',function(){records=[];frames=[];longs=[];loafs=[];scrolls=0;wheels=0;firstY=scrollY;lastY=scrollY;start=performance.now();last=0;out.textContent='Messung seit Klick';});\n      show.addEventListener('click',function(){\n        var sorted=frames.slice().sort(function(a,b){return a-b;});\n        out.textContent=JSON.stringify({elapsed:performance.now()-start,viewport:[innerWidth,innerHeight],scrolls:scrolls,wheels:wheels,firstY:firstY,lastY:lastY,frames:frames.length,p95:sorted[Math.floor(sorted.length*.95)]||0,maxFrame:Math.max.apply(Math,[0].concat(frames)),records:records,longs:longs,loafs:loafs.sort(function(a,b){return b.duration-a.duration;}).slice(0,20)},null,2);\n      });\n    })();\n    layoutAll = w.__btEntryTimed('core.layoutAll', layoutAll);\n    runLayout = w.__btEntryTimed('core.runLayout', runLayout);\n    fitNames = w.__btEntryTimed('core.fitNames', fitNames);\n    fitNameRows = w.__btEntryTimed('core.fitNameRows', fitNameRows);\n    w.__btLuFitNameRowsV1 = fitNameRows;\n    equalizeHeads = w.__btEntryTimed('core.equalizeHeads', equalizeHeads);\n    fitTextLines = w.__btEntryTimed('core.fitTextLines', fitTextLines);\n    measureAll = w.__btEntryTimed('core.measureAll', measureAll);\n  }\n\n  var started = false;\n  function init() {\n    if (started) return;\n    started = true;\n    if (parseObserver) { parseObserver.disconnect(); parseObserver = null; }\n    sweep();\n    if (!cards().length) { shell.classList.add(\"bt-lu-ready\"); return; }\n\n    sortCards();\n    prepareAll();\n    warmMobileImages();\n    \/* Ready before first scroll, with the current act already positioned. *\/\n    if (w.matchMedia('(max-width: 767px)').matches) {\n      layoutAll();\n      positionStart();\n      startPositioned = true;\n      shell.setAttribute('data-bt-start-index',String(startIndex));\n      shell.classList.add('bt-lu-ready');\n    }\n    buildArrows();\n    watchNear();\n    requestLayout(true);\n    bindInput();\n\n    \/* Kopfzeilen neu ausrichten, falls Schriften sp\u00e4ter nachladen *\/\n    if (\"ResizeObserver\" in w && mqDrawer.matches) {\n      var headTimer = null;\n      var headRO = new ResizeObserver(function () {\n        clearTimeout(headTimer);\n        if (headSelf) return;\n        headTimer = setTimeout(function () {\n          if (headSelf || busy || items.some(function (it) { return it.open; })) return;\n          requestLayout(false);\n        }, 120);\n      });\n      cards().forEach(function (c) {\n        var m = c.querySelector(\":scope > .et_pb_column:nth-child(1) > .et_pb_module\");\n        if (m) headRO.observe(m);\n      });\n    }\n\n    initEdgeArrows();\n    initKeys();\n    startSlides();\n    buildHints();\n    publish();\n\n    function settle() {\n      if (busy || items.some(function (it) { return it.open; })) return;\n      \/* Loaded images do not require fitting all names again after a font-ready layout. *\/\n      if (startPositioned && layoutFontReady) return;\n      requestLayout(true);\n    }\n    if (d.fonts && d.fonts.ready) d.fonts.ready.then(settle).catch(function () {});\n    if (d.readyState === \"complete\") setTimeout(settle, 0);\n    else w.addEventListener(\"load\", settle, { once: true });\n  }\n\n  if (d.readyState === \"loading\") d.addEventListener(\"DOMContentLoaded\", init, { once: true });\n  else init();\n})();\n<\/script>\n<!-- ENDE \u00b7 BT \u00b7 LINEUP \u00b7 CAROUSEL V25 -->\n\n\n<script id=\"bt-p1-native-phone-anchors\">\n(function(){\n'use strict';\nvar w=window,d=document,root=d.documentElement;\nif(d.body.classList.contains('et-fb')||\/[?&]et_fb=1\/.test(location.search))return;\nvar mobile=w.matchMedia('(max-width:980px)');\nvar reduced=w.matchMedia('(prefers-reduced-motion:reduce)');\nvar allowed=['home','about','musik','banner-tuer','bar','drinks-banner','banner-cantina','cantina','cantina-chef','cantina-menu','cantina-koch','art','event','presse','presse-fox','vip','kontakt','footer'];\nvar nativeMoving=false;\nfunction cancel(){\n if(!nativeMoving)return;\n nativeMoving=false;\n w.scrollTo({top:w.scrollY,left:w.scrollX,behavior:'instant'});\n}\nw.addEventListener('touchstart',cancel,{capture:true,passive:true});\nw.addEventListener('wheel',cancel,{capture:true,passive:true});\nw.addEventListener('click',function(e){\n if(!mobile.matches||e.button||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;\n var a=e.target.closest&&e.target.closest('a[href]');\n if(!a||a.hasAttribute('download')||(a.target&&a.target!=='_self'))return;\n var u;try{u=new URL(a.href,location.href);}catch(_){return;}\n if(u.origin!==location.origin||u.pathname!==location.pathname)return;\n var id;try{id=decodeURIComponent(u.hash.slice(1));}catch(_){return;}\n if(allowed.indexOf(id)<0)return;\n var target=d.getElementById(id);if(!target)return;\n e.preventDefault();e.stopImmediatePropagation();\n cancel();\n if(root.classList.contains('kb-menu-open')){\n  var burger=d.getElementById('kb-mobile-burger');\n  if(burger)burger.click();\n }\n root.classList.remove('k-anchor-active');\n if(id==='musik'&&a.closest('#home .menu-inline')&&typeof w.btPlayerPlay==='function')w.btPlayerPlay();\n if(location.hash!==u.hash)history.pushState(null,'',u.hash);\n nativeMoving=true;\n target.scrollIntoView({block:'start',behavior:reduced.matches?'instant':'smooth'});\n},true);\n})();\n<\/script><\/div><\/div>\r\n<div class=\"et_pb_code_17 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><!-- =========================================================\n     BAR TAUSEND \u00b7 LINEUP \u00b7 LIVE-EXTRA V7\n     (Zusatz zum Karussell \u2013 das Karussell selbst bleibt unver\u00e4ndert)\n\n     EINBAU\n     Den KOMPLETTEN Inhalt von \u201eCODE : LIVE SCHALTUNG\u201c durch\n     diesen Code ersetzen.\n\n     ZEITPLAN (nur f\u00fcr den Act, der gerade dran ist)\n     - am Gig-Tag 09:00 bis Act-Start:\n       Lichtlinie um die Karte + Countdown im Namen\n       (Name \u2192 12 Std | 07 Min | 39 Sek \u2192 \u201enicht verpassen\u201c \u2192 Name \u2026)\n     - ab Act-Start bis 02:00 Uhr:\n       Lichtlinie l\u00e4uft weiter, im Namen nur noch \u201ejetzt live\u201c\n       (englische Seite: \u201enow playing\u201c)\n     - 02:00 bis 09:00: alles aus\n     - 09:00: es geht mit dem n\u00e4chsten Act von vorne los \u2013\n       auch wenn die Seite die ganze Nacht offen war (z. B. TV)\n     - Acts, die nach Mitternacht starten (z. B. \u201e24 H\u201c), z\u00e4hlen\n       zum Abend davor: ab 09:00 am Vortag bis 02:00\n\n     NEU IN V7\n     - Fehler behoben: nach \u201enicht verpassen\u201c stand der Text noch\n       neben dem Namen (\u201eHOUSE QUEENSNICHT V\u2026\u201c). Seit Carousel V26\n       misst das Carousel die Namen erst, wenn das Line-up in die\n       N\u00e4he kommt \u2013 die Live-Schaltung hatte sich den Namen davor\n       gemerkt und beim Zur\u00fcckwechseln ihren eigenen Text mitgelesen.\n       Jetzt wird der Name bei jedem Wechsel frisch gelesen, ohne\n       Effekt-Text und ohne Screenreader-Zusatz.\n\n     WEITER WIE BISHER\n     - Text-Effekt: Buchstaben flackern kurz und rasten ein\n     - l\u00e4uft nur, wenn die Karte zu sehen ist\n     - \u201eweniger Bewegung\u201c: kein Text-Effekt, Schein steht still\n     - Farbe vom Lichtschein: bei .bt-live-ring  --bt-live-rgb\n       wei\u00df = 255,255,255   pink = 234,11,95\n\n     ZEITEN \u00c4NDERN (oben im Script)\n       DAY_START_HOUR = 9   ab wann am Gig-Tag\n       LIVE_END_HOUR  = 2   bis wann nach dem Gig\n\n     TEST-SCHALTER (unten im Script, wirkt NUR eingeloggt)\n       var TEST = \"\";   \"live\" \/ \"soon\" \/ \"\" (aus)\n       zus\u00e4tzlich immer: ?bt-demo=soon  oder  ?bt-demo=live\n\n     WICHTIG: Dieses Modul enth\u00e4lt absichtlich KEINEN Backslash.\n========================================================= -->\n\n<style>\n@property --bt-live-a{\n  syntax: \"<angle>\";\n  inherits: false;\n  initial-value: 0deg;\n}\n\n\/* ---------- Text-Effekt im Namen ---------- *\/\n#musik .bt-lineup-shell h2.bt-now-host{\n  position: relative !important;\n}\n#musik .bt-lineup-shell .bt-now{\n  position: absolute;\n  left: 0;\n  top: 0;\n  pointer-events: none;\n  white-space: nowrap;\n}\n\/* die Seite setzt \u00fcberall Poppins mit !important \u2013 hier die Schrift vom Namen erben *\/\n#musik .bt-lineup-shell .bt-now *{\n  font-family: inherit !important;\n  font-weight: inherit !important;\n  letter-spacing: inherit;\n}\n\/* w\u00e4hrend der Effekt l\u00e4uft, steht an Stelle des Namens die Tafel *\/\n#musik .bt-lineup-shell h2.bt-fx-on > .bt-lu-name{\n  opacity: 0 !important;\n}\n#musik .bt-lineup-shell .bt-fx{\n  display: inline-flex;\n  align-items: flex-start;\n  white-space: pre;\n  transform-origin: 0 50%;\n  transition: transform .6s cubic-bezier(.22,1,.36,1);\n}\n\/* ein Zeichen: feste Breite, flackert gedimmt und rastet hell ein *\/\n#musik .bt-lineup-shell .bt-fx-c{\n  display: inline-block;\n  position: relative;\n  box-sizing: content-box;\n  text-align: center;\n  white-space: pre;\n  transition: width .45s cubic-bezier(.22,1,.36,1), padding .45s cubic-bezier(.22,1,.36,1);\n}\n#musik .bt-lineup-shell .bt-fx-t{\n  transition: opacity .4s ease;\n}\n#musik .bt-lineup-shell .bt-fx-c.is-flip .bt-fx-t{\n  opacity: .38;\n  transition: opacity 0s;\n}\n\/* Einheit + Haarlinie h\u00e4ngen rechts an der letzten Ziffer *\/\n#musik .bt-lineup-shell .bt-fx-dc{\n  position: absolute;\n  top: 0;\n  right: 0;\n  height: 100%;\n  display: flex;\n  align-items: flex-start;\n  opacity: 0;\n  transition: opacity .9s ease;\n}\n#musik .bt-lineup-shell .bt-fx-dc.is-on{\n  opacity: 1;\n}\n#musik .bt-lineup-shell .bt-now .bt-fx-lbt{\n  font-family: var(--bt-now-ufont, inherit) !important;\n  font-weight: 400 !important;\n  font-size: max(9px, .2em);\n  line-height: 1;\n  letter-spacing: .22em;\n  padding-left: .26em;\n  white-space: nowrap;\n}\n#musik .bt-lineup-shell .bt-fx-lb{\n  margin-top: .24em;\n  opacity: .5;\n}\n#musik .bt-lineup-shell .bt-fx-sep{\n  position: relative;\n  align-self: center;\n  width: .56em;\n  height: .5em;\n  opacity: .25;\n}\n#musik .bt-lineup-shell .bt-fx-sep::before{\n  content: \"\";\n  position: absolute;\n  left: .2em;\n  top: 0;\n  width: 1px;\n  height: 100%;\n  background: currentColor;\n}\n#musik .bt-lineup-shell .bt-fx-meas{\n  position: absolute;\n  left: 0;\n  top: 0;\n  visibility: hidden;\n  white-space: pre;\n}\n#musik .bt-lineup-shell .bt-fx-probe{\n  display: inline-block;\n  width: 0;\n  height: 0;\n  vertical-align: baseline;\n}\n\/* R\u00fcckfall f\u00fcr mehrzeilige Namen: weich aus- und einblenden *\/\n#musik .bt-lineup-shell h2.bt-fx-fade > .bt-lu-name{\n  opacity: 0 !important;\n  transition: opacity .45s ease;\n}\n\n\/* ---------- Lichtschein um die Karte (live) ---------- *\/\n#musik .bt-lineup-shell .bt-live-ring{\n  \/* Farbe vom Lichtschein (wei\u00df). Pink w\u00e4re: 234,11,95 und Spitze 255,240,246 *\/\n  --bt-live-rgb: 255,255,255;\n  --bt-live-peak: 255,255,255;\n  position: absolute;\n  inset: 0;\n  border-radius: inherit;\n  pointer-events: none;\n  z-index: 3;\n  opacity: 0;\n  transition: opacity 2.4s ease;\n}\n#musik .bt-lineup-shell .lineup-row.is-glow .bt-live-ring{\n  opacity: 1;\n}\n\/* feine Lichtlinie *\/\n#musik .bt-lineup-shell .bt-live-line{\n  position: absolute;\n  inset: 0;\n  border-radius: inherit;\n  padding: 1px;\n  background:\n    conic-gradient(from var(--bt-live-a),\n      rgba(var(--bt-live-rgb),0) 0deg,\n      rgba(var(--bt-live-rgb),0) 225deg,\n      rgba(var(--bt-live-rgb),.3) 288deg,\n      rgba(var(--bt-live-peak),.95) 326deg,\n      rgba(var(--bt-live-rgb),.4) 342deg,\n      rgba(var(--bt-live-rgb),0) 360deg),\n    linear-gradient(rgba(255,255,255,.08), rgba(255,255,255,.08));\n  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);\n  -webkit-mask-composite: xor;\n          mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);\n          mask-composite: exclude;\n  animation: btLiveSpin 11s linear infinite;\n}\n\/* weicher Glow derselben Linie (Unsch\u00e4rfe liegt au\u00dfen, damit sie sichtbar bleibt) *\/\n#musik .bt-lineup-shell .bt-live-glow{\n  position: absolute;\n  inset: -2px;\n  border-radius: inherit;\n  filter: blur(9px);\n  animation: btLiveBreath 6s ease-in-out infinite;\n}\n#musik .bt-lineup-shell .bt-live-glow .bt-live-line{\n  padding: 3px;\n  background:\n    conic-gradient(from var(--bt-live-a),\n      rgba(var(--bt-live-rgb),0) 0deg,\n      rgba(var(--bt-live-rgb),0) 240deg,\n      rgba(var(--bt-live-rgb),.5) 296deg,\n      rgba(var(--bt-live-peak),.85) 326deg,\n      rgba(var(--bt-live-rgb),.35) 344deg,\n      rgba(var(--bt-live-rgb),0) 360deg);\n}\n@keyframes btLiveSpin{\n  to{ --bt-live-a: 360deg; }\n}\n@keyframes btLiveBreath{\n  0%, 100%{ opacity: .55; }\n  50%{ opacity: 1; }\n}\n#musik .bt-lineup-shell .lineup-row.is-live-paused .bt-live-line,\n#musik .bt-lineup-shell .lineup-row.is-live-paused .bt-live-glow{\n  animation-play-state: paused;\n}\n\n@media (prefers-reduced-motion: reduce){\n  #musik .bt-lineup-shell .bt-live-line,\n  #musik .bt-lineup-shell .bt-live-glow{\n    animation: none;\n  }\n  #musik .bt-lineup-shell .bt-live-line{\n    --bt-live-a: 300deg;\n  }\n  #musik .bt-lineup-shell .bt-live-glow{\n    opacity: .6;\n  }\n}\n\n<\/style>\n<script>\n(function () {\n  \"use strict\";\n\n  var w = window, d = document;\n  if (w.__btLineupLive) return;\n  if (\/[?&]et_fb=1\/.test(location.search)) return;\n  if (d.body && d.body.classList.contains(\"et-fb\")) return;\n  w.__btLineupLive = true;\n  \/* P1: no mobile countdown loops or animated light border. *\/\n  if (w.matchMedia('(max-width: 980px), (hover: none) and (pointer: coarse)').matches) return;\n\n  \/* TEST-SCHALTER: \"live\", \"soon\" oder \"\" (aus) \u2013 nur f\u00fcr Eingeloggte *\/\n  var TEST = \"\";\n\n  \/* Zeitplan *\/\n  var DAY_START_HOUR = 9;  \/* am Gig-Tag ab 09:00 *\/\n  var LIVE_END_HOUR = 2;   \/* bis 02:00 Uhr nach dem Gig *\/\n\n  \/* Ruhepausen (Millisekunden, nur gez\u00e4hlt solange die Karte zu sehen ist) *\/\n  var SOON_FIRST = 4000, SOON_REST = 12000, COUNT_SHOW = 8000, AFTER_SHOW = 2600;\n  var LIVE_FIRST = 5000, LIVE_REST = 11000, LIVE_SHOW = 3400;\n\n  var STAGGER = 42, FLIP_MS = 52, FLIPS = 5;\n  var POOL = \"ABCDEFGHKLNOPRSTUVXYZ0123456789\", DIGITS = \"0123456789\";\n\n  var isEN = \/^en\/i.test(d.documentElement.lang || \"\") || location.pathname.indexOf(\"\/en\/\") === 0;\n  var T = isEN ? {\n    before: \"\", after: \"don\u2019t miss it\", live: \"now playing\",\n    day: \"day\", days: \"days\", hrs: \"hrs\", min: \"min\", sec: \"sec\", srLive: \"now playing\"\n  } : {\n    before: \"\", after: \"nicht verpassen\", live: \"jetzt live\",\n    day: \"Tag\", days: \"Tage\", hrs: \"Std\", min: \"Min\", sec: \"Sek\", srLive: \"jetzt live\"\n  };\n  \/* before = Wort VOR dem Countdown (leer = keins), after = Wort danach *\/\n  var reduced = w.matchMedia(\"(prefers-reduced-motion: reduce)\");\n  var demo = \"\";\n  try { demo = new URLSearchParams(location.search).get(\"bt-demo\") || \"\"; } catch (e) {}\n  if (!demo && TEST && d.body && d.body.classList.contains(\"logged-in\")) demo = TEST;\n\n  function pad(n) { return (\"0\" + n).slice(-2); }\n  function wait(ms) { return new Promise(function (r) { setTimeout(r, ms); }); }\n  function el(tag, cls, text) {\n    var e = d.createElement(tag);\n    e.className = cls;\n    if (text != null) e.textContent = text;\n    return e;\n  }\n  var loaded = new Promise(function (r) {\n    if (d.readyState === \"complete\") r();\n    else w.addEventListener(\"load\", function () { r(); }, { once: true });\n  }).then(function () { return wait(800); });\n\n  \/* =======================================================\n     ZEITFENSTER: 09:00 am Gig-Tag bis 02:00 danach\n     ======================================================= *\/\n  function windowOf(ev) {\n    var start = new Date(ev.start);\n    \/* Abend, zu dem der Act geh\u00f6rt (Start nach Mitternacht = Vortag) *\/\n    var day = new Date(start.getTime());\n    if (day.getHours() < DAY_START_HOUR) day.setDate(day.getDate() - 1);\n    var from = new Date(day.getTime());\n    from.setHours(DAY_START_HOUR, 0, 0, 0);\n    var end = new Date(day.getTime());\n    end.setDate(end.getDate() + 1);\n    end.setHours(LIVE_END_HOUR, 0, 0, 0);\n    if (end <= start) end = new Date(start.getTime() + 2 * 3600000);\n    return { from: from, start: start, end: end };\n  }\n  var demoPick = null;\n  function pickActive(data) {\n    if (!data || !data.events || !data.events.length) return null;\n    if (demo === \"soon\" || demo === \"live\") {\n      if (!demoPick) {\n        var dev = data.events[data.current] || data.events[0];\n        var now0 = Date.now(), st;\n        if (demo === \"soon\") st = new Date(now0 + 44 * 60000 + 12000);\n        else st = new Date(now0 - 30 * 60000);\n        demoPick = { ev: dev, win: { from: new Date(now0 - 3600000), start: st, end: new Date(now0 + 6 * 3600000) } };\n      }\n      return demoPick;\n    }\n    var now = Date.now();\n    for (var i = 0; i < data.events.length; i++) {\n      var ev = data.events[i];\n      if (!ev || !ev.start) continue;\n      var win = windowOf(ev);\n      if (now >= win.from.getTime() && now < win.end.getTime()) return { ev: ev, win: win };\n    }\n    return null;\n  }\n  function cardFor(ev) {\n    var cards = d.querySelectorAll(\"#musik .bt-lineup-track > .et_pb_row.lineup-row\");\n    var c = cards[ev.index];\n    if (c) {\n      var h = c.querySelector(\"h2\");\n      var nm = h ? (h.textContent || \"\").replace(\/[ ]+\/g, \" \").trim() : \"\";\n      if (!ev.name || nm.indexOf(ev.name) === 0) return c;\n    }\n    \/* Sicherheitsnetz: Karte \u00fcber den Namen suchen *\/\n    for (var i = 0; i < cards.length; i++) {\n      var h2 = cards[i].querySelector(\"h2\");\n      if (h2 && ev.name && (h2.textContent || \"\").indexOf(ev.name) > -1) return cards[i];\n    }\n    return c || null;\n  }\n\n  \/* =======================================================\n     EIN ACT: Lichtschein + Text-Effekt\n     ======================================================= *\/\n  function Controller(card, win) {\n    var h2 = card.querySelector(\"h2\");\n    if (!h2) return null;\n    \/* Namens-Element immer frisch holen: das Carousel (ab V26) legt\n       .bt-lu-name erst an, wenn das Line-up in die N\u00e4he kommt *\/\n    function nameEl() { return h2.querySelector(\":scope > .bt-lu-name\") || h2; }\n    var WS = new RegExp(\"[ \" + String.fromCharCode(9, 10, 13, 160) + \"]+\", \"g\");\n    \/* reiner Name: ohne Tafel, ohne Screenreader-Zusatz *\/\n    function nameText() {\n      var c = nameEl().cloneNode(true);\n      c.querySelectorAll(\".bt-now, .bt-lu-sr, .bt-fx-probe\").forEach(function (x) { x.remove(); });\n      return (c.textContent || \"\").replace(WS, \" \").trim();\n    }\n    var alive = true;\n    var timers = [];\n    var start = win.start, from = win.from, end = win.end;\n\n    function every(fn, ms) { var id = setInterval(fn, ms); timers.push(id); return id; }\n    function stop(id) { clearInterval(id); var k = timers.indexOf(id); if (k > -1) timers.splice(k, 1); }\n\n    function mode() {\n      var now = Date.now();\n      if (now < from.getTime()) return \"\";\n      if (now < start.getTime()) return \"soon\";\n      if (now < end.getTime()) return \"live\";\n      return \"\";\n    }\n\n    \/* ---------- Ebene + Messen ---------- *\/\n    var layer = null, meas = null, measLb = null, board = null;\n    var cur = null;          \/* was gerade zu sehen ist *\/\n    var fallback = false;    \/* Name ist mehrzeilig: weich \u00fcberblenden statt Tafel *\/\n\n    function ensureLayer() {\n      \/* liegt die Tafel nicht mehr direkt im h2 (z. B. vom Carousel\n         eingepackt), wieder an die richtige Stelle setzen *\/\n      if (layer) { if (layer.parentNode !== h2) h2.appendChild(layer); return; }\n      h2.classList.add(\"bt-now-host\");\n      layer = el(\"span\", \"bt-now\");\n      layer.setAttribute(\"aria-hidden\", \"true\");\n      meas = el(\"span\", \"bt-fx-meas\");\n      measLb = el(\"span\", \"bt-fx-meas bt-fx-lbt\");\n      layer.appendChild(meas);\n      layer.appendChild(measLb);\n      h2.appendChild(layer);\n    }\n    function place() {\n      var name = nameEl();\n      var hr = h2.getBoundingClientRect();\n      var nr = name.getBoundingClientRect();\n      var ns = getComputedStyle(name);\n      [\"font-family\", \"font-weight\", \"font-style\", \"font-stretch\", \"letter-spacing\", \"text-transform\", \"color\", \"font-size\"].forEach(function (k) {\n        layer.style.setProperty(k, ns.getPropertyValue(k), \"important\");\n      });\n      var lh = parseFloat(ns.lineHeight) || parseFloat(ns.fontSize) || 40;\n      layer.style.lineHeight = lh + \"px\";\n      layer.style.left = Math.max(0, nr.left - hr.left) + \"px\";\n      layer.style.top = (nr.top - hr.top) + \"px\";\n      var p = card.querySelector(\"p\");\n      if (p) layer.style.setProperty(\"--bt-now-ufont\", getComputedStyle(p).fontFamily);\n      var rects = Array.prototype.slice.call(name.getClientRects());\n      var top = rects.length ? rects[0].top : nr.top;\n      fallback = rects.some(function (r) { return Math.abs(r.top - top) > 1; });\n      if (!fallback) {\n        ['width', 'height', 'display', 'align-items'].forEach(function (key) { layer.style.removeProperty(key); });\n        name.style.removeProperty('transition');\n      }\n    }\n    \/* Grundlinie der Tafel exakt auf die Grundlinie vom Namen legen *\/\n    function alignBaseline(cell) {\n      if (!cell) return;\n      var name = nameEl();\n      var p1 = el(\"span\", \"bt-fx-probe\"), p2 = el(\"span\", \"bt-fx-probe\");\n      name.insertBefore(p1, name.firstChild);\n      cell.insertBefore(p2, cell.firstChild);\n      var diff = p1.getBoundingClientRect().top - p2.getBoundingClientRect().top;\n      p1.remove(); p2.remove();\n      layer.style.top = (parseFloat(layer.style.top) + diff) + \"px\";\n    }\n    \/* Perf 22.10.: insert all prefixes first, then read without interleaved writes.\n       Prefixes keep the original font metrics and kerning. *\/\n    function measureBatch(template, texts) {\n      var fragment = d.createDocumentFragment();\n      var nodes = texts.map(function (text) {\n        var node = template.cloneNode(false);\n        node.textContent = text;\n        fragment.appendChild(node);\n        return node;\n      });\n      layer.appendChild(fragment);\n      var widths = nodes.map(function (node) { return node.getBoundingClientRect().width; });\n      nodes.forEach(function (node) { node.remove(); });\n      return widths;\n    }\n    function widthsOf(str) {\n      var prefixes = [], previous = 0;\n      for (var i = 1; i <= str.length; i++) prefixes.push(str.slice(0, i));\n      return measureBatch(meas, prefixes).map(function (width) {\n        var result = Math.max(0, width - previous);\n        previous = width;\n        return result;\n      });\n    }\n    var digitW = 0, lbW = {}, countSepW = 0;\n    function digitWidth() {\n      if (digitW) return digitW;\n      var width = Math.max.apply(Math, measureBatch(meas, \"0123456789\".split(\"\")));\n      if (!d.fonts || d.fonts.status === \"loaded\") digitW = width;\n      return width;\n    }\n    function fontPx() { return parseFloat(getComputedStyle(layer).fontSize) || 40; }\n\n    \/* ---------- Zust\u00e4nde ---------- *\/\n    function textState(str) {\n      str = String(str);\n      var n = str.length;\n      return { chars: str.split(\"\"), widths: widthsOf(str), pads: new Array(n).fill(0),\n               decos: new Array(n).fill(null), digit: [], isName: false };\n    }\n    function nameState() {\n      var st = textState(nameText());\n      st.isName = true;\n      return st;\n    }\n    function emptyState() { return { chars: [], widths: [], pads: [], decos: [], digit: [], isName: false }; }\n    function countParts() {\n      var ms = Math.max(0, start.getTime() - Date.now());\n      var s = Math.floor(ms \/ 1000);\n      var days = Math.floor(s \/ 86400); s -= days * 86400;\n      var hh = Math.floor(s \/ 3600); s -= hh * 3600;\n      var mm = Math.floor(s \/ 60); s -= mm * 60;\n      var parts = [];\n      if (days > 0) parts.push({ n: pad(days), u: days === 1 ? T.day : T.days });\n      if (days > 0 || hh > 0) parts.push({ n: pad(hh), u: T.hrs });\n      parts.push({ n: pad(mm), u: T.min });\n      parts.push({ n: pad(s), u: T.sec });\n      return parts;\n    }\n    function countState() {\n      var st = emptyState(), dw = digitWidth(), sepW = countSepW;\n      var cacheReady = !d.fonts || d.fonts.status === \"loaded\";\n      if (!sepW) {\n        sepW = fontPx() * 0.56;\n        if (cacheReady) countSepW = sepW;\n      }\n      countParts().forEach(function (pt, n, all) {\n        var digits = pt.n.split(\"\");\n        digits.forEach(function (ch, k) {\n          var lastOfGroup = k === digits.length - 1;\n          var deco = null, extra = 0;\n          if (lastOfGroup) {\n            var labelWidth = lbW[pt.u];\n            if (labelWidth == null) {\n              setTxt(measLb, pt.u);\n              labelWidth = measLb.getBoundingClientRect().width;\n              if (cacheReady) lbW[pt.u] = labelWidth;\n            }\n            var sep = n < all.length - 1;\n            deco = { lb: pt.u, sep: sep };\n            extra = labelWidth + (sep ? sepW : 0);\n          }\n          st.chars.push(ch); st.widths.push(dw); st.pads.push(extra);\n          st.decos.push(deco); st.digit.push(true);\n        });\n      });\n      return st;\n    }\n    function decoKey(dc) { return dc ? dc.lb + (dc.sep ? \"|\" : \"\") : \"\"; }\n    function sameShape(a, b) {\n      if (!a || !b || a.chars.length !== b.chars.length) return false;\n      for (var i = 0; i < a.chars.length; i++) if (decoKey(a.decos[i]) !== decoKey(b.decos[i])) return false;\n      return true;\n    }\n    function sum(arr) { return arr.reduce(function (a, b) { return a + (b || 0); }, 0); }\n    function scaleFor(st) {\n      if (st.isName) return 1;\n      var total = sum(st.widths) + sum(st.pads);\n      var avail = h2.clientWidth - (parseFloat(layer.style.left) || 0);\n      return total > avail && avail > 0 ? avail \/ total : 1;\n    }\n\n    \/* ---------- Flackern und Einrasten ---------- *\/\n    function rnd(digit) {\n      var pool = digit ? DIGITS : POOL;\n      return pool.charAt(Math.floor(Math.random() * pool.length));\n    }\n    \/* Perf 22.10.: keep the existing text node so global childList observers stay idle. *\/\nfunction setTxt(n, s) {\n  var c = n.firstChild;\n  if (c && c.nodeType === 3 && !c.nextSibling) { if (c.data !== s) c.data = s; }\n  else n.textContent = s;\n}\nfunction flip(cellEl, to, digit, flips, done) {\n      var t = cellEl.firstChild;\n      cellEl.classList.add(\"is-flip\");\n      var k = 0;\n      var iv = setInterval(function () {\n        if (k++ < flips) { setTxt(t, rnd(digit)); return; }\n        clearInterval(iv);\n        setTxt(t, to);\n        cellEl.classList.remove(\"is-flip\");\n        if (done) done();\n      }, FLIP_MS);\n    }\n    function makeDeco(dc, on) {\n      var box = el(\"span\", \"bt-fx-dc\" + (on ? \" is-on\" : \"\"));\n      box.appendChild(el(\"span\", \"bt-fx-lb bt-fx-lbt\", dc.lb));\n      if (dc.sep) box.appendChild(el(\"span\", \"bt-fx-sep\"));\n      return box;\n    }\n    function makeCell(ch, wd, pd, dc) {\n      var c = el(\"span\", \"bt-fx-c\");\n      c.appendChild(el(\"span\", \"bt-fx-t\", ch));\n      c.style.width = (wd || 0) + \"px\";\n      c.style.paddingRight = (pd || 0) + \"px\";\n      if (dc) c.appendChild(makeDeco(dc, true));\n      return c;\n    }\n\n    \/* Exchange complete text blocks in sequence, keeping the original two-line box. *\/\n    function morph(nx) {\n      if (!alive) return Promise.reject();\n      var previous = board;\n      board = null;\n      if (previous) {\n        previous.style.transition = \"opacity .32s ease, translate .32s cubic-bezier(.22,1,.36,1)\";\n        previous.style.opacity = \"0\";\n        previous.style.translate = \"0 -4px\";\n      }\n      return wait(previous ? 340 : 0).then(function () {\n        if (previous) previous.remove();\n        if (!alive) return Promise.reject();\n        cur = nx; nx.scale = scaleFor(nx); nx.els = [];\n        if (!nx.chars.length) return;\n        var nextBoard = el(\"span\", \"bt-fx\");\n        nextBoard.style.gridArea = \"1 \/ 1\";\n        nextBoard.style.justifySelf = \"start\";\n        nextBoard.style.alignSelf = \"start\";\n        nextBoard.style.transition = \"opacity .38s ease, translate .38s cubic-bezier(.22,1,.36,1)\";\n        nextBoard.style.opacity = \"0\";\n        nextBoard.style.translate = \"0 4px\";\n        nextBoard.style.transform = \"scale(\" + nx.scale + \")\";\n        nx.els = nx.chars.map(function (ch, index) {\n          var cell = makeCell(ch, nx.widths[index], nx.pads[index], nx.decos[index]);\n          nextBoard.appendChild(cell); return cell;\n        });\n        board = nextBoard;\n        layer.appendChild(nextBoard);\n        void nextBoard.offsetWidth;\n        nextBoard.style.opacity = \"1\"; nextBoard.style.translate = \"0 0\";\n        return wait(400);\n      });\n    }\n    function enter() {\n      if (!alive) return Promise.reject();\n      ensureLayer(); place();\n      layer.style.top = \"0px\"; layer.style.left = \"0px\";\n      layer.style.width = \"100%\"; layer.style.height = \"100%\";\n      layer.style.display = \"grid\"; layer.style.alignItems = \"start\";\n      cur = emptyState(); h2.classList.add(\"bt-fx-fade\");\n      return wait(340);\n    }\n    function leave() {\n      if (!alive) return Promise.resolve();\n      return morph(emptyState()).then(function () {\n        if (!alive) return;\n        h2.classList.remove(\"bt-fx-fade\"); cur = null;\n        return wait(340);\n      });\n    }\n\n    \/* Countdown updates only changed digits and keeps the same text geometry. *\/\n    function tickCount() {\n      if (!alive) return;\n      var nx = countState();\n      if (!sameShape(cur, nx)) { morph(nx).catch(function () {}); return; }\n      nx.chars.forEach(function (ch, index) {\n        if (cur.chars[index] !== ch && cur.els && cur.els[index]) {\n          cur.chars[index] = ch;\n          setTxt(cur.els[index].firstChild, ch);\n        }\n      });\n    }\n\n    \/* ---------- Sichtbarkeit ---------- *\/\n    var cardVisible = false;\n    function visibleNow() { return cardVisible && !d.hidden; }\n    \/* Ruhe: z\u00e4hlt nur, solange die Karte wirklich zu sehen ist *\/\n    function rest(ms) {\n      return new Promise(function (r) {\n        var left = ms;\n        var iv = every(function () {\n          if (!alive) { stop(iv); r(); return; }\n          if (visibleNow()) left -= 250;\n          if (left <= 0) { stop(iv); r(); }\n        }, 250);\n      });\n    }\n\n    \/* ---------- Abl\u00e4ufe ---------- *\/\n    function soonCycle(first) {\n      return rest(first ? SOON_FIRST : SOON_REST).then(function () {\n        if (!alive || mode() !== \"soon\" || reduced.matches) return;\n        return enter().then(function () {\n          if (!T.before) return;\n          return morph(textState(T.before)).then(function () { return wait(1800); });\n        }).then(function () {\n          return morph(countState());\n        }).then(function () {\n          var iv = every(tickCount, 1000);\n          return wait(COUNT_SHOW).then(function () { stop(iv); });\n        }).then(function () {\n          if (!T.after) return;\n          return morph(textState(T.after)).then(function () { return wait(AFTER_SHOW); });\n        }).then(leave);\n      });\n    }\n    function liveCycle(first) {\n      return rest(first ? LIVE_FIRST : LIVE_REST).then(function () {\n        if (!alive || mode() !== \"live\" || reduced.matches) return;\n        return enter().then(function () {\n          return morph(textState(T.live));\n        }).then(function () {\n          return wait(LIVE_SHOW);\n        }).then(leave);\n      });\n    }\n    function loop(first) {\n      if (!alive) return;\n      var m = mode();\n      var job;\n      if (reduced.matches || !m) job = rest(20000);\n      else if (m === \"soon\") job = soonCycle(first);\n      else job = liveCycle(first);\n      job.then(function () { loop(false); }, function () { loop(false); });\n    }\n\n    \/* ---------- Lichtschein ---------- *\/\n    var ring = null, srLive = null;\n    function setGlow(on) {\n      card.classList.toggle(\"is-glow\", on);\n      if (on && !ring) {\n        ring = el(\"span\", \"bt-live-ring\");\n        ring.setAttribute(\"aria-hidden\", \"true\");\n        ring.innerHTML = '<i class=\"bt-live-line\"><\/i><i class=\"bt-live-glow\"><i class=\"bt-live-line\"><\/i><\/i>';\n        card.appendChild(ring);\n      }\n    }\n    function setLive(on) {\n      card.classList.toggle(\"is-live\", on);\n      if (on && !srLive) {\n        srLive = el(\"span\", \"bt-lu-sr\", \" \u2013 \" + T.srLive);\n        h2.appendChild(srLive);\n      }\n      if (!on && srLive) { srLive.remove(); srLive = null; }\n    }\n    function refresh() {\n      if (!alive) return;\n      var m = mode();\n      setLive(m === \"live\");\n      setGlow(m === \"live\" || m === \"soon\");\n    }\n    refresh();\n    every(refresh, 5000);\n\n    var io = new IntersectionObserver(function (entries) {\n      entries.forEach(function (e) {\n        cardVisible = e.isIntersecting && e.intersectionRatio >= 0.5;\n        card.classList.toggle(\"is-live-paused\", !e.isIntersecting);\n      });\n    }, { threshold: [0, 0.5] });\n    var visibilityTarget = null;\n    function watchVisibility() {\n      var target = w.matchMedia(\"(max-width: 767px)\").matches ? h2 : card;\n      if (target === visibilityTarget) return;\n      if (visibilityTarget) io.unobserve(visibilityTarget);\n      visibilityTarget = target;\n      io.observe(target);\n    }\n    watchVisibility();\n\n    function onResize() {\n      clearTimeout(onResize.pending);\n      onResize.pending = setTimeout(function () {\n        if (!alive) return;\n        \/* Rebuild from the native wrapped name after the resize settles. *\/\n        ctrlKey = '';\n        supervise();\n      }, 180);\n    }\n    w.addEventListener(\"resize\", onResize);\n\n    \/* erst starten, wenn die Seite fertig geladen ist (ruckelfrei) *\/\n    loaded.then(function () { loop(true); });\n\n    \/* Act ist vorbei oder ein anderer ist dran: alles sanft abbauen *\/\n    function destroy() {\n      alive = false;\n      timers.slice().forEach(clearInterval);\n      timers = [];\n      io.disconnect();\n      w.removeEventListener(\"resize\", onResize);\n      card.classList.remove(\"is-glow\", \"is-live\", \"is-live-paused\");\n      h2.classList.remove(\"bt-fx-on\", \"bt-fx-fade\", \"bt-now-host\");\n      if (layer) { layer.remove(); layer = null; }\n      if (srLive) { srLive.remove(); srLive = null; }\n      if (ring) {\n        var r = ring;\n        ring = null;\n        r.style.opacity = \"0\";\n        setTimeout(function () { r.remove(); }, 2600);\n      }\n    }\n    return { destroy: destroy };\n  }\n\n  \/* =======================================================\n     AUFSICHT: welcher Act ist gerade dran?\n     wird regelm\u00e4\u00dfig gepr\u00fcft, damit um 09:00 auch bei\n     offener Seite der neue Act \u00fcbernimmt\n     ======================================================= *\/\n  var ctrl = null, ctrlKey = \"\", introWatch = null;\n  function supervise() {\n    \/* P1 21.10: no card effects or effect clones during the intro. *\/\n    var shell = d.querySelector('#musik .bt-lineup-shell');\n    if (!shell || shell.getAttribute('data-bt-intro-state') !== 'done') {\n      if (!introWatch && d.body) {\n        introWatch = new MutationObserver(function () {\n          var area = d.querySelector('#musik .bt-lineup-shell');\n          if (area && area.getAttribute('data-bt-intro-state') === 'done') supervise();\n        });\n        introWatch.observe(d.body, {subtree:true, attributes:true, attributeFilter:['data-bt-intro-state']});\n      }\n      return;\n    }\n    if (introWatch) { introWatch.disconnect(); introWatch = null; }\n    var data = w.BTLineup;\n    var pick = pickActive(data);\n    var key = pick ? pick.ev.index + \"|\" + pick.ev.start + \"|\" + pick.win.end.getTime() : \"\";\n    if (key === ctrlKey) return;\n    if (ctrl) { ctrl.destroy(); ctrl = null; }\n    ctrlKey = key;\n    if (!pick) return;\n    var card = cardFor(pick.ev);\n    if (!card) { ctrlKey = \"\"; return; }\n    ctrl = Controller(card, pick.win);\n    if (!ctrl) ctrlKey = \"\";\n  }\n  function setup() {\n    supervise();\n    setInterval(supervise, 15000);\n    d.addEventListener(\"visibilitychange\", function () { if (!d.hidden) supervise(); });\n  }\n\n  function go() {\n    if (w.BTLineup && w.BTLineup.events) setup();\n    else d.addEventListener(\"bt:lineup-ready\", function () { setup(); }, { once: true });\n  }\n  if (d.readyState === \"loading\") d.addEventListener(\"DOMContentLoaded\", go, { once: true });\n  else go();\n})();\n<\/script>\n<!-- ENDE \u00b7 BT \u00b7 LINEUP \u00b7 LIVE-EXTRA V7 --><\/div><\/div>\r\n\r\n<div class=\"et_pb_code_19 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><!-- =========================================================\n     BAR TAUSEND \u00b7 LINEUP SOUND \u00b7 V15\n     Br\u00fccke zwischen Line-up-Carousel V25 und dem SoundCloud-Player\n\n     EINBAU\n     Den KOMPLETTEN Inhalt des Moduls \u201eCODE : LINEUP SOUND\u201c\n     durch diesen Code ersetzen. Sonst nichts \u00e4ndern.\n     Player, Equalizer und Carousel bleiben unver\u00e4ndert.\n     Modul deaktivieren = alles ist wieder wie vorher.\n\n     WAS DAS MODUL MACHT\n     - Maus \u00fcber einer Karte mit SoundCloud-Link: auf dem Foto\n       blendet ein Play-Symbol ein. Erst der Klick darauf l\u00e4dt den\n       neuesten Track des Acts und startet ihn. Ein Klick auf die\n       Karte selbst l\u00f6st nichts aus.\n     - Play auf dem Foto, im Player, am Equalizer oder mit der\n       Leertaste: alle Schalter arbeiten zusammen, leicht versetzt.\n     - \u00ab \u00bb im Player bl\u00e4ttern jetzt durchs Line-up. L\u00e4uft Musik,\n       blendet der Track des n\u00e4chsten Acts weich \u00fcber\n       (er liegt schon bereit).\n     - Play auf einer anderen Karte, w\u00e4hrend Musik l\u00e4uft:\n       weich \u00fcberblenden zum neuen Act.\n     - Stopp (Player, Equalizer, Leertaste), w\u00e4hrend das Line-up\n       NICHT im Bild ist: zur\u00fcck zu den alten Regeln, die Playlist\n       ist wieder da.\n     - L\u00e4uft gerade die Playlist und man dr\u00fcckt Play auf einem\n       Foto, blendet sie weich zum Act \u00fcber.\n     - Wird kein Play-Symbol gedr\u00fcckt, bleibt alles wie bisher.\n     - Karten ohne SoundCloud-Link (oder ohne \u00f6ffentliche Tracks)\n       bekommen kein Play-Symbol, die Musik l\u00e4uft einfach weiter.\n     - Links werden automatisch ges\u00e4ubert (?utm\u2026, Anf\u00fchrungszeichen).\n     - iPhone\/iPad: kurzer sauberer Wechsel statt \u00dcberblenden\n       (dort d\u00fcrfen Webseiten die Lautst\u00e4rke nicht steuern).\n     - barrierefrei: Tab auf das Play-Symbol, Screenreader-Ansagen,\n       weniger Bewegung.\n     - Die SoundCloud-Player im Hintergrund laden erst beim ersten\n       Klick auf eine Karte (kein Einfluss auf den Seitenstart).\n\n     NEU IN V15\n     - Handy: kein Play-Symbol auf den Line-up-Karten, \u00fcber die\n       Karten startet dort keine Musik (Ruhe in der Bar).\n       Desktop und iPad\/Tablet bleiben genau wie bisher.\n       Erkannt wird ein Handy an Touch-Bedienung und kleinem\n       Bildschirm (k\u00fcrzere Seite unter 600 px) \u2013 drehen \u00e4ndert\n       daran nichts. Wieder einschalten: PHONE_PLAY = true.\n\n     NEU IN V14\n     - Musik per Leertaste (oder Equalizer\/Player) aus, nachdem das\n       Play-Symbol mit der Maus geklickt wurde: das Symbol wechselt\n       jetzt sauber auf \u201eaus\u201c und blendet aus, sobald die Maus weg\n       ist (es behielt vorher den Fokus und blieb dadurch pink).\n\n     NEU IN V13\n     - Klick auf die Karte l\u00f6st den Player nicht mehr aus. Die neuen\n       Regeln starten nur mit dem Play-Symbol auf dem Foto; gesteuert\n       wird mit dem Play-Symbol und dem Player (\u00ab Play \u00bb).\n     - Maus auf dem Play-Symbol: das \u201e+\u201c der Karte bleibt wei\u00df\n       (es wird ja der Button ausgel\u00f6st, nicht die Karte).\n     - Touch-Ger\u00e4te: Tippen auf die Karte zeigt nur das Play-Symbol.\n\n     NEU IN V12\n     - Play-Symbol bleibt nur stehen, solange der Sound dieser Karte\n       wirklich l\u00e4uft (Play auf dem Foto, im Player, Equalizer,\n       Leertaste). Ein Klick nur auf die Karte (Act wird im Player\n       bereitgelegt) h\u00e4lt das Symbol nicht mehr fest: Maus weg =\n       Symbol blendet aus.\n     - weicheres Ein- und Ausblenden beim Dar\u00fcberfahren.\n\n     NEU IN V11\n     - kein Play-Symbol mehr von Anfang an: auf allen Karten blendet\n       es nur beim Dar\u00fcberfahren mit der Maus ein (HOME_SHOW = false).\n     - sicherer: wird gescrollt oder verl\u00e4sst die Maus das Fenster,\n       blendet ein nicht angeklicktes Symbol zuverl\u00e4ssig wieder aus.\n\n     NEU IN V10\n     - aktueller Act: das Play-Symbol blendet weich ein, sobald man\n       in den Bereich kommt (und wieder aus, wenn man ihn verl\u00e4sst).\n     - alle anderen Karten: Play-Symbol blendet beim Dar\u00fcberfahren\n       mit der Maus weich ein und beim Verlassen wieder aus.\n     - angeklickte Karte: das Symbol bleibt stehen, solange ihr Sound\n       an ist \u2013 bis die Musik ausgeschaltet oder eine andere Karte\n       angeklickt wird.\n     - Touch-Ger\u00e4te (ohne Maus): wie bisher, das Symbol erscheint\n       beim Tippen auf die Karte.\n\n     NEU IN V9\n     - auf der Karte vom aktuellen bzw. als n\u00e4chstes anstehenden Act\n       ist das Play-Symbol von Anfang an zu sehen (ohne Klick auf\n       die Karte). SoundCloud l\u00e4dt trotzdem erst beim Klick.\n\n     NEU IN V8\n     - Button etwas kleiner: 48 statt 52 px, auf kleinem und gro\u00dfem\n       Bild gleich. Play-\/Pause-Zeichen bleiben optisch gleich gro\u00df.\n     - Kleines Bild: 3 px h\u00f6her (ragt 24 px heraus).\n     - Gro\u00dfes Bild: rechter Rand bleibt 25 px im Text, der kleinere\n       Button sitzt dort automatisch passend.\n\n     NEU IN V7\n     - Play-Button, Musik aus: Schwarz mit Weichzeichner, wei\u00dfer\n       Rand, wei\u00dfes Play-Zeichen. Maus dar\u00fcber: Pink, schwarzes\n       Play-Zeichen.\n     - Musik an: Pink, schwarzes Play-Zeichen. Maus dar\u00fcber:\n       Schwarz mit Weichzeichner, wei\u00dfer Rand, Pause-Zeichen.\n       (Tastatur-Fokus zeigt dasselbe wie die Maus.)\n     - Play- und Pause-Zeichen etwas gr\u00f6\u00dfer (26 statt 22 px).\n     - Kleines Bild: Button 10 px tiefer (ragt 27 px heraus).\n     - Gro\u00dfes Bild: Button 10 px weiter rechts (25 px in den Text).\n     - Farben wie auf der Seite: Wei\u00df = warmes Wei\u00df 243 239 230,\n       Schwarz = #121212, Pink = #ea0b5f.\n\n     WICHTIG\n     Dieses Modul enth\u00e4lt absichtlich KEINEN Backslash.\n     Divi verdoppelt Backslashes bei jedem Speichern.\n\n     STELLSCHRAUBEN\n     CSS (erster Block):\n     --bt-lsb-s        Buttongr\u00f6\u00dfe (.706 = 48 px, .765 = 52 px)\n     --bt-lsb-over     \u00dcberstand unter dem kleinen Bild\n     --bt-lsb-side     \u00dcberstand rechts in den Text (offene Karte)\n     --bt-lsb-icon     Gr\u00f6\u00dfe von Play- und Pause-Zeichen\n     --bt-lsb-white \/ --bt-lsb-black \/ --bt-lsb-pink   Farben\n     Script (oben):\n     CROSSFADE_MS   Dauer des \u00dcberblendens zwischen zwei Acts\n     FADE_IN_MS     sanfter Start\n     FADE_OUT_MS    sanftes Stoppen\n     STAGGER_MS     Versatz zwischen Foto-Symbol und Player\n     HOME_SHOW      true = Play-Symbol beim aktuellen Act von selbst\n                    zeigen, false = nur bei Maus dar\u00fcber (Standard)\n     HOME_REVEAL    (nur bei HOME_SHOW = true) wie viel vom Foto im\n                    Bild sein muss, bis das Symbol einblendet\n     PHONE_PLAY     false = auf dem Handy kein Play-Symbol (Standard),\n                    true = Handy wieder wie Desktop\/iPad\n========================================================= -->\n\n<style>\n\/* =========================================================\n   1 \u00b7 PLAY-SYMBOL AUF DEM FOTO\n   Kleines Bild: mittig am unteren Bildrand, ragt 24 px heraus.\n   Offene Karte: gleitet im Takt der \u00d6ffnen-Animation an den\n   rechten Bildrand (25 px \u00dcberstand in den Text), gleiche Gr\u00f6\u00dfe.\n   ========================================================= *\/\n#musik .bt-lineup-shell .bt-lsb-play{\n  --bt-lsb-s: .706;       \/* Gr\u00f6\u00dfe (48 von 68 px), klein wie gro\u00df *\/\n  --bt-lsb-over: 21px;    \/* \u00dcberstand unter dem kleinen Bild *\/\n  --bt-lsb-side: 21px;    \/* \u00dcberstand rechts in den Text (offene Karte) *\/\n  --bt-lsb-icon: 28px;    \/* Play- und Pause-Zeichen (wirken wie 20 px) *\/\n  --bt-lsb-white: 243,239,230;\n  --bt-lsb-black: 18,18,18;\n  --bt-lsb-pink: 234,11,95;\n  \/* Bewegung in der H\u00f6he: weich abgebremst, damit der Weg nicht\n     erst nach unten und dann wieder nach oben schwingt *\/\n  --bt-lsb-q: calc(var(--bt-p, 1) * (2 - var(--bt-p, 1)));\n\n  position: absolute;\n  left: 50%;\n  top: calc(100% - var(--bt-img-gap, 6px) + var(--bt-lsb-over) - 34px * var(--bt-lsb-s));\n  z-index: 5;\n  width: 68px;\n  height: 68px;\n  margin: 0;\n  padding: 0;\n  \/* Musik aus: Schwarz mit Weichzeichner, wei\u00dfer Rand, wei\u00dfes Zeichen *\/\n  border: 1px solid rgba(var(--bt-lsb-white), .8) !important;\n  border-radius: 50%;\n  background: rgba(var(--bt-lsb-black), .55) !important;\n  -webkit-backdrop-filter: blur(10px);\n          backdrop-filter: blur(10px);\n  color: rgba(var(--bt-lsb-white), .96);\n  box-shadow: none;\n  transform: translate(-50%, -50%) scale(var(--bt-lsb-s));\n  translate: 0 6px;\n  opacity: 0;\n  pointer-events: none;\n  cursor: var(--bt-cursor-hot, pointer);\n  -webkit-appearance: none;\n  appearance: none;\n  -webkit-tap-highlight-color: transparent;\n  \/* weiches Ausblenden (langsam anlaufend, sanft auslaufend) *\/\n  transition:\n    opacity 1.1s cubic-bezier(.4,0,.2,1),\n    translate 1.2s cubic-bezier(.22,1,.36,1),\n    background-color .5s ease,\n    border-color .5s ease,\n    color .5s ease,\n    box-shadow .5s ease;\n}\n#musik .bt-lineup-shell .bt-lsb-play[hidden]{ display: none !important; }\n\/* V15: Handy \u2013 Play-Symbol komplett aus (Absicherung zum Script) *\/\nhtml.bt-lsb-phone #musik .bt-lineup-shell .bt-lsb-play{ display: none !important; }\n\n#musik .bt-lineup-shell .bt-lsb-play.is-visible,\n#musik .bt-lineup-shell .bt-lsb-play:focus-visible{\n  opacity: 1;\n  translate: 0 0;\n  pointer-events: auto;\n}\n#musik .bt-lineup-shell .bt-lsb-play:focus-visible{\n  outline: 2px solid rgb(var(--bt-lsb-pink));\n  outline-offset: 4px;\n}\n\/* Maus \u00fcber der Karte: weich einblenden (kurz verz\u00f6gert, damit beim\n   schnellen \u00dcberfahren mehrerer Karten nichts aufblitzt) *\/\n#musik .bt-lineup-shell .bt-lsb-play.is-hover{\n  transition:\n    opacity 1.2s cubic-bezier(.4,0,.2,1) .08s,\n    translate 1.3s cubic-bezier(.22,1,.36,1) .08s,\n    background-color .5s ease,\n    border-color .5s ease,\n    color .5s ease,\n    box-shadow .5s ease;\n}\n\n\/* offene Karte: Position folgt Schritt f\u00fcr Schritt der Carousel-Animation\n   (--bt-p l\u00e4uft beim \u00d6ffnen von 0 bis 1, beim Schlie\u00dfen zur\u00fcck) *\/\n@media (min-width: 768px){\n  #musik .bt-lineup-shell .lineup-row.is-drawer .bt-lsb-play{\n    left: calc(50% + (50% - 34px * var(--bt-lsb-s) + var(--bt-lsb-side)) * var(--bt-p, 1));\n    top: calc(\n      var(--bt-img-top, 0px) + var(--bt-img-h, 100%)\n      + (var(--bt-lsb-over) - 34px * var(--bt-lsb-s)) * (1 - var(--bt-lsb-q))\n      - var(--bt-img-h, 100%) * var(--bt-lsb-q) \/ 2\n    );\n  }\n}\n\n\/* Maus auf dem Play-Symbol: \u201e+\u201c der Karte bleibt im Normalzustand\n   (wei\u00df, zur\u00fcckgenommen), denn ausgel\u00f6st wird der Button, nicht die Karte *\/\n@media (hover: hover){\n  #musik .bt-lineup-shell .lineup-row.bt-lsb-on-btn .bt-lu-toggle{\n    color: var(--bt-ink, rgb(243,239,230));\n    opacity: .4;\n  }\n  #musik .bt-lineup-shell .lineup-row.is-open.bt-lsb-on-btn .bt-lu-toggle{ opacity: 1; }\n  #musik .bt-lineup-shell .lineup-row.bt-lsb-on-btn .bt-lu-ring{\n    opacity: 0;\n    transform: scale(.86);\n  }\n}\n\n\/* Play- und Pause-Zeichen blenden ineinander *\/\n#musik .bt-lineup-shell .bt-lsb-i{\n  position: absolute;\n  inset: 0;\n  display: grid;\n  place-items: center;\n  transition: opacity .45s ease, transform .45s cubic-bezier(.22,1,.36,1);\n}\n#musik .bt-lineup-shell .bt-lsb-i svg{\n  display: block;\n  width: var(--bt-lsb-icon);\n  height: var(--bt-lsb-icon);\n  fill: currentColor;\n}\n#musik .bt-lineup-shell .bt-lsb-i-play svg{ transform: none; }\n\/* Grundzustand (Musik aus UND Musik an): Play-Zeichen *\/\n#musik .bt-lineup-shell .bt-lsb-i-pause{ opacity: 0; transform: scale(.8); }\n\n\/* Musik aus + Maus dar\u00fcber: Pink, schwarzes Play-Zeichen *\/\n@media (hover: hover){\n  #musik .bt-lineup-shell .bt-lsb-play.is-visible:not(.is-playing):hover{\n    background: rgba(var(--bt-lsb-pink), .92) !important;\n    border-color: rgba(var(--bt-lsb-pink), .92) !important;\n    color: rgb(var(--bt-lsb-black));\n    box-shadow: 0 0 18px rgba(var(--bt-lsb-pink), .22);\n  }\n}\n#musik .bt-lineup-shell .bt-lsb-play:not(.is-playing):focus-visible{\n  background: rgba(var(--bt-lsb-pink), .92) !important;\n  border-color: rgba(var(--bt-lsb-pink), .92) !important;\n  color: rgb(var(--bt-lsb-black));\n}\n\n\/* Musik an: Pink, schwarzes Play-Zeichen, atmet ruhig *\/\n#musik .bt-lineup-shell .bt-lsb-play.is-playing{\n  background: rgba(var(--bt-lsb-pink), .92) !important;\n  border-color: rgba(var(--bt-lsb-pink), .92) !important;\n  color: rgb(var(--bt-lsb-black)) !important;\n  animation: btLsbBreathe 4.8s ease-in-out infinite;\n}\n@keyframes btLsbBreathe{\n  0%, 100%{ box-shadow: 0 0 6px rgba(234,11,95,.18), 0 0 14px rgba(234,11,95,.10); }\n  50%{ box-shadow: 0 0 16px rgba(234,11,95,.35), 0 0 36px rgba(234,11,95,.18); }\n}\n\n\/* Musik an + Maus dar\u00fcber (oder Tastatur-Fokus):\n   Schwarz mit Weichzeichner, wei\u00dfer Rand, Pause-Zeichen *\/\n@media (hover: hover){\n  #musik .bt-lineup-shell .bt-lsb-play.is-playing:hover{\n    background: rgba(var(--bt-lsb-black), .55) !important;\n    border-color: rgba(var(--bt-lsb-white), .8) !important;\n    color: rgba(var(--bt-lsb-white), .96) !important;\n    box-shadow: none;\n    animation: none;\n  }\n  #musik .bt-lineup-shell .bt-lsb-play.is-playing:hover .bt-lsb-i-play{ opacity: 0; transform: scale(.8); }\n  #musik .bt-lineup-shell .bt-lsb-play.is-playing:hover .bt-lsb-i-pause{ opacity: 1; transform: none; }\n}\n#musik .bt-lineup-shell .bt-lsb-play.is-playing:focus-visible{\n  background: rgba(var(--bt-lsb-black), .55) !important;\n  border-color: rgba(var(--bt-lsb-white), .8) !important;\n  color: rgba(var(--bt-lsb-white), .96) !important;\n  box-shadow: none;\n  animation: none;\n}\n#musik .bt-lineup-shell .bt-lsb-play.is-playing:focus-visible .bt-lsb-i-play{ opacity: 0; transform: scale(.8); }\n#musik .bt-lineup-shell .bt-lsb-play.is-playing:focus-visible .bt-lsb-i-pause{ opacity: 1; transform: none; }\n\n\/* l\u00e4dt: feiner Bogen l\u00e4uft leise um den Kreis *\/\n#musik .bt-lineup-shell .bt-lsb-play.is-loading::after{\n  content: \"\";\n  position: absolute;\n  inset: -1px;\n  border-radius: 50%;\n  border: 1px solid transparent;\n  border-top-color: rgba(243,239,230,.95);\n  animation: btLsbSpin 1.4s linear infinite;\n  pointer-events: none;\n}\n@keyframes btLsbSpin{ to{ transform: rotate(360deg); } }\n\n\/* =========================================================\n   2 \u00b7 PLAYER IM LINE-UP-MODUS\n   Schrift wird hell, Daten wechseln weich\n   ========================================================= *\/\n.btpc-player .btpc-artist,\n.btpc-player .btpc-track{\n  transition: color .9s ease, opacity .38s ease;\n}\n.btpc-player.bt-lsb-on .btpc-artist{ color: rgba(243,239,230,.7) !important; }\n.btpc-player.bt-lsb-on .btpc-track{ color: rgba(243,239,230,.96) !important; }\n.btpc-player.bt-lsb-swap .btpc-artist,\n.btpc-player.bt-lsb-swap .btpc-track{ opacity: 0 !important; }\n\n.btpc-player.bt-lsb-on .btpc-play:not(.is-playing){\n  background: rgba(243,239,230,.85);\n  color: #121212;\n}\n.btpc-player.bt-lsb-on .btpc-btn{\n  color: rgba(243,239,230,.85);\n  border-color: rgba(243,239,230,.4);\n}\n@media (hover: hover){\n  .btpc-player.bt-lsb-on .btpc-play:not(.is-playing):hover{\n    background: #ea0b5f;\n    color: #121212;\n  }\n  .btpc-player.bt-lsb-on .btpc-btn:hover{\n    color: #ea0b5f;\n    border-color: #ea0b5f;\n  }\n}\n\n\/* schwebender Player: auch im Line-up-Modus sichtbar, wenn der\n   gro\u00dfe Player aus dem Bild ist und Musik l\u00e4uft *\/\nbody.bt-lsb-float #btpc-floating-host{ pointer-events: auto; }\nbody.bt-lsb-float #btpc-floating-host #btpc-floating-player{\n  opacity: 1;\n  transform: translateY(0);\n}\n\n\/* =========================================================\n   3 \u00b7 UNSICHTBARE HELFER\n   ========================================================= *\/\n.bt-lsb-host{\n  position: absolute !important;\n  left: -9999px !important;\n  top: 0 !important;\n  width: 1px !important;\n  height: 1px !important;\n  overflow: hidden !important;\n  opacity: 0 !important;\n  pointer-events: none !important;\n}\n.bt-lsb-host iframe{ width: 1px; height: 1px; border: 0; }\n.bt-lsb-sr{\n  position: absolute !important;\n  width: 1px !important;\n  height: 1px !important;\n  margin: -1px !important;\n  padding: 0 !important;\n  overflow: hidden !important;\n  clip: rect(0 0 0 0) !important;\n  clip-path: inset(50%) !important;\n  white-space: nowrap !important;\n  border: 0 !important;\n}\n\n\/* =========================================================\n   4 \u00b7 WENIGER BEWEGUNG\n   ========================================================= *\/\n@media (prefers-reduced-motion: reduce){\n  #musik .bt-lineup-shell .bt-lsb-play,\n  #musik .bt-lineup-shell .bt-lsb-play::after,\n  #musik .bt-lineup-shell .bt-lsb-i,\n  .btpc-player .btpc-artist,\n  .btpc-player .btpc-track{\n    transition: none !important;\n    animation: none !important;\n  }\n}\n<\/style>\n\n<script>\n\/* =========================================================\n   BT \u00b7 LINEUP SOUND \u00b7 V15 \u2014 Logik\n   ========================================================= *\/\n(function () {\n  \"use strict\";\n\n  var d = document;\n  var w = window;\n  if(d.documentElement.classList.contains(\"bt-phone-sound-off\")) return;\n\n  if (w.__btLineupSoundV1) return;\n  if (\/[?&]et_fb=1\/.test(location.search)) return;\n  if (d.body && d.body.classList.contains(\"et-fb\")) return;\n  w.__btLineupSoundV1 = true;\n\n  \/* ---------- Stellschrauben ---------- *\/\n  var CROSSFADE_MS = 2600;\n  var FADE_IN_MS = 700;\n  var FADE_OUT_MS = 500;\n  var STAGGER_MS = 260;\n  var SWAP_MS = 380;\n  var LOAD_TIMEOUT_MS = 9000;\n  var HOME_SHOW = false;\n  var HOME_REVEAL = 0.4;\n  var PHONE_PLAY = false;   \/* false = Handy ohne Play-Symbol auf den Karten *\/\n\n  \/* Handy = Touch-Bedienung + kleiner Bildschirm (k\u00fcrzere Seite unter 600 px).\n     iPad und Tablets liegen dar\u00fcber (auch iPad mini mit 744 px) und behalten\n     das Play-Symbol. Drehen \u00e4ndert nichts, weil die k\u00fcrzere Seite z\u00e4hlt. *\/\n  var PHONE = (function () {\n    var coarse = !!(w.matchMedia && w.matchMedia(\"(pointer: coarse)\").matches);\n    var sw = w.screen ? Math.min(w.screen.width || 0, w.screen.height || 0) : 0;\n    return coarse && sw > 0 && sw < 600;\n  })();\n  var NO_PLAY = PHONE && !PHONE_PLAY;\n  if (NO_PLAY) d.documentElement.classList.add(\"bt-lsb-phone\");\n\n  var IOS = \/iP(hone|ad|od)\/.test(navigator.userAgent) ||\n            (navigator.platform === \"MacIntel\" && navigator.maxTouchPoints > 1);\n  var mqReduce = w.matchMedia(\"(prefers-reduced-motion: reduce)\");\n  function reduced() { return mqReduce.matches; }\n\n  var isEN = \/^en\/i.test(d.documentElement.lang || \"\") || \/^[\/]en([\/]|$)\/.test(location.pathname);\n  var T = isEN ? {\n    listen: \"Listen:\", pause: \"Pause:\", prevAct: \"Previous act\", nextAct: \"Next act\",\n    ready: \"Ready:\", now: \"Now playing:\", none: \"No track available:\", loading: \"\u00b7 \u00b7 \u00b7\",\n    open: \"Open on SoundCloud:\", back: \"Back to the playlist\"\n  } : {\n    listen: \"Sound h\u00f6ren:\", pause: \"Sound pausieren:\", prevAct: \"Vorheriger Act\", nextAct: \"N\u00e4chster Act\",\n    ready: \"Bereit:\", now: \"Jetzt l\u00e4uft:\", none: \"Kein Track verf\u00fcgbar:\", loading: \"\u00b7 \u00b7 \u00b7\",\n    open: \"Auf SoundCloud \u00f6ffnen:\", back: \"Zur\u00fcck zur Playlist\"\n  };\n  var WS = new RegExp(\"[ \" + String.fromCharCode(9, 10, 13, 160) + \"]+\", \"g\");\n  function squish(s) { return String(s || \"\").replace(WS, \" \").trim(); }\n\n  var PLAY_SVG = '<svg viewBox=\"0 0 24 24\" focusable=\"false\"><path d=\"M8 5v14l12-7z\"\/><\/svg>';\n  var PAUSE_SVG = '<svg viewBox=\"0 0 24 24\" focusable=\"false\"><path d=\"M7 5h4v14H7zM13 5h4v14h-4z\"\/><\/svg>';\n\n  \/* ---------- Zustand ---------- *\/\n  var track = null, shell = null;\n  var mode = \"normal\";          \/* \"normal\" = alte Regeln \u00b7 \"lineup\" = Line-up steuert den Player *\/\n  var playing = false;          \/* Line-up-Musik soll laufen *\/\n  var activeCard = null;        \/* Karte, deren Sound gew\u00e4hlt ist *\/\n  var homeCard = null;          \/* aktueller \/ n\u00e4chster Act: Play-Symbol blendet im Bild ein *\/\n  var homeInView = false;       \/* Foto des aktuellen Acts ist im Bild *\/\n  var hoverCard = null;         \/* Karte unter der Maus *\/\n  var released = false;         \/* Sound der gew\u00e4hlten Karte wurde ausgeschaltet *\/\n  var navCard = null;           \/* Karte, auf der \u00ab \u00bb gerade stehen *\/\n  var target = null;            \/* { card, url, name } *\/\n  var targetReady = false;\n  var reqId = 0;\n  var slots = [];               \/* zwei unsichtbare SoundCloud-Player (A\/B) *\/\n  var cur = 0;\n  var host = null, srLive = null;\n  var playerW = null;           \/* der Playlist-Player *\/\n  var icons = new Map();\n  var urlOf = new Map();\n  var saved = null;\n  var displayed = { a: \"\", t: \"\" };\n  var linkUrl = \"\";\n  var carouselVisible = true;\n  var origPrev = \"Previous\", origNext = \"Next\";\n  var swapT = null, staggerT = null, staggerSecond = null, preTimer = null, pauseCheck = null;\n  var mo = null, moQueued = false;\n\n  \/* =======================================================\n     A \u00b7 HELFER\n     ======================================================= *\/\n  function players() { return d.querySelectorAll(\".btpc-player\"); }\n  function standPlayBtn() { return d.querySelector(\"#bt-player-compact .btpc-play\"); }\n  function playlistPlaying() {\n    var b = standPlayBtn();\n    return mode === \"normal\" && !!(b && b.classList.contains(\"is-playing\"));\n  }\n  function cls(el, c, on) { if (el && el.classList.contains(c) !== on) el.classList.toggle(c, on); }\n  function disp(el, v) { if (el && el.style.display !== v) el.style.display = v; }\n  function attr(el, n, v) { if (el && v != null && el.getAttribute(n) !== v) el.setAttribute(n, v); }\n  function text(el, v) { if (el && v != null && el.textContent !== v) el.textContent = v; }\n  function announce(msg) {\n    if (!srLive) return;\n    srLive.textContent = \"\";\n    setTimeout(function () { srLive.textContent = msg; }, 60);\n  }\n\n  \/* SoundCloud-Link s\u00e4ubern: ?utm\u2026, #\u2026, Anf\u00fchrungszeichen, Slash am Ende *\/\n  var NOT_ARTIST = [\"discover\", \"search\", \"upload\", \"stream\", \"you\", \"pages\", \"terms-of-use\", \"charts\", \"tags\"];\n  function cleanSc(href) {\n    if (!href) return \"\";\n    var s = String(href).split(\"?\")[0].split(\"#\")[0];\n    s = s.replace(\/%22\/gi, \"\").replace(\/[\"']\/g, \"\").trim().replace(\/[\/]+$\/, \"\");\n    var m = s.match(\/^https?:[\/][\/](www[.]|m[.])?soundcloud[.]com[\/]([^\/]+)([\/].*)?$\/i);\n    if (!m) return \"\";\n    if (NOT_ARTIST.indexOf(m[2].toLowerCase()) > -1) return \"\";\n    return \"https:\/\/soundcloud.com\/\" + m[2] + (m[3] || \"\");\n  }\n  function cardUrl(card) {\n    if (urlOf.has(card)) return urlOf.get(card);\n    var u = \"\";\n    var links = card.querySelectorAll(\"a[href*='soundcloud.com']\");\n    for (var i = 0; i < links.length && !u; i++) u = cleanSc(links[i].getAttribute(\"href\"));\n    urlOf.set(card, u);\n    return u;\n  }\n  function hasSound(card) { return !!card && !!cardUrl(card) && card.getAttribute(\"data-bt-lsb\") !== \"none\"; }\n  function cardName(card) {\n    var h2 = card && card.querySelector(\"h2\");\n    if (!h2) return \"\";\n    var c = h2.cloneNode(true);\n    c.querySelectorAll(\".bt-lu-sr\").forEach(function (n) { n.remove(); });\n    return squish(c.textContent);\n  }\n  function cardList() {\n    if (!track) return [];\n    return Array.prototype.filter.call(track.children, function (c) {\n      return c.classList && c.classList.contains(\"lineup-row\");\n    });\n  }\n  function cardByUrl(url) {\n    var list = cardList();\n    for (var i = 0; i < list.length; i++) { if (cardUrl(list[i]) === url) return list[i]; }\n    return null;\n  }\n\n  \/* =======================================================\n     B \u00b7 UNSICHTBARE SOUNDCLOUD-PLAYER\n     ======================================================= *\/\n  function scReady() { return !!(w.SC && w.SC.Widget); }\n  var OPTS = { auto_play: false, hide_related: true, show_comments: false, show_user: false,\n               show_reposts: false, show_teaser: false, visual: false };\n  function widgetSrc(url) {\n    var q = \"\";\n    for (var k in OPTS) q += \"&\" + k + \"=\" + OPTS[k];\n    return \"https:\/\/w.soundcloud.com\/player\/?url=\" + encodeURIComponent(url) + q;\n  }\n  function makeSlot(i) {\n    return { i: i, frame: null, widget: null, firstReady: null, url: \"\", name: \"\",\n             ready: false, loading: false, failed: false, sound: null, token: 0,\n             waiters: [], vol: 100, live: false, fadeTok: 0 };\n  }\n  function ensureReady() {\n    if (!scReady()) return false;\n    if (!host) {\n      host = d.createElement(\"div\");\n      host.className = \"bt-lsb-host\";\n      host.setAttribute(\"aria-hidden\", \"true\");\n      d.body.appendChild(host);\n      slots = [makeSlot(0), makeSlot(1)];\n    }\n    return true;\n  }\n  function dropWidget(slot) {\n    slot.firstReady = null;\n    if (slot.frame && slot.frame.parentNode) slot.frame.parentNode.removeChild(slot.frame);\n    slot.frame = null;\n    slot.widget = null;\n    slot.live = false;\n  }\n  function ensureWidget(slot, url, onReady) {\n    if (slot.widget && slot.firstReady) dropWidget(slot);\n    if (slot.widget) {\n      var o = { callback: onReady };\n      for (var k in OPTS) o[k] = OPTS[k];\n      try { slot.widget.load(url, o); return; } catch (e) { dropWidget(slot); }\n    }\n    var f = d.createElement(\"iframe\");\n    f.title = \"SoundCloud Line-up \" + (slot.i + 1);\n    f.setAttribute(\"allow\", \"autoplay; encrypted-media\");\n    f.setAttribute(\"tabindex\", \"-1\");\n    f.setAttribute(\"scrolling\", \"no\");\n    f.setAttribute(\"frameborder\", \"no\");\n    f.src = widgetSrc(url);\n    host.appendChild(f);\n    slot.frame = f;\n    slot.firstReady = onReady;\n    var wd = w.SC.Widget(f);\n    slot.widget = wd;\n    var E = w.SC.Widget.Events;\n    wd.bind(E.READY, function () {\n      if (slot.widget !== wd) return;\n      var fn = slot.firstReady;\n      slot.firstReady = null;\n      if (fn) fn();\n    });\n    wd.bind(E.PLAY, function () { if (slot.widget === wd) onWidget(slot, \"play\"); });\n    wd.bind(E.PAUSE, function () { if (slot.widget === wd) onWidget(slot, \"pause\"); });\n    wd.bind(E.FINISH, function () { if (slot.widget === wd) onWidget(slot, \"finish\"); });\n  }\n\n  \/* neuesten Track des Acts ermitteln (ein paar Versuche, SoundCloud braucht manchmal kurz) *\/\n  function readSound(slot, tok, n, cb) {\n    var wd = slot.widget;\n    if (!wd) { cb(null); return; }\n    function retry() {\n      if (n < 4) setTimeout(function () { if (tok === slot.token) readSound(slot, tok, n + 1, cb); }, 350);\n      else cb(null);\n    }\n    try {\n      wd.getCurrentSound(function (s) {\n        if (tok !== slot.token) return;\n        if (s && s.title) { cb(s); return; }\n        wd.getSounds(function (list) {\n          if (tok !== slot.token) return;\n          var first = list && list.length ? list[0] : null;\n          if (first && first.title) cb(first);\n          else retry();\n        });\n      });\n    } catch (e) { retry(); }\n  }\n\n  function load(slot, url, name, cb) {\n    var tok = ++slot.token;\n    slot.fadeTok++;\n    slot.live = false;\n    slot.url = url;\n    slot.name = name;\n    slot.ready = false;\n    slot.failed = false;\n    slot.loading = true;\n    slot.sound = null;\n    slot.waiters = cb ? [cb] : [];\n    var done = false;\n    var timer = setTimeout(function () {\n      if (tok !== slot.token) return;\n      if (slot.firstReady) dropWidget(slot);\n      finish(null);\n    }, LOAD_TIMEOUT_MS);\n    function finish(sound) {\n      if (done || tok !== slot.token) return;\n      done = true;\n      clearTimeout(timer);\n      slot.loading = false;\n      slot.ready = !!sound;\n      slot.failed = !sound;\n      slot.sound = sound || null;\n      if (sound && slot.widget) { try { slot.widget.setVolume(100); } catch (e) {} slot.vol = 100; }\n      var list = slot.waiters;\n      slot.waiters = [];\n      list.forEach(function (fn) { try { fn(slot, !!sound); } catch (e) {} });\n    }\n    function attempt(raw, last) {\n      ensureWidget(slot, raw, function () {\n        if (tok !== slot.token) return;\n        readSound(slot, tok, 0, function (s) {\n          if (tok !== slot.token) return;\n          if (s || last) finish(s);\n          else attempt(raw + \"\/tracks\", true);\n        });\n      });\n    }\n    \/* Profil-Link: erst das Profil, notfalls die Track-Liste versuchen *\/\n    var path = url.replace(\/^https:[\/][\/]soundcloud[.]com[\/]\/i, \"\");\n    attempt(url, path.indexOf(\"\/\") > -1);\n  }\n\n  \/* Sound in einem der beiden Player bereitstellen *\/\n  function loadFor(url, name, cb) {\n    for (var i = 0; i < slots.length; i++) {\n      var s = slots[i];\n      if (s.url !== url) continue;\n      if (s.ready) { cb(s, true); return; }\n      if (s.loading) { s.waiters.push(cb); return; }\n    }\n    var sb = slots[1 - cur];\n    if (sb.live && !slots[cur].live) sb = slots[cur];\n    load(sb, url, name, cb);\n  }\n\n  \/* =======================================================\n     C \u00b7 LAUTST\u00c4RKE: EINBLENDEN, AUSBLENDEN, \u00dcBERBLENDEN\n     ======================================================= *\/\n  function fade(t, to, ms, done) {\n    var tok = ++t.fadeTok;\n    var from = t.vol;\n    if (IOS || ms <= 0 || from === to) {\n      t.vol = to;\n      try { t.widget.setVolume(to); } catch (e) {}\n      if (done) done();\n      return;\n    }\n    var t0 = Date.now();\n    (function tick() {\n      if (tok !== t.fadeTok) return;\n      var p = Math.min(1, (Date.now() - t0) \/ ms);\n      var e = p < 0.5 ? 2 * p * p : 1 - Math.pow(-2 * p + 2, 2) \/ 2;\n      t.vol = Math.round(from + (to - from) * e);\n      try { t.widget.setVolume(t.vol); } catch (err) {}\n      if (p < 1) setTimeout(tick, 60);\n      else if (done) done();\n    })();\n  }\n  function verify(t) {\n    \/* falls der Browser das Abspielen blockiert: Anzeige ehrlich zur\u00fcckstellen *\/\n    setTimeout(function () {\n      if (!t.widget || t.i !== cur || !playing || !t.live) return;\n      try {\n        t.widget.isPaused(function (p) {\n          if (p && t.i === cur && playing) { playing = false; paint(\"player\"); }\n        });\n      } catch (e) {}\n    }, 3000);\n  }\n  function start(t, ms) {\n    if (!t || !t.widget) return;\n    t.fadeTok++;\n    if (!t.live) {\n      t.vol = IOS ? 100 : 0;\n      try { t.widget.setVolume(t.vol); } catch (e) {}\n    }\n    t.live = true;\n    try { t.widget.play(); } catch (e) {}\n    fade(t, 100, ms);\n    verify(t);\n  }\n  function halt(t, ms) {\n    if (!t || !t.widget || !t.live) return;\n    fade(t, 0, ms, function () {\n      t.live = false;\n      try { t.widget.pause(); t.widget.setVolume(100); } catch (e) {}\n      t.vol = 100;\n    });\n  }\n  function crossfade(from, to) {\n    cur = to.i;\n    var wasLive = !!(from && from.live && from.widget);\n    if (!wasLive) { start(to, FADE_IN_MS); return; }\n    if (IOS) {\n      from.fadeTok++;\n      from.live = false;\n      try { from.widget.pause(); } catch (e) {}\n      start(to, 0);\n      return;\n    }\n    start(to, CROSSFADE_MS);\n    halt(from, CROSSFADE_MS);\n  }\n  function getPlayerW() {\n    if (!playerW) {\n      var f = d.getElementById(\"btpc-sc-widget\");\n      if (!f || !scReady()) return null;\n      playerW = { i: -1, widget: w.SC.Widget(f), vol: 100, live: false, fadeTok: 0 };\n    }\n    return playerW;\n  }\n\n  \/* Ereignisse der unsichtbaren Player *\/\n  function onWidget(slot, type) {\n    if (mode !== \"lineup\" || slot.i !== cur || !slot.live) return;\n    if (type === \"play\") {\n      clearTimeout(pauseCheck);\n      if (!playing) { playing = true; paint(\"player\"); }\n      \/* n\u00e4chster Track desselben Acts: Titel nachziehen *\/\n      try {\n        slot.widget.getCurrentSound(function (s) {\n          if (s && s.title && slot.sound && s.title !== slot.sound.title && slot.i === cur && mode === \"lineup\") {\n            slot.sound = s;\n            showSlot(slot);\n          }\n        });\n      } catch (e) {}\n      return;\n    }\n    clearTimeout(pauseCheck);\n    pauseCheck = setTimeout(function () {\n      if (slot.i !== cur || !playing || !slot.widget) return;\n      try {\n        slot.widget.isPaused(function (p) {\n          if (p && slot.i === cur && playing && slot.live) {\n            slot.live = false;\n            playing = false;\n            paint(\"player\");\n          }\n        });\n      } catch (e) {}\n    }, type === \"finish\" ? 1500 : 400);\n  }\n\n  \/* =======================================================\n     D \u00b7 ANZEIGE: PLAYER + PLAY-SYMBOL\n     ======================================================= *\/\n  function paintPlayers() {\n    if (mode !== \"lineup\") return;\n    if (w.btPlayerTimeline) w.btPlayerTimeline.use(slots[cur] && slots[cur].widget, playing, slots[cur] && slots[cur].sound);\n    players().forEach(function (p) {\n      cls(p, \"bt-lsb-on\", true);\n      cls(p.querySelector(\".btpc-play\"), \"is-playing\", playing);\n      disp(p.querySelector(\".btpc-icon-play\"), playing ? \"none\" : \"grid\");\n      disp(p.querySelector(\".btpc-icon-pause\"), playing ? \"grid\" : \"none\");\n      attr(p.querySelector(\".btpc-prev\"), \"aria-label\", T.prevAct);\n      attr(p.querySelector(\".btpc-next\"), \"aria-label\", T.nextAct);\n      text(p.querySelector(\".btpc-artist\"), displayed.a);\n      text(p.querySelector(\".btpc-track\"), displayed.t);\n      var l = p.querySelector(\".btpc-sc-link\");\n      if (linkUrl) attr(l, \"href\", linkUrl);\n      attr(l, \"aria-label\", T.open + \" \" + displayed.a);\n    });\n  }\n\n  function paintIcons() {\n    icons.forEach(function (btn, card) {\n      var none = card.getAttribute(\"data-bt-lsb\") === \"none\";\n      if (none) { btn.hidden = true; return; }\n      \/* festgehalten wird das Symbol nur, solange der Sound dieser Karte l\u00e4uft *\/\n      var holder = activeCard && mode === \"lineup\" && playing ? activeCard : null;\n      var held = card === holder ||\n                 (card === homeCard && homeInView && (!holder || holder === homeCard));\n      var on = held || card === hoverCard;\n      var isPlay = card === activeCard && mode === \"lineup\" && playing && targetReady;\n      cls(btn, \"is-hover\", on && !held);\n      cls(btn, \"is-visible\", on);\n      cls(btn, \"is-playing\", isPlay);\n      cls(btn, \"is-loading\", card === holder && !targetReady);\n      attr(btn, \"aria-pressed\", isPlay ? \"true\" : \"false\");\n      attr(btn, \"aria-label\", (isPlay ? T.pause : T.listen) + \" \" + cardName(card));\n    });\n  }\n\n  \/* Foto-Symbol und Player schalten leicht versetzt *\/\n  function paint(source) {\n    var cardFirst = source === \"card\";\n    var first = cardFirst ? paintIcons : paintPlayers;\n    var second = cardFirst ? paintPlayers : paintIcons;\n    clearTimeout(staggerT);\n    first();\n    if (!source || reduced()) {\n      staggerSecond = null;\n      second();\n    } else {\n      staggerSecond = second;\n      staggerT = setTimeout(function () { staggerSecond = null; second(); }, STAGGER_MS);\n    }\n    updateFloat();\n  }\n\n  \/* Act + Track im Player: weich aus, Text tauschen, weich ein *\/\n  function setMeta(a, t, animate) {\n    if (mode !== \"lineup\") return;\n    clearTimeout(swapT);\n    if (a === displayed.a && t === displayed.t) {\n      players().forEach(function (p) { p.classList.remove(\"bt-lsb-swap\"); });\n      paintPlayers();\n      return;\n    }\n    if (!animate || reduced()) {\n      displayed = { a: a, t: t };\n      paintPlayers();\n      return;\n    }\n    players().forEach(function (p) { p.classList.add(\"bt-lsb-swap\"); });\n    swapT = setTimeout(function () {\n      displayed = { a: a, t: t };\n      paintPlayers();\n      players().forEach(function (p) { p.classList.remove(\"bt-lsb-swap\"); });\n    }, SWAP_MS);\n  }\n  function showSlot(slot) {\n    var title = slot.sound && slot.sound.title ? squish(slot.sound.title) : \"\";\n    linkUrl = (slot.sound && slot.sound.permalink_url) || slot.url;\n    setMeta(slot.name, title || \"SoundCloud\", true);\n    announce((playing ? T.now : T.ready) + \" \" + slot.name + (title ? \" \u2013 \" + title : \"\"));\n  }\n\n  \/* Der Player-Code schreibt bei eigenen Ereignissen seine Daten\n     zur\u00fcck \u2014 im Line-up-Modus stellen wir sie sofort wieder her *\/\n  function observePlayers() {\n    if (mo || !(\"MutationObserver\" in w)) return;\n    mo = new MutationObserver(function (records) {\n      if (records.length && records.every(function (record) { var n = record.target.nodeType === 1 ? record.target : record.target.parentElement; return n && n.closest && n.closest(\".btpc-timeline\"); })) return;\n      if (mode !== \"lineup\" || moQueued) return;\n      moQueued = true;\n      setTimeout(function () {\n        moQueued = false;\n        if (mode === \"lineup\" && staggerSecond !== paintPlayers) paintPlayers();\n      }, 0);\n    });\n    players().forEach(function (p) {\n      mo.observe(p, { subtree: true, childList: true, characterData: true,\n                      attributes: true, attributeFilter: [\"class\", \"style\", \"href\"] });\n    });\n  }\n\n  \/* schwebender Player, wenn der gro\u00dfe Player aus dem Bild ist *\/\n  function updateFloat() {\n    var on = false;\n    if (mode === \"lineup\" && playing) {\n      var ph = d.getElementById(\"btpc-stand-placeholder\");\n      if (ph) {\n        var r = ph.getBoundingClientRect();\n        var vh = w.innerHeight || d.documentElement.clientHeight;\n        on = !(r.bottom > 0 && r.top < vh);\n      }\n    }\n    cls(d.body, \"bt-lsb-float\", on);\n  }\n\n  \/* =======================================================\n     E \u00b7 MODUS WECHSELN\n     ======================================================= *\/\n  function enterLineup() {\n    if (mode === \"lineup\") return;\n    var sp = d.getElementById(\"bt-player-compact\");\n    saved = null;\n    if (sp) {\n      var a = sp.querySelector(\".btpc-artist\"), t = sp.querySelector(\".btpc-track\"),\n          l = sp.querySelector(\".btpc-sc-link\");\n      saved = {\n        a: a ? a.textContent : \"\", t: t ? t.textContent : \"\",\n        href: l ? l.getAttribute(\"href\") : \"\", label: l ? l.getAttribute(\"aria-label\") : \"\"\n      };\n      displayed = { a: saved.a, t: saved.t };\n      linkUrl = saved.href;\n    }\n    mode = \"lineup\";\n    playing = false;\n    observePlayers();\n  }\n\n  function exitLineup() {\n    reqId++;\n    clearTimeout(preTimer);\n    clearTimeout(swapT);\n    clearTimeout(staggerT);\n    clearTimeout(pauseCheck);\n    staggerSecond = null;\n    slots.forEach(function (s) { halt(s, FADE_OUT_MS); });\n    playing = false;\n    released = false;\n    mode = \"normal\";\n    activeCard = null;\n    navCard = null;\n    target = null;\n    targetReady = false;\n    var pw = !!(playerW && playerW.live);\n    if (w.btPlayerTimeline) w.btPlayerTimeline.useBase(pw);\n    players().forEach(function (p) {\n      p.classList.remove(\"bt-lsb-on\", \"bt-lsb-swap\");\n      cls(p.querySelector(\".btpc-play\"), \"is-playing\", pw);\n      disp(p.querySelector(\".btpc-icon-play\"), pw ? \"none\" : \"grid\");\n      disp(p.querySelector(\".btpc-icon-pause\"), pw ? \"grid\" : \"none\");\n      attr(p.querySelector(\".btpc-prev\"), \"aria-label\", origPrev);\n      attr(p.querySelector(\".btpc-next\"), \"aria-label\", origNext);\n      if (saved) {\n        text(p.querySelector(\".btpc-artist\"), saved.a);\n        text(p.querySelector(\".btpc-track\"), saved.t);\n        var l = p.querySelector(\".btpc-sc-link\");\n        attr(l, \"href\", saved.href);\n        attr(l, \"aria-label\", saved.label);\n      }\n    });\n    paintIcons();\n    updateFloat();\n    announce(T.back);\n  }\n\n  \/* =======================================================\n     F \u00b7 ACT W\u00c4HLEN, SPIELEN, BL\u00c4TTERN\n     ======================================================= *\/\n  function failCard(card) {\n    card.setAttribute(\"data-bt-lsb\", \"none\");\n    announce(T.none + \" \" + cardName(card));\n    if (activeCard === card) {\n      var s = slots[cur];\n      var back = s && s.ready ? cardByUrl(s.url) : null;\n      if (back && back !== card) {\n        activeCard = back;\n        target = { card: back, url: s.url, name: s.name };\n        targetReady = true;\n        if (mode === \"lineup\") showSlot(s);\n      } else {\n        activeCard = null;\n        target = null;\n        targetReady = false;\n        if (mode === \"lineup\" && !(s && s.live)) {\n          exitLineup();\n          return;\n        }\n      }\n    }\n    paint();\n  }\n\n  function preloadNext() {\n    clearTimeout(preTimer);\n    preTimer = setTimeout(function () {\n      if (mode !== \"lineup\" || !activeCard) return;\n      var list = cardList(), i = list.indexOf(activeCard);\n      for (var k = i + 1; k < list.length; k++) {\n        var card = list[k];\n        if (!hasSound(card)) continue;\n        var u = cardUrl(card);\n        if (slots[0].url === u || slots[1].url === u) return;\n        var sb = slots[1 - cur];\n        if (sb.live || sb.loading) return;\n        load(sb, u, cardName(card), function (slot, ok) { if (!ok) card.setAttribute(\"data-bt-lsb\", \"none\"); });\n        return;\n      }\n    }, playing ? CROSSFADE_MS + 500 : 700);\n  }\n\n  \/* Karte wird zum Ziel: laden, dann (wenn Musik l\u00e4uft) \u00fcberblenden *\/\n  function setTarget(card, from, source) {\n    var url = cardUrl(card);\n    if (!url) return;\n    activeCard = card;\n    navCard = card;\n    released = false;\n    target = { card: card, url: url, name: cardName(card) };\n    targetReady = false;\n    var id = ++reqId;\n    var answered = false;\n    loadFor(url, target.name, function (slot, ok) {\n      if (id !== reqId) return;\n      answered = true;\n      if (!ok) { failCard(card); return; }\n      targetReady = true;\n      var old = slots[cur];\n      if (playing) {\n        if (from) crossfade(from, slot);\n        else if (slot !== old) crossfade(old, slot);\n        else if (!slot.live) start(slot, FADE_IN_MS);\n      } else if (slot !== old) {\n        cur = slot.i;\n      }\n      showSlot(slot);\n      paint(source);\n      preloadNext();\n    });\n    if (!answered) {\n      if (!playing) setMeta(target.name, T.loading, true);\n      paint(source);\n    }\n  }\n\n  function toggle(source) {\n    if (mode !== \"lineup\") return;\n    if (playing) {\n      \/* Stopp, w\u00e4hrend das Line-up nicht im Bild ist: alte Regeln *\/\n      if (source === \"player\" && !carouselVisible) { exitLineup(); return; }\n      playing = false;\n      released = true;\n      halt(slots[cur], FADE_OUT_MS);\n      paint(source);\n      return;\n    }\n    if (!target) return;\n    playing = true;\n    released = false;\n    var s = slots[cur];\n    if (targetReady && s.url === target.url) {\n      start(s, FADE_IN_MS);\n      announce(T.now + \" \" + s.name);\n    }\n    \/* l\u00e4dt noch: startet von selbst, sobald der Track bereit ist *\/\n    paint(source);\n  }\n\n  function onIconClick(card) {\n    if (NO_PLAY || !hasSound(card) || !ensureReady()) return;\n    if (mode === \"normal\") {\n      var from = null;\n      if (playlistPlaying()) {\n        from = getPlayerW();\n        if (from) { from.live = true; from.vol = 100; }\n      }\n      enterLineup();\n      playing = true;\n      setTarget(card, from, \"card\");\n      return;\n    }\n    if (card !== activeCard) {\n      playing = true;\n      setTarget(card, null, \"card\");\n      return;\n    }\n    toggle(\"card\");\n  }\n\n  \/* Carousel so schieben, dass die Karte vorne steht (wie die Carousel-Pfeile) *\/\n  function scrollToCard(card) {\n    var cs = getComputedStyle(card), tcs = getComputedStyle(track);\n    var tr = track.getBoundingClientRect(), cr = card.getBoundingClientRect();\n    var base = track.scrollLeft + cr.left - tr.left - track.clientLeft;\n    var x;\n    if ((cs.scrollSnapAlign || \"\").indexOf(\"center\") > -1) {\n      x = base - (track.clientWidth - cr.width) \/ 2;\n    } else {\n      var pad = parseFloat(tcs.scrollPaddingLeft);\n      if (isNaN(pad)) pad = parseFloat(tcs.paddingLeft) || 0;\n      x = base - pad;\n    }\n    x = Math.max(0, Math.min(Math.round(x), track.scrollWidth - track.clientWidth));\n    track.scrollTo({ left: x, behavior: reduced() ? \"auto\" : \"smooth\" });\n  }\n  function cardInView(card) {\n    var tr = track.getBoundingClientRect(), cr = card.getBoundingClientRect();\n    return cr.right > tr.left + 10 && cr.left < tr.right - 10;\n  }\n  function firstVisibleIndex(list) {\n    for (var i = 0; i < list.length; i++) { if (cardInView(list[i])) return i; }\n    return 0;\n  }\n\n  function nav(dir) {\n    var list = cardList();\n    if (!list.length) return;\n    var ref = navCard || activeCard;\n    var i = list.indexOf(ref);\n    if (i < 0 || !cardInView(ref)) {\n      var f = firstVisibleIndex(list);\n      i = dir > 0 ? f - 1 : f;\n    }\n    var n = i + dir;\n    if (n >= list.length) {\n      \/* am Ende: zur\u00fcck zum aktuellen Act (wie im Carousel) *\/\n      n = (w.BTLineup && typeof w.BTLineup.current === \"number\") ? w.BTLineup.current : 0;\n    }\n    if (n < 0) n = 0;\n    var card = list[n];\n    if (!card || card === ref) return;\n    navCard = card;\n    scrollToCard(card);\n    if (hasSound(card)) setTarget(card, null, \"player\");\n    else announce(cardName(card));\n  }\n\n  \/* =======================================================\n     G \u00b7 START\n     ======================================================= *\/\n  function buildIcons() {\n    \/* V15: Handy \u2013 keine Play-Symbole, also kein Musikstart \u00fcber die Karten *\/\n    if (NO_PLAY) return;\n    cardList().forEach(function (card) {\n      if (!cardUrl(card)) return;\n      var col = card.querySelector(\":scope > .et_pb_column:nth-child(3)\");\n      if (!col || col.querySelector(\":scope > .bt-lsb-play\")) return;\n      var b = d.createElement(\"button\");\n      b.type = \"button\";\n      b.className = \"bt-lsb-play\";\n      b.innerHTML =\n        '<span class=\"bt-lsb-i bt-lsb-i-play\" aria-hidden=\"true\">' + PLAY_SVG + '<\/span>' +\n        '<span class=\"bt-lsb-i bt-lsb-i-pause\" aria-hidden=\"true\">' + PAUSE_SVG + '<\/span>';\n      b.setAttribute(\"aria-label\", T.listen + \" \" + cardName(card));\n      b.setAttribute(\"aria-pressed\", \"false\");\n      b.addEventListener(\"click\", function (e) {\n        e.preventDefault();\n        e.stopPropagation();\n        onIconClick(card);\n        \/* Mausklick: Fokus wieder abgeben, sonst bleibt der Button nach\n           Leertaste\/Equalizer im Fokus-Look (pink) stehen.\n           Tastatur (Tab + Enter) beh\u00e4lt den Fokus. *\/\n        if (e.detail > 0) requestAnimationFrame(function () { try { b.blur(); } catch (err) {} });\n      });\n      \/* Maus auf dem Button: \u201e+\u201c der Karte bleibt wei\u00df *\/\n      b.addEventListener(\"mouseenter\", function () { card.classList.add(\"bt-lsb-on-btn\"); });\n      b.addEventListener(\"mouseleave\", function () { card.classList.remove(\"bt-lsb-on-btn\"); });\n      col.appendChild(b);\n      icons.set(card, b);\n    });\n  }\n\n  function init() {\n    if (shell) return;\n    track = d.querySelector(\"#musik .bt-lineup-track\");\n    if (!track) return;\n    shell = track.closest(\".bt-lineup-shell\") || track.parentElement;\n\n    srLive = d.createElement(\"div\");\n    srLive.className = \"bt-lsb-sr\";\n    srLive.setAttribute(\"aria-live\", \"polite\");\n    d.body.appendChild(srLive);\n\n    var sp = d.getElementById(\"bt-player-compact\");\n    if (sp) {\n      var p = sp.querySelector(\".btpc-prev\"), n = sp.querySelector(\".btpc-next\");\n      if (p && p.getAttribute(\"aria-label\")) origPrev = p.getAttribute(\"aria-label\");\n      if (n && n.getAttribute(\"aria-label\")) origNext = n.getAttribute(\"aria-label\");\n    }\n\n    buildIcons();\n\n    \/* aktueller \/ als n\u00e4chstes anstehender Act: Play-Symbol blendet weich ein,\n       sobald sein Foto im Bild ist (geladen wird erst beim Klick) *\/\n    var list = cardList();\n    var cur0 = (w.BTLineup && typeof w.BTLineup.current === \"number\") ? w.BTLineup.current : 0;\n    if (HOME_SHOW && list[cur0] && cardUrl(list[cur0])) homeCard = list[cur0];\n    if (homeCard) {\n      var hb = icons.get(homeCard);\n      var spot = (hb && hb.parentElement) || homeCard;\n      if (\"IntersectionObserver\" in w) {\n        new IntersectionObserver(function (entries) {\n          entries.forEach(function (en) {\n            homeInView = en.isIntersecting && en.intersectionRatio >= HOME_REVEAL - 0.01;\n          });\n          paintIcons();\n        }, { threshold: [0, 0.2, 0.4, 0.6, 0.8, 1] }).observe(spot);\n      } else {\n        homeInView = true;\n        requestAnimationFrame(function () { paintIcons(); });\n      }\n    }\n\n    \/* Maus \u00fcber einer Karte: Play-Symbol weich ein, beim Verlassen wieder aus\n       (nur Maus \u2013 auf Touch-Ger\u00e4ten erscheint es beim Tippen) *\/\n    var PE = \"PointerEvent\" in w;\n    icons.forEach(function (btn, card) {\n      function isMouse(e) { return !PE || !e.pointerType || e.pointerType === \"mouse\"; }\n      card.addEventListener(PE ? \"pointerenter\" : \"mouseenter\", function (e) {\n        if (!isMouse(e)) return;\n        hoverCard = card;\n        paintIcons();\n      });\n      card.addEventListener(PE ? \"pointerleave\" : \"mouseleave\", function (e) {\n        if (!isMouse(e) || hoverCard !== card) return;\n        hoverCard = null;\n        paintIcons();\n      });\n    });\n    \/* Sicherheitsnetz: nach dem Scrollen (Seite oder Carousel) oder wenn die\n       Maus das Fenster verl\u00e4sst, pr\u00fcfen, ob die Maus wirklich noch auf der Karte ist *\/\n    function checkHover() {\n      if (!hoverCard) return;\n      var still = false;\n      try { still = hoverCard.matches(\":hover\"); } catch (err) {}\n      if (!still) { hoverCard = null; paintIcons(); }\n    }\n    var hoverT = null;\n    function checkHoverSoon() { clearTimeout(hoverT); hoverT = setTimeout(checkHover, 120); }\n    track.addEventListener(\"scroll\", checkHoverSoon, { passive: true });\n    w.addEventListener(\"scroll\", checkHoverSoon, { passive: true });\n    d.addEventListener(\"mouseleave\", function () { if (hoverCard) { hoverCard = null; paintIcons(); } });\n    w.addEventListener(\"blur\", function () { if (hoverCard) { hoverCard = null; paintIcons(); } });\n\n    \/* Klick auf die Karte l\u00f6st nichts aus. Nur auf Touch-Ger\u00e4ten (ohne Maus)\n       zeigt ein Tippen auf die Karte das Play-Symbol, Tippen daneben blendet es aus *\/\n    var lastPointer = \"mouse\";\n    d.addEventListener(\"pointerdown\", function (e) { lastPointer = e.pointerType || \"mouse\"; }, true);\n    d.addEventListener(\"click\", function (e) {\n      if (lastPointer === \"mouse\") return;\n      var t = e.target;\n      var card = t && t.closest ? t.closest(\".lineup-row\") : null;\n      if (card && card.parentElement !== track) card = null;\n      if (card && !icons.has(card)) card = null;\n      if (hoverCard !== card) { hoverCard = card; paintIcons(); }\n    });\n\n    \/* Im Line-up-Modus \u00fcbernehmen wir Play, \u00ab \u00bb und den SoundCloud-Link\n       des Players (auch Equalizer und Leertaste, die den Play-Knopf dr\u00fccken) *\/\n    w.addEventListener(\"click\", function (e) {\n      if (mode !== \"lineup\") return;\n      var t = e.target;\n      if (!t || !t.closest) return;\n      var ctl = t.closest(\".btpc-play, .btpc-prev, .btpc-next, .btpc-sc-link\");\n      if (!ctl || !ctl.closest(\".btpc-player\")) return;\n      e.stopPropagation();\n      if (e.stopImmediatePropagation) e.stopImmediatePropagation();\n      if (ctl.classList.contains(\"btpc-sc-link\")) {\n        if (linkUrl) ctl.setAttribute(\"href\", linkUrl);\n        return;\n      }\n      e.preventDefault();\n      if (ctl.classList.contains(\"btpc-play\")) toggle(\"player\");\n      else nav(ctl.classList.contains(\"btpc-prev\") ? -1 : 1);\n      requestAnimationFrame(function () { try { ctl.blur(); } catch (err) {} });\n    }, true);\n\n    if (\"IntersectionObserver\" in w) {\n      new IntersectionObserver(function (entries) {\n        entries.forEach(function (en) {\n          carouselVisible = en.isIntersecting && en.intersectionRatio > 0.12;\n        });\n      }, { threshold: [0, 0.12, 0.3, 0.6] }).observe(shell);\n    }\n\n    var ticking = false;\n    function onScroll() {\n      if (ticking) return;\n      ticking = true;\n      requestAnimationFrame(function () { ticking = false; updateFloat(); });\n    }\n    w.addEventListener(\"scroll\", onScroll, { passive: true });\n    w.addEventListener(\"resize\", onScroll);\n  }\n\n  \/* warten, bis das Carousel fertig ist *\/\n  function boot() {\n    var tries = 0;\n    (function wait() {\n      var t = d.querySelector(\"#musik .bt-lineup-track\");\n      if (t && t.getAttribute(\"data-built\") === \"1\" && w.BTLineup) { init(); return; }\n      if (++tries < 80) setTimeout(wait, 250);\n    })();\n  }\n  d.addEventListener(\"bt:lineup-ready\", function () { setTimeout(init, 0); });\n  if (d.readyState === \"loading\") d.addEventListener(\"DOMContentLoaded\", boot, { once: true });\n  else boot();\n})();\n<\/script>\n<!-- ENDE \u00b7 BT \u00b7 LINEUP SOUND \u00b7 V15 --><\/div><\/div>\r\n<div class=\"et_pb_code_20 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><!-- =========================================================\n     BAR TAUSEND \u00b7 MUSIK SCROLL \u00b7 V3\n     Klick auf den Musik-Player oder auf eine Act-Karte:\n     die Seite gleitet weich zum Ankerpunkt #musik.\n\n     EINBAU\n     Neues Code-Modul (z. B. \u201eCODE : MUSIK SCROLL\u201c) in die Musik-\n     Sektion legen, neben \u201eCODE : LINEUP SOUND\u201c. Inhalt komplett\n     einf\u00fcgen. Player, Sound, Carousel bleiben unver\u00e4ndert.\n     Modul deaktivieren = alles wie vorher.\n\n     WIE ES ARBEITET\n     - Klick auf den Player (nicht den schwebenden Mini-Player)\n       oder irgendwo auf eine Act-Karte (Foto, Text, Play, \u201e+\u201c):\n       die Seite gleitet weich zu #musik. Der Klick selbst macht\n       ganz normal weiter, was er soll.\n     - Steht die Musik-Sektion schon richtig, passiert nichts.\n     - Wischen\/Ziehen im Carousel l\u00f6st kein Scrollen aus.\n     - Scrollt man selbst (Mausrad, Touch), stoppt das Gleiten sofort.\n     - Englische Seite: hat die Sektion dort dieselbe ID \u201emusik\u201c,\n       l\u00e4uft alles gleich. Falls nicht, nimmt das Modul automatisch\n       die Sektion, in der das Line-up steht.\n     - \u201eWeniger Bewegung\u201c im System: springt ohne Animation.\n     - Divi-Builder: das Modul bleibt dort ruhig.\n\n     NEU IN V3\n     - von oben kommend: gleitet immer runter bis zur Kante #musik.\n     - schon im Musikbereich und weiter unten (z. B. zum Lesen\n       gescrollt): gleitet nur noch hoch, wenn die angeklickte Karte\n       danach komplett auf den Bildschirm passt. Auf kleineren\n       Bildschirmen bleibt die Seite also stehen und man liest\n       ungest\u00f6rt weiter. Gro\u00dfe Bildschirme: alles wie bisher.\n\n     NEU IN V2\n     - scrollt genau bis zur Oberkante von #musik (kein automatischer\n       Abstand f\u00fcr Kopfzeile oder scroll-margin mehr).\n\n     WICHTIG\n     Dieses Modul enth\u00e4lt absichtlich KEINEN Backslash.\n\n     STELLSCHRAUBEN (Script oben)\n     OFFSET        Abstand \u00fcber der Sektion in px (0 = genau an der\n                   Kante, + = Sektion sitzt tiefer, - = h\u00f6her)\n     MIN_WIDTH     erst ab dieser Bildschirmbreite aktiv (768 =\n                   wie der Player; 0 = auch auf dem Handy)\n     SCROLL_MAX_MS l\u00e4ngste Gleitdauer in ms\n========================================================= -->\n\n<script>\n(function () {\n  \"use strict\";\n\n  var d = document;\n  var w = window;\n\n  if (w.__btMusikScrollV3) return;\n  if (\/[?&]et_fb=1\/.test(location.search)) return;\n  if (d.body && d.body.classList.contains(\"et-fb\")) return;\n  w.__btMusikScrollV3 = true;\n\n  \/* ---------- Stellschrauben ---------- *\/\n  var OFFSET = 0;\n  var MIN_WIDTH = 768;\n  var SCROLL_MAX_MS = 1200;\n  var MOVE_TOLERANCE = 8;       \/* mehr Bewegung = Ziehen\/Wischen, kein Klick *\/\n\n  var raf = 0, stopFn = null;\n  var downX = 0, downY = 0, downOk = false;\n\n  function reduced() {\n    return !!(w.matchMedia && w.matchMedia(\"(prefers-reduced-motion: reduce)\").matches);\n  }\n  function wideEnough() {\n    return !MIN_WIDTH || !w.matchMedia || w.matchMedia(\"(min-width: \" + MIN_WIDTH + \"px)\").matches;\n  }\n\n  \/* Ziel: #musik, sonst die Sektion mit dem Line-up (z. B. englische Seite) *\/\n  function getTarget() {\n    var t = d.getElementById(\"musik\");\n    if (t) return t;\n    var shell = d.querySelector(\".bt-lineup-shell\");\n    return shell ? (shell.closest(\".et_pb_section\") || shell) : null;\n  }\n\n  function ease(t) {\n    return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) \/ 2;\n  }\n\n  function softScrollTo(target, from) {\n    if (!target) return;\n    if (stopFn) stopFn();\n\n    var root = d.documentElement;\n    var startY = w.pageYOffset;\n    var endY = Math.max(0, Math.round(target.getBoundingClientRect().top + startY - OFFSET));\n    var maxY = Math.max(0, root.scrollHeight - w.innerHeight);\n    endY = Math.min(endY, maxY);\n    var dist = endY - startY;\n\n    if (Math.abs(dist) < 4) return;   \/* steht schon richtig *\/\n\n    \/* nach oben nur, wenn das angeklickte Element (Karte bzw. Player)\n       danach komplett auf den Bildschirm passt \u2013 sonst stehen bleiben *\/\n    if (dist < 0 && from) {\n      var need = from.getBoundingClientRect().bottom - target.getBoundingClientRect().top + OFFSET;\n      if (need > w.innerHeight) return;\n    }\n\n    if (reduced()) {\n      w.scrollTo(0, endY);\n      return;\n    }\n\n    var duration = Math.min(SCROLL_MAX_MS, 500 + Math.abs(dist) * 0.45);\n    var prevBehavior = root.style.scrollBehavior;\n    var t0 = null;\n    root.style.scrollBehavior = \"auto\";\n\n    function stop() {\n      if (raf) cancelAnimationFrame(raf);\n      raf = 0;\n      root.style.scrollBehavior = prevBehavior;\n      w.removeEventListener(\"wheel\", stop);\n      w.removeEventListener(\"touchstart\", stop);\n      w.removeEventListener(\"keydown\", onKey);\n      stopFn = null;\n    }\n    function onKey(e) {\n      var k = e.key;\n      if (k === \"PageUp\" || k === \"PageDown\" || k === \"ArrowUp\" || k === \"ArrowDown\" || k === \"Home\" || k === \"End\") stop();\n    }\n    function step(now) {\n      if (t0 === null) t0 = now;\n      var p = Math.min(1, (now - t0) \/ duration);\n      w.scrollTo(0, startY + dist * ease(p));\n      if (p < 1) raf = requestAnimationFrame(step);\n      else stop();\n    }\n\n    \/* selbst scrollen = Gleiten sofort freigeben *\/\n    w.addEventListener(\"wheel\", stop, { passive: true });\n    w.addEventListener(\"touchstart\", stop, { passive: true });\n    w.addEventListener(\"keydown\", onKey);\n\n    stopFn = stop;\n    raf = requestAnimationFrame(step);\n  }\n\n  \/* Klickfl\u00e4che: gro\u00dfer Player oder eine Act-Karte *\/\n  function isTrigger(el) {\n    if (!el || !el.closest) return false;\n    if (el.closest(\"#btpc-floating-host, #btpc-floating-player\")) return false;\n    if (el.closest(\"#bt-player-compact\")) return true;\n    var card = el.closest(\".lineup-row\");\n    return !!(card && card.closest(\".bt-lineup-shell\"));\n  }\n\n  \/* Wir h\u00f6ren auf das Loslassen (vor dem eigentlichen Klick) und starten\n     das Gleiten erst im n\u00e4chsten Bild: der Klick selbst bleibt unber\u00fchrt,\n     und andere Module, die Klicks abfangen, st\u00f6ren nicht *\/\n  w.addEventListener(\"pointerdown\", function (e) {\n    downOk = e.isPrimary !== false && (e.button === 0 || e.button === undefined) && isTrigger(e.target);\n    downX = e.clientX;\n    downY = e.clientY;\n  }, true);\n\n  w.addEventListener(\"pointerup\", function (e) {\n    if (!downOk) return;\n    downOk = false;\n    if (Math.abs(e.clientX - downX) > MOVE_TOLERANCE || Math.abs(e.clientY - downY) > MOVE_TOLERANCE) return;\n    if (!isTrigger(e.target) || !wideEnough()) return;\n    var target = getTarget();\n    if (!target) return;\n    var from = e.target.closest(\".lineup-row\") || e.target.closest(\"#bt-player-compact\");\n    requestAnimationFrame(function () { softScrollTo(target, from); });\n  }, true);\n\n  w.addEventListener(\"pointercancel\", function () { downOk = false; }, true);\n})();\n<\/script>\n<!-- ENDE \u00b7 BT \u00b7 MUSIK SCROLL \u00b7 V3 --><\/div><\/div>\r\n<div class=\"et_pb_code_21 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><!-- =========================================================\n     BAR TAUSEND \u00b7 LINEUP SOFT SCROLL \u00b7 V1\n     Weiches Scrollen im Text der ge\u00f6ffneten Line-up-Karte\n\n     EINBAU\n     Ein neues Code-Modul \u201eCODE : LINEUP SOFT SCROLL\u201c in die Zeile\n     \u201eCarousel-Container\u201c legen (z. B. unter das Carousel) und\n     diesen Code komplett einf\u00fcgen. Sonst nichts \u00e4ndern.\n     Carousel, Player und Line-up Sound bleiben unver\u00e4ndert.\n     Modul deaktivieren = Scrollen wieder wie vorher.\n\n     WAS DAS MODUL MACHT\n     - Desktop (Maus): Scrollen im Text der offenen Karte gleitet\n       weich an und l\u00e4uft sanft aus, statt in harten Spr\u00fcngen.\n       Mehrere Rasten am Mausrad flie\u00dfen ineinander.\n     - Trackpad: folgt den Fingern direkt, nur leicht gegl\u00e4ttet\n       (das Trackpad hat schon eigenen Schwung).\n     - Pfeiltasten, Bild auf\/ab, Pos1\/Ende im Textfeld gleiten\n       genauso weich.\n     - Ziehen an den vier Punkten (Scroll-Hinweis) \u00fcbernimmt sofort,\n       nichts k\u00e4mpft gegeneinander.\n     - Waagerechtes Wischen bleibt beim Carousel.\n     - Handy und iPad (Finger): unver\u00e4ndert, dort scrollt das\n       Ger\u00e4t selbst weich.\n     - weniger Bewegung (Systemeinstellung): normales Scrollen.\n\n     WICHTIG\n     Dieses Modul enth\u00e4lt absichtlich KEINEN Backslash.\n     Divi verdoppelt Backslashes bei jedem Speichern.\n\n     STELLSCHRAUBEN (oben im Script)\n     GLIDE_MS   Ausgleiten beim Mausrad (gr\u00f6\u00dfer = weicher und l\u00e4nger)\n     PAD_MS     Gl\u00e4ttung beim Trackpad (kleiner = direkter)\n     STEP       Weg pro Mausrad-Raste (1 = wie bisher, 1.2 = etwas weiter)\n     KEY_STEP   Weg pro Pfeiltaste (Anteil der Feldh\u00f6he)\n========================================================= -->\n\n<style>\n\/* eigene Gleitbewegung: kein zus\u00e4tzliches Browser-Smooth-Scroll im Textfeld *\/\n#musik #bt-lu-track > .et_pb_row.lineup-row.is-drawer > .et_pb_column:nth-child(2) > .et_pb_text{\n  scroll-behavior: auto !important;\n}\n<\/style>\n\n<script>\n(function () {\n  \"use strict\";\n\n  var d = document;\n  var w = window;\n\n  if (w.__btLuSoftScrollV1) return;\n  if (\/[?&]et_fb=1\/.test(location.search)) return;\n  if (d.body && d.body.classList.contains(\"et-fb\")) return;\n  w.__btLuSoftScrollV1 = true;\n\n  \/* ---------- Stellschrauben ---------- *\/\n  var GLIDE_MS = 140;\n  var PAD_MS = 60;\n  var STEP = 1;\n  var KEY_STEP = 0.14;\n  var LINE_PX = 30;\n\n  var SEL = \".lineup-row.is-drawer.is-open.has-scroll > .et_pb_column:nth-child(2) > .et_pb_text\";\n  var fine = w.matchMedia(\"(hover: hover) and (pointer: fine)\");\n  var reduce = w.matchMedia(\"(prefers-reduced-motion: reduce)\");\n\n  var el = null;      \/* Textfeld, das gerade gleitet *\/\n  var pos = 0;        \/* aktuelle Position (genau) *\/\n  var goal = 0;       \/* Ziel *\/\n  var last = 0;       \/* zuletzt selbst gesetzter Wert *\/\n  var tau = GLIDE_MS;\n  var frame = 0, prevT = 0;\n\n  function maxOf(m) { return Math.max(0, m.scrollHeight - m.clientHeight); }\n  function stop() {\n    if (frame) cancelAnimationFrame(frame);\n    frame = 0;\n    el = null;\n  }\n\n  function step(now) {\n    frame = 0;\n    if (!el || !el.isConnected || !el.matches(SEL)) { stop(); return; }\n    \/* fremde \u00c4nderung (Ziehen an den Punkten, Karte schlie\u00dft): sofort \u00fcbergeben *\/\n    if (Math.abs(el.scrollTop - last) > 2) { stop(); return; }\n    var dt = Math.min(64, Math.max(1, now - prevT));\n    prevT = now;\n    \/* weich auslaufend: jeder Frame legt einen festen Anteil des Restwegs zur\u00fcck *\/\n    pos += (goal - pos) * (1 - Math.exp(-dt \/ tau));\n    if (Math.abs(goal - pos) < 0.4) pos = goal;\n    el.scrollTop = pos;\n    last = el.scrollTop;\n    if (pos !== goal) frame = requestAnimationFrame(step);\n    else el = null;\n  }\n\n  function glide(m, delta) {\n    if (el !== m || !frame) {\n      if (frame) cancelAnimationFrame(frame);\n      el = m;\n      pos = goal = last = m.scrollTop;\n      prevT = performance.now();\n    }\n    goal = Math.max(0, Math.min(maxOf(m), goal + delta));\n    if (!frame) frame = requestAnimationFrame(step);\n  }\n\n  function active() { return fine.matches && !reduce.matches; }\n\n  function onWheel(e) {\n    if (!active() || e.ctrlKey || e.defaultPrevented) return;\n    var m = e.target && e.target.closest ? e.target.closest(SEL) : null;\n    if (!m) return;\n    var dy = e.deltaY, dx = e.deltaX;\n    \/* waagerecht geh\u00f6rt dem Carousel *\/\n    if (Math.abs(dx) > Math.abs(dy) || !dy) return;\n    if (e.deltaMode === 1) dy *= LINE_PX;\n    else if (e.deltaMode === 2) dy *= m.clientHeight * 0.85;\n    \/* At a text boundary, let the browser continue scrolling the page. *\/\n    var limit = maxOf(m);\n    if ((dy > 0 && m.scrollTop >= limit - 1) || (dy < 0 && m.scrollTop <= 1)) {\n      if (el === m) stop();\n      e.preventDefault();\n      e.stopPropagation();\n      w.scrollBy({ top: dy, left: 0, behavior: \"auto\" });\n      return;\n    }\n    e.preventDefault();\n    \/* Mausrad: Rasten in Zeilen, gro\u00dfe Spr\u00fcnge oder 120er-Schritte.\n       Sonst Trackpad: viele kleine Werte, eigener Schwung. *\/\n    var wd = typeof e.wheelDeltaY === \"number\" ? e.wheelDeltaY : 0;\n    var mouse = e.deltaMode !== 0 || Math.abs(dy) >= 50 || (wd !== 0 && wd % 120 === 0);\n    tau = mouse ? GLIDE_MS : PAD_MS;\n    glide(m, mouse ? dy * STEP : dy);\n  }\n\n  function onKey(e) {\n    if (!active() || e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) return;\n    var m = e.target;\n    if (!m || !m.matches || !m.matches(SEL)) return;\n    var h = m.clientHeight, dy = 0;\n    switch (e.key) {\n      case \"ArrowDown\": dy = h * KEY_STEP; break;\n      case \"ArrowUp\": dy = -h * KEY_STEP; break;\n      case \"PageDown\": dy = h * 0.85; break;\n      case \"PageUp\": dy = -h * 0.85; break;\n      case \"End\": dy = maxOf(m) + h; break;\n      case \"Home\": dy = -(maxOf(m) + h); break;\n      default: return;\n    }\n    e.preventDefault();\n    tau = GLIDE_MS;\n    glide(m, dy);\n  }\n\n  \/* nur am Line-up lauschen, nicht an der ganzen Seite *\/\n  var bound = false;\n  function attach() {\n    if (bound) return true;\n    var t = d.querySelector(\"#musik .bt-lineup-track\");\n    if (!t) return false;\n    bound = true;\n    \/* Only an open scrollable text field may block wheel events, never the carousel. *\/\n    var wheelTarget = null;\n    function syncWheelTarget() {\n      var next = t.querySelector(SEL);\n      if (next === wheelTarget) return;\n      if (wheelTarget) {\n        wheelTarget.removeEventListener(\"wheel\", onWheel, true);\n        stop();\n      }\n      wheelTarget = next;\n      if (wheelTarget) wheelTarget.addEventListener(\"wheel\", onWheel, { capture: true, passive: false });\n    }\n    syncWheelTarget();\n    if (\"MutationObserver\" in w) {\n      new MutationObserver(function (records) {\n        if (records.some(function (record) {\n          return record.target.matches && record.target.matches(\".lineup-row\");\n        })) syncWheelTarget();\n      }).observe(t, { subtree: true, attributes: true, attributeFilter: [\"class\"] });\n    }\n    t.addEventListener(\"keydown\", onKey, true);\n    w.addEventListener(\"blur\", stop);\n    w.addEventListener(\"pagehide\", stop);\n    return true;\n  }\n  function boot() {\n    var tries = 0;\n    (function wait() {\n      if (attach()) return;\n      if (++tries < 80) setTimeout(wait, 250);\n    })();\n  }\n  d.addEventListener(\"bt:lineup-ready\", attach);\n  if (d.readyState === \"loading\") d.addEventListener(\"DOMContentLoaded\", boot, { once: true });\n  else boot();\n})();\n<\/script>\n<!-- ENDE \u00b7 BT \u00b7 LINEUP SOFT SCROLL \u00b7 V1 --><\/div><\/div>\r\n<div class=\"et_pb_code_22 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><!-- =========================================================\n     BAR TAUSEND \u00b7 LINEUP \u00b7 KARTENF\u00c4CHER V3.13  (Lineupcarousel 3.0, Intro Regalreihe \u2192 Act \u2192 Einsortieren)\n\n     NUR F\u00dcR ENTWURF 9522 UND CANTINA V3 9606\n     Das Modul arbeitet ausschlie\u00dflich auf Seiten mit der Body-Klasse\n     page-id-9522 oder page-id-9606 (PAGE_IDS oben im Script). Auf\n     jeder anderen Seite macht es nichts (Startseite 8542 bleibt\n     unber\u00fchrt). F\u00fcr 9606 nur das Modul unver\u00e4ndert \u00fcbernehmen.\n\n     EINBAU\n     Eigenes Code-Modul \u201eCODE : LINEUP KARTENF\u00c4CHER\u201c in der Zeile\n     \u201eCarousel-Container\u201c (unter \u201eCODE : LINEUP SOFT SCROLL\u201c).\n     Carousel V26, Live-Schaltung, Lineup Sound, Musik Scroll und\n     Soft Scroll bleiben unver\u00e4ndert und arbeiten wie bisher\n     (Sortierung, aktueller Act, Datumslogik, \u00d6ffnen, Pfeile,\n     Tastatur, Play-Symbol).\n     Modul deaktivieren oder l\u00f6schen = Carousel wieder wie V26.\n\n     WAS DAS MODUL MACHT  (V3.13, Sasha 19.10.2026 18:59 \/ 19:34 \/ 20:25)\n     - EINSTIEG (einmal pro Seitenaufruf), eine durchgehende Bewegung:\n       A \u00b7 die Line-up-Karten fahren als GERADE Reihe herein (wie Platten\n           im Regal: aufrecht, parallel, gleiche Grundlinie, keine\n           Drehung) und breiten sich horizontal zu gro\u00dfen Karten aus,\n       B \u00b7 die aktuelle Act-Karte gleitet aus ihrer Position in dieser\n           Reihe nach vorn und wird deutlich gr\u00f6\u00dfer,\n       C \u00b7 sie gleitet an ihren Carouselplatz zur\u00fcck, alle anderen\n           Karten sortieren sich gleichzeitig weich ein.\n       Die vorhandene Datumslogik bestimmt den aktuellen Act.\n       Eingaben oder Weiterscrollen beenden den Einstieg weich (alle\n       Karten gleiten in 0,5 s an ihren Platz, kein Sprung, keine\n       Scrollsperre); reduzierte Bewegung\n       zeigt direkt das normale Carousel. Start erst, wenn die Seite\n       ruhig steht; jede am Ende sichtbare Karte hat eine Kopie, die\n       genau auf dem Original landet (kein Sprung, kein Neustart).\n     - GR\u00d6SSE (ab 768 px Breite): das LINE-UP-CAROUSEL ALLEIN (Karten\n       + Z\u00e4hler) ist fast eine Bildschirmh\u00f6he hoch; MUSIC-Logo, Player\n       und Archiv kommen dar\u00fcber dazu (Sektion darf h\u00f6her sein).\n       Kartenzahl wie im Carousel; nur wenn Karten schmaler als\n       CARD_MIN_W w\u00fcrden, eine Karte weniger (gro\u00dfe Karten).\n     - FOTOS: 3 \/ 2 (IMG_RATIO, H\u00f6he = 2\/3 der Breite),\n       Ausschnitt 50 % 35 %, nicht verzerrt; nur bei sehr niedrigem\n       Fenster etwas flacher (h\u00f6chstens IMG_FLAT).\n     - VORSCHAUTEXT: wie Carousel V26 h\u00f6chstens 10 ganze Zeilen\n       (Handy 11), endet mit \u201e\u2026\u201c, Plus \u00f6ffnet die vollst\u00e4ndigen Details.\n       Nur wenn die H\u00f6he nicht reicht, weniger ganze Zeilen.\n     - NAMEN: in geschlossenen Karten h\u00f6chstens ZWEI Zeilen; lange Namen\n       werden behutsam verkleinert, bis sie in zwei Zeilen passen\n       (nie abgeschnitten, keine Ellipse). Offene Karte wie V26.\n     - KARTENHINTERGRUND: schwarz, leicht transparent mit Blur\n       (ohne Blur-Unterst\u00fctzung: fast deckend schwarz).\n     - BL\u00c4TTERN: ruhige horizontale Bewegung ohne 3D-Kippen.\n     - Z\u00c4HLER: unter den Karten dezent rechts, nur Anzeige.\n     - Offene Karte (Details), Pfeile, Plus, Escape, Sound, DE\/EN:\n       unver\u00e4ndert wie Carousel V26.\n     - Weniger Bewegung (Systemeinstellung): kein Einstieg.\n     - kein Scroll-Hijacking: die Seite scrollt ganz normal.\n     - V3.12: Foto 3 \/ 2 und Ausschnitt setzen sich gegen \u00e4ltere\n       Seitenregeln durch; weniger Messrunden (Namen gemerkt, volle\n       Neuberechnung nur bei Breiten\u00e4nderung, keine beim Introstart).\n     - V3.13: Einstieg ruhiger (Sasha 20:25): Reihe gleitet langsamer\n       herein, die gro\u00dfe Act-Karte steht nach dem Vergr\u00f6\u00dfern 2,8 s\n       still, danach ruhiges Einsortieren (gesamt etwa 8 s).\n       Kartenhintergrund deckender: .78 statt .62 (ohne Blur .95 statt .9).\n\n     WICHTIG\n     Dieses Modul enth\u00e4lt absichtlich KEINEN Backslash.\n     Divi verdoppelt Backslashes bei jedem Speichern.\n\n     STELLSCHRAUBEN (Script oben)\n     CARD_MIN_W     schmalste Karte in px, sonst eine Karte weniger\n     IMG_RATIO      Fotoformat Breite\/H\u00f6he (1.5 = 3 \/ 2)\n     IMG_FLAT       flachstes Foto bei sehr niedrigem Fenster\n     TEXT_MIN       so viele Vorschauzeilen mindestens (sonst Foto flacher)\n     LINES_MAX      so viele Vorschauzeilen h\u00f6chstens (V26: 10)\n     NAME_LINES     Titelzeilen h\u00f6chstens (2)\n     NAME_MIN       kleinste Titelgr\u00f6\u00dfe (Anteil, 0.6)\n     CAROUSEL_AIR   Luft zwischen Carousel und Bildschirmh\u00f6he\n     LOGO_GAP       Luft unter dem MUSIC-Logo f\u00fcr die gro\u00dfe Karte\n     BOTTOM_GAP     Luft zum Bildschirmboden f\u00fcr die gro\u00dfe Karte\n     (Einstieg-Tempo: IN_MS, IN_STAGGER, FAN_STAY, LIFT, BIG_STAY,\n     SETTLE in der Funktion play)\n========================================================= -->\n\n<style>\n\/* =========================================================\n   1 \u00b7 GRUNDLAGE (nur 9522\/9606, nur wenn das Modul l\u00e4uft)\n   ========================================================= *\/\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell.bt-fan{\n  --fan-pink: #ea0b5f;\n  --fan-persp: 1500px;\n}\n@media(min-width:768px){\n:is(body.page-id-9522, body.page-id-9606) #musik .et_pb_row.bt-lineup-shell.bt-fan{\n  --bt-text-lines: 13;\n  --bt-name-pad: 16px 16px 14px;\n  --bt-text-pad: 18px 22px 70px;\n}\n}\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell.bt-fan .bt-lineup-track > .et_pb_row.lineup-row{\n  \/* Kartenhintergrund wandert in eine eigene Ebene, damit er beim\n     Kippen und beim Einstieg mit der Karte mitgeht *\/\n  background: transparent !important;\n  perspective: var(--fan-persp);\n  perspective-origin: 50% 45%;\n}\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell.bt-fan .bt-lineup-track > .et_pb_row.lineup-row > *{\n  transform-origin: 0 50% 0;\n}\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell.bt-fan .bt-fan-face{\n  position: absolute;\n  inset: 0;\n  z-index: -1;\n  border-radius: inherit;\n  \/* V3.10: schwarz, leicht transparent mit Blur (Fallback unten);\n     V3.13 (Sasha 20:26): deckender, vorher .62 *\/\n  \/* Solid dark card surface avoids 35 live backdrop-filter surfaces while scrolling. *\/\n  background: rgba(0,0,0,.96);\n  -webkit-backdrop-filter: none;\n          backdrop-filter: none;\n  pointer-events: none;\n}\n@supports not ((backdrop-filter: blur(2px)) or (-webkit-backdrop-filter: blur(2px))){\n  :is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell.bt-fan .bt-fan-face{\n    background: rgba(0,0,0,.95);\n  }\n}\n\/* V3.11: lange K\u00fcnstlernamen in geschlossenen Karten ganz lesbar in\n   h\u00f6chstens zwei Zeilen; die Gr\u00f6\u00dfe (--bt-fan-name) setzt das Script *\/\n@media(min-width:768px){\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell.bt-fan .bt-lineup-track > .et_pb_row.lineup-row h2{\n  --bt-name-scale: var(--bt-fan-name, 1) !important;\n  white-space: normal !important;\n  overflow: visible !important;\n  padding-top: 0 !important;\n  line-height: 1.02 !important;\n  -webkit-mask-image: none !important;\n          mask-image: none !important;\n}\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell.bt-fan .bt-lineup-track > .et_pb_row.lineup-row h2 > .bt-lu-name{\n  display: inline !important;\n  white-space: normal !important;\n  transform: none !important;\n  translate: 0 0;\n  transition: opacity .32s ease, translate .32s cubic-bezier(.22,1,.36,1) !important;\n}\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell.bt-fan .bt-lineup-track > .et_pb_row.lineup-row h2.bt-now-host > .bt-lu-name{display:block!important;}\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell.bt-fan .bt-lineup-track > .et_pb_row.lineup-row h2.bt-now-host.bt-fx-fade > .bt-lu-name{\n  translate: 0 -4px !important;\n}\n}\n\n\/* Press headings stay readable before Divi's late viewport trigger. *\/\nhtml body.page-id-9606 #presse-fox .et_pb_row > .et_pb_column:first-child .et_pb_text{animation:none!important;opacity:1!important;transform:none!important;visibility:visible!important;}\n\n\/* Das Carousel selbst bekommt fast die volle Bildschirmh\u00f6he.\n   Details und die separate Intro-Kopie behalten ihre eigene Geometrie. *\/\n@media(min-width:768px){\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell.bt-fan .bt-lineup-track:not(.bt-fan-stage) > .et_pb_row.lineup-row:not(.is-drawer):not(.is-open){\n  min-height: var(--bt-card-min-h, 0px) !important;\n}\n}\n\n\/* Einstieg: echte Karten bleiben im Layout; animiert werden ganze Kopien. *\/\n:is(body.page-id-9522,body.page-id-9606) #musik .bt-lineup-shell.bt-fan-run .bt-lineup-track:not(.bt-fan-stage) > .lineup-row,\n:is(body.page-id-9522,body.page-id-9606) #musik .bt-lineup-shell.bt-fan-run .bt-lineup-track:not(.bt-fan-stage) > .lineup-row *{visibility:hidden!important}\n:is(body.page-id-9522,body.page-id-9606) #musik .bt-lineup-shell .bt-fan-stage > .lineup-row{perspective:none!important;will-change:transform}\n\n\/* Divi-Einflug der Karteninhalte \u00fcbernimmt hier der Einstieg *\/\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell.bt-fan .bt-lineup-track .et_animated{\n  opacity: 1 !important;\n  animation: none !important;\n}\n\/* w\u00e4hrend das Carousel misst: alles gerade (saubere Ma\u00dfe);\n   nicht w\u00e4hrend des Einstiegs (sonst springen die Karten) *\/\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell.bt-fan.bt-lu-measuring:not(.bt-fan-run) .bt-lineup-track > .et_pb_row.lineup-row:not(.is-drawer) > *{\n  transform: none !important;\n}\n\n\/* Fr\u00fche Originalkarten bleiben unsichtbar; Geometrie und B\u00fchnenkopien bleiben erhalten. *\/\n:is(body.page-id-9522,body.page-id-9606) #musik .bt-lineup-shell.bt-fan-pending .bt-lineup-track:not(.bt-fan-stage) > .et_pb_row.lineup-row > *{opacity:0!important;animation:none!important}\n\/* bereit zum Einstieg: Karten kurz unsichtbar (Sicherheitsnetz: nach 4 s sichtbar) *\/\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell.bt-fan.bt-fan-pre .bt-lineup-track > .et_pb_row.lineup-row > *{\n  opacity: 0;\n  animation: btFanSafe .01s linear 4s forwards;\n}\n@keyframes btFanSafe{ to{ opacity: 1; } }\n\n\/* =========================================================\n   1b \u00b7 FOTOS (wie Cantina V3 9606, Sasha\/Rob 18.10. 23:26)\n   Grundformat quadratisch, Ausschnitt etwas oberhalb der Mitte\n   (K\u00f6pfe bleiben drin), Hoverzoom dezent 1.06 (Sasha 19.10. 00:30).\n   V3.11 (Sasha 19.10. 18:59): 3 \/ 2 (H\u00f6he 2\/3 der Breite), Ausschnitt\n   per object-fit; das Token liest auch Carousel V26.\n   V3.12: \u00e4ltere Seitenregeln (z. B. 1 \/ 1 und center in Abschnitt 18\n   oder in der Carousel-Basis) gewinnen je nach Ladereihenfolge; hier\n   daher mit doppelter ID und !important (ein Fenster-Notfallwert des\n   Scripts steht inline und bleibt st\u00e4rker).\n   ========================================================= *\/\n:is(body.page-id-9522, body.page-id-9606) #musik#musik .et_pb_row.bt-lineup-shell{\n  --bt-img-ratio: 3 \/ 2 !important;\n}\n:is(body.page-id-9522, body.page-id-9606) #musik#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row:not(.is-drawer) > .et_pb_column:nth-child(3) img{\n  object-position: var(--bt-img-x, 50%) 35% !important;\n  object-fit: cover !important;\n}\n@media (hover: hover) and (pointer: fine){\n  :is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row:hover > .et_pb_column:nth-child(3) img{\n    transform: scale(1.06);\n  }\n}\n\n\/* =========================================================\n   2 \u00b7 EINSTIEG: gro\u00dfe Act-Karte + pinke Linie\n   ========================================================= *\/\n\/* B\u00fchne \u00fcber dem Track: tr\u00e4gt nur die gro\u00dfe Kopie der aktuellen Karte *\/\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell .bt-lineup-track.bt-fan-stage{\n  position: absolute !important;\n  inset: 0 !important;\n  display: block !important;\n  width: auto !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  overflow: visible !important;\n  opacity: 1 !important;\n  animation: none !important;\n  transition: none !important;\n  pointer-events: none !important;\n  background: transparent !important;\n  box-shadow: none !important;\n  z-index: 8;\n}\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell .bt-fan-stage > .et_pb_row.lineup-row{\n  \/* Match the resting cards: no extra intro shadow or background panel. *\/\n  box-shadow: none;\n}\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell .bt-lineup-track.bt-fan-stage > .et_pb_row.lineup-row{\n  position: absolute !important;\n  margin: 0 !important;\n  transform-origin: 0 0;\n}\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell .bt-lineup-track.bt-fan-stage img{\n  transition: none !important;\n  transform: none !important;\n}\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell .bt-fan-sweep{\n  position: absolute;\n  height: 1px;\n  z-index: 7;\n  pointer-events: none;\n  background: linear-gradient(90deg, rgba(234,11,95,0), var(--fan-pink) 18%, var(--fan-pink) 82%, rgba(234,11,95,0));\n  box-shadow: 0 0 12px rgba(234,11,95,.55);\n  transform-origin: 50% 50%;\n  transform: scaleX(0);\n  opacity: 0;\n}\n\n\/* =========================================================\n   3 \u00b7 Z\u00c4HLER (dezent, nur Anzeige)\n   ========================================================= *\/\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell .bt-fan-rail{\n  position: absolute;\n  left: var(--bt-side, 48px);\n  right: var(--bt-side, 48px);\n  bottom: 2px;\n  height: 26px;\n  z-index: 6;\n  display: flex;\n  align-items: center;\n  justify-content: flex-end;\n  opacity: 0;\n  transition: opacity .9s ease .2s;\n  pointer-events: none;\n}\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell.bt-fan-built .bt-fan-rail{ opacity: 1; }\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell .bt-fan-count{\n  flex: 0 0 auto;\n  font-family: \"Poppins\", sans-serif;\n  font-size: 11px;\n  font-weight: 500;\n  letter-spacing: .18em;\n  line-height: 1;\n  color: rgba(243,239,230,.55);\n  font-variant-numeric: tabular-nums;\n  white-space: nowrap;\n  user-select: none;\n  -webkit-user-select: none;\n}\n:is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell .bt-fan-count b{\n  font-weight: 500;\n  color: rgba(243,239,230,.92);\n}\n@media (max-width: 980px){\n  :is(body.page-id-9522, body.page-id-9606) #musik .et_pb_row.bt-lineup-shell.bt-fan{ padding-bottom: 6px !important; }\n  :is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell .bt-fan-rail{ left: 24px; right: 24px; }\n}\n@media (max-width: 767px){\n  :is(body.page-id-9522, body.page-id-9606) #musik .et_pb_row.bt-lineup-shell.bt-fan{ padding-bottom: 6px !important; }\n  :is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell .bt-fan-rail{ left: 16px; right: 16px; bottom: 8px; }\n}\n\n\/* =========================================================\n   4 \u00b7 WENIGER BEWEGUNG\n   ========================================================= *\/\n@media (prefers-reduced-motion: reduce){\n  :is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row:not(.is-drawer) > *{\n    transform: none !important;\n  }\n  :is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell .bt-fan-rail{\n    transition: none !important;\n    animation: none !important;\n  }\n  :is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell .bt-fan-sweep,\n  :is(body.page-id-9522, body.page-id-9606) #musik .bt-lineup-shell .bt-fan-stage{ display: none !important; }\n}\nbody.et-fb #musik .bt-fan-rail,\nbody.et-fb #musik .bt-fan-sweep,\nbody.et-fb #musik .bt-fan-stage{ display: none !important; }\n\n\/* V3.14: shared header rows, fixed two-line name area and stable photo crop. *\/\n@media(min-width:768px){\nbody.page-id-9606 #musik .bt-lineup-shell.bt-fan .lineup-row > .et_pb_column:first-child h4{min-height:var(--bt-mobile-category-h,0px)!important;box-sizing:border-box}\nbody.page-id-9606 #musik .bt-lineup-shell.bt-fan .lineup-row > .et_pb_column:first-child h3{min-height:var(--bt-mobile-date-h,0px)!important;box-sizing:border-box}\nbody.page-id-9606 #musik .bt-lineup-shell.bt-fan .lineup-row:not(.is-drawer) > .et_pb_column:first-child h2{min-height:var(--bt-mobile-name-h,0px)!important;box-sizing:border-box}\n}\nbody.page-id-9606 #musik#musik .bt-lineup-shell .bt-lineup-track > .lineup-row > .et_pb_column:nth-child(3) img{object-position:var(--bt-img-x,50%) 35%!important}\nbody.page-id-9606 #musik .bt-lineup-shell .bt-fan-stage .bt-fan-face{background:rgba(0,0,0,.78);backdrop-filter:none;-webkit-backdrop-filter:none}\n\n@media(max-width:767px){body.page-id-9606 #musik .et_pb_row.bt-lineup-shell.bt-fan{--bt-text-lines:14;--bt-text-pad:28px 12px 81px;}}\n\n\/* Keep the sound control still while a card changes its layout. *\/\n@media(min-width:768px){\nbody.page-id-9606 #musik .bt-lineup-shell .bt-lsb-play{\n translate:none!important;\n transition:opacity .4s ease,background-color .5s ease,border-color .5s ease,color .5s ease!important;\n}\nbody.page-id-9606 #musik .bt-lineup-shell .lineup-row.bt-lu-changing .bt-lsb-play{\n opacity:0!important;pointer-events:none!important;transition:opacity .18s ease!important;\n}\nbody.page-id-9606 #musik#musik .bt-lineup-shell .bt-lineup-track > .et_pb_row.lineup-row.is-drawer > .et_pb_column:nth-child(2) > .et_pb_text{\n padding-left:16px!important;padding-right:calc(16px + var(--bt-gap))!important;\n}\n}\n@media(prefers-reduced-motion:reduce){\nbody.page-id-9606 #musik .bt-lineup-shell .bt-lsb-play{transition:none!important;}\n}\n\n<\/style>\n\n<script consent-skip-blocker=\"1\">\n\/* =========================================================\n   BT \u00b7 LINEUP \u00b7 KARTENF\u00c4CHER V3 \u2014 Logik\n   ========================================================= *\/\n(function () {\n  \"use strict\";\n\n  var d = document;\n  var w = window;\n\n  var PAGE_IDS = [\"9522\", \"9606\"];\n  var FOLD_DEG = 34;\n  var FOLD_DEG_PH = 30;\n  var FOLD_Z = 90;\n  var TILT_MAX = 6;\n  var FAN_IN = 700;\n  var FAN_STAGGER = 85;\n  var FAN_HOLD = 250;\n  var LIFT_MS = 750;\n  var BIG_HOLD = 800;\n  var SETTLE_MS = 1100;\n  var CARD_MIN_W = 280;   \/* schmalste Karte (sonst eine Karte weniger) *\/\n  var IMG_RATIO = 1.5;    \/* Foto Breite\/H\u00f6he = 3 \/ 2 (wie CSS --bt-img-ratio) *\/\n  var IMG_FLAT = 1.8;     \/* flachstes Foto bei sehr niedrigem Fenster *\/\n  var TEXT_MIN = 4;       \/* so viele Vorschauzeilen mindestens *\/\n  var LINES_MAX = 13;     \/* so viele Vorschauzeilen h\u00f6chstens (wie V26) *\/\n  var NAME_LINES = 2;     \/* Titel in geschlossenen Karten: h\u00f6chstens 2 Zeilen *\/\n  var NAME_MIN = 0.6;     \/* kleinste Titelgr\u00f6\u00dfe (Anteil der normalen Gr\u00f6\u00dfe) *\/\n  var CAROUSEL_AIR = 16;  \/* Luft: Carousel = Bildschirmh\u00f6he minus das *\/\n  var TEXT_EXTRA = 8;     \/* Absatzabstand oben im Vorschautext + Sicherheit *\/\n  var LOGO_GAP = 20;\n  var BOTTOM_GAP = 12;\n  var FAN_GROW = 1.22;\n  var SAFE_PAD = 12;\n\n  if (w.__btLineupFanV3) return;\n  if (\/[?&]et_fb=1\/.test(location.search)) return;\n  if (!d.body || d.body.classList.contains(\"et-fb\")) return;\n  if (!PAGE_IDS.some(function (id) { return d.body.classList.contains(\"page-id-\" + id); })) return;\n  w.__btLineupFanV3 = true;\n\n  var script = d.currentScript;\n  var shell = (script && script.closest(\".et_pb_row.bt-lineup-shell\")) ||\n              d.querySelector(\"#musik .et_pb_row.bt-lineup-shell\");\n  if (!shell) return;\n  var track = shell.querySelector(\".bt-lineup-track\");\n  if (!track) return;\n\n  var mqReduce = w.matchMedia(\"(prefers-reduced-motion: reduce)\");\n  var mqPhone = w.matchMedia(\"(max-width: 767px)\");\n  var mqTall = w.matchMedia(\"(min-width: 768px)\");\n  function reduced() { return mqReduce.matches; }\n  \/* P1 mobile native carousel: no intro or geometry observers. *\/\n  if (w.matchMedia('(max-width: 980px), (hover: none) and (pointer: coarse)').matches) {\n    shell.classList.remove('bt-fan-pending','bt-fan-pre','bt-fan-run');\n    shell.classList.add('bt-fan-built','bt-fan-mobile-native');\n    return;\n  }\n  \/* Vor dem ersten Kartenaufbau verbergen, bis die vorhandene Introsequenz \u00fcbernimmt. *\/\n  var bootPrepared = false;\n  if (!reduced() && (\"IntersectionObserver\" in w) && typeof track.animate === \"function\") {\n    shell.classList.add(\"bt-fan-pending\");\n    setTimeout(function () {\n      if (bootPrepared) return;\n      \/* Stay reserved until the first near-view layout; reveal safely only if layout already completed. *\/\n      if (!shell.classList.contains(\"bt-lu-ready\")) return;\n      finishBuild();\n    }, 4000);\n  }\n  function isCard(n) { return !!(n && n.nodeType === 1 && n.classList.contains(\"lineup-row\")); }\n  function cards() { return Array.prototype.filter.call(track.children, isCard); }\n  function clamp(v, a, b) { return v < a ? a : (v > b ? b : v); }\n  function pad2(n) { return n < 10 ? \"0\" + n : String(n); }\n  function startIndex() { return parseInt(shell.getAttribute(\"data-bt-start-index\") || \"0\", 10) || 0; }\n\n  \/* =======================================================\n     A \u00b7 KARTEN AUSSTATTEN (Hintergrundebene)\n     ======================================================= *\/\n  var info = new WeakMap();\n  function dataOf(card) {\n    var o = info.get(card);\n    if (!o) { o = { el: card, L: 0, W: 0, tilt: 0, set: false }; info.set(card, o); }\n    return o;\n  }\n  function decorate(card) {\n    if (!card.querySelector(\":scope > .bt-fan-face\")) {\n      var face = d.createElement(\"span\");\n      face.className = \"bt-fan-face\";\n      face.setAttribute(\"aria-hidden\", \"true\");\n      card.appendChild(face);\n    }\n  }\n\n  \/* =======================================================\n     B \u00b7 MESSEN (Kartenpositionen im Track, Fotoh\u00f6he)\n     ======================================================= *\/\n  var list = [];\n  var kidX = new WeakMap();\n  function measure() {\n    var tr = track.getBoundingClientRect();\n    var sl = track.scrollLeft;\n    list = cards().map(function (card) {\n      var o = dataOf(card);\n      var r = card.getBoundingClientRect();\n      o.L = r.left - tr.left - track.clientLeft + sl;\n      o.W = r.width;\n      \/* Perf 20.10.: nur noch lesen (--fan-img-* und kidX wurden nirgends genutzt) *\/\n      return o;\n    });\n  }\n  function offX(k) {\n    var x = kidX.get(k);\n    if (x === undefined) { x = k.offsetLeft; kidX.set(k, x); }\n    return x;\n  }\n  function view() {\n    var sl = track.scrollLeft;\n    return { l: sl, r: sl + track.clientWidth, max: Math.max(0, track.scrollWidth - track.clientWidth) };\n  }\n\n  \/* =======================================================\n     B2 \u00b7 H\u00d6HENBUDGET (ab 768 px): geschlossene Karte samt Plus\n     und Leiste samt Musik-Kopf in einer Bildschirmh\u00f6he.\n     ======================================================= *\/\n  function viewH() { return (w.visualViewport && w.visualViewport.height) || w.innerHeight || d.documentElement.clientHeight; }\n  \/* feste Leisten oben (Adminleiste, Navigation) *\/\n  function safeTop() {\n    var vh = viewH(), top = 0;\n    d.querySelectorAll(\"#wpadminbar, #main-header, #top-header, .et-l--header, header, .et_pb_sticky--top\").forEach(function (el) {\n      if (shell.contains(el) || el.contains(shell)) return;\n      var st = getComputedStyle(el);\n      if (st.display === \"none\" || st.visibility === \"hidden\") return;\n      var r = el.getBoundingClientRect();\n      if (r.height <= 0 || r.height > vh * 0.35) return;\n      if (st.position === \"fixed\" && r.top <= 4) top = Math.max(top, r.bottom);\n      else if (st.position === \"sticky\") top = Math.max(top, (parseFloat(st.top) || 0) + r.height);\n    });\n    return top;\n  }\n  \/* Unterkante des sichtbaren MUSIC-Logos (0 = nicht im Bild) *\/\n  function logoBottom() {\n    var sec = shell.closest(\".et_pb_section\") || shell.parentNode;\n    var el = sec.querySelector(\".btml\");\n    var b = 0;\n    if (el && el.offsetParent !== null) {\n      var r = el.getBoundingClientRect();\n      if (r.height > 0) b = r.bottom;\n    } else {\n      \/* ohne Logo-Modul: ganzer Kopfbereich \u00fcber dem Line-up *\/\n      Array.prototype.forEach.call(sec.querySelectorAll(\":scope > .et_pb_row, :scope > div > .et_pb_row\"), function (row) {\n        if (row === shell || row.contains(shell)) return;\n        var r = row.getBoundingClientRect();\n        if (r.height > 0 && r.top < shell.getBoundingClientRect().top) b = Math.max(b, r.bottom);\n      });\n    }\n    return b > 0 ? b : 0;\n  }\n  function textMods() {\n    return cards().filter(function (c) { return !c.classList.contains(\"is-open\") && !c.classList.contains(\"is-drawer\"); })\n      .map(function (c) {\n        var m = c.querySelector(\":scope > .et_pb_column:nth-child(2) .bt-lu-text\");\n        var inner = m && m.querySelector(\":scope > .et_pb_text_inner\");\n        return inner ? { c: c, m: m, i: inner } : null;\n      }).filter(Boolean);\n  }\n  \/* Vorschau neu einteilen wie im Carousel (gek\u00fcrzt mit Plus oder kurz) *\/\n  function reclamp() {\n    var ms = textMods();\n    \/* Scroll setters can flush layout: finish them before measurement classes. *\/\n    ms.forEach(function (x) { x.i.scrollTop = 0; });\n    ms.forEach(function (x) { x.m.classList.add(\"is-measure\"); });\n    var res = ms.map(function (x) {\n      var lh = parseFloat(getComputedStyle(x.i).lineHeight) || 20;\n      var L = parseFloat(getComputedStyle(x.m).getPropertyValue(\"--bt-text-lines\")) || 7;\n      return { lh: lh, full: x.i.scrollHeight, L: L };\n    });\n    ms.forEach(function (x, k) {\n      var r = res[k];\n      x.m.classList.remove(\"is-measure\");\n      var isShort = r.full <= r.L * r.lh + Math.max(8, r.lh * 0.75);\n      x.c.classList.toggle(\"is-short\", isShort);\n      x.m.classList.toggle(\"is-short\", isShort);\n      x.m.classList.toggle(\"is-clamped\", !isShort);\n    });\n  }\n  var fitState = { lines: \"\", per: \"\", ratio: \"\" }, heightPending = false, fitVH = 0, fitVW = 0;\n  function setTok(name, val) {\n    if (val) shell.style.setProperty(name, val, \"important\");\n    else shell.style.removeProperty(name);\n  }\n  \/* nur die WordPress-Adminleiste z\u00e4hlt als feste Leiste; die Divi-\n     Kopfzeile liegt durchsichtig \u00fcber dem oberen Rand der Sektion *\/\n  function adminTop() {\n    var bar = d.getElementById(\"wpadminbar\");\n    if (!bar) return 0;\n    var st = getComputedStyle(bar);\n    if (st.position !== \"fixed\" || st.display === \"none\") return 0;\n    var r = bar.getBoundingClientRect();\n    return (r.top <= 4 && r.height > 0 && r.height < 120) ? r.bottom : 0;\n  }\n  function px(v) { return parseFloat(v) || 0; }\n  \/* erste (mindestens halb) sichtbare Karte: bleibt nach dem Umrechnen vorne *\/\n  function firstVisible() {\n    var tr = track.getBoundingClientRect(), cs = cards();\n    for (var i = 0; i < cs.length; i++) {\n      var r = cs[i].getBoundingClientRect();\n      if (r.width > 0 && r.right > tr.left + r.width * 0.5) return cs[i];\n    }\n    return null;\n  }\n  function alignTo(card) {\n    if (!card) return;\n    \/* wie das Carousel (xFor): Ausrichtung am Anfang oder mittig *\/\n    var tr = track.getBoundingClientRect(), cr = card.getBoundingClientRect();\n    var base = track.scrollLeft + cr.left - tr.left - track.clientLeft, x;\n    if ((getComputedStyle(card).scrollSnapAlign || \"\").indexOf(\"center\") > -1) {\n      x = base - (track.clientWidth - cr.width) \/ 2;\n    } else {\n      var tcs = getComputedStyle(track);\n      var pad = parseFloat(tcs.scrollPaddingLeft);\n      if (isNaN(pad)) pad = px(tcs.paddingLeft);\n      x = base - pad;\n    }\n    x = Math.max(0, Math.min(Math.round(x), Math.max(0, track.scrollWidth - track.clientWidth)));\n    if (Math.abs(x - track.scrollLeft) < 1) return;\n    var sb = track.style.scrollBehavior;\n    track.style.scrollBehavior = \"auto\";\n    track.scrollLeft = x;\n    track.style.scrollBehavior = sb;\n  }\n  \/* aktuelle Geometrie einer Karte (Kopf aller Karten, Foto, Text) *\/\n  function geo(c) {\n    \/* Kopfh\u00f6he frei messen (das Carousel gleicht sie danach genauso an) *\/\n    shell.style.setProperty(\"--bt-head-h\", \"0px\");\n    var head = 0;\n    cards().forEach(function (k) {\n      if (k.classList.contains(\"is-open\") || k.classList.contains(\"is-drawer\")) return;\n      var col = k.querySelector(\":scope > .et_pb_column:nth-child(1)\");\n      if (col) head = Math.max(head, col.getBoundingClientRect().height);\n    });\n    var pic = c.querySelector(\":scope > .et_pb_column:nth-child(3)\");\n    var txt = c.querySelector(\":scope > .et_pb_column:nth-child(2)\");\n    var inner = txt && txt.querySelector(\".et_pb_text_inner\");\n    var lh = inner ? (px(getComputedStyle(inner).lineHeight) || 20) : 20;\n    if (head > 0) shell.style.setProperty(\"--bt-head-h\", Math.ceil(head) + \"px\");\n    var tFix = (txt && inner) ? txt.getBoundingClientRect().height - inner.getBoundingClientRect().height : 82;\n    return { head: Math.ceil(head), pic: pic ? pic.getBoundingClientRect().height : 0,\n             W: c.getBoundingClientRect().width, tFix: Math.max(0, tFix), lh: lh };\n  }\n  \/* V3.11: Titel geschlossener Karten in h\u00f6chstens NAME_LINES Zeilen.\n     Das Carousel markiert zu lange Namen (is-name-long); hier werden sie\n     umbrochen und nur so weit verkleinert, bis sie in zwei Zeilen passen. *\/\n  \/* V3.12: Ergebnis je Karte merken (gleiche Breite und gleicher Name =\n     keine neue Messschleife, spart erzwungene Layouts) *\/\n  var nameFit = new WeakMap();\n  function fitNames2() {\n    var rows = [];\n    cards().forEach(function (c) {\n      var h2 = c.querySelector(\":scope > .et_pb_column:nth-child(1) h2\");\n      if (!h2) return;\n      var span = h2.querySelector(\":scope > .bt-lu-name\");\n      if (!span || !mqTall.matches ||\n          c.classList.contains(\"is-open\") || c.classList.contains(\"is-drawer\")) {\n        h2.style.removeProperty(\"--bt-fan-name\");\n        return;\n      }\n      rows.push({ h2: h2, span: span, s: 1 });\n    });\n    \/* Reuse the core result; its cache checks width, name and loaded fonts. *\/\n    if (typeof w.__btLuFitNameRowsV1 === \"function\") {\n      w.__btLuFitNameRowsV1(rows);\n      return;\n    }\n    \/* Perf 20.10.: erst alle Schluessel lesen, dann schreiben, dann rundenweise messen *\/\n    rows.forEach(function (r) {\n      var cs = getComputedStyle(r.h2);\n      r.key = Math.round(r.h2.clientWidth) + \"|\" + r.span.textContent + \"|\" + cs.fontFamily + \"|\" + cs.fontWeight;\n    });\n    var todo = [];\n    rows.forEach(function (r) {\n      var known = nameFit.get(r.h2);\n      if (known && known.key === r.key) {\n        if (r.h2.style.getPropertyValue(\"--bt-fan-name\") !== known.s) r.h2.style.setProperty(\"--bt-fan-name\", known.s);\n        return;\n      }\n      r.h2.style.setProperty(\"--bt-fan-name\", \"1\");\n      todo.push(r);\n    });\n    var open = todo.slice();\n    while (open.length) {\n      open = open.filter(function (r) { return r.span.getClientRects().length > NAME_LINES && r.s > NAME_MIN + 0.001; });\n      open.forEach(function (r) {\n        \/* Match the core fitter grid so the final writer keeps the same size. *\/\n        r.s = Math.max(NAME_MIN, r.s - 0.025);\n        r.h2.style.setProperty(\"--bt-fan-name\", r.s.toFixed(3));\n      });\n    }\n    todo.forEach(function (r) { nameFit.set(r.h2, { key: r.key, s: r.h2.style.getPropertyValue(\"--bt-fan-name\") }); });\n  }\n  \/* V3.10 (Sasha 19.10. 17:20): das LINE-UP-CAROUSEL ALLEIN (Karten +\n     Z\u00e4hler) ist fast eine Bildschirmh\u00f6he hoch. Der MUSIC-Kopf dar\u00fcber\n     z\u00e4hlt NICHT mit, die Musik-Sektion darf h\u00f6her als der Bildschirm\n     sein. Kartenzahl wie im Carousel (Breakpoints); nur wenn Karten\n     schmaler als CARD_MIN_W w\u00fcrden, eine Karte weniger (nie mehr).\n     Fotos IMG_RATIO (breiter als hoch); nur wenn die H\u00f6he f\u00fcr TEXT_MIN\n     Zeilen nicht reicht, etwas flacher (h\u00f6chstens IMG_FLAT).\n     Vorschautext immer in ganzen Zeilen. *\/\n  function fitHeight(force) {\n    if (building || anyOpen()) { heightPending = true; return; }\n    heightPending = false;\n    var vh = viewH(), vw = d.documentElement.clientWidth || w.innerWidth;\n    \/* nur echte Gr\u00f6\u00dfen\u00e4nderungen (Adressleiste ein\/aus z\u00e4hlt nicht) *\/\n    if (!force && Math.abs(vw - fitVW) < 1 && Math.abs(vh - fitVH) < 80) return;\n    fitVH = vh; fitVW = vw;\n    var keep = firstVisible();\n    var cs = cards(), c = cs[startIndex()] || cs[0];\n    \/* nat\u00fcrlicher Stand: Breakpoint-Spalten, Grundformat, volle Zeilen *\/\n    setTok(\"--bt-per-view\", \"\");\n    setTok(\"--bt-img-ratio\", \"\");\n    setTok(\"--bt-text-lines\", \"\");\n    setTok(\"--bt-card-min-h\", \"\");\n    var per = \"\", ratio = \"\", lines = \"\", minH = \"\";\n    if (mqTall.matches && c) {\n      var sec = shell.closest(\".et_pb_section\") || shell.parentNode;\n      var scs = getComputedStyle(shell);\n      var P0 = px(scs.getPropertyValue(\"--bt-per-view\")) || 4;\n      var gap = px(scs.getPropertyValue(\"--bt-gap\"));\n      var Lmax = px(scs.getPropertyValue(\"--bt-text-lines\")) || 10;\n      var W0 = c.getBoundingClientRect().width;\n      var inner = W0 * P0 + (P0 - 1) * gap;\n      var P = P0;\n      if (P0 >= 3) {\n        P = Math.min(P0, Math.max(2, Math.floor((inner + gap) \/ (CARD_MIN_W + gap))));\n        if (P !== P0) { per = String(P); setTok(\"--bt-per-view\", per); }\n      }\n      \/* Platz f\u00fcr eine Karte: Bildschirmh\u00f6he minus Adminleiste, minus\n         Z\u00e4hler\/Abstand unter den Karten und etwas Luft *\/\n      var secR = sec.getBoundingClientRect();\n      var bottomMax = 0;\n      cs.forEach(function (k) { if (!k.classList.contains(\"is-open\")) bottomMax = Math.max(bottomMax, k.getBoundingClientRect().bottom); });\n      var below = Math.max(0, secR.bottom - bottomMax);\n      var budget = vh - adminTop() - below - CAROUSEL_AIR;\n      fitNames2();\n      var g = geo(c);\n      budget += 3 * g.lh; \/* three additional preview lines *\/\n      var L = Math.floor((budget - g.head - g.pic - g.tFix - TEXT_EXTRA) \/ g.lh);\n      if (L < TEXT_MIN) {\n        \/* niedriges Fenster: Foto etwas flacher (nie flacher als IMG_FLAT) *\/\n        var img = c.querySelector(\":scope > .et_pb_column:nth-child(3) img\");\n        var ih = img ? img.getBoundingClientRect().height : g.W \/ IMG_RATIO;\n        var room = budget - (g.head + (g.pic - ih) + g.tFix + TEXT_EXTRA);\n        var h = Math.max(g.W \/ IMG_FLAT, Math.min(ih, room - TEXT_MIN * g.lh));\n        if (h < ih - 0.5) {\n          ratio = g.W.toFixed(1) + \" \/ \" + h.toFixed(1);\n          setTok(\"--bt-img-ratio\", ratio);\n          g = geo(c);\n        }\n        L = Math.max(3, Math.floor((budget - g.head - g.pic - g.tFix - TEXT_EXTRA) \/ g.lh));\n      }\n      \/* V3.11: Vorschau wie V26 h\u00f6chstens LINES_MAX Zeilen (keine Textwand) *\/\n      L = Math.max(2, Math.min(L, LINES_MAX) - 2);\n      if (L !== Lmax) lines = String(L);\n      \/* Karte f\u00fcllt das Carousel (fast 100vh), Plus unten b\u00fcndig *\/\n      minH = \"0px\";\n      setTok(\"--bt-text-lines\", lines);\n      setTok(\"--bt-card-min-h\", minH);\n      if (lines !== fitState.lines || per !== fitState.per || ratio !== fitState.ratio) reclamp();\n      \/* Kontrolle mit den echten neuen Ma\u00dfen: ragt die Karte doch \u00fcber\n         den Platz, weniger Textzeilen *\/\n      var over = c.getBoundingClientRect().height - budget;\n      if (over > 0.5 && L > 2) {\n        L = Math.max(2, L - Math.ceil(over \/ g.lh));\n        lines = String(L);\n        setTok(\"--bt-text-lines\", lines);\n        reclamp();\n      }\n      w.__btFanFit = { vh: vh, admin: adminTop(), below: below, budget: budget, P0: P0, P: P, L: L, ratio: ratio, head: g.head, pic: g.pic, W: g.W, tFix: g.tFix, lh: g.lh };\n    }\n    if (!mqTall.matches && (fitState.lines || fitState.per || fitState.ratio)) reclamp();\n    \/* nur wenn sich die Spaltenzahl ge\u00e4ndert hat: vordere Karte bleibt vorne *\/\n    var perChanged = per !== (fitState.per || \"\");\n    fitState.lines = lines; fitState.per = per; fitState.ratio = ratio;\n    if (perChanged) alignTo(keep);\n  }\n\n  \/* =======================================================\n     C \u00b7 KIPPEN (Randkarten + Mitneigen beim Bl\u00e4ttern)\n     ======================================================= *\/\n  \/* fold: Kippwinkel um eine Kante (pv = Anteil der Kartenbreite),\n     z: Tiefe, tilt: Neigung um die Mitte, dx\/dy: Versatz *\/\n  function tf(o, k, fold, pv, z, tilt, dx, dy) {\n    var cl = offX(k);\n    var p1 = o.W * pv - cl;\n    var pc = o.W \/ 2 - cl;\n    return \"translate3d(\" + (dx || 0).toFixed(1) + \"px,\" + (dy || 0).toFixed(1) + \"px,\" + z.toFixed(1) + \"px) \" +\n      \"translateX(\" + p1.toFixed(1) + \"px) rotateY(\" + fold.toFixed(2) + \"deg) translateX(\" + (-p1).toFixed(1) + \"px) \" +\n      \"translateX(\" + pc.toFixed(1) + \"px) rotateY(\" + tilt.toFixed(2) + \"deg) translateX(\" + (-pc).toFixed(1) + \"px)\";\n  }\n  function restPose(o, v) {\n    var over = 0, fold = 0, pv = 0;\n    var oR = (o.L + o.W) - v.r;\n    var oL = v.l - o.L;\n    if (oR > 0.5) { over = clamp(oR \/ o.W, 0, 1); pv = 0; fold = 1; }\n    else if (oL > 0.5) { over = clamp(oL \/ o.W, 0, 1); pv = 1; fold = -1; }\n    var e = over * over * (3 - 2 * over);\n    var deg = mqPhone.matches ? FOLD_DEG_PH : FOLD_DEG;\n    return { fold: fold * deg * e, pv: pv, z: -FOLD_Z * e };\n  }\n  function flat(o) {\n    if (!o.set) return;\n    Array.prototype.forEach.call(o.el.children, function (k) { k.style.transform = \"\"; });\n    o.set = false;\n    o.tilt = 0;\n  }\n  function frozen(o) {\n    var c = o.el;\n    return c.classList.contains(\"is-drawer\") || c.classList.contains(\"is-open\") ||\n           c.contains(d.activeElement) || c.classList.contains(\"is-tween\");\n  }\n\n  var active = false;       \/* Kippen erlaubt *\/\n  var building = false;     \/* Einstieg l\u00e4uft *\/\n  var raf = 0, lastSL = null, vel = 0;\n\n  function anyOpen() {\n    return list.some(function (o) { return o.el.classList.contains(\"is-drawer\") || o.el.classList.contains(\"is-open\"); });\n  }\n\n  function frame() {\n    raf = 0;\n    updateRail(view());\n    if (building) return;\n    \/* Bl\u00e4ttern ist eine ruhige horizontale Bewegung.\n       Keine getrennte 3D-Kippung von Kopf, Bild und Text. *\/\n    list.forEach(flat);\n    lastSL = null; vel = 0;\n  }\n  function kick() { if (!raf) raf = requestAnimationFrame(frame); }\n\n  \/* =======================================================\n     D \u00b7 EINSTIEG: aktuelle Act-Karte gro\u00df, dann auff\u00e4chern\n     ======================================================= *\/\n  var played = shell.getAttribute(\"data-bt-intro-state\") === \"done\", armed = false, sweep = null, stage = null;\n  var ioArm = null, ioPlay = null, entryKick = null, entryFrame = null;\n\n  function heroImgs() {\n    var c = cards()[startIndex()];\n    return c ? Array.prototype.slice.call(c.querySelectorAll(\":scope > .et_pb_column:nth-child(3) img\")) : [];\n  }\n  function arm() {\n    if (played || armed || reduced()) return;\n    armed = true;\n    shell.classList.add(\"bt-fan-pre\");\n    \/* Fotos der ersten Karten schon jetzt laden (kein Nachladen im Einstieg) *\/\n    var si = startIndex();\n    cards().slice(Math.max(0, si - 2), si + 7).forEach(function (c) {\n      c.querySelectorAll(\":scope > .et_pb_column:nth-child(3) img\").forEach(function (img) {\n        if (img.getAttribute(\"loading\") === \"lazy\") img.setAttribute(\"loading\", \"eager\");\n      });\n    });\n  }\n  function finishBuild() {\n    played = true;\n    shell.setAttribute(\"data-bt-intro-state\", \"done\");\n    stopWatching();\n    building = false;\n    shell.classList.remove(\"bt-fan-pending\", \"bt-fan-pre\", \"bt-fan-run\");\n    shell.classList.add(\"bt-fan-built\");\n    lastSL = null;\n    frame();\n    if (heightPending) remeasure();\n  }\n  function stopWatching() {\n    if (entryFrame) cancelAnimationFrame(entryFrame);\n    entryFrame = null;\n    if (entryKick) {\n      w.removeEventListener(\"scroll\", entryKick);\n      w.removeEventListener(\"resize\", entryKick);\n      w.removeEventListener(\"pageshow\", entryKick);\n      d.removeEventListener(\"visibilitychange\", entryKick);\n      entryKick = null;\n    }\n    if (ioArm) { ioArm.disconnect(); ioArm = null; }\n    if (ioPlay) { ioPlay.disconnect(); ioPlay = null; }\n  }\n  function dropStage() {\n    if (stage && stage.parentNode) stage.parentNode.removeChild(stage);\n    stage = null;\n  }\n\n  \/* Einstieg V3.10 (Sasha 18.10. 22:49 \/ 19.10. 17:20), nur mit ganzen\n     Kartenkopien auf einer B\u00fchne \u00fcber dem Line-up, eine durchgehende\n     Bewegung ohne Neustart:\n     A \u00b7 V3.11: die Karten fahren als GERADE Reihe herein (Regal:\n         aufrecht, parallel, gleiche Grundlinie, KEINE Drehung) und\n         breiten sich horizontal aus,\n     B \u00b7 die aktuelle Act-Karte gleitet aus ihrer Position in dieser\n         Reihe nach vorn und wird deutlich gr\u00f6\u00dfer,\n     C \u00b7 sie gleitet an ihren Platz im Carousel zur\u00fcck, alle anderen\n         Karten sortieren sich gleichzeitig ein.\n     Jede am Ende sichtbare Karte hat eine Kopie, die genau auf dem\n     Original landet; daher gibt es am Schluss keinen Sprung. *\/\n  function headPhoto(o) {\n    var cr = o.el.getBoundingClientRect();\n    var head = o.el.querySelector(\":scope > .et_pb_column:nth-child(1)\");\n    var pic = o.el.querySelector(\":scope > .et_pb_column:nth-child(3) .et_pb_image\");\n    var ht = Math.max(head ? head.getBoundingClientRect().bottom : cr.top, pic ? pic.getBoundingClientRect().bottom : cr.top) - cr.top;\n    return ht < 40 ? cr.height : ht;\n  }\n  function cloneCard(o, sr) {\n    var cr = o.el.getBoundingClientRect();\n    var c = o.el.cloneNode(true);\n    c.removeAttribute(\"id\");\n    c.querySelectorAll(\"[id]\").forEach(function (e) { e.removeAttribute(\"id\"); });\n    c.setAttribute(\"aria-hidden\", \"true\");\n    c.setAttribute(\"inert\", \"\");\n    c.classList.remove(\"is-open\", \"is-drawer\", \"is-tween\");\n    Array.prototype.forEach.call(c.children, function (e) { e.style.transform = \"\"; e.style.opacity = \"\"; });\n    c.style.setProperty(\"--bt-cw\", cr.width.toFixed(2) + \"px\");\n    c.style.setProperty(\"left\", (cr.left - sr.left).toFixed(2) + \"px\", \"important\");\n    c.style.setProperty(\"top\", (cr.top - sr.top).toFixed(2) + \"px\", \"important\");\n    c.style.setProperty(\"width\", cr.width.toFixed(2) + \"px\", \"important\");\n    c.style.setProperty(\"height\", cr.height.toFixed(2) + \"px\", \"important\");\n    c.style.setProperty(\"overflow\", \"hidden\", \"important\");\n    stage.appendChild(c);\n    return c;\n  }\n  \/* Kopie exakt wie das Original: Spaltenhoehen und Fotohoehe uebernehmen *\/\n  function matchCard(o, c) {\n    var cols = o.el.querySelectorAll(\":scope > .et_pb_column\");\n    c.querySelectorAll(\":scope > .et_pb_column\").forEach(function (col, j) {\n      var s = cols[j]; if (!s) return;\n      var ch = s.getBoundingClientRect().height;\n      col.style.setProperty(\"height\", ch.toFixed(2) + \"px\", \"important\");\n      col.style.setProperty(\"min-height\", ch.toFixed(2) + \"px\", \"important\");\n    });\n    var imgs = o.el.querySelectorAll(\":scope > .et_pb_column:nth-child(3) img\");\n    c.querySelectorAll(\":scope > .et_pb_column:nth-child(3) img\").forEach(function (img, j) {\n      var s = imgs[j]; if (!s) return;\n      img.style.setProperty(\"height\", getComputedStyle(s).height, \"important\");\n      img.style.setProperty(\"aspect-ratio\", \"auto\", \"important\");\n    });\n  }\n  \/* Ziel der gro\u00dfen Act-Karte: Kopf + Foto f\u00fcllen m\u00f6glichst den Platz\n     zwischen sichtbarem MUSIC-Logo (+ LOGO_GAP) und Bildschirmboden *\/\n  function bigTarget(o, ht) {\n    var cr = o.el.getBoundingClientRect();\n    var tr = track.getBoundingClientRect();\n    var vh = viewH(), phone = mqPhone.matches;\n    var vw = d.documentElement.clientWidth || w.innerWidth;\n    \/* Intro geometry is local to the music section, independent of entry scroll position. *\/\n    var anchorTop = safeTop();\n    var sec = shell.closest(\".et_pb_section\") || shell.parentNode;\n    var scrollShift = anchorTop - sec.getBoundingClientRect().top;\n    var lim = anchorTop + 8, lb = logoBottom();\n    var logo = sec.querySelector(\".btml\"), hasLogo = lb > 0;\n    if (logo && logo.offsetParent !== null) {\n      var logoRect = logo.getBoundingClientRect();\n      if (logoRect.height > 0) { lb = logoRect.bottom; hasLogo = true; }\n    }\n    if (hasLogo) lim = Math.max(lim, lb + scrollShift + LOGO_GAP);\n    var floor = vh - BOTTOM_GAP;\n    var avail = Math.max(40, floor - lim);\n    var s = Math.min(avail \/ ht, tr.width * (phone ? 0.94 : 0.62) \/ cr.width, (vw - 24) \/ cr.width, 2.4);\n    var cx = phone ? vw \/ 2 : tr.left + tr.width \/ 2;\n    var tx = cx - cr.width * s \/ 2 - cr.left;\n    var over = cr.left + tx + cr.width * s - (vw - 12);\n    if (over > 0) tx -= over;\n    var under = 12 - (cr.left + tx);\n    if (under > 0) tx += under;\n    var topV = lim + (avail - ht * s) \/ 2;\n    if (topV < lim) topV = lim;\n    return { s: s, tx: tx, ty: topV - cr.top - scrollShift,\n      lim: lim - scrollShift, floor: floor - scrollShift, logo: lb };\n  }\n\n  function play() {\n    if (played) return;\n    if (reduced() || anyOpen() || typeof track.animate !== \"function\") {\n      finishBuild(); return;\n    }\n    if (!shell.classList.contains(\"bt-lu-ready\") || !shell.hasAttribute(\"data-bt-start-index\")) return;\n    \/* V3.12: nur neu einpassen, wenn sich die Fenstergr\u00f6\u00dfe ge\u00e4ndert hat\n       (keine schwere Messrunde genau beim Start) *\/\n    fitHeight(false);\n    list.forEach(flat);\n    measure();\n    var v = view(), heroO = list[startIndex()];\n    var visible = list.filter(function (o) { return o.L + o.W > v.l + 2 && o.L < v.r - 2; });\n    \/* Nach einer bewussten Eingabe niemals einen anderen Act gross zeigen. *\/\n    if (!heroO || visible.indexOf(heroO) < 0) return;\n    \/* Erst nach g\u00fcltiger Kartenposition geh\u00f6rt dieser Seitenaufruf der Intro. *\/\n    played = true;\n    shell.setAttribute(\"data-bt-intro-state\", \"playing\");\n    stopWatching();\n    var heroI = list.indexOf(heroO);\n    var phone = mqPhone.matches;\n    var vw = d.documentElement.clientWidth || w.innerWidth;\n    var trR = track.getBoundingClientRect();\n    var lo = Math.max(trR.left, 0), hi = Math.min(trR.right, vw);\n    function rectOf(o) { return o.el.getBoundingClientRect(); }\n    \/* am Ende sichtbare Karten (ganz oder angeschnitten) *\/\n    var inView = list.filter(function (o) { var r = rectOf(o); return r.right > lo + 1 && r.left < hi - 1; });\n    var full = inView.filter(function (o) { var r = rectOf(o); return r.left >= lo - 2 && r.right <= hi + 2; });\n    var fan = phone ? list.slice(heroI, Math.min(list.length, heroI + 3)) : full.slice();\n    if (fan.indexOf(heroO) < 0) fan = [heroO];\n\n    \/* V3.13 (Sasha 20:25 \u201ezu hektisch, gro\u00dfe Karte zu kurz\u201c): vorher\n       900 \/ 60 \/ 240 \/ 720 \/ 520 \/ 1100 ms. BIG_STAY = reine Standzeit\n       der vollst\u00e4ndig gro\u00dfen Karte nach Ende der Vergr\u00f6\u00dferung. *\/\n    var IN_MS = 1300, IN_STAGGER = 220, FAN_STAY = 120, LIFT = 1200, BIG_STAY = 2800, SETTLE = 1500;\n    var EASE = \"cubic-bezier(.33,0,.2,1)\";\n    var anims = [], timers = [], done = false, safety = null, total = 1;\n    var startX = track.scrollLeft;\n    var startW = vw, startH = viewH();\n    function at(t) { return clamp(t \/ total, 0, 1); }\n    function phase(value) { shell.setAttribute(\"data-bt-entry-phase\", value); }\n    \/* nur Verschieben und Skalieren (Ursprung oben links), keine Drehung *\/\n    function tfm(x, y, s, angle) {\n      return \"translate3d(\" + x.toFixed(2) + \"px,\" + y.toFixed(2) + \"px,0) scale(\" + s.toFixed(5) + \") rotate(\" + (angle || 0).toFixed(2) + \"deg)\";\n    }\n    function end() {\n      if (done) return;\n      done = true;\n      clearTimeout(safety); timers.forEach(clearTimeout);\n      [\"pointerdown\", \"keydown\"].forEach(function (t) { shell.removeEventListener(t, hurry, true); });\n      w.removeEventListener(\"scroll\", onPageScroll);\n      w.removeEventListener(\"resize\", onResize);\n      track.removeEventListener(\"scroll\", onTrackScroll);\n      d.removeEventListener(\"visibilitychange\", onHidden);\n      if (mqReduce.removeEventListener) mqReduce.removeEventListener(\"change\", end);\n      \/* Kopien liegen genau auf den Originalen: Sichtbarkeit und Abbau\n         im selben Schritt, ohne leeren Zwischenframe *\/\n      building = false;\n      shell.classList.remove(\"bt-fan-pending\", \"bt-fan-pre\", \"bt-fan-run\");\n      list.forEach(flat);\n      anims.forEach(function (a) { try { a.cancel(); } catch (e) {} });\n      dropStage();\n      phase(\"ready\");\n      finishBuild();\n    }\n    \/* V3.12: Eingabe (Mausrad, Wischen, Klick, Taste) oder Weiterscrollen\n       beendet den Einstieg nicht mehr schlagartig: alle Kopien gleiten\n       von ihrer aktuellen Lage in HURRY_MS an ihren Carouselplatz, dann\n       Abbau ohne Sprung. Die Seite scrollt dabei ganz normal weiter. *\/\n    var items = [], hurried = false, HURRY_MS = 500;\n    function hurry() {\n      if (done || hurried) return;\n      hurried = true;\n      timers.forEach(clearTimeout); clearTimeout(safety);\n      phase(\"settling\");\n      var now = items.map(function (it) {\n        var cs = getComputedStyle(it.el);\n        var from = { opacity: cs.opacity };\n        if (it.fin.transform) from.transform = cs.transform === \"none\" ? \"none\" : cs.transform;\n        if (it.fin.clipPath) from.clipPath = cs.clipPath;\n        return from;\n      });\n      anims.forEach(function (a) { try { a.cancel(); } catch (e) {} });\n      anims = items.map(function (it, k) {\n        return it.el.animate([now[k], it.fin], { duration: HURRY_MS, easing: EASE, fill: \"both\" });\n      });\n      Promise.all(anims.map(function (x) { return x.finished; })).then(end, function () {});\n      safety = setTimeout(end, HURRY_MS + 300);\n    }\n    \/* Enter immediately while the page keeps scrolling; settle only when leaving the carousel. *\/\n    function onPageScroll() {\n      var r = shell.getBoundingClientRect(), vh = viewH();\n      if (r.bottom < 80 || r.top > vh - 40) hurry();\n    }\n    function onTrackScroll() { if (Math.abs(track.scrollLeft - startX) > 2) end(); }\n    function onResize() {\n      var nw = d.documentElement.clientWidth || w.innerWidth;\n      if (Math.abs(nw - startW) > 1 || Math.abs(viewH() - startH) > 120) end();\n    }\n    function onHidden() { if (d.visibilityState === \"hidden\") end(); }\n\n    try {\n      building = true;\n      var sr = shell.getBoundingClientRect();\n      stage = d.createElement(\"div\");\n      stage.className = \"bt-lineup-track bt-fan-stage\";\n      stage.setAttribute(\"aria-hidden\", \"true\");\n      shell.appendChild(stage);\n\n      var W = heroO.W;\n      var hts = new Map();\n      inView.concat(fan).forEach(function (o) { if (!hts.has(o)) hts.set(o, headPhoto(o)); });\n      var big = bigTarget(heroO, hts.get(heroO));\n      var lim = big.lim, band = Math.max(40, big.floor - lim);\n      \/* Regalreihe: eine gerade Reihe, alle Karten gleich gro\u00df, aufrecht\n         auf gleicher Grundlinie (oben b\u00fcndig), schmaler Abstand *\/\n      var n, hk, mid, p, F;\n      function layout() {\n        n = fan.length; hk = fan.indexOf(heroO); mid = (n - 1) \/ 2;\n        F = phone ? 0.42 : 0.56;\n        var htMax = 0;\n        fan.forEach(function (o) { htMax = Math.max(htMax, hts.get(o)); });\n        p = Math.min(1, (hi - lo - 32) \/ (W * (1 + (n - 1) * F)), (band - 28) \/ htMax, big.s * 0.72);\n      }\n      layout();\n      while (!phone && p < 0.5 && fan.length > 2) {\n        if (fan.length - 1 - fan.indexOf(heroO) >= fan.indexOf(heroO)) fan.pop(); else fan.shift();\n        layout();\n      }\n      if (n > 1) F = clamp((hi - lo - 32 - W * p) \/ ((n - 1) * W * p), F, 1.05);\n      var st = F * W * p, rowW = W * p + (n - 1) * st;\n      var x0 = (lo + hi) \/ 2 - rowW \/ 2, yc = lim + band \/ 2;\n      var htRow = 0;\n      fan.forEach(function (o) { htRow = Math.max(htRow, hts.get(o)); });\n      var yRow = yc - htRow * p \/ 2;\n      var maxDist = 0;\n      fan.forEach(function (o, q) { maxDist = Math.max(maxDist, Math.abs(q - mid)); });\n      var inEnd = IN_MS + IN_STAGGER * Math.max(0, n - 1);\n      var liftStart = inEnd + FAN_STAY, liftEnd = liftStart + LIFT;\n      var settleStart = liftEnd + BIG_STAY;\n      total = settleStart + SETTLE;\n\n      var extras = inView.filter(function (o) { return fan.indexOf(o) < 0; });\n      var lastFan = -1;\n      fan.forEach(function (o) { lastFan = Math.max(lastFan, list.indexOf(o)); });\n      var backfill = !phone && lastFan >= 0 ? list[lastFan + 1] : null;\n      if (backfill) {\n        if (extras.indexOf(backfill) < 0) extras.push(backfill);\n        hts.set(backfill, headPhoto(backfill));\n      }\n      fan.concat(extras).forEach(function (o) {\n        var isHero = o === heroO, q = fan.indexOf(o), inFan = q > -1;\n        var cr = rectOf(o), H = cr.height, ht = hts.get(o) || H;\n        var c = cloneCard(o, sr);\n        matchCard(o, c);\n        var cut = \"inset(0 0 \" + Math.max(0, H - ht).toFixed(2) + \"px 0)\", whole = \"inset(0 0 0px 0)\";\n        var normal = tfm(0, 0, 1), frames, finalOpacity = 1;\n        if (o === backfill) {\n          c.setAttribute(\"data-bt-entry-backfill\", \"1\");\n          c.style.zIndex = \"1\";\n          var fillStart = tfm(vw + 32 - cr.left, yRow - cr.top + 8 * p, p * 0.96);\n          var fillRow = tfm(lo + (n - 1) * st - cr.left, yRow - cr.top + 8 * p, p * 0.96);\n          finalOpacity = cr.right > lo + 1 && cr.left < hi - 1 ? 1 : 0;\n          frames = [\n            { transform: fillStart, opacity: 0, clipPath: cut, offset: 0 },\n            { transform: fillStart, opacity: 0, clipPath: cut, offset: at(liftStart), easing: EASE },\n            { transform: fillRow, opacity: 1, clipPath: cut, offset: at(liftEnd) },\n            { transform: fillRow, opacity: 1, clipPath: cut, offset: at(settleStart), easing: EASE },\n            { transform: normal, opacity: finalOpacity, clipPath: whole, offset: 1 }\n          ];\n        } else if (inFan) {\n          var dq = q - mid;\n          var fx = x0 + q * st - cr.left;\n          var fy = yRow - cr.top;\n          var fanT = tfm(fx, fy, p);\n          \/* Start: dieselbe gerade Reihe, eng zusammengeschoben, etwas\n             tiefer; sie f\u00e4hrt herein und breitet sich horizontal aus *\/\n          var startT = tfm(vw + 32 + q * st - cr.left, fy + 14, p, q % 2 ? -1.4 : 1.4);\n          var dl = IN_STAGGER * q;\n          c.style.zIndex = isHero ? String(n + 3) : String(q + 1);\n          if (isHero) {\n            dl = 0;\n            var bigT = tfm(big.tx, big.ty, big.s);\n            frames = [\n              { transform: startT, opacity: 0, clipPath: cut, offset: 0 },\n              { transform: startT, opacity: 0, clipPath: cut, offset: at(dl), easing: EASE },\n              { transform: fanT, opacity: 1, clipPath: cut, offset: at(dl + IN_MS) },\n              { transform: fanT, opacity: 1, clipPath: cut, offset: at(liftStart), easing: EASE },\n              { transform: bigT, opacity: 1, clipPath: cut, offset: at(liftEnd) },\n              { transform: bigT, opacity: 1, clipPath: cut, offset: at(settleStart), easing: EASE },\n              { transform: normal, opacity: 1, clipPath: whole, offset: 1 }\n            ];\n          } else {\n            \/* The next date reaches the left edge while the current act grows. *\/\n            var rank = (q - hk - 1 + n) % n;\n            var backT = tfm(lo + rank * st - cr.left, fy + 8 * p, p * 0.96);\n            var arrival = dl + IN_MS;\n            var backAt = Math.max(arrival + 240, liftEnd);\n            frames = [\n              { transform: startT, opacity: 0, clipPath: cut, offset: 0 },\n              { transform: startT, opacity: 0, clipPath: cut, offset: at(dl), easing: EASE },\n              { transform: tfm(fx + 28, fy - 5, p, q % 2 ? 0.7 : -0.7), opacity: 1, clipPath: cut, offset: at(dl + IN_MS * 0.68), easing: EASE },\n              { transform: fanT, opacity: 1, clipPath: cut, offset: at(arrival), easing: EASE },\n              { transform: backT, opacity: 1, clipPath: cut, offset: at(backAt) },\n              { transform: backT, opacity: 1, clipPath: cut, offset: at(settleStart), easing: EASE },\n              { transform: normal, opacity: 1, clipPath: whole, offset: 1 }\n            ];\n          }\n        } else {\n          \/* angeschnittene Randkarte: blendet an ihrem Platz ein *\/\n          c.style.zIndex = \"1\";\n          var side = cr.left + cr.width \/ 2 < (lo + hi) \/ 2 ? -1 : 1;\n          var edgeT = tfm(side * 24, 0, 1);\n          frames = [\n            { transform: edgeT, opacity: 0, clipPath: whole, offset: 0 },\n            { transform: edgeT, opacity: 0, clipPath: whole, offset: at(settleStart + SETTLE * 0.3), easing: EASE },\n            { transform: normal, opacity: 1, clipPath: whole, offset: 1 }\n          ];\n        }\n        anims.push(c.animate(frames, { duration: total, easing: \"linear\", fill: \"both\" }));\n        items.push({ el: c, fin: { transform: normal, opacity: finalOpacity, clipPath: whole } });\n      });\n      shell.classList.add(\"bt-fan-run\");\n      shell.classList.remove(\"bt-fan-pre\");\n      phase(\"fan\");\n      timers.push(setTimeout(function () { phase(\"hero\"); }, liftStart));\n      timers.push(setTimeout(function () { phase(\"settling\"); }, settleStart));\n      w.__btFanLast = { lim: lim, floor: big.floor, logo: big.logo, s: big.s, p: p, F: F, n: n, extras: extras.length, total: total, liftStart: liftStart, settleStart: settleStart };\n      [\"pointerdown\", \"keydown\"].forEach(function (t) { shell.addEventListener(t, hurry, { capture: true, passive: true }); });\n      w.addEventListener(\"scroll\", onPageScroll, { passive: true });\n      w.addEventListener(\"resize\", onResize, { passive: true });\n      track.addEventListener(\"scroll\", onTrackScroll, { passive: true });\n      d.addEventListener(\"visibilitychange\", onHidden);\n      if (mqReduce.addEventListener) mqReduce.addEventListener(\"change\", end);\n      Promise.all(anims.map(function (x) { return x.finished; })).then(end, function () {});\n      safety = setTimeout(end, total + 350);\n    } catch (err) { end(); }\n  }\n  function runSweep(delay) {\n    if (!sweep) {\n      sweep = d.createElement(\"span\");\n      sweep.className = \"bt-fan-sweep\";\n      sweep.setAttribute(\"aria-hidden\", \"true\");\n      shell.appendChild(sweep);\n    }\n    var sr = shell.getBoundingClientRect(), tr = track.getBoundingClientRect();\n    sweep.style.left = (tr.left - sr.left).toFixed(1) + \"px\";\n    sweep.style.width = tr.width.toFixed(1) + \"px\";\n    sweep.style.top = (tr.top - sr.top - 14).toFixed(1) + \"px\";\n    sweep.animate([\n      { transform: \"scaleX(0)\", opacity: 0 },\n      { transform: \"scaleX(.2)\", opacity: 1, offset: 0.12 },\n      { transform: \"scaleX(1)\", opacity: 1, offset: 0.6 },\n      { transform: \"scaleX(1)\", opacity: 0 }\n    ], { duration: 1700, delay: delay || 0, easing: \"cubic-bezier(.3,.6,.2,1)\", fill: \"both\" });\n  }\n\n  function inViewport(extra) {\n    var r = shell.getBoundingClientRect();\n    var vh = w.innerHeight || d.documentElement.clientHeight;\n    return r.bottom > -extra && r.top < vh + extra;\n  }\n  \/* Images are primed before entry. Start on the first visible frame,\n     without waiting for image\/font requests or for scrolling to stop. *\/\n  function watchEntry() {\n    \/* Desktop intro disabled: keep native page scrolling free of cloned-card animations. *\/\n    finishBuild();\n    return;\n    if (played) return;\n    if (mqPhone.matches || reduced() || !(\"IntersectionObserver\" in w)) { played = true; finishBuild(); return; }\n    function visibleEnough() {\n      var r = shell.getBoundingClientRect(), vh = viewH();\n      var shown = Math.min(r.bottom, vh) - Math.max(r.top, 0);\n      return d.visibilityState !== \"hidden\" && r.height > 0 && r.top <= vh * 0.85 &&\n        r.bottom >= 80 && shown >= Math.min(80, r.height * 0.15);\n    }\n    function attempt() {\n      if (played || !visibleEnough()) return;\n      if (!armed) arm();\n      play();\n    }\n    entryKick = function () {\n      if (played || entryFrame) return;\n      entryFrame = requestAnimationFrame(function () { entryFrame = null; attempt(); });\n    };\n    if (inViewport(viewH())) arm();\n    ioArm = new IntersectionObserver(function (es) {\n      if (es.some(function (e) { return e.isIntersecting; })) arm();\n    }, { rootMargin: \"100% 0px 100% 0px\" });\n    ioArm.observe(shell);\n    ioPlay = new IntersectionObserver(function () { entryKick && entryKick(); },\n      { threshold: [0, 0.05, 0.1, 0.2, 0.4, 0.6, 0.8] });\n    ioPlay.observe(shell);\n    w.addEventListener(\"scroll\", entryKick, { passive: true });\n    w.addEventListener(\"resize\", entryKick, { passive: true });\n    w.addEventListener(\"pageshow\", entryKick);\n    d.addEventListener(\"visibilitychange\", entryKick);\n    entryKick();\n  }\n\n  \/* =======================================================\n     E \u00b7 Z\u00c4HLER\n     ======================================================= *\/\n  var rail = null, count = null;\n  var lastCount = \"\";\n  function buildRail() {\n    rail = d.createElement(\"div\");\n    rail.className = \"bt-fan-rail\";\n    rail.setAttribute(\"aria-hidden\", \"true\");\n    count = d.createElement(\"span\");\n    count.className = \"bt-fan-count\";\n    rail.appendChild(count);\n    shell.appendChild(rail);\n  }\n  function updateRail(v) {\n    if (!rail || !list.length) return;\n    \/* Z\u00e4hler: ganz sichtbare Karten *\/\n    var first = -1, lastI = -1;\n    list.forEach(function (o, i) {\n      if (o.L >= v.l - 6 && o.L + o.W <= v.r + 6) { if (first < 0) first = i; lastI = i; }\n    });\n    if (first < 0) {\n      var mid = (v.l + v.r) \/ 2, best = Infinity;\n      list.forEach(function (o, i) { var dd = Math.abs(o.L + o.W \/ 2 - mid); if (dd < best) { best = dd; first = i; } });\n      lastI = first;\n    }\n    var txt = \"<b>\" + pad2(first + 1) + (lastI > first ? \"\u2013\" + pad2(lastI + 1) : \"\") + \"<\/b> \/ \" + pad2(list.length);\n    if (txt !== lastCount) { count.innerHTML = txt; lastCount = txt; }\n  }\n\n  \/* =======================================================\n     F \u00b7 START\n     ======================================================= *\/\n  var started = false;\n  var measureTimer = null;\n  function remeasure() {\n    clearTimeout(measureTimer);\n    measureTimer = setTimeout(function () {\n      if (building || cards().some(function (c) { return c.classList.contains(\"is-tween\"); })) { heightPending = true; return; }\n      list.forEach(flat);\n      fitHeight(true);\n      measure();\n      lastSL = null;\n      kick();\n    }, 160);\n  }\n\n  function start() {\n    if (started) return;\n    if (!cards().length) return;\n    started = true;\n    \/* A delayed carousel boot still owns its first visible intro. *\/\n    if (!played && !reduced() && (\"IntersectionObserver\" in w) && typeof track.animate === \"function\") {\n      shell.classList.remove(\"bt-fan-built\");\n      shell.classList.add(\"bt-fan-pending\");\n    }\n    shell.classList.add(\"bt-fan\");\n    cards().forEach(decorate);\n    measure();\n    \/* Numeric rail removed: arrows and keyboard remain available. *\/\n    fitHeight(true);\n    measure();\n    active = true;\n    watchEntry();\n    bootPrepared = true;\n    \/* nur H\u00f6he ge\u00e4ndert (Fenster, Drehen): Budget neu pr\u00fcfen *\/\n    var vhTimer = null;\n    w.addEventListener(\"resize\", function () {\n      clearTimeout(vhTimer);\n      vhTimer = setTimeout(function () { if (!building) { fitHeight(false); measure(); } }, 200);\n    });\n\n    track.addEventListener(\"scroll\", kick, { passive: true });\n    \/* V3.12: volle Neuberechnung nur bei echter Breiten\u00e4nderung; reine\n       H\u00f6hen\u00e4nderungen (auch durch die eigene Kartenh\u00f6he) nur nachmessen.\n       Verhindert ein Hin und Her mit der Carousel-Basis. *\/\n    if (\"ResizeObserver\" in w) {\n      var roW = track.clientWidth;\n      new ResizeObserver(function (es) {\n        var cw = es[0] && es[0].contentRect ? es[0].contentRect.width : track.clientWidth;\n        if (roW < 0 || Math.abs(cw - roW) >= 1) { roW = cw; remeasure(); }\n        else if (!building && !cards().some(function (c) { return c.classList.contains(\"is-tween\"); })) { measure(); kick(); }\n      }).observe(track);\n    } else w.addEventListener(\"resize\", remeasure);\n\n    \/* Karte \u00f6ffnet\/schlie\u00dft: gerade stellen, danach neu messen *\/\n    var cardObs = new MutationObserver(function (muts) {\n      var relevant = muts.some(function (m) {\n        var o = m.oldValue || \"\", n = m.target.className || \"\";\n        return (o.indexOf(\"is-drawer\") > -1) !== (n.indexOf(\"is-drawer\") > -1) ||\n               (o.indexOf(\"is-open\") > -1) !== (n.indexOf(\"is-open\") > -1) ||\n               (o.indexOf(\"is-tween\") > -1) !== (n.indexOf(\"is-tween\") > -1);\n      });\n      if (relevant) { kick(); remeasure(); }\n    });\n    cards().forEach(function (c) {\n      cardObs.observe(c, { attributes: true, attributeFilter: [\"class\"], attributeOldValue: true });\n    });\n    \/* Klick zum \u00d6ffnen: sofort gerade (vor dem Carousel), damit es sauber misst *\/\n    track.addEventListener(\"click\", function (e) {\n      var c = e.target.closest && e.target.closest(\".lineup-row\");\n      if (c) { var o = dataOf(c); o.tilt = 0; flat(o); }\n    }, true);\n    track.addEventListener(\"focusin\", function (e) {\n      if (!played && shell.classList.contains(\"bt-fan-pending\")) { played = true; stopWatching(); finishBuild(); }\n      var c = e.target.closest && e.target.closest(\".lineup-row\");\n      if (c) flat(dataOf(c));\n    });\n\n    function onMotionChange() { list.forEach(flat); kick(); }\n    if (mqReduce.addEventListener) mqReduce.addEventListener(\"change\", onMotionChange);\n    if (d.fonts && d.fonts.ready) d.fonts.ready.then(function () {\n      \/* Font family and weight can stay unchanged when the actual face loads. *\/\n      nameFit = new WeakMap();\n      remeasure();\n    }).catch(function () {});\n    w.addEventListener(\"load\", remeasure, { once: true });\n    kick();\n  }\n\n  if (new URLSearchParams(location.search).get('bt-entry') === '20261022' && w.__btEntryTimed) {\n    start = w.__btEntryTimed('fan.start', start);\n    fitHeight = w.__btEntryTimed('fan.fitHeight', fitHeight);\n    fitNames2 = w.__btEntryTimed('fan.fitNames2', fitNames2);\n    measure = w.__btEntryTimed('fan.measure', measure);\n    remeasure = w.__btEntryTimed('fan.remeasure', remeasure);\n    decorate = w.__btEntryTimed('fan.decorate', decorate);\n    geo = w.__btEntryTimed('fan.geo', geo);\n    reclamp = w.__btEntryTimed('fan.reclamp', reclamp);\n  }\n\n  function whenReady() {\n    if (shell.classList.contains(\"bt-lu-ready\") && cards().length) { start(); return; }\n    d.addEventListener(\"bt:lineup-layout-ready\", function () { start(); }, { once: true });\n    if (\"MutationObserver\" in w) {\n      var mo = new MutationObserver(function () {\n        if (shell.classList.contains(\"bt-lu-ready\")) { mo.disconnect(); start(); }\n      });\n      mo.observe(shell, { attributes: true, attributeFilter: [\"class\"] });\n    }\n  }\n  if (d.readyState === \"loading\") d.addEventListener(\"DOMContentLoaded\", whenReady, { once: true });\n  else whenReady();\n})();\n<\/script>\n<!-- ENDE \u00b7 BT \u00b7 LINEUP \u00b7 KARTENF\u00c4CHER V3.13 -->\n\n\n\n<style id=\"bt-v5-lineup-event-links-align\">\n\/* Shared card headings keep their event link on the same bottom line. *\/\nbody.page-id-9606 #page-container #musik .bt-lineup-shell .bt-lineup-track>.lineup-row:not(.is-open):not(.is-drawer)>.et_pb_column:first-child{display:flex!important;flex-direction:column!important}\nbody.page-id-9606 #page-container #musik .bt-lineup-shell .bt-lineup-track>.lineup-row:not(.is-open):not(.is-drawer)>.et_pb_column:first-child>.et_pb_text{display:flex!important;flex-direction:column!important;flex:1 0 auto!important;margin-bottom:0!important}\nbody.page-id-9606 #page-container #musik .bt-lineup-shell .bt-lineup-track>.lineup-row:not(.is-open):not(.is-drawer)>.et_pb_column:first-child>.et_pb_text>.et_pb_text_inner{display:flex!important;flex-direction:column!important;flex:1 0 auto!important}\nbody.page-id-9606 #page-container #musik .bt-lineup-shell .bt-lineup-track>.lineup-row:not(.is-open):not(.is-drawer)>.et_pb_column:first-child>.et_pb_text>.et_pb_text_inner>p:has(a[href]){margin-top:auto!important;padding-top:6px!important}\n<\/style><\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_6 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-Nimue\">\r\n<div class=\"et_pb_column_7 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_8 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Electronica<\/h4>\n<h3>Do | 01.10. | 21 H<\/h3>\n<h2>Ceee<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2546804\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_8 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_9 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">CEEE ist zur\u00fcck in der Tausend. Die Berliner DJ verbindet hypnotischen Techno mit warmem Deep House, dubbigen Strukturen und treibenden Grooves. Ihre musikalischen Wurzeln reichen von Chicago House und Detroit Techno bis zu UK Garage \u2013 daraus entsteht ein Sound, der gleichzeitig druckvoll, verspielt und flie\u00dfend bleibt.<\/p>\n<p style=\"text-align: center;\">In ihren Sets geht es weniger um starre Genregrenzen als um Bewegung und Dynamik: pr\u00e4zise Rhythmen, tiefe Basslines und atmosph\u00e4rische Momente bauen sich St\u00fcck f\u00fcr St\u00fcck auf und halten den Dancefloor in Bewegung. Nach Sets in Berlin sowie Auftritten in Finnland und Thailand bringt CEEE ihren Sound erneut hinter die T\u00fcr der Tausend.<\/p>\n<p style=\"text-align: center;\">Donnerstag, 1. Oktober \u00b7 CEEE \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\" style=\"margin-top: 22px!important;\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/dj_ceee\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_9 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_0 et_pb_image et_pb_module et_block_module bt-x-40\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Ceee-sw.webp\" width=\"1080\" height=\"1080\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Ceee-sw-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Ceee-sw-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Ceee-sw-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Ceee-sw.webp 1080w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-7990\" alt=\"Dj Ceee\" title=\"BarTausend-Dj-Ceee-sw\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_7 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-Nimue\">\r\n<div class=\"et_pb_column_10 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_10 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Le Salon Priv\u00e9<\/h4>\n<h3>Fr | 02.10. | 21 H<\/h3>\n<h2>Agent! &amp; Roberta Deflorio<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2548758\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_11 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_11 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">AGENT! und Roberta Deflorio treffen bei LE SALON PRIV\u00c9 auf zwei unterschiedliche musikalische Handschriften. AGENT! bringt seine Wurzeln aus Golden Age Hip-Hop, Funk und 90er-Techno mit und verbindet sie zu energiegeladenen Sets zwischen House, Tech House und Techno \u2013 offen im Stil, aber immer klar auf den Dancefloor ausgerichtet.<\/p>\n<p style=\"text-align: center;\">Roberta Deflorio verbindet dagegen den Sound der 80er mit Electro, Italo und Progressive House. Die in Italien geborene und in Berlin lebende DJ bewegt sich zwischen nostalgischen Synths, New Wave und elektronischen Club-Sounds \u2013 mal dunkel und hypnotisch, mal verspielt und voller Energie.<\/p>\n<p style=\"text-align: center;\">Freitag, 2. Oktober \u00b7 21 Uhr<br \/>AGENT! &amp; ROBERTA DEFLORIO<\/p>\n<div class=\"bt-check-sound\" style=\"margin-top: 25px!important;\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/><a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/agent\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><br \/><a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/roberta-deflorio-733952746\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a>\u00a0<\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_12 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_1 et_pb_image et_pb_module et_block_module bt-x-25\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-DJ-RobertaDeflorio-sw-02.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-DJ-RobertaDeflorio-sw-02-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-DJ-RobertaDeflorio-sw-02-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-DJ-RobertaDeflorio-sw-02-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-DJ-RobertaDeflorio-sw-02.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-8041\" alt=\"DJ Roberta Deflorio\" title=\"BarTausend-DJ-RobertaDeflorio-sw-02\" \/><\/span><\/div>\r\n<div class=\"et_pb_image_2 et_pb_image et_pb_module et_block_module bt-x-35\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Agent-sw.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Agent-sw-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Agent-sw-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Agent-sw-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Agent-sw.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-8098\" alt=\"Dj Agent!\" title=\"BarTausend-Dj-Agent!-sw\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_8 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-SpencerParker\">\r\n<div class=\"et_pb_column_13 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_12 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend House<\/h4>\n<h3>Sa | 03.10. | 21 H<\/h3>\n<h2>Spencer Parker<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2544553\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_14 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_13 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Von Londons Clubkultur bis in die Berliner Panorama Bar: Spencer Parker lebt House mit offenen Ohren und einem ausgepr\u00e4gten Gesp\u00fcr f\u00fcr den Dancefloor. Der in Berlin lebende Brite steht hinter dem Label Work Them Records und hat mit seinem BBC Radio 1 Essential Mix gezeigt, wie spannend sich House, Disco und Techno miteinander verbinden lassen.<\/p>\n<p style=\"text-align: center;\">F\u00fcr Parker darf ein House-Set weit \u00fcber Genregrenzen hinausgehen. Euphorische Disco-Momente treffen auf druckvolle Grooves, warme Sounds auf die rohe Energie von Techno. Genau diese musikalische Freiheit macht seine Sets so reizvoll: Sie \u00fcberraschen, ziehen an und halten in Bewegung.<\/p>\n<p style=\"text-align: center;\">Bei TAUSEND HOUSE k\u00f6nnt ihr diesen Sound aus n\u00e4chster N\u00e4he erleben. Ein international erprobter DJ in der intimen Atmosph\u00e4re unserer Bar \u2013 wo die Nacht schnell zum Morgen wird.<\/p>\n<p style=\"text-align: center;\">Samstag, 03. Oktober \u00b7 Spencer Parker \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\"  style=\"margin-top:25px!important;\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/><a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/spencerparker\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_15 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_3 et_pb_image et_pb_module et_block_module\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-SpencerParker-sw-01.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-SpencerParker-sw-01-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-SpencerParker-sw-01-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-SpencerParker-sw-01-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-SpencerParker-sw-01.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-7772\" alt=\"Dj Spencer Parker\" title=\"BarTausend-Dj-SpencerParker-sw-01\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_9 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-HouseQueens\">\r\n<div class=\"et_pb_column_16 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_14 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Electronica<\/h4>\n<h3>Do | 08.10. | 21 H<\/h3>\n<h2>House Queens<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2525265\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_17 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_15 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">HOUSE QUEENS bringt zwei DJs mit eigener musikalischer Handschrift an die Decks der Tausend. A.N.A.I.K.A. und LIZZN gestalten einen Abend, der House in den Mittelpunkt stellt \u2013 mit Raum f\u00fcr unterschiedliche Stimmungen, neue Impulse und die gemeinsame Energie auf dem Dancefloor.<\/p>\n<p style=\"text-align: center;\">Ab 22 Uhr er\u00f6ffnet A.N.A.I.K.A. die musikalische Nacht, bevor LIZZN um Mitternacht \u00fcbernimmt und bis 2 Uhr weiterspielt. Der Wechsel hinter den Decks bringt eine neue Perspektive, w\u00e4hrend die Nacht ihren Lauf nimmt.<\/p>\n<p style=\"text-align: center;\">HOUSE QUEENS geh\u00f6rt zu den langj\u00e4hrigen Zusammenarbeiten unserer Bar und lebt vom Zusammenspiel aus Musik, vertrauten Gesichtern und neuen Begegnungen. Dazu begleitet Kitchen.Lab.Berlin den Abend mit einem Oyster Menu. Kommt mit euren Lieblingsmenschen, sto\u00dft an und lasst euch von A.N.A.I.K.A. und LIZZN auf den Dancefloor ziehen.<\/p>\n<p style=\"text-align: center;\">Donnerstag, 08. Oktober \u00b7 HOUSE QUEENS<br \/>Einlass ab 21 Uhr<\/p>\n<div class=\"bt-check-sound\" style=\"margin-top: 25px!important;\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/><a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/housequeens\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/anaiika\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_18 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_4 et_pb_image et_pb_module et_block_module bt-x-60\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Lizzn-01-sw-01.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Lizzn-01-sw-01-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Lizzn-01-sw-01-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Lizzn-01-sw-01-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Lizzn-01-sw-01.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-7822\" alt=\"Dj Lizzn\" title=\"BarTausend-Dj-Lizzn-01-sw-01\" \/><\/span><\/div>\r\n<div class=\"et_pb_image_5 et_pb_image et_pb_module et_block_module bt-x-60\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-Anaika-02.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-Anaika-02-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-Anaika-02-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-Anaika-02-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-Anaika-02.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-8445\" alt=\"Dj Anaika\" title=\"BarTausend-Dj-Anaika-02\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_10 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-CarlaValenti\">\r\n<div class=\"et_pb_column_19 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_16 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend House<\/h4>\n<h3>Fr | 09.10. | 21 H<\/h3>\n<h2>Carla Valenti<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2552196\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_20 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_17 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Die chilenische DJ und Produzentin bewegt sich zwischen House, Afro, Latin, Downtempo und Techno. Warme Grooves, melodische Elemente und viel Percussion treffen dabei auf Einfl\u00fcsse s\u00fcdamerikanischer Folklore und zeitgen\u00f6ssischer Clubmusik.<\/p>\n<p style=\"text-align: center;\">Valenti lebt heute in Barcelona und ist seit vielen Jahren international als DJ und Produzentin unterwegs. Ihre Sets verbinden Herkunft und Gegenwart, organische Rhythmen und elektronische Strukturen \u2013 vielseitig, warm und konsequent auf den Dancefloor ausgerichtet.<\/p>\n<p style=\"text-align: center;\">Freitag, 9. Oktober \u00b7 CARLA VALENTI \u00b7 21 Uhr\n<\/p>\n<div class=\"bt-check-sound\"  style=\"margin-top:22px!important;\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/carlavalenti\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_21 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_6 et_pb_image et_pb_module et_block_module\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-CarlaValentini-sw-02.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-CarlaValentini-sw-02-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-CarlaValentini-sw-02-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-CarlaValentini-sw-02-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-CarlaValentini-sw-02.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-8443\" alt=\"Dj Carla Valentini\" title=\"BarTausend-Dj-CarlaValentini-sw-02\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_11 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-TommesKBrandt\">\r\n<div class=\"et_pb_column_22 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_18 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend House<\/h4>\n<h3>Sa | 10.10. | 21 H<\/h3>\n<h2>Tommes K. Brandt<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2550445\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_23 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_19 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Tommes K. Brandt bewegt sich zwischen House, Disco und Soul und verbindet klassische Einfl\u00fcsse mit zeitgen\u00f6ssischen Club-Sounds. Seine Sets leben von warmen Grooves, offenen Selections und einem direkten Gef\u00fchl f\u00fcr den Dancefloor \u2013 mal soulful und verspielt, mal treibender und klar auf die Nacht ausgerichtet.<\/p>\n<p style=\"text-align: center;\">Als Mitgr\u00fcnder von A-Side Berlin steht er f\u00fcr einen House-Sound, der klassische House-Momente mit Disco- und Soul-Einfl\u00fcssen zusammenbringt. Bei TAUSEND HOUSE f\u00fchrt Tommes K. Brandt diese Linie hinter der T\u00fcr des Tausend weiter \u2013 groovig, warm und mit viel Raum f\u00fcr Bewegung.<\/p>\n<p style=\"text-align: center;\">\nSamstag, 10. Oktober \u00b7 TOMMES K. BRANDT \u00b7 21 Uhr\n<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/user-67637181\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_24 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_7 et_pb_image et_pb_module et_block_module\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-TommesKBrandt-sw.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-TommesKBrandt-sw-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-TommesKBrandt-sw-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-TommesKBrandt-sw-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-TommesKBrandt-sw.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-8105\" alt=\"Dj Tommes K. Brandt\" title=\"BarTausend-Dj-TommesKBrandt-sw\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_12 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-CarlaValenti\">\r\n<div class=\"et_pb_column_25 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_20 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Live<\/h4>\n<h3>Mi | 14.10. | 21 H<\/h3>\n<h2>Olla &amp; The Groove Markers<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2552546\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_26 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_21 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Olla &amp; The Groove Markers verbinden zeitlosen Soul und Funk mit Jazz, starken Grooves und einer ordentlichen Portion Live-Energie. Inspiriert von Artists wie Stevie Wonder, James Brown, Aretha Franklin, Chaka Khan und Prince bewegt sich die Band zwischen warmen Soul-Momenten, funkgetriebenen Rhythmen und spontaner Improvisation.<\/p>\n<p style=\"text-align: center;\">Im Mittelpunkt steht die Berliner S\u00e4ngerin Olla, deren vielseitige Stimme sich m\u00fchelos zwischen Soul, Jazz und Blues bewegt. Gemeinsam mit ihrer Band entsteht daraus ein lebendiger, druckvoller Sound, der nicht nur zum Zuh\u00f6ren gedacht ist \u2013 sondern ganz klar auch f\u00fcr den Dancefloor.<\/p>\n<p style=\"text-align: center;\">Mittwoch, 14. Oktober \u00b7 Olla &amp; The Groove Markers \u00b7 21 Uhr<\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_27 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_8 et_pb_image et_pb_module et_block_module bt-x-30\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-OllaTheGrooveMakers-sw-01.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-OllaTheGrooveMakers-sw-01-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-OllaTheGrooveMakers-sw-01-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-OllaTheGrooveMakers-sw-01-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-OllaTheGrooveMakers-sw-01.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-8043\" alt=\"Olla &amp; The Groove Makers\" title=\"BarTausend-Dj-Olla&amp;TheGrooveMakers-sw-01\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_13 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-CarlaValenti\">\r\n<div class=\"et_pb_column_28 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_22 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Electronica<\/h4>\n<h3>Do | 15.10. | 21 H<\/h3>\n<h2>Butterhands<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2552949\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_29 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_23 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Butterhands bewegt sich zwischen House und Techno, warmen Grooves und fein ausgew\u00e4hlten Tracks mit viel Gef\u00fchl f\u00fcr Dynamik und Atmosph\u00e4re. Aus der Berliner Clubszene heraus entwickelte sie ihren eigenen, neugierigen Zugang zum DJing \u2013 mit Sets, die weniger auf starre Genregrenzen als auf Flow, Spannung und den richtigen Moment setzen.<\/p>\n<p style=\"text-align: center;\">In den vergangenen Monaten war Butterhands unter anderem bei H\u00d6R sowie gemeinsam mit Thabo bei Refuge Worldwide zu h\u00f6ren und spielte auf verschiedenen Berliner Floors. Ihr Sound bleibt dabei direkt und groovig, mit gen\u00fcgend Raum f\u00fcr unerwartete Wendungen und lange N\u00e4chte.<\/p>\n<p style=\"text-align: center;\">Donnerstag, 15. Oktober \u00b7 Butterhands \u00b7 21 Uhr\n<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/user-141990593-173542591\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_30 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_9 et_pb_image et_pb_module et_block_module bt-x-40\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Butterhands-sw.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Butterhands-sw-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Butterhands-sw-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Butterhands-sw-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Butterhands-sw.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-8045\" alt=\"Dj Butterhands\" title=\"BarTausend-Dj-Butterhands-sw\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_14 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-CarlaValenti\">\r\n<div class=\"et_pb_column_31 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_24 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Le Salon Priv\u00e9<\/h4>\n<h3 data-bt-start=\"2026-10-17T00:00:00\">Fr | 16.10. | 24 H<\/h3>\n<h2>Cedric Marian &amp; Le TIZI<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2560000\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_32 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_25 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>Cedric Marian und Le TIZI kommen f\u00fcr die n\u00e4chste Ausgabe von Le Salon Priv\u00e9 zusammen. Die gemeinsame Session beginnt um Mitternacht.<\/p>\n<p>Wichtiger Hinweis: Zun\u00e4chst findet eine geschlossene Veranstaltung statt. Der \u00f6ffentliche Abend beginnt um 00:00 Uhr.<\/p>\n<p>Freitag, 16. Oktober \u00b7 Cedric Marian &amp; Le TIZI \u00b7 ab 24 Uhr.<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/cedricmarianalexander\/cedric-marian-le-salon-prive\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_33 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_10 et_pb_image et_pb_module et_block_module bt-x-50 bt-y-50\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/bar-tausend-cedric-marian-archiv-v01.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/bar-tausend-cedric-marian-archiv-v01-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/bar-tausend-cedric-marian-archiv-v01-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/bar-tausend-cedric-marian-archiv-v01-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/bar-tausend-cedric-marian-archiv-v01.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-8782\" alt=\"Cedric Marian \u2013 DJ bei Bar Tausend Berlin\" title=\"Cedric Marian \u00b7 Le Salon Priv\u00e9 \u00b7 Bar Tausend Berlin\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_15 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-ShirKhan\">\r\n<div class=\"et_pb_column_34 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_26 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend House<\/h4>\n<h3>Sa | 17.10. | 21 H<\/h3>\n<h2>Shir Khan<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2552838\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_35 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_27 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Shir Khan geh\u00f6rt seit vielen Jahren zu den pr\u00e4genden Pers\u00f6nlichkeiten der Berliner House- und Disco-Szene. Als DJ, Produzent und Gr\u00fcnder von Exploited Records steht er f\u00fcr einen eigenst\u00e4ndigen Sound zwischen House, Disco, Balearic und Indie Dance \u2013 groovegetrieben, detailreich und voller Charakter.<\/p>\n<p style=\"text-align: center;\">Seine Sets leben von \u00fcberraschenden \u00dcberg\u00e4ngen, warmen Grooves und einem feinen Gesp\u00fcr f\u00fcr Atmosph\u00e4re. Zwischen funky Disco-Momenten, deepen House-Vibes und modernen elektronischen Einfl\u00fcssen entsteht ein hypnotischer Flow, der sich langsam aufbaut und den Dancefloor \u00fcber Stunden tr\u00e4gt.<\/p>\n<p style=\"text-align: center;\">Samstag, 17. Oktober \u00b7 SHIR KHAN \u00b7 21 Uhr\n<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/shirkhan\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_36 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_11 et_pb_image et_pb_module et_block_module\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-ShirKhan-sw-02.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-ShirKhan-sw-02-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-ShirKhan-sw-02-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-ShirKhan-sw-02-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-ShirKhan-sw-02.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-7824\" alt=\"Dj Shir Khan\" title=\"BarTausend-Dj-ShirKhan-sw-02\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_16 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-YasminUmay\">\r\n<div class=\"et_pb_column_37 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_28 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Live<\/h4>\n<h3>Mi | 21.10. | 21 H<\/h3>\n<h2>Yasmin Umay &amp; Afrodisiac<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2561338\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_38 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_29 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Yasmin Umay verbindet R&B, Neo-Soul, Hip-Hop und Jazz zu einem warmen, pers\u00f6nlichen Sound, der die \u00c4sthetik der 90er mit einer modernen musikalischen Handschrift zusammenbringt. Die in Berlin lebende S\u00e4ngerin und Songwriterin bewegt sich zwischen souliger Intimit\u00e4t, laid-back Grooves und feinen Hip-Hop-Einfl\u00fcssen. Zu ihren musikalischen Referenzen z\u00e4hlen unter anderem Erykah Badu, Lauryn Hill, Mos Def und J Dilla.<\/p>\n<p style=\"text-align: center;\">Mit ihrer EP \u201eCircles\u201c und weiteren Ver\u00f6ffentlichungen hat sie ihren eigenen Sound zwischen Vergangenheit und Gegenwart entwickelt. Als Resident bei Refuge Worldwide pr\u00e4sentiert sie au\u00dferdem ihre eigene Radioshow \u201eGeminithingz\u201c und war bereits auf B\u00fchnen und Festivals in Deutschland, Frankreich, der Schweiz und Mexiko zu erleben.<\/p>\n<p style=\"text-align: center;\">Erg\u00e4nzt wird der Live-Abend durch ein DJ-Set von Afrodisiac. Die Berliner DJ und Musikkuratorin sch\u00f6pft aus den vielf\u00e4ltigen Linien Schwarzer Musik und verbindet eine erz\u00e4hlerische Auswahl mit souliger, offener Energie. So f\u00fchrt der Abend von Yasmin Umays Live-Sound weiter auf den Dancefloor.<\/p>\n<p style=\"text-align: center;\">Mittwoch, 21. Oktober \u00b7 Yasmin Umay \u00b7 Live + Afrodisiac \u00b7 DJ-Set \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/><a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/refugeworldwide\/b2b-day-2023-abiba-yasmin-umay\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/refugeworldwide\/cosy-crates-take-over-asa-20\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"Afrodisiac auf SoundCloud\" aria-label=\"Afrodisiac auf SoundCloud\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_39 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_12 et_pb_image et_pb_module et_block_module bt-x-30\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-YasminUmay-sw-01.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-YasminUmay-sw-01-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-YasminUmay-sw-01-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-YasminUmay-sw-01-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-YasminUmay-sw-01.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-8741\" alt=\"Dj Yasmin Umay\" title=\"BarTausend-Dj-YasminUmay-sw-01\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_17 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-MrNylson\">\r\n<div class=\"et_pb_column_40 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_30 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Electronica<\/h4>\n<h3>Do | 22.10. | 21 H<\/h3>\n<h2>Mr. Nylson<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2560083\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_41 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_31 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Willkommen in Mr. Nylsons Paralleluniversum: Hier geben Bass und Rhythmus den Takt vor, w\u00e4hrend House und elektronische Sounds auf Funk-Energie und eine gute Portion \u00dcbermut treffen. F\u00fcr TAUSEND ELECTRONICA bringt er diese verspielte Idee auf den Dancefloor.<\/p>\n<p style=\"text-align: center;\">Seine Ansage ist kosmisch, der Auftrag klar: Grooves, Bewegung und eine Nacht mit Humor. Am 22. Oktober steht Mr. Nylson an den Decks der Bar Tausend \u2013 ab 21 Uhr.<\/p>\n<p style=\"text-align: center;\">Donnerstag, 22. Oktober \u00b7 Mr. Nylson \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/><a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/misternylson\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_42 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_13 et_pb_image et_pb_module et_block_module bt-x-20\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-MrNylson-sw-03.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-MrNylson-sw-03-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-MrNylson-sw-03-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-MrNylson-sw-03-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-MrNylson-sw-03.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-7827\" alt=\"Dj Mr. Nylson\" title=\"BarTausend-Dj-MrNylson-sw-03\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_18 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-MrNylson\">\r\n<div class=\"et_pb_column_43 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_32 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Yacht Week Party<\/h4>\n<h3>Fr | 23.10. | 21 H<\/h3>\n<h2>Bombata &amp; Florian Kepler &amp; Mambi Dexter<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2544504\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_44 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_33 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>Am 23. Oktober bringt The Yacht Week ihre Crew nach Berlin. Unter den verspiegelten Decken des Tausend treffen Erinnerungen an Europas K\u00fcsten auf eine Nacht mit House und Tech House.<\/p>\n<p>Bombata, Florian Kepler und Mambi Dexter spielen DJ-Sets. Willkommen sind langj\u00e4hrige Yacht-Week-G\u00e4ste ebenso wie alle, die die Community neu kennenlernen m\u00f6chten \u2013 zum Tanzen, Ansto\u00dfen und f\u00fcr Begegnungen mitten in Berlin.<\/p>\n<p>Freitag, 23. Oktober 2026 \u00b7 Bombata, Florian Kepler &amp; Mambi Dexter \u00b7 ab 21 Uhr.<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/><a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/bennybombata\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Bombata auf SoundCloud\"><\/a><br \/><a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/mambidexter\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Mambi Dexter auf SoundCloud\"><\/a><br \/><a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/open.spotify.com\/artist\/3P723D8QnhhNlOxN4tMAyW\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Florian Kepler auf Spotify\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_45 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_14 et_pb_image et_pb_module et_block_module\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Bombata-sw.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Bombata-sw-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Bombata-sw-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Bombata-sw-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Bombata-sw.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-8048\" alt=\"Dj Bombata\" title=\"BarTausend-Dj-Bombata-sw\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_19 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-MrNylson\">\r\n<div class=\"et_pb_column_46 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_34 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend House<\/h4>\n<h3>Sa | 24.10. | 21 H<\/h3>\n<h2>Caren Callas<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2563517\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_47 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_35 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Caren Callas steht f\u00fcr treibenden House mit viel Gef\u00fchl f\u00fcr Groove, Energie und den richtigen Moment auf dem Dancefloor. Gepr\u00e4gt vom Berliner Nachtleben entwickelte sie ihren eigenen Zugang zu House \u2013 direkt, warm und mit einer klaren Verbindung zwischen DJ und Publikum. <\/p>\n<p style=\"text-align: center;\">\nAuch als Teil der Golden House Sisters bewegt sie sich zwischen House, Disco und Soul und verbindet klassische Einfl\u00fcsse mit aktuellen, druckvollen Produktionen. Genau diese Mischung pr\u00e4gt auch ihre Sets: positiv, tanzbar und immer in Bewegung. <\/p>\n<p style=\"text-align: center;\">Samstag, 24. Oktober \u00b7 CAREN CALLAS \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/><a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/carencallas\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_48 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_15 et_pb_image et_pb_module et_block_module bt-x-25\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-CarenCallas-sw.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-CarenCallas-sw-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-CarenCallas-sw-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-CarenCallas-sw-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-CarenCallas-sw.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-8049\" alt=\"Dj Caren Callas\" title=\"BarTausend-Dj-CarenCallas-sw\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_20 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-FrankieBalou\">\r\n<div class=\"et_pb_column_49 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_36 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Live<\/h4>\n<h3>Mi | 28.10. | 21 H<\/h3>\n<h2>Frankie Balou &amp; Band<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2565005\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_50 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_37 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>Frankie Balou kommt mit ihrer Band zur\u00fcck in die Tausend. Ihre Stimme tr\u00e4gt die W\u00e4rme des Soul und die raue Tiefe des Blues \u2013 samtig, ausdrucksstark und voller Pers\u00f6nlichkeit. Gemeinsam mit ihrer Band bringt die Berliner S\u00e4ngerin und Songwriterin neue, bislang unver\u00f6ffentlichte Songs und eine pers\u00f6nliche Auswahl ihrer Lieblingscover auf die B\u00fchne. Jazz und elektronische Einfl\u00fcsse \u00f6ffnen den Sound, w\u00e4hrend ihre Stimme und die Geschichten ihrer Songs im Mittelpunkt bleiben.<\/p>\n<p>Auch jenseits der B\u00fchne verbindet Frankie unterschiedliche musikalische Welten. Auf \u201eConnections\u201c von Sharam Jey &amp; Jon Sine und \u201eTime After Time\u201c von LUNAZ ist ihre Stimme in elektronischen Produktionen zu h\u00f6ren. Bei TAUSEND LIVE erleben wir sie im direkten Zusammenspiel mit ihrer Band: nah, warm und kraftvoll.<\/p>\n<p>Nach dem Konzert \u00fcbernimmt S\u00d8LOWAY die Decks. Der Berliner DJ f\u00fchrt den Abend mit souligem Groove, gebrochenen Rhythmen und tiefen B\u00e4ssen weiter \u2013 zwischen Breakbeat, Bass und Deep House. Aus dem Live-Abend wird eine lange Nacht.<\/p>\n<p>Mittwoch, 28. Oktober \u00b7 Einlass 21 Uhr \u00b7 Konzert 22:30 Uhr \u00b7 anschlie\u00dfend DJ-Set von S\u00d8LOWAY<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/><a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/sharamjey\/sharam-jey-jon-sine-feat\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_51 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_16 et_pb_image et_pb_module et_block_module bt-x-25\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-FrankieBalou-sw.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-FrankieBalou-sw-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-FrankieBalou-sw-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-FrankieBalou-sw-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-FrankieBalou-sw.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-8406\" alt=\"Singer Frankie Balou\" title=\"BarTausend-Dj-FrankieBalou-sw\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_21 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-Shveba\">\r\n<div class=\"et_pb_column_52 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_38 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Electronica<\/h4>\n<h3>Do | 29.10. | 21 H<\/h3>\n<h2>Shveba<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2564945\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_53 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_39 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">SHVEBA ist ein DJ-Duo aus Tbilisi, bestehend aus Gio Gugava und Sandro Ramishvili. Seit 2019 bewegen sich die beiden zwischen House, Disco und Minimal und verbinden warme Grooves mit jazzigen, deepen Elementen und einem verspielten, zugleich treibenden Flow.<\/p>\n<p style=\"text-align: center;\">Ihre Sets leben von einer offenen Selection, in der klassische House-Einfl\u00fcsse auf reduzierte Rhythmen und unerwartete Disco-Momente treffen. Nach Auftritten in der georgischen Clubszene und in Berlin kommt SHVEBA nun ins Tausend \u2013 groovig, flie\u00dfend und mit einem klaren Gesp\u00fcr f\u00fcr den Dancefloor.<\/p>\n<p style=\"text-align: center;\">Donnerstag, 29. Oktober \u00b7 SHVEBA \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/shveba\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_54 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_17 et_pb_image et_pb_module et_block_module\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Shveba-sw-01.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Shveba-sw-01-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Shveba-sw-01-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Shveba-sw-01-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Shveba-sw-01.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-7826\" alt=\"Dj Shveba\" title=\"BarTausend-Dj-Shveba-sw-01\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_22 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"LeSalonPrive-20261030\">\r\n<div class=\"et_pb_column_55 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_40 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Le Salon Priv\u00e9<\/h4>\n<h3 data-bt-start=\"2026-10-30T21:00:00\">Fr | 30.10. | 21 H<\/h3>\n<h2>Raga &amp; Victor Felisa<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2571148\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_56 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_41 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>London, Jakarta and Ibiza meet Berlin nightlife: Raga and Victor Felisa come to Tausend for the next edition of LE SALON PRIV\u00c9. Raga is at home between London and Jakarta, while Victor Felisa brings his connection to Ibiza.<\/p>\n<p>Raga combines DJing with creative direction, fashion and event production. For the Bangka opening party in Jakarta, supported by Zodiac and Hotel Monopoli, he brought the energy of British warehouse parties to the city \u2014 bringing people together is part of his approach to music.<\/p>\n<p>Victor Felisa was born in Paris and grew up on Ibiza. Bob Sinclar and Daft Punk accompanied his school runs; today, those early house influences meet the energy of tech house. His recent highlights include a six-hour set at H\u00ef Ibiza\u2019s Wild Corner and the Tomorrowland Store\u2019s Rooftop Sessions on Ibiza, including the season\u2019s closing event.<\/p>\n<p>Behind the unassuming door, these influences become a night of carefully selected electronic sounds, encounters and long hours on the dancefloor. Close to the crowd and right in the moment \u2014 with the intimate atmosphere that defines LE SALON PRIV\u00c9.<\/p>\n<p>Friday, 30 October \u00b7 Raga &amp; Victor Felisa<br \/>From 9 PM.<\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_57 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_18 et_pb_image et_pb_module et_block_module bt-x-50 bt-y-50 bt-salon-shift-right-50\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-LeSalonPrive-Archiv-Filter-01-2026-10.webp\" width=\"1254\" height=\"1254\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-LeSalonPrive-Archiv-Filter-01-2026-10-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-LeSalonPrive-Archiv-Filter-01-2026-10-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-LeSalonPrive-Archiv-Filter-01-2026-10-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-LeSalonPrive-Archiv-Filter-01-2026-10.webp 1254w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-9227\" alt=\"Le Salon Priv\u00e9\" title=\"Le Salon Priv\u00e9\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_23 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-Shveba\">\r\n<div class=\"et_pb_column_58 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_42 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Monochrome Masquerade<\/h4>\n<h3>Sa | 31.10. | 21 H<\/h3>\n<h2>Sado Opera<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2557799\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_59 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_43 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>Mitte Daily l\u00e4dt zur Monochrome Masquerade mit SADO OPERA: eine Halloween-Nacht in Schwarz und Wei\u00df mit Disco, Boogie und Electro-Funk.<\/p>\n<p>Auf die einst\u00fcndige Live-Show mit Gesang, Keyboard und Kontrabass folgt ein DJ-Set f\u00fcr den Rest der Nacht.<\/p>\n<p>Samstag, 31. Oktober \u00b7 Einlass 21 Uhr \u00b7 Show 23 Uhr<\/p>\n<p>Dresscode: Schwarz und Wei\u00df. Bei dieser Veranstaltung werden Fotos gemacht.<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/sado-opera\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_60 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_19 et_pb_image et_pb_module et_block_module\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-SadoOpera-sw.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-SadoOpera-sw-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-SadoOpera-sw-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-SadoOpera-sw-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-SadoOpera-sw.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-8050\" alt=\"Sado Opera\" title=\"BarTausend-SadoOpera-sw\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_24 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"LIVE-GustavAnders-20261104\">\r\n<div class=\"et_pb_column_61 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_44 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Live<\/h4>\n<h3>Mi | 04.11. | 21 H<\/h3>\n<h2>Gustav Anders<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2571155\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_62 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_45 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>Jazz in his instincts, electronic music in his ears and the piano at the centre: Gustav Anders moves between expressive harmonies, free improvisation and a subtle feel for groove.<\/p>\n<p>The Berlin pianist, keyboardist and producer studied jazz piano in Dresden. His musical voice brings together jazz and classical influences with hip-hop and the electronic culture of his hometown. The hand-played instrument remains central \u2014 with space for small details, unexpected turns and melodies that linger.<\/p>\n<p>Raised between the Oderbruch landscape and Berlin\u2019s nights, Gustav connects open space with the pulse of the city. Ostgut Ton, late-night jazz sessions in Kreuzberg\u2019s corner shops and the digital awakening of the early 2000s shape this perspective. His melancholic, ethereal compositions remain warm and rhythmically present. Whether solo at the piano or in a trio, each phrase has room to resonate.<\/p>\n<p>Alongside his own music, Gustav has worked with artists such as Dario Lessing, Tom Gregory and Alvaro Soler. As a producer and musician, he brings different musical worlds together while preserving their individual character.<\/p>\n<p>On Wednesday, we welcome Gustav Anders to Tausend. An evening for open ears, warm sounds and the pleasure of being carried away by music.<\/p>\n<p>Wednesday, 4 November \u00b7 Gustav Anders<br \/>Doors from 9 PM \u00b7 Concert at 10:30 PM \u00b7 DJ set afterwards<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><a href=\"https:\/\/open.spotify.com\/intl-de\/artist\/2XxerMANX0agr5C83zwgfy\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Gustav Anders auf Spotify \u00f6ffnen\">Spotify<\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_63 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_20 et_pb_image et_pb_module et_block_module bt-x-20\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img decoding=\"async\" src=\"https:\/\/sherdin.de\/wp-content\/uploads\/2026\/11\/BarTausend-GustavAnders-sw.webp\" alt=\"Gustav Anders \u00b7 Pianist bei Bar Tausend\" title=\"Gustav Anders \u00b7 Bar Tausend\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_25 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-ShirKhan\">\r\n<div class=\"et_pb_column_64 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_46 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Live<\/h4>\n<h3>Mi | 23.12. | 21 H<\/h3>\n<h2>Dario Lessing<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_65 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_47 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Dario Lessing verbindet Klavier, elektronische Klangwelten und moderne Produktion zu einem atmosph\u00e4rischen Sound zwischen Neo-Klassik, Ambient und Lo-Fi. Der Berliner Pianist, Komponist und Produzent bewegt sich dabei ganz selbstverst\u00e4ndlich zwischen klassischer Ausbildung und zeitgen\u00f6ssischer elektronischer Musik. <\/p>\n<p style=\"text-align: center;\">Seine St\u00fccke leben von reduzierten Melodien, warmen Fl\u00e4chen und einer fast filmischen Atmosph\u00e4re. Mit Ver\u00f6ffentlichungen auf Labels wie Lofi Girl und einem umfangreichen Katalog aus Soloarbeiten und Kollaborationen hat Lessing einen eigenen Sound entwickelt, der leise Momente genauso zul\u00e4sst wie gro\u00dfe, emotionale Spannungsb\u00f6gen.<\/p>\n<p style=\"text-align: center;\">Mittwoch, 23. Dezember \u00b7 Dario Lessing \u00b7 21 Uhr\n<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/dario-lessing\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Dario Lessing auf SoundCloud\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_66 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_21 et_pb_image et_pb_module et_block_module bt-x-20\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-DarioLessing-sw.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-DarioLessing-sw-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-DarioLessing-sw-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-DarioLessing-sw-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-DarioLessing-sw.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-8047\" alt=\"Dj Dario Lessing\" title=\"BarTausend-Dj-DarioLessing-sw\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_26 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-HeSawYou-20261105\">\r\n<div class=\"et_pb_column_67 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_48 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Electronica<\/h4>\n<h3>Do | 05.11. | 21 H<\/h3>\n<h2>heSAWyou<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2571085\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_68 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_49 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>From Mexico City, heSAWyou brings a detailed house sound to Tausend: stripped-back rhythms, organic textures and a feel for the small shifts that make a groove come alive. The Mexican-Lebanese DJ and producer moves between deep house, minimal and micro-house, giving his sets time to unfold. Two decades in Mexico City\u2019s underground and a taste for acid and disco broaden this musical perspective.<\/p>\n<p>Neben seinen eigenen Produktionen gestaltet er mit RAWmance und dem heSAWyou Podcast Plattformen f\u00fcr elektronische Musik. Seine Aufnahmen aus Clubs wie Tempo und dem Sisyphos zeigen diese offene Perspektive: konzentriert in der Auswahl, beweglich im Rhythmus und mit viel Raum f\u00fcr eine lange Nacht.<\/p>\n<p>With \u201cComing To You\u201d on RAWmance, featured by Mixmag Latin America, he combines Chicago-inspired rhythms with soulful vocals. \u201cSo High\u201d and his remix of Dimaio\u2019s \u201cS\u00edntesis\u201d reveal further sides of his work beyond the decks.<\/p>\n<p>RAWmance also releases music by Timid Boy and Eddie Leader. His monthly heSAWyou Podcast Showcase on Bloop London has welcomed guests including Homero Espinosa and Timid Boy; as booking manager at Terraza Catedral, he remains closely connected to his hometown\u2019s club scene.<\/p>\n<p>Donnerstag, 5. November \u00b7 heSAWyou \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/hesawyou\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"heSAWyou auf SoundCloud\" aria-label=\"heSAWyou auf SoundCloud\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_69 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_22 et_pb_image et_pb_module et_block_module bt-x-50\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-HeSawYou-sw-01-lineup.webp\" alt=\"heSAWyou \u00b7 Bar Tausend\" title=\"heSAWyou \u00b7 Bar Tausend\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_27 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-Muege-EcrinHazer-Sianza-20261106\">\r\n<div class=\"et_pb_column_70 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_50 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend House<\/h4>\n<h3>Fr | 06.11. | 21 H<\/h3>\n<h2>Lady Oelectric &amp; Sianza<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2575246\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_71 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_51 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>Zwei Perspektiven auf eine gemeinsame Nacht: Lady Oelectric und Sianza treffen bei TAUSEND HOUSE aufeinander. Lady Oelectric pr\u00e4gt den Abend mit ihrer eigenen musikalischen Handschrift. Sianza bringt Deep und Soulful House sowie synthgetriebene Clubmusik in diese Begegnung.<\/p>\n<p>Hier darf House in unterschiedliche Richtungen wachsen. Zwischen schwebenden Passagen, kantigen Sounds und direkten Rhythmen entsteht ein Abend, der von der Auswahl der beiden Artists lebt \u2013 und von den \u00dcberg\u00e4ngen zwischen ihren musikalischen Welten.<\/p>\n<p>Freitag, 6. November \u00b7 Lady Oelectric &amp; Sianza \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/sianza\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"Sianza auf SoundCloud\" aria-label=\"Sianza auf SoundCloud\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_72 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_23 et_pb_image et_pb_module et_block_module bt-x-50\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-LadyOelectric-sw.webp\" alt=\"Lady Oelectric \u00b7 Bar Tausend\" title=\"Lady Oelectric \u00b7 Bar Tausend\" \/><\/span><\/div>\r\n<div class=\"et_pb_image_24 et_pb_image et_pb_module et_block_module bt-x-50\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-Miszo-sw.webp\" alt=\"Miszo \u00b7 Bar Tausend\" title=\"Miszo \u00b7 Bar Tausend\" \/><\/span><\/div>\r\n<div class=\"et_pb_image_25 et_pb_image et_pb_module et_block_module bt-x-50\"><span class=\"et_pb_image_wrap\"><img decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-Sianza-sw.webp\" alt=\"Sianza \u00b7 Bar Tausend\" title=\"Sianza \u00b7 Bar Tausend\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_28 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-Shveba\">\r\n<div class=\"et_pb_column_73 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_52 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend House<\/h4>\n<h3>Sa | 07.11. | 21 H<\/h3>\n<h2>Dilby<\/h2>\n<p><a href=\"https:\/\/ra.co\/events\/2571124\" target=\"_blank\" rel=\"noopener noreferrer\">Event \u00f6ffnen<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_74 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_53 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>Dilby verbindet klassischen House mit deepen Grooves, warmen Fl\u00e4chen und einem modernen, druckvollen Sound. Der aus Neuseeland stammende und in Berlin lebende DJ und Produzent bewegt sich zwischen House, Deep House und Tech House \u2013 musikalisch detailreich, hypnotisch und konsequent auf den Dancefloor ausgerichtet. <\/p>\n<p>Since moving to Berlin in 2012, Dilby has played internationally and released on labels such as 8bit, Crosstown Rebels, Saved Records and Kling Klong. His catalogue also includes releases on Bondage Music, Toolroom and Glasgow Underground. His sets thrive on fluid transitions, deep basslines and a groove that builds gradually and carries through the night.<\/p>\n<p>\u201cRemember Me\u201d reached number one on Beatport\u2019s Deep House chart. As co-founder of Narratives, Dilby also creates space for new music: \u201cConfusion\u201d with Amine K combines driving house rhythms with an uplifting vocal hook. Together with Danny Howells, he released \u201cFlyover \/ Soul Drive\u201d on Selador.<\/p>\n<p>\u201cD\u00e9epalma Spotlight: Dilby\u201d brings together 17 of his productions, including \u201cLift Me Up\u201d with nineteen79. Between deeper late-night tracks and energetic house cuts, his feel for melody and movement remains the connecting thread.<\/p>\n<p>Samstag, 7. November \u00b7 DILBY \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/dilbydj\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_75 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_26 et_pb_image et_pb_module et_block_module\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-260404-Dilby-sw.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-260404-Dilby-sw-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-260404-Dilby-sw-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-260404-Dilby-sw-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-260404-Dilby-sw.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-8407\" alt=\"Dj Dilby\" title=\"BarTausend-260404-Dilby-sw\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_29 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-Shveba\">\r\n<div class=\"et_pb_column_76 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_54 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Live<\/h4>\n<h3>Mi | 11.11. | 21 H<\/h3>\n<h2>Tigerskin<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_77 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_55 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Tigerskin ist das Alias des Berliner Produzenten Alex Kr\u00fcger, der auch als Dub Taylor seit vielen Jahren zu den festen Gr\u00f6\u00dfen der elektronischen Szene geh\u00f6rt. Sein Sound bewegt sich zwischen deepem House, Dub und Techno \u2013 warm, detailreich und getragen von pr\u00e4zisen Grooves, die sich mit viel Ruhe und Tiefe entwickeln.<\/p>\n<p style=\"text-align: center;\">\nSeit den 1990er-Jahren hat Kr\u00fcger unter verschiedenen Namen eine umfangreiche Diskografie aufgebaut und unter anderem auf Dirt Crew Recordings, Dessous, Suol und Moodmusic ver\u00f6ffentlicht. Als Tigerskin verbindet er diese lange Studioerfahrung mit einem flie\u00dfenden, hypnotischen Sound, der sich ganz selbstverst\u00e4ndlich auf den Dancefloor \u00fcbertr\u00e4gt. <\/p>\n<p style=\"text-align: center;\">\nMittwoch, 11. November \u00b7 TIGERSKIN \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/dub-taylor\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_78 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_27 et_pb_image et_pb_module et_block_module\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-Tigerskin-sw.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-Tigerskin-sw-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-Tigerskin-sw-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-Tigerskin-sw-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Dj-Tigerskin-sw.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-8408\" alt=\"Dj Tigerskin aka Dub Taylor\" title=\"BarTausend-Dj-Tigerskin-sw\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_30 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-CCTV-20261112\">\r\n<div class=\"et_pb_column_79 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_56 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Electronica<\/h4>\n<h3>Do | 12.11. | 21 H<\/h3>\n<h2>CCTV<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_80 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_57 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>Electro mit Ecken und Kanten, treibender Techno und die Energie des US-Undergrounds: CCTV bringt eine rhythmisch direkte Auswahl in die Tausend. Gebrochene Beats und elektronische Spannung \u00f6ffnen den Raum f\u00fcr eine Nacht, die neugierig bleibt und nach vorne zieht.<\/p>\n<p>Die DJ ist in der Chicagoer Clubszene unterwegs und war unter anderem bei Veranstaltungen im smartbar und Podlasie Club zu h\u00f6ren. Auch in Berlin ist sie bereits auf Lineups vertreten. Ihre bisherigen Auftritte bewegen sich zwischen Electro, Techno und weiteren Spielarten elektronischer Clubmusik \u2013 mit Raum f\u00fcr wechselnde Rhythmen und unerwartete Verbindungen.<\/p>\n<p>Bei TAUSEND ELECTRONICA steht am 12. November diese offene Clubperspektive im Mittelpunkt: Musik mit Charakter, Energie und einem Gesp\u00fcr f\u00fcr Bewegung.<\/p>\n<p>Donnerstag, 12. November \u00b7 CCTV \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/c_c_t_v\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"CCTV auf SoundCloud\" aria-label=\"CCTV auf SoundCloud\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_81 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_28 et_pb_image et_pb_module et_block_module bt-x-50 bt-image-soon\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png 1200w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-980x980.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-480x480.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1200px, 100vw\" class=\"wp-image-8760\" alt=\"IMAGE SOON\" title=\"IMAGE SOON\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_31 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"LeSalonPrive-20261113\">\r\n<div class=\"et_pb_column_82 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_58 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Le Salon Priv\u00e9<\/h4>\n<h3 data-bt-start=\"2026-11-14T00:00:00\">Fr | 13.11. | 24 H<\/h3>\n<h2>Le Salon Priv\u00e9<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_83 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_59 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>LE SALON PRIV\u00c9 steht f\u00fcr sp\u00e4te N\u00e4chte, ausgew\u00e4hlte Sounds und die besondere Atmosph\u00e4re hinter der T\u00fcr des Tausend. Zwischen House, Disco und elektronischen Grooves entwickelt sich der Abend ganz ohne starre Grenzen \u2013 intim, direkt und immer mit Blick auf den Dancefloor.<\/p>\n<p>Wichtiger Hinweis: Zun\u00e4chst findet eine geschlossene Veranstaltung statt. Der \u00f6ffentliche Abend beginnt um 00:00 Uhr.<\/p>\n<p>Freitag, 13. November \u00b7 LE SALON PRIV\u00c9 \u00b7 ab 24 Uhr.<\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_84 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_29 et_pb_image et_pb_module et_block_module bt-x-50 bt-y-50\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-LeSalonPrive-Archiv-Filter-01-2026-10.webp\" width=\"1254\" height=\"1254\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-LeSalonPrive-Archiv-Filter-01-2026-10-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-LeSalonPrive-Archiv-Filter-01-2026-10-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-LeSalonPrive-Archiv-Filter-01-2026-10-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-LeSalonPrive-Archiv-Filter-01-2026-10.webp 1254w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-9227\" alt=\"Le Salon Priv\u00e9\" title=\"Le Salon Priv\u00e9\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_32 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-FrauHofmann\">\r\n<div class=\"et_pb_column_85 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_60 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend House<\/h4>\n<h3>Sa | 14.11. | 21 H<\/h3>\n<h2>Frau Hofmann<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_86 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_61 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Am 14. November ist Frau Hofmann zu Gast im Tausend. Die aus N\u00fcrnberg stammende DJ ist seit mehr als zehn Jahren hinter den Decks unterwegs und spielte in dieser Zeit in Clubs und auf Festivals in Deutschland und dar\u00fcber hinaus \u2013 darunter Nation of Gondwana, Feel Festival, Wilde M\u00f6hre, Beate Uwe und Grelle Forelle. <\/p>\n<p style=\"text-align: center;\">\nMusikalisch verbindet sie verspielte Rhythmen und emotionale Melodien mit tiefen Basslines und einem treibenden Fundament. Ihr Sound bewegt sich frei zwischen House, Tech House und Techno, zwischen warmen Grooves, hypnotischen Momenten und druckvoller Energie \u2013 vielseitig, lebendig und immer mit Blick auf den Dancefloor.<\/p>\n<p style=\"text-align: center;\">Samstag, 14. November \u00b7 Frau Hofmann \u00b7 21 Uhr\n<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/frauhofmann\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_87 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_30 et_pb_image et_pb_module et_block_module bt-x-20\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-FrauHofmann-sw-01.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-FrauHofmann-sw-01-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-FrauHofmann-sw-01-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-FrauHofmann-sw-01-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-FrauHofmann-sw-01.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-7825\" alt=\"Dj Frau Hofmann\" title=\"BarTausend-Dj-FrauHofmann-sw-01\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_33 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-Lorikeet-20261118\">\r\n<div class=\"et_pb_column_88 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_62 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Live<\/h4>\n<h3>Mi | 18.11. | 21 H<\/h3>\n<h2>Lorikeet<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_89 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_63 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Langsame Beats, weite Melodien, ein Sog, der ohne Eile entsteht. Lorikeet arbeitet als Berliner Produzent und Live-Act mit melodischer Elektronik und Downtempo. Seine Musik l\u00e4sst Platz zwischen den Kl\u00e4ngen und findet darin eine besondere Intensit\u00e4t \u2013 zwischen ruhigem Zuh\u00f6ren und stetiger Bewegung.<\/p>\n<p style=\"text-align: center;\">Mit Ver\u00f6ffentlichungen auf Serafin Audio und Live-Auftritten unter anderem bei der Fusion und Nation of Gondwana hat er diesen Ansatz auf ganz unterschiedliche B\u00fchnen gebracht. Im Tausend wird daraus ein Live-Abend f\u00fcr tiefe Rhythmen, leuchtende Klangfl\u00e4chen und einen Mittwoch, der seinen eigenen Takt findet.<\/p>\n<p style=\"text-align: center;\">Mittwoch, 18. November \u00b7 Lorikeet \u00b7 Live \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/lorikeeeeeet\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"Lorikeet auf SoundCloud\" aria-label=\"Lorikeet auf SoundCloud\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_90 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_31 et_pb_image et_pb_module et_block_module bt-x-50 bt-image-soon\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png 1200w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-980x980.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-480x480.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1200px, 100vw\" class=\"wp-image-8760\" alt=\"IMAGE SOON\" title=\"IMAGE SOON\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_34 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-Nikklaas-20261119\">\r\n<div class=\"et_pb_column_91 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_64 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Electronica<\/h4>\n<h3>Do | 19.11. | 21 H<\/h3>\n<h2>Nikklaas<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_92 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_65 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Nikklaas kennt das Berliner Nachtleben von beiden Seiten der Decks. Als DJ, Gr\u00fcnder von The Unknown und Resident im Bulbul gestaltet er seit vielen Jahren R\u00e4ume f\u00fcr elektronische Musik. House bleibt die Basis seiner Sets; abwechslungsreiche Einfl\u00fcsse und eine verspielte Auswahl sorgen daf\u00fcr, dass die Nacht in Bewegung bleibt.<\/p>\n<p style=\"text-align: center;\">Sein Weg f\u00fchrte ihn durch Clubs wie Sisyphos, Renate und Kater Blau sowie auf Festivals und internationale Floors. Bei TAUSEND ELECTRONICA steht seine eigene Definition von House im Mittelpunkt: aufmerksam f\u00fcr den Raum, offen f\u00fcr neue Wendungen und mit Freude an einem Set, das seine Geschichte nach und nach erz\u00e4hlt.<\/p>\n<p style=\"text-align: center;\">Donnerstag, 19. November \u00b7 Nikklaas \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/nikklaasberlin\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"Nikklaas auf SoundCloud\" aria-label=\"Nikklaas auf SoundCloud\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_93 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_32 et_pb_image et_pb_module et_block_module bt-x-50 bt-image-soon\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png 1200w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-980x980.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-480x480.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1200px, 100vw\" class=\"wp-image-8760\" alt=\"IMAGE SOON\" title=\"IMAGE SOON\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_35 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-Shabi-20261120\">\r\n<div class=\"et_pb_column_94 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_66 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend House<\/h4>\n<h3>Fr | 20.11. | 21 H<\/h3>\n<h2>Shabi<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_95 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_67 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Shabi verbindet Old-School Deep House und Disco mit soulful, jazzigen Grooves und druckvollen Garage-House-Rhythmen. Der Berliner DJ und Produzent fand \u00fcber Jazz- und Funkgitarre zur House-Musik \u2013 eine musikalische Herkunft, die seine Auswahl bis heute pr\u00e4gt.<\/p>\n<p style=\"text-align: center;\">Seine Sets und Produktionen leben von warmen Harmonien, beweglichen Basslines und einem Gesp\u00fcr f\u00fcr den richtigen Rhythmus. Bei TAUSEND HOUSE bringt er diese Mischung hinter die T\u00fcr unserer Bar: tief, groovig und offen f\u00fcr eine lange Nacht.<\/p>\n<p style=\"text-align: center;\">Freitag, 20. November \u00b7 Shabi \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/shabihousemusic\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"Shabi auf SoundCloud\" aria-label=\"Shabi auf SoundCloud\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_96 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_33 et_pb_image et_pb_module et_block_module bt-x-50 bt-image-soon\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png 1200w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-980x980.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-480x480.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1200px, 100vw\" class=\"wp-image-8760\" alt=\"IMAGE SOON\" title=\"IMAGE SOON\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_36 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-DJWerd-Tmnit-20261121\">\r\n<div class=\"et_pb_column_97 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_68 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend House<\/h4>\n<h3>Sa | 21.11. | 21 H<\/h3>\n<h2>DJ Werd &amp; Tmnit<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_98 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_69 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Mit DJ Werd und Tmnit wird TAUSEND HOUSE zum Treffpunkt zweier musikalischer Perspektiven. Werd bewegt sich zwischen DJing, Produktion und eigenen Ver\u00f6ffentlichungen; Tmnit verbindet ihre Arbeit an den Decks mit einem tiefen Interesse an Schwarzer Musikgeschichte und den Geschichten, die in Sounds weiterleben.<\/p>\n<p style=\"text-align: center;\">F\u00fcr diesen Samstag f\u00fchrt der gemeinsame Weg in den Afro House. Rhythmus und Auswahl bilden den Kern des Abends, getragen von zwei Artists, die Musik aus unterschiedlichen Erfahrungen heraus betrachten. Ein Dancefloor f\u00fcr neue Verbindungen und f\u00fcr Tracks, die \u00fcber den Moment hinaus nachklingen.<\/p>\n<p style=\"text-align: center;\">Samstag, 21. November \u00b7 DJ Werd &amp; Tmnit \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/dj-werd\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"DJ Werd auf SoundCloud\" aria-label=\"DJ Werd auf SoundCloud\"><\/a><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/refugeworldwide\/studios-and-their-songs-and\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"Tmnit auf SoundCloud\" aria-label=\"Tmnit auf SoundCloud\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_99 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_34 et_pb_image et_pb_module et_block_module bt-x-50 bt-image-soon\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png 1200w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-980x980.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-480x480.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1200px, 100vw\" class=\"wp-image-8760\" alt=\"IMAGE SOON\" title=\"IMAGE SOON\" \/><\/span><\/div>\r\n<div class=\"et_pb_image_35 et_pb_image et_pb_module et_block_module bt-x-50 bt-image-soon\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png 1200w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-980x980.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-480x480.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1200px, 100vw\" class=\"wp-image-8760\" alt=\"IMAGE SOON\" title=\"IMAGE SOON\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_37 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-OY-20261125\">\r\n<div class=\"et_pb_column_100 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_70 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Live<\/h4>\n<h3>Mi | 25.11. | 21 H<\/h3>\n<h2>O\/Y<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_101 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_71 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Im Kleinen steckt bei O\/Y ein ganzes Klanguniversum. Sein Live-Sound bewegt sich zwischen Minimal, Dub, Electronica, Ambient und Downtempo: feine rhythmische Figuren treffen auf tiefe Fl\u00e4chen und leichte Melodien, die immer wieder eine andere Perspektive \u00f6ffnen.<\/p>\n<p style=\"text-align: center;\">Nach internationalen Reisen mit seinem Live-Set gr\u00fcndete O\/Y 2022 Doubt Records und schuf damit einen eigenen Ort f\u00fcr Ver\u00f6ffentlichungen, Veranstaltungen und Radioshows. Im Tausend l\u00e4sst sich diese musikalische Neugier unmittelbar erleben \u2013 in einem Live-Set, das Details h\u00f6rbar macht und den Groove St\u00fcck f\u00fcr St\u00fcck wachsen l\u00e4sst.<\/p>\n<p style=\"text-align: center;\">Mittwoch, 25. November \u00b7 O\/Y \u00b7 Live \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/oh_why\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"O\/Y auf SoundCloud\" aria-label=\"O\/Y auf SoundCloud\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_102 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_36 et_pb_image et_pb_module et_block_module bt-x-50 bt-image-soon\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png 1200w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-980x980.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-480x480.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1200px, 100vw\" class=\"wp-image-8760\" alt=\"IMAGE SOON\" title=\"IMAGE SOON\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_38 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"LeSalonPrive-20261127\">\r\n<div class=\"et_pb_column_103 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_72 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Le Salon Priv\u00e9<\/h4>\n<h3 data-bt-start=\"2026-11-27T21:00:00\">Fr | 27.11. | 21 H<\/h3>\n<h2>Le Salon Priv\u00e9<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_104 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_73 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>LE SALON PRIV\u00c9 steht f\u00fcr sp\u00e4te N\u00e4chte, ausgew\u00e4hlte Sounds und die besondere Atmosph\u00e4re hinter der T\u00fcr des Tausend. Zwischen House, Disco und elektronischen Grooves entwickelt sich der Abend ganz ohne starre Grenzen \u2013 intim, direkt und immer mit Blick auf den Dancefloor.<\/p>\n<p>Freitag, 27. November \u00b7 LE SALON PRIV\u00c9 \u00b7 21 Uhr.<\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_105 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_37 et_pb_image et_pb_module et_block_module bt-x-50 bt-y-50\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-LeSalonPrive-Archiv-Filter-01-2026-10.webp\" width=\"1254\" height=\"1254\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-LeSalonPrive-Archiv-Filter-01-2026-10-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-LeSalonPrive-Archiv-Filter-01-2026-10-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-LeSalonPrive-Archiv-Filter-01-2026-10-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-LeSalonPrive-Archiv-Filter-01-2026-10.webp 1254w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-9227\" alt=\"Le Salon Priv\u00e9\" title=\"Le Salon Priv\u00e9\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_39 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"LIVE-Flashbaxx-20261202\">\r\n<div class=\"et_pb_column_106 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_74 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Live<\/h4>\n<h3>Mi | 02.12. | 21 H<\/h3>\n<h2>Flashbaxx<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_107 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_75 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Flashbaxx bringt Disco, House, Jazz und Funk in Bewegung. Hinter dem Projekt steht Daniel Stenger, dessen Musik von entspannten Downtempo-Grooves bis zu druckvoller Clubmusik reicht.<\/p>\n<p style=\"text-align: center;\">Als elektronischer Live-Act verbindet Flashbaxx eigene Produktionen mit neu zusammengesetzten Disco- und House-Klassikern. Bei TAUSEND LIVE trifft dieses Spiel mit bekannten Sounds und frischen Ideen auf die intime Atmosph\u00e4re unserer Bar.<\/p>\n<p style=\"text-align: center;\">Mittwoch, 2. Dezember \u00b7 Flashbaxx \u00b7 Live \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/flashbaxx\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"Flashbaxx auf SoundCloud\" aria-label=\"Flashbaxx auf SoundCloud\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_108 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_38 et_pb_image et_pb_module et_block_module bt-x-50\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/bar-tausend-flashbaxx-archiv-v01.webp\" alt=\"Flashbaxx \u2013 Live-Act und Produzent bei Bar Tausend Berlin\" title=\"Flashbaxx \u00b7 Live-Act und Produzent \u00b7 Bar Tausend Berlin\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/bar-tausend-flashbaxx-archiv-v01-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/bar-tausend-flashbaxx-archiv-v01-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/bar-tausend-flashbaxx-archiv-v01-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/bar-tausend-flashbaxx-archiv-v01.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-8813\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_40 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"DJ-CarlaValenti\">\r\n<div class=\"et_pb_column_109 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_76 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend House<\/h4>\n<h3>Sa | 05.12. | 21 H<\/h3>\n<h2>Superlover<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_110 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_77 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Superlover steht f\u00fcr Feelgood House mit ordentlich Disco-DNA. Der Berliner DJ und Produzent verbindet klassische Disco- und Funk-Einfl\u00fcsse mit modernem House und einem Sound, der direkt f\u00fcr den Dancefloor gemacht ist. Seine Tracks und Remixe haben ihm weit \u00fcber Berlin hinaus einen Namen gemacht \u2013 darunter Arbeiten f\u00fcr Purple Disco Machine, Claptone, Bakermat und Boris Dlugosch.<\/p>\n<p style=\"text-align: center;\">Seine Sets leben von warmen Basslines, treibenden Grooves und diesem unverkennbaren Mix aus Funk, Disco und House. Mal verspielt, mal druckvoll, aber immer mit dem richtigen Gesp\u00fcr f\u00fcr den Moment, an dem aus einem guten Track eine volle Tanzfl\u00e4che wird.<\/p>\n<p style=\"text-align: center;\">Wir freuen uns, Superlover wieder im Tausend begr\u00fc\u00dfen zu d\u00fcrfen \u2013 diesmal bei TAUSEND HOUSE.<\/p>\n<p style=\"text-align: center;\">Samstag, 05. Dezember \u00b7 Superlover \u00b7 21 Uhr\n<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/superlover\" target=\"_blank\" rel=\"noopener noreferrer\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_111 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_39 et_pb_image et_pb_module et_block_module\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Superlover-sw.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Superlover-sw-480x480.webp 480w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Superlover-sw-768x768.webp 768w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Superlover-sw-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Dj-Superlover-sw.webp 1200w\" sizes=\"(max-width: 767px) 86vw, (max-width: 980px) 33vw, 25vw\" class=\"wp-image-7991\" alt=\"Dj Superlover\" title=\"BarTausend-Dj-Superlover-sw\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_41 et_pb_row et_pb_gutters2 et_block_row lineup-row\" id=\"DJ-Pilar-Jordan-20261126\">\r\n<div class=\"et_pb_column_112 et_pb_column et_pb_column_4_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_78 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Electronica<\/h4>\n<h3>Do | 26.11.2026 | 21 H<\/h3>\n<h2>Pilar Jordan<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_113 et_pb_column et_pb_column_4_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_79 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>House ist f\u00fcr Pilar Jordan eine Herzensangelegenheit. Die aus Chile stammende, in Berlin lebende DJ ist auch als PiliJo bekannt und verbindet ihre Liebe zu Vinyl mit dem Gesp\u00fcr einer S\u00e4ngerin f\u00fcr musikalischen Ausdruck. Ihre Auswahl stellt House in den Mittelpunkt: Musik, die Menschen zusammenbringt und auf dem Dancefloor ihren eigenen Lauf nimmt.<\/p>\n<p>Mit FLINTA* CLUB DECK und ihrer Veranstaltungsreihe SHINE A LIGHT schafft sie zugleich R\u00e4ume f\u00fcr gemeinsame musikalische Erlebnisse. Am 26. November bringt sie diese Perspektive zu TAUSEND ELECTRONICA \u2013 pers\u00f6nlich, offen und ganz dem Groove gewidmet.<\/p>\n<p>Donnerstag, 26. November 2026 \u00b7 Pilar Jordan \u00b7 21 Uhr<\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_114 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_40 et_pb_image et_pb_module et_block_module bt-x-50 bt-image-soon\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png 1200w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-980x980.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-480x480.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1200px, 100vw\" class=\"wp-image-8760\" alt=\"IMAGE SOON\" title=\"IMAGE SOON\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_42 et_pb_row et_pb_gutters2 et_block_row lineup-row\" id=\"DJ-Julius-The-Mad-Thinker-20261204\">\r\n<div class=\"et_pb_column_115 et_pb_column et_pb_column_4_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_80 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend House<\/h4>\n<h3>Fr | 04.12.2026 | 21 H<\/h3>\n<h2>Julius The Mad Thinker<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_116 et_pb_column et_pb_column_4_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_81 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>Julius The Mad Thinker bringt die verbindende Kraft von House aus Chicago ins Tausend. Der international t\u00e4tige DJ und Produzent beschreibt seinen Sound als Global Soul House: Afro-kubanische Rhythmen treffen auf elektronische Kl\u00e4nge, Soul und wechselnde Stimmungen. Seine Sets erz\u00e4hlen Geschichten und lassen Raum, sich in der Musik zu verlieren.<\/p>\n<p>Als Mitgr\u00fcnder von Mi Casa Holiday bringt er seit vielen Jahren Menschen \u00fcber Musik und gemeinsame Erlebnisse zusammen. Bei TAUSEND HOUSE wird daraus eine Nacht zwischen warmen Grooves, rhythmischer Vielfalt und der Energie eines Dancefloors, der gemeinsam in Bewegung kommt.<\/p>\n<p>Freitag, 4. Dezember 2026 \u00b7 Julius The Mad Thinker \u00b7 21 Uhr<\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_117 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_41 et_pb_image et_pb_module et_block_module bt-x-50 bt-image-soon\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png 1200w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-980x980.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-480x480.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1200px, 100vw\" class=\"wp-image-8760\" alt=\"IMAGE SOON\" title=\"IMAGE SOON\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_43 et_pb_row et_pb_gutters2 et_block_row lineup-row\" id=\"DJ-Sven-Weisemann-20261212\">\r\n<div class=\"et_pb_column_118 et_pb_column et_pb_column_4_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_82 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend House<\/h4>\n<h3>Sa | 12.12.2026 | 21 H<\/h3>\n<h2>Sven Weisemann<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_119 et_pb_column et_pb_column_4_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_83 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>Zwischen den Rhythmen bleibt bei Sven Weisemann viel Raum f\u00fcr Atmosph\u00e4re. Der Berliner DJ, Produzent und Musiker verbindet Deep House und Dub mit Einfl\u00fcssen aus Soul, Jazz, Detroit Techno und Filmmusik. Seine Musik entfaltet sich mit Geduld: fein in den Details, tief im Klang und mit einem Gesp\u00fcr f\u00fcr die Stimmung im Raum.<\/p>\n<p>Seit 1997 steht er hinter den Decks; Ver\u00f6ffentlichungen auf Mojuba, Delsin und weiteren Labels zeigen seine vielseitige Handschrift. Bei TAUSEND HOUSE begegnen musikalische Tiefe und die unmittelbare Energie des Dancefloors einander aus n\u00e4chster N\u00e4he.<\/p>\n<p>Samstag, 12. Dezember 2026 \u00b7 Sven Weisemann \u00b7 21 Uhr<\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_120 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_42 et_pb_image et_pb_module et_block_module bt-x-50 bt-image-soon\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png 1200w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-980x980.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-480x480.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1200px, 100vw\" class=\"wp-image-8760\" alt=\"IMAGE SOON\" title=\"IMAGE SOON\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_44 et_pb_row et_pb_gutters2 et_block_row lineup-row\" id=\"DJ-Kalea-20270101\">\r\n<div class=\"et_pb_column_121 et_pb_column et_pb_column_4_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_84 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend House<\/h4>\n<h3>Fr | 01.01.2027 | 21 H<\/h3>\n<h2>Kalea<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_122 et_pb_column et_pb_column_4_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_85 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>Melodien, die weitertragen, und Rhythmen, die nach vorne ziehen: KALEA verbindet melodische Klangwelten mit Deep- und Tech-House-Elementen. Der Name steht im Hawaiianischen f\u00fcr Freude \u2013 ein Gedanke, der die Musik pr\u00e4gt. Verspielt und harmonisch zugleich entsteht ein Sound, der Bewegung und Gef\u00fchl zusammenbringt.<\/p>\n<p>Von Berliner Clubs bis zu Festivals wie Fusion und Burning Man hat KALEA diese musikalische Reise bereits auf unterschiedliche Dancefloors getragen. Zum ersten TAUSEND HOUSE des neuen Jahres geht sie im intimen Rahmen unserer Bar weiter: mit Melodie, Groove und Lust auf die n\u00e4chste Nacht.<\/p>\n<p>Freitag, 1. Januar 2027 \u00b7 KALEA \u00b7 21 Uhr<\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_123 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_43 et_pb_image et_pb_module et_block_module bt-x-50 bt-image-soon\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png 1200w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-980x980.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-480x480.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1200px, 100vw\" class=\"wp-image-8760\" alt=\"IMAGE SOON\" title=\"IMAGE SOON\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_45 et_pb_row et_pb_gutters2 et_block_row lineup-row\" id=\"DJ-Sabine-Hoffmann-20270102\">\r\n<div class=\"et_pb_column_124 et_pb_column et_pb_column_4_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_86 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend House<\/h4>\n<h3>Sa | 02.01.2027 | 21 H<\/h3>\n<h2>Sabine Hoffmann<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_125 et_pb_column et_pb_column_4_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_87 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>Sabine Hoffmann denkt Musik von der Platte aus. Die in Berlin geborene DJ spielt ausschlie\u00dflich Vinyl und bewegt sich mit ihrer Auswahl zwischen House und Techno, deepen Grooves und dubbigen Momenten. Ihre N\u00e4he zur Berliner Plattenkultur ist auch durch ihre Arbeit bei OYE Records gewachsen \u2013 immer auf der Suche nach Musik mit Charakter.<\/p>\n<p>Mit Frauengedeck schafft sie eine Plattform f\u00fcr FLINTA*-Artists; gemeinsam mit Kenneth Christiansen widmet sie sich bei Dub Nation den tieferen Seiten elektronischer Musik. Im Tausend steht ihre Auswahl im Mittelpunkt: aufmerksam, vielseitig und mit einem direkten Gesp\u00fcr f\u00fcr den Dancefloor.<\/p>\n<p>Samstag, 2. Januar 2027 \u00b7 Sabine Hoffmann \u00b7 21 Uhr<\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_126 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_44 et_pb_image et_pb_module et_block_module bt-x-50 bt-image-soon\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png 1200w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-980x980.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-480x480.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1200px, 100vw\" class=\"wp-image-8760\" alt=\"IMAGE SOON\" title=\"IMAGE SOON\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_46 et_pb_row et_pb_gutters2 et_block_row lineup-row\" id=\"DJ-Florian-Kruse-20270109\">\r\n<div class=\"et_pb_column_127 et_pb_column et_pb_column_4_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_88 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend<\/h4>\n<h3>Sa | 09.01.2027 | 21 H<\/h3>\n<h2>Florian Kruse<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_128 et_pb_column et_pb_column_4_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_89 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>Florian Kruse verbindet die Tiefe von House mit der Spannung von Techno. Der DJ und Produzent aus Norddeutschland hat \u00fcber viele Jahre einen Sound entwickelt, in dem hypnotische Rhythmen und musikalische Atmosph\u00e4re zusammenfinden. Als Teil von Kruse &amp; Nuernberg ebenso wie mit seinen Soloproduktionen hat er diese Handschrift stetig weitergef\u00fchrt.<\/p>\n<p>Ver\u00f6ffentlichungen auf Anjunadeep, Kompakt und Last Night On Earth zeigen die Bandbreite seiner Arbeit. Hinter den Decks f\u00fchrt er diese Einfl\u00fcsse zusammen \u2013 mit einem Gesp\u00fcr f\u00fcr den Aufbau einer Nacht und die Momente, in denen sich ein Raum gemeinsam auf die Musik einl\u00e4sst.<\/p>\n<p>Samstag, 9. Januar 2027 \u00b7 Florian Kruse \u00b7 21 Uhr<\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_129 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_45 et_pb_image et_pb_module et_block_module bt-x-50 bt-image-soon\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png 1200w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-980x980.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-480x480.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1200px, 100vw\" class=\"wp-image-8760\" alt=\"IMAGE SOON\" title=\"IMAGE SOON\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_47 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"LIVE-DesneyBailey-DJJauche-20261209\">\r\n<div class=\"et_pb_column_130 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_90 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Live<\/h4>\n<h3>Mi | 09.12. | 21 H<\/h3>\n<h2>Desney Bailey &amp; DJ Jauche<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_131 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_91 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>Eine Stimme mit Soul, Jazz im Gef\u00fchl und House im Puls: Desney Bailey und DJ Jauche bringen zwei eng verbundene musikalische Welten in die Tausend. Am 9. Dezember trifft ihr Live-Auftritt auf sein DJ-Set \u2013 mit W\u00e4rme, Groove und viel Raum f\u00fcr die Nacht.<\/p>\n<p>Die geb\u00fcrtige New Yorkerin Desney Bailey bewegt sich zwischen NuJazz, Neo Soul und House. Ihre Zusammenarbeit mit Jazzanova, Deyampert und Slope zeigt, wie selbstverst\u00e4ndlich sie Jazz und Clubkultur miteinander verbindet. Ihre Stimme gibt den Songs eine pers\u00f6nliche Note: mal sanft und nah, mal voller Kraft, getragen von einem feinen Gesp\u00fcr f\u00fcr Rhythmus.<\/p>\n<p>DJ Jauche alias Oliver Marquardt ist seit den fr\u00fchen 1990er-Jahren Teil der Berliner Clubkultur. In seinen Vinyl-Sets verbindet er House, Disco und Funk mit Erfahrung, Neugier und einem Gesp\u00fcr f\u00fcr den richtigen Moment. Mit Desney Bailey verbindet ihn auch gemeinsame Studioarbeit \u2013 eine musikalische N\u00e4he, die diesem Abend seinen eigenen Charakter gibt.<\/p>\n<p>Bei TAUSEND LIVE wird daraus ein Mittwoch zwischen Zuh\u00f6ren und Tanzen: Desney Bailey live, DJ Jauche an den Decks und Musik, die den Abend weitertr\u00e4gt.<\/p>\n<p>Mittwoch, 9. Dezember \u00b7 Desney Bailey &amp; DJ Jauche \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/desneyb\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"Desney Bailey auf SoundCloud\" aria-label=\"Desney Bailey auf SoundCloud\"><\/a><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/dj-jauche\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"DJ Jauche auf SoundCloud\" aria-label=\"DJ Jauche auf SoundCloud\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_132 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_46 et_pb_image et_pb_module et_block_module bt-x-50 bt-image-soon\" id=\"lineup-photo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000.png 1200w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-980x980.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/000000-480x480.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1200px, 100vw\" class=\"wp-image-8760\" alt=\"Bild folgt \u00b7 Desney Bailey, S\u00e4ngerin, und DJ Jauche \u00b7 Bar Tausend\" title=\"Desney Bailey &amp; DJ Jauche \u00b7 Bar Tausend\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_48 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4 lineup-row\" id=\"LIVE-CedricScheibel-20261230\">\r\n<div class=\"et_pb_column_133 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_92 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend Live<\/h4>\n<h3>Mi | 30.12. | 21 H<\/h3>\n<h2>Cedric Scheibel<\/h2>\n<p><a>Event soon<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_134 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_93 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p>Wenn Klaviert\u00f6ne auf elektronische Tiefe treffen, \u00f6ffnet Cedric Scheibel einen Raum zwischen Konzert und Clubnacht. Sein Live-Set verbindet die unmittelbare W\u00e4rme des Pianos mit Synthesizern und elektronischen Rhythmen \u2013 detailreich, atmosph\u00e4risch und in stetiger Bewegung.<\/p>\n<p>Der in Berlin lebende Produzent und Pianist begann bereits als Kind mit dem Klavierspiel. Komposition und Improvisation pr\u00e4gen bis heute seine Musik. Seit 2021 f\u00fchrt er diese Handschrift in einem elektronischen Live-Projekt weiter, in dem das Klavier und der Moog Sub 37 zusammenkommen. Aus feinen Melodien, analogen Klangfarben und rhythmischen Entwicklungen entsteht ein eigener musikalischer Fluss.<\/p>\n<p>Am 30. Dezember begr\u00fc\u00dfen wir Cedric Scheibel bei TAUSEND LIVE in der Tausend. Ein Abend zwischen den Jahren, der mit Gef\u00fchl beginnt und offenbleibt f\u00fcr alles, was die Musik daraus macht.<\/p>\n<p>Mittwoch, 30. Dezember \u00b7 Cedric Scheibel \u00b7 21 Uhr<\/p>\n<div class=\"bt-check-sound\"><span class=\"bt-check-sound-label\">Check Sound<\/span><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/cedricscheibel\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"Cedric Scheibel auf SoundCloud\" aria-label=\"Cedric Scheibel auf SoundCloud\"><\/a><\/div>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_135 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_47 et_pb_image et_animated et_pb_module et_block_module lineup-photo bt-x-50 bt-y-50\" id=\"lineup-photo-100\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/bar-tausend-cedric-scheibel-archiv-v01.webp\" width=\"1200\" height=\"1200\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/bar-tausend-cedric-scheibel-archiv-v01.webp 1200w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/bar-tausend-cedric-scheibel-archiv-v01-980x980.webp 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/bar-tausend-cedric-scheibel-archiv-v01-480x480.webp 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1200px, 100vw\" class=\"wp-image-8857\" alt=\"Cedric Scheibel \u00b7 Pianist und elektronischer Live-Act bei Bar Tausend\" title=\"Cedric Scheibel \u00b7 Bar Tausend\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_3 et_pb_section et_section_regular et_block_section bt-enter-skip\">\r\n<div class=\"et_pb_row_49 et_pb_row et_block_row\">\r\n<div class=\"et_pb_column_136 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n\r\n<div class=\"et_pb_divider_0 et_pb_divider et_pb_space et_pb_divider_position_center et_animated et_pb_module\"><div class=\"et_pb_divider_internal\"><\/div><\/div>\r\n<div class=\"et_pb_text_95 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module bt-lineup-links\"><div class=\"et_pb_text_inner\" data-et-mv-hidden-tablet=\"true\" data-et-mv-hidden-phone=\"true\"><h3 class=\"bt-lineup-hours\"><span class=\"bt-hours-de\" data-no-translation>Lineup Mittwoch bis Samstag 21:00 Uhr<\/span><span class=\"bt-hours-en\" lang=\"en\" data-no-translation>Lineup Wednesday to Saturday 9:00 PM<\/span><\/h3>\n<p>Folge uns auf <a href=\"https:\/\/www.instagram.com\/bar.tausend.berlin\/\" target=\"_blank\" rel=\"noopener\">Instagram<\/a>.<\/p>\n<div class=\"bt-tausend-streams bt-tausend-streams--desktop\">\n<div class=\"bt-tausend-stream\"><span class=\"bt-tausend-stream-text\">TAUSEND LIVE SETS<\/span><br \/><a href=\"https:\/\/soundcloud.com\/bartausend\/sets\/bar-tausend-live-sets\" target=\"_blank\" rel=\"noopener\" class=\"bt-tausend-stream-logo bt-tausend-stream-logo--soundcloud\" aria-label=\"Tausend Live Sets auf SoundCloud \u00f6ffnen\"><\/a><\/div>\n<div class=\"bt-tausend-stream\"><span class=\"bt-tausend-stream-text\">TAUSEND PLAYLIST<\/span><br \/><a href=\"https:\/\/open.spotify.com\/playlist\/7kigcdKueJsjMWbPuQkvmp?si=6de0f7dd46ca46a5&amp;nd=1&amp;dlsi=3ccfbb325fd6442d\" target=\"_blank\" rel=\"noopener\" class=\"bt-tausend-stream-logo bt-tausend-stream-logo--spotify\" aria-label=\"Tausend Playlist auf Spotify \u00f6ffnen\"><\/a><\/div>\n<\/div>\n<\/div><\/div>\r\n<div class=\"et_pb_code_23 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style id=\"bt-v5-stream-links-position\">\n@media (min-width:768px){html body.page-id-9606 #page-container .bt-lineup-links .bt-tausend-streams{translate:0 -5px!important;}}\n<\/style>\n<style id=\"bt-v5-lineup-phone-hours\">\n@media(max-width:767px){\nhtml body.page-id-9606 #page-container .bt-lineup-links h3.bt-current-opening-hours{font-size:clamp(16px,5vw,21px)!important;line-height:1.35!important;text-wrap:normal!important}\nhtml body.page-id-9606 #page-container .bt-lineup-links .bt-opening-line{display:block!important;white-space:nowrap!important;font:inherit!important;letter-spacing:inherit!important}\nhtml body.page-id-9606 #page-container .bt-lineup-links .bt-opening-line+.bt-opening-line{margin-top:4px}\n}\n<\/style><\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_4 et_pb_section et_section_regular et_block_section et_pb_section_parallax\" id=\"banner-tuer\"><span class=\"et-pb-parallax-wrapper et-pb-parallax-hidden-tablet et-pb-parallax-hidden-phone\"><span class=\"et-pb-parallax-background et-pb-parallax-background--css et-pb-parallax-background-module--divi-section-4\" style=\"background-image:url(https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-BG03-2.webp)\"><\/span><\/span>\r\n<div class=\"et_pb_row_50 et_pb_row et_block_row et_animated\">\r\n<div class=\"et_pb_column_137 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_96 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module bt-title-reveal\"><div class=\"et_pb_text_inner\" data-et-mv-hidden-tablet=\"true\" data-et-mv-hidden-phone=\"true\"><h3 style=\"text-align: right; font-size:34px!important; letter-spacing:-1px!important;\">\"Bar Tausend \u2013 Tanzbar. Cocktailbar. Live-Musik. Eventlocation.\"<\/h3>\n<h4 style=\"text-align: right; font-size:18px!important; margin-top:-3px!important;\">Some places aren't found. They are revealed.<\/h4>\n<\/div><\/div>\r\n<div class=\"et_pb_code_24 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n\/* =========================================================\n   BAR TAUSEND \u00b7 TEXT REVEAL V3\n   Wort fuer Wort \u00b7 weiche Maske \u00b7 Unschaerfe \u00b7 leiser Lichtschein\n   NUR FUER SPRUECHE \u2013 KEINE DRINKS \/ KEIN SLIDER\n   Klasse am Modul: bt-title-reveal\n========================================================= *\/\n\n\/* Schrift der Ueberschrift behalten (globale Poppins-Regel fuer * aushebeln) *\/\n.bt-title-reveal .bt-vis,\n.bt-title-reveal .bt-w,\n.bt-title-reveal .bt-wi,\n.bt-title-reveal .bt-sr {\n  font-family: inherit !important;\n  font-weight: inherit !important;\n  font-style: inherit !important;\n  letter-spacing: inherit !important;\n  text-transform: inherit !important;\n  line-height: inherit !important;\n  color: inherit !important;\n}\n\n\/* Divi-Einblendung der Zeile neutralisieren \u2013 die Woerter uebernehmen *\/\n.bt-calm-divi,\n.bt-calm-divi.et_animated,\n.bt-calm-divi.et_had_animation {\n  opacity: 1 !important;\n  animation-name: none !important;\n}\n\n\/* Wort-Maske *\/\n.bt-title-reveal .bt-w {\n  display: inline-block;\n  vertical-align: top;\n  padding-bottom: 0.14em;\n  margin-bottom: -0.14em;\n  clip-path: polygon(-40% -80%, 140% -80%, 140% 100%, -40% 100%);\n}\n\n.bt-title-reveal .bt-wi {\n  display: inline-block;\n  transform-origin: 50% 100%;\n}\n\n\/* Text fuer Screenreader (unsichtbar) *\/\n.bt-title-reveal .bt-sr {\n  position: absolute !important;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0 0 0 0);\n  white-space: nowrap;\n  border: 0;\n}\n\n\/* Startzustand *\/\n.bt-title-reveal.bt-reveal-ready .bt-wi {\n  opacity: 0;\n  transform: translate3d(0, 108%, 0) scale(1.03);\n  filter: blur(10px);\n}\n\n.bt-title-reveal.bt-reveal-ready:not(.bt-reveal-done) .bt-wi {\n  will-change: opacity, transform, filter;\n}\n\n\/* Headline *\/\n.bt-title-reveal.bt-reveal-play :is(h2, h3) .bt-wi {\n  animation: btWordIn 1500ms cubic-bezier(0.19, 1, 0.22, 1) both;\n  animation-delay: calc(var(--bt-i, 0) * var(--bt-step, 80ms));\n}\n\n\/* Claim (h4) \u2013 startet, wenn die Headline fast steht *\/\n.bt-title-reveal.bt-reveal-play h4 .bt-wi {\n  animation: btClaimIn 1200ms cubic-bezier(0.19, 1, 0.22, 1) both;\n  animation-delay: calc(var(--bt-base, 600ms) + var(--bt-i, 0) * 45ms);\n}\n\n\/* Fertig: alles ruhig stehen lassen *\/\n.bt-title-reveal.bt-reveal-done .bt-w {\n  clip-path: none;\n}\n\n.bt-title-reveal.bt-reveal-ready.bt-reveal-done .bt-wi {\n  opacity: 1;\n  transform: none;\n  filter: none;\n  animation: none;\n}\n\n@keyframes btWordIn {\n  0% {\n    opacity: 0;\n    transform: translate3d(0, 108%, 0) scale(1.03);\n    filter: blur(10px);\n    text-shadow: 0 0 0 rgba(255, 255, 255, 0);\n  }\n\n  45% {\n    opacity: 1;\n    filter: blur(0);\n    text-shadow:\n      0 0 18px rgba(255, 255, 255, 0.38),\n      0 0 2px rgba(255, 255, 255, 0.6);\n  }\n\n  100% {\n    opacity: 1;\n    transform: none;\n    filter: none;\n  }\n}\n\n@keyframes btClaimIn {\n  0% {\n    opacity: 0;\n    transform: translate3d(0, 100%, 0);\n    filter: blur(6px);\n  }\n\n  100% {\n    opacity: 1;\n    transform: none;\n    filter: none;\n  }\n}\n\n\/* Im Divi-Builder immer normal sichtbar *\/\n.et-fb-root-ancestor .bt-title-reveal :is(h2, h3, h4),\n.et-fb-root-ancestor .bt-title-reveal .bt-wi {\n  opacity: 1 !important;\n  clip-path: none !important;\n  transform: none !important;\n  filter: none !important;\n  animation: none !important;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .bt-title-reveal :is(h2, h3, h4),\n  .bt-title-reveal .bt-w,\n  .bt-title-reveal .bt-wi {\n    opacity: 1 !important;\n    clip-path: none !important;\n    transform: none !important;\n    filter: none !important;\n    animation: none !important;\n  }\n}\n<\/style>\n\n<script>\n(function () {\n  \"use strict\";\n\n  \/* true = Spruch animiert jedes Mal neu, wenn man wieder hinscrollt *\/\n  var REPLAY = false;\n\n  var HEAD_DURATION = 1500;\n  var CLAIM_DURATION = 1200;\n\n  function isDiviBuilder() {\n    return (\n      document.body.classList.contains(\"et-fb\") ||\n      document.querySelector(\".et-fb-root-ancestor\")\n    );\n  }\n\n  function cleanText(text) {\n    [10, 13, 9].forEach(function (code) {\n      text = text.split(String.fromCharCode(code)).join(\" \");\n    });\n    return text;\n  }\n\n  \/* Ganzer Satz fuer Screenreader, Zeilenumbrueche als Leerzeichen *\/\n  function readableText(heading) {\n    var copy = heading.cloneNode(true);\n    Array.prototype.forEach.call(copy.querySelectorAll(\"br\"), function (br) {\n      br.parentNode.replaceChild(document.createTextNode(\" \"), br);\n    });\n    return cleanText(copy.textContent).split(\" \").filter(Boolean).join(\" \");\n  }\n\n  \/* Zerlegt Text in Woerter, behaelt <br>, <strong> usw. *\/\n  function splitWords(root) {\n    var index = 0;\n\n    function walk(node) {\n      Array.prototype.slice.call(node.childNodes).forEach(function (child) {\n        if (child.nodeType === 3) {\n          var text = cleanText(child.nodeValue);\n          if (!text.trim()) return;\n\n          var frag = document.createDocumentFragment();\n          var parts = text.split(\" \");\n\n          parts.forEach(function (part, i) {\n            if (part) {\n              var outer = document.createElement(\"span\");\n              var inner = document.createElement(\"span\");\n              outer.className = \"bt-w\";\n              inner.className = \"bt-wi\";\n              inner.textContent = part;\n              inner.style.setProperty(\"--bt-i\", index);\n              index++;\n              outer.appendChild(inner);\n              frag.appendChild(outer);\n            }\n            if (i < parts.length - 1) {\n              frag.appendChild(document.createTextNode(\" \"));\n            }\n          });\n\n          child.parentNode.replaceChild(frag, child);\n        } else if (child.nodeType === 1 && child.tagName !== \"BR\") {\n          walk(child);\n        }\n      });\n    }\n\n    walk(root);\n    return index;\n  }\n\n  function prepareHeading(heading) {\n    var fullText = readableText(heading);\n    var visual = document.createElement(\"span\");\n    visual.className = \"bt-vis\";\n    visual.setAttribute(\"aria-hidden\", \"true\");\n\n    while (heading.firstChild) {\n      visual.appendChild(heading.firstChild);\n    }\n\n    var sr = document.createElement(\"span\");\n    sr.className = \"bt-sr\";\n    sr.textContent = fullText;\n\n    heading.appendChild(sr);\n    heading.appendChild(visual);\n    heading.setAttribute(\"data-bt-split\", \"1\");\n\n    return splitWords(visual);\n  }\n\n  function needsSplit(element) {\n    return Array.prototype.some.call(\n      element.querySelectorAll(\"h2, h3, h4\"),\n      function (h) {\n        return h.getAttribute(\"data-bt-split\") !== \"1\";\n      }\n    );\n  }\n\n  function setupElement(element) {\n    var headings = element.querySelectorAll(\"h2, h3\");\n    var claims = element.querySelectorAll(\"h4\");\n    var longest = 0;\n\n    Array.prototype.forEach.call(headings, function (h) {\n      if (h.getAttribute(\"data-bt-split\") === \"1\") return;\n      var count = prepareHeading(h);\n      var step = Math.min(80, Math.round(900 \/ Math.max(count, 1)));\n      h.style.setProperty(\"--bt-step\", step + \"ms\");\n      var end = (count - 1) * step;\n      if (end > longest) longest = end;\n    });\n\n    var claimBase = longest + 550;\n    var claimEnd = 0;\n\n    Array.prototype.forEach.call(claims, function (c) {\n      if (c.getAttribute(\"data-bt-split\") === \"1\") return;\n      var count = prepareHeading(c);\n      c.style.setProperty(\"--bt-base\", claimBase + \"ms\");\n      var end = claimBase + (count - 1) * 45 + CLAIM_DURATION;\n      if (end > claimEnd) claimEnd = end;\n    });\n\n    element.btTotal = Math.max(longest + HEAD_DURATION, claimEnd, element.btTotal || 0) + 100;\n    element.classList.add(\"bt-reveal-ready\");\n  }\n\n  \/* Divi-Einblendung auf Zeile\/Spalte\/Modul abschalten, damit nichts doppelt animiert *\/\n  function calmDiviAnimation(element) {\n    var node = element;\n    while (node && !node.classList.contains(\"et_pb_section\")) {\n      if (\n        node.classList.contains(\"et_animated\") ||\n        node.classList.contains(\"et_had_animation\")\n      ) {\n        node.classList.add(\"bt-calm-divi\");\n      }\n      node = node.parentElement;\n    }\n  }\n\n  \/* Divi tauscht bei Geraete-Inhalten (Multi-View) den Text aus \u2013 dann neu zerlegen *\/\n  function watchContent(element) {\n    if (!(\"MutationObserver\" in window)) return;\n    var mo = new MutationObserver(function () {\n      if (needsSplit(element)) setupElement(element);\n    });\n    mo.observe(element, { childList: true, subtree: true });\n  }\n\n  function play(element) {\n    clearTimeout(element.btTimer);\n    element.classList.remove(\"bt-reveal-done\");\n    element.classList.add(\"bt-reveal-play\");\n    element.btTimer = setTimeout(function () {\n      element.classList.add(\"bt-reveal-done\");\n    }, element.btTotal);\n  }\n\n  function reset(element) {\n    clearTimeout(element.btTimer);\n    element.classList.remove(\"bt-reveal-play\", \"bt-reveal-done\");\n  }\n\n  function initializeSlogans() {\n    if (\n      isDiviBuilder() ||\n      !(\"IntersectionObserver\" in window) ||\n      window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n    ) {\n      return;\n    }\n\n    var elements = document.querySelectorAll(\".bt-title-reveal\");\n    var phoneReveal = window.matchMedia(\"(max-width:767px)\").matches;\n    var revealThreshold = phoneReveal ? 0.05 : 0.3;\n\n    var observer = new IntersectionObserver(\n      function (entries) {\n        entries.forEach(function (entry) {\n          var el = entry.target;\n\n          if (entry.isIntersecting && entry.intersectionRatio >= revealThreshold) {\n            if (!el.classList.contains(\"bt-reveal-play\")) play(el);\n            if (!REPLAY) observer.unobserve(el);\n          } else if (REPLAY && entry.intersectionRatio === 0) {\n            reset(el);\n          }\n        });\n      },\n      {\n        threshold: [0, revealThreshold],\n        rootMargin: phoneReveal ? \"0px 0px 8% 0px\" : \"0px 0px -10% 0px\"\n      }\n    );\n\n    Array.prototype.forEach.call(elements, function (element) {\n      if (element.closest(\".et_pb_slide\")) return;\n      if (!element.querySelector(\"h2, h3\")) return;\n\n      calmDiviAnimation(element);\n      \/* bt-door-single-fade-v1: no word splitting or per-word masks on phones. *\/\n      if (phoneReveal && element.closest(\"#banner-tuer\")) {\n        element.classList.add(\"bt-door-soft\");\n        var doorObserver = new IntersectionObserver(function (entries, io) {\n          entries.forEach(function (entry) {\n            if (!entry.isIntersecting) return;\n            entry.target.classList.add(\"bt-door-visible\");\n            io.unobserve(entry.target);\n          });\n        }, { threshold: 0, rootMargin: \"0px 0px 18% 0px\" });\n        doorObserver.observe(element);\n        return;\n      }\n      setupElement(element);\n      watchContent(element);\n      observer.observe(element);\n    });\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", initializeSlogans, { once: true });\n  } else {\n    initializeSlogans();\n  }\n})();\n<\/script>\n<style id=\"bt-v5-door-phone-reveal\">@media(max-width:767px){body.page-id-9606 #banner-tuer>.et_pb_row{animation:none!important;opacity:1!important}body.page-id-9606 #banner-tuer .bt-title-reveal{animation:none!important;opacity:1!important}}<\/style><\/div><\/div>\r\n<div class=\"et_pb_code_25 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n@media (max-width: 980px){\n\n  \/* Banner transparent, damit Standbild sichtbar ist *\/\n  #banner-tuer{\n    position: relative !important;\n    overflow: hidden !important;\n    background-image: none !important;\n    background-color: transparent !important;\n    z-index: 2 !important; \/* Content \u00fcber dem Layer *\/\n  }\n\n  \/* Divi normal Parallax im Banner AUS *\/\n  #banner-tuer :is(.et_parallax_bg_wrap, .et-pb-parallax-wrapper),\n  #banner-tuer :is(.et_parallax_bg, .et-pb-parallax-background){\n    display: none !important;\n  }\n\n  \/* alte Test-Overlays im Banner AUS *\/\n  #banner-tuer .bt-bar-zoom-overlay,\n  #banner-tuer .bt-banner-zoom-overlay,\n  #banner-tuer .bt_zoom_layer,\n  #banner-tuer .bt-banner-parallax-layer,\n  #banner-tuer .bt-banner-standbild,\n  #banner-tuer .bt-standbild-layer,\n  #banner-tuer .bt-fixed-standbild{\n    display: none !important;\n  }\n}\n<\/style>\n\n<script>\n(function(){\n  if (!window.matchMedia || !window.matchMedia(\"(max-width: 980px)\").matches) return;\n\n  const banner = document.getElementById(\"banner-tuer\");\n  if (!banner) return;\n\n  const container = document.getElementById(\"page-container\") || document.body;\n  const IMG_URL = \"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-BG03-2.webp\";\n\n  \/\/ Fixed Layer (in page-container, damit Text sauber dar\u00fcber bleibt)\n  let layer = container.querySelector(\"#bt-fixed-standbild-banner-tuer\");\n  if (!layer){\n    layer = document.createElement(\"div\");\n    layer.id = \"bt-fixed-standbild-banner-tuer\";\n    container.insertBefore(layer, container.firstChild);\n  }\n\n  \/\/ Layer Grundstyle\n  layer.style.position = \"fixed\";\n  layer.style.left = \"0\";\n  layer.style.top  = \"0\";\n  layer.style.width = \"100vw\";\n  layer.style.pointerEvents = \"none\";\n  layer.style.zIndex = \"1\";           \/\/ unter banner (z-index 2)\n  layer.style.opacity = \"0\";\n  layer.style.willChange = \"clip-path, opacity, height\";\n  layer.style.transform = \"translateZ(0)\"; \/\/ stabilisiert iOS Rendering\n  layer.style.overflow = \"hidden\";     \/\/ wichtig, damit img nicht rausragt\n\n  \/\/ IMG im Layer (statt background-size: cover -> kein Pumping)\n  let img = layer.querySelector(\"img.bt-standbild-img\");\n  if (!img){\n    img = document.createElement(\"img\");\n    img.className = \"bt-standbild-img\";\n    img.alt = \"\";\n    img.decoding = \"async\";\n    img.loading = \"eager\";\n    layer.appendChild(img);\n  }\n  img.src = IMG_URL;\n\n  \/\/ IMG Cover\n  img.style.position = \"absolute\";\n  img.style.inset = \"0\";\n  img.style.width = \"100%\";\n  img.style.height = \"100%\";\n  img.style.objectFit = \"cover\";\n  img.style.objectPosition = \"calc(50% - 200px) 50%\"; \/\/ 200px nach links\n  img.style.transform = \"translateZ(0)\";              \/\/ iOS Stabilit\u00e4t\n\n  function setClip(v){\n    layer.style.clipPath = v;\n    layer.style.webkitClipPath = v;\n  }\n\n  \/\/ &#x2705; iOS\/Android Stabilit\u00e4t: Layer-H\u00f6he auf MAX locken\n  let lockedH = 0, lockedW = 0; \/\/ V3: nur bei Breitenwechsel neu messen\n  function getVH(){ return lockedH || window.innerHeight || 1; }\n  function ensureLockedHeight(){\n    const width = window.innerWidth || 1;\n    if(lockedH > 0 && width === lockedW) return;\n    const measure = document.createElement(\"div\");\n    measure.style.cssText = \"position:fixed;top:0;left:0;width:1px;height:100lvh;visibility:hidden;pointer-events:none;\";\n    document.body.appendChild(measure);\n    lockedH = Math.round(measure.getBoundingClientRect().height) || window.innerHeight || 1;\n    measure.remove();\n    lockedW = width;\n    layer.style.height = (lockedH + 0) + \"px\";\n    \n  }\n\n  let ticking = false;\n\n  function update(){\n    ticking = false;\n\n    ensureLockedHeight();\n\n    const r = banner.getBoundingClientRect();\n    const vh = getVH();\n    const vw = window.innerWidth || 1;\n\n    \/\/ nicht sichtbar -> aus\n    if (r.bottom <= 0 || r.top >= vh){\n      layer.style.opacity = \"0\";\n      setClip(\"inset(100% 0 0 0)\");\n      return;\n    }\n\n    const top    = Math.max(0, r.top);\n    const bottom = Math.max(0, vh - r.bottom);\n    const left   = Math.max(0, r.left);\n    const right  = Math.max(0, vw - r.right);\n\n    const clip =\n      \"inset(\" +\n      top.toFixed(2) + \"px \" +\n      right.toFixed(2) + \"px \" +\n      bottom.toFixed(2) + \"px \" +\n      left.toFixed(2) + \"px)\";\n\n    layer.style.opacity = \"1\";\n    setClip(clip);\n  }\n\n  function requestTick(){\n    if(!ticking){\n      ticking = true;\n      requestAnimationFrame(update);\n    }\n  }\n\n  ensureLockedHeight();\n  update();\n\n  window.addEventListener(\"scroll\", requestTick, {passive:true});\n  window.addEventListener(\"resize\", requestTick);\n  window.addEventListener(\"load\", requestTick);\n\n  if (window.visualViewport){\n    window.visualViewport.addEventListener(\"resize\", requestTick);\n    window.visualViewport.addEventListener(\"scroll\", requestTick);\n  }\n})();\n<\/script>\n<\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_5 et_pb_section et_section_regular et_block_section et_pb_section_parallax\" id=\"bar\"><span class=\"et-pb-parallax-wrapper et-pb-parallax-hidden-phone\"><span class=\"et-pb-parallax-background et-pb-parallax-background--css et-pb-parallax-background-module--divi-section-5 et_parallax_bg_tablet_exist\" style=\"background-image:url(https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-BG02-02.jpg)\"><\/span><\/span><span class=\"et-pb-parallax-wrapper et-pb-parallax-hidden-phone\"><span class=\"et-pb-parallax-background et-pb-parallax-background--css et-pb-parallax-background_tablet et-pb-parallax-background_tablet-module--divi-section-5\" style=\"background-image:url(https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-BG02-02.jpg)\"><\/span><\/span>\r\n<div class=\"et_pb_row_51 et_pb_row et_pb_row_1-2_1-4_1-4 et_pb_gutters2 et_block_row et_block_row_1-2_1-4_1-4\">\r\n<div class=\"et_pb_column_138 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_97 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p>Unsere neue Barkarte ist eine Hommage an die spannendsten Epochen und pulsierenden Metropolen dieser Welt. Jeder Drink f\u00e4ngt die unverwechselbare Atmosph\u00e4re und den Charakter dieser Orte ein. Erlebe au\u00dfergew\u00f6hnliche Geschmackserlebnisse, die durch perfekt abgestimmte Kreationen und handverlesene Zutaten aus allen Ecken der Welt zum Leben erwachen.<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_98 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h1>Bar<br \/>Tausend<\/h1>\n<p class=\"bt-bar-opening-hours\"><span class=\"bt-hours-de\" data-no-translation>Mittwoch ab 21&nbsp;Uhr<br \/>Donnerstag \u2013 Samstag ab 19&nbsp;Uhr<\/span><span class=\"bt-hours-en\" lang=\"en\" data-no-translation>Wednesday from 9&nbsp;PM<br \/>Thursday \u2013 Saturday from 7&nbsp;PM<\/span><\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_99 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module\" id=\"pdf-cocktails\"><div class=\"et_pb_text_inner\"><h3 class=\"download-link\"><a href=\"\/\" target=\"_blank\" rel=\"noopener\">Download Bar-Men\u00fc<\/a><\/h3>\n<\/div><\/div>\r\n<div class=\"et_pb_code_26 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><script>\n(function(){\n  var FILE_URL = 'https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-BarCard-Cocktails-20260322-V04.pdf';\n  var FILE_NAME = 'BarTausend-BarCard-Cocktails-20260322-V04.pdf';\n\n  function wireDownload(){\n    var el = document.getElementById('pdf-cocktails');\n    if (!el) return;\n\n    \/\/ Der Divi-Button ist meist direkt <a>. Falls nicht, suche darin.\n    var a = el.tagName && el.tagName.toLowerCase() === 'a' ? el : el.querySelector('a');\n    if (!a) return;\n\n    \/\/ Link-Ziel setzen (\u00fcberschreibt ggf. \"#\")\n    a.setAttribute('href', FILE_URL);\n    a.setAttribute('rel', 'noopener');\n\n    \/\/ Divi-Smooth-Scroll & \"#\" aushebeln: wir \u00fcbernehmen den Klick komplett\n    a.addEventListener('click', function(ev){\n      ev.preventDefault();\n      ev.stopImmediatePropagation();\n\n      \/\/ tempor\u00e4ren Link erzeugen \u2192 download hart ansto\u00dfen\n      var tmp = document.createElement('a');\n      tmp.href = FILE_URL;\n      tmp.setAttribute('download', FILE_NAME); \/\/ einige Browser ignorieren das bei Cross-Origin, dann wird ge\u00f6ffnet\n      tmp.rel = 'noopener';\n      document.body.appendChild(tmp);\n      tmp.click();\n      setTimeout(function(){ document.body.removeChild(tmp); }, 0);\n    }, {passive:false, capture:true});\n  }\n\n  \/\/ warten bis Divi das DOM aufgebaut hat\n  if (document.readyState === 'complete' || document.readyState === 'interactive') {\n    setTimeout(wireDownload, 0);\n  } else {\n    document.addEventListener('DOMContentLoaded', wireDownload);\n  }\n})();\n<\/script>\n<\/div><\/div>\r\n<div class=\"et_pb_text_100 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module bt-bar-quote\"><div class=\"et_pb_text_inner\"><p>\u201cOhne Musik w\u00e4re das Leben ein Irrtum.\u201d<\/p>\n<p class=\"bt-small-quote-credit\">\u2014 Friedrich Nietzsche<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_code_27 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n  #bar{\n    position: relative !important;\n    overflow: hidden !important;\n  }\n\n  \/* Divi Parallax NICHT transformen -> Standbild bleibt *\/\n  #bar :is(.et_parallax_bg_wrap, .et-pb-parallax-wrapper),\n  #bar :is(.et_parallax_bg_wrap, .et-pb-parallax-wrapper) :is(.et_parallax_bg, .et-pb-parallax-background),\n  #bar .et_pb_parallax_css{\n    background-position: center center !important;\n  }\n\n  \/* Overlay-Layer (nur das wird skaliert) *\/\n  #bar .bt-bar-zoom-overlay{\n    position: absolute;\n    inset: 0;\n    background-repeat: no-repeat;\n    background-size: cover;\n    background-position: center center;\n    transform: scale(1);\n    transform-origin: center;\n    will-change: transform;\n    pointer-events: none;\n    z-index: 1;\n  }\n\n  \/* Content nach vorne *\/\n  #bar .et_pb_row,\n  #bar .et_pb_row_inner,\n  #bar .et_pb_module{\n    position: relative !important;\n    z-index: 2 !important;\n  }\n\n  \/* =========================\n     TABLET + PHONE: AUS\n     ========================= *\/\n  @media (max-width: 980px){\n    #bar .bt-bar-zoom-overlay{\n      display: none !important;\n    }\n  }\n<\/style>\n\n<script>\n(function(){\n\n  \/* =========================\n     TABLET + PHONE -> SCRIPT AUS\n     ========================= *\/\n  if (window.matchMedia(\"(max-width: 980px)\").matches) return;\n\n  function ready(fn){\n    if(document.readyState !== 'loading') fn();\n    else document.addEventListener('DOMContentLoaded', fn);\n  }\n  function clamp(v,min,max){ return Math.max(min, Math.min(max, v)); }\n\n  ready(function(){\n    const el = document.querySelector('#bar');\n    if(!el) return;\n\n    const bgSourceEl =\n      el.querySelector(':is(.et_parallax_bg, .et-pb-parallax-background)') ||\n      el.querySelector('.et_pb_parallax_css');\n\n    let bgImage = null;\n    if(bgSourceEl){\n      const x = getComputedStyle(bgSourceEl).backgroundImage;\n      if(x && x !== 'none') bgImage = x;\n    }\n    if(!bgImage){\n      const y = getComputedStyle(el).backgroundImage;\n      if(y && y !== 'none') bgImage = y;\n    }\n    if(!bgImage) return;\n\n    let overlay = el.querySelector('.bt-bar-zoom-overlay');\n    if(!overlay){\n      overlay = document.createElement('div');\n      overlay.className = 'bt-bar-zoom-overlay';\n      el.insertBefore(overlay, el.firstChild);\n    }\n    overlay.style.backgroundImage = bgImage;\n\n    const maxScale = 1.45;\n\n    function update(){\n      const r = el.getBoundingClientRect();\n      const vh = window.innerHeight || document.documentElement.clientHeight;\n\n      if(r.top <= 0){\n        overlay.style.transform = 'scale(1)';\n        return;\n      }\n\n      const endPoint = vh * 0.3;\n      const progress = clamp((vh - r.top) \/ (vh - endPoint), 0, 1);\n\n      const scale = 1 + (maxScale - 1) * (1 - progress);\n      overlay.style.transform = 'scale(' + scale.toFixed(4) + ')';\n    }\n\n    update();\n    window.addEventListener('scroll', update, {passive:true});\n    window.addEventListener('resize', update);\n  });\n})();\n<\/script>\n<style id=\"bt-v5-bar-hours-language\">\n#bar .bt-bar-opening-hours .bt-hours-en{display:none!important}\nhtml[lang^=\"en\"] #bar .bt-bar-opening-hours .bt-hours-de{display:none!important}\nhtml[lang^=\"en\"] #bar .bt-bar-opening-hours .bt-hours-en{display:inline!important}\n<\/style>\n<style id=\"bt-v5-bar-phone-background-off\">\n@media(max-width:767px){\n html body.page-id-9606 #page-container #bar#bar{background-image:none!important;background-color:#111!important}\n html body.page-id-9606 #page-container #bar#bar::before,html body.page-id-9606 #page-container #bar#bar::after{background-image:none!important}\n html body.page-id-9606 #bar :is(.et_parallax_bg_wrap,.et-pb-parallax-wrapper,.et_pb_parallax_css,.bt-bar-zoom-overlay,.et_pb_section_video_bg,video){display:none!important}\n html body.page-id-9606 #page-container #bar#bar .bt-bar-opening-hours{font:500 clamp(16px,4.5vw,19px)\/1.45 \"Oswald\",sans-serif!important;white-space:nowrap!important;letter-spacing:0!important}\n html body.page-id-9606 #page-container .bt-current-opening-hours{font:500 clamp(15px,4.3vw,18px)\/1.5 \"Oswald\",sans-serif!important;letter-spacing:0!important;text-align:center!important}\n html body.page-id-9606 #page-container .bt-current-opening-hours .bt-opening-line{display:block!important;white-space:nowrap!important}\n html body.page-id-9606 #page-container :is(.bt-bar-opening-hours,.bt-current-opening-hours) .bt-hours-en{display:none!important}\n html[lang^=\"en\"] body.page-id-9606 #page-container :is(.bt-bar-opening-hours,.bt-current-opening-hours) .bt-hours-de{display:none!important}\n html[lang^=\"en\"] body.page-id-9606 #page-container :is(.bt-bar-opening-hours,.bt-current-opening-hours) .bt-hours-en{display:inline!important}\n html body.page-id-9606 #page-container #bar#bar .bt-barway{font:400 11px\/1.3 \"Poppins\",sans-serif!important;letter-spacing:0!important;white-space:nowrap!important}\n html body.page-id-9606 #page-container #bar#bar .bt-barway__en{display:none!important}\n html[lang^=\"en\"] body.page-id-9606 #page-container #bar#bar .bt-barway__de{display:none!important}\n html[lang^=\"en\"] body.page-id-9606 #page-container #bar#bar .bt-barway__en{display:inline!important}\n}\n<\/style>\n<style id=\"bt-v5-phone-plan-passage\">@media(max-width:767px){\nhtml body.page-id-9606 #page-container #bar#bar .et_pb_text.bt-barway-module{left:86.5%!important;top:64%!important;translate:none!important;transform:translate(-50%,-50%)!important;width:max-content!important;max-width:none!important}\nhtml body.page-id-9606 #page-container #bar#bar .bt-barway{font-size:10px!important;letter-spacing:.025em!important;text-transform:none!important;white-space:nowrap!important;min-height:44px!important;padding:0!important;width:max-content!important}\n}<\/style><\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_139 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_48 et_pb_image et_pb_module et_block_module bt-bar-plan-image\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-BG02-02-Plan.png\" alt=\"Grundriss der Bar Tausend\" width=\"437\" height=\"1002\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-BG02-02-Plan.png 437w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-BG02-02-Plan-131x300.png 131w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-BG02-02-Plan-5x12.png 5w\" sizes=\"(max-width: 437px) 100vw, 437px\" class=\"wp-image-9541\" title=\"BarTausend-Cantina-BG04-2\" \/><\/span><\/div>\r\n<div class=\"et_pb_text_101 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module bt-barway-module\"><div class=\"et_pb_text_inner\"><p><a class=\"bt-barway\" href=\"#cantina\"><span class=\"bt-barway__de\" lang=\"de\">Zur Cantina <span class=\"bt-barway__arrows\" aria-hidden=\"true\">\u25b7\u25b7\u25b7<\/span><\/span><span class=\"bt-barway__en\" lang=\"en\">To Cantina <span class=\"bt-barway__arrows\" aria-hidden=\"true\">\u25b7\u25b7\u25b7<\/span><\/span><\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_140 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_102 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h2 class=\"bt-bar-info-title\">Hinter der Stahlt\u00fcr<\/h2>\n<p>Ein verborgener Ort f\u00fcr besondere N\u00e4chte \u2013 und l\u00e4ngst eine Berliner Institution. Seit \u00fcber einem Jahrzehnt pr\u00e4gt dieser Ort das Berliner Nachtleben und zieht ein anspruchsvolles Publikum an.<\/p>\n<p>Versteckt hinter einer unscheinbaren Stahlt\u00fcr, direkt am S-Bahnhof Friedrichstra\u00dfe, erwartet Sie ein exklusives Ambiente, das urbanen Chic mit gem\u00fctlicher Atmosph\u00e4re vereint. <\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_103 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p>Ob Sie einen unvergesslichen Abend mit Freunden verbringen oder eine exklusive Veranstaltung planen \u2013 bei uns sind Sie goldrichtig.<\/p>\n<p>Lassen Sie sich von unseren Mixologen mit au\u00dfergew\u00f6hnlichen Kreationen verw\u00f6hnen.<\/p>\n<\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_6 et_pb_section et_section_regular et_block_section\" id=\"drinks-banner\">\r\n<div class=\"et_pb_row_52 et_pb_row et_pb_equal_columns et_block_row\">\r\n<div class=\"et_pb_column_141 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_slider_0 et_pb_slider et_pb_slider_fullwidth_off et_pb_slider_no_arrows et_pb_slider_no_pagination et_slider_auto et_slider_auto_ignore_hover et_slider_speed_10000 et_pb_module et_block_module dv-parallax-video bt-slider-reveal\" id=\"cocktail-slider\"><div class=\"et_pb_slides\">\r\n<div class=\"et_pb_slide_0 et_pb_slide et_pb_media_alignment_center et_pb_bg_layout_dark et_pb_text_align_center et-pb-has-background-video et_pb_preload\" data-slide-id=\"divi\/slide-0\"><span class=\"et-pb-background-video et_pb_allow_player_pause\"><video autoplay loop playsinline muted><source type=\"video\/mp4\" data-src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Drink-OldCuban-v2.mp4\" \/><\/video><\/span><span class=\"et-pb-background-video et_pb_allow_player_pause et-pb-background-video_phone\"><video autoplay loop playsinline muted><source type=\"video\/mp4\" data-src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Drink-OldCuban-mobile-v2.mp4\" \/><\/video><\/span><div class=\"et_pb_container\"><div class=\"et_pb_slider_container_inner\"><div class=\"et_pb_slide_description\"><div class=\"et_pb_slide_content\" data-et-mv-hidden-tablet=\"true\" data-et-mv-hidden-phone=\"true\"><h2>OLD CUBAN<\/h2>\n<h3>Caribbean Dark Rum \u00b7 Champagner \u00b7 Limette \u00b7 Zucker \u00b7 Frische Minze \u00b7 Angostura Bitters<\/h3>\n<h4>Sweet &amp; Sour Cocktail<\/h4>\n<\/div><\/div><\/div><\/div><\/div>\r\n<\/div><\/div>\r\n<div class=\"et_pb_code_28 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n\/* =========================================================\n   BAR TAUSEND \u00b7 SLIDER TEXT REVEAL V2\n   Fuer Cocktail-Banner im Divi-Slider\n   Klasse am Slider-Modul: bt-slider-reveal\n========================================================= *\/\n\n\/* Divis eigene Einblendung der Slide-Texte abschalten *\/\n.bt-slider-reveal .et_pb_slide_description {\n  animation-name: none !important;\n  opacity: 1 !important;\n}\n\n\/* Schrift der Ueberschriften behalten (globale Poppins-Regel aushebeln) *\/\n.bt-slider-reveal .bt-svis,\n.bt-slider-reveal .bt-sw,\n.bt-slider-reveal .bt-swi,\n.bt-slider-reveal .bt-ssr {\n  font-family: inherit !important;\n  font-weight: inherit !important;\n  font-style: inherit !important;\n  letter-spacing: inherit !important;\n  text-transform: inherit !important;\n  line-height: inherit !important;\n  color: inherit !important;\n}\n\n.bt-slider-reveal .bt-sw {\n  display: inline-block;\n  vertical-align: top;\n  padding-bottom: 0.14em;\n  margin-bottom: -0.14em;\n  clip-path: polygon(-40% -80%, 140% -80%, 140% 100%, -40% 100%);\n}\n\n.bt-slider-reveal .bt-swi {\n  display: inline-block;\n  transform-origin: 50% 100%;\n}\n\n.bt-slider-reveal .bt-ssr {\n  position: absolute !important;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0 0 0 0);\n  white-space: nowrap;\n  border: 0;\n}\n\n\/* Startzustand *\/\n.bt-slider-reveal.bt-s-ready .bt-swi {\n  opacity: 0;\n  transform: translate3d(0, 108%, 0) scale(1.03);\n  filter: blur(10px);\n}\n\n\/* Aktive Slide spielt ab *\/\n.bt-slider-reveal.bt-s-ready .bt-s-play .bt-swi {\n  animation: btSlideWordIn 1400ms cubic-bezier(0.19, 1, 0.22, 1) both;\n  animation-delay: calc(200ms + var(--bt-i, 0) * var(--bt-step, 70ms));\n}\n\n@keyframes btSlideWordIn {\n  0% {\n    opacity: 0;\n    transform: translate3d(0, 108%, 0) scale(1.03);\n    filter: blur(10px);\n    text-shadow: 0 0 0 rgba(255, 255, 255, 0);\n  }\n\n  45% {\n    opacity: 1;\n    filter: blur(0);\n    text-shadow:\n      0 0 18px rgba(255, 255, 255, 0.38),\n      0 0 2px rgba(255, 255, 255, 0.6);\n  }\n\n  100% {\n    opacity: 1;\n    transform: none;\n    filter: none;\n  }\n}\n\n\/* Im Divi-Builder immer normal sichtbar *\/\n.et-fb-root-ancestor .bt-slider-reveal .bt-swi {\n  opacity: 1 !important;\n  transform: none !important;\n  filter: none !important;\n  animation: none !important;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .bt-slider-reveal .bt-sw,\n  .bt-slider-reveal .bt-swi {\n    opacity: 1 !important;\n    clip-path: none !important;\n    transform: none !important;\n    filter: none !important;\n    animation: none !important;\n  }\n}\n<\/style>\n\n<script>\n(function () {\n  \"use strict\";\n\n  var TEXT_SELECTOR =\n    \".et_pb_slide_title, .et_pb_slide_content h1, .et_pb_slide_content h2, \" +\n    \".et_pb_slide_content h3, .et_pb_slide_content h4, .et_pb_slide_content h5, \" +\n    \".et_pb_slide_content h6, .et_pb_slide_content p\";\n\n  function isDiviBuilder() {\n    return (\n      document.body.classList.contains(\"et-fb\") ||\n      document.querySelector(\".et-fb-root-ancestor\")\n    );\n  }\n\n  function cleanText(text) {\n    [10, 13, 9].forEach(function (code) {\n      text = text.split(String.fromCharCode(code)).join(\" \");\n    });\n    return text;\n  }\n\n  function readableText(block) {\n    var copy = block.cloneNode(true);\n    Array.prototype.forEach.call(copy.querySelectorAll(\"br\"), function (br) {\n      br.parentNode.replaceChild(document.createTextNode(\" \"), br);\n    });\n    return cleanText(copy.textContent).split(\" \").filter(Boolean).join(\" \");\n  }\n\n  function splitWords(root, start) {\n    var index = start;\n\n    function walk(node) {\n      Array.prototype.slice.call(node.childNodes).forEach(function (child) {\n        if (child.nodeType === 3) {\n          var text = cleanText(child.nodeValue);\n          if (!text.trim()) return;\n\n          var frag = document.createDocumentFragment();\n          var parts = text.split(\" \");\n\n          parts.forEach(function (part, i) {\n            if (part) {\n              var outer = document.createElement(\"span\");\n              var inner = document.createElement(\"span\");\n              outer.className = \"bt-sw\";\n              inner.className = \"bt-swi\";\n              inner.textContent = part;\n              inner.style.setProperty(\"--bt-i\", index);\n              index++;\n              outer.appendChild(inner);\n              frag.appendChild(outer);\n            }\n            if (i < parts.length - 1) {\n              frag.appendChild(document.createTextNode(\" \"));\n            }\n          });\n\n          child.parentNode.replaceChild(frag, child);\n        } else if (child.nodeType === 1 && child.tagName !== \"BR\") {\n          walk(child);\n        }\n      });\n    }\n\n    walk(root);\n    return index;\n  }\n\n  function prepareBlock(block, start) {\n    if (block.getAttribute(\"data-bt-split\") === \"1\") return start;\n    if (!block.textContent.trim()) return start;\n\n    var fullText = readableText(block);\n    var visual = document.createElement(\"span\");\n    visual.className = \"bt-svis\";\n    visual.setAttribute(\"aria-hidden\", \"true\");\n\n    while (block.firstChild) {\n      visual.appendChild(block.firstChild);\n    }\n\n    var sr = document.createElement(\"span\");\n    sr.className = \"bt-ssr\";\n    sr.textContent = fullText;\n\n    block.appendChild(sr);\n    block.appendChild(visual);\n    block.setAttribute(\"data-bt-split\", \"1\");\n\n    return splitWords(visual, start);\n  }\n\n  function setupSlide(slide) {\n    var count = 0;\n    Array.prototype.forEach.call(slide.querySelectorAll(TEXT_SELECTOR), function (block) {\n      if (block.parentElement.closest(\"[data-bt-split]\")) return;\n      count = prepareBlock(block, count);\n    });\n    var step = Math.min(70, Math.round(1300 \/ Math.max(count, 1)));\n    slide.style.setProperty(\"--bt-step\", step + \"ms\");\n  }\n\n  function needsSplit(slide) {\n    return Array.prototype.some.call(slide.querySelectorAll(TEXT_SELECTOR), function (block) {\n      return (\n        block.getAttribute(\"data-bt-split\") !== \"1\" &&\n        !block.parentElement.closest(\"[data-bt-split]\") &&\n        block.textContent.trim() !== \"\"\n      );\n    });\n  }\n\n  \/* Divi tauscht bei Geraete-Inhalten (Multi-View) den Text aus \u2013 dann neu zerlegen *\/\n  function watchContent(slide) {\n    var desc = slide.querySelector(\".et_pb_slide_description\");\n    if (!desc || !(\"MutationObserver\" in window)) return;\n    new MutationObserver(function () {\n      if (needsSplit(slide)) setupSlide(slide);\n    }).observe(desc, { childList: true, subtree: true });\n  }\n\n  function play(slide) {\n    clearTimeout(slide.btTimer);\n    slide.classList.remove(\"bt-s-play\");\n    void slide.offsetWidth;\n    slide.classList.add(\"bt-s-play\");\n  }\n\n  function setupSlider(wrapper) {\n    var slides = wrapper.querySelectorAll(\".et_pb_slide\");\n    if (!slides.length) return;\n\n    var visible = false;\n\n    function activeSlide() {\n      return wrapper.querySelector(\".et_pb_slide.et-pb-active-slide\") || slides[0];\n    }\n\n    Array.prototype.forEach.call(slides, function (slide) {\n      setupSlide(slide);\n      watchContent(slide);\n      slide.btActive = slide.classList.contains(\"et-pb-active-slide\");\n\n      if (\"MutationObserver\" in window) {\n        new MutationObserver(function () {\n          var isActive = slide.classList.contains(\"et-pb-active-slide\");\n          if (isActive === slide.btActive) return;\n          slide.btActive = isActive;\n\n          if (isActive) {\n            if (visible) play(slide);\n          } else {\n            \/* alte Slide erst nach Divis Ueberblendung zuruecksetzen *\/\n            clearTimeout(slide.btTimer);\n            slide.btTimer = setTimeout(function () {\n              if (!slide.btActive) slide.classList.remove(\"bt-s-play\");\n            }, 900);\n          }\n        }).observe(slide, { attributes: true, attributeFilter: [\"class\"] });\n      }\n    });\n\n    wrapper.classList.add(\"bt-s-ready\");\n\n    var io = new IntersectionObserver(\n      function (entries) {\n        entries.forEach(function (entry) {\n          if (entry.isIntersecting && entry.intersectionRatio >= 0.3) {\n            if (!visible) {\n              visible = true;\n              play(activeSlide());\n            }\n          } else if (entry.intersectionRatio === 0) {\n            visible = false;\n            Array.prototype.forEach.call(slides, function (s) {\n              s.classList.remove(\"bt-s-play\");\n            });\n          }\n        });\n      },\n      { threshold: [0, 0.3] }\n    );\n\n    io.observe(wrapper);\n  }\n\n  function init() {\n    if (\n      isDiviBuilder() ||\n      !(\"IntersectionObserver\" in window) ||\n      window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n    ) {\n      return;\n    }\n\n    Array.prototype.forEach.call(\n      document.querySelectorAll(\".bt-slider-reveal\"),\n      setupSlider\n    );\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", init, { once: true });\n  } else {\n    init();\n  }\n})();\n<\/script>\n<style id=\"bt-v5-cocktail-heading\">\nbody.page-id-9606 #drinks-banner .et_pb_slide_content h2{font-size:48px!important}\n@media(max-width:767px){body.page-id-9606 #drinks-banner .et_pb_slide_content h2{font-size:44px!important}}\n<\/style><\/div><\/div>\r\n<div class=\"et_pb_code_29 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n\/* =========================================================\n   DRINKS-BANNER \u2014 MOBILE VIDEO OFFSET (DIVI SAFE)\n   - Video bleibt sichtbar (wichtig!)\n   - calc() raus (weniger Reposition-Jumps)\n   - Fallback dunkel (wei\u00dfes blitzen verhindern)\n   ========================================================= *\/\n@media (max-width: 980px){\n\n  \/* nur im drinks-banner: nie wei\u00df als Fallback *\/\n  #drinks-banner,\n  #drinks-banner .et_pb_section_video_bg,\n  #drinks-banner .et_pb_section_video_bg_wrap{\n    background-color:#0a0a0a !important;\n  }\n\n  \/* Wrapper darf nicht abschneiden *\/\n  #drinks-banner .et_pb_section_video_bg{\n    overflow:hidden !important;\n  }\n\n  \/* Video: NICHT die Divi-Positionierung killen, nur dein Offset *\/\n  #drinks-banner .et_pb_section_video_bg video{\n    object-fit:cover !important;\n    object-position:50% 50% !important;\n\n    \/* dein gew\u00fcnschter Versatz *\/\n    margin-left:-300px !important;\n\n    background-color:#0a0a0a !important;\n    -webkit-backface-visibility:hidden;\n    backface-visibility:hidden;\n  }\n}\n<\/style>\n\n\n\n\n<style id=\"bt-old-cuban-video-position\">\n\/* Keep the fixed parallax video centred independently of MediaElement's resize offsets. *\/\nhtml:not(.et-fb):not(.et_fb) #cocktail-slider .et-pb-background-video :is(.mejs-container,.mejs-inner,.mejs-mediaelement,mediaelementwrapper){\n  position:absolute!important;inset:0!important;\n  width:100%!important;height:100%!important;min-width:0!important;min-height:0!important;\n  margin:0!important;padding:0!important;transform:none!important;\n}\nhtml:not(.et-fb):not(.et_fb) #cocktail-slider .et-pb-background-video video{\n  position:fixed!important;top:0!important;left:0!important;\n  width:100vw!important;height:100vh!important;\n  min-width:100vw!important;min-height:100vh!important;max-width:none!important;max-height:none!important;\n  margin:0!important;transform:none!important;\n  object-fit:cover!important;object-position:center center!important;\n}\n<\/style><\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_7 et_pb_section et_section_regular et_block_section bt-barcard-section\" id=\"barcards\">\r\n<div class=\"et_pb_row_53 et_pb_row et_pb_equal_columns et_pb_gutters1 et_block_row bt-barcard-row\">\r\n<div class=\"et_pb_column_142 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_code_30 et_pb_code et_pb_module bt-barcard-books-code\"><div class=\"et_pb_code_inner\"><div id=\"bt-barcard-books\">\n  <div class=\"bt-book-panel is-active\" data-bt-book=\"cocktails\">\n    <div id=\"bt-book-cocktails\">\n      <div class=\"real3dflipbook\" id=\"2_6aefc04bd7245\" style=\"position:absolute;\"><\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"bt-book-panel\" data-bt-book=\"color\">\n    <div id=\"bt-book-color\">\n      <div class=\"real3dflipbook\" id=\"3_6aefc04bd753f\" style=\"position:absolute;\"><\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"bt-book-panel\" data-bt-book=\"whisky\">\n    <div id=\"bt-book-whisky\">\n      <div class=\"real3dflipbook\" id=\"4_6aefc04bd7743\" style=\"position:absolute;\"><\/div>\n    <\/div>\n  <\/div>\n<\/div><\/div><\/div>\r\n<div class=\"et_pb_code_31 et_pb_code et_pb_module bt-barcard-system-code\"><div class=\"et_pb_code_inner\"><!--\nBAR TAUSEND \u00b7 CODE SYSTEM V5.10 \u00b7 23.10.2026\nCODE SYSTEM vollst\u00e4ndig ersetzen. CODE BOOKS \/ CODE MENU bleiben bestehen.\n\nBasis: V5.8 (eigener Karten-Cursor, vom Nutzer am 06.10.2026 best\u00e4tigt).\nV5.9: Hat der Nutzer selbst gebl\u00e4ttert, bleibt die Karte beim Verlassen offen.\nNur automatisch ge\u00f6ffnet: Karte klappt beim Verlassen sichtbar zu (unter 45 % sichtbar).\nEingaben w\u00e4hrend einer Bl\u00e4tterung werden gemerkt und direkt danach ausgef\u00fchrt\n(Klick, Taste, Ziehen\/Wischen) - kein \"H\u00e4ngen\" mehr bis zum Ende der Animation.\nGreifhand erst nach 250 ms Halten oder echtem Ziehen: kein Blinken des Pfeils bei Klick.\nErstes Einblenden immer weich: erst wenn der Bereich ins Bild kommt und WebGL fertig gezeichnet hat.\nRegex ohne Backslash (Divi). Alle \u00fcbrigen Funktionen unver\u00e4ndert aus V5.8.\n-->\n\n<style>\n#barcards.bt-barcard-section {\n  --bt-card-top: clamp(40px, 6svh, 72px);\n  --bt-card-bottom: 118px;\n  position: relative !important;\n  z-index: 3;\n  height: 100vh !important;\n  min-height: 100vh !important;\n  max-height: none !important;\n  padding: 0 !important;\n  overflow: visible !important;\n}\n@supports (height: 100svh) {\n  #barcards.bt-barcard-section { height: 100svh !important; min-height: 100svh !important; }\n}\n#barcards > .et_parallax_bg_wrap { overflow: hidden !important; }\n#barcards > .et_pb_row,\n#barcards .bt-barcard-row,\n#barcards .et_pb_column {\n  width: 100% !important; max-width: 100% !important;\n  height: 100% !important; min-height: 100% !important;\n  margin: 0 !important; padding: 0 !important;\n  position: relative !important;\n  overflow: visible !important;\n  background-color: transparent !important;\n}\n#barcards .et_pb_module { margin-bottom: 0 !important; }\n#barcards .bt-barcard-system-code { display: none !important; }\n#barcards .bt-barcard-books-code {\n  position: absolute !important;\n  inset: var(--bt-card-top) 0 var(--bt-card-bottom) !important;\n  height: auto !important; min-height: 0 !important;\n  margin: 0 !important; padding: 0 !important; z-index: 2 !important;\n}\n#barcards .bt-barcard-books-code .et_pb_code_inner,\n#barcards #bt-barcard-books,\n#barcards #bt-book-cocktails,\n#barcards #bt-book-color,\n#barcards #bt-book-whisky {\n  position: relative !important;\n  width: 100% !important; height: 100% !important; min-height: 100% !important;\n  margin: 0 !important; padding: 0 !important;\n}\n#barcards .bt-book-panel {\n  position: absolute !important; inset: 0 !important;\n  visibility: visible !important; opacity: 0 !important;\n  pointer-events: none !important; z-index: 0 !important;\n  transition: opacity 800ms cubic-bezier(.22, .61, .36, 1) !important;\n}\n\/* Erster Auftritt: l\u00e4nger und weich ein- und auslaufend. *\/\n#barcards .bt-book-panel.bt-soft-reveal { transition: opacity 1100ms cubic-bezier(.4, 0, .2, 1) !important; }\n#barcards .bt-book-panel.is-active { z-index: 2 !important; }\n#barcards .bt-book-panel.is-active.bt-pdf-ready { opacity: 1 !important; pointer-events: auto !important; }\n#barcards .real3dflipbook,\n#barcards [class^=\"real3dflipbook-\"],\n#barcards [class*=\" real3dflipbook-\"],\n#barcards .flipbook-container,\n#barcards .flipbook-main-wrapper,\n#barcards .flipbook-viewport,\n#barcards .fp-wrapper {\n  width: 100% !important; height: 100% !important; min-height: 100% !important;\n  margin: 0 !important; padding: 0 !important;\n}\n\/* Nur die B\u00fchnen \u00f6ffnen, nicht die einzelnen Seiten oder Texturen. *\/\n#barcards .bt-barcard-books-code,\n#barcards .bt-barcard-books-code .et_pb_code_inner,\n#barcards #bt-barcard-books,\n#barcards .bt-book-panel,\n#barcards #bt-book-cocktails,\n#barcards #bt-book-color,\n#barcards #bt-book-whisky,\n#barcards .real3dflipbook,\n#barcards [class^=\"real3dflipbook-\"],\n#barcards [class*=\" real3dflipbook-\"],\n#barcards .flipbook-container,\n#barcards .flipbook-main-wrapper,\n#barcards .flipbook-viewport,\n#barcards .fp-wrapper,\n#barcards .flipbook-bookLayer,\n#barcards .flipbook-pan-viewport { overflow: visible !important; }\n\/* Zeichenfl\u00e4che und alle \u00e4u\u00dferen grauen Fl\u00e4chen transparent. *\/\n#barcards .bt-barcard-books-code,\n#barcards .bt-barcard-menu-code,\n#barcards .et_pb_code_inner,\n#barcards #bt-barcard-books,\n#barcards .bt-book-panel,\n#barcards #bt-book-cocktails,\n#barcards #bt-book-color,\n#barcards #bt-book-whisky,\n#barcards .real3dflipbook,\n#barcards [class^=\"real3dflipbook-\"],\n#barcards [class*=\" real3dflipbook-\"],\n#barcards .flipbook-container,\n#barcards .flipbook-main-wrapper,\n#barcards .flipbook-viewport,\n#barcards .fp-wrapper,\n#barcards .flipbook-bookLayer,\n#barcards .flipbook-pan-viewport,\n#barcards .flipbook-loading-bg,\n#barcards canvas { background: transparent !important; }\n#barcards .flipbook-main-wrapper { --flipbook-bg: transparent !important; }\n\/* Papier-\/Ladeuntergrund bleibt dunkel: kein Durchscheinen leerer Seiten. *\/\n#barcards .flipbook-page3-bg,\n#barcards .flipbook-preloader { background-color: #212121 !important; }\n#barcards.bt-barcard-section::before { content: none !important; }\n\n\/* Men\u00fc liegt \u00fcber der Bl\u00e4tterb\u00fchne, ohne fl\u00e4chigen Hintergrund. *\/\n#barcards .bt-barcard-menu-code {\n  position: absolute !important; left: 0 !important; right: 0 !important;\n  bottom: calc(33px + env(safe-area-inset-bottom, 0px)) !important;\n  z-index: 20 !important; margin: 0 !important; padding: 0 !important;\n  pointer-events: none;\n}\n#barcards .bt-barcard-menu-code .et_pb_code_inner { margin: 0 !important; padding: 0 !important; }\n#barcards #bt-barcard-switch-nav {\n  width: 100% !important; display: flex !important; flex-wrap: wrap !important;\n  justify-content: center !important; align-items: center !important;\n  gap: 4px 30px !important; padding: 0 16px !important; margin: 0 !important;\n  background: transparent !important; pointer-events: none;\n}\n#barcards .bt-barcard-switch-group { display: flex !important; align-items: center !important; }\n#barcards .bt-barcard-switch-group--cocktails { gap: 12px !important; }\n#barcards .bt-barcard-switch-group--whisky { margin-left: 0 !important; }\n#barcards .bt-barcard-switch-sep { color: #bdbdbd !important; pointer-events: none !important; }\n#barcards .bt-barcard-switch-btn {\n  display: inline-flex !important; align-items: center !important; justify-content: center !important;\n  min-height: 44px !important; padding: 6px 8px !important; margin: 0 !important;\n  font: 18px\/1.25 Oswald, sans-serif !important; letter-spacing: 2px !important;\n  text-transform: uppercase !important; color: #ea0b5f !important;\n  background: transparent !important; border: 0 !important; box-shadow: none !important;\n  cursor: pointer !important; pointer-events: auto !important;\n  text-shadow: none !important;\n  text-decoration: none !important;\n  transition: color 700ms cubic-bezier(.22, .61, .36, 1) !important;\n}\n#barcards .bt-barcard-switch-btn:hover { color: #fff !important; }\n#barcards .bt-barcard-switch-btn.is-active {\n  color: #ebebeb !important; text-decoration: none !important;\n}\n\n#barcards .bt-pdf-status {\n  position: absolute; left: 20px; right: 20px; top: auto; bottom: 22px; z-index: 12;\n  color: #a6a6a6; text-align: center; font: 11px\/1.5 Poppins, sans-serif;\n  letter-spacing: .04em; pointer-events: none;\n}\n#barcards .bt-pdf-status[hidden] { display: none !important; }\n#barcards .bt-card-sr {\n  position: absolute !important; width: 1px !important; height: 1px !important;\n  padding: 0 !important; margin: -1px !important; overflow: hidden !important;\n  clip-path: inset(50%) !important; white-space: nowrap !important; border: 0 !important;\n}\n\/* Plugin-Bedienelemente: eigene Steuerung ersetzt sie. *\/\n#barcards .flipbook-menuBottom,\n#barcards .flipbook-menuTop,\n#barcards .flipbook-bottom-bar,\n#barcards .flipbook-toolbar,\n#barcards .fp-toolbar,\n#barcards .r3d-toolbar,\n#barcards .fb3d-toolbar,\n#barcards .fp-bottom-bar,\n#barcards .r3d-bottom-bar,\n#barcards .fb3d-bottom-bar,\n#barcards .flipbook-menu-left,\n#barcards .flipbook-currentPageHolder,\n#barcards .flipbook-page-number,\n#barcards .flipbook-pageNum,\n#barcards .flipbook-pageNumber,\n#barcards .pageNumber,\n#barcards .currentPage,\n#barcards .fp-page-number,\n#barcards .r3d-page-number,\n#barcards .flipbook-page-count,\n#barcards .flipbook-pageCount,\n#barcards .flipbook-left-arrow,\n#barcards .flipbook-right-arrow { display: none !important; }\n@media (max-width: 980px) {\n  #barcards.bt-barcard-section { --bt-card-top: 36px; --bt-card-bottom: 126px; }\n  #barcards #bt-barcard-switch-nav { gap: 0 14px !important; }\n  #barcards .bt-barcard-switch-btn { font-size: 16px !important; letter-spacing: 1px !important; }\n}\n@media (max-width: 600px) {\n  #barcards.bt-barcard-section { --bt-card-top: 28px; --bt-card-bottom: 170px; }\n  \/* Platz f\u00fcr den feststehenden Reservierungsbutton unten rechts. *\/\n  #barcards .bt-barcard-menu-code { bottom: max(64px, calc(env(safe-area-inset-bottom) + 54px)) !important; }\n  #barcards #bt-barcard-switch-nav { gap: 0 8px !important; padding: 0 8px !important; }\n  #barcards .bt-barcard-switch-group--cocktails { gap: 4px !important; }\n  #barcards .bt-barcard-switch-btn { font-size: 14px !important; letter-spacing: .6px !important; padding: 6px !important; }\n}\n@media (max-height: 540px) {\n  #barcards.bt-barcard-section { height: 600px !important; min-height: 600px !important; }\n}\n@media (prefers-reduced-motion: reduce) {\n  #barcards .bt-book-panel, #barcards .bt-book-panel.bt-soft-reveal,\n  #barcards .bt-barcard-switch-btn { transition: none !important; }\n}\n@media (forced-colors: active) {\n  #barcards .bt-barcard-switch-btn { color: ButtonText !important; text-shadow: none !important; }\n}\n\n\/* Keine Rahmen bei Mausklick. Tastaturfokus bleibt lokal erkennbar. *\/\n#barcards .bt-barcard-switch-btn:focus,\n#barcards #bt-barcard-books:focus,\n#barcards .flipbook-main-wrapper:focus,\n#barcards canvas:focus {\n  outline: none !important; box-shadow: none !important;\n}\n#barcards .bt-barcard-switch-btn { position: relative; }\n#barcards .bt-barcard-switch-btn:focus-visible::after {\n  content: \"\"; position: absolute; bottom: 1px; left: calc(50% - 3px);\n  width: 6px; height: 6px; border-radius: 50%; background: #edf2fc;\n}\n#barcards .bt-card-keyboard-hint { display: none; }\n#barcards #bt-barcard-books:focus-visible > .bt-card-keyboard-hint {\n  display: block; position: absolute; top: 0; left: 50%; transform: translateX(-50%);\n  z-index: 15; padding: 4px 10px; border-radius: 4px;\n  color: #edf2fc; background: #212121; font: 13px\/1.5 sans-serif;\n  white-space: nowrap; pointer-events: none;\n}\n#barcards .bt-book-panel.bt-input-paused { pointer-events: none !important; }\n@media (forced-colors: active) {\n  #barcards .bt-barcard-switch-btn:focus-visible::after { background: Highlight; }\n}\n\n\/* V5.8: eigener Karten-Cursor. difference = automatisch hell auf dunkel, dunkel auf hell. *\/\n#bt-card-pointer {\n  --bt-ring-size: 22px;\n  position: fixed; left: 0; top: 0;\n  width: 0; height: 0;\n  transform: translate3d(-200px, -200px, 0);\n  z-index: 2147483647;\n  pointer-events: none !important;\n  color: #fff;\n  mix-blend-mode: difference;\n}\n#bt-card-pointer > * {\n  position: absolute; left: 0; top: 0; display: block;\n  opacity: 0; transform: translate(-50%, -50%);\n  transition: opacity 120ms ease;\n  pointer-events: none;\n}\n#bt-card-pointer .bt-card-pointer-ring {\n  width: var(--bt-ring-size); height: var(--bt-ring-size);\n  background: url(\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/Cursor-3.png\") center \/ contain no-repeat;\n}\n@supports ((mask-image: url(\"\")) or (-webkit-mask-image: url(\"\"))) {\n  #bt-card-pointer .bt-card-pointer-ring {\n    background: currentColor;\n    -webkit-mask: url(\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/Cursor-3.png\") center \/ contain no-repeat;\n    mask: url(\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/Cursor-3.png\") center \/ contain no-repeat;\n  }\n}\n#bt-card-pointer .bt-card-pointer-arrow { width: 30px; height: 23px; }\n#bt-card-pointer[data-edge=\"-1\"] .bt-card-pointer-arrow { transform: translate(-50%, -50%) rotate(180deg); }\n#bt-card-pointer .bt-card-pointer-grip { width: 30px; height: 30px; }\n@supports not (mix-blend-mode: difference) {\n  #bt-card-pointer { color: #edf2fc; }\n  #bt-card-pointer > * { filter: drop-shadow(0 0 1px #111) drop-shadow(0 1px 1px rgba(0,0,0,.8)); }\n}\n@media (hover:hover) and (pointer:fine) {\n  #bt-card-pointer[data-mode=\"ring\"] .bt-card-pointer-ring,\n  #bt-card-pointer[data-mode=\"edge\"] .bt-card-pointer-arrow,\n  #bt-card-pointer[data-mode=\"grip\"] .bt-card-pointer-grip { opacity: 1; }\n  \/* Theme-Cursor nur \u00fcber der Karte ausblenden. *\/\n  body.bt-card-pointer-active #bt-theme-cursor { opacity: 0 !important; transition: none !important; }\n  \/* Spezifisch genug, um cursor:pointer !important des Men\u00fcs zu \u00fcberschreiben. *\/\n  body.bt-theme-cursor-active #barcards,\n  body.bt-theme-cursor-active #barcards *,\n  body.bt-card-pointer-active,\n  body.bt-card-pointer-active *,\n  body.bt-card-pointer-active #barcards,\n  body.bt-card-pointer-active #barcards * { cursor: none !important; }\n}\n@media (prefers-reduced-motion: reduce) {\n  #bt-card-pointer > * { transition: none; }\n}\n<\/style>\n\n<script>\n(function () {\n  'use strict';\n  \/* ===================== SETTINGS ===================== *\/\n  var RANDOM_START = true;\n  var AUTO_OPEN = true;\n  var OPEN_DELAY = 2000;\n  \/\/ Automatisch ge\u00f6ffnete Karte klappt zu, sobald weniger als 45 % sichtbar sind.\n  var CLOSE_AT = 0.45;\n  \/\/ Erstes Einblenden erst, wenn mindestens 8 % des Bereichs sichtbar sind ...\n  var REVEAL_AT = 0.08;\n  \/\/ ... und die Seiten seit 250 ms fertig sind (WebGL hat dann sicher gezeichnet).\n  var SETTLE_MS = 250;\n\n  \/* ===================== INIT ===================== *\/\n  function init() {\n    \/* bt-books-near-v2: prepare only the selected book, two screens ahead. *\/\n    if(!init.btNearReady && 'IntersectionObserver' in window){var btBooksHost=document.getElementById('barcards');if(btBooksHost){var btBooksNear=new IntersectionObserver(function(es){if(!es.some(function(e){return e.isIntersecting;}))return;btBooksNear.disconnect();init.btNearReady=true;init();},{rootMargin:'200% 0px 200% 0px'});btBooksNear.observe(btBooksHost);return;}}\n    \/* Nicht im Divi Visual Builder *\/\n    if (\n      document.body.classList.contains('et-fb') ||\n      document.documentElement.classList.contains('et-fb-root-ancestor')\n    ) {\n      return;\n    }\n    var section = document.getElementById('barcards');\n    var wrap = document.getElementById('bt-barcard-books');\n    var nav = document.getElementById('bt-barcard-switch-nav');\n    if (!section || !wrap || !nav || section.dataset.btCardsV59) {\n      return;\n    }\n    section.dataset.btCardsV59 = '1';\n    var panels = Array.from(wrap.querySelectorAll('.bt-book-panel[data-bt-book]'));\n    var buttons = Array.from(nav.querySelectorAll('[data-bt-book]'));\n    if (!panels.length) {\n      return;\n    }\n    \/* Real3D 5.8: its own viewport observer otherwise starts all overlapping panels.\n       Keep this gate local to these three cards; initStarted remains owned by Real3D. *\/\n    var mainProto = window.FLIPBOOK && window.FLIPBOOK.Main && window.FLIPBOOK.Main.prototype;\n    if (mainProto && typeof mainProto.init === 'function' && !mainProto.btSelectiveStartV510) {\n      var originalInit = mainProto.init;\n      mainProto.btSelectiveStartV510 = true;\n      mainProto.init = function () {\n        var panel = this.elem && this.elem.closest('#barcards .bt-book-panel');\n        if (panel && panel.getAttribute('data-bt-load-allowed') !== '1') return Promise.resolve();\n        return originalInit.apply(this, arguments);\n      };\n    }\n    var isEnglish = \/^en(?:-|$)\/i.test(document.documentElement.lang || '') || \/^\\\/en(?:\\\/|$)\/.test(location.pathname);\n    var motion = window.matchMedia('(prefers-reduced-motion: reduce)');\n    var current = null;\n    var pendingSelection = null;\n    var switchUntil = 0;\n    var autoTimer = 0;\n    var timer = 0;\n    \/* Perf 22.10.: pause offscreen book checks beyond the prewarm margin. *\/\n    var evalNear = true;\n    if ('IntersectionObserver' in window) {\n      new IntersectionObserver(function (entries) {\n        evalNear = entries[entries.length - 1].isIntersecting;\n        if (evalNear && typeof evaluate === 'function') evaluate();\n      }, {rootMargin: '200% 0px 200% 0px'}).observe(section);\n    }\n\n    \/* ===================== STATUS TEXT ===================== *\/\n    var status = document.createElement('div');\n    status.className = 'bt-pdf-status';\n    status.setAttribute('role', 'status');\n    status.hidden = true;\n    wrap.appendChild(status);\n    var keyboardHint = document.createElement('span');\n    keyboardHint.className = 'bt-card-keyboard-hint';\n    keyboardHint.textContent = isEnglish ? 'Use the left and right arrow keys' : 'Mit \u2190 und \u2192 bl\u00e4ttern';\n    keyboardHint.setAttribute('aria-hidden', 'true');\n    wrap.appendChild(keyboardHint);\n\n    \/* ===================== STATES ===================== *\/\n    var states = panels.map(function (panel) {\n      var state = {\n        panel: panel,\n        key: panel.dataset.btBook,\n        main: null,\n        manual: false,\n        autoOpened: false,\n        resetPending: false,\n        ready: false,\n        revealing: false,\n        loadStarted: 0,\n        pointer: null,\n        navigationEpoch: 0,\n        restarting: false,\n        userTurned: false,\n        queuedTurn: '',\n        flushFrame: 0,\n        pagesSince: 0,\n        softTimer: 0\n      };\n      \/\/ Nur NEUE Gesten blockieren, solange eine Animation oder \u00dcberblendung l\u00e4uft.\n      \/\/ Angenommene Gesten behalten move\/up\/cancel f\u00fcr das native Loslassen.\n      \/\/ V5.9: W\u00e4hrend einer Bl\u00e4tterung wird die Geste gemerkt und danach ausgef\u00fchrt.\n      function guardNewGesture(event) {\n        if (state !== current || !state.ready || state.restarting ||\n            performance.now() < switchUntil ||\n            (state.main && state.main.Book && busy(state.main.Book))) {\n          if (event.type === 'pointerdown' && event.isPrimary && canQueue(state) &&\n              !(event.pointerType === 'mouse' && event.button !== 0)) {\n            state.pointer = {\n              id: event.pointerId,\n              x: event.clientX,\n              y: event.clientY,\n              epoch: state.navigationEpoch,\n              moved: false,\n              queued: true\n            };\n            state.manual = true;\n            clearAuto();\n          }\n          if (event.cancelable) event.preventDefault();\n          event.stopImmediatePropagation();\n        }\n      }\n      ['pointerdown', 'mousedown', 'touchstart'].forEach(function (type) {\n        panel.addEventListener(type, guardNewGesture, {capture: true, passive: false});\n      });\n      \/* POINTER DOWN: nicht blockieren, Real3D darf greifen und ziehen. *\/\n      panel.addEventListener('pointerdown', function (event) {\n        if (!event.isPrimary) return;\n        if (event.pointerType === 'mouse' && event.button !== 0) return;\n        state.pointer = {\n          id: event.pointerId,\n          x: event.clientX,\n          y: event.clientY,\n          epoch: state.navigationEpoch,\n          moved: false\n        };\n        state.manual = true;\n        clearAuto();\n      }, true);\n      \/* POINTER MOVE: nur feststellen, ob wirklich gezogen wurde. *\/\n      panel.addEventListener('pointermove', function (event) {\n        var pointer = state.pointer;\n        if (!pointer || pointer.id !== event.pointerId) return;\n        var distance = Math.hypot(event.clientX - pointer.x, event.clientY - pointer.y);\n        if (distance > 10) pointer.moved = true;\n      }, true);\n      \/* POINTER CANCEL *\/\n      panel.addEventListener('pointercancel', function (event) {\n        if (state.pointer && state.pointer.id === event.pointerId) state.pointer = null;\n      }, true);\n      \/* POINTER UP: Pointer kurz behalten, der folgende CLICK braucht ihn. *\/\n      panel.addEventListener('pointerup', function (event) {\n        if (!state.pointer || state.pointer.id !== event.pointerId) return;\n        var releasedPointer = state.pointer;\n        \/\/ Gemerkte Geste: Wischrichtung bzw. Klickseite bestimmen und vormerken.\n        if (releasedPointer.queued && !releasedPointer.handled) {\n          releasedPointer.handled = true;\n          var dx = event.clientX - releasedPointer.x;\n          var dy = event.clientY - releasedPointer.y;\n          var direction = '';\n          if (Math.abs(dx) > 30 && Math.abs(dx) > Math.abs(dy)) {\n            direction = dx < 0 ? 'next' : 'prev';\n          } else if (!releasedPointer.moved) {\n            var box = panel.getBoundingClientRect();\n            direction = event.clientX < box.left + box.width \/ 2 ? 'prev' : 'next';\n          }\n          if (direction) turn(state, direction);\n        }\n        window.setTimeout(function () {\n          if (state.pointer === releasedPointer) state.pointer = null;\n        }, 500);\n      }, true);\n      \/* CLICK: nur bei echtem kurzen Klick selbst bl\u00e4ttern.\n         Linke H\u00e4lfte = zur\u00fcck, rechte H\u00e4lfte = weiter. Nach Drag nicht zus\u00e4tzlich bl\u00e4ttern. *\/\n      panel.addEventListener('click', function (event) {\n        if (state !== current || !state.ready) return;\n        if (event.button !== undefined && event.button !== 0) return;\n        \/\/ Gemerkte Geste wurde bereits beim Loslassen ausgewertet.\n        if (state.pointer && state.pointer.queued) {\n          state.pointer = null;\n          event.preventDefault();\n          event.stopImmediatePropagation();\n          alignBarcards();\n          return;\n        }\n        var wasDragged = !!(state.pointer && state.pointer.moved);\n        var nativeTurned = state.pointer && state.pointer.epoch !== state.navigationEpoch;\n        state.pointer = null;\n        \/\/ Plugin-Klick stoppen, damit daraus kein Klick-Zoom wird.\n        event.preventDefault();\n        event.stopImmediatePropagation();\n        if (wasDragged || event.detail > 1) return;\n        alignBarcards();\n        if (nativeTurned) return;\n        var rect = panel.getBoundingClientRect();\n        var middle = rect.left + rect.width \/ 2;\n        turn(state, event.clientX < middle ? 'prev' : 'next');\n      }, true);\n      \/* DOPPELKLICK: niemals Plugin-Zoom ausl\u00f6sen. *\/\n      panel.addEventListener('dblclick', function (event) {\n        if (state !== current) return;\n        state.pointer = null;\n        event.preventDefault();\n        event.stopImmediatePropagation();\n      }, true);\n      return state;\n    });\n\n    var names = {cocktails: 'Cocktails', color: 'New Menu', whisky: 'Whisky & Rum'};\n    section.setAttribute('role', 'region');\n    section.setAttribute('aria-label', 'Barkarten');\n    wrap.tabIndex = 0;\n    wrap.setAttribute('role', 'group');\n    wrap.setAttribute('aria-label', 'Barkarte \u2013 mit Pfeil links oder rechts bl\u00e4ttern');\n    wrap.setAttribute('aria-describedby', 'bt-card-help');\n    nav.setAttribute('role', 'group');\n    nav.setAttribute('aria-label', 'Barkarte ausw\u00e4hlen');\n    var help = document.createElement('p');\n    help.id = 'bt-card-help';\n    help.className = 'bt-card-sr';\n    help.textContent = isEnglish ? 'Use the left and right arrow keys to turn pages. Press Tab to leave the menu. Click the left or right side of the menu or drag a page. On touch devices, tap or swipe.' : 'Mit Pfeil links und rechts bl\u00e4ttern. Mit Tab verlassen Sie die Karte. Mit der Maus links oder rechts auf die Karte klicken oder eine Seite ziehen. Auf Touchger\u00e4ten antippen oder wischen.';\n    section.appendChild(help);\n    var announce = document.createElement('div');\n    announce.className = 'bt-card-sr';\n    announce.setAttribute('role', 'status');\n    announce.setAttribute('aria-atomic', 'true');\n    section.appendChild(announce);\n    section.addEventListener('focusin', function () {\n      if (current) current.manual = true;\n      clearAuto();\n    });\n    wrap.addEventListener('keydown', function (event) {\n      if (event.target !== wrap || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;\n      if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\n      event.preventDefault();\n      event.stopPropagation();\n      if (!event.repeat && current) turn(current, event.key === 'ArrowLeft' ? 'prev' : 'next');\n    });\n    function updateControls() {\n      var main = current && current.main;\n      var book = main && main.Book;\n      var enabled = !!(current && current.ready && book && book.enabled);\n      wrap.setAttribute('aria-busy', String(!enabled));\n      if (enabled && !busy(book)) {\n        var page = String(main.currentPageValue || '').replace(\/[^0-9 \u2013-]\/g, '');\n        var message = (names[current.key] || current.key) + (page ? ', Seite ' + page : ', bereit');\n        if (announce.textContent !== message) announce.textContent = message;\n      }\n    }\n\n    \/* ===================== V5.8 KARTEN-CURSOR =====================\n       Rein dekorativ: keine Eingriffe in Real3D-Klicks oder -Ziehen.\n       \u00dcber der Karte ersetzt er den Theme-Cursor vollst\u00e4ndig. *\/\n    function installCardCursor() {\n      var fine = window.matchMedia('(hover:hover) and (pointer:fine)');\n      var overlay = document.createElement('span');\n      overlay.id = 'bt-card-pointer';\n      overlay.setAttribute('aria-hidden', 'true');\n      overlay.dataset.edge = '0';\n      var ring = document.createElement('span');\n      ring.className = 'bt-card-pointer-ring';\n      overlay.appendChild(ring);\n      var ns = 'http:\/\/www.w3.org\/2000\/svg';\n      function icon(className, viewBox, strokeWidth, paths) {\n        var svg = document.createElementNS(ns, 'svg');\n        svg.setAttribute('class', className);\n        svg.setAttribute('viewBox', viewBox);\n        svg.setAttribute('fill', 'none');\n        svg.setAttribute('stroke', 'currentColor');\n        svg.setAttribute('stroke-width', strokeWidth);\n        svg.setAttribute('stroke-linecap', 'round');\n        svg.setAttribute('stroke-linejoin', 'round');\n        svg.setAttribute('focusable', 'false');\n        paths.forEach(function (d) {\n          var path = document.createElementNS(ns, 'path');\n          path.setAttribute('d', d);\n          svg.appendChild(path);\n        });\n        overlay.appendChild(svg);\n      }\n      icon('bt-card-pointer-arrow', '0 0 32 24', '1.6', ['M3 12h26M23 6l6 6-6 6']);\n      \/\/ Greifende Hand (geschlossene Finger).\n      icon('bt-card-pointer-grip', '0 0 24 24', '1.7', [\n        'M18 11.5V9a2 2 0 0 0-2-2a2 2 0 0 0-2 2v1.4',\n        'M14 10V8a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2',\n        'M10 9.9V9a2 2 0 0 0-2-2a2 2 0 0 0-2 2v5',\n        'M6 14a2 2 0 0 0-2-2a2 2 0 0 0-2 2',\n        'M18 11a2 2 0 1 1 4 0v3a8 8 0 0 1-8 8h-4a8 8 0 0 1-8-8 2 2 0 1 1 4 0'\n      ]);\n      document.body.appendChild(overlay);\n\n      var mode = '';\n      var pressId = null;\n      var pressPoint = null;\n      var gripTimer = 0;\n      var edgeDirection = 0;\n      var lastPointer = null;\n      var positionFrame = 0;\n      var scrollFrame = 0;\n      var sized = false;\n      \/* Skip card hit-testing while its section is far outside the viewport. *\/\n      var near = true;\n      if ('IntersectionObserver' in window) {\n        new IntersectionObserver(function (entries) {\n          near = entries[entries.length - 1].isIntersecting;\n        }, {rootMargin: '600px 0px 600px 0px'}).observe(section);\n      }\n\n      \/\/ Ringgr\u00f6\u00dfe exakt vom Theme-Cursor \u00fcbernehmen.\n      function adoptThemeSize() {\n        if (sized) return;\n        var theme = document.getElementById('bt-theme-cursor');\n        if (!theme) return;\n        var width = parseFloat(window.getComputedStyle(theme, '::after').width);\n        if (width > 4 && width < 120) {\n          overlay.style.setProperty('--bt-ring-size', width + 'px');\n          sized = true;\n        }\n      }\n      function place() {\n        positionFrame = 0;\n        if (!lastPointer) return;\n        overlay.style.transform = 'translate3d(' + lastPointer.x + 'px,' + lastPointer.y + 'px,0)';\n      }\n      function position(x, y) {\n        lastPointer = {x: x, y: y};\n        if (!positionFrame) positionFrame = requestAnimationFrame(place);\n      }\n      function setMode(next) {\n        if (next === mode) return;\n        if (next && !mode) {\n          adoptThemeSize();\n          \/\/ Sofort an die richtige Stelle, kein Aufblitzen an alter Position.\n          if (positionFrame) cancelAnimationFrame(positionFrame);\n          place();\n        }\n        mode = next;\n        overlay.dataset.mode = next;\n        document.body.classList.toggle('bt-card-pointer-active', !!next);\n      }\n      function onStage(target) {\n        return target instanceof Element && wrap.contains(target) &&\n          !target.closest('a, button, input, select, textarea, [role=\"button\"]');\n      }\n      function canGrab(target) {\n        var book = current && current.main && current.main.Book;\n        \/\/ Auch w\u00e4hrend einer Bl\u00e4tterung: die Geste wird gemerkt und danach ausgef\u00fchrt.\n        return !!(current && current.ready && !current.restarting &&\n          performance.now() >= switchUntil && current.panel.contains(target) &&\n          book && book.enabled);\n      }\n      function hover(x, y, target) {\n        position(x, y);\n        if (!fine.matches || document.hidden || !onStage(target)) {\n          edgeDirection = 0;\n          setMode('');\n          return;\n        }\n        \/\/ W\u00e4hrend Laden\/\u00dcberblenden: ruhiger Ring statt Wechsel zum Theme-Cursor.\n        if (!(current && current.ready && current.panel.contains(target))) {\n          edgeDirection = 0;\n          setMode('ring');\n          return;\n        }\n        var rect = wrap.getBoundingClientRect();\n        var dx = x - rect.left;\n        var zone = Math.min(72, Math.max(28, rect.width * .06));\n        \/\/ 14 px Toleranz verhindert Flackern an der Zonengrenze.\n        var leftZone = zone + (edgeDirection === -1 ? 14 : 0);\n        var rightZone = zone + (edgeDirection === 1 ? 14 : 0);\n        var edge = dx >= 0 && dx < leftZone ? -1 :\n          dx <= rect.width && dx > rect.width - rightZone ? 1 : 0;\n        if (y < rect.top || y > rect.bottom) edge = 0;\n        edgeDirection = edge;\n        overlay.dataset.edge = String(edge);\n        setMode(edge ? 'edge' : 'ring');\n      }\n      function hoverAt(x, y) {\n        hover(x, y, document.elementFromPoint(x, y));\n      }\n      function release(x, y) {\n        clearTimeout(gripTimer);\n        gripTimer = 0;\n        pressId = null;\n        pressPoint = null;\n        \/\/ Gefangener Pointer meldet evtl. das alte Ziel: echtes Element unter der Maus pr\u00fcfen.\n        if (typeof x === 'number') hoverAt(x, y);\n        else if (lastPointer) hoverAt(lastPointer.x, lastPointer.y);\n        else setMode('');\n      }\n      function hide() {\n        clearTimeout(gripTimer);\n        gripTimer = 0;\n        pressId = null;\n        pressPoint = null;\n        edgeDirection = 0;\n        setMode('');\n      }\n\n      window.addEventListener('pointermove', function (event) {\n        if (event.pointerType !== 'mouse') return;\n        if (pressId !== null) {\n          if (event.pointerId !== pressId) return;\n          if (!(event.buttons & 1)) { release(event.clientX, event.clientY); return; }\n          position(event.clientX, event.clientY);\n          if (mode !== 'grip' && pressPoint &&\n              Math.hypot(event.clientX - pressPoint.x, event.clientY - pressPoint.y) > 6) {\n            clearTimeout(gripTimer);\n            gripTimer = 0;\n            setMode('grip');\n          }\n          return;\n        }\n        hover(event.clientX, event.clientY, event.target);\n      }, {capture: true, passive: true});\n\n      window.addEventListener('pointerdown', function (event) {\n        if (event.pointerType !== 'mouse' || !event.isPrimary) return;\n        if (event.button !== 0 || !fine.matches || !onStage(event.target) || !canGrab(event.target)) {\n          hover(event.clientX, event.clientY, event.target);\n          return;\n        }\n        position(event.clientX, event.clientY);\n        pressId = event.pointerId;\n        pressPoint = {x: event.clientX, y: event.clientY};\n        clearTimeout(gripTimer);\n        \/\/ Normaler Klick (unter 250 ms) bleibt Ring\/Pfeil - kein Blinken.\n        \/\/ Halten oder echtes Ziehen zeigt die Greifhand.\n        gripTimer = setTimeout(function () {\n          gripTimer = 0;\n          if (pressId !== null) setMode('grip');\n        }, 250);\n      }, {capture: true, passive: true});\n\n      window.addEventListener('pointerup', function (event) {\n        if (pressId === null || event.pointerId !== pressId) return;\n        release(event.clientX, event.clientY);\n      }, {capture: true, passive: true});\n      \/\/ Absicherung, falls das Plugin pointerup verschluckt.\n      window.addEventListener('mouseup', function (event) {\n        if (pressId !== null && event.button === 0) release(event.clientX, event.clientY);\n      }, {capture: true, passive: true});\n      window.addEventListener('pointercancel', function (event) {\n        if (pressId !== null && event.pointerId === pressId) release();\n      }, {capture: true, passive: true});\n\n      \/\/ Nur beim echten Verlassen des Fensters ausblenden, nie w\u00e4hrend gehalten wird.\n      window.addEventListener('mouseout', function (event) {\n        if (event.relatedTarget || pressId !== null) return;\n        lastPointer = null;\n        hide();\n      }, {passive: true});\n      window.addEventListener('blur', hide);\n      window.addEventListener('pagehide', hide);\n      document.addEventListener('visibilitychange', function () {\n        if (document.hidden) hide();\n      });\n      if (fine.addEventListener) fine.addEventListener('change', hide);\n      else if (fine.addListener) fine.addListener(hide);\n\n      window.addEventListener('scroll', function () {\n        if (pressId !== null || !lastPointer || scrollFrame || (!mode && !near)) return;\n        scrollFrame = requestAnimationFrame(function () {\n          scrollFrame = 0;\n          if (pressId === null && lastPointer && !document.hidden && (mode || near)) hoverAt(lastPointer.x, lastPointer.y);\n        });\n      }, {passive: true});\n\n      \/\/ Wird vom Pr\u00fcfzyklus aufgerufen: Zustand nach Kartenwechsel\/Laden nachf\u00fchren.\n      return function refresh() {\n        if (pressId === null && lastPointer && !document.hidden && (mode || near)) {\n          hoverAt(lastPointer.x, lastPointer.y);\n        }\n      };\n    }\n    var refreshCursor = installCardCursor();\n\n    var anchorFrame = 0;\n    var anchorTarget = null;\n    function cancelAnchorScroll() {\n      cancelAnimationFrame(anchorFrame);\n      anchorFrame = 0;\n      anchorTarget = null;\n    }\n    function alignBarcards() {\n      var scrolling = document.scrollingElement || document.documentElement;\n      var target = window.scrollY + section.getBoundingClientRect().top;\n      target = Math.max(0, Math.min(target, scrolling.scrollHeight - scrolling.clientHeight));\n      \/\/ Wiederholte Klicks starten dieselbe Scrollanimation nicht neu.\n      if (anchorFrame && Math.abs(target - anchorTarget) < 2) return;\n      cancelAnchorScroll();\n      var start = window.scrollY;\n      if (Math.abs(start - target) < 2) return;\n      var left = window.scrollX;\n      if (motion.matches) {\n        window.scrollTo({top: target, left: left, behavior: 'instant'});\n        return;\n      }\n      anchorTarget = target;\n      var started = performance.now();\n      var duration = Math.min(1500, 1050 + Math.abs(target - start) * 0.25);\n      function step(now) {\n        var t = Math.min(1, (now - started) \/ duration);\n        \/\/ Quintisches Smoothstep: weicher Start und weiches Ende.\n        var eased = t * t * t * (t * (t * 6 - 15) + 10);\n        window.scrollTo({top: start + (target - start) * eased, left: left, behavior: 'instant'});\n        if (t < 1 && !motion.matches) anchorFrame = requestAnimationFrame(step);\n        else {\n          if (motion.matches) window.scrollTo({top: target, left: left, behavior: 'instant'});\n          anchorFrame = 0;\n          anchorTarget = null;\n        }\n      }\n      anchorFrame = requestAnimationFrame(step);\n    }\n    window.addEventListener('wheel', cancelAnchorScroll, {passive: true});\n    window.addEventListener('touchstart', cancelAnchorScroll, {passive: true});\n    window.addEventListener('keydown', function (event) {\n      if (['ArrowUp', 'ArrowDown', 'PageUp', 'PageDown', 'Home', 'End', ' ', 'Escape'].includes(event.key)) cancelAnchorScroll();\n    });\n    window.addEventListener('pagehide', cancelAnchorScroll);\n\n    \/* ===================== AUTO TIMER ===================== *\/\n    function clearAuto() {\n      clearTimeout(autoTimer);\n      autoTimer = 0;\n    }\n    \/* ===================== BOOK BUSY? ===================== *\/\n    function busy(book) {\n      return !!(\n        \/\/ CSS3D speichert hier eine Zielseite, WebGL einen Boolean.\n        book.goingToPage === true ||\n        book.flipping ||\n        (typeof book.isFlipping === 'function' && book.isFlipping())\n      );\n    }\n    \/* ===================== PAGE TURN ===================== *\/\n    \/\/ Blockiert nur, weil gerade gebl\u00e4ttert wird? Dann darf gemerkt werden.\n    function canQueue(state) {\n      var book = state.main && state.main.Book;\n      return !!(state === current && state.ready && !state.restarting &&\n        performance.now() >= switchUntil && book && book.enabled);\n    }\n    \/\/ Ein Schritt Puffer: die letzte Eingabe gewinnt, Ausf\u00fchrung direkt nach der Animation.\n    function queueTurn(state, direction) {\n      state.queuedTurn = direction;\n      if (state.flushFrame) return;\n      var waitStart = performance.now();\n      function flush() {\n        state.flushFrame = 0;\n        var next = state.queuedTurn;\n        if (!next) return;\n        var book = state.main && state.main.Book;\n        if (state !== current || !state.ready || state.restarting || !book ||\n            performance.now() - waitStart > 4000) {\n          state.queuedTurn = '';\n          return;\n        }\n        if (busy(book) || performance.now() < switchUntil) {\n          state.flushFrame = requestAnimationFrame(flush);\n          return;\n        }\n        state.queuedTurn = '';\n        turn(state, next);\n      }\n      state.flushFrame = requestAnimationFrame(flush);\n    }\n    function turn(state, direction) {\n      state.manual = true;\n      state.userTurned = true;\n      clearAuto();\n      var main = state.main;\n      if (\n        state !== current || !state.ready || state.restarting ||\n        performance.now() < switchUntil ||\n        !main || !main.Book || !main.Book.enabled\n      ) {\n        return;\n      }\n      if (busy(main.Book)) {\n        queueTurn(state, direction);\n        return;\n      }\n      if (direction === 'prev') {\n        main.prevPage();\n      } else {\n        if (main.uiLocked) return;\n        if (typeof main.Book.canFlipNext === 'function' && !main.Book.canFlipNext()) {\n          restartAtCover(state);\n        } else {\n          main.nextPage();\n        }\n      }\n    }\n    function restartAtCover(state) {\n      state.restarting = true;\n      state.ready = false;\n      state.pagesSince = 0;\n      state.panel.classList.remove('bt-pdf-ready');\n      \/\/ Nie die animierte Mehrseiten-R\u00fcckbl\u00e4tterung des Plugins starten.\n      window.setTimeout(function () {\n        state.main.goToPage(1, true);\n        state.restarting = false;\n        \/\/ evaluate\/reveal warten auf die Cover-Texturen, dann weiches Einblenden.\n        evaluate();\n      }, motion.matches ? 0 : 820);\n    }\n    \/* ===================== SECTION VISIBILITY ===================== *\/\n    function ratio() {\n      var r = section.getBoundingClientRect();\n      var h = window.innerHeight;\n      if (r.height <= 0) return 0;\n      return Math.max(0, Math.min(r.bottom, h) - Math.max(r.top, 0)) \/ r.height;\n    }\n    \/* ===================== REAL3D BIND ===================== *\/\n    function bind(state, main) {\n      if (state.main === main) return;\n      var book = main.Book;\n      if (!book) return;\n      state.main = main;\n      \/\/ Native Gesten-Bl\u00e4tterungen beobachten; der folgende Klick darf nicht doppelt bl\u00e4ttern.\n      ['nextPage', 'prevPage'].forEach(function (method) {\n        var original = book[method];\n        if (typeof original !== 'function') return;\n        book[method] = function () {\n          state.navigationEpoch++;\n          \/\/ Ziehen\/Wischen des Nutzers z\u00e4hlt als Bl\u00e4ttern: Karte bleibt dann offen.\n          if (state.pointer && !state.pointer.queued) state.userTurned = true;\n          return original.apply(this, arguments);\n        };\n      });\n      \/\/ Real3D 5.4: native Transparenz und zus\u00e4tzliche WebGL-Zeichenfl\u00e4che.\n      if (main.options) {\n        main.options.backgroundTransparent = true;\n        main.options.backgroundColor = 'transparent';\n        main.options.backgroundImage = '';\n        main.options.backgroundPattern = '';\n        main.options.menuOverBook = true;\n        main.options.menu2OverBook = true;\n        main.options.responsiveView = true;\n        main.options.responsiveViewTreshold = 980;\n        main.options.responsiveViewRatio = 1;\n        main.options.bookVerticalPadding = Math.max(Number(main.options.bookVerticalPadding) || 0, 120);\n      }\n      \/\/ Verhindert, dass alle drei B\u00fccher auf globale Pfeiltasten reagieren.\n      if (typeof main.handleKeydown === 'function') {\n        document.removeEventListener('keydown', main.handleKeydown);\n      }\n      if (book.renderer && typeof book.renderer.setClearAlpha === 'function') {\n        book.renderer.setClearAlpha(0);\n      }\n      requestAnimationFrame(function () {\n        \/\/ onBookCreated installiert diesen Listener erst nach bind().\n        if (typeof main.handleKeydown === 'function') {\n          document.removeEventListener('keydown', main.handleKeydown);\n        }\n        if (book.enabled && !busy(book) && typeof main.resize === 'function') {\n          main.resize(true);\n        }\n      });\n      \/\/ Real3D darf Seiten au\u00dferhalb des Viewports NICHT komplett entladen.\n      if (typeof book.hibernate === 'function' && !book.btKeepPagesV59) {\n        book.btKeepPagesV59 = true;\n        book.hibernate = function () {};\n      }\n      \/\/ Zoom aus, Drag\/Swipe ausdr\u00fccklich an.\n      if (main.options) {\n        main.options.doubleClickZoomDisabled = true;\n        main.options.doubleClickZoom = false;\n        main.options.wheelDisabledNotFullscreen = true;\n        main.options.wheelZoomAlways = false;\n        main.options.pageDragDisabled = false;\n        main.options.pageDrag = true;\n        main.options.touchSwipeEnabled = true;\n      }\n      \/* Plugin-Pfeile aus *\/\n      if (main.btnNext) main.btnNext.style.display = 'none';\n      if (main.btnPrev) main.btnPrev.style.display = 'none';\n    }\n    \/* Start the chosen viewer ahead of entry, using Real3D's own guarded initializer. *\/\n    function prepareSelected(state) {\n      if (!state || document.hidden || !evalNear) return;\n      state.panel.setAttribute('data-bt-load-allowed', '1');\n      var api = window.FLIPBOOK;\n      var host = state.panel.querySelector('[class^=\"real3dflipbook-\"],[class*=\" real3dflipbook-\"]');\n      var instance = api && typeof api.getBook === 'function' && host ? api.getBook(host) : null;\n      if (!instance) return;\n      if (!state.loadStarted) state.loadStarted = Date.now();\n      if (!instance.initStarted && typeof instance.init === 'function') {\n        var loading = instance.init();\n        if (loading && loading.catch) loading.catch(function () {});\n      }\n      if (instance.Book) bind(state, instance);\n    }\n    \/* ===================== REAL3D INSTANZEN FINDEN ===================== *\/\n    function discover() {\n      var registry = window.FLIPBOOK && window.FLIPBOOK.books;\n      if (!registry) return;\n      Object.keys(registry).forEach(function (id) {\n        var book = registry[id];\n        var main = book && book.main;\n        if (!main || !main.elem) return;\n        var state = states.find(function (item) {\n          return item.panel.contains(main.elem);\n        });\n        if (state) bind(state, main);\n      });\n    }\n    \/* ===================== PAGE TEXTURES READY? ===================== *\/\n    function hasPages(state) {\n      var book = state.main && state.main.Book;\n      if (!book || busy(book)) return false;\n      \/* WEBGL *\/\n      if (book.renderer && Array.isArray(book.pages)) {\n        var index = book.flippedleft;\n        if (typeof index !== 'number') return false;\n        var left = book.pages[index - 1];\n        var right = book.pages[index];\n        return !!(left || right) &&\n          (!left || left.sizeBack > 0) &&\n          (!right || right.sizeFront > 0);\n      }\n      \/* CSS3D FALLBACK *\/\n      var images = state.panel.querySelectorAll('.flipbook-page3-bg img');\n      return images.length > 0 && Array.from(images).every(function (img) {\n        return img.complete && img.naturalWidth > 0;\n      });\n    }\n    \/* ===================== DUNKLE PLACEHOLDER ===================== *\/\n    function darkPlaceholders(state) {\n      var book = state.main && state.main.Book;\n      if (!book || !Array.isArray(book.pages)) return;\n      book.pages.forEach(function (page) {\n        if (page.btDarkV59) return;\n        if (!page.preloaderMatF || !page.preloaderMatB) return;\n        [page.preloaderMatF, page.preloaderMatB].forEach(function (material) {\n          if (material.color && typeof material.color.set === 'function') {\n            material.color.set('#212121');\n            material.map = null;\n            material.needsUpdate = true;\n          }\n        });\n        page.btDarkV59 = true;\n      });\n    }\n    \/* ===================== PANEL REVEAL ===================== *\/\n    \/\/ Merkt sich, seit wann die Seiten eines Buchs fertig sind.\n    function trackPages(state) {\n      if (state.ready || state.revealing) return;\n      if (hasPages(state)) {\n        if (!state.pagesSince) state.pagesSince = performance.now();\n      } else {\n        state.pagesSince = 0;\n      }\n    }\n    function reveal(state) {\n      if (state.ready || state.revealing) return;\n      if (!hasPages(state)) { state.pagesSince = 0; return; }\n      var now = performance.now();\n      if (!state.pagesSince) state.pagesSince = now;\n      \/\/ Beim Kartenwechsel sofort \u00fcberblenden (wie bisher).\n      \/\/ Sonst erst, wenn der Bereich ins Bild kommt und WebGL sicher gezeichnet hat:\n      \/\/ so ist jeder erste Auftritt gleich weich, egal wie schnell geladen wurde.\n      if (now >= switchUntil) {\n        if (document.hidden || ratio() < REVEAL_AT) return;\n        if (now - state.pagesSince < SETTLE_MS) return;\n      }\n      state.revealing = true;\n      requestAnimationFrame(function () {\n        requestAnimationFrame(function () {\n          state.revealing = false;\n          if (state.ready || !hasPages(state)) return;\n          var soft = performance.now() >= switchUntil;\n          state.panel.classList.toggle('bt-soft-reveal', soft);\n          state.ready = true;\n          state.panel.classList.add('bt-pdf-ready');\n          if (state === current) status.hidden = true;\n          clearTimeout(state.softTimer);\n          if (soft) {\n            state.softTimer = setTimeout(function () {\n              state.panel.classList.remove('bt-soft-reveal');\n            }, 1300);\n          }\n        });\n      });\n    }\n    \/* ===================== MAIN STATE CHECK ===================== *\/\n    function evaluate() {\n      if (!evalNear && !pendingSelection && performance.now() >= switchUntil &&\n          !(current && current.autoOpened && !current.userTurned)) return;\n      prepareSelected(current);\n      discover();\n      if (pendingSelection && canSwitch()) {\n        var requested = pendingSelection;\n        pendingSelection = null;\n        select(requested);\n        return;\n      }\n      if (performance.now() >= switchUntil) {\n        states.forEach(function (item) { item.panel.classList.remove('bt-input-paused'); });\n      }\n      updateControls();\n      if (refreshCursor) refreshCursor();\n      states.forEach(darkPlaceholders);\n      states.forEach(trackPages);\n      \/* A prepared cover needs no offscreen render loop. Real3D enables it on entry. *\/\n      if (current && current.main && current.main.Book && current.pagesSince &&\n          performance.now() - current.pagesSince >= SETTLE_MS && ratio() === 0 && current.main.Book.enabled &&\n          typeof current.main.Book.disable === 'function') current.main.Book.disable();\n      if (!current) return;\n      var visible = ratio();\n      var state = current;\n      var main = state.main;\n      var book = main && main.Book;\n      \/* LOAD START *\/\n      if (!document.hidden && visible > 0 && !state.loadStarted) {\n        state.loadStarted = Date.now();\n      }\n      \/* RESET COVER *\/\n      if (state.resetPending && book && book.enabled && !busy(book)) {\n        state.resetPending = false;\n        main.goToPage(1, true);\n      }\n      \/* REVEAL *\/\n      if (!state.restarting) reveal(state);\n      \/* LOAD MESSAGE *\/\n      if (visible > 0 && !state.ready && !state.restarting && !state.pagesSince && state.loadStarted) {\n        var waited = Date.now() - state.loadStarted;\n        status.hidden = waited < 1800;\n        status.textContent = waited > 30000\n          ? (isEnglish ? 'The menu is taking a little longer. You can continue scrolling.' : 'Die Karte braucht etwas l\u00e4nger. Sie k\u00f6nnen weiter scrollen.')\n          : (isEnglish ? 'Preparing menu \u2026' : 'Karte wird vorbereitet \u2026');\n      }\n      \/* AUTO STOP *\/\n      if (document.hidden || visible < 0.70) clearAuto();\n      \/* SICHTBAR ZUKLAPPEN: nur automatisch ge\u00f6ffnet, Nutzer hat nicht selbst gebl\u00e4ttert.\n         Passiert, solange noch ein Teil der Karte im Bild ist. *\/\n      if (\n        visible > 0 && visible < CLOSE_AT && state.autoOpened && !state.userTurned &&\n        state.ready && !state.pointer && !state.queuedTurn &&\n        book && book.enabled && !busy(book)\n      ) {\n        state.autoOpened = false;\n        state.manual = false;\n        main.prevPage();\n      }\n      \/* KOMPLETT AUSSERHALB (R\u00fcckfall bei sehr schnellem Scrollen): still aufs Cover. *\/\n      if (visible === 0 && state.autoOpened && !state.userTurned) {\n        state.autoOpened = false;\n        state.manual = false;\n        state.resetPending = true;\n        state.ready = false;\n        state.pagesSince = 0;\n        state.panel.classList.remove('bt-pdf-ready');\n      }\n      \/* AUTO OPEN *\/\n      if (\n        visible >= 0.70 && !document.hidden && AUTO_OPEN && !motion.matches &&\n        state.ready && !state.manual && !state.autoOpened && !autoTimer &&\n        book && book.enabled && book.rightIndex === 0 && !busy(book)\n      ) {\n        autoTimer = setTimeout(function () {\n          autoTimer = 0;\n          if (current !== state || state.manual || ratio() < 0.70 ||\n              document.hidden || motion.matches || !hasPages(state)) {\n            return;\n          }\n          state.autoOpened = true;\n          main.nextPage();\n        }, OPEN_DELAY);\n      }\n    }\n    \/* ===================== SELECT BOOK ===================== *\/\n    function canSwitch() {\n      return performance.now() >= switchUntil && (!current ||\n        (!current.pointer && !current.restarting &&\n         !(current.main && current.main.Book && busy(current.main.Book))));\n    }\n    function select(state) {\n      if (!state) return;\n      if (state === current) { pendingSelection = null; return; }\n      clearAuto();\n      if (!canSwitch()) { pendingSelection = state; return; }\n      if (current) {\n        switchUntil = performance.now() + (motion.matches ? 0 : 820);\n        states.forEach(function (item) { item.panel.classList.add('bt-input-paused'); });\n      }\n      current = state;\n      prepareSelected(state);\n      if (section.contains(document.activeElement)) state.manual = true;\n      status.hidden = true;\n      states.forEach(function (item) {\n        var active = item === state;\n        item.panel.classList.toggle('is-active', active);\n        item.panel.setAttribute('aria-hidden', String(!active));\n        item.panel.inert = !active;\n      });\n      buttons.forEach(function (button) {\n        var active = button.dataset.btBook === state.key;\n        button.classList.toggle('is-active', active);\n        button.setAttribute('aria-pressed', String(active));\n      });\n      section.classList.toggle('bt-book-whisky-active', state.key === 'whisky');\n      \/\/ Kein display:none, kein erzwungener Neuaufbau.\n      evaluate();\n    }\n    \/* ===================== NAV CLICK ===================== *\/\n    nav.addEventListener('click', function (event) {\n      var button = event.target.closest('[data-bt-book]');\n      if (!button || !nav.contains(button)) return;\n      event.preventDefault();\n      event.stopPropagation();\n      alignBarcards();\n      select(states.find(function (state) {\n        return state.key === button.dataset.btBook;\n      }));\n    });\n    \/* ===================== NAV KEYBOARD ===================== *\/\n    nav.addEventListener('keydown', function (event) {\n      if (event.key !== 'Enter' && event.key !== ' ') return;\n      var button = event.target.closest('[data-bt-book]');\n      if (!button || !nav.contains(button) || event.repeat) return;\n      event.preventDefault();\n      event.stopPropagation();\n      button.click();\n    });\n    \/* ===================== REAL3D SOFORT BINDEN ===================== *\/\n    var proto = window.FLIPBOOK && window.FLIPBOOK.Main && window.FLIPBOOK.Main.prototype;\n    if (proto && typeof proto.onBookCreated === 'function' && !proto.btBarCardPatchedV59) {\n      proto.btBarCardPatchedV59 = true;\n      var originalCreated = proto.onBookCreated;\n      proto.onBookCreated = function () {\n        var self = this;\n        var state = states.find(function (item) {\n          return self.elem && item.panel.contains(self.elem);\n        });\n        if (state) bind(state, self);\n        return originalCreated.apply(self, arguments);\n      };\n    }\n    \/* ===================== RANDOM START ===================== *\/\n    select(states[RANDOM_START ? Math.floor(Math.random() * states.length) : 0]);\n    \/* ===================== CHECK LOOP ===================== *\/\n    timer = setInterval(evaluate, 300);\n    \/* ===================== SCROLL ===================== *\/\n    \/\/ Beim Scrollen bildgenau pr\u00fcfen: weiches Einblenden und Zuklappen zur richtigen Zeit.\n    var scrollFrame = 0;\n    window.addEventListener('scroll', function () {\n      if (!evalNear || ratio() < 0.70) clearAuto();\n      if (scrollFrame) return;\n      scrollFrame = requestAnimationFrame(function () {\n        scrollFrame = 0;\n        evaluate();\n      });\n    }, {passive: true});\n    \/* ===================== PAGE HIDE \/ SHOW ===================== *\/\n    window.addEventListener('pagehide', function () {\n      clearAuto();\n      clearInterval(timer);\n    });\n    window.addEventListener('pageshow', function () {\n      clearInterval(timer);\n      timer = setInterval(evaluate, 300);\n      evaluate();\n    });\n    \/* ===================== TAB VISIBILITY ===================== *\/\n    document.addEventListener('visibilitychange', function () {\n      if (document.hidden) clearAuto();\n      else evaluate();\n    });\n  }\n  \/* ===================== START ===================== *\/\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init, {once: true});\n  } else {\n    init();\n  }\n})();\n<\/script><\/div><\/div>\r\n<div class=\"et_pb_code_32 et_pb_code et_pb_module bt-barcard-menu-code\"><div class=\"et_pb_code_inner\"><div class=\"bt-barcard-switch-nav\" id=\"bt-barcard-switch-nav\">\n  <div class=\"bt-barcard-switch-group bt-barcard-switch-group--cocktails\">\n    <span class=\"bt-barcard-switch-btn is-active\" data-bt-book=\"cocktails\" tabindex=\"0\" role=\"button\">\n      COCKTAILS\n    <\/span>\n\n    <span class=\"bt-barcard-switch-sep\" aria-hidden=\"true\">|<\/span>\n\n    <span class=\"bt-barcard-switch-btn\" data-bt-book=\"color\" tabindex=\"0\" role=\"button\">\n      NEW MENU\n    <\/span>\n  <\/div>\n\n  <div class=\"bt-barcard-switch-group bt-barcard-switch-group--whisky\">\n    <span class=\"bt-barcard-switch-btn\" data-bt-book=\"whisky\" tabindex=\"0\" role=\"button\">\n      WHISKY & RUM\n    <\/span>\n  <\/div>\n<\/div>\n\n<style>\n.bt-barcard-switch-nav{\n  width:100%;\n  display:flex !important;\n  justify-content:center !important;\n  align-items:center !important;\n  gap:42px !important;\n  margin:0 !important;\n  padding:0 0 50px !important;\n  background:#212121 !important;\n  position:relative !important;\n  z-index:30 !important;\n}\n\n.bt-barcard-switch-group{\n  display:flex !important;\n  align-items:center !important;\n}\n\n.bt-barcard-switch-group--cocktails{\n  gap:18px !important;\n}\n\n.bt-barcard-switch-group--whisky{\n  margin-left:10px !important;\n}\n\n.bt-barcard-switch-sep{\n  display:inline-block !important;\n  font-family:Oswald, sans-serif !important;\n  font-size:18px !important;\n  line-height:1 !important;\n  letter-spacing:1px !important;\n  color:#8d8d8d !important;\n  transform:translateY(-1px);\n  user-select:none !important;\n  pointer-events:none !important;\n}\n\n.bt-barcard-switch-btn{\n  display:inline-block !important;\n  font-family:Oswald, sans-serif !important;\n  font-size:18px !important;\n  line-height:1 !important;\n  letter-spacing:2px !important;\n  text-transform:uppercase !important;\n  color:#ea0b5f !important;\n  transition:color .25s ease, opacity .25s ease !important;\n  cursor:pointer !important;\n  padding:0 !important;\n  margin:0 !important;\n  background:transparent !important;\n  border:0 !important;\n  outline:none !important;\n  user-select:none !important;\n  -webkit-tap-highlight-color:transparent !important;\n  touch-action:manipulation !important;\n}\n\n.bt-barcard-switch-btn:hover{\n  color:#ebebeb !important;\n}\n\n.bt-barcard-switch-btn.is-active{\n  color:#8d8d8d !important;\n  pointer-events:none !important;\n  cursor:default !important;\n}\n\n@media (max-width:767px){\n  .bt-barcard-switch-nav{\n    gap:22px !important;\n    padding:16px 0 22px !important;\n  }\n\n  .bt-barcard-switch-group--cocktails{\n    gap:12px !important;\n  }\n\n  .bt-barcard-switch-group--whisky{\n    margin-left:4px !important;\n  }\n\n  .bt-barcard-switch-btn,\n  .bt-barcard-switch-sep{\n    font-size:16px !important;\n    letter-spacing:1.2px !important;\n  }\n}\n\n\n\n\n<\/style>\n\n<style>\n\/* BT \u2014 nur Men\u00fc-Text nach oben schieben *\/\n.bt-barcard-switch-btn,\n.bt-barcard-switch-sep{\n  transform:translateY(-10px);\n}\n<\/style>\n<\/div><\/div>\r\n<div class=\"et_pb_code_33 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><script>(function () { 'use strict'; var section = document.getElementById('barcards'); if (!section || !window.fetch || !('IntersectionObserver' in window)) return; var conn = navigator.connection || {}; if (conn.saveData || \/(^|-)2g$|slow-2g|3g\/.test(conn.effectiveType || '')) return; var BOOKS = { cocktails: '\/wp-content\/uploads\/2026\/03\/BarTausend-BarCard-Cocktails-20260322-V04.pdf', color: '\/wp-content\/uploads\/2026\/04\/BarTausend-BarMenu-090426-01.pdf', whisky: '\/wp-content\/uploads\/2026\/04\/BarTausend-BarCard-WhiskyRum-20260401-V01.pdf' }; var warmed = {}; function warm(url) { if (!url || warmed[url]) return; warmed[url] = true; fetch(url, { cache: 'force-cache', credentials: 'same-origin' }).then(function (r) { if (!r.ok || !r.body) { warmed[url] = false; return null; } var reader = r.body.getReader(); function drain() { return reader.read().then(function (res) { return res.done ? null : drain(); }); } return drain(); }).catch(function () { warmed[url] = false; }); } function activeKey() { var p = section.querySelector('.bt-book-panel.is-active'); return p ? p.getAttribute('data-bt-book') : null; } var io = new IntersectionObserver(function (entries) { if (!entries[0] || !entries[0].isIntersecting) return; var key = activeKey(); if (key && BOOKS[key]) warm(BOOKS[key]); io.disconnect(); }, { rootMargin: '0px 0px 120% 0px' }); io.observe(section); document.addEventListener('click', function (e) { var b = e.target && e.target.closest ? e.target.closest('[data-bt-book]') : null; var k = b ? b.getAttribute('data-bt-book') : null; if (k && BOOKS[k]) warm(BOOKS[k]); }, true); })();<\/script><\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_8 et_pb_section et_section_regular et_block_section et_pb_section_parallax\" id=\"banner-cantina\"><span class=\"et-pb-parallax-wrapper et-pb-parallax-hidden-tablet\"><span class=\"et-pb-parallax-background et-pb-parallax-background--css et-pb-parallax-background-module--divi-section-8\" style=\"background-image:url(https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-Cantina-01.webp)\"><\/span><\/span>\r\n<div class=\"et_pb_row_54 et_pb_row et_block_row et_animated\">\r\n<div class=\"et_pb_column_143 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_104 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module bt-title-reveal\"><div class=\"et_pb_text_inner\"><h3 style=\"text-align: right;font-size:34px!important;  letter-spacing:-1px!important; line-height:39px!important;\">\"Schlemmen. Genie\u00dfen. Tr\u00e4umen.<br \/>Umgeben von Kunst \u2013 ganz im Geheimen.<br \/>Tausend Cantina.\"<\/h3>\n<\/div><\/div>\r\n<div class=\"et_pb_code_34 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n@media (max-width:980px){\n  #banner-cantina{\n    position:relative!important;\n    overflow:hidden!important;\n    background-image:none!important;\n    background-color:transparent!important;\n    z-index:2!important;\n\n    \/* wichtig: Divi-Standardspacing weg *\/\n    padding-top:0!important;\n    padding-bottom:0!important;\n    margin-top:0!important;\n    margin-bottom:0!important;\n  }\n\n  #banner-cantina .et_pb_row{\n    padding-top:0!important;\n    padding-bottom:0!important;\n    margin-top:0!important;\n    margin-bottom:0!important;\n  }\n\n  #banner-cantina .et_parallax_bg_wrap,\n  #banner-cantina .et_parallax_bg{\n    display:none!important;\n  }\n}\n<\/style>\n\n<script>\n(function(){\n  if(!window.matchMedia || !window.matchMedia(\"(max-width:980px)\").matches) return;\n\n  const ID  = \"banner-cantina\";\n  const IMG = \"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-Cantina-01.webp\";\n  const POS = \"center center\";\n\n  const banner = document.getElementById(ID);\n  if(!banner) return;\n\n  const LAYER_ATTR = \"data-bt-standbild-layer\";\n  const LISTENER_FLAG = \"__btStandbildListener_\" + ID;\n\n  \/\/ Cleanup nur f\u00fcr dieses Modul\n  document.querySelectorAll(`[${LAYER_ATTR}=\"${ID}\"]`).forEach(n => n.remove());\n\n  \/\/ Layer\n  const layer = document.createElement(\"div\");\n  layer.setAttribute(LAYER_ATTR, ID);\n  layer.style.position = \"fixed\";\n  layer.style.left = \"0\";\n  layer.style.top  = \"0\";\n  layer.style.width = \"100vw\";\n  layer.style.height = \"100vh\";\n  layer.style.pointerEvents = \"none\";\n  layer.style.zIndex = \"1\";\n  layer.style.opacity = \"0\";\n  layer.style.overflow = \"hidden\";\n  layer.style.transform = \"translateZ(0)\";\n  layer.style.willChange = \"clip-path, opacity\";\n\n  const img = document.createElement(\"img\");\n  img.src = IMG;\n  img.decoding = \"async\";\n  img.loading = \"eager\";\n  img.style.position = \"absolute\";\n  img.style.inset = \"0\";\n  img.style.width = \"100%\";\n  img.style.height = \"100%\";\n  img.style.objectFit = \"cover\";\n  img.style.objectPosition = POS;\n  img.style.transform = \"translateZ(0)\";\n\n  layer.appendChild(img);\n  document.body.prepend(layer);\n\n  \/\/ stabile H\u00f6he: Layout-Viewport (nicht visualViewport)\n  let lockedH = 0, lockedW = 0; \/\/ V3: nur bei Breitenwechsel neu messen\n\n  function getLayoutVH(){\n    return document.documentElement.clientHeight;\n  }\n\n  function ensureLockedHeight(){\n    const width = window.innerWidth || 1;\n    if(lockedH > 0 && width === lockedW) return;\n    const measure = document.createElement(\"div\");\n    measure.style.cssText = \"position:fixed;top:0;left:0;width:1px;height:100lvh;visibility:hidden;pointer-events:none;\";\n    document.body.appendChild(measure);\n    lockedH = Math.round(measure.getBoundingClientRect().height) || window.innerHeight || 1;\n    measure.remove();\n    lockedW = width;\n    layer.style.height = (lockedH + 0) + \"px\";\n    banner.style.minHeight = lockedH + \"px\";\n  }\n\n  let ticking = false;\n\n  function update(){\n    ticking = false;\n    ensureLockedHeight();\n\n    const vh = lockedH || getLayoutVH();\n    const vw = window.innerWidth;\n\n    const r = banner.getBoundingClientRect();\n\n    if(r.bottom <= 0 || r.top >= vh){\n      layer.style.opacity = \"0\";\n      layer.style.clipPath = \"inset(100% 0 0 0)\";\n      layer.style.webkitClipPath = \"inset(100% 0 0 0)\";\n      return;\n    }\n\n    const top    = Math.max(0, r.top);\n    const bottom = Math.max(0, vh - r.bottom);\n    const left   = Math.max(0, r.left);\n    const right  = Math.max(0, vw - r.right);\n\n    const clip = `inset(${top}px ${right}px ${bottom}px ${left}px)`;\n\n    layer.style.opacity = \"1\";\n    layer.style.clipPath = clip;\n    layer.style.webkitClipPath = clip;\n  }\n\n  function requestTick(){\n    if(!ticking){\n      ticking = true;\n      requestAnimationFrame(update);\n    }\n  }\n\n  ensureLockedHeight();\n  update();\n\n  if(!window[LISTENER_FLAG]){\n    window[LISTENER_FLAG] = true;\n\n    window.addEventListener(\"scroll\", requestTick, {passive:true});\n    window.addEventListener(\"resize\", function(){\n      requestTick();\n    });\n    window.addEventListener(\"load\", requestTick);\n  } else {\n    requestTick();\n  }\n\n})();\n<\/script>\n\n\n\n\n\n\n\n\n\n\n<\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_9 et_pb_section et_section_regular et_block_section et_pb_section_parallax bt-cantina-editor-section\" id=\"cantina\"><span class=\"et-pb-parallax-wrapper\"><span class=\"et-pb-parallax-background et-pb-parallax-background--css et-pb-parallax-background-module--divi-section-9\" style=\"background-image:url(https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-Cantina-BG03.jpg)\"><\/span><\/span>\r\n<div class=\"et_pb_row_55 et_pb_row et_pb_row_1-2_1-4_1-4 et_pb_gutters2 et_block_row et_block_row_1-2_1-4_1-4 hero-wrap\">\r\n<div class=\"et_pb_column_144 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_105 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p>Ein besonderer Abend beginnt hinter der Bar Tausend.<\/p>\n<p>In der offenen K\u00fcche der Cantina verbinden Eva Che und ihr Team Genuss mit einer ganz eigenen Handschrift. Die Lichtinstallation \u201eFlying Cells\u201c von Arotin &amp; Serghej gibt dem Raum seine au\u00dfergew\u00f6hnliche Atmosph\u00e4re.<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_106 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h2 class=\"bt-cantina-title\">Tausend Cantina<\/h2>\n<h3 class=\"bt-cantina-byline\"><span class=\"bt-cantina-by\">by<\/span> <a href=\"#cantina-chef\" class=\"cantina-chef-trigger bt-chehub-name\">CHEHUB<\/a><\/h3>\n<\/div><\/div>\r\n<div class=\"et_pb_text_107 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p><a href=\"#cantina-chef\" class=\"cantina-chef-trigger\" aria-label=\"Eva Che und CHEHUB kennenlernen\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Cantina-CheHub-EvaChe-Logo-04.png\" width=\"110\" height=\"110\" alt=\"CHEHUB Logo\"><\/a><\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_108 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p class=\"bt-soft-opening\">Soft Opening<\/p>\n<p class=\"bt-cantina-hours\"><strong>Donnerstag \u2013 Samstag<\/strong><br \/>19:00 \u2013 23:00 Uhr<\/p>\n<div class=\"bt-cantina-actions\"><a href=\"#cantina-menu\" class=\"cantina-menu-trigger bt-cantina-text-link\">Men\u00fc entdecken &#x2197;<\/a><\/div>\n<\/div><\/div>\r\n<div class=\"et_pb_text_109 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module quote-bottom\"><div class=\"et_pb_text_inner\"><p class=\"bt-cantina-quote\">\u201eEssen ist ein Grundbed\u00fcrfnis f\u00fcr alle Menschen,<br \/>aber nur wenige wissen guten Geschmack zu sch\u00e4tzen.\u201c<\/p>\n<p class=\"bt-cantina-credit\">\u2014 Konfuzius<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_module et_pb_button_module_wrapper et_pb_button_0_wrapper\"><button class=\"et_pb_button_0 et_pb_button et_pb_bg_layout_light et_pb_module et_flex_module cantina-reservation-button bt-reservation-source\" type=\"button\" aria-hidden=\"true\" tabindex=\"-1\">Reservieren<\/button><\/div>\r\n<div class=\"et_pb_code_35 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style id=\"bt-eq-idle-unframed-20261027\">\nhtml body.page-id-9606 #bt-mini-eq-control:not(.bt-mini-eq-navigation) #bt-mini-eq-button::before{border:0!important;background:transparent!important;backdrop-filter:none!important;-webkit-backdrop-filter:none!important;box-shadow:none!important}\n<\/style>\n<style id=\"bt-reserve-area-fades-20261027\">\nhtml body.page-id-9606 :is(#btcg2-dock#btcg2-dock.btcg2-phone-native,#bt-v4-phone-reserve#bt-v4-phone-reserve){opacity:0!important;visibility:hidden!important;pointer-events:none!important;transform:none!important;transition:opacity 1s ease,visibility 0s linear 1s!important}\nhtml body.page-id-9606 :is(#btcg2-dock#btcg2-dock.btcg2-phone-native,#bt-v4-phone-reserve#bt-v4-phone-reserve).is-visible{opacity:1!important;visibility:visible!important;pointer-events:auto!important;transition-delay:0s!important}\nhtml body.page-id-9606 #btcg2-dock#btcg2-dock:not(.btcg2-phone-native)>.btcg2-reserve{transition:opacity 1s ease,visibility 0s linear,width 1.2s cubic-bezier(.4,0,.2,1),color 1.1s ease,border-color 1.1s ease,background-color 1.1s ease!important}\nhtml body.page-id-9606 #btcg2-dock#btcg2-dock:not(.btcg2-phone-native)>.btcg2-reserve[aria-hidden=\"true\"]{opacity:0!important;visibility:hidden!important;pointer-events:none!important;transition-delay:0s,1s,0s,0s,0s,0s!important}\n@media(prefers-reduced-motion:reduce){html body.page-id-9606 :is(#btcg2-dock#btcg2-dock,#bt-v4-phone-reserve#bt-v4-phone-reserve),html body.page-id-9606 #btcg2-dock#btcg2-dock>.btcg2-reserve{transition:none!important}}\n<\/style>\n<script id=\"bt-reserve-footer-glide\">\n(function(w,d){\n'use strict';\nif(w.btCreateReserveFooterGlide)return;\nw.btReserveAreaVisible=function(){\n var viewport=w.visualViewport;\n var top=viewport?viewport.offsetTop:0,left=viewport?viewport.offsetLeft:0;\n var height=viewport?viewport.height:w.innerHeight,width=viewport?viewport.width:w.innerWidth;\n if(w.matchMedia('(max-width:767px)').matches){\n  var music=d.getElementById('musik'),musicRect=music&&music.getBoundingClientRect();\n  if(musicRect&&musicRect.height>0&&musicRect.top<=top+height+120&&musicRect.bottom>top)return false;\n }\n var node=d.elementFromPoint(left+width*.5,top+height*.6);\n var section=node&&node.closest('.et_pb_section');\n return !!section&&['about','banner-cantina','cantina','cantina-chef','cantina-menu','speisekarte','cantina-koch','art','kontakt','footer'].indexOf(section.id)!==-1;\n};\nvar nativeReserveLabels=new WeakMap();\nw.btSetNativeReserveLabel=function(button,text){\n var state=nativeReserveLabels.get(button);\n if(!state){\n  var measure=d.createElement('span');\n measure.className='btcg2-reserve-measure';measure.setAttribute('aria-hidden','true');\n  button.replaceChildren(measure);button.classList.add('bt-reserve-label-motion');\n  state={measure:measure,target:'',layer:null,token:0,animations:[]};\n  nativeReserveLabels.set(button,state);\n  function remeasure(){\n   if(state.target&&button.isConnected)setWidth(state.target,true);\n  }\n  w.addEventListener('resize',remeasure,{passive:true});\n  if(d.fonts)d.fonts.ready.then(remeasure);\n }\n if(state.target===text&&state.layer)return;\n state.target=text;var token=++state.token;\n function stopAnimations(){state.animations.forEach(function(a){try{a.cancel();}catch(ignore){}});state.animations=[];}\n function setWidth(value,immediate){\n  state.measure.textContent=value;\n  var style=w.getComputedStyle(button);\n  var edges=['paddingLeft','paddingRight','borderLeftWidth','borderRightWidth'].reduce(function(sum,key){return sum+(parseFloat(style[key])||0);},0);\n  button.classList.toggle('btcg2-no-width-motion',immediate);\n  button.style.setProperty('--bt-reserve-label-width',Math.max(76,Math.ceil(state.measure.getBoundingClientRect().width+edges))+'px');\n  w.requestAnimationFrame(function(){button.classList.remove('btcg2-no-width-motion');});\n }\n stopAnimations();\n var old=state.layer;\n button.querySelectorAll('.btcg2-reserve-layer').forEach(function(layer){if(layer!==old)layer.remove();});\n var layer=d.createElement('span');layer.className='btcg2-label btcg2-reserve-layer';layer.setAttribute('aria-hidden','true');layer.dataset.text=text;\n Array.from(text).forEach(function(letter){var char=d.createElement('span');char.className='btcg2-char';char.textContent=letter===' '?'\\u00a0':letter;layer.appendChild(char);});\n button.appendChild(layer);state.layer=layer;\n var instant=!old||w.matchMedia('(prefers-reduced-motion:reduce)').matches||!button.animate;\n setWidth(text,instant);\n if(instant){if(old)old.remove();return;}\n state.animations.push(old.animate([{opacity:1,filter:'blur(0)'},{opacity:0,filter:'blur(2px)'}],{duration:420,easing:'cubic-bezier(.4,0,.2,1)',fill:'forwards'}));\n var chars=Array.from(layer.children);\n chars.forEach(function(char,index){\n  state.animations.push(char.animate([{opacity:0,transform:'translateY(4px)',filter:'blur(2px)'},{opacity:1,transform:'translateY(0)',filter:'blur(0)'}],\n   {duration:680,delay:220+index*Math.min(12,120\/chars.length),easing:'cubic-bezier(.22,1,.36,1)',fill:'both'}));\n });\n w.setTimeout(function(){if(token!==state.token)return;if(old.isConnected)old.remove();stopAnimations();},1250);\n};\nw.btUpdateReserveContactLabel=function(button){\n if(!button)return;\n var contact=d.getElementById('kontakt'),footer=d.getElementById('footer');\n var vv=w.visualViewport,viewportTop=vv?vv.offsetTop:0,height=vv?vv.height:w.innerHeight;\n var viewportBottom=viewportTop+height,rect=contact&&contact.getBoundingClientRect(),footerRect=footer&&footer.getBoundingClientRect();\n var ratio=0;\n if(rect&&rect.height>0){\n  var visible=Math.max(0,Math.min(rect.bottom,viewportBottom)-Math.max(rect.top,viewportTop));\n  ratio=visible\/Math.max(1,Math.min(rect.height,height));\n }\n var atContact=ratio>=.70||!!(rect&&rect.height>0&&footerRect&&rect.top<=viewportTop+height*.30&&footerRect.top<viewportBottom);\n var en=\/^en\/i.test(d.documentElement.lang);\n var label=atContact?(en?'Reserve here':'Hier reservieren'):(en?'Reserve':'Reservieren');\n w.btSetNativeReserveLabel(button,label);\n var accessible=atContact?(en?'Reserve here: a table at Tausend Cantina':'Hier reservieren: Tisch in der Tausend Cantina'):(en?'Reserve a table at Tausend Cantina':'Tisch in der Tausend Cantina reservieren');\n if(button.getAttribute('aria-label')!==accessible)button.setAttribute('aria-label',accessible); return atContact;\n};\nw.btCreateReserveFooterGlide=function(dock,footer){\n if(w.matchMedia('(max-width:767px)').matches){\n  var phoneProbe=d.createElement('span'),phoneOrigin=d.createElement('span');\n  phoneProbe.setAttribute('aria-hidden','true');phoneOrigin.setAttribute('aria-hidden','true');\n  phoneProbe.style.cssText='position:fixed!important;bottom:calc(34px + env(safe-area-inset-bottom,0px))!important;top:auto!important;left:0!important;width:0!important;height:0!important;visibility:hidden!important;pointer-events:none!important;';\n  phoneOrigin.style.cssText='position:absolute!important;top:0!important;left:0!important;width:0!important;height:0!important;visibility:hidden!important;pointer-events:none!important;';\n  d.body.appendChild(phoneProbe);d.body.appendChild(phoneOrigin);\n  var phoneAnchored=false,phoneTop=null,phoneFrame=0;\n  function phoneUpdate(){\n   if(!dock.isConnected)return;\n   var button=dock.querySelector('button.btcg2-reserve');\n   w.btUpdateReserveContactLabel(button);\n   var footerRect=footer&&footer.getBoundingClientRect();\n   var footerTop=footerRect&&footerRect.height>0?footerRect.top:Infinity;\n   var shouldAnchor=footerTop<=phoneProbe.getBoundingClientRect().top+30;\n   if(shouldAnchor){\n    var dockRect=dock.getBoundingClientRect(),buttonRect=(button||dock).getBoundingClientRect();\n    var top=footerTop-phoneOrigin.getBoundingClientRect().top-30-(buttonRect.bottom-dockRect.top);\n    if(!phoneAnchored){\n     dock.style.setProperty('position','absolute','important');\n     dock.style.setProperty('bottom','auto','important');\n    }\n    if(!phoneAnchored||phoneTop===null||Math.abs(top-phoneTop)>.05){\n     phoneTop=top;dock.style.setProperty('top',top.toFixed(2)+'px','important');\n    }\n   }else if(phoneAnchored||phoneTop===null){\n    dock.style.setProperty('position','fixed','important');\n    dock.style.setProperty('top','auto','important');\n    dock.style.setProperty('bottom','calc(34px + env(safe-area-inset-bottom,0px))','important');\n    phoneTop=0;\n   }\n   phoneAnchored=shouldAnchor;\n  }\n  function phoneRequest(){\n   if(!phoneFrame)phoneFrame=w.requestAnimationFrame(function(){phoneFrame=0;phoneUpdate();});\n  }\n  w.addEventListener('resize',phoneRequest,{passive:true});\n  if(w.visualViewport){\n   w.visualViewport.addEventListener('resize',phoneRequest,{passive:true});\n   w.visualViewport.addEventListener('scroll',phoneRequest,{passive:true});\n  }\n  if(w.ResizeObserver&&footer)new w.ResizeObserver(phoneRequest).observe(footer);\n  phoneUpdate();\n  return phoneUpdate;\n }\n\n\n var reduced=w.matchMedia('(prefers-reduced-motion:reduce)');\n var current=null,target=0,floor=0,base=0,frame=0,last=0;\n function paint(){dock.style.setProperty('--bt-reserve-footer-bottom',current.toFixed(2)+'px');}\n function measure(){\n  var saved=dock.style.getPropertyValue('--bt-reserve-footer-bottom');\n  dock.style.removeProperty('--bt-reserve-footer-bottom');\n  base=parseFloat(w.getComputedStyle(dock).bottom)||24;\n  if(saved)dock.style.setProperty('--bt-reserve-footer-bottom',saved);\n }\n function glide(now){\n  if(!dock.isConnected){frame=0;return;}\n  var dt=last?Math.min(64,now-last):16;last=now;\n  current+=(target-current)*(1-Math.exp(-dt\/190));\n  current=Math.max(floor,current);\n  var settled=Math.abs(target-current)<.1;\n  if(settled)current=target;\n  paint();frame=settled?0:w.requestAnimationFrame(glide);\n }\n function update(){\n  var contactOffset=w.btUpdateReserveContactLabel(dock.querySelector('button.btcg2-reserve'))?10:-10;\n  var rect=footer&&footer.getBoundingClientRect();\n  var height=d.documentElement.clientHeight||w.innerHeight;\n  var footerTop=rect&&rect.height>0?rect.top:Infinity;\n  var proximity=Math.max(0,Math.min(1,(height+160-footerTop)\/200));\n  var eased=proximity*proximity*(3-2*proximity);\n  target=Math.max(base+40*eased,height-footerTop+60)-contactOffset;\n  floor=Math.max(base,height-footerTop+20)-contactOffset;\n  if(reduced.matches||current===null){\n   if(frame)w.cancelAnimationFrame(frame);\n   frame=0;current=target;paint();return;\n  }\n  \/* Keep clear of the footer even during a fast scroll; glide through the remaining distance. *\/\n  current=Math.max(current,floor);paint();\n  if(!frame&&Math.abs(target-current)>=.1){last=0;frame=w.requestAnimationFrame(glide);}\n }\n function resize(){measure();update();}\n w.addEventListener('resize',resize,{passive:true});\n if(reduced.addEventListener)reduced.addEventListener('change',update);\n measure();update();\n return update;\n};\n})(window,document);\n<\/script>\n<style id=\"bt-gallery-coming-soon-style\">@media(min-width:768px){\n\nbody.page-id-9606 #bt-cantina-gallery-view{overflow:hidden!important;}\n\/* Vollfl\u00e4chige Maske und genau ein sichtbarer Hinweis im Vollbild. *\/\nbody.page-id-9606 #bt-cantina-gallery-view>.bt-gallery-soon-message,body.page-id-9606 #btcg-fullscreen>.bt-gallery-soon-message{max-width:none!important;width:100%!important;}\nbody.page-id-9606:has(#btcg-fullscreen[open]) #bt-cantina-gallery-view>.bt-gallery-soon-message{visibility:hidden!important;}\nbody.page-id-9606 #btcg-fullscreen>.bt-gallery-soon-message{animation:none!important;}\n\nbody.page-id-9606 #bt-cantina-gallery-view>.btcg-pages,\nbody.page-id-9606 #bt-cantina-gallery-view>.btcg-mobile-rail{\n filter:blur(10px)!important;opacity:.55!important;\n}\nbody.page-id-9606 #btcg-fullscreen .btcg-fs-image,\nbody.page-id-9606 #btcg-fullscreen .btcg-fs-copy,\nbody.page-id-9606 .btcg-fs-flight-copy,\nbody.page-id-9606 .btcg-fs-return-title,\nbody.page-id-9606 .btcg-fs-return-details{\n filter:blur(10px)!important;opacity:.55!important;\n}\nbody.page-id-9606 #bt-cantina-gallery-view>.bt-gallery-soon-message,\nbody.page-id-9606 #btcg-fullscreen>.bt-gallery-soon-message{\n position:absolute!important;inset:0!important;z-index:1000!important;\n display:flex!important;align-items:center!important;justify-content:center!important;\n box-sizing:border-box!important;margin:0!important;padding:32px!important;\n background:rgba(0,0,0,.18)!important;color:#c27a50!important;\n font:400 clamp(15px,1.15vw,19px)\/1.5 \"Poppins\",sans-serif!important;\n text-transform:uppercase!important;text-shadow:none!important;box-shadow:none!important;\n letter-spacing:.14em!important;text-align:center!important;text-wrap:balance;\n pointer-events:none!important;user-select:none!important;\n animation:btGallerySoonIn .9s ease both;\n}\n\nbody.page-id-9606 .bt-gallery-soon-copy{\n display:flex;flex-direction:column;align-items:center;gap:12px;\n max-width:30rem;opacity:1;line-height:1.5;--bt-soon-lift:-4vh;transform:translateY(var(--bt-soon-lift));\n}\nbody.page-id-9606 .bt-gallery-soon-kicker{\n display:block;font-size:10px;font-weight:400;letter-spacing:.3em;line-height:1.6;opacity:1;\n}\nbody.page-id-9606 .bt-gallery-soon-title{\n display:block;font-size:clamp(16px,1.2vw,20px);font-weight:400;letter-spacing:.26em;line-height:1.5;\n}\n@media(max-width:767px){\n body.page-id-9606 .bt-gallery-soon-copy{gap:9px;--bt-soon-lift:-2vh;transform:translateY(var(--bt-soon-lift));}\n body.page-id-9606 .bt-gallery-soon-kicker{font-size:8px;letter-spacing:.25em;}\n\n}\n\/* Three small, slowly drifting copper surfaces; no animated blur or full-screen filter. *\/\nbody.page-id-9606 .bt-gallery-soon-waves{\n position:absolute;inset:0;z-index:999;overflow:hidden;border-radius:inherit;\n pointer-events:none;contain:layout paint style;\n}\nbody.page-id-9606 .bt-gallery-soon-wave{\n position:absolute;display:block;width:200px;height:140px;box-sizing:border-box;\n border:0;border-radius:47% 53% 62% 38% \/ 46% 39% 61% 54%;opacity:0;\n background:radial-gradient(ellipse at 28% 33%,rgba(240,188,141,.34),transparent 38%),\n radial-gradient(ellipse at 62% 58%,rgba(163,78,38,.16),transparent 57%),\n conic-gradient(from 50deg at 45% 45%,transparent,rgba(194,122,80,.04) 15%,rgba(218,158,111,.3) 35%,rgba(115,51,28,.03) 53%,rgba(194,122,80,.23) 72%,transparent 90%);\n filter:blur(7px);transform-origin:center;pointer-events:none;\n}\nbody.page-id-9606 .bt-gallery-soon-wave::after{\n content:\"\";position:absolute;inset:18% 5%;border-radius:50%;\n background:linear-gradient(165deg,transparent 39%,rgba(239,181,130,.25) 48%,rgba(132,66,36,.07) 54%,transparent 63%);\n}\n@media(prefers-reduced-motion:reduce),(hover:none),(pointer:coarse){\n body.page-id-9606 .bt-gallery-soon-waves{display:none!important;}\n}\n\n@keyframes btGallerySoonIn{from{opacity:0}to{opacity:1}}\n@media(prefers-reduced-motion:reduce){\n body.page-id-9606 .bt-gallery-soon-message{animation:none!important}\n}\n\n\/* Same pink family, sufficient contrast for this small link on #161616. *\/\nbody.page-id-9606 .et_pb_section_3 .et_pb_text_inner p a[href*=\"instagram.com\"]{color:#fa1a64!important;}\nbody.page-id-9606 .et_pb_section_3 .et_pb_text_inner p a[href*=\"instagram.com\"]:is(:hover,:focus-visible){color:#fff!important;}\n\n}<\/style><script id=\"bt-cantina-native-editor-data\">(function(){function btV4CantinaRun(){\/* bt-near-cantina-v1 *\/if(!btV4CantinaRun.btNearReady && 'IntersectionObserver' in window){var btNearTargets=document.querySelectorAll('#about,#cantina,#cantina-chef,#cantina-menu,#kontakt');if(btNearTargets.length){var btNearObserver=new IntersectionObserver(function(entries){if(!entries.some(function(e){return e.isIntersecting;}))return;btNearObserver.disconnect();btV4CantinaRun.btNearReady=true;btV4CantinaRun();},{rootMargin:'100% 0px 100% 0px'});btNearTargets.forEach(function(el){btNearObserver.observe(el);});return;}}(function(){var entries=Array.from(document.querySelectorAll('.bt-cantina-image-copy[data-gallery-image]')).map(function(e){var paragraphs=e.querySelectorAll('p');var title=e.querySelector('h3'),description=e.querySelector('.bt-dish-description')||paragraphs[0],price=e.querySelector('.bt-dish-price')||paragraphs[1];return{image:e.getAttribute('data-gallery-image'),imageAlt:title?title.textContent.trim():(e.getAttribute('data-image-alt')||''),name:title?title.textContent.trim():'',description:description?description.textContent.trim():'',price:price?price.textContent.trim():'',position:'50% 50%'};});var data=document.createElement('script');data.id='bt-cantina-gallery-texts';data.type='application\/json';data.textContent=JSON.stringify(entries);document.body.appendChild(data);})();\n}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',btV4CantinaRun,{once:true});else btV4CantinaRun();})();<\/script><div id=\"bt-reservation-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"bt-native-reservation-title\" aria-hidden=\"true\" inert=\"\" class=\"\">\n\n  <button class=\"bt-reservation-close\" type=\"button\" aria-label=\"Reservierungsanfrage schlie\u00dfen\">\u00d7<\/button>\n\n  <div class=\"bt-reservation-tool\">\n    <div id=\"bt-opentable-widget\" hidden=\"\" style=\"display: none !important;\">\n\n      <div class=\"bt-ot-brand\">\n        <span class=\"bt-ot-dot\"><\/span>\n        <span>OpenTable<\/span>\n      <\/div>\n\n      <h2 id=\"bt-ot-title\" class=\"bt-ot-title\" data-bt-lvl=\"2\">TISCH RESERVIEREN<\/h2>\n\n      <div class=\"bt-ot-fields\">\n\n        <div class=\"bt-ot-field\">\n          <span class=\"bt-ot-label\">PERSONEN<\/span>\n          <span class=\"bt-ot-value\">2 Personen<\/span>\n        <\/div>\n\n        <div class=\"bt-ot-field\">\n          <span class=\"bt-ot-label\">DATUM<\/span>\n          <span class=\"bt-ot-value\">Heute<\/span>\n        <\/div>\n\n        <div class=\"bt-ot-field\">\n          <span class=\"bt-ot-label\">UHRZEIT<\/span>\n          <span class=\"bt-ot-value\">20:00 Uhr<\/span>\n        <\/div>\n\n      <\/div>\n\n      <div class=\"bt-ot-find\">\n        TISCH FINDEN\n      <\/div>\n\n      <p class=\"bt-ot-note\">\n        Vorschau \u2013 OpenTable wird sp\u00e4ter verbunden.\n      <\/p>\n\n    <\/div>\n  <\/div>\n<\/div><style>@media(min-width:768px){\n\n\/* =========================================================\n   CANTINA \u00b7 RESERVIERUNGSBUTTON\n========================================================= *\/\n\n.cantina-reservation-wrap {\n  margin:17px 0 0 !important;\n  padding:0 !important;\n  line-height:0 !important;\n}\n\n#cantina .cantina-reservation-button {\n  display:inline-flex !important;\n  align-items:center !important;\n  justify-content:center !important;\n\n  box-sizing:border-box !important;\n\n  width:auto !important;\n  min-width:0 !important;\n  height:auto !important;\n\n  margin:0 !important;\n  padding:12px 20px 13px !important;\n\n  border:1px solid rgba(234, 11, 95, .9) !important;\n  border-radius:999px !important;\n\n  background:rgba(5, 5, 5, .24) !important;\n\n  -webkit-backdrop-filter:\n    blur(7px)\n    saturate(115%);\n  backdrop-filter:\n    blur(7px)\n    saturate(115%);\n\n  color:#ea0b5f !important;\n\n  font-family:Oswald, sans-serif !important;\n  font-size:19px !important;\n  font-weight:900 !important;\n  line-height:1 !important;\n  letter-spacing:0 !important;\n  text-transform:uppercase !important;\n  white-space:nowrap !important;\n\n  box-shadow:\n    0 5px 18px rgba(0, 0, 0, .12) !important;\n\n  cursor:pointer !important;\n\n  transition:\n    color 700ms ease,\n    background-color 700ms ease,\n    border-color 700ms ease,\n    box-shadow 700ms ease !important;\n}\n\n#cantina .cantina-reservation-button:hover,\n#cantina .cantina-reservation-button:focus-visible {\n  color:#ffffff !important;\n  background:rgba(234, 11, 95, .15) !important;\n  border-color:#ea0b5f !important;\n\n  box-shadow:\n    0 7px 24px rgba(0, 0, 0, .2),\n    inset 0 0 18px rgba(234, 11, 95, .06) !important;\n}\n\n\n\/* =========================================================\n   CANTINA \u00b7 RESERVIERUNGSFENSTER\n========================================================= *\/\n\n#bt-reservation-modal {\n  position:fixed !important;\n  inset:0 !important;\n\n  width:100vw !important;\n  height:100vh !important;\n  height:100dvh !important;\n\n  z-index:2147483646 !important;\n\n  display:grid !important;\n  place-items:center !important;\n\n  box-sizing:border-box !important;\n  padding:70px 22px 25px !important;\n\n  background:rgba(0, 0, 0, 0) !important;\n\n  -webkit-backdrop-filter:\n    blur(0)\n    brightness(1);\n  backdrop-filter:\n    blur(0)\n    brightness(1);\n\n  opacity:0 !important;\n  visibility:hidden !important;\n  pointer-events:none !important;\n\n  transition:\n    opacity 550ms ease,\n    background-color 550ms ease,\n    backdrop-filter 550ms ease,\n    visibility 0s linear 550ms !important;\n}\n\n#bt-reservation-modal.is-open {\n  background:rgba(0, 0, 0, .52) !important;\n\n  -webkit-backdrop-filter:\n    blur(14px)\n    brightness(.78);\n  backdrop-filter:\n    blur(14px)\n    brightness(.78);\n\n  opacity:1 !important;\n  visibility:visible !important;\n  pointer-events:auto !important;\n\n  transition:\n    opacity 550ms ease,\n    background-color 550ms ease,\n    backdrop-filter 550ms ease,\n    visibility 0s !important;\n}\n\n\n\/* Schlie\u00dfen-X *\/\n\n#bt-reservation-modal .bt-reservation-close {\n  appearance:none !important;\n  -webkit-appearance:none !important;\n\n  position:absolute !important;\n  top:22px !important;\n  right:22px !important;\n\n  z-index:10 !important;\n\n  display:grid !important;\n  place-items:center !important;\n\n  width:38px !important;\n  height:38px !important;\n  min-width:38px !important;\n  min-height:38px !important;\n\n  margin:0 !important;\n  padding:0 0 2px !important;\n\n  border:1px solid rgba(255, 255, 255, .46) !important;\n  border-radius:50% !important;\n\n  background:rgba(8, 8, 8, .48) !important;\n\n  color:#ffffff !important;\n\n  font-family:Arial, sans-serif !important;\n  font-size:25px !important;\n  font-weight:300 !important;\n  line-height:1 !important;\n\n  cursor:pointer !important;\n\n  transition:\n    color 500ms ease,\n    border-color 500ms ease,\n    background-color 500ms ease !important;\n}\n\n#bt-reservation-modal .bt-reservation-close::before,\n#bt-reservation-modal .bt-reservation-close::after {\n  display:none !important;\n  content:none !important;\n}\n\n#bt-reservation-modal .bt-reservation-close:hover {\n  color:#ea0b5f !important;\n  border-color:#ea0b5f !important;\n  background:rgba(8, 8, 8, .75) !important;\n}\n\n\n\/* Mittiges Reservierungsfeld *\/\n\n#bt-reservation-modal .bt-reservation-tool {\n  width:min(600px, calc(100vw - 34px)) !important;\n  max-height:calc(100dvh - 100px) !important;\n\n  box-sizing:border-box !important;\n  overflow:auto !important;\n\n  padding:32px !important;\n\n  border:1px solid rgba(255, 255, 255, .14) !important;\n  border-radius:20px !important;\n\n  background:rgba(13, 13, 13, .78) !important;\n\n  -webkit-backdrop-filter:\n    blur(22px)\n    saturate(110%);\n  backdrop-filter:\n    blur(22px)\n    saturate(110%);\n\n  box-shadow:\n    0 30px 90px rgba(0, 0, 0, .52) !important;\n\n  opacity:0 !important;\n\n  transform:\n    translateY(18px)\n    scale(.98) !important;\n\n  transition:\n    opacity 500ms ease,\n    transform 650ms cubic-bezier(.22, .61, .36, 1) !important;\n}\n\n#bt-reservation-modal.is-open\n.bt-reservation-tool {\n  opacity:1 !important;\n\n  transform:\n    translateY(0)\n    scale(1) !important;\n}\n\n\n\/* OpenTable-Vorschau *\/\n\n#bt-reservation-modal .bt-ot-brand {\n  display:flex !important;\n  align-items:center !important;\n  justify-content:center !important;\n  gap:8px !important;\n\n  margin:0 0 22px !important;\n\n  color:rgba(255, 255, 255, .72) !important;\n\n  font-family:Poppins, sans-serif !important;\n  font-size:11px !important;\n  font-weight:500 !important;\n  line-height:1 !important;\n}\n\n#bt-reservation-modal .bt-ot-dot {\n  width:9px !important;\n  height:9px !important;\n\n  border-radius:50% !important;\n  background:#ea0b5f !important;\n\n  box-shadow:\n    0 0 13px rgba(234, 11, 95, .65) !important;\n}\n\n#bt-reservation-modal .bt-ot-title {\n  margin:0 0 28px !important;\n  padding:0 !important;\n\n  color:#ffffff !important;\n\n  font-family:Oswald, sans-serif !important;\n  font-size:33px !important;\n  font-weight:700 !important;\n  line-height:1 !important;\n  text-align:center !important;\n}\n\n#bt-reservation-modal .bt-ot-fields {\n  display:grid !important;\n  grid-template-columns:repeat(3, minmax(0, 1fr)) !important;\n\n  gap:1px !important;\n\n  overflow:hidden !important;\n\n  border:1px solid rgba(255, 255, 255, .12) !important;\n  border-radius:13px !important;\n\n  background:rgba(255, 255, 255, .12) !important;\n}\n\n#bt-reservation-modal .bt-ot-field {\n  box-sizing:border-box !important;\n  padding:14px 15px !important;\n\n  background:rgba(0, 0, 0, .34) !important;\n}\n\n#bt-reservation-modal .bt-ot-label {\n  display:block !important;\n\n  margin:0 0 6px !important;\n\n  color:rgba(255, 255, 255, .44) !important;\n\n  font-family:Poppins, sans-serif !important;\n  font-size:8px !important;\n  font-weight:500 !important;\n  line-height:1 !important;\n  letter-spacing:.13em !important;\n}\n\n#bt-reservation-modal .bt-ot-value {\n  display:block !important;\n\n  color:#ffffff !important;\n\n  font-family:Poppins, sans-serif !important;\n  font-size:13px !important;\n  font-weight:400 !important;\n  line-height:1.25 !important;\n  white-space:nowrap !important;\n}\n\n#bt-reservation-modal .bt-ot-find {\n  display:flex !important;\n  align-items:center !important;\n  justify-content:center !important;\n\n  width:100% !important;\n  box-sizing:border-box !important;\n\n  margin:14px 0 0 !important;\n  padding:13px 20px 14px !important;\n\n  border:1px solid #ea0b5f !important;\n  border-radius:999px !important;\n\n  background:#ea0b5f !important;\n  color:#ffffff !important;\n\n  font-family:Oswald, sans-serif !important;\n  font-size:17px !important;\n  font-weight:700 !important;\n  line-height:1 !important;\n  text-align:center !important;\n}\n\n#bt-reservation-modal .bt-ot-note {\n  margin:15px 0 0 !important;\n  padding:0 !important;\n\n  color:rgba(255, 255, 255, .42) !important;\n\n  font-family:Poppins, sans-serif !important;\n  font-size:9px !important;\n  line-height:1.45 !important;\n  text-align:center !important;\n}\n\n\n\/* Sp\u00e4teres echtes OpenTable *\/\n\n#bt-opentable-widget iframe {\n  display:block !important;\n\n  width:100% !important;\n  min-height:430px !important;\n\n  border:0 !important;\n  border-radius:14px !important;\n\n  background:#ffffff !important;\n}\n\n\n@media (max-width:600px) {\n  #bt-reservation-modal {\n    padding:\n      68px\n      15px\n      18px !important;\n  }\n\n  #bt-reservation-modal .bt-reservation-close {\n    top:16px !important;\n    right:16px !important;\n  }\n\n  #bt-reservation-modal .bt-reservation-tool {\n    width:100% !important;\n    padding:25px 18px 21px !important;\n    border-radius:17px !important;\n  }\n\n  #bt-reservation-modal .bt-ot-title {\n    font-size:28px !important;\n  }\n\n  #bt-reservation-modal .bt-ot-fields {\n    grid-template-columns:1fr !important;\n  }\n}\n\n}<\/style>\n<script>(function(){function btV4CantinaRun(){\/* bt-near-cantina-v1 *\/if(!btV4CantinaRun.btNearReady && 'IntersectionObserver' in window){var btNearTargets=document.querySelectorAll('#about,#cantina,#cantina-chef,#cantina-menu,#kontakt');if(btNearTargets.length){var btNearObserver=new IntersectionObserver(function(entries){if(!entries.some(function(e){return e.isIntersecting;}))return;btNearObserver.disconnect();btV4CantinaRun.btNearReady=true;btV4CantinaRun();},{rootMargin:'100% 0px 100% 0px'});btNearTargets.forEach(function(el){btNearObserver.observe(el);});return;}}\n(function () {\n  'use strict';\n\n  \/*\n   * Die echte OpenTable-URL kommt sp\u00e4ter hier hinein.\n   * Solange das Feld leer ist, wird nichts extern geladen.\n   *\/\n  const OPENTABLE_WIDGET_URL = '';\n\n  function initReservation() {\n    if (\n      document.body.classList.contains('et-fb')\n    ) {\n      return;\n    }\n\n    const modal =\n      document.getElementById(\n        'bt-reservation-modal'\n      );\n\n    if (\n      !modal ||\n      modal.dataset.ready === 'true'\n    ) {\n      return;\n    }\n\n    modal.dataset.ready = 'true';\n    if (\/^en(?:[-_]|$)\/i.test(document.documentElement.lang || '')) {\n      const set = (selector,text) => { const node=modal.querySelector(selector); if(node)node.textContent=text; };\n      set('#bt-ot-title','RESERVE A TABLE');\n      set('.bt-ot-field:nth-child(1) .bt-ot-label','GUESTS');\n      set('.bt-ot-field:nth-child(1) .bt-ot-value','2 guests');\n      set('.bt-ot-field:nth-child(2) .bt-ot-label','DATE');\n      set('.bt-ot-field:nth-child(2) .bt-ot-value','Today');\n      set('.bt-ot-field:nth-child(3) .bt-ot-label','TIME');\n      set('.bt-ot-field:nth-child(3) .bt-ot-value','8:00 PM');\n      set('.bt-ot-find','FIND A TABLE');\n      set('.bt-ot-note','Preview \u2013 OpenTable will be connected later.');\n      const close=modal.querySelector('.bt-reservation-close');if(close)close.setAttribute('aria-label','Close reservation window');\n    }\n\n\n    \/*\n     * Aus dem bewegten Cantina-Bereich nehmen.\n     *\/\n    document.body.appendChild(modal);\n\n    const widget =\n      document.getElementById(\n        'bt-opentable-widget'\n      );\n\n    const closeButton =\n      modal.querySelector(\n        '.bt-reservation-close'\n      );\n\n    let openTableLoaded = false;\n    let previousFocus = null;\n    let openTimer = 0, focusTimer = 0;\n    const background = document.getElementById(\"page-container\");\n    let backgroundWasInert = false;\n\n    function loadOpenTable() {\n      if (\n        !OPENTABLE_WIDGET_URL ||\n        openTableLoaded ||\n        !widget\n      ) {\n        return;\n      }\n\n      openTableLoaded = true;\n\n      const iframe =\n        document.createElement('iframe');\n\n      iframe.src =\n        OPENTABLE_WIDGET_URL;\n\n      iframe.title =\n        'OpenTable Tischreservierung';\n\n      iframe.loading =\n        'eager';\n\n      const fallback = document.createElement('a');\n      fallback.className = 'bt-opentable-fallback';\n      fallback.href = OPENTABLE_WIDGET_URL;\n      fallback.target = '_blank';\n      fallback.rel = 'noopener noreferrer';\n      fallback.textContent = 'Reservierung in neuem Fenster \u00f6ffnen';\n      widget.setAttribute('aria-busy', 'true');\n      iframe.addEventListener('load', () => widget.setAttribute('aria-busy', 'false'), {once:true});\n      modal.removeAttribute('aria-labelledby');\n      modal.setAttribute('aria-label', 'Tisch in der Tausend Cantina reservieren');\n      widget.replaceChildren(iframe, fallback);\n    }\n\n    function openModal(event) {\n      event.preventDefault();\n      if (modal.classList.contains('is-open')) return;\n      clearTimeout(openTimer);\n      clearTimeout(focusTimer);\n      previousFocus = document.activeElement;\n      backgroundWasInert = !!(background && background.inert);\n      if (background) background.inert = true;\n      modal.inert = false;\n      modal.classList.add('is-open');\n      modal.setAttribute('aria-hidden', 'false');\n      document.documentElement.classList.add('bt-reservation-is-open');\n      document.querySelectorAll('.btcg2-reserve').forEach(button =>\n        button.setAttribute('aria-expanded', 'true'));\n      openTimer = window.setTimeout(loadOpenTable, 220);\n      focusTimer = window.setTimeout(() => closeButton.focus({preventScroll:true}), 80);\n    }\n\n    function closeModal() {\n      if (!modal.classList.contains('is-open')) return;\n      clearTimeout(openTimer);\n      clearTimeout(focusTimer);\n      modal.classList.remove('is-open');\n      document.documentElement.classList.remove('bt-reservation-is-open');\n      if (background) background.inert = backgroundWasInert;\n      document.querySelectorAll('.btcg2-reserve').forEach(button =>\n        button.setAttribute('aria-expanded', 'false'));\n      \/* Move focus before hiding the dialog from assistive technology. *\/\n      if (previousFocus && previousFocus.isConnected && typeof previousFocus.focus === 'function') {\n        previousFocus.focus({preventScroll:true});\n      }\n      modal.setAttribute('aria-hidden', 'true');\n      modal.inert = true;\n    }\n\n    document.addEventListener('keydown', function (event) {\n      if (!modal.classList.contains('is-open') || event.key !== 'Tab') return;\n      const stops = Array.from(modal.querySelectorAll(\n        'button:not([disabled]),a[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),iframe,[tabindex=\"0\"]'\n      )).filter(node => node.getClientRects().length);\n      const first = stops[0] || closeButton;\n      const last = stops[stops.length - 1] || closeButton;\n      if (!modal.contains(document.activeElement) || (event.shiftKey && document.activeElement === first)) {\n        event.preventDefault(); last.focus();\n      } else if (!event.shiftKey && document.activeElement === last) {\n        event.preventDefault(); first.focus();\n      }\n    });\n\n    document.addEventListener(\n      'click',\n      function (event) {\n        const opener =\n          event.target.closest(\n            '.cantina-reservation-button'\n          );\n\n        if (opener) {\n          openModal(event);\n          return;\n        }\n\n        if (\n          event.target.closest(\n            '.bt-reservation-close'\n          )\n        ) {\n          closeModal();\n          return;\n        }\n\n        if (event.target === modal) {\n          closeModal();\n        }\n      }\n    );\n\n    document.addEventListener(\n      'keydown',\n      function (event) {\n        const opener =\n          event.target.closest(\n            '.cantina-reservation-button'\n          );\n\n        if (\n          opener &&\n          (\n            event.key === 'Enter' ||\n            event.key === ' '\n          )\n        ) {\n          openModal(event);\n          return;\n        }\n\n        if (\n          event.key === 'Escape' &&\n          modal.classList.contains(\n            'is-open'\n          )\n        ) {\n          closeModal();\n        }\n      }\n    );\n  }\n\n  if (\n    document.readyState === 'loading'\n  ) {\n    document.addEventListener(\n      'DOMContentLoaded',\n      initReservation\n    );\n  } else {\n    window.setTimeout(\n      initReservation,\n      0\n    );\n  }\n})();\n\n}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',btV4CantinaRun,{once:true});else btV4CantinaRun();})();<\/script>\n<style>@media(min-width:768px){\n\n#bt-reservation-modal.is-open .bt-reservation-tool {\n  transform: translateY(-40px) scale(1) !important;\n}\n\n}<\/style>\n<style>@media(min-width:768px){\n\n\/* =========================================================\n   CANTINA \/ CHEF \u00b7 SCROLLBEREICH\n========================================================= *\/\n\n#bt-cantina-stack {\n  position: relative;\n  width: 100%;\n  isolation: isolate;\n}\n\n#bt-cantina-placeholder {\n  display: block;\n  width: 100%;\n  height: 0;\n  margin: 0;\n  padding: 0;\n}\n\n\/* Cantina in der normalen Ausgangsposition *\/\n#bt-cantina-stack > #cantina {\n  position: relative !important;\n  z-index: 1 !important;\n\n  width: 100% !important;\n  height: auto !important;\n  min-height: 100vh !important;\n  min-height: 100svh !important;\n\n  margin: 0 !important;\n}\n\n\/* Cantina bleibt oben stehen *\/\n#bt-cantina-stack > #cantina.bt-cantina-pinned {\n  position: fixed !important;\n\n  top: 0 !important;\n  left: var(--bt-stack-left) !important;\n\n  width: var(--bt-stack-width) !important;\n  height: var(--bt-cantina-height) !important;\n\n  margin: 0 !important;\n}\n\n\/* Cantina nach dem Ende des Chef-Bereichs *\/\n#bt-cantina-stack > #cantina.bt-cantina-past {\n  position: absolute !important;\n\n  top: var(--bt-cantina-past-top) !important;\n  left: 0 !important;\n\n  width: 100% !important;\n  height: var(--bt-cantina-height) !important;\n\n  margin: 0 !important;\n}\n\n\/* Chef scrollt \u00fcber Cantina *\/\n#bt-cantina-stack > #cantina-chef {\n  position: relative !important;\n  z-index: 2 !important;\n\n  width: 100% !important;\n  min-height: 100vh !important;\n  min-height: 100svh !important;\n\n  margin: 0 !important;\n  will-change: transform;\n}\n\n\/* Keine Transform-Verschiebung beim Klick.\n   Chef bewegt sich ausschlie\u00dflich \u00fcber den normalen Seitenscroll. *\/\n#bt-cantina-stack.bt-chef-click-animation > #cantina-chef {\n  transform: none !important;\n  transition: none !important;\n}\n\nhtml.bt-cantina-auto-scroll {\n  scroll-behavior: auto !important;\n}\n\n\/* Nur die Positionierung der beiden gestapelten Container. *\/\n#bt-cantina-stack { overflow-anchor: none; }\n#bt-cantina-stack > #cantina,\n#bt-cantina-stack > #cantina-chef {\n  transition: none !important;\n}\n\n}<\/style>\n<script>\nif(!window.matchMedia('(max-width:767px)').matches){\n(function(){function btV4CantinaRun(){\/* bt-near-cantina-v1 *\/if(!btV4CantinaRun.btNearReady && 'IntersectionObserver' in window){var btNearTargets=document.querySelectorAll('#cantina,#cantina-chef,#cantina-menu,#kontakt');if(btNearTargets.length){var btNearObserver=new IntersectionObserver(function(entries){if(!entries.some(function(e){return e.isIntersecting;}))return;btNearObserver.disconnect();btV4CantinaRun.btNearReady=true;btV4CantinaRun();},{rootMargin:'100% 0px 100% 0px'});btNearTargets.forEach(function(el){btNearObserver.observe(el);});return;}}\n(function () {\n  function initCantinaChef() {\n    if (document.body.classList.contains('et-fb') ||\n        new URLSearchParams(location.search).get('et_fb') === '1') return;\n    const cantina = document.getElementById('cantina');\n    const chef = document.getElementById('cantina-chef');\n    const trigger = document.querySelector(\n      '.cantina-chef-trigger'\n    );\n\n    if (!cantina || !chef || !trigger) return;\n\n    \/* =====================================================\n       GEMEINSAMEN SCROLLBEREICH ERSTELLEN\n    ===================================================== *\/\n\n    let stack = document.getElementById(\n      'bt-cantina-stack'\n    );\n\n    if (!stack) {\n      stack = document.createElement('div');\n      stack.id = 'bt-cantina-stack';\n\n      cantina.parentNode.insertBefore(\n        stack,\n        cantina\n      );\n\n      stack.appendChild(cantina);\n      stack.appendChild(chef);\n    }\n\n    let placeholder = document.getElementById(\n      'bt-cantina-placeholder'\n    );\n\n    if (!placeholder) {\n      placeholder = document.createElement('div');\n      placeholder.id = 'bt-cantina-placeholder';\n\n      stack.insertBefore(\n        placeholder,\n        cantina\n      );\n    }\n\n    let stackStart = 0;\n    let cantinaHeight = 0;\n    let chefHeight = 0;\n\n    let ticking = false;\n    let clickAnimationRunning = false;\n    let scrollAnimationID = 0;\n\n    \/* =====================================================\n       POSITIONEN UND GR\u00d6SSEN BERECHNEN\n    ===================================================== *\/\n\n    function measure() {\n      const stackRect =\n        stack.getBoundingClientRect();\n\n      stackStart =\n        stackRect.top + window.scrollY;\n\n      cantinaHeight =\n        cantina.getBoundingClientRect().height;\n\n      chefHeight =\n        chef.getBoundingClientRect().height;\n\n      stack.style.setProperty(\n        '--bt-cantina-height',\n        cantinaHeight + 'px'\n      );\n\n      stack.style.setProperty(\n        '--bt-cantina-past-top',\n        cantinaHeight + 'px'\n      );\n\n      updateCantinaPosition();\n    }\n\n    \/* =====================================================\n       CANTINA STOPPEN UND WIEDER FREIGEBEN\n    ===================================================== *\/\n\n    function updateCantinaPosition() {\n      if (window.matchMedia('(max-width:980px)').matches || cantina.scrollHeight > window.innerHeight + 1) { placeholder.style.height='0px'; cantina.classList.remove('bt-cantina-pinned','bt-cantina-past'); ticking=false; return; }\n      const currentScroll =\n        window.scrollY;\n\n      \/* Aktuelle Geometrie: keine gespeicherte Seitenposition verwenden. *\/\n      const stackRect = stack.getBoundingClientRect();\n      stackStart = stackRect.top + currentScroll;\n      cantinaHeight = cantina.getBoundingClientRect().height;\n      chefHeight = chef.getBoundingClientRect().height;\n      const pinEnd = stackStart + cantinaHeight;\n\n      stack.style.setProperty('--bt-cantina-height', cantinaHeight + 'px');\n      stack.style.setProperty('--bt-cantina-past-top', cantinaHeight + 'px');\n\n      stack.style.setProperty(\n        '--bt-stack-left',\n        stackRect.left + 'px'\n      );\n\n      stack.style.setProperty(\n        '--bt-stack-width',\n        stackRect.width + 'px'\n      );\n\n      \/*\n         Vor dem Cantina-Bereich:\n         Cantina scrollt normal.\n      *\/\n      if (currentScroll < stackStart) {\n        placeholder.style.height = '0px';\n\n        cantina.classList.remove(\n          'bt-cantina-pinned',\n          'bt-cantina-past'\n        );\n      }\n\n      \/*\n         Cantina hat den oberen Rand erreicht:\n         Cantina bleibt stehen.\n         Chef scrollt dar\u00fcber.\n      *\/\n      else if (currentScroll <= pinEnd) {\n        placeholder.style.height =\n          cantinaHeight + 'px';\n\n        cantina.classList.remove(\n          'bt-cantina-past'\n        );\n\n        cantina.classList.add(\n          'bt-cantina-pinned'\n        );\n      }\n\n      \/*\n         Ende des Chef-Containers erreicht:\n         Seite scrollt wieder normal weiter.\n      *\/\n      else {\n        placeholder.style.height =\n          cantinaHeight + 'px';\n\n        cantina.classList.remove(\n          'bt-cantina-pinned'\n        );\n\n        cantina.classList.add(\n          'bt-cantina-past'\n        );\n      }\n\n      ticking = false;\n    }\n\n    window.addEventListener(\n      'scroll',\n      function () {\n        if (!ticking) {\n          ticking = true;\n\n          requestAnimationFrame(\n            updateCantinaPosition\n          );\n        }\n      },\n      { passive: true }\n    );\n\n    window.addEventListener(\n      'resize',\n      function () {\n        requestAnimationFrame(measure);\n      },\n      { passive: true }\n    );\n\n    \/* =====================================================\n       WEICHE SCROLL-ANIMATION\n    ===================================================== *\/\n\n    function easeInOutCubic(progress) {\n      return progress < 0.5\n        ? 4 * progress * progress * progress\n        : 1 - Math.pow(\n            -2 * progress + 2,\n            3\n          ) \/ 2;\n    }\n\n    function animatePageTo(\n      targetY,\n      duration,\n      animationNumber\n    ) {\n      return new Promise(function (resolve) {\n        const startY =\n          window.scrollY;\n\n        const distance =\n          targetY - startY;\n\n        if (Math.abs(distance) < 2) {\n          window.scrollTo(0, targetY);\n          resolve(true);\n          return;\n        }\n\n        const startTime =\n          performance.now();\n\n        function frame(currentTime) {\n          if (\n            animationNumber !==\n            scrollAnimationID\n          ) {\n            resolve(false);\n            return;\n          }\n\n          const progress = Math.min(\n            (currentTime - startTime) \/\n              duration,\n            1\n          );\n\n          window.scrollTo(\n            0,\n            startY +\n              distance *\n                easeInOutCubic(progress)\n          );\n\n          if (progress < 1) {\n            requestAnimationFrame(frame);\n          } else {\n            resolve(true);\n          }\n        }\n\n        requestAnimationFrame(frame);\n      });\n    }\n\n    \/* =====================================================\n       KLICK AUF CHICHAN\n    ===================================================== *\/\n\n    async function showChef() {\n      if (clickAnimationRunning) return;\n\n      clickAnimationRunning = true;\n\n      const currentAnimation =\n        ++scrollAnimationID;\n\n      document.documentElement.classList.add(\n        'bt-cantina-auto-scroll'\n      );\n\n      if (history.replaceState) {\n        history.replaceState(\n          null,\n          '',\n          '#cantina'\n        );\n      }\n\n      measure();\n\n      const currentPosition =\n        window.scrollY;\n\n      \/*\n         Chef wird ohne Transform direkt an\n         seine nat\u00fcrliche Position gescrollt.\n         Dadurch bleibt der Text im Chef-Container\n         ruhig und springt nicht mehr.\n      *\/\n      const targetPosition =\n        stackStart + cantinaHeight;\n\n      if (\n        currentPosition >=\n        targetPosition - 2\n      ) {\n        document.documentElement.classList.remove(\n          'bt-cantina-auto-scroll'\n        );\n\n        clickAnimationRunning = false;\n        return;\n      }\n\n      const distance =\n        Math.abs(\n          targetPosition -\n          currentPosition\n        );\n\n      const duration = Math.min(\n        1200,\n        Math.max(\n          500,\n          distance * 0.35\n        )\n      );\n\n      await animatePageTo(\n        targetPosition,\n        duration,\n        currentAnimation\n      );\n\n      document.documentElement.classList.remove(\n        'bt-cantina-auto-scroll'\n      );\n\n      clickAnimationRunning = false;\n    }\n\n    \/* =====================================================\n       KLICK VOR DER SCHWARZBLENDE ABFANGEN\n    ===================================================== *\/\n\n    window.addEventListener(\n      'click',\n      function (event) {\n        const clickedTrigger =\n          event.target.closest(\n            '.cantina-chef-trigger'\n          );\n\n        if (!clickedTrigger) return;\n\n        event.preventDefault();\n        event.stopImmediatePropagation();\n\n        showChef();\n      },\n      true\n    );\n\n    window.addEventListener('load', measure, { once: true });\n    if (document.fonts) document.fonts.ready.then(measure);\n    measure();\n  }\n\n  if (\n    document.readyState === 'loading'\n  ) {\n    document.addEventListener(\n      'DOMContentLoaded',\n      initCantinaChef\n    );\n  } else {\n    initCantinaChef();\n  }\n})();\n\n}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',btV4CantinaRun,{once:true});else btV4CantinaRun();})();\n}\n<\/script>\n<style>@media(min-width:768px){\n\n\/* =========================================================\n   CANTINA MENU \u00b7 DIREKTE DREISTUFIGE SCROLLFOLGE\n========================================================= *\/\n\n\/*\n   Menu ist von Anfang an Bestandteil der Seite.\n   Es erscheint automatisch nach Cantina und Chef.\n*\/\nbody:not(.et-fb) #cantina-menu {\n  position: relative !important;\n\n  inset: auto !important;\n\n  width: 100% !important;\n  height: auto !important;\n  min-height: 100vh !important;\n  min-height: 100svh !important;\n\n  margin: 0 !important;\n\n  z-index: 3 !important;\n\n  overflow: visible !important;\n\n  transform: none !important;\n\n  visibility: visible !important;\n  pointer-events: auto !important;\n\n  transition: none !important;\n  will-change: auto;\n}\n\n\/* Platzhalter f\u00fcr den feststehenden Chef-Container *\/\n#bt-chef-placeholder {\n  display: block;\n\n  width: 100%;\n  height: 0;\n\n  margin: 0;\n  padding: 0;\n}\n\n\/*\n   Chef bleibt am oberen Bildschirmrand stehen,\n   w\u00e4hrend Cantina-Menu dar\u00fcber scrollt.\n*\/\n#bt-cantina-stack >\n#cantina-chef.bt-chef-menu-pinned {\n  position: fixed !important;\n\n  top: 0 !important;\n  left: var(--bt-chef-left) !important;\n\n  width: var(--bt-chef-width) !important;\n  height: var(--bt-chef-height) !important;\n\n  margin: 0 !important;\n\n  z-index: 2 !important;\n}\n\n\/*\n   Menu hat Chef vollst\u00e4ndig \u00fcberdeckt.\n   Chef wird am Ende seines Bereichs abgelegt.\n*\/\n#bt-cantina-stack >\n#cantina-chef.bt-chef-menu-past {\n  position: absolute !important;\n\n  top: var(--bt-chef-past-top) !important;\n  left: 0 !important;\n\n  width: 100% !important;\n  height: var(--bt-chef-height) !important;\n\n  margin: 0 !important;\n\n  z-index: 2 !important;\n}\n\n\/* Im Divi-Builder bleibt alles normal bearbeitbar *\/\nbody.et-fb #cantina-menu {\n  position: relative !important;\n\n  inset: auto !important;\n\n  width: 100% !important;\n  min-height: 100vh !important;\n\n  transform: none !important;\n\n  visibility: visible !important;\n  pointer-events: auto !important;\n}\n\n}<\/style>\n<script>\nif(!window.matchMedia('(max-width:767px)').matches){\n(function(){function btV4CantinaRun(){\/* bt-near-cantina-v1 *\/if(!btV4CantinaRun.btNearReady && 'IntersectionObserver' in window){var btNearTargets=document.querySelectorAll('#cantina,#cantina-chef,#cantina-menu,#kontakt');if(btNearTargets.length){var btNearObserver=new IntersectionObserver(function(entries){if(!entries.some(function(e){return e.isIntersecting;}))return;btNearObserver.disconnect();btV4CantinaRun.btNearReady=true;btV4CantinaRun();},{rootMargin:'100% 0px 100% 0px'});btNearTargets.forEach(function(el){btNearObserver.observe(el);});return;}}\n(function () {\n  let initializationAttempts = 0;\n\n  function initCantinaMenuScroll() {\n    if (document.body.classList.contains('et-fb') ||\n        new URLSearchParams(location.search).get('et_fb') === '1') return;\n    const cantina =\n      document.getElementById('cantina');\n\n    const chef =\n      document.getElementById('cantina-chef');\n\n    const menu =\n      document.getElementById('cantina-menu');\n\n    const stack =\n      document.getElementById('bt-cantina-stack');\n\n    \/*\n       Der vorhandene Cantina\/Chef-Code erstellt\n       den Stack m\u00f6glicherweise einen Moment sp\u00e4ter.\n    *\/\n    if (\n      !cantina ||\n      !chef ||\n      !menu ||\n      !stack\n    ) {\n      initializationAttempts++;\n\n      if (initializationAttempts < 40) {\n        window.setTimeout(\n          initCantinaMenuScroll,\n          100\n        );\n      }\n\n      return;\n    }\n\n    \/*\n       Alte Klassen des bisherigen Klick-Patches entfernen.\n    *\/\n    document.body.classList.remove(\n      'bt-cantina-menu-open',\n      'bt-cantina-menu-docked'\n    );\n\n    menu.style.removeProperty('transition');\n    menu.removeAttribute('aria-hidden');\n\n    \/*\n       Menu direkt hinter Chef in den gemeinsamen\n       Scrollbereich setzen.\n    *\/\n    stack.appendChild(menu);\n\n    \/*\n       Platzhalter direkt vor Chef einsetzen.\n    *\/\n    let chefPlaceholder =\n      document.getElementById(\n        'bt-chef-placeholder'\n      );\n\n    if (!chefPlaceholder) {\n      chefPlaceholder =\n        document.createElement('div');\n\n      chefPlaceholder.id =\n        'bt-chef-placeholder';\n\n      stack.insertBefore(\n        chefPlaceholder,\n        chef\n      );\n    }\n\n    const menuTriggers =\n      document.querySelectorAll(\n        '.cantina-menu-trigger'\n      );\n\n    const chefReturnButtons =\n      document.querySelectorAll(\n        '.cantina-chef-return'\n      );\n\n    menuTriggers.forEach(function (trigger) {\n      trigger.setAttribute(\n        'aria-controls',\n        'cantina-menu'\n      );\n    });\n\n    chefReturnButtons.forEach(function (trigger) {\n      trigger.setAttribute(\n        'aria-controls',\n        'cantina-chef'\n      );\n    });\n\n    let stackStart = 0;\n    let cantinaHeight = 0;\n    let chefHeight = 0;\n\n    let chefStart = 0;\n    let menuStart = 0;\n\n    let ticking = false;\n    let scrollAnimationID = 0;\n\n    \/* =====================================================\n       POSITIONEN UND GR\u00d6SSEN BERECHNEN\n    ===================================================== *\/\n\n    function measureStack() {\n      const stackRect =\n        stack.getBoundingClientRect();\n\n      stackStart =\n        stackRect.top + window.scrollY;\n\n      cantinaHeight =\n        cantina.getBoundingClientRect().height;\n\n      chefHeight =\n        chef.getBoundingClientRect().height;\n\n      \/*\n         Beginn des Chef-Containers.\n      *\/\n      chefStart =\n        stackStart + cantinaHeight;\n\n      \/*\n         Beginn des Menu-Containers.\n      *\/\n      menuStart =\n        chefStart + chefHeight;\n\n      stack.style.setProperty(\n        '--bt-chef-height',\n        chefHeight + 'px'\n      );\n\n      stack.style.setProperty(\n        '--bt-chef-past-top',\n        cantinaHeight +\n          chefHeight +\n          'px'\n      );\n\n      updateChefPosition();\n    }\n\n    \/* =====================================================\n       CHEF FESTHALTEN, W\u00c4HREND MENU DAR\u00dcBER SCROLLT\n    ===================================================== *\/\n\n    function updateChefPosition() {\n      if (window.matchMedia('(max-width:980px)').matches) { chefPlaceholder.style.height='0px'; chef.classList.remove('bt-chef-menu-pinned','bt-chef-menu-past'); ticking=false; return; }\n      const currentScroll =\n        window.scrollY;\n\n      \/* Beim Scrollen stets die tats\u00e4chliche Position verwenden. *\/\n      const stackRect = stack.getBoundingClientRect();\n      stackStart = stackRect.top + currentScroll;\n      cantinaHeight = cantina.getBoundingClientRect().height;\n      chefHeight = chef.getBoundingClientRect().height;\n      chefStart = stackStart + cantinaHeight;\n      menuStart = chefStart + chefHeight;\n\n      stack.style.setProperty('--bt-chef-height', chefHeight + 'px');\n      stack.style.setProperty('--bt-chef-past-top',\n        (cantinaHeight + chefHeight) + 'px');\n\n      stack.style.setProperty(\n        '--bt-chef-left',\n        stackRect.left + 'px'\n      );\n\n      stack.style.setProperty(\n        '--bt-chef-width',\n        stackRect.width + 'px'\n      );\n\n      \/*\n         Vor Chef:\n         Chef scrollt \u00fcber Cantina.\n      *\/\n      if (currentScroll < chefStart) {\n        chefPlaceholder.style.height =\n          '0px';\n\n        chef.classList.remove(\n          'bt-chef-menu-pinned',\n          'bt-chef-menu-past'\n        );\n      }\n\n      \/*\n         Chef steht fest:\n         Menu scrollt dar\u00fcber.\n      *\/\n      else if (currentScroll <= menuStart) {\n        chefPlaceholder.style.height =\n          chefHeight + 'px';\n\n        chef.classList.remove(\n          'bt-chef-menu-past'\n        );\n\n        chef.classList.add(\n          'bt-chef-menu-pinned'\n        );\n      }\n\n      \/*\n         Menu hat Chef vollst\u00e4ndig \u00fcberdeckt:\n         Die Seite scrollt normal weiter.\n      *\/\n      else {\n        chefPlaceholder.style.height =\n          chefHeight + 'px';\n\n        chef.classList.remove(\n          'bt-chef-menu-pinned'\n        );\n\n        chef.classList.add(\n          'bt-chef-menu-past'\n        );\n      }\n\n      ticking = false;\n    }\n\n    window.addEventListener(\n      'scroll',\n      function () {\n        if (ticking) return;\n\n        ticking = true;\n\n        requestAnimationFrame(\n          updateChefPosition\n        );\n      },\n      { passive: true }\n    );\n\n    window.addEventListener(\n      'resize',\n      function () {\n        requestAnimationFrame(\n          measureStack\n        );\n      },\n      { passive: true }\n    );\n\n    \/* =====================================================\n       WEICHE BUTTON-NAVIGATION\n    ===================================================== *\/\n\n    function easeInOutCubic(progress) {\n      return progress < 0.5\n        ? 4 *\n          progress *\n          progress *\n          progress\n        : 1 -\n          Math.pow(\n            -2 * progress + 2,\n            3\n          ) \/ 2;\n    }\n\n    function animatePageTo(\n      targetY,\n      duration\n    ) {\n      const animationNumber =\n        ++scrollAnimationID;\n\n      const startY =\n        window.scrollY;\n\n      const distance =\n        targetY - startY;\n\n      if (Math.abs(distance) < 2) {\n        window.scrollTo(0, targetY);\n        return;\n      }\n\n      const startTime =\n        performance.now();\n\n      function frame(currentTime) {\n        if (\n          animationNumber !==\n          scrollAnimationID\n        ) {\n          return;\n        }\n\n        const progress = Math.min(\n          (currentTime - startTime) \/\n            duration,\n          1\n        );\n\n        window.scrollTo(\n          0,\n          startY +\n            distance *\n              easeInOutCubic(progress)\n        );\n\n        if (progress < 1) {\n          requestAnimationFrame(frame);\n        }\n      }\n\n      requestAnimationFrame(frame);\n    }\n\n    \/* =====================================================\n       BUTTONS\n    ===================================================== *\/\n\n    window.addEventListener(\n      'click',\n      function (event) {\n        \/*\n           VIEW THE NEW MENU:\n           weich zum Beginn von Cantina-Menu fahren.\n        *\/\n        const menuTrigger =\n          event.target.closest(\n            '.cantina-menu-trigger'\n          );\n\n        if (menuTrigger) {\n          event.preventDefault();\n          event.stopImmediatePropagation();\n\n          measureStack();\n\n          const distance =\n            Math.abs(\n              menuStart - window.scrollY\n            );\n\n          const duration =\n            Math.min(\n              1500,\n              Math.max(\n                650,\n                distance * 0.45\n              )\n            );\n\n          animatePageTo(\n            menuStart,\n            duration\n          );\n\n          return;\n        }\n\n        \/*\n           CHICHAN oder THE CHEF im Menu:\n           weich zur\u00fcck zum Chef fahren.\n        *\/\n        const chefReturn =\n          event.target.closest(\n            '.cantina-chef-return'\n          );\n\n        if (chefReturn) {\n          event.preventDefault();\n          event.stopImmediatePropagation();\n\n          measureStack();\n\n          const distance =\n            Math.abs(\n              chefStart - window.scrollY\n            );\n\n          const duration =\n            Math.min(\n              1400,\n              Math.max(\n                600,\n                distance * 0.45\n              )\n            );\n\n          animatePageTo(\n            chefStart,\n            duration\n          );\n        }\n      },\n      true\n    );\n\n    window.addEventListener('load', measureStack, { once: true });\n    if (document.fonts) document.fonts.ready.then(measureStack);\n    measureStack();\n  }\n\n  if (\n    document.readyState === 'loading'\n  ) {\n    document.addEventListener(\n      'DOMContentLoaded',\n      initCantinaMenuScroll\n    );\n  } else {\n    initCantinaMenuScroll();\n  }\n})();\n\n}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',btV4CantinaRun,{once:true});else btV4CantinaRun();})();\n}\n<\/script>\n<style>@media(min-width:768px){\n\nbody #btcg2-dock > .btcg2-reserve {\n  transition:\n    width 760ms cubic-bezier(.22, 1, .36, 1),\n    color 700ms ease,\n    background-color 700ms ease,\n    border-color 700ms ease,\n    backdrop-filter 700ms ease,\n    -webkit-backdrop-filter 700ms ease !important;\n}\n\nbody #btcg2-dock > .btcg2-reserve.btcg2-no-width-motion {\n  transition-duration:\n    0ms, 700ms, 700ms, 700ms, 700ms, 700ms !important;\n}\n\nbody #btcg2-dock > .btcg2-reserve[data-cantina-area=\"chef\"] {\n  --cantina-button-bg: rgba(25, 25, 25, 0.86);\n}\n\nbody #btcg2-dock > .btcg2-reserve[data-cantina-area=\"cantina\"],\nbody #btcg2-dock > .btcg2-reserve[data-cantina-area=\"menu\"] {\n  --cantina-button-bg: rgba(33, 33, 33, 0.86);\n}\n\nbody #btcg2-dock > .btcg2-reserve[data-cantina-area],\nbody #btcg2-dock > .btcg2-reserve[data-cantina-area]:hover,\nbody #btcg2-dock > .btcg2-reserve[data-cantina-area]:focus-visible {\n  background-color: var(--cantina-button-bg) !important;\n  color: #c27a50 !important;\n  border-color: #c27a50 !important;\n  -webkit-backdrop-filter: blur(12px) saturate(110%) !important;\n  backdrop-filter: blur(12px) saturate(110%) !important;\n}\n\nbody #btcg2-dock > .btcg2-reserve[data-cantina-area]:hover,\nbody #btcg2-dock > .btcg2-reserve[data-cantina-area]:focus-visible {\n  color: #ebebeb !important;\n  border-color: #ebebeb !important;\n}\n\n}<\/style>\n<script>\nif(!window.matchMedia('(max-width:767px)').matches){\n(function(){function btV4CantinaRun(){\/* bt-near-cantina-v1 *\/if(!btV4CantinaRun.btNearReady && 'IntersectionObserver' in window){var btNearTargets=document.querySelectorAll('#cantina,#cantina-chef,#cantina-menu,#kontakt');if(btNearTargets.length){var btNearObserver=new IntersectionObserver(function(entries){if(!entries.some(function(e){return e.isIntersecting;}))return;btNearObserver.disconnect();btV4CantinaRun.btNearReady=true;btV4CantinaRun();},{rootMargin:'100% 0px 100% 0px'});btNearTargets.forEach(function(el){btNearObserver.observe(el);});return;}}\n(function () {\n  \"use strict\";\n\n  const VORLAUF = 80;\n\n  function init(attempt) {\n    if (document.body.classList.contains(\"et-fb\")) return;\n\n    const button = document.querySelector(\n      \"#btcg2-dock > .btcg2-reserve\"\n    );\n    const cantina = document.getElementById(\"cantina\");\n    const chef = document.getElementById(\"cantina-chef\");\n    const menu = document.getElementById(\"cantina-menu\");\n    const gallery = document.getElementById(\"bt-cantina-gallery-view\");\n\n    if (!button || !cantina || !chef || !menu || !gallery) {\n      if (attempt < 120) {\n        setTimeout(function () {\n          init(attempt + 1);\n        }, 250);\n      }\n      return;\n    }\n\n    const galleryRow = gallery.closest(\".et_pb_row\") || gallery;\n    let lastScroll = window.scrollY;\n    let direction = 0;\n    let pending = false;\n\n    function update() {\n      pending = false;\n\n      const scroll = window.scrollY;\n      if (Math.abs(scroll - lastScroll) > 1) {\n        direction = scroll > lastScroll ? 1 : -1;\n      }\n      lastScroll = scroll;\n\n      const b = button.getBoundingClientRect();\n      const c = cantina.getBoundingClientRect();\n      const h = chef.getBoundingClientRect();\n      const m = menu.getBoundingClientRect();\n      const g = galleryRow.getBoundingClientRect();\n\n      const center = b.top + b.height \/ 2;\n      const ahead = center + direction * VORLAUF;\n      let area = \"\";\n\n      \/* Galerie: urspr\u00fcngliche Buttonfarbe *\/\n      if (center >= g.top && center < m.bottom) {\n        area = \"menu\";\n      } else if (\n        ahead >= m.top &&\n        ahead < m.bottom &&\n        center < g.top\n      ) {\n        area =\"menu\";\n      } else if (\n        ahead >= h.top &&\n        ahead < h.bottom &&\n        ahead < m.top\n      ) {\n        area = \"chef\";\n      } else if (\n        ahead >= c.top &&\n        ahead < c.bottom &&\n        ahead < h.top\n      ) {\n        area = \"cantina\";\n      }\n\n      if (area) {\n        if (button.getAttribute(\"data-cantina-area\") !== area) {\n          button.setAttribute(\"data-cantina-area\", area);\n        }\n      } else {\n        button.removeAttribute(\"data-cantina-area\");\n      }\n    }\n\n    function schedule() {\n      if (pending) return;\n      pending = true;\n      requestAnimationFrame(update);\n    }\n\n    window.addEventListener(\"scroll\", schedule, { passive: true });\n    window.addEventListener(\"resize\", schedule);\n    window.addEventListener(\"load\", schedule);\n    window.addEventListener(\"pageshow\", schedule);\n\n    if (window.visualViewport) {\n      window.visualViewport.addEventListener(\"resize\", schedule);\n      window.visualViewport.addEventListener(\"scroll\", schedule);\n    }\n\n    if (window.ResizeObserver) {\n      const observer = new ResizeObserver(schedule);\n      [cantina, chef, menu, galleryRow, button].forEach(function (el) {\n        observer.observe(el);\n      });\n    }\n\n    schedule();\n  }\n\n  init(0);\n})();\n\n}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',btV4CantinaRun,{once:true});else btV4CantinaRun();})();\n}\n<\/script>\n<style>@media(min-width:768px){\n\n\/* Grundriss *\/\n.bt-cantina-plan {\n  position: relative;\n  display: block;\n  width: 100%;\n  line-height: 0;\n  container-type: inline-size;\n}\n\n.bt-cantina-plan img {\n  display: block;\n  width: 100%;\n  height: auto;\n  margin: 0;\n}\n\n\/* Link zur Bar *\/\n.bt-cantina-plan__bar-link {\n  position: absolute;\n  top: 33.8%;\n  left: 0;\n\n  display: inline-block;\n  white-space: nowrap;\n\n  font-family: \"Poppins\", sans-serif;\n  font-size: 3.15cqw;\n  font-weight: 400;\n  line-height: 1.25;\n  letter-spacing: 0.16em;\n\n  color: #d5b276 !important;\n  text-decoration: none !important;\n}\n\n\/* Erste Zeile *\/\n.bt-cantina-plan__topline {\n  display: flex;\n  align-items: center;\n  gap: 0.62em;\n}\n\n\/* Drei kleine Kontur-Dreiecke *\/\n.bt-cantina-plan__triangles {\n  display: block;\n  flex: 0 0 auto;\n  width: 2.25em;\n  height: 0.7em;\n  overflow: visible;\n  transition: transform 800ms ease;\n}\n\n.bt-cantina-plan__triangles path {\n  fill: transparent;\n  stroke: currentColor;\n  stroke-width: 2;\n  stroke-linejoin: miter;\n}\n\n\/* BAR \u2013 zweite Zeile *\/\n.bt-cantina-plan__bar {\n  display: block;\n  margin-top: 0.18em;\n  margin-left: 2.85em;\n  color: #d5b276;\n  transition: color 800ms ease;\n}\n\n\/* Hover *\/\n.bt-cantina-plan__bar-link:hover .bt-cantina-plan__bar,\n.bt-cantina-plan__bar-link:focus-visible .bt-cantina-plan__bar {\n  color: #ffffff;\n}\n\n.bt-cantina-plan__bar-link:hover .bt-cantina-plan__triangles,\n.bt-cantina-plan__bar-link:focus-visible .bt-cantina-plan__triangles {\n  transform: translateX(-0.18em);\n}\n\n\/* Tastaturbedienung *\/\n.bt-cantina-plan__bar-link:focus-visible {\n  outline: 1px solid #ea0b5f;\n  outline-offset: 0.45em;\n}\n\n}<\/style>\n<style>@media(min-width:768px){\n.bt-cantina-plan-image{margin:0!important;line-height:0}.bt-cantina-plan-image .et_pb_image_wrap{display:block!important;width:100%!important}\n}<\/style>\n<script>(function(){function btV4CantinaRun(){\/* bt-near-cantina-v1 *\/if(!btV4CantinaRun.btNearReady && 'IntersectionObserver' in window){var btNearTargets=document.querySelectorAll('#about,#cantina,#cantina-chef,#cantina-menu,#kontakt');if(btNearTargets.length){var btNearObserver=new IntersectionObserver(function(entries){if(!entries.some(function(e){return e.isIntersecting;}))return;btNearObserver.disconnect();btV4CantinaRun.btNearReady=true;btV4CantinaRun();},{rootMargin:'100% 0px 100% 0px'});btNearTargets.forEach(function(el){btNearObserver.observe(el);});return;}}(function(){function mount(){var image=document.querySelector('.bt-cantina-plan-image'),source=document.getElementById('bt-cantina-plan-source');if(!image||!source)return;var plan=source.querySelector('.bt-cantina-plan');if(!plan)return;image.parentNode.insertBefore(plan,image);plan.insertBefore(image,plan.firstChild);source.remove();}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',mount,{once:true});else mount();})();\n}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',btV4CantinaRun,{once:true});else btV4CantinaRun();})();<\/script>\n<style>@media(min-width:768px){\n\n  .bt-eva-v10 { position: relative; line-height: 0; pointer-events: none; }\n  \/* Vorschau ohne JS bzw. im Builder: sichtbar, kompakt, rechtsbuendig *\/\n  .bt-eva-v10 img {\n    display: block;\n    width: auto;\n    max-width: 100%;\n    height: auto;\n    max-height: 600px;\n    margin-left: auto;\n  }\n  \/* Frontend mit JS: Groesse kommt aus dem Script *\/\n  .bt-eva-v10.bt-js img { width: 100%; max-height: none; opacity: 0; }\n  .bt-eva-v10.bt-js.is-ready img { opacity: 1; }\n  .bt-eva-v10 .bt-tiles-canvas {\n    position: absolute;\n    pointer-events: none;\n    z-index: 2;\n    display: block;\n  }\n\n}<\/style>\n<script>\nif(true){\n(function(){function btV4CantinaRun(){\/* bt-near-cantina-v1 *\/if(!btV4CantinaRun.btNearReady && 'IntersectionObserver' in window){var btNearTargets=document.querySelectorAll('#cantina,#cantina-chef,#cantina-menu,#kontakt');if(btNearTargets.length){var btNearObserver=new IntersectionObserver(function(entries){if(!entries.some(function(e){return e.isIntersecting;}))return;btNearObserver.disconnect();btV4CantinaRun.btNearReady=true;btV4CantinaRun();},{rootMargin:'100% 0px 100% 0px'});btNearTargets.forEach(function(el){btNearObserver.observe(el);});return;}}\n(function () {\n  var CFG = {\n    selector: '.bt-eva-v10',\n    anchor: '.et_pb_section', \/\/ an dessen Unterkante wird das Bild ausgerichtet\n    heightFactor: 1.05,     \/\/ Bildhoehe relativ zur Sektion (1 = genau Sektionshoehe, 1.1 = Hut ragt 10 % hinaus)\n    maxScale: 1,            \/\/ Bild maximal so breit wie die Spalte (1 = Spaltenbreite)\n    bottomOffset: 0,        \/\/ Abstand zur Unterkante (px), positiv = hoeher\n    shiftX: -20,              \/\/ seitlich verschieben (px), negativ = nach links\n    sectionZ: 2,            \/\/ Sektion ueber die vorherige legen, damit der Hut sichtbar bleibt\n    mobileBreak: 981,       \/\/ darunter normal im Fluss (gestapelte Spalten)\n    tile: 22,               \/\/ Kachelgroesse Desktop (px)\n    tileMobile: 14,         \/\/ Kachelgroesse Mobile (px)\n    color: '#191919',       \/\/ Kachelfarbe\n    maskToImage: true,      \/\/ liegende Kacheln exakt auf der Silhouette des Portraits\n    maskGrow: 3,            \/\/ Maske etwas ueber die Silhouette hinaus erweitern (px)\n    rise: [60, 170],        \/\/ wie weit die Kacheln nach oben schweben (px)\n    drift: 16,              \/\/ seitliches Driften (px)\n    spin: 22,               \/\/ max. Drehung (Grad)\n    topRise: 220,           \/\/ NEU V4: zusaetzliche Flughoehe fuer die Kacheln oben am Hut (px)\n    topZone: 140,           \/\/ NEU V4: so weit unter der Sektionskante wirkt der Extra-Flug noch (px)\n    hatReveal: 1000,        \/\/ NEU V6: so lange waechst der Hut aus der Kante heraus (ms)\n    sinkOnScroll: true,     \/\/ NEU V7: beim Hochscrollen sinkt Eva zurueck unter die Kante\n    sinkStart: 0.35,        \/\/ NEU V7: Sektionskante bei 35 % der Fensterhoehe -> Absinken beginnt\n    sinkEnd: 0.85,          \/\/ NEU V7: Sektionskante bei 85 % der Fensterhoehe -> Hut ganz verschwunden\n    sweep: 1700,            \/\/ bis die Welle von oben unten ankommt (ms)\n    jitter: 500,            \/\/ Zufallsversatz pro Kachel (ms)\n    duration: [1100, 1700], \/\/ Flugdauer einer Kachel (ms)\n    startDelay: 150,        \/\/ kurze Pause nach dem Reinscrollen (ms)\n    threshold: 0.35         \/\/ wie viel vom Bild sichtbar sein muss (0-1)\n  };\n  var btEvaPhone = window.matchMedia('(max-width:767px)').matches;\n  if (btEvaPhone) {\n    CFG.tileMobile = 30; CFG.tile = 30; CFG.rise = [18, 60];\n    CFG.topRise = 25; CFG.topZone = 65; CFG.drift = 7; CFG.spin = 10;\n    CFG.sweep = 650; CFG.jitter = 150; CFG.duration = [500, 850];\n    CFG.startDelay = 80; CFG.sinkOnScroll = false; CFG.threshold = 0.2;\n  }\n\n  \/\/ Im Divi Visual Builder nichts tun: dort bleibt die kompakte Vorschau aus dem CSS\n  function inBuilder() {\n    var b = document.body;\n    if (b && (b.classList.contains('et-fb') || b.classList.contains('et-bfb'))) return true;\n    if (location.search.indexOf('et_fb=1') > -1) return true;\n    try {\n      if (window.parent !== window && window.parent.location.search.indexOf('et_fb=1') > -1) return true;\n    } catch (e) {}\n    return false;\n  }\n  var G = window.btEvaPortrait = window.btEvaPortrait || { version: 10, inits: 0, log: [] };\n  function note(m) { try { G.log.push(Math.round(performance.now()) + ' ' + m); if (G.log.length > 40) G.log.shift(); } catch (e) {} }\n\n  var reduce = window.matchMedia ? matchMedia('(prefers-reduced-motion: reduce)').matches : false;\n\n  function rand(a, b) { return a + Math.random() * (b - a); }\n  function easeInOut(t) { return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) \/ 2; }\n\n  \/\/ Position und Groesse (V5): das Bild haengt direkt an der Sektion, unten buendig,\n  \/\/ rechtsbuendig zur Spalte. So kann Divi die Spalte verschieben, ohne dass das Bild mitwandert.\n  function layout(wrap, img, home) {\n    var sec = home.parentNode ? home.parentNode.closest(CFG.anchor) : null;\n    var col = home.parentNode ? home.parentNode.closest('.et_pb_column') : null;\n    if (!sec || !col) return;\n\n    if (window.innerWidth < CFG.mobileBreak) {\n      \/\/ Mobile: zurueck an den urspruenglichen Platz im Fluss\n      if (wrap.previousSibling !== home) home.parentNode.insertBefore(wrap, home.nextSibling);\n      wrap.style.position = '';\n      wrap.style.left = '';\n      wrap.style.bottom = '';\n      wrap.style.width = '';\n      wrap.style.zIndex = '';\n      return;\n    }\n\n    if (wrap.parentNode !== sec) sec.appendChild(wrap);\n    sec.style.overflow = 'visible';\n    if (getComputedStyle(sec).position === 'static') sec.style.position = 'relative';\n    sec.style.zIndex = CFG.sectionZ;\n\n    var c = col.getBoundingClientRect();\n    var s = sec.getBoundingClientRect();\n    var ar = (img.naturalWidth && img.naturalHeight) ? img.naturalWidth \/ img.naturalHeight : 0.75;\n    var w = sec.offsetHeight * CFG.heightFactor * ar;\n    var maxW = c.width * CFG.maxScale;\n    if (w > maxW) w = maxW;\n\n    wrap.style.position = 'absolute';\n    wrap.style.zIndex = '1';\n    wrap.style.width = w + 'px';\n    wrap.style.left = (c.right - s.left - sec.clientLeft - w + CFG.shiftX) + 'px';\n    wrap.style.bottom = CFG.bottomOffset + 'px';\n  }\n\n  function setup(wrap) {\n    var img = wrap.querySelector('img');\n    if (!img || wrap.getAttribute('data-bt-tiles') || wrap.btEvaInit) return;\n    \/\/ Wrapper in einem ausgeblendeten Modul (z. B. deaktivierte Variante) nicht anfassen\n    var mod = wrap.closest('.et_pb_module');\n    if (mod && getComputedStyle(mod).display === 'none') { note('skip hidden module'); return; }\n    wrap.btEvaInit = true;\n    wrap.setAttribute('data-bt-tiles', '1');\n    wrap.setAttribute('data-bt-state', 'idle');\n    G.inits++;\n    note('setup');\n    \/\/ Lazy-Loader: falls das Bild auf einen Platzhalter umgeschrieben wurde, echtes Bild setzen\n    var realSrc = img.getAttribute('data-src') || img.getAttribute('data-lazy-src');\n    if (realSrc && img.getAttribute('src') !== realSrc) img.setAttribute('src', realSrc);\n    if (!btEvaPhone) { img.removeAttribute('srcset'); img.removeAttribute('data-srcset'); }\n    wrap.classList.add('bt-js');\n    \/\/ Merker fuer den urspruenglichen Platz (fuer Mobile)\n    var home = document.createComment('bt-eva-v10');\n    wrap.parentNode.insertBefore(home, wrap);\n    layout(wrap, img, home);\n\n    var cv = document.createElement('canvas');\n    cv.className = 'bt-tiles-canvas';\n    cv.setAttribute('aria-hidden', 'true');\n    wrap.appendChild(cv);\n\n    var ctx = cv.getContext('2d');\n    var rest = document.createElement('canvas');   \/\/ Ebene fuer liegende Kacheln\n    var rctx = rest.getContext('2d');\n    var mask = document.createElement('canvas');\n    var mctx = mask.getContext('2d');\n    var maskReady = false;\n    var tiles = [], W = 0, H = 0, dpr = 1, padX = 0, padTop = 0;\n    var edge = 0, lastClip = -1; \/\/ edge = wie weit das Bild ueber die Sektionskante ragt (px)\n\n    \/\/ Teil oberhalb der Linie ausblenden (Bild); Linie wandert beim Start von der Kante nach oben\n    function setClip(y) {\n      y = Math.max(0, Math.round(y));\n      if (y === lastClip) return;\n      lastClip = y;\n      var v = y > 0 ? 'inset(' + y + 'px 0 0 0)' : '';\n      img.style.clipPath = v;\n      img.style.webkitClipPath = v;\n    }\n    function easeOut(t) { return 1 - Math.pow(1 - t, 3); }\n    var state = 'idle', t0 = 0, ro = null, decoded = false;\n    var pageReady = document.readyState === 'complete';\n\n    function reveal() { wrap.classList.add('is-ready'); }\n    setTimeout(reveal, 4000); \/\/ Sicherheitsnetz, falls etwas nicht laedt\n\n    function loaded() {\n      var u = img.currentSrc || img.src || '';\n      return img.complete && img.naturalWidth > 50 && u.indexOf('data:') !== 0;\n    }\n\n    var noMask = false;\n    function rebuildRect() { noMask = true; build(); }\n    function build() {\n      if (state !== 'idle') return; \/\/ waehrend der Animation nichts neu aufbauen\n      var r = wrap.getBoundingClientRect();\n      var ir = img.getBoundingClientRect();\n      W = ir.width; H = ir.height;\n      if (!W || !H) return;\n\n      \/\/ Platz um das Bild, damit fliegende Kacheln nicht abgeschnitten werden\n      padX = CFG.drift * 2 + CFG.tile * 2;\n      padTop = CFG.rise[1] + CFG.topRise + CFG.tile * 2;\n\n      cv.style.left = (ir.left - r.left - wrap.clientLeft - padX) + 'px';\n      cv.style.top = (ir.top - r.top - wrap.clientTop - padTop) + 'px';\n      cv.style.width = (W + padX * 2) + 'px';\n      cv.style.height = (H + padTop) + 'px';\n\n      dpr = Math.min(window.devicePixelRatio || 1, btEvaPhone ? 1 : 2);\n      cv.width = Math.round((W + padX * 2) * dpr);\n      cv.height = Math.round((H + padTop) * dpr);\n      rest.width = cv.width; rest.height = cv.height;\n\n      makeMask();\n      var alpha = null;\n      if (maskReady) {\n        try { alpha = noMask ? null : mctx.getImageData(0, 0, mask.width, mask.height).data; } catch (e) { alpha = null; note('mask nicht lesbar'); }\n      }\n      function covered(x, y, w, h) {\n        if (!alpha) return true;\n        var pts = [0.2, 0.5, 0.8];\n        for (var i = 0; i < 3; i++) {\n          for (var j = 0; j < 3; j++) {\n            var px = Math.round((padX + x + w * pts[i]) * dpr);\n            var py = Math.round((padTop + y + h * pts[j]) * dpr);\n            if (px < 0 || py < 0 || px >= mask.width || py >= mask.height) continue;\n            if (alpha[(py * mask.width + px) * 4 + 3] > 20) return true;\n          }\n        }\n        return false;\n      }\n\n      \/\/ Wie weit ragt das Bild ueber die Sektion? Dort fliegen die Kacheln hoeher.\n      var sec = home.parentNode ? home.parentNode.closest(CFG.anchor) : null;\n      var overTop = sec ? Math.max(0, sec.getBoundingClientRect().top - ir.top) : 0;\n      var zone = overTop + CFG.topZone;\n      edge = overTop;\n      lastClip = -1;\n\n      var size = window.innerWidth < 768 ? CFG.tileMobile : CFG.tile;\n      var cols = Math.max(1, Math.round(W \/ size));\n      var rows = Math.max(1, Math.round(H \/ size));\n      var tw = W \/ cols, th = H \/ rows;\n\n      tiles = [];\n      for (var y = 0; y < rows; y++) {\n        var rowDelay = (rows > 1 ? y \/ (rows - 1) : 0) * CFG.sweep;\n        var ty = y * th;\n        var f = Math.max(0, 1 - ty \/ zone); \/\/ 1 = ganz oben, 0 = ab topZone unter der Kante\n        f = f * f;\n        for (var x = 0; x < cols; x++) {\n          var tx = x * tw;\n          if (!covered(tx, ty, tw, th)) continue;\n          \/\/ Kacheln komplett ueber der Kante: starten, sobald der Hut an ihrer Stelle auftaucht\n          var above = edge > 0 && (ty + th) <= edge + 0.5;\n          var delay = rowDelay + Math.random() * CFG.jitter;\n          if (above) {\n            var need = 1 - (ty + th) \/ edge; \/\/ so weit muss die Linie gelaufen sein\n            delay = (1 - Math.cbrt(1 - need)) * CFG.hatReveal + Math.random() * 120;\n          }\n          tiles.push({\n            x: tx, y: ty, w: tw, h: th, above: above,\n            delay: delay,\n            dur: rand(CFG.duration[0], CFG.duration[1]) * (1 + f * 0.5),\n            rise: rand(CFG.rise[0], CFG.rise[1]) + f * rand(CFG.topRise * 0.5, CFG.topRise),\n            dx: rand(-CFG.drift, CFG.drift) * (1 + f * 2),\n            rot: rand(-CFG.spin, CFG.spin) * (1 + f * 1.5) * Math.PI \/ 180,\n            shrink: rand(0.3, 0.7)\n          });\n        }\n      }\n      if (!tiles.length && alpha) { alpha = null; note('mask leer -> Rechteck'); return rebuildRect(); }\n      draw(0);\n      if (maskReady || !CFG.maskToImage) reveal(); \/\/ Bild erst zeigen, wenn die Kacheln darueber liegen\n    }\n\n    \/\/ Maske aus der Silhouette, leicht erweitert, damit kein Umriss durchscheint\n    function makeMask() {\n      maskReady = false;\n      if (!CFG.maskToImage || !loaded() || !W) return;\n      mask.width = cv.width; mask.height = cv.height;\n      mctx.setTransform(1, 0, 0, 1, 0, 0);\n      mctx.globalCompositeOperation = 'source-over';\n      mctx.clearRect(0, 0, mask.width, mask.height);\n      mctx.setTransform(dpr, 0, 0, dpr, padX * dpr, padTop * dpr);\n      var g = CFG.maskGrow, n = 16;\n      mctx.drawImage(img, 0, 0, W, H);\n      for (var rr = g \/ 2; rr <= g; rr += g \/ 2) {\n        for (var i = 0; i < n; i++) {\n          var an = i \/ n * Math.PI * 2;\n          mctx.drawImage(img, Math.cos(an) * rr, Math.sin(an) * rr, W, H);\n        }\n      }\n      mctx.setTransform(1, 0, 0, 1, 0, 0);\n      for (var k = 0; k < 5; k++) mctx.drawImage(mask, 0, 0); \/\/ Alpha an den Kanten auf voll ziehen\n      maskReady = true;\n    }\n\n    function draw(ms) {\n      \/\/ Linie, ueber der nichts sichtbar ist: vor dem Start an der Kante, dann nach oben\n      var line = edge > 0 ? edge * (1 - easeOut(Math.min(1, Math.max(0, ms \/ CFG.hatReveal)))) : 0;\n      setClip(line);\n\n      \/\/ 1) liegende Kacheln: exakt auf die Silhouette zugeschnitten, nur unterhalb der Linie\n      rctx.setTransform(1, 0, 0, 1, 0, 0);\n      rctx.globalCompositeOperation = 'source-over';\n      rctx.clearRect(0, 0, rest.width, rest.height);\n      rctx.setTransform(dpr, 0, 0, dpr, padX * dpr, padTop * dpr);\n      rctx.fillStyle = CFG.color;\n      rctx.save();\n      rctx.beginPath();\n      rctx.rect(-padX, line, W + padX * 2, H - line + 2);\n      rctx.clip();\n\n      var alive = 0, i, t, p;\n      for (i = 0; i < tiles.length; i++) {\n        t = tiles[i];\n        p = (ms - t.delay) \/ t.dur;\n        if (p > 0) continue;\n        alive++;\n        if (t.above) continue; \/\/ ueber der Kante liegt nichts\n        rctx.fillRect(t.x - 0.5, t.y - 0.5, t.w + 1, t.h + 1);\n      }\n      rctx.restore();\n      if (maskReady) {\n        rctx.setTransform(1, 0, 0, 1, 0, 0);\n        rctx.globalCompositeOperation = 'destination-in';\n        rctx.drawImage(mask, 0, 0);\n        rctx.globalCompositeOperation = 'source-over';\n      }\n\n      ctx.setTransform(1, 0, 0, 1, 0, 0);\n      ctx.globalAlpha = 1;\n      ctx.clearRect(0, 0, cv.width, cv.height);\n      ctx.drawImage(rest, 0, 0);\n\n      \/\/ 2) fliegende Kacheln: frei, ohne Maske - duerfen ueber den oberen Container schweben\n      ctx.fillStyle = CFG.color;\n      for (i = 0; i < tiles.length; i++) {\n        t = tiles[i];\n        p = (ms - t.delay) \/ t.dur;\n        if (p <= 0 || p >= 1) continue;\n        alive++;\n        var e = easeInOut(p);\n        var s = 1 - (1 - t.shrink) * e;\n        var a = t.rot * e;\n        var cos = Math.cos(a) * s * dpr, sin = Math.sin(a) * s * dpr;\n        var cx = (padX + t.x + t.w \/ 2 + t.dx * e) * dpr;\n        var cy = (padTop + t.y + t.h \/ 2 - t.rise * e) * dpr;\n        ctx.setTransform(cos, sin, -sin, cos, cx, cy);\n        ctx.globalAlpha = (1 - Math.pow(p, 1.5)) * (t.above ? Math.min(1, p * 5) * 0.9 : 1);\n        ctx.fillRect(-t.w \/ 2 - 0.5, -t.h \/ 2 - 0.5, t.w + 1, t.h + 1);\n      }\n      ctx.setTransform(1, 0, 0, 1, 0, 0);\n      ctx.globalAlpha = 1;\n      return alive;\n    }\n\n    var btEvaLastFrame = 0;\n    function frame(now) {\n      if (btEvaPhone && btEvaLastFrame && !(now - btEvaLastFrame >= 32)) { requestAnimationFrame(frame); return; }\n      btEvaLastFrame = now;\n      if (!t0) t0 = now;\n      if (draw(now - t0) > 0) requestAnimationFrame(frame);\n      else finish();\n    }\n\n    \/\/ V7: Absinken beim Hochscrollen (nur nach der Animation)\n    function smooth(t) { t = Math.min(1, Math.max(0, t)); return t * t * (3 - 2 * t); }\n    var sinkQueued = false;\n    function sink() {\n      sinkQueued = false;\n      if (state !== 'done' || !CFG.sinkOnScroll || reduce) return;\n      var sec = home.parentNode ? home.parentNode.closest(CFG.anchor) : null;\n      var d = 0;\n      if (sec && wrap.parentNode === sec) {\n        var vh = window.innerHeight;\n        var st = sec.getBoundingClientRect().top;\n        var over = Math.max(0, st - wrap.getBoundingClientRect().top);\n        var k = smooth((st - vh * CFG.sinkStart) \/ (vh * (CFG.sinkEnd - CFG.sinkStart)));\n        d = Math.round(over * k * 10) \/ 10;\n      }\n      img.style.transform = d ? 'translate3d(0,' + d + 'px,0)' : '';\n      var v = d ? 'inset(0 0 ' + d + 'px 0)' : ''; \/\/ unten abschneiden, was unter die Sektion rutscht\n      img.style.clipPath = v;\n      img.style.webkitClipPath = v;\n    }\n    function queueSink() {\n      if (sinkQueued) return;\n      sinkQueued = true;\n      requestAnimationFrame(sink);\n    }\n    window.addEventListener('scroll', queueSink, { passive: true });\n    window.addEventListener('resize', queueSink);\n\n    function finish() {\n      if (state === 'done') return;\n      state = 'done';\n      wrap.setAttribute('data-bt-state', 'done');\n      note('done');\n      reveal();\n      setClip(0);\n      sink();\n      if (ro) ro.disconnect();\n      if (cv.parentNode) cv.parentNode.removeChild(cv);\n    }\n\n    var waiting = false;\n    function start() {\n      if (state !== 'idle' || waiting) return;\n      if (!loaded()) { img.addEventListener('load', start, { once: true }); return; }\n      if (document.visibilityState === 'hidden') {\n        waiting = true;\n        document.addEventListener('visibilitychange', function v() {\n          if (document.visibilityState === 'hidden') return;\n          document.removeEventListener('visibilitychange', v); waiting = false; start();\n        });\n        return;\n      }\n      if (!pageReady && document.readyState !== 'complete') {\n        waiting = true;\n        var go = function () { if (!waiting) return; waiting = false; pageReady = true; start(); };\n        window.addEventListener('load', go, { once: true });\n        setTimeout(go, 1500);\n        return;\n      }\n      if (!decoded && img.decode) {\n        waiting = true;\n        img.decode().catch(function () {}).then(function () { decoded = true; waiting = false; start(); });\n        return;\n      }\n      if (state !== 'idle') return;\n      lastClip = -1;\n      build();\n      state = 'running';\n      wrap.setAttribute('data-bt-state', reduce ? 'reduced' : 'running');\n      note('start y=' + Math.round(window.scrollY) + ' top=' + Math.round(wrap.getBoundingClientRect().top) + ' vh=' + window.innerHeight);\n      reveal();\n      if (reduce) {\n        setClip(0);\n        cv.style.transition = 'opacity 1s ease';\n        requestAnimationFrame(function () { cv.style.opacity = '0'; });\n        setTimeout(finish, 1100);\n        return;\n      }\n      setTimeout(function () { requestAnimationFrame(frame); }, CFG.startDelay);\n    }\n\n    \/\/ Position dauerhaft aktuell halten (auch nach der Animation)\n    function relayout() { layout(wrap, img, home); }\n    window.addEventListener('resize', relayout);\n    window.addEventListener('load', relayout);\n    if (document.readyState === 'complete') setTimeout(relayout, 0);\n    img.addEventListener('load', relayout);\n    setTimeout(relayout, 600);\n    setTimeout(relayout, 2000);\n    if (window.ResizeObserver) {\n      var lro = new ResizeObserver(relayout);\n      var hs = home.parentNode.closest(CFG.anchor), hc = home.parentNode.closest('.et_pb_column');\n      if (hs) lro.observe(hs);\n      if (hc) lro.observe(hc);\n    }\n\n    if (window.ResizeObserver) { ro = new ResizeObserver(build); ro.observe(wrap); ro.observe(img); }\n    else window.addEventListener('resize', build);\n    img.addEventListener('load', build);\n    img.addEventListener('error', finish);\n    build();\n\n    if (!('IntersectionObserver' in window)) { start(); return; }\n    var steps = [];\n    for (var k = 0; k <= 20; k++) steps.push(k \/ 20);\n    var io = new IntersectionObserver(function (entries) {\n      entries.forEach(function (en) {\n        if (!en.isIntersecting) return;\n        var need = Math.min(en.boundingClientRect.height, window.innerHeight) * CFG.threshold;\n        if (en.intersectionRect.height >= need) { io.disconnect(); start(); }\n      });\n    }, { threshold: steps });\n    io.observe(wrap);\n  }\n\n\n  \/* bt-eva-near-v1: animation\/layout unchanged; prepare within one viewport. *\/\n  var btEvaNearSeen = new WeakSet();\n  function btEvaNear(wrap) {\n    if (btEvaNearSeen.has(wrap)) return;\n    btEvaNearSeen.add(wrap);\n    if (!('IntersectionObserver' in window)) { setup(wrap); return; }\n    var target = wrap.closest(CFG.anchor) || wrap;\n    var near = new IntersectionObserver(function (entries) {\n      if (!entries.some(function (entry) { return entry.isIntersecting; })) return;\n      near.disconnect();\n      setup(wrap);\n    }, { rootMargin: '100% 0px 100% 0px' });\n    near.observe(target);\n  }\n  function init() {\n    if (inBuilder()) return;\n    var wraps = document.querySelectorAll(CFG.selector);\n    for (var i = 0; i < wraps.length; i++) btEvaNear(wraps[i]);\n  }\n  init();\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);\n})();\n\n}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',btV4CantinaRun,{once:true});else btV4CantinaRun();})();\n}\n<\/script>\n<style>@media(min-width:768px){\n\n\/* Die Klasse geh\u00f6rt ausschlie\u00dflich an die neue Galerie-Zeile. *\/\n.et_pb_row.btcg-row-active,\n.et_pb_row.bt-cantina-gallery-row {\n  width: 100% !important;\n  max-width: none !important;\n  margin: 0 !important;\n  padding: 0 !important;\n}\n.btcg-row-active > .et_pb_column,\n.bt-cantina-gallery-row > .et_pb_column {\n  width: 100% !important;\n  margin: 0 !important;\n  padding: 0 !important;\n}\n.bt-cantina-gallery-row .et_pb_code,\n.bt-cantina-gallery-row .et_pb_code_inner {\n  margin: 0 !important;\n  padding: 0 !important;\n  min-height: 0 !important;\n}\n#bt-cantina-gallery.btcg-source-ready { display: none !important; }\n\n#bt-cantina-gallery-view {\n  --btcg-white: #fff;\n  --btcg-pink: #ea0b5f;\n  --btcg-padding: clamp(26px, 3vw, 56px);\n  --btcg-ease: cubic-bezier(.22, 1, .36, 1);\n  position: relative;\n  width: 100%;\n  max-width: none;\n  padding: 0;\n  margin: 0;\n  color: var(--btcg-white);\n  background: #111;\n  isolation: isolate;\n}\n#bt-cantina-gallery-view,\n#bt-cantina-gallery-view * { box-sizing: border-box; }\n#bt-cantina-gallery-view .btcg-list,\n#bt-cantina-gallery-view .btcg-block {\n  margin: 0;\n  padding: 0;\n  border: 0;\n  gap: 0;\n}\n#bt-cantina-gallery-view .btcg-block {\n  display: grid;\n  grid-template-columns: repeat(6, minmax(0, 1fr));\n  grid-auto-rows: var(--btcg-row-height, 360px);\n  grid-template-areas: var(--btcg-map-desktop);\n}\n#bt-cantina-gallery-view .btcg-card {\n  position: relative;\n  grid-area: var(--btcg-area);\n  min-width: 0;\n  min-height: 0;\n  margin: 0;\n  padding: 0;\n  overflow: hidden;\n  border: 0;\n  border-radius: 0;\n  background: #161616;\n  isolation: isolate;\n}\n#bt-cantina-gallery-view .btcg-image {\n  position: absolute;\n  inset: 0;\n  width: 100%;\n  height: 100%;\n  max-width: none;\n  margin: 0;\n  padding: 0;\n  border: 0;\n  display: block;\n  object-fit: cover;\n  object-position: var(--btcg-position, 50% 50%);\n  transform: scale(1.002);\n  filter: brightness(1);\n  transition: transform 950ms var(--btcg-ease), filter 750ms ease, opacity 450ms ease;\n}\n#bt-cantina-gallery-view .btcg-card.is-image-error .btcg-image { opacity: 0; }\n#bt-cantina-gallery-view .btcg-shade {\n  position: absolute;\n  inset: 0;\n  pointer-events: none;\n  background: linear-gradient(0deg, rgba(0,0,0,.94), rgba(0,0,0,.66) 20%, rgba(0,0,0,.08) 62%, transparent);\n  transition: background-color 650ms ease;\n}\n#bt-cantina-gallery-view .btcg-toggle {\n  position: relative;\n  z-index: 1;\n  display: flex;\n  flex-direction: column;\n  justify-content: flex-end;\n  align-items: stretch;\n  width: 100%;\n  height: 100%;\n  min-height: 44px;\n  margin: 0;\n  padding-top: var(--btcg-padding);\n  padding-right: var(--btcg-padding);\n  padding-bottom: calc(var(--btcg-padding) + 10px);\n  padding-left: calc(var(--btcg-padding) + 10px);\n  border: 0;\n  border-radius: 0;\n  appearance: none;\n  -webkit-appearance: none;\n  background: transparent;\n  color: #fff;\n  text-align: left;\n  text-transform: none;\n  cursor: pointer;\n  font: inherit;\n  box-shadow: none;\n  -webkit-tap-highlight-color: transparent;\n  touch-action: manipulation;\n}\n#bt-cantina-gallery-view .btcg-toggle:focus { outline: none; }\n#bt-cantina-gallery-view .btcg-toggle:focus-visible {\n  outline: 3px solid #fff;\n  outline-offset: -7px;\n  box-shadow: inset 0 0 0 3px #ea0b5f;\n}\n#bt-cantina-gallery-view .btcg-content {\n  display: block;\n  width: 100%;\n  transform: translateY(0);\n  transition: transform 750ms var(--btcg-ease);\n}\n#bt-cantina-gallery-view .btcg-heading {\n  display: flex;\n  align-items: center;\n  gap: 16px;\n}\n#bt-cantina-gallery-view .btcg-name {\n  display: block;\n  flex: 1;\n  min-width: 0;\n  color: #fff !important;\n  font-family: \"Oswald\", sans-serif !important;\n  font-size: clamp(23px, 1.7vw, 34px);\n  font-weight: 600;\n  line-height: 1.02;\n  letter-spacing: .01em;\n  text-transform: uppercase;\n  overflow-wrap: anywhere;\n  text-shadow: 0 1px 10px #000;\n}\n#bt-cantina-gallery-view .btcg-mark {\n  position: relative;\n  flex: 0 0 30px;\n  width: 30px;\n  height: 30px;\n  border: 1px solid rgba(255,255,255,.65);\n  border-radius: 50%;\n  background: rgba(0,0,0,.3);\n  transition: background 450ms ease, border-color 450ms ease;\n}\n#bt-cantina-gallery-view .btcg-mark::before,\n#bt-cantina-gallery-view .btcg-mark::after {\n  content: \"\";\n  position: absolute;\n  width: 10px;\n  height: 1px;\n  top: 50%;\n  left: 50%;\n  background: #fff;\n  transform: translate(-50%, -50%);\n  transition: transform 500ms var(--btcg-ease);\n}\n#bt-cantina-gallery-view .btcg-mark::after { transform: translate(-50%, -50%) rotate(90deg); }\n#bt-cantina-gallery-view .btcg-details {\n  display: grid;\n  grid-template-rows: 0fr;\n  opacity: 0;\n  transform: translateY(14px);\n  transition: grid-template-rows 700ms var(--btcg-ease), opacity 450ms ease, transform 700ms var(--btcg-ease);\n}\n#bt-cantina-gallery-view .btcg-details-inner { display: block; min-height: 0; overflow: hidden; }\n#bt-cantina-gallery-view .btcg-description {\n  display: block;\n  max-width: 36em;\n  padding-top: 14px;\n  color: #fff !important;\n  font-family: \"Poppins\", sans-serif !important;\n  font-size: 14px;\n  line-height: 1.65;\n  font-weight: 400;\n  letter-spacing: .01em;\n  overflow-wrap: anywhere;\n  white-space: pre-line;\n  text-shadow: 0 1px 8px #000;\n}\n#bt-cantina-gallery-view .btcg-price {\n  display: block;\n  padding-top: 13px;\n  color: #fff !important;\n  font-family: \"Poppins\", sans-serif !important;\n  font-size: clamp(13px, .88vw, 16px);\n  font-weight: 600;\n  line-height: 1;\n  letter-spacing: .04em;\n}\n#bt-cantina-gallery-view .is-open .btcg-image {\n  transform: scale(1.002);\n  filter: brightness(.88);\n}\n#bt-cantina-gallery-view .is-open .btcg-shade { background-color: transparent; }\n#bt-cantina-gallery-view .is-open .btcg-content { transform: translateY(-8px); }\n#bt-cantina-gallery-view .is-open .btcg-details { grid-template-rows: 1fr; opacity: 1; transform: translateY(0); }\n#bt-cantina-gallery-view .is-open .btcg-mark { background: #ea0b5f; border-color: #ea0b5f; }\n#bt-cantina-gallery-view .is-open .btcg-mark::after { transform: translate(-50%, -50%) rotate(0); }\n#bt-cantina-gallery-view .btcg-static { cursor: default; }\n#bt-cantina-gallery-view .btcg-sr {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip-path: inset(50%);\n  white-space: nowrap;\n  border: 0;\n}\n@media (min-width: 701px) and (max-width: 1100px) {\n  #bt-cantina-gallery-view { --btcg-padding: 30px; }\n  #bt-cantina-gallery-view .btcg-block {\n    grid-template-columns: repeat(4, minmax(0, 1fr));\n    grid-template-areas: var(--btcg-map-tablet);\n  }\n  #bt-cantina-gallery-view .btcg-name { font-size: clamp(25px, 3.5vw, 34px); }\n}\n@media (max-width: 700px) {\n  #bt-cantina-gallery-view { --btcg-padding: 28px; }\n  #bt-cantina-gallery-view .btcg-block { display: block; }\n  #bt-cantina-gallery-view .btcg-card {\n    aspect-ratio: var(--btcg-mobile-ratio, 4 \/ 5);\n    min-height: var(--btcg-min-height, 300px);\n    width: 100%;\n  }\n  #bt-cantina-gallery-view .btcg-toggle { position: absolute; inset: 0; }\n  #bt-cantina-gallery-view .btcg-name { font-size: clamp(25px, 8vw, 32px); }\n  #bt-cantina-gallery-view .btcg-price { font-size: 14px; }\n}\n@media (prefers-reduced-motion: reduce) {\n  #bt-cantina-gallery-view *,\n  #bt-cantina-gallery-view *::before,\n  #bt-cantina-gallery-view *::after { transition: none !important; }\n  #bt-cantina-gallery-view .btcg-image,\n  #bt-cantina-gallery-view .btcg-content,\n  #bt-cantina-gallery-view .btcg-details { transform: none !important; }\n}\n@media (forced-colors: active) {\n  #bt-cantina-gallery-view .btcg-toggle { background: Canvas; color: CanvasText; border: 1px solid CanvasText; }\n  #bt-cantina-gallery-view .btcg-name,\n  #bt-cantina-gallery-view .btcg-description,\n  #bt-cantina-gallery-view .btcg-price { color: CanvasText !important; text-shadow: none; }\n  #bt-cantina-gallery-view .btcg-toggle:focus-visible { outline-color: Highlight; }\n}\n@media print {\n  #bt-cantina-gallery-view .btcg-block { display: block; }\n  #bt-cantina-gallery-view .btcg-card { min-height: 320px; break-inside: avoid; }\n  #bt-cantina-gallery-view .btcg-details { grid-template-rows: 1fr; opacity: 1; transform: none; }\n}\n\n\/* Hilfsmodule erst nach erfolgreichem Aufbau aus dem Layout nehmen. *\/\nbody:not(.et-fb) .btcg-row-active > .et_pb_column > .et_pb_code {\n  display:none !important;\n}\n\/* Beide Ansichten belegen dieselben Fl\u00e4chen. *\/\n#bt-cantina-gallery-view .btcg-pages { display:grid; margin:0; padding:0; }\n#bt-cantina-gallery-view .btcg-page {\n  grid-area:1 \/ 1; min-width:0; visibility:hidden; pointer-events:none; z-index:0;\n}\n#bt-cantina-gallery-view .btcg-page .btcg-card {\n  opacity:0;\n  transition:opacity 950ms cubic-bezier(.4,0,.2,1);\n  transition-delay:var(--btcg-card-delay, 0ms);\n}\n#bt-cantina-gallery-view .btcg-page.is-current { visibility:visible; pointer-events:auto; z-index:1; }\n#bt-cantina-gallery-view .btcg-page.is-leaving { visibility:visible; }\n\/* Die alte Karte bleibt vollst\u00e4ndig sichtbar unter der einblendenden neuen. *\/\n#bt-cantina-gallery-view .btcg-page.is-current .btcg-card,\n#bt-cantina-gallery-view .btcg-page.is-leaving .btcg-card { opacity:1; }\n#bt-cantina-gallery-view .btcg-page:not(.is-current):not(.is-leaving) .btcg-card {\n  opacity:0; transition:none;\n}\n#bt-cantina-gallery-view[aria-busy=\"true\"] .btcg-page { pointer-events:none; }\n\/* Nur Gallery 02. Der Reservierungsdialog liegt weiterhin dar\u00fcber. *\/\n#btcg2-dock {\n  position:fixed; z-index:999990; right:max(52px, env(safe-area-inset-right));\n  bottom:calc(32px + env(safe-area-inset-bottom, 0px));\n  display:flex; align-items:center; justify-content:flex-end; gap:8px;\n  width:max-content; max-width:calc(100vw - 32px); margin:0; padding:0;\n  opacity:0; visibility:hidden; pointer-events:none; transform:translateY(12px);\n  transition:opacity 420ms ease, transform 650ms cubic-bezier(.22,1,.36,1), visibility 0s linear 420ms;\n}\n#btcg2-dock, #btcg2-dock * { box-sizing:border-box; }\n#btcg2-dock.is-visible { opacity:1; visibility:visible; pointer-events:none; transform:none; transition-delay:0s; }\n#btcg2-dock .btcg2-pager, #btcg2-dock .btcg2-reserve {\n  border:1px solid rgba(234,11,95,.6) !important; border-radius:999px !important;\n  background:rgba(5,5,5,.46) !important; color:#ea0b5f !important;\n  backdrop-filter:blur(7px) saturate(115%); -webkit-backdrop-filter:blur(7px) saturate(115%);\n  box-shadow:none !important;\n  height:46px !important; min-height:46px !important;\n}\n#btcg2-dock .btcg2-pager[hidden], #btcg2-dock .btcg2-reserve[hidden] { display:none !important; }\n#btcg2-dock .btcg2-pager {\n  display:flex !important; align-items:center !important; padding:0 !important; margin:0 !important;\n  opacity:0; visibility:hidden; pointer-events:none; transform:translateY(5px);\n  transition:opacity 600ms ease, transform 750ms cubic-bezier(.22,1,.36,1), visibility 0s linear 600ms;\n}\n#btcg2-dock .btcg2-pager.is-active {\n  opacity:1; visibility:visible; transform:none; transition-delay:0s;\n}\n#btcg2-dock.is-visible .btcg2-pager.is-active,\n#btcg2-dock.is-visible .btcg2-reserve[aria-hidden=\"false\"] { pointer-events:auto; }\n\/* Reservierung bleibt rechts stehen; die unsichtbare Men\u00fcgruppe f\u00e4ngt keine Klicks. *\/\n#btcg2-dock button {\n  appearance:none; -webkit-appearance:none; margin:0 !important; border:0; border-radius:999px;\n  width:auto; height:44px; min-width:44px; min-height:44px; padding:0 !important;\n  display:grid !important; place-items:center !important;\n  background:transparent; color:inherit; cursor:pointer;\n  font-family:\"Oswald\",sans-serif !important; font-size:16px !important; font-weight:500 !important;\n  font-style:normal !important; font-stretch:normal !important; font-synthesis:none;\n  line-height:1 !important; letter-spacing:.015em !important;\n  text-transform:uppercase; text-decoration:none; white-space:nowrap;\n  text-indent:0 !important; text-align:center !important;\n  box-shadow:none; touch-action:manipulation; -webkit-tap-highlight-color:transparent;\n  transition:color 400ms ease, background-color 400ms ease, border-color 400ms ease;\n}\n#btcg2-dock .btcg2-label {\n  position:relative; top:-1px;\n  display:block !important; margin:0 !important; padding:0 !important;\n  font-family:\"Oswald\",sans-serif !important; font-size:16px !important;\n  font-weight:500 !important; font-style:normal !important; font-synthesis:none;\n  line-height:1 !important; letter-spacing:.015em !important;\n  color:inherit !important; text-align:center !important;\n}\n#btcg2-dock .btcg2-reserve {\n  position:relative;\n  padding:0 !important;\n  overflow:hidden;\n  width:48px;\n  min-width:48px;\n  \/* Die Kapsel bleibt optisch identisch zu V4.8: 22px Seitenluft je Textseite. *\/\n  font-family:\"Oswald\",sans-serif !important;\n  font-size:16px !important;\n  font-weight:500 !important;\n  font-style:normal !important;\n  font-stretch:normal !important;\n  font-synthesis:none;\n  line-height:1 !important;\n  letter-spacing:.015em !important;\n  text-transform:uppercase;\n  transition:\n    width 860ms cubic-bezier(.22,1,.36,1),\n    color 400ms ease,\n    background-color 400ms ease,\n    border-color 400ms ease;\n}\n#btcg2-dock .btcg2-reserve.btcg2-about-muted:not(:hover):not(:focus-visible) { opacity:.8; }\n@media (prefers-reduced-motion:no-preference){\nbody.page-id-9606 #btcg2-dock#btcg2-dock>button.btcg2-reserve{transition:width 1.2s cubic-bezier(.4,0,.2,1),color 1.1s cubic-bezier(.45,0,.55,1),border-color 1.1s cubic-bezier(.45,0,.55,1),background-color 1.1s cubic-bezier(.45,0,.55,1),opacity .7s ease!important;}\nbody.page-id-9606 #btcg2-dock#btcg2-dock>button.btcg2-reserve.btcg2-no-width-motion{transition-duration:0s,1.1s,1.1s,1.1s,.7s!important;}\n}\n#btcg2-dock .btcg2-reserve.btcg2-no-width-motion {\n  transition-duration:0ms,400ms,400ms,400ms !important;\n}\n#btcg2-dock .btcg2-reserve .btcg2-reserve-layer {\n  position:absolute !important;\n  left:50% !important;\n  top:50% !important;\n  display:inline-flex !important;\n  align-items:center !important;\n  justify-content:center !important;\n  margin:0 !important;\n  padding:0 !important;\n  width:max-content !important;\n  max-width:none !important;\n  transform:translate(-50%,calc(-50% - 1px));\n  white-space:nowrap;\n  pointer-events:none;\n  color:inherit !important;\n  font-family:\"Oswald\",sans-serif !important;\n  font-size:16px !important;\n  font-weight:500 !important;\n  font-style:normal !important;\n  font-stretch:normal !important;\n  font-synthesis:none;\n  line-height:1 !important;\n  letter-spacing:.015em !important;\n  text-transform:uppercase !important;\n  text-align:center !important;\n}\n#btcg2-dock .btcg2-reserve .btcg2-char {\n  display:inline-block !important;\n  margin:0 !important;\n  padding:0 !important;\n  font:inherit !important;\n  line-height:inherit !important;\n  letter-spacing:inherit !important;\n  text-transform:inherit !important;\n  color:inherit !important;\n  transform-origin:50% 70%;\n  backface-visibility:hidden;\n  -webkit-font-smoothing:antialiased;\n  will-change:opacity,transform,filter;\n}\n#btcg2-dock .btcg2-reserve .btcg2-reserve-measure {\n  position:absolute !important;\n  left:-10000px !important;\n  top:0 !important;\n  display:inline-block !important;\n  width:max-content !important;\n  max-width:none !important;\n  margin:0 !important;\n  padding:0 !important;\n  visibility:hidden !important;\n  pointer-events:none !important;\n  white-space:nowrap;\n  font-family:\"Oswald\",sans-serif !important;\n  font-size:16px !important;\n  font-weight:500 !important;\n  font-style:normal !important;\n  font-stretch:normal !important;\n  font-synthesis:none;\n  line-height:1 !important;\n  letter-spacing:.015em !important;\n  text-transform:uppercase !important;\n}\n#btcg2-dock .btcg2-arrow { width:44px !important; flex:0 0 44px; }\n#btcg2-dock .btcg2-arrow svg {\n  display:block !important; width:16px !important; height:16px !important;\n  margin:0 !important; padding:0 !important; fill:none !important; stroke:currentColor !important;\n}\n#btcg2-dock .btcg2-next { padding:0 5px !important; min-width:48px; }\n#btcg2-dock button::before, #btcg2-dock button::after { content:none !important; display:none !important; }\n#btcg2-dock button:focus-visible { outline:2px solid #fff; outline-offset:3px; }\n#btcg2-dock button[aria-disabled=\"true\"] { cursor:progress; }\n#btcg2-dock .btcg2-next[aria-disabled=\"true\"] .btcg2-label { opacity:1; }\n@media (hover:hover) and (pointer:fine) {\n  #btcg2-dock button:hover { color:#fff !important; background-color:rgba(234,11,95,.12) !important; }\n}\n@media (max-width:700px) {\n  #btcg2-dock { right:max(16px,env(safe-area-inset-right)); bottom:calc(18px + env(safe-area-inset-bottom,0px)); gap:8px; }\n}\n\/* Beide kompakten Kapseln passen auch auf 320px nebeneinander. *\/\n@media (max-width:300px) {\n  #btcg2-dock { flex-direction:column; align-items:flex-end; }\n}\n@media (prefers-reduced-motion:reduce) {\n  #btcg2-dock, #btcg2-dock * { transition:none !important; transform:none !important; }\n}\n@media (forced-colors:active) {\n  #btcg2-dock .btcg2-pager, #btcg2-dock .btcg2-reserve { background:ButtonFace !important; color:ButtonText !important; border:1px solid ButtonText !important; }\n  #btcg2-dock button { color:ButtonText !important; }\n  #btcg2-dock button:focus-visible { outline-color:Highlight; }\n}\n@media print {\n  #btcg2-dock { display:none !important; }\n  #bt-cantina-gallery-view .btcg-pages { display:block; }\n  #bt-cantina-gallery-view .btcg-page { visibility:visible; }\n  #bt-cantina-gallery-view .btcg-page .btcg-card { opacity:1 !important; }\n}\n\n\n\/* V4 \u00b7 Eine sichtbare Bildschirmh\u00f6he, einschlie\u00dflich mobiler Browserleisten. *\/\n#bt-cantina-gallery-view {\n  --btcg-padding:clamp(16px, 2vw, 32px);\n  height:100vh;\n  height:100dvh;\n}\n#bt-cantina-gallery-view .btcg-pages,\n#bt-cantina-gallery-view .btcg-page,\n#bt-cantina-gallery-view .btcg-block { height:100%; min-height:0; }\n#bt-cantina-gallery-view .btcg-pages { overflow:hidden; }\n#bt-cantina-gallery-view .btcg-card { min-height:0; }\n#bt-cantina-gallery-view .btcg-toggle {\n  justify-content:flex-start;\n  overflow-y:auto;\n  overscroll-behavior-y:auto;\n  scrollbar-width:thin;\n  padding-bottom:calc(var(--btcg-padding) + 10px);\n}\n#bt-cantina-gallery-view .btcg-content { flex-shrink:0; margin-top:auto; }\n#bt-cantina-gallery-view .btcg-name { line-height:1.12; }\n#bt-cantina-gallery-view .btcg-mobile-rail,\n#bt-cantina-gallery-view .btcg-mobile-count { display:none; }\n#btcg2-dock.btcg2-phone button[aria-disabled=\"true\"] { cursor:default; }\n#btcg2-dock.btcg2-phone .btcg2-arrow[aria-disabled=\"true\"] { opacity:.45; }\n@media (max-width:700px) {\n  #bt-cantina-gallery-view { --btcg-padding:26px; }\n  #bt-cantina-gallery-view .btcg-pages { display:none; }\n  #bt-cantina-gallery-view .btcg-mobile-rail {\n    display:flex; width:100%; height:100%; min-width:0;\n    overflow-x:auto; overflow-y:hidden;\n    scroll-snap-type:x mandatory;\n    overscroll-behavior-x:contain;\n    scrollbar-width:none;\n    -webkit-overflow-scrolling:touch;\n  }\n  #bt-cantina-gallery-view .btcg-mobile-rail::-webkit-scrollbar { display:none; }\n  #bt-cantina-gallery-view .btcg-mobile-rail > .btcg-card {\n    flex:0 0 100%; width:100%; height:100%; min-height:0;\n    aspect-ratio:auto; scroll-snap-align:start; scroll-snap-stop:always;\n    opacity:1; transform:none;\n  }\n  #bt-cantina-gallery-view .btcg-toggle {\n    touch-action:pan-x pan-y pinch-zoom;\n    padding-top:calc(32px + env(safe-area-inset-top, 0px));\n    padding-bottom:calc(116px + env(safe-area-inset-bottom, 0px));\n  }\n  #bt-cantina-gallery-view .btcg-mobile-count {\n    display:block; position:absolute; z-index:2; bottom:calc(80px + env(safe-area-inset-bottom, 0px));\n    left:36px; margin:0; padding:0; pointer-events:none;\n    color:#fff; font:400 12px\/1.4 \"Poppins\",sans-serif; letter-spacing:.08em;\n    text-shadow:0 1px 8px #000;\n  }\n}\n@media print {\n  #bt-cantina-gallery-view { height:auto; }\n  #bt-cantina-gallery-view .btcg-pages { display:block; overflow:visible; }\n  #bt-cantina-gallery-view .btcg-card { min-height:320px; }\n  #bt-cantina-gallery-view .btcg-mobile-rail { height:auto; display:block; overflow:visible; }\n  #bt-cantina-gallery-view .btcg-mobile-rail > .btcg-card { height:360px; }\n  #bt-cantina-gallery-view .btcg-mobile-count { display:none; }\n}\n\n\n\/* V4.7 \u00b7 Gemeinsame Pixelkanten, gleichm\u00e4\u00dfige Textabst\u00e4nde. *\/\n#bt-cantina-gallery-view { scroll-margin-top:0 !important; }\n#bt-cantina-gallery-view .btcg-block { display:block; position:relative; }\n#bt-cantina-gallery-view .btcg-card { position:absolute; }\n#bt-cantina-gallery-view .btcg-mark,\n#bt-cantina-gallery-view .is-open .btcg-mark { background:transparent; border-color:rgba(255,255,255,.8); color:#fff; }\n#bt-cantina-gallery-view .btcg-mark::before,\n#bt-cantina-gallery-view .btcg-mark::after { background:currentColor; }\n#bt-cantina-gallery-view .is-open .btcg-mark::after { transform:translate(-50%,-50%) rotate(90deg); }\n#bt-cantina-gallery-view .btcg-toggle:hover .btcg-mark,\n#bt-cantina-gallery-view .btcg-toggle:focus-visible .btcg-mark { color:#ea0b5f; border-color:#ea0b5f; }\n@media(max-width:700px) {\n  #bt-cantina-gallery-view .btcg-mobile-rail > .btcg-card { position:relative; left:auto !important; top:auto !important; width:100% !important; height:100% !important; }\n}\n#btcg-fullscreen {\n  position:fixed !important; inset:0 !important; width:100% !important; height:100% !important;\n  max-width:none !important; max-height:none !important; margin:0 !important; padding:0 !important;\n  border:0 !important; background:transparent !important; overflow:hidden; overscroll-behavior:none; color:#fff;\n}\n#btcg-fullscreen::backdrop { background:rgba(0,0,0,.3); }\n#btcg-fullscreen .btcg-fs-panel { position:absolute; overflow:hidden; background:rgba(5,5,5,.38); isolation:isolate; }\n#btcg-fullscreen .btcg-fs-image { position:absolute; inset:0; width:100%; height:100%; max-width:none; object-fit:contain; }\n#btcg-fullscreen .btcg-fs-shade { position:absolute; inset:0; background:linear-gradient(0deg,rgba(0,0,0,.92),transparent 65%); }\n#btcg-fullscreen .btcg-fs-copy {\n  position:absolute; inset:auto 0 0; padding:clamp(26px,2.5vw,40px); padding-bottom:calc(30px + env(safe-area-inset-bottom,0px)); padding-right:65px;\n  max-height:65%; overflow-y:auto; opacity:0; transform:translateY(12px);\n  transition:opacity 650ms ease,transform 850ms cubic-bezier(.22,1,.36,1);\n}\n#btcg-fullscreen.is-ready .btcg-fs-copy { opacity:1; transform:none; }\n\n\/* V5.7 \u00b7 Stabiler \u00dcbergabeframe zwischen fliegendem Textklon und\n   echtem Vollbild-Textblock. Beim Vermessen wird der 12px-Startversatz\n   ausgeschaltet; bei der \u00dcbergabe sind Transition, Opacity und Transform\n   f\u00fcr exakt einen Paint-Zyklus festgesetzt. *\/\n#btcg-fullscreen .btcg-fs-copy.btcg-fs-measure {\n  transform:none !important;\n  transition:none !important;\n}\n#btcg-fullscreen .btcg-fs-copy.btcg-fs-handoff {\n  opacity:1 !important;\n  transform:none !important;\n  transition:none !important;\n}\n#btcg-fullscreen h2 { color:#fff !important; font:600 var(--btcg-fs-title-size,26px)\/1.12 \"Oswald\",sans-serif !important; text-transform:uppercase; overflow-wrap:anywhere; margin:0 0 12px; padding:0; }\n\/* V5.6 \u00b7 Der Gerichtsname l\u00f6st sich beim Schlie\u00dfen aus dem Textblock\n   und f\u00e4hrt synchron mit dem Foto zur\u00fcck in die echte Kachelposition. *\/\n#btcg-fullscreen .btcg-fs-return-title {\n  position:absolute !important;\n  z-index:4;\n  margin:0 !important;\n  padding:0 !important;\n  border:0 !important;\n  background:transparent !important;\n  color:#fff !important;\n  font-family:\"Oswald\",sans-serif !important;\n  font-weight:600 !important;\n  letter-spacing:.01em;\n  text-transform:uppercase !important;\n  overflow-wrap:anywhere;\n  pointer-events:none !important;\n  transform:none;\n  transform-origin:0 0;\n  backface-visibility:hidden;\n  -webkit-font-smoothing:antialiased;\n  will-change:left,top,width,font-size,line-height,opacity;\n}\n\n\/* V5.6 \u00b7 Beim \u00d6ffnen bleibt der komplette Textblock visuell an der Kachel\n   h\u00e4ngen und gleitet zusammen mit dem Bild in seine Gro\u00dfbildposition. *\/\n#btcg-fullscreen .btcg-fs-flight-copy {\n  position:absolute !important;\n  z-index:4;\n  margin:0 !important;\n  padding:0 !important;\n  border:0 !important;\n  background:transparent !important;\n  color:#fff !important;\n  overflow:visible !important;\n  pointer-events:none !important;\n  transform-origin:0 100%;\n  backface-visibility:hidden;\n  -webkit-font-smoothing:antialiased;\n  will-change:transform,opacity,filter;\n}\n#btcg-fullscreen .btcg-fs-flight-copy h2,\n#btcg-fullscreen .btcg-fs-flight-copy p {\n  position:relative;\n  margin-left:0 !important;\n  margin-right:0 !important;\n}\n\n\/* Beim Bildwechsel liegt der alte Textblock kurz \u00fcber dem neuen.\n   Dadurch gibt es keinen leeren Frame zwischen zwei Gerichten. *\/\n#btcg-fullscreen .btcg-fs-copy.btcg-fs-copy-outgoing {\n  pointer-events:none !important;\n  z-index:3;\n}\n\/* V5.11 \u00b7 Beschreibung + Preis beim Schlie\u00dfen unabh\u00e4ngig vom\n   schrumpfenden Bildpanel ausblenden. Der unsichtbare h2-Klon erh\u00e4lt\n   exakt den urspr\u00fcnglichen Platz, damit Text und Preis keinen Pixel springen. *\/\n#btcg-fullscreen .btcg-fs-return-details {\n  position:absolute !important;\n  z-index:3;\n  inset:auto !important;\n  margin:0 !important;\n  border:0 !important;\n  background:transparent !important;\n  max-height:none !important;\n  overflow:hidden !important;\n  opacity:1;\n  transform:none !important;\n  transition:none !important;\n  pointer-events:none !important;\n  backface-visibility:hidden;\n  -webkit-font-smoothing:antialiased;\n  will-change:opacity,filter;\n}\n#btcg-fullscreen .btcg-fs-return-details h2 {\n  visibility:hidden !important;\n}\n#btcg-fullscreen p { color:#fff !important; font:400 14px\/1.6 \"Poppins\",sans-serif !important; max-width:42em; margin:0 0 12px; padding:0; white-space:pre-line; }\n#btcg-fullscreen .btcg-fs-close {\n  position:absolute; right:max(24px,env(safe-area-inset-right)); top:max(24px,env(safe-area-inset-top));\n  width:44px; height:44px; padding:0; display:grid; place-items:center; border:0;\n  border-radius:50%; color:#fff; background:transparent; cursor:pointer;\n  transition:color 450ms ease,border-color 450ms ease; z-index:2;\n}\n#btcg-fullscreen .btcg-fs-close::before { content:\"\"; display:block; width:10px; height:1px; background:currentColor; }\n#btcg-fullscreen .btcg-fs-close::after { content:\"\"; position:absolute; inset:7px; border:1px solid currentColor; border-radius:50%; background:rgba(0,0,0,.18); z-index:-1; }\n#btcg-fullscreen .btcg-fs-close:hover { color:#ea0b5f; border-color:#ea0b5f; }\n#btcg-fullscreen .btcg-fs-close:focus-visible { outline:2px solid #fff; outline-offset:5px; }\n@media(prefers-reduced-motion:reduce) { #btcg-fullscreen * { transition:none !important; } }\n@media print { #btcg-fullscreen { display:none !important; } #bt-cantina-gallery-view .btcg-card { position:relative; left:auto !important; top:auto !important; width:100% !important; } }\n\n\n\/* Das Dock erh\u00e4lt nur seitlich Platz; keine Kachel bekommt extra Bodenabstand. *\/\n@media(min-width:701px) {\n  #bt-cantina-gallery-view .btcg-dock-corner .btcg-name { max-width:var(--btcg-label-width,100%); }\n}\n\n\n\/* Derselbe TAUSEND-Cursor wird w\u00e4hrend der Gro\u00dfansicht in den Dialog versetzt.\n   Dadurch liegt er im nativen Dialog-Layer und bleibt sichtbar. *\/\n#btcg-fullscreen,\n#btcg-fullscreen *,\n#btcg-fullscreen::backdrop { cursor:default !important; }\n@media (hover:hover) and (pointer:fine) {\n  #btcg-fullscreen.btcg-has-theme-cursor,\n  #btcg-fullscreen.btcg-has-theme-cursor * { cursor:none !important; }\n  #btcg-fullscreen #bt-theme-cursor { filter:brightness(1) !important; pointer-events:none !important; }\n  #btcg-fullscreen #bt-theme-cursor::before { opacity:0 !important; }\n  #btcg-fullscreen #bt-theme-cursor::after { opacity:1 !important; }\n}\n\n\/* Das Plus sitzt an jeder Kachel rechts, unabh\u00e4ngig von Name und Dock. *\/\n#bt-cantina-gallery-view .btcg-heading { position:relative; padding-right:34px; }\n#bt-cantina-gallery-view .btcg-mark {\n  position:absolute; right:calc(14px - var(--btcg-padding)); top:50%;\n  transform:translateY(-50%);\n}\n#btcg-fullscreen::backdrop {\n  background:rgba(0,0,0,.78);\n  backdrop-filter:blur(20px) saturate(108%);\n  -webkit-backdrop-filter:blur(20px) saturate(108%);\n  animation:btcg-backdrop-in 900ms ease both;\n}\n#btcg-fullscreen.is-closing::backdrop { animation:btcg-backdrop-out 950ms ease both; }\n@keyframes btcg-backdrop-in {\n  \/* Schwarz liegt ab dem ersten Dialog-Frame an; nur der Blur f\u00e4hrt weich hoch. *\/\n  from { background:rgba(0,0,0,.78); backdrop-filter:blur(0); -webkit-backdrop-filter:blur(0); }\n  to { background:rgba(0,0,0,.78); backdrop-filter:blur(20px) saturate(108%); -webkit-backdrop-filter:blur(20px) saturate(108%); }\n}\n@keyframes btcg-backdrop-out {\n  from { background:rgba(0,0,0,.78); backdrop-filter:blur(20px) saturate(108%); -webkit-backdrop-filter:blur(20px) saturate(108%); }\n  to { background:rgba(0,0,0,0); backdrop-filter:blur(0); -webkit-backdrop-filter:blur(0); }\n}\n@media(prefers-reduced-motion:reduce) { #btcg-fullscreen::backdrop { animation:none !important; } }\n\n\/* V5.3 \u00b7 Kein Blur mehr direkt auf dem Dialog selbst.\n   So bleibt die R\u00fcckfahrt des Bildes unverdeckt wie in V5.1. *\/\n#btcg-fullscreen {\n  background:transparent !important;\n  backdrop-filter:none !important;\n  -webkit-backdrop-filter:none !important;\n}\n\n\/* Das Minus verschwindet sofort zu Beginn der Schlie\u00dfbewegung weich,\n   statt bis fast zum Ende sichtbar zu bleiben. *\/\n#btcg-fullscreen .btcg-fs-close {\n  opacity:1;\n  transition:opacity 220ms ease,color 450ms ease,border-color 450ms ease;\n}\n#btcg-fullscreen.is-closing .btcg-fs-close {\n  opacity:0;\n  pointer-events:none;\n  transition:opacity 180ms ease;\n}\n\n\n\/* Men\u00fc und Seitenzahl teilen dieselbe Schrift und Grundlinie. *\/\n#btcg2-dock .btcg2-next { display:flex !important; align-items:baseline !important; justify-content:center !important; gap:9px; padding:0 8px !important; }\n#btcg2-dock .btcg2-next .btcg2-label {\n  position:static;\n  transform:translateY(-1px);\n}\n#btcg2-dock .btcg2-page-count {\n  position:static;\n  transform:translate(2px,1px);\n  display:block; font:400 14px\/1 \"Oswald\",sans-serif !important;\n  font-variant-numeric:tabular-nums; letter-spacing:.01em; white-space:nowrap; opacity:.8;\n}\n#btcg2-dock .btcg2-next { align-items:center !important; }\n\/* Keine Randbuttons: nur ein feiner Pfeil direkt an der Mausposition. *\/\n#bt-cantina-gallery-view .btcg-cursor-arrow,\n#btcg-fullscreen .btcg-cursor-arrow {\n  position:absolute; z-index:2147483647; width:20px; height:20px;\n  pointer-events:none !important; color:#fff; opacity:0;\n  transform:translate(-50%,-50%); transition:opacity 300ms ease;\n  filter:drop-shadow(0 1px 2px rgba(0,0,0,.65));\n}\n.btcg-cursor-arrow svg { display:block; width:20px; height:20px; }\n#bt-cantina-gallery-view.btcg-at-edge .btcg-cursor-arrow,\n#btcg-fullscreen.btcg-at-edge .btcg-cursor-arrow { opacity:1; }\n#bt-cantina-gallery-view.btcg-at-edge,\n#bt-cantina-gallery-view.btcg-at-edge *,\n#btcg-fullscreen.btcg-at-edge,\n#btcg-fullscreen.btcg-at-edge * { --btcg-native-cursor:none; cursor:none !important; }\n#bt-theme-cursor.btcg-edge-hidden { opacity:0 !important; }\n@media(hover:none) { .btcg-cursor-arrow { display:none !important; } }\n\n#bt-cantina-gallery-view .btcg-name {\n  margin-left:10px;\n  transform:translateY(-5px);\n}\n#bt-cantina-gallery-view .btcg-details { margin-left:10px; }\n#bt-cantina-gallery-view .btcg-heading { padding-right:69px; }\n#bt-cantina-gallery-view .btcg-mark {\n  right:calc(54px - var(--btcg-padding)); top:calc(50% - 2px); opacity:0;\n  transition:opacity 450ms ease,color 450ms ease,border-color 450ms ease;\n}\n#bt-cantina-gallery-view .btcg-toggle:hover .btcg-mark,\n#bt-cantina-gallery-view .btcg-toggle:focus-visible .btcg-mark { opacity:1; }\n#btcg-fullscreen .btcg-fs-close { color:#ea0b5f; }\n#btcg-fullscreen .btcg-fs-close:hover,\n#btcg-fullscreen .btcg-fs-close:focus-visible { color:#fff; }\n#bt-cantina-gallery-view .btcg-cursor-arrow,\n#btcg-fullscreen .btcg-cursor-arrow { width:26px; color:#ea0b5f; }\n.btcg-cursor-arrow svg { width:26px; }\n#btcg2-dock .btcg2-next { gap:11px; padding-right:5px !important; }\n\/* V3 Galerie: beim Verlassen fr\u00fcher und z\u00fcgiger ausblenden, Einblenden bleibt weich. *\/\n@media(prefers-reduced-motion:no-preference){\n body.page-id-9606 #btcg2-dock>.btcg2-pager:not(.is-active){\n  transition:opacity .45s cubic-bezier(.4,0,.2,1),transform .65s cubic-bezier(.22,1,.36,1),visibility 0s linear .45s,color 1.1s cubic-bezier(.45,0,.55,1),border-color 1.1s cubic-bezier(.45,0,.55,1),background-color 1.1s cubic-bezier(.45,0,.55,1)!important;\n }\n}\n#btcg2-dock .btcg2-page-count {\n  display:grid; grid-template-columns:var(--btcg-number-width,9px) 1em var(--btcg-number-width,9px);\n  align-items:center; text-align:center; flex-shrink:0;\n}\n\n\n}<\/style>\n<script>\nif(!window.matchMedia('(max-width:767px)').matches){\n(function(){function btV4CantinaRun(){\/* bt-near-cantina-v1 *\/if(!btV4CantinaRun.btNearReady && 'IntersectionObserver' in window){var btNearTargets=document.querySelectorAll('#about,#cantina,#cantina-chef,#cantina-menu,#kontakt');if(btNearTargets.length){var btNearObserver=new IntersectionObserver(function(entries){if(!entries.some(function(e){return e.isIntersecting;}))return;btNearObserver.disconnect();btV4CantinaRun.btNearReady=true;btV4CantinaRun();},{rootMargin:'100% 0px 100% 0px'});btNearTargets.forEach(function(el){btNearObserver.observe(el);});return;}}\n(function () {\n  \"use strict\";\n\n  const btEnglish = \/^en(?:[-_]|$)\/i.test(document.documentElement.lang || \"\");\n  const btText = (de, en) => btEnglish ? en : de;\n\n  \/* EINSTELLUNGEN *\/\n  const SOURCE_ID = \"bt-cantina-gallery\";\n  const DATA_ID = \"bt-cantina-gallery-texts\";\n  const VIEW_ID = \"bt-cantina-gallery-view\";\n  const TEST_DOUBLE_FIVE_IMAGES = true; \/\/ Zwei \u00fcberblendete Ansichten derselben f\u00fcnf Originalfotos; mobil weiterhin f\u00fcnf Gerichte.\n  const SHUFFLE_IMAGES = true; \/\/ einmal pro Seitenaufruf; kein Wechsel beim Scrollen\n\n  function isBuilder() {\n    const params = new URLSearchParams(location.search);\n    return document.body.classList.contains(\"et-fb\") ||\n      document.documentElement.classList.contains(\"et-fb-root-ancestor\") ||\n      params.get(\"et_fb\") === \"1\" || params.get(\"et_bfb\") === \"1\";\n  }\n\n  function cleanURL(value) {\n    if (!value) return \"\";\n    \/\/ Vertr\u00e4gt versehentlich als Markdown kopierte Bildlinks.\n    const match = String(value).trim().match(\/^[[][^]*?][(](.*?)[)]$\/);\n    try {\n      const url = new URL(match ? match[1] : String(value).trim(), document.baseURI);\n      return \/^https?:$\/.test(url.protocol) ? url.href : \"\";\n    } catch (_) { return \"\"; }\n  }\n\n  function fileKey(value) {\n    if (!value) return \"\";\n    try {\n      const path = new URL(value, document.baseURI).pathname;\n      return decodeURIComponent(path.slice(path.lastIndexOf(\"\/\") + 1))\n        .replace(\/-[0-9]+x[0-9]+(?=[.][^.]+$)\/, \"\").toLowerCase();\n    } catch (_) { return \"\"; }\n  }\n\n  function shuffle(items) {\n    for (let i = items.length - 1; i > 0; i--) {\n      const j = Math.floor(Math.random() * (i + 1));\n      [items[i], items[j]] = [items[j], items[i]];\n    }\n    return items;\n  }\n\n  function element(tag, className, text) {\n    const node = document.createElement(tag);\n    node.className = className;\n    if (text != null) node.textContent = String(text);\n    return node;\n  }\n\n  function start() {\n    if (isBuilder() || document.getElementById(VIEW_ID)) return true;\n    if (window.matchMedia(\"(max-width:767px)\").matches || !document.getElementById(SOURCE_ID) || !document.getElementById(DATA_ID)) {\n      if(window.matchMedia(\"(max-width:767px)\").matches)document.documentElement.classList.add(\"bt-phone-gallery-suspended\");\n      if(document.getElementById(\"btcg2-dock\"))return true;\n      const originalReserve=document.querySelector(\"#cantina .cantina-reservation-button\")||document.querySelector(\".cantina-reservation-button\");\n      if(!originalReserve)return false;\n      const dock=element(\"div\",\"btcg2-phone-native\");\n      dock.id=\"btcg2-dock\";dock.setAttribute(\"role\",\"group\");dock.setAttribute(\"aria-label\",btText(\"Reservierung\",\"Reservations\"));\n      const reserve=element(\"button\",\"btcg2-reserve\");\n      reserve.appendChild(element(\"span\",\"btcg2-label\",btText(\"Reservieren\",\"Reserve\")));\n      reserve.type=\"button\";reserve.setAttribute(\"aria-haspopup\",\"dialog\");reserve.setAttribute(\"aria-controls\",\"bt-reservation-modal\");\n      reserve.setAttribute(\"aria-label\",btText(\"Tisch in der Tausend Cantina reservieren\",\"Reserve a table at Tausend Cantina\"));\n      reserve.addEventListener(\"click\",function(event){event.stopPropagation();originalReserve.click();});\n      dock.appendChild(reserve);document.body.appendChild(dock);\n      const footer=document.getElementById(\"footer\");\n      const updateFooter=window.btCreateReserveFooterGlide(dock,footer);\n      function refresh(){\n        const about=document.getElementById(\"about\");\n        const music=document.getElementById(\"musik\"),musicRect=music&&music.getBoundingClientRect();\n        const inMusic=!!(musicRect&&musicRect.height>0&&musicRect.top<innerHeight&&musicRect.bottom>0);\n        updateFooter();\n        const on=window.btReserveAreaVisible();\n        dock.classList.toggle(\"is-visible\",on);dock.inert=!on;dock.setAttribute(\"aria-hidden\",String(!on));reserve.setAttribute(\"aria-hidden\",String(!on));\n      }\n      let refreshFrame=0;\n      function requestRefresh(){if(!refreshFrame)refreshFrame=requestAnimationFrame(function(){refreshFrame=0;refresh();});}\n      window.addEventListener(\"scroll\",requestRefresh,{passive:true});window.addEventListener(\"resize\",requestRefresh,{passive:true});\n      refresh();\n      return true;\n    }\n\n    const source = document.getElementById(SOURCE_ID);\n    const dataNode = document.getElementById(DATA_ID);\n    if (!source || !dataNode) return false;\n\n    let records;\n    try {\n      records = JSON.parse(dataNode.textContent);\n      if (!Array.isArray(records)) throw new Error(\"Erwartet wird eine Liste in [ ].\");\n    } catch (error) {\n      console.error(\"Cantina Gallery: Textmodul pr\u00fcfen. Die Divi-Galerie bleibt sichtbar.\", error);\n      return true;\n    }\n\n    const byFile = new Map();\n    records.forEach(function (record) {\n      if (!record || typeof record !== \"object\") return;\n      const key = fileKey(record.image || \"\");\n      if (!key) return;\n      if (byFile.has(key)) {\n        console.warn(\"Cantina Gallery: Doppelter Bilddateiname im Textmodul:\", key);\n        return; \/\/ Erstes Vorkommen behalten: niemals zuf\u00e4llig falsche Texte zuordnen.\n      }\n      byFile.set(key, record);\n    });\n\n    const sourceItems = Array.from(source.querySelectorAll(\".et_pb_gallery_item\"));\n    const items = sourceItems.map(function (item) {\n      const img = item.querySelector(\".et_pb_gallery_image img\") || item.querySelector(\"img\");\n      if (!img) return null;\n      const link = item.querySelector(\".et_pb_gallery_image a\") || img.closest(\"a\");\n      const original = cleanURL(link && link.getAttribute(\"href\"));\n      const thumb = cleanURL(img.getAttribute(\"data-src\") || img.currentSrc || img.getAttribute(\"src\"));\n      const full = original && \/[.](avif|webp|jpe?g|png|gif)(?:[?#]|$)\/i.test(original) ? original : thumb;\n      if (!full) return null;\n      const record = byFile.get(fileKey(full)) || byFile.get(fileKey(thumb)) || {};\n      const title = item.querySelector(\".et_pb_gallery_title\");\n      const caption = item.querySelector(\".et_pb_gallery_caption\");\n      return {\n        src: full,\n        fallback: thumb,\n        srcset: img.getAttribute(\"data-srcset\") || img.getAttribute(\"srcset\") || \"\",\n        name: record.name != null ? record.name : ((title && title.textContent.trim()) || \"\"),\n        description: record.description != null ? record.description : ((caption && caption.textContent.trim()) || \"\"),\n        price: record.price || \"\",\n        alt: record.imageAlt || img.getAttribute(\"alt\") || record.name || btText(\"Cantina \u2013 Bild\",\"Cantina image\"),\n        position: typeof record.position === \"string\" && \/^[0-9]{1,3}% [0-9]{1,3}%$\/.test(record.position) ? record.position : \"50% 50%\"\n      };\n    }).filter(Boolean);\n    if (!items.length) return false;\n    if (SHUFFLE_IMAGES) shuffle(items);\n    const sourceCount = items.length;\n    if (TEST_DOUBLE_FIVE_IMAGES && items.length === 5) {\n      \/\/ Zweite Testansicht: dieselben echten Fotos in anderen Fl\u00e4chen.\n      const second = items.slice(2).concat(items.slice(0, 2));\n      items.push(...second.map(item => Object.assign({}, item)));\n    }\n    const slotCount = Math.min(6, sourceCount);\n    const pageCount = Math.ceil(items.length \/ slotCount);\n    const layoutCount = pageCount === 1 && sourceCount > 1 ? 2 : pageCount;\n    let layoutIndex = 0;\n    const reduced = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n    const view = element(\"section\", \"btcg-view\");\n    view.id = VIEW_ID;\n    view.setAttribute(\"aria-label\", btText(\"Cantina \u2013 Galerie und Gerichte\",\"Cantina gallery and dishes\"));\n    view.setAttribute(\"aria-busy\", \"false\");\n    const hint = element(\"p\", \"btcg-sr\", btText(\"Bild mit Enter, Leertaste oder Antippen im Vollbild \u00f6ffnen. Im Vollbild zeigt ein Klick auf das Bild das n\u00e4chste Foto. Schwarzer Bereich, Minus oder Escape schlie\u00dfen. Men\u00fc zeigt die n\u00e4chste Auswahl in denselben Bildfl\u00e4chen.\",\"Press Enter or Space, or tap an image, to open full screen. Click the full-screen image for the next photo. Click the dark area or the minus button, or press Escape, to close. Menu shows the next selection in the same panels.\"));\n    hint.id = \"btcg-help\";\n    view.appendChild(hint);\n    const dock = element(\"div\", \"\");\n    dock.id = \"btcg2-dock\";\n    dock.setAttribute(\"aria-label\", btText(\"Galerie und Reservierung\",\"Gallery and reservations\"));\n    dock.setAttribute(\"role\", \"group\");\n    dock.setAttribute(\"aria-hidden\", \"true\");\n    dock.inert = true;\n    \/\/ Die Reservierung und die Galerie-Navigation werden getrennt gesteuert.\n    function sectionByID(id) {\n      return document.getElementById(id) || Array.from(document.querySelectorAll(\"[id]\"))\n        .find(node => node.id.split(\" \").includes(id)) || null;\n    }\n    const aboutSection = sectionByID(\"about\");\n    const musicSection = sectionByID(\"musik\");\n    const contactSection = sectionByID(\"kontakt\");\n    const footerSection = sectionByID(\"footer\") || document.getElementById(\"main-footer\") || document.querySelector(\".et-l--footer\");\n    const pager = element(\"div\", \"btcg2-pager\");\n    \/\/ Im Layout behalten, damit die Men\u00fcgruppe weich ausblenden kann.\n    pager.setAttribute(\"role\", \"group\");\n    pager.setAttribute(\"aria-label\", btText(\"Men\u00fcauswahl\",\"Menu selection\"));\n    const previous = element(\"button\", \"btcg2-arrow\");\n    const next = element(\"button\", \"btcg2-next\");\n    const forward = element(\"button\", \"btcg2-arrow\");\n    function arrowIcon(button, direction) {\n      const ns = \"http:\/\/www.w3.org\/2000\/svg\";\n      const svg = document.createElementNS(ns, \"svg\");\n      svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n      svg.setAttribute(\"aria-hidden\", \"true\");\n      svg.setAttribute(\"focusable\", \"false\");\n      const path = document.createElementNS(ns, \"path\");\n      path.setAttribute(\"d\", direction < 0 ? \"M19 12H5M11 6l-6 6 6 6\" : \"M5 12h14M13 6l6 6-6 6\");\n      path.setAttribute(\"fill\", \"none\");\n      path.setAttribute(\"stroke\", \"currentColor\");\n      path.setAttribute(\"stroke-width\", \"1.5\");\n      path.setAttribute(\"stroke-linecap\", \"round\");\n      path.setAttribute(\"stroke-linejoin\", \"round\");\n      svg.appendChild(path);\n      button.appendChild(svg);\n    }\n    arrowIcon(previous, -1);\n    arrowIcon(forward, 1);\n    previous.setAttribute(\"aria-label\", btText(\"Vorherige K\u00f6stlichkeiten\",\"Previous dishes\"));\n    forward.setAttribute(\"aria-label\", btText(\"N\u00e4chste K\u00f6stlichkeiten\",\"Next dishes\"));\n    const nextLabel = element(\"span\", \"btcg-next-label btcg2-label\", btText(\"Men\u00fc\",\"Menu\"));\n    next.setAttribute(\"aria-label\", btText(\"Men\u00fc: n\u00e4chste K\u00f6stlichkeiten anzeigen\",\"Menu: show next dishes\"));\n    next.appendChild(nextLabel);\n    const pageNumber=element(\"span\",\"btcg2-page-count\",\"1 \/ \" + pageCount);\n    pageNumber.setAttribute(\"aria-hidden\",\"true\");\n    const pageCurrent=element(\"span\",\"\",\"1\");\n    const pageTotal=element(\"span\",\"\",pageCount);\n    pageNumber.replaceChildren(pageCurrent,element(\"span\",\"\",\" \/ \"),pageTotal);\n    pageNumber.style.setProperty(\"--btcg-number-width\",(String(Math.max(sourceCount,pageCount)).length*9)+\"px\");\n    next.appendChild(pageNumber);\n    const pagingButtons = [previous, next, forward];\n    pagingButtons.forEach(button => {\n      button.type = \"button\";\n      button.setAttribute(\"aria-controls\", \"btcg-pages\");\n      button.setAttribute(\"aria-describedby\", \"btcg-page-status\");\n      button.setAttribute(\"aria-disabled\", \"false\");\n      button.tabIndex = -1;\n      pager.appendChild(button);\n    });\n    if (pageCount > 1 || sourceCount > 1) dock.appendChild(pager);\n    const originalReserve = document.querySelector(\"#cantina .cantina-reservation-button\") || document.querySelector(\".cantina-reservation-button\");\n    const reserve = element(\"button\", \"btcg2-reserve\");\n    const reserveMeasure = element(\"span\", \"btcg2-reserve-measure\", \"\");\n    reserveMeasure.setAttribute(\"aria-hidden\", \"true\");\n    reserve.appendChild(reserveMeasure);\n    reserve.type = \"button\";\n    reserve.setAttribute(\"aria-label\", btText(\"Tisch in der Tausend Cantina reservieren\",\"Reserve a table at Tausend Cantina\"));\n    reserve.tabIndex = -1;\n\n    let reserveIntroTimer = 0;\n    let reserveLabelTarget = \"\";\n    let reserveLabelToken = 0;\n    let reserveAnimations = [];\n    let reserveLayer = null;\n    let reserveIntroStarted = false;\n    let reserveIntroFinished = false;\n    let reserveAboutActive = false;\n\n    function stopReserveAnimations() {\n      reserveAnimations.forEach(animation => {\n        try { animation.cancel(); } catch (_) {}\n      });\n      reserveAnimations = [];\n    }\n\n    function makeReserveLayer(text) {\n      const layer = element(\"span\", \"btcg2-label btcg2-reserve-layer\", \"\");\n      layer.dataset.text = text;\n      const fragment = document.createDocumentFragment();\n      Array.from(text).forEach(function (letter) {\n        const char = element(\"span\", \"btcg2-char\", letter === \" \" ? \"\u00a0\" : letter);\n        fragment.appendChild(char);\n      });\n      layer.appendChild(fragment);\n      return layer;\n    }\n\n    \/* V3: one cancellable text\/width transition for every context. *\/\n    function reserveWidthFor(text) {\n      reserveMeasure.textContent = text;\n      const style = getComputedStyle(reserve);\n      const edges = [\"paddingLeft\", \"paddingRight\", \"borderLeftWidth\", \"borderRightWidth\"]\n        .reduce((sum, key) => sum + (parseFloat(style[key]) || 0), 0);\n      return Math.max(76, Math.ceil(reserveMeasure.getBoundingClientRect().width + edges));\n    }\n\n    function setReserveWidth(text, immediate) {\n      reserve.classList.toggle(\"btcg2-no-width-motion\", !!immediate || reduced.matches);\n      reserve.style.width = reserveWidthFor(text) + \"px\";\n      requestAnimationFrame(() => reserve.classList.remove(\"btcg2-no-width-motion\"));\n    }\n\n    function setReserveLabel(text, immediate, intro) {\n      if (!text || (reserveLabelTarget === text && reserveLayer)) return;\n      reserveLabelTarget = text;\n      const token = ++reserveLabelToken;\n      stopReserveAnimations();\n\n      \/* Interrupted transitions must never leave an old word behind. *\/\n      const oldLayer = reserveLayer;\n      reserve.querySelectorAll(\".btcg2-reserve-layer\").forEach(layer => {\n        if (layer !== oldLayer) layer.remove();\n      });\n      const newLayer = makeReserveLayer(text);\n      newLayer.setAttribute(\"aria-hidden\", \"true\");\n      reserve.appendChild(newLayer);\n      reserveLayer = newLayer;\n      const instant = !!immediate || reduced.matches || !oldLayer || !reserve.animate;\n      setReserveWidth(text, instant);\n      if (instant) {\n        if (oldLayer) oldLayer.remove();\n        return;\n      }\n\n      \/* Fade out first; then reveal the new word while the capsule settles. *\/\n      const outgoing = oldLayer.animate([\n        {opacity:1, filter:\"blur(0)\"},\n        {opacity:0, filter:\"blur(2px)\"}\n      ], {duration:420, easing:\"cubic-bezier(.4,0,.2,1)\", fill:\"forwards\"});\n      reserveAnimations.push(outgoing);\n      const newChars = Array.from(newLayer.children);\n      newChars.forEach((char, index) => {\n        reserveAnimations.push(char.animate([\n          {opacity:0, transform:\"translateY(4px)\", filter:\"blur(2px)\"},\n          {opacity:1, transform:\"translateY(0)\", filter:\"blur(0)\"}\n        ], {duration:680, delay:220 + index * Math.min(12, 120 \/ newChars.length),\n            easing:\"cubic-bezier(.22,1,.36,1)\", fill:\"both\"}));\n      });\n      window.setTimeout(() => {\n        if (token !== reserveLabelToken) return;\n        if (oldLayer.isConnected) oldLayer.remove();\n        stopReserveAnimations();\n      }, 1250);\n    }\n\n    if (document.fonts) document.fonts.ready.then(() => {\n      if (reserveLabelTarget && reserve.isConnected) setReserveWidth(reserveLabelTarget, true);\n    });\n    window.addEventListener(\"resize\", () => {\n      if (reserveLabelTarget) setReserveWidth(reserveLabelTarget, true);\n    }, {passive:true});\n\n    if (originalReserve) dock.appendChild(reserve);\n    reserve.addEventListener(\"click\", event => {\n      event.stopPropagation();\n      if (originalReserve && originalReserve.isConnected) originalReserve.click();\n    });\n    dock.addEventListener(\"keydown\", event => {\n      if (event.key === \"Enter\" || event.key === \" \") event.stopPropagation();\n    });\n    \/\/ Das urspr\u00fcngliche Salhino-Mosaik: ganze, halbe und doppelte Fl\u00e4chen.\n    \/\/ F\u00fcr f\u00fcnf Bilder werden zwei kleine Fl\u00e4chen zu einem Hochformat verbunden.\n    \/\/ Keine freie Aufteilung oder Suche nach zuf\u00e4lligen Seitenverh\u00e4ltnissen.\n    const salhinoDesktop = {\n      1:[\"A A A A A A\"],\n      2:[\"A A B B B B\"],\n      3:[\"A A A A B B\",\"C C C C B B\"],\n      4:[\"A A B B B B\",\"A A C C D D\"],\n      5:[\"A A B B B B\",\"A A C C D D\",\"E E E E D D\"],\n      6:[\"A A B B B B\",\"C C D D E E\",\"F F F F E E\"]\n    };\n    const salhinoTablet = {\n      1:[\"A A A A\"],\n      2:[\"A A B B\"],\n      3:[\"A A B B\",\"A A C C\"],\n      4:[\"A A B B\",\"A A C C\",\"D D D D\"],\n      5:[\"A A B B\",\"A A C C\",\"D E E E\"],\n      6:[\"A A B B\",\"A A C C\",\"D D C C\",\"E F F F\"]\n    };\n    const salhinoSelections=new Map();\n    function makeMosaic(count, width, height) {\n      const tablet=document.documentElement.clientWidth<=1100;\n      const key=(tablet?\"tablet\":\"desktop\")+\":\"+count;\n      if(salhinoSelections.has(key)) return salhinoSelections.get(key);\n      const basic=(tablet ? salhinoTablet : salhinoDesktop)[count];\n      const patterns=[basic];\n      if(count===5) patterns.push(\n        [\"A A B B\",\"A A C D\",\"E E C D\"],\n        [\"A A B B\",\"C D E E\",\"C D E E\"],\n        [\"A B B C\",\"A D D C\",\"A E E E\"]\n      );\n      const variants=[],seen=new Set();\n      patterns.forEach(pattern=>{\n        for(let v=0;v<4;v++) {\n          let rows=pattern.map(row=>row.split(\" \"));\n          if(v&1) rows=rows.map(row=>row.slice().reverse());\n          if(v&2) rows.reverse();\n          const boxes=new Map();\n          rows.forEach((row,y)=>row.forEach((name,x)=>{\n            if(!boxes.has(name)) boxes.set(name,{left:x,right:x+1,top:y,bottom:y+1});\n            const r=boxes.get(name);\n            r.left=Math.min(r.left,x);r.right=Math.max(r.right,x+1);\n            r.top=Math.min(r.top,y);r.bottom=Math.max(r.bottom,y+1);\n          }));\n          const rects=Array.from(boxes.values()).map(r=>({x:r.left\/rows[0].length,y:r.top\/rows.length,w:(r.right-r.left)\/rows[0].length,h:(r.bottom-r.top)\/rows.length}));\n          rects.sort((a,b)=>a.y-b.y || a.x-b.x);\n          const signature=JSON.stringify(rects);\n          if(!seen.has(signature)) { seen.add(signature);variants.push({rects,signature}); }\n        }\n      });\n      \/\/ Mehrere Aufteilungen gleichberechtigt zulassen; nur echte Text-\/Dock-Kollisionen ausschlie\u00dfen.\n      const storageKey=\"btcg2-layout-v44:\"+location.pathname+\":\"+key;\n      let previous=\"\";\n      try { previous=sessionStorage.getItem(storageKey)||\"\"; } catch (_) {}\n      const dockSafe=variants.filter(v=>v.rects.some(r=>r.x+r.w>.99999 && r.y+r.h>.99999 && r.w*width>=Math.min(560,width-180)));\n      const available=dockSafe.length ? dockSafe : variants;\n      const candidates=available.filter(v=>v.signature!==previous);\n      const pool=candidates.length ? candidates : available;\n      const chosen=pool[Math.floor(Math.random()*pool.length)];\n      try { sessionStorage.setItem(storageKey,chosen.signature); } catch (_) {}\n      salhinoSelections.set(key,chosen.rects);\n      return chosen.rects;\n    }\n    const status = element(\"p\", \"btcg-sr\", btText(\"Auswahl 1 von \",\"Selection 1 of \") + pageCount);\n    status.id = \"btcg-page-status\";\n    status.setAttribute(\"role\", \"status\");\n    status.setAttribute(\"aria-live\", \"polite\");\n    status.setAttribute(\"aria-atomic\", \"true\");\n    view.appendChild(status);\n    const stage = element(\"div\", \"btcg-pages\");\n    stage.id = \"btcg-pages\";\n    view.appendChild(stage);\n    const phoneQuery = window.matchMedia(\"(max-width:700px)\");\n    const rail = element(\"div\", \"btcg-mobile-rail\");\n    rail.id = \"btcg-mobile-rail\";\n    rail.setAttribute(\"role\", \"list\");\n    rail.setAttribute(\"aria-label\", btText(\"Cantina-Gerichte: nach links oder rechts wischen\",\"Cantina dishes: swipe left or right\"));\n    view.appendChild(rail);\n    const counter = element(\"p\", \"btcg-mobile-count\");\n    counter.setAttribute(\"aria-hidden\", \"true\");\n    view.appendChild(counter);\n    const pages = [], blocks = [];\n    let phoneMode = null, mobileIndex = 0, navigationEpoch = 0;\n    let active = null, currentPage = 0, busy = false, dockInset = 24, queuedDirection = 0;\n\n    function setOpen(state, open) {\n      if (!state.button || (busy || fullscreen) && open) return;\n      if (open && active && active !== state) setOpen(active, false);\n      state.open = open;\n      if (!open) state.pinned = false;\n      state.card.classList.toggle(\"is-open\", open);\n\n      state.details.setAttribute(\"aria-hidden\", String(!open));\n      state.button.setAttribute(\"aria-describedby\", open ? state.details.id : \"btcg-help\");\n      if (open) active = state;\n      else if (active === state) active = null;\n    }\n\n    function refreshPageNumber() {\n      pageNumber.style.display = \"\";\n      pageCurrent.textContent=String(phoneMode ? mobileIndex+1 : pageCount === 1 ? layoutIndex+1 : currentPage+1);\n      pageTotal.textContent=String(phoneMode ? sourceCount : layoutCount);\n    }\n    function installEdgeNavigation(host,callback) {\n      const arrow=element(\"span\",\"btcg-cursor-arrow\");\n      arrow.setAttribute(\"aria-hidden\",\"true\");\n      arrowIcon(arrow,1);\n      arrow.firstChild.setAttribute(\"viewBox\",\"0 0 32 24\");\n      arrow.querySelector(\"path\").setAttribute(\"d\",\"M3 12h26M23 6l6 6-6 6\");\n      host.appendChild(arrow);\n      let direction=0,press=null,dragged=false;\n      const fine=window.matchMedia(\"(hover:hover) and (pointer:fine)\");\n      function clear() {\n        direction=0;\n        host.classList.remove(\"btcg-at-edge\");\n        const cursor=document.getElementById(\"bt-theme-cursor\");\n        if(cursor) cursor.classList.remove(\"btcg-edge-hidden\");\n      }\n      function locate(event) {\n        if(!fine.matches || event.pointerType && event.pointerType!==\"mouse\") return 0;\n        if(event.target.closest(\".btcg-fs-close, .btcg-fs-copy, a, input, textarea, select\")) return 0;\n        const rect=host.getBoundingClientRect(),x=event.clientX-rect.left;\n        const zone=Math.min(95,rect.width*.12);\n        return x>=0 && x<zone ? -1 : x<=rect.width && x>rect.width-zone ? 1 : 0;\n      }\n      function move(event) {\n        if(press && Math.hypot(event.clientX-press.x,event.clientY-press.y)>9) dragged=true;\n        const next=locate(event);\n        if(!next) { clear();return; }\n        const rect=host.getBoundingClientRect();\n        arrow.style.left=(event.clientX-rect.left)+\"px\";\n        arrow.style.top=(event.clientY-rect.top)+\"px\";\n        arrow.firstChild.style.transform=next<0?\"rotate(180deg)\":\"none\";\n        direction=next;\n        host.classList.add(\"btcg-at-edge\");\n        const cursor=document.getElementById(\"bt-theme-cursor\");\n        if(cursor) cursor.classList.add(\"btcg-edge-hidden\");\n      }\n      function down(event) { press={x:event.clientX,y:event.clientY};dragged=false; }\n      function click(event) {\n        const next=locate(event);\n        if(!next || event.detail===0 || dragged || String(window.getSelection()).trim()) return;\n        event.preventDefault();event.stopImmediatePropagation();\n        callback(event,next);\n      }\n      host.addEventListener(\"pointermove\",move,{passive:true});\n      host.addEventListener(\"pointerdown\",down,{passive:true});\n      host.addEventListener(\"pointerleave\",clear);\n      host.addEventListener(\"pointercancel\",clear);\n      host.addEventListener(\"click\",click,true);\n      return function cleanup() {\n        clear();arrow.remove();\n        host.removeEventListener(\"pointermove\",move);\n        host.removeEventListener(\"pointerdown\",down);\n        host.removeEventListener(\"pointerleave\",clear);\n        host.removeEventListener(\"pointercancel\",clear);\n        host.removeEventListener(\"click\",click,true);\n      };\n    }\n    const photoURL=item=>item.src;\n    let fullscreen = null;\n    function openFullscreen(state) {\n      if (fullscreen || busy) return;\n      const origin = state.card.getBoundingClientRect();\n      const dialog = element(\"dialog\", \"\");\n      dialog.id = \"btcg-fullscreen\";\n      const titleNode=state.card.querySelector(\".btcg-name\");\n      dialog.style.setProperty(\"--btcg-fs-title-size\",titleNode ? getComputedStyle(titleNode).fontSize : \"26px\");\n      dialog.setAttribute(\"aria-label\", (state.item.name || \"Cantina\") + \" \u2013 Vollbild\");\n      const panel = element(\"div\", \"btcg-fs-panel\");\n      let image = element(\"img\", \"btcg-fs-image\");\n      \/\/ Vergr\u00f6\u00dferung nutzt die Originaldatei aus dem Divi-Bildlink.\n      const photoSequence=(phoneMode ? mobileStates : pages[currentPage].states).slice();\n      let shown=state, switching=false, imageGeneration=0;\n      let pendingPhoto=null;\n      let pendingCopy=null;\n      const photoAnimations=[];\n      const originalPhoto=new Image();\n      originalPhoto.decoding=\"async\";\n      image.src = state.img.currentSrc || state.img.src;\n      image.alt = state.img.alt;\n      image.style.objectPosition = \"50% 50%\";\n      const imageStyle = getComputedStyle(state.img);\n      const initialFilter = imageStyle.filter, initialTransform = imageStyle.transform;\n      panel.appendChild(image);\n      panel.appendChild(element(\"div\", \"btcg-fs-shade\"));\n      let copy = element(\"div\", \"btcg-fs-copy\");\n      copy.id=\"btcg-fullscreen-copy\";\n      copy.setAttribute(\"aria-live\",\"polite\");\n\n      function fillFullscreenCopy(node,item) {\n        node.replaceChildren(element(\"h2\",\"\",item.name||\"Cantina\"));\n        if(item.description) node.appendChild(element(\"p\",\"\",item.description));\n        if(item.price) node.appendChild(element(\"p\",\"\",item.price));\n      }\n\n      fillFullscreenCopy(copy,state.item);\n      panel.appendChild(copy);\n\n      \/* \u00d6ffnungs-Textflug wird erst nach showModal() vermessen\/gestartet.\n         Die Variablen stehen schon hier, damit Bildwechsel und Schlie\u00dfen\n         einen noch laufenden Flug sauber \u00fcbernehmen k\u00f6nnen. *\/\n      let openingCopy=null;\n      let openingTextAnimation=null;\n      let openingTextParts=[];\n\n      let openingHandoffFrame=0;\n      function handoffOpeningText() {\n        if(openingHandoffFrame) {\n          cancelAnimationFrame(openingHandoffFrame);\n          openingHandoffFrame=0;\n        }\n\n        \/* Der echte Textblock wird zuerst exakt in seinen finalen Zustand\n           gesetzt. Erst danach verschwindet der fliegende Klon. Da beide\n           dieselbe gemessene Position besitzen, gibt es keinen sichtbaren\n           Zwischenframe und keinen 12px-Nachsprung mehr. *\/\n        copy.classList.add(\"btcg-fs-handoff\");\n        dialog.classList.add(\"is-ready\");\n\n        if(openingCopy) { openingCopy.remove(); openingCopy=null; }\n\n        openingHandoffFrame=requestAnimationFrame(()=>{\n          openingHandoffFrame=requestAnimationFrame(()=>{\n            openingHandoffFrame=0;\n            if(fullscreen===session && !session.closing) {\n              copy.classList.remove(\"btcg-fs-handoff\");\n            }\n          });\n        });\n      }\n\n      function settleOpeningText() {\n        if(openingTextAnimation) {\n          try { openingTextAnimation.cancel(); } catch (_) {}\n          openingTextAnimation=null;\n        }\n        openingTextParts.forEach(animation=>{\n          try { animation.cancel(); } catch (_) {}\n        });\n        openingTextParts=[];\n        if(fullscreen && !fullscreen.closing) handoffOpeningText();\n        else if(openingCopy) { openingCopy.remove(); openingCopy=null; }\n      }\n      const close = element(\"button\", \"btcg-fs-close\");\n      close.type = \"button\";\n      close.setAttribute(\"aria-label\", btText(\"Vollbild schlie\u00dfen\",\"Close full screen\"));\n      close.autofocus = true;\n      panel.appendChild(close);\n      dialog.appendChild(panel);\n      const photoStatus=element(\"span\",\"btcg-sr\");\n      photoStatus.setAttribute(\"role\",\"status\");\n      Object.assign(photoStatus.style,{position:\"absolute\",width:\"1px\",height:\"1px\",overflow:\"hidden\",clipPath:\"inset(50%)\"});\n      dialog.appendChild(photoStatus);\n      const removeCursorNavigation=photoSequence.length>1 ? installEdgeNavigation(dialog,switchPhoto) : ()=>{};\n      async function switchPhoto(event,direction) {\n        if(switching || session.closing) return;\n        \/* Nur einen tats\u00e4chlich noch laufenden \u00d6ffnungs-Textflug beenden.\n           Ein bereits stabiler Vollbild-Text darf beim normalen Bildwechsel\n           nicht erneut durch den Handoff-Modus geschickt werden. *\/\n        if(openingCopy || openingTextAnimation || openingTextParts.length) settleOpeningText();\n        switching=true;\n        const run=++imageGeneration;\n\n        const index=photoSequence.indexOf(shown);\n        const target=photoSequence[(Math.max(0,index)+direction+photoSequence.length)%photoSequence.length];\n        const fresh=element(\"img\",\"btcg-fs-image\");\n        fresh.alt=target.item.alt;\n        fresh.decoding=\"async\";\n        fresh.style.objectPosition=\"50% 50%\";\n        fresh.style.setProperty(\"cursor\",themeCursor?\"none\":\"var(--btcg-native-cursor, default)\",\"important\");\n        const loaded=await new Promise(resolve=>{\n          const timer=setTimeout(()=>{fresh.onload=fresh.onerror=null;resolve(false);},8000);\n          fresh.onload=()=>{clearTimeout(timer);resolve(true);};\n          fresh.onerror=()=>{clearTimeout(timer);resolve(false);};\n          fresh.src=photoURL(target.item);\n        });\n        if(session.closing || run!==imageGeneration) return;\n        if(!loaded) {\n          photoStatus.textContent=btText(\"Bild konnte nicht geladen werden. Bitte erneut versuchen.\",\"The image could not be loaded. Please try again.\");\n          switching=false;\n\n          return;\n        }\n        try { await fresh.decode(); } catch (_) {}\n        if(session.closing || run!==imageGeneration) return;\n        if(session.bitmapAnimation) session.bitmapAnimation.cancel();\n        naturalImageBox();\n        const old=image;\n        \/\/ Alte Aufnahme bleibt darunter; nur die neue wird weich dar\u00fcbergelegt.\n        old.after(fresh);\n        pendingPhoto=fresh;\n        const ms=reduced.matches?0:850;\n        morph(bounds(panel.getBoundingClientRect()),full(fresh),ms);\n        const fade=fresh.animate(\n          [{opacity:0},{opacity:1}],\n          {duration:ms,easing:\"ease-in-out\"}\n        );\n\n        \/* -------------------------------------------------------\n           V5.9 \u00b7 ECHTER ZWEI-LAYER-TEXT-CROSSFADE\n\n           Wichtig: Der sichtbare alte Text wird NICHT mehr per\n           replaceChildren() im selben DOM-Element ausgetauscht.\n           Stattdessen bleibt er vollst\u00e4ndig stehen. Der neue Block\n           wird als eigenes, zun\u00e4chst unsichtbares Element aufgebaut\n           und beide Ebenen \u00fcberblenden sich anschlie\u00dfend wirklich.\n           Dadurch gibt es keinen einzelnen harten Text-Frame mehr.\n        ------------------------------------------------------- *\/\n        \/* V5.12 \u00b7 Vor dem Crossfade jeden eventuell noch ausstehenden\n           \u00d6ffnungs-Handoff beenden. Wichtig: hier NICHT erneut\n           settleOpeningText() aufrufen, weil dessen !important-Handoff\n           sonst f\u00fcr einen Paint-Frame gegen die Fade-Animation arbeiten kann. *\/\n        if(openingHandoffFrame) {\n          cancelAnimationFrame(openingHandoffFrame);\n          openingHandoffFrame=0;\n        }\n        copy.classList.remove(\"btcg-fs-handoff\");\n        dialog.classList.add(\"is-ready\");\n\n        photoAnimations.forEach(animation=>{\n          try { animation.cancel(); } catch (_) {}\n        });\n        photoAnimations.length=0;\n\n        const outgoingCopy=copy;\n        const incomingCopy=element(\"div\",\"btcg-fs-copy\");\n        incomingCopy.setAttribute(\"aria-hidden\",\"true\");\n        fillFullscreenCopy(incomingCopy,target.item);\n\n        \/* Vor dem Einh\u00e4ngen bereits unsichtbar setzen. So kann der\n           Browser den neuen Text niemals einen Frame lang voll zeigen. *\/\n        incomingCopy.style.opacity=\"0\";\n        incomingCopy.style.transform=\"none\";\n        incomingCopy.style.filter=\"none\";\n        incomingCopy.style.transition=\"none\";\n        panel.appendChild(incomingCopy);\n        pendingCopy=incomingCopy;\n\n        \/* Layout jetzt festschreiben, erst danach Animation starten. *\/\n        void incomingCopy.offsetWidth;\n\n        const textMs=reduced.matches?0:1050;\n        const textOut=outgoingCopy.animate([\n          {opacity:1},\n          {opacity:.88,offset:.34},\n          {opacity:.48,offset:.68},\n          {opacity:0}\n        ],{\n          duration:textMs,\n          easing:\"linear\",\n          fill:\"forwards\"\n        });\n\n        const textIn=incomingCopy.animate([\n          {opacity:0},\n          {opacity:.10,offset:.18},\n          {opacity:.46,offset:.52},\n          {opacity:.82,offset:.80},\n          {opacity:1}\n        ],{\n          duration:textMs,\n          easing:\"linear\",\n          fill:\"forwards\"\n        });\n\n        photoAnimations.push(fade,textOut,textIn);\n        dialog.setAttribute(\"aria-label\",(target.item.name||\"Cantina\")+\" \u2013 Vollbild\");\n\n        await Promise.all([\n          fade.finished.catch(()=>{}),\n          textOut.finished.catch(()=>{}),\n          textIn.finished.catch(()=>{})\n        ]);\n\n        if(session.closing || run!==imageGeneration) {\n          incomingCopy.remove();\n          if(pendingCopy===incomingCopy) pendingCopy=null;\n          return;\n        }\n\n        \/* V5.12 \u00b7 PAINT-STABILE \u00dcBERGABE\n\n           Die fertigen WAAPI-Werte werden zuerst in echte Inline-Werte\n           \u00fcbernommen. Danach wird der alte Block entfernt und der neue\n           offiziell. Die Animationen werden erst NACH einem vollst\u00e4ndigen\n           Paint-Zyklus gel\u00f6st. So existiert kein Frame, in dem CSS kurz\n           wieder opacity:0\/1 oder den Startzustand einsetzen kann. *\/\n        try { if(typeof textIn.commitStyles===\"function\") textIn.commitStyles(); } catch (_) {}\n        try { if(typeof textOut.commitStyles===\"function\") textOut.commitStyles(); } catch (_) {}\n\n        incomingCopy.style.opacity=\"1\";\n        incomingCopy.style.transform=\"none\";\n        incomingCopy.style.filter=\"none\";\n        outgoingCopy.style.opacity=\"0\";\n\n        outgoingCopy.remove();\n        incomingCopy.removeAttribute(\"aria-hidden\");\n        incomingCopy.id=\"btcg-fullscreen-copy\";\n        incomingCopy.setAttribute(\"aria-live\",\"polite\");\n        copy=incomingCopy;\n        pendingCopy=null;\n\n        await new Promise(resolve=>requestAnimationFrame(()=>requestAnimationFrame(resolve)));\n        if(session.closing || run!==imageGeneration) return;\n\n        try { textIn.cancel(); } catch (_) {}\n        try { textOut.cancel(); } catch (_) {}\n        incomingCopy.style.removeProperty(\"transition\");\n        incomingCopy.style.opacity=\"1\";\n\n        old.remove();image=fresh;shown=target;\n        pendingPhoto=null;\n        photoAnimations.length=0;\n        switching=false;\n\n      }\n      const root = document.documentElement;\n      const body = document.body;\n      const oldOverflow = root.style.overflow, oldPadding = root.style.paddingRight;\n      const oldRootOverscroll = root.style.overscrollBehavior;\n      const oldBodyOverflow = body.style.overflow;\n      const oldBodyOverscroll = body.style.overscrollBehavior;\n\n      \/* Ausgangsposition der Seite nur f\u00fcr die \u00d6ffnung merken.\n         Wenn die Gallery nicht sauber am sichtbaren oberen Rand sitzt,\n         darf sie w\u00e4hrend der Gro\u00dfbild-Animation programmgesteuert dorthin gleiten. *\/\n      const openingScrollX = window.scrollX;\n      const openingScrollY = window.scrollY;\n      const visualTop = window.visualViewport ? window.visualViewport.offsetTop : 0;\n      const galleryRectAtOpen = view.getBoundingClientRect();\n      const galleryTargetY = Math.max(0, openingScrollY + galleryRectAtOpen.top - visualTop);\n      const alignGalleryOnOpen = Math.abs(galleryRectAtOpen.top - visualTop) > 1.5;\n\n      const scrollbar = Math.max(0, innerWidth-root.clientWidth);\n      const pad = parseFloat(getComputedStyle(root).paddingRight) || 0;\n      \/* Vollbild: die eigentliche Seite darf weder per Wheel\/Touchpad noch per Touch weiterlaufen. *\/\n      root.style.overflow = \"hidden\";\n      root.style.overscrollBehavior = \"none\";\n      body.style.overflow = \"hidden\";\n      body.style.overscrollBehavior = \"none\";\n      if (scrollbar) root.style.paddingRight = (pad+scrollbar)+\"px\";\n      const themeCursor=document.body.classList.contains(\"bt-theme-cursor-active\") &&\n        window.matchMedia(\"(hover:hover) and (pointer:fine)\").matches\n        ? document.getElementById(\"bt-theme-cursor\") : null;\n      const cursorParent=themeCursor && themeCursor.parentNode;\n      const cursorNext=themeCursor && themeCursor.nextSibling;\n      \/\/ Schutz gegen globale cursor:none-Regeln, wenn kein Custom Cursor aktiv ist.\n      const cursorValue=themeCursor ? \"none\" : \"var(--btcg-native-cursor, default)\";\n      dialog.style.setProperty(\"cursor\",cursorValue,\"important\");\n      dialog.querySelectorAll(\"*\").forEach(node=>node.style.setProperty(\"cursor\",cursorValue,\"important\"));\n      if(themeCursor) {\n        dialog.classList.add(\"btcg-has-theme-cursor\");\n        dialog.appendChild(themeCursor);\n      }\n      document.body.appendChild(dialog);\n      const session = {\n        dialog, state, closing:false, animation:null, imageAnimation:null,\n        backgroundScrollFrame:0, backgroundScrollTime:0\n      };\n      fullscreen = session;\n      const bounds = r => ({left:r.left+\"px\",top:r.top+\"px\",width:r.width+\"px\",height:r.height+\"px\"});\n      \/\/ Originalfoto vollst\u00e4ndig: die zuerst erreichte Bildschirmkante begrenzt die Gr\u00f6\u00dfe.\n      \/\/ Hochformat nutzt die H\u00f6he, breites Querformat die Breite; niemals beschneiden.\n      const full = (photo=image) => {\n        const iw=photo.naturalWidth || state.img.naturalWidth || 1;\n        const ih=photo.naturalHeight || state.img.naturalHeight || 1;\n        const scale=Math.min(dialog.clientWidth\/iw,dialog.clientHeight\/ih);\n        const width=iw*scale,height=ih*scale;\n        return {left:(dialog.clientWidth-width)\/2+\"px\",top:(dialog.clientHeight-height)\/2+\"px\",width:width+\"px\",height:height+\"px\"};\n      };\n      Object.assign(panel.style,bounds(origin));\n      dialog.showModal();\n\n      \/* ---------------------------------------------------------\n         V5.6 \u00b7 TEXTBLOCK \u00d6FFNET GEMEINSAM MIT DEM BILD\n\n         Wir vermessen die sp\u00e4tere Textposition einmal unsichtbar in\n         der finalen Panelgr\u00f6\u00dfe. Danach f\u00e4hrt ein visueller Klon von\n         der echten Kachelposition dorthin. Der normale Vollbildtext\n         \u00fcbernimmt erst am Ziel im selben Frame.\n      --------------------------------------------------------- *\/\n      const sourceContent=state.card.querySelector(\".btcg-content\");\n      const sourceContentRect=sourceContent && sourceContent.getClientRects().length\n        ? sourceContent.getBoundingClientRect()\n        : (titleNode ? titleNode.getBoundingClientRect() : origin);\n\n      const duration = reduced.matches ? 0 : 1150;\n      const destination=full();\n\n      \/* Zielposition synchron ausmessen, noch bevor der Browser\n         den n\u00e4chsten Frame zeichnet. *\/\n      const originBounds=bounds(origin);\n      Object.assign(panel.style,destination);\n\n      \/* Wichtig: .btcg-fs-copy startet regul\u00e4r mit translateY(12px).\n         F\u00fcr die Flug-Zielmessung muss dieser Startversatz aus sein, sonst\n         landet der Klon 12px zu tief und springt bei der \u00dcbergabe nach oben. *\/\n      copy.classList.add(\"btcg-fs-measure\");\n      const finalChildren=Array.from(copy.children).filter(node=>node.getClientRects().length);\n      let finalTextRect=null;\n      if(finalChildren.length) {\n        const rects=finalChildren.map(node=>node.getBoundingClientRect());\n        const left=Math.min(...rects.map(r=>r.left));\n        const top=Math.min(...rects.map(r=>r.top));\n        const right=Math.max(...rects.map(r=>r.right));\n        const bottom=Math.max(...rects.map(r=>r.bottom));\n        finalTextRect={left,top,right,bottom,width:right-left,height:bottom-top};\n      }\n      copy.classList.remove(\"btcg-fs-measure\");\n      Object.assign(panel.style,originBounds);\n\n      if(finalTextRect && sourceContentRect.width>0 && sourceContentRect.height>0) {\n        openingCopy=element(\"div\",\"btcg-fs-flight-copy\");\n        openingCopy.setAttribute(\"aria-hidden\",\"true\");\n        Array.from(copy.children).forEach(child=>openingCopy.appendChild(child.cloneNode(true)));\n        Object.assign(openingCopy.style,{\n          left:finalTextRect.left+\"px\",\n          top:finalTextRect.top+\"px\",\n          width:finalTextRect.width+\"px\",\n          opacity:\"1\"\n        });\n        dialog.appendChild(openingCopy);\n\n        const sourceTitleStyle=titleNode ? getComputedStyle(titleNode) : null;\n        const finalTitle=copy.querySelector(\"h2\");\n        const finalTitleStyle=finalTitle ? getComputedStyle(finalTitle) : null;\n        const sourceFont=parseFloat(sourceTitleStyle && sourceTitleStyle.fontSize) || 26;\n        const targetFont=parseFloat(finalTitleStyle && finalTitleStyle.fontSize) || sourceFont;\n        const widthScale=Math.min(1,Math.max(.72,sourceContentRect.width\/Math.max(1,finalTextRect.width)));\n        const fontScale=Math.min(1,Math.max(.72,sourceFont\/Math.max(1,targetFont)));\n        const startScale=Math.min(widthScale,fontScale);\n\n        const dx=sourceContentRect.left-finalTextRect.left;\n        const dy=sourceContentRect.bottom-finalTextRect.bottom;\n\n        openingTextAnimation=openingCopy.animate([\n          {\n            opacity:1,\n            transform:`translate3d(${dx}px,${dy}px,0) scale(${startScale})`,\n            filter:\"blur(0)\"\n          },\n          {\n            opacity:1,\n            transform:\"translate3d(0,0,0) scale(1)\",\n            filter:\"blur(0)\"\n          }\n        ],{\n          duration,\n          easing:\"cubic-bezier(.22,1,.36,1)\",\n          fill:\"forwards\"\n        });\n\n        \/* Beschreibung\/Preis erscheinen innerhalb desselben Fluges\n           etwas weicher, falls sie in der Kachel noch eingeklappt waren. *\/\n        const sourceDetailsVisible=!!state.open;\n        Array.from(openingCopy.querySelectorAll(\"p\")).forEach((paragraph,index)=>{\n          const part=paragraph.animate([\n            {opacity:sourceDetailsVisible?1:0,transform:\"translateY(6px)\"},\n            {opacity:1,transform:\"translateY(0)\"}\n          ],{\n            duration:reduced.matches?0:760,\n            delay:reduced.matches?0:180+index*55,\n            easing:\"cubic-bezier(.22,1,.36,1)\",\n            fill:\"both\"\n          });\n          openingTextParts.push(part);\n        });\n      }\n\n      \/* ---------------------------------------------------------\n         BACKGROUND-GLIDE\n         Liegt die 100dvh-Gallery beim Klick nicht exakt am oberen\n         sichtbaren Fensterrand, gleitet nur die Seite dahinter weich\n         dorthin. Das Dialogbild baut sich gleichzeitig auf.\n\n         overflow:hidden bleibt bewusst aktiv: Wheel, Touchpad und Touch\n         k\u00f6nnen die Seite nicht selbst verschieben; window.scrollTo darf\n         den Hintergrund trotzdem programmgesteuert bewegen.\n      --------------------------------------------------------- *\/\n      function alignGalleryBackground() {\n        if (!alignGalleryOnOpen) return;\n\n        if (reduced.matches) {\n          window.scrollTo({left:openingScrollX, top:galleryTargetY, behavior:\"instant\"});\n          return;\n        }\n\n        const fromY = window.scrollY;\n        const distance = galleryTargetY - fromY;\n        if (Math.abs(distance) < 1) return;\n\n        const glideDuration = 950;\n        const started = performance.now();\n\n        function step(now) {\n          if (fullscreen !== session || session.closing) {\n            session.backgroundScrollFrame = 0;\n            return;\n          }\n\n          const p = Math.min(1, (now - started) \/ glideDuration);\n          \/* Weicher cubic ease-in-out, ohne Scroll-Snap oder Browser-Smooth. *\/\n          const eased = p < .5\n            ? 4 * p * p * p\n            : 1 - Math.pow(-2 * p + 2, 3) \/ 2;\n\n          window.scrollTo({\n            left:openingScrollX,\n            top:fromY + distance * eased,\n            behavior:\"instant\"\n          });\n\n          if (p < 1) {\n            session.backgroundScrollFrame = requestAnimationFrame(step);\n          } else {\n            session.backgroundScrollFrame = 0;\n            \/* Pixelgenau auf Gallery-Oberkante beenden. *\/\n            window.scrollTo({left:openingScrollX, top:galleryTargetY, behavior:\"instant\"});\n          }\n        }\n\n        session.backgroundScrollFrame = requestAnimationFrame(step);\n      }\n\n      alignGalleryBackground();\n      close.focus({preventScroll:true});\n      function morph(from,to,ms) {\n        if (session.animation) session.animation.cancel();\n        Object.assign(panel.style,to);\n        session.animation = panel.animate([from,to],{duration:ms,easing:\"cubic-bezier(.22,1,.36,1)\",fill:\"none\"});\n        return session.animation.finished.catch(()=>{});\n      }\n      function bitmap(photo,box,cover,position=\"50% 50%\",zoom=1) {\n        const iw=photo.naturalWidth||state.img.naturalWidth||1,ih=photo.naturalHeight||state.img.naturalHeight||1;\n        const scale=(cover?Math.max:Math.min)(box.width\/iw,box.height\/ih);\n        const w=iw*scale,h=ih*scale;\n        const pos=position.trim().split(\" \").filter(Boolean).map(n=>parseFloat(n)\/100);\n        return {left:((box.width-w)*(pos[0]||0)-(w*(zoom-1))\/2)+\"px\",\n          top:((box.height-h)*(pos[1]||0)-(h*(zoom-1))\/2)+\"px\",width:w*zoom+\"px\",height:h*zoom+\"px\"};\n      }\n      function pixelBox(rect) { return {width:parseFloat(rect.width),height:parseFloat(rect.height)}; }\n      function zoomOf(img) {\n        const transform=getComputedStyle(img).transform;\n        return transform===\"none\"?1:Math.abs(new DOMMatrixReadOnly(transform).a);\n      }\n      function animateBitmap(from,to,ms) {\n        if(session.bitmapAnimation) session.bitmapAnimation.cancel();\n        Object.assign(image.style,{inset:\"auto\",objectFit:\"fill\",transform:\"none\"},to);\n        session.bitmapAnimation=image.animate([from,to],{duration:ms,easing:\"cubic-bezier(.22,1,.36,1)\",fill:\"none\"});\n        return session.bitmapAnimation.finished.catch(()=>{});\n      }\n      function naturalImageBox() {\n        [\"inset\",\"left\",\"top\",\"width\",\"height\",\"object-fit\",\"transform\"].forEach(prop=>image.style.removeProperty(prop));\n      }\n      session.imageAnimation=image.animate([{filter:initialFilter},{filter:\"brightness(1)\"}],{duration,easing:\"ease\"});\n      const bitmapOpening=animateBitmap(bitmap(state.img,origin,true,state.item.position,zoomOf(state.img)),bitmap(state.img,pixelBox(destination),false),duration);\n      const opening=morph(bounds(origin),destination,duration);\n      bitmapOpening.then(()=>{if(fullscreen===session && !session.closing && !switching) naturalImageBox();});\n\n      const openingTextPromise=openingTextAnimation\n        ? openingTextAnimation.finished.catch(()=>{})\n        : Promise.resolve();\n\n      Promise.all([opening,openingTextPromise]).then(()=>{\n        if(fullscreen!==session || session.closing) return;\n        openingTextAnimation=null;\n        openingTextParts.forEach(animation=>{ try { animation.cancel(); } catch (_) {} });\n        openingTextParts=[];\n        handoffOpeningText();\n      });\n      function resize() {\n        if(session.closing) return;\n        if(session.bitmapAnimation) session.bitmapAnimation.cancel();\n        naturalImageBox();\n        const current=bounds(panel.getBoundingClientRect());\n        morph(current,full(),reduced.matches?0:450);\n      }\n      window.addEventListener(\"resize\",resize);\n      originalPhoto.addEventListener(\"load\",async()=>{\n        try { await originalPhoto.decode(); } catch (_) {}\n        if(fullscreen!==session || session.closing || imageGeneration>0) return;\n        image.src=originalPhoto.src;\n        const target=full(originalPhoto);\n        if(Math.abs(parseFloat(panel.style.width)-parseFloat(target.width))>.5 || Math.abs(parseFloat(panel.style.height)-parseFloat(target.height))>.5) {\n          morph(bounds(panel.getBoundingClientRect()),target,reduced.matches?0:650);\n        }\n      },{once:true});\n      originalPhoto.src=photoURL(state.item);\n\n      \/* ---------------------------------------------------------\n         V5.13 \u00b7 BEDIENELEMENTE NACH VOLLBILD WEICH ZUR\u00dcCKBLENDEN\n\n         Der native <dialog>-Top-Layer verdeckt Dock und Audio-EQ bis\n         dialog.close(). Ohne eigene \u00dcbergabe w\u00e4ren sie danach sofort\n         wieder voll sichtbar. Deshalb startet direkt im selben JS-Task\n         nach dem Schlie\u00dfen eine reine Opacity-Animation \u2013 noch vor dem\n         n\u00e4chsten Paint. Position, Gr\u00f6\u00dfe, Pink, Blur und Playerzustand\n         bleiben vollst\u00e4ndig unangetastet.\n      --------------------------------------------------------- *\/\n      function softenControlsAfterFullscreen() {\n        if(reduced.matches) return;\n\n        const nodes=[\n          dock,\n          document.querySelector(\".ssn-mp3-toggle\"),\n          document.getElementById(\"bt-mini-eq-control\")\n        ];\n        const seen=new Set();\n\n        nodes.forEach(node=>{\n          if(!node || !node.isConnected || seen.has(node)) return;\n          seen.add(node);\n\n          const rect=node.getBoundingClientRect();\n          const style=getComputedStyle(node);\n          if(rect.width<1 || rect.height<1 || style.display===\"none\" || style.visibility===\"hidden\") return;\n\n          const parsed=parseFloat(style.opacity);\n          const targetOpacity=Number.isFinite(parsed) ? Math.max(0,Math.min(1,parsed)) : 1;\n          if(targetOpacity<=.02) return;\n\n          const animation=node.animate([\n            {opacity:0,offset:0},\n            {opacity:0,offset:.10},\n            {opacity:targetOpacity,offset:1}\n          ],{\n            duration:720,\n            easing:\"cubic-bezier(.22,1,.36,1)\",\n            fill:\"none\"\n          });\n\n          animation.finished.catch(()=>{});\n        });\n      }\n\n      async function finish() {\n        if(session.closing) return;\n\n        \/* Falls sehr schnell geschlossen wird, den noch laufenden\n           \u00d6ffnungs-Textflug zuerst sauber an den Vollbildtext \u00fcbergeben. *\/\n        settleOpeningText();\n        if(openingHandoffFrame) {\n          cancelAnimationFrame(openingHandoffFrame);\n          openingHandoffFrame=0;\n        }\n        copy.classList.remove(\"btcg-fs-handoff\");\n        session.closing=true;\n        if(session.backgroundScrollFrame) {\n          cancelAnimationFrame(session.backgroundScrollFrame);\n          session.backgroundScrollFrame=0;\n        }\n        removeCursorNavigation();\n        imageGeneration++;\n        photoAnimations.forEach(animation=>animation.cancel());\n        if(pendingPhoto) { pendingPhoto.remove();pendingPhoto=null; }\n        if(pendingCopy) { pendingCopy.remove();pendingCopy=null; }\n\n        const returnState=shown;\n        if(phoneMode) {\n          mobileIndex=mobileStates.indexOf(returnState);\n          rail.scrollTo({left:mobileIndex*rail.clientWidth,behavior:\"instant\"});\n          refreshMobile(false);\n        }\n\n        \/* ---------------------------------------------------------\n           V5.5 \u00b7 GERDICHTNAME ZUR\u00dcCK IN DIE KACHEL\n\n           Vor dem Ausblenden des Vollbild-Textblocks wird die aktuell\n           sichtbare Headline vermessen. Ein visueller Klon bleibt im\n           Dialog-Layer und f\u00e4hrt sp\u00e4ter exakt zur echten .btcg-name-\n           Position der Zielkachel. Der echte Titel wird daf\u00fcr kurz\n           verborgen und \u00fcbernimmt erst am Ende \u2013 dadurch entsteht\n           kein Verschwinden + Neuaufbauen mehr.\n        --------------------------------------------------------- *\/\n        const sourceTitle=copy.querySelector(\"h2\");\n        const targetTitle=returnState.card.querySelector(\".btcg-name\");\n        let returnTitle=null;\n        let returnTitleStart=null;\n        let returnTitleTarget=null;\n        let returnTitleAnimation=null;\n        let targetTitleOldOpacity=\"\";\n        let targetTitleOldTransition=\"\";\n\n        if(sourceTitle && targetTitle &&\n           sourceTitle.getClientRects().length &&\n           targetTitle.getClientRects().length) {\n\n          const sourceRect=sourceTitle.getBoundingClientRect();\n          const targetRect=targetTitle.getBoundingClientRect();\n          const sourceTitleStyle=getComputedStyle(sourceTitle);\n          const targetTitleStyle=getComputedStyle(targetTitle);\n\n          returnTitle=element(\n            \"div\",\n            \"btcg-fs-return-title\",\n            returnState.item.name || \"Cantina\"\n          );\n          returnTitle.setAttribute(\"aria-hidden\",\"true\");\n\n          Object.assign(returnTitle.style,{\n            left:sourceRect.left+\"px\",\n            top:sourceRect.top+\"px\",\n            width:sourceRect.width+\"px\",\n            fontSize:sourceTitleStyle.fontSize,\n            lineHeight:sourceTitleStyle.lineHeight,\n            letterSpacing:sourceTitleStyle.letterSpacing,\n            fontFamily:sourceTitleStyle.fontFamily,\n            fontWeight:sourceTitleStyle.fontWeight,\n            fontStyle:sourceTitleStyle.fontStyle,\n            fontStretch:sourceTitleStyle.fontStretch,\n            fontKerning:sourceTitleStyle.fontKerning,\n            fontFeatureSettings:sourceTitleStyle.fontFeatureSettings,\n            fontVariationSettings:sourceTitleStyle.fontVariationSettings,\n            textShadow:sourceTitleStyle.textShadow,\n            opacity:\"1\"\n          });\n\n          dialog.appendChild(returnTitle);\n\n          returnTitleStart={\n            left:sourceRect.left+\"px\",\n            top:sourceRect.top+\"px\",\n            width:sourceRect.width+\"px\",\n            fontSize:sourceTitleStyle.fontSize,\n            lineHeight:sourceTitleStyle.lineHeight,\n            letterSpacing:sourceTitleStyle.letterSpacing,\n            textShadow:sourceTitleStyle.textShadow,\n            opacity:1\n          };\n\n          returnTitleTarget={\n            left:targetRect.left+\"px\",\n            top:targetRect.top+\"px\",\n            width:targetRect.width+\"px\",\n            fontSize:targetTitleStyle.fontSize,\n            lineHeight:targetTitleStyle.lineHeight,\n            letterSpacing:targetTitleStyle.letterSpacing,\n            textShadow:targetTitleStyle.textShadow,\n            opacity:1\n          };\n\n          \/* Der Vollbildtitel selbst verschwindet nicht sichtbar:\n             sein Klon liegt ab jetzt exakt deckungsgleich dar\u00fcber. *\/\n          sourceTitle.style.opacity=\"0\";\n\n          targetTitleOldOpacity=targetTitle.style.getPropertyValue(\"opacity\");\n          targetTitleOldTransition=targetTitle.style.getPropertyValue(\"transition\");\n          targetTitle.style.setProperty(\"transition\",\"none\",\"important\");\n          targetTitle.style.setProperty(\"opacity\",\"0\",\"important\");\n        }\n\n        \/* ---------------------------------------------------------\n           V5.11 \u00b7 BESCHREIBUNG + PREIS SAUBER AUSBLENDEN\n\n           W\u00fcrden die beiden Texte im normalen .btcg-fs-copy bleiben,\n           w\u00fcrden sie w\u00e4hrend der Panel-R\u00fcckfahrt mit dessen kleiner\n           werdender Breite neu umbrechen. Genau das wirkte beim Schlie\u00dfen\n           wie ein unsauberer Sprung. Deshalb bleibt f\u00fcr den kurzen Fade\n           ein pixelgleicher Overlay-Klon an der aktuellen Bildschirmposition.\n           Der unsichtbare h2 bleibt im Klon nur als Platzhalter erhalten.\n        --------------------------------------------------------- *\/\n        let returnDetails=null;\n        let returnDetailsAnimation=null;\n        const detailNodes=Array.from(copy.querySelectorAll(\"p\"));\n\n        if(detailNodes.length && copy.getClientRects().length) {\n          const copyRect=copy.getBoundingClientRect();\n          const copyStyle=getComputedStyle(copy);\n\n          returnDetails=copy.cloneNode(true);\n          returnDetails.removeAttribute(\"id\");\n          returnDetails.removeAttribute(\"aria-live\");\n          returnDetails.setAttribute(\"aria-hidden\",\"true\");\n          returnDetails.className=\"btcg-fs-return-details\";\n\n          Object.assign(returnDetails.style,{\n            left:copyRect.left+\"px\",\n            top:copyRect.top+\"px\",\n            width:copyRect.width+\"px\",\n            height:copyRect.height+\"px\",\n            paddingTop:copyStyle.paddingTop,\n            paddingRight:copyStyle.paddingRight,\n            paddingBottom:copyStyle.paddingBottom,\n            paddingLeft:copyStyle.paddingLeft,\n            boxSizing:copyStyle.boxSizing\n          });\n\n          const placeholderTitle=returnDetails.querySelector(\"h2\");\n          if(placeholderTitle) placeholderTitle.style.visibility=\"hidden\";\n          dialog.appendChild(returnDetails);\n\n          \/* Das echte Vollbild-Copy ist ab jetzt komplett verdeckt bzw.\n             unsichtbar; so kann das schrumpfende Panel keinen Text-Reflow\n             mehr sichtbar machen. *\/\n          copy.style.setProperty(\"opacity\",\"0\",\"important\");\n          copy.style.setProperty(\"transition\",\"none\",\"important\");\n          copy.style.setProperty(\"transform\",\"none\",\"important\");\n\n          returnDetailsAnimation=returnDetails.animate(\n            [\n              {opacity:1,filter:\"blur(0px)\"},\n              {opacity:.72,offset:.42,filter:\"blur(.35px)\"},\n              {opacity:0,filter:\"blur(1.5px)\"}\n            ],\n            {\n              duration:reduced.matches?0:430,\n              easing:\"cubic-bezier(.4,0,.2,1)\",\n              fill:\"forwards\"\n            }\n          );\n        }\n\n        dialog.classList.add(\"is-closing\");\n        dialog.classList.remove(\"is-ready\");\n        window.removeEventListener(\"resize\",resize);\n\n        const currentRect=panel.getBoundingClientRect();\n        const current=bounds(currentRect);\n        const imageRect=image.getBoundingClientRect();\n        const startBitmap=image.style.objectFit===\"fill\"\n          ? {left:(imageRect.left-currentRect.left)+\"px\",top:(imageRect.top-currentRect.top)+\"px\",width:imageRect.width+\"px\",height:imageRect.height+\"px\"}\n          : bitmap(image,currentRect,false);\n\n        \/* Wichtig: Ziel erst JETZT messen. Falls der Hintergrund beim \u00d6ffnen\n           nach oben geglitten ist, f\u00e4hrt das Bild in die verschobene, aktuell\n           sichtbare Kachel zur\u00fcck \u2013 nicht in die alte Klickposition. *\/\n        const target=returnState.card.getBoundingClientRect();\n        const targetStyle=getComputedStyle(returnState.img);\n        if(session.imageAnimation) session.imageAnimation.cancel();\n        const ms=reduced.matches?0:950;\n\n        session.imageAnimation=image.animate(\n          [{filter:getComputedStyle(image).filter},{filter:targetStyle.filter}],\n          {duration:ms,easing:\"ease\",fill:\"forwards\"}\n        );\n\n        const closingBitmap=animateBitmap(\n          startBitmap,\n          bitmap(image,target,true,returnState.item.position,zoomOf(returnState.img)),\n          ms\n        );\n\n        \/* Headline bekommt dieselbe Dauer + dieselbe Ease wie die Bild-\/Panel-\n           R\u00fcckfahrt. Vor dem Start wird das Ziel noch einmal frisch vermessen,\n           falls sich durch Mobile-Rail\/Fokus im selben Frame etwas verschoben hat. *\/\n        let titlePromise=Promise.resolve();\n        if(returnTitle && returnTitleStart && targetTitle) {\n          const freshTargetRect=targetTitle.getBoundingClientRect();\n          const freshTargetStyle=getComputedStyle(targetTitle);\n\n          returnTitleTarget={\n            left:freshTargetRect.left+\"px\",\n            top:freshTargetRect.top+\"px\",\n            width:freshTargetRect.width+\"px\",\n            fontSize:freshTargetStyle.fontSize,\n            lineHeight:freshTargetStyle.lineHeight,\n            letterSpacing:freshTargetStyle.letterSpacing,\n            textShadow:freshTargetStyle.textShadow,\n            opacity:1\n          };\n\n          returnTitleAnimation=returnTitle.animate(\n            [returnTitleStart,returnTitleTarget],\n            {\n              duration:ms,\n              easing:\"cubic-bezier(.22,1,.36,1)\",\n              fill:\"forwards\"\n            }\n          );\n          titlePromise=returnTitleAnimation.finished.catch(()=>{});\n        }\n\n        await Promise.all([\n          morph(current,bounds(target),ms),\n          closingBitmap,\n          titlePromise\n        ]);\n\n        \/* V5.10: Den fliegenden Titel vor der \u00dcbergabe noch einmal exakt\n           auf die aktuell berechnete Zieltypografie festnageln. Besonders\n           Letter-Spacing beeinflusst die sichtbare Wortbreite minimal; ohne\n           diese \u00dcbergabe wirkte der echte Kacheltitel nach der Landung wie\n           eine winzige Gr\u00f6\u00dfenkorrektur. *\/\n        if(returnTitle && targetTitle) {\n          const exactTargetStyle=getComputedStyle(targetTitle);\n          returnTitle.style.fontSize=exactTargetStyle.fontSize;\n          returnTitle.style.lineHeight=exactTargetStyle.lineHeight;\n          returnTitle.style.letterSpacing=exactTargetStyle.letterSpacing;\n          returnTitle.style.fontFamily=exactTargetStyle.fontFamily;\n          returnTitle.style.fontWeight=exactTargetStyle.fontWeight;\n          returnTitle.style.fontStyle=exactTargetStyle.fontStyle;\n          returnTitle.style.fontStretch=exactTargetStyle.fontStretch;\n          returnTitle.style.fontKerning=exactTargetStyle.fontKerning;\n          returnTitle.style.fontFeatureSettings=exactTargetStyle.fontFeatureSettings;\n          returnTitle.style.fontVariationSettings=exactTargetStyle.fontVariationSettings;\n          returnTitle.style.textShadow=exactTargetStyle.textShadow;\n        }\n\n        \/* Am Ziel \u00fcbernimmt der echte Kacheltitel im selben Frame.\n           Der fliegende Klon kann danach unsichtbar entfernt werden. *\/\n        if(targetTitle) {\n          if(targetTitleOldTransition) {\n            targetTitle.style.setProperty(\"transition\",targetTitleOldTransition);\n          } else {\n            targetTitle.style.removeProperty(\"transition\");\n          }\n\n          if(targetTitleOldOpacity) {\n            targetTitle.style.setProperty(\"opacity\",targetTitleOldOpacity);\n          } else {\n            targetTitle.style.removeProperty(\"opacity\");\n          }\n        }\n        if(returnTitle) returnTitle.remove();\n        if(returnDetailsAnimation) {\n          try { returnDetailsAnimation.cancel(); } catch (_) {}\n        }\n        if(returnDetails) returnDetails.remove();\n\n        \/\/ Den echten Cursor vor dem Entfernen des Dialogs an seinen Platz zur\u00fccksetzen.\n        if(themeCursor) {\n          const parent=cursorParent && cursorParent.isConnected ? cursorParent : document.body;\n          parent.insertBefore(themeCursor,cursorNext && cursorNext.parentNode===parent ? cursorNext : null);\n        }\n\n        \/* Die Seite kann sich beim \u00d6ffnen zur Gallery-Oberkante verschoben haben.\n           Diese NEUE Position ist jetzt die g\u00fcltige Seitenposition. Sie wird vor\n           dem Entsperren gespeichert, damit das Entfernen des Dialogs keinen\n           Sprung zur alten Klickposition erzeugt. *\/\n        const settledScrollX = window.scrollX;\n        const settledScrollY = window.scrollY;\n\n        dialog.close();\n        dialog.remove();\n        root.style.overflow=oldOverflow;\n        root.style.paddingRight=oldPadding;\n        root.style.overscrollBehavior=oldRootOverscroll;\n        body.style.overflow=oldBodyOverflow;\n        body.style.overscrollBehavior=oldBodyOverscroll;\n        \/\/ Neue Gallery-Position halten; niemals auf openingScrollY zur\u00fcckspringen.\n        window.scrollTo({left:settledScrollX,top:settledScrollY,behavior:\"instant\"});\n        state.hover=false;\n        setOpen(state,false);\n        returnState.button.focus({preventScroll:true});\n        fullscreen=null;\n        updateButton();\n        softenControlsAfterFullscreen();\n      }\n      close.addEventListener(\"click\",event=>{event.stopPropagation();finish();});\n      let press=null, dragged=false;\n      dialog.addEventListener(\"pointerdown\",event=>{ press={x:event.clientX,y:event.clientY}; dragged=false; });\n      dialog.addEventListener(\"pointermove\",event=>{\n        if(press && Math.hypot(event.clientX-press.x,event.clientY-press.y)>9) dragged=true;\n      });\n      dialog.addEventListener(\"pointercancel\",()=>{dragged=true;press=null;});\n      dialog.addEventListener(\"click\",event=>{\n        if(dragged || String(window.getSelection()).trim()) return;\n        event.stopPropagation();\n\n        \/* Klick innerhalb des Bild-Panels = n\u00e4chstes Foto.\n           Die vorhandene linke\/rechte Randnavigation bleibt unver\u00e4ndert.\n           Nur der schwarze Bereich au\u00dferhalb des Bildes schlie\u00dft. *\/\n        if(panel.contains(event.target)) {\n          if(photoSequence.length>1) switchPhoto(event,1);\n          return;\n        }\n        finish();\n      });\n      dialog.addEventListener(\"cancel\",event=>{event.preventDefault();finish();});\n      dialog.addEventListener(\"keydown\",event=>{\n        event.stopPropagation();\n        if((event.key===\"ArrowLeft\" || event.key===\"ArrowRight\") && photoSequence.length>1) {\n          event.preventDefault();switchPhoto(event,event.key===\"ArrowLeft\"?-1:1);\n        }\n      });\n\n      let fullscreenWheelX = 0, fullscreenWheelTimer = 0;\n      dialog.addEventListener(\"wheel\", event => {\n        const ax = Math.abs(event.deltaX), ay = Math.abs(event.deltaY);\n\n        \/* Vertikale Bewegung bleibt nur im Textblock erlaubt.\n           An dessen Anfang\/Ende wird nicht in die Seite dahinter weitergescrollt. *\/\n        if (ax < 4 || ax <= ay * 1.15) {\n          const textScroll = event.target.closest && event.target.closest(\".btcg-fs-copy\");\n          if (textScroll && ay > 0) {\n            const canUp = event.deltaY < 0 && textScroll.scrollTop > 0;\n            const canDown = event.deltaY > 0 && textScroll.scrollTop + textScroll.clientHeight < textScroll.scrollHeight - 1;\n            if (canUp || canDown) return;\n          }\n          event.preventDefault();\n          event.stopPropagation();\n          return;\n        }\n\n        if (photoSequence.length < 2 || switching || session.closing) {\n          event.preventDefault();\n          event.stopPropagation();\n          return;\n        }\n        event.preventDefault();\n        event.stopPropagation();\n        fullscreenWheelX += event.deltaX;\n        clearTimeout(fullscreenWheelTimer);\n        fullscreenWheelTimer = window.setTimeout(() => { fullscreenWheelX = 0; }, 180);\n        if (Math.abs(fullscreenWheelX) < 48) return;\n        const direction = fullscreenWheelX > 0 ? 1 : -1;\n        fullscreenWheelX = 0;\n        switchPhoto(event, direction);\n      }, { passive:false });\n    }\n\n    function installGalleryAnchor() {\n      let frame=0, token=0;\n      const root=document.documentElement;\n      let previousBehavior=null;\n      function stop() {\n        token++;\n        if(frame) cancelAnimationFrame(frame);\n        frame=0;\n        if(previousBehavior!==null) { root.style.scrollBehavior=previousBehavior; previousBehavior=null; }\n      }\n      function navigate(animate) {\n        stop();\n        const run=token, from=window.scrollY;\n        const duration=animate && !reduced.matches ? 1100 : 0;\n        const start=performance.now();\n        previousBehavior=root.style.scrollBehavior;\n        root.style.scrollBehavior=\"auto\";\n        function step(now) {\n          if(run!==token) return;\n          const progress=duration ? Math.min(1,(now-start)\/duration) : 1;\n          const ease=progress<.5 ? 4*progress*progress*progress : 1-Math.pow(-2*progress+2,3)\/2;\n          const target=view.getBoundingClientRect().top+window.scrollY;\n          window.scrollTo({top:from+(target-from)*ease,behavior:\"instant\"});\n          if(progress<1) frame=requestAnimationFrame(step);\n          else { stop(); view.focus({preventScroll:true}); }\n        }\n        frame=requestAnimationFrame(step);\n      }\n      view.tabIndex=-1;\n      window.addEventListener(\"click\",event=>{\n        const link=event.target.closest && event.target.closest(\"a[href]\");\n        if(!link || event.button!==0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || link.target===\"_blank\") return;\n        let url;\n        try { url=new URL(link.href,location.href); } catch (_) { return; }\n        if(url.origin!==location.origin || url.pathname!==location.pathname || url.hash!==\"#\"+VIEW_ID) return;\n        event.preventDefault();\n        event.stopImmediatePropagation();\n        try { history.pushState(null,\"\",url.hash); } catch (_) {}\n        navigate(true);\n      },true);\n      [\"wheel\",\"touchstart\",\"pointerdown\"].forEach(type=>window.addEventListener(type,stop,{passive:true}));\n      window.addEventListener(\"keydown\",event=>{if([\"Escape\",\"PageUp\",\"PageDown\",\"ArrowUp\",\"ArrowDown\",\"Home\",\"End\",\" \"].includes(event.key)) stop();});\n      \/\/ Direkte Galerie-URLs erst nach den vorhandenen Theme-Initialisierungen ausrichten.\n      if(location.hash===\"#\"+VIEW_ID) {\n        const initialToken=token;\n        const settle=()=>setTimeout(()=>{if(token===initialToken) navigate(false);},2600);\n        if(document.readyState===\"complete\") settle();\n        else window.addEventListener(\"load\",settle,{once:true});\n      }\n    }\n\n    function activateImage(state) {\n      if (state.requested) return;\n      state.requested = true;\n      const img = state.img, item = state.item;\n      const widths = Array.from(item.srcset.matchAll(\/ ([0-9]+)w(?: *,| *$)\/g), m => Number(m[1]));\n      if (widths.some(width => width >= 1024)) img.srcset = item.srcset;\n      img.src = item.src;\n    }\n\n    for (let p = 0; p < pageCount; p++) {\n      const list = element(\"div\", \"btcg-page\" + (p === 0 ? \" is-current\" : \"\"));\n      list.setAttribute(\"role\", \"list\");\n      list.setAttribute(\"aria-label\", btText(\"Auswahl \",\"Selection \") + (p + 1));\n      list.setAttribute(\"aria-hidden\", String(p !== 0));\n      list.inert = p !== 0;\n      stage.appendChild(list);\n      const page = { node: list, states: [] };\n      pages.push(page);\n      for (let slot = 0; slot < slotCount; slot++) {\n        \/\/ Bei ungerader Gesamtzahl f\u00fcllt ein Foto aus dem Anfang die letzte Fl\u00e4che.\n        const item = items[(p * slotCount + slot) % items.length];\n        const local = slot % 6, blockIndex = Math.floor(slot \/ 6);\n        if (local === 0) {\n          const count = Math.min(6, slotCount - slot);\n          const node = element(\"div\", \"btcg-block\");\n          node.setAttribute(\"role\", \"presentation\");\n          list.appendChild(node);\n          blocks.push({ node, count, blockIndex, states: [] });\n        }\n        const group = blocks[blocks.length - 1];\n        const letter = String.fromCharCode(65 + local), id = p + \"-\" + slot;\n        const card = element(\"article\", \"btcg-card\");\n        card.setAttribute(\"role\", \"listitem\");\n        card.style.setProperty(\"--btcg-area\", letter);\n        card.style.setProperty(\"--btcg-position\", item.position);\n        card.style.setProperty(\"--btcg-mobile-ratio\", [\"4 \/ 5\", \"5 \/ 4\", \"1 \/ 1\", \"3 \/ 4\"][slot % 4]);\n        const img = element(\"img\", \"btcg-image\");\n        img.alt = item.alt;\n        img.decoding = \"async\";\n        img.loading = \"lazy\";\n        img.sizes = \"100vw\";\n        const state = { card, img, item, letter, slot, requested: false, button: null, details: null, open: false, pinned: false, hover: false };\n        img.addEventListener(\"error\", function () {\n          if (!img.dataset.fallback && item.fallback && item.fallback !== item.src) {\n            img.dataset.fallback = \"true\";\n            img.removeAttribute(\"srcset\");\n            img.src = item.fallback;\n          } else card.classList.add(\"is-image-error\");\n        });\n        card.appendChild(img);\n        const hasDetails = !!(item.description || item.price);\n        if (true) {\n          card.appendChild(element(\"span\", \"btcg-shade\"));\n          const control = element(\"button\", \"btcg-toggle\");\n          const content = element(\"span\", \"btcg-content\");\n          const heading = element(\"span\", \"btcg-heading\");\n          const title = element(\"span\", \"btcg-name\", item.name || \"Cantina\");\n          title.id = \"btcg-title-\" + id;\n          heading.appendChild(title);\n          content.appendChild(heading);\n          control.appendChild(content);\n          card.appendChild(control);\n          state.control = control;\n          state.heading = heading;\n          {\n            control.type = \"button\";\n            control.tabIndex = p === 0 ? 0 : -1;\n\n            control.setAttribute(\"aria-haspopup\", \"dialog\");\n            control.setAttribute(\"aria-label\", (item.name || btText(\"Cantina-Bild\",\"Cantina image\")) + btText(\" \u2013 Vollbild \u00f6ffnen\",\" \u2013 Open full screen\"));\n\n            control.setAttribute(\"aria-describedby\", \"btcg-help\");\n            const mark = element(\"span\", \"btcg-mark\");\n            mark.setAttribute(\"aria-hidden\", \"true\");\n            heading.appendChild(mark);\n            const details = element(\"span\", \"btcg-details\");\n            details.id = \"btcg-details-\" + id;\n            details.setAttribute(\"aria-hidden\", \"true\");\n            const inner = element(\"span\", \"btcg-details-inner\");\n            if (item.description) inner.appendChild(element(\"span\", \"btcg-description\", item.description));\n            if (item.price) inner.appendChild(element(\"span\", \"btcg-price\", item.price));\n            details.appendChild(inner);\n            content.appendChild(details);\n            Object.assign(state, { button: control, details, inner });\n            card.addEventListener(\"pointerenter\", function (event) {\n              if (event.pointerType !== \"mouse\") return;\n              state.hover = true; setOpen(state, true);\n            });\n            card.addEventListener(\"pointerleave\", function (event) {\n              if (event.pointerType !== \"mouse\") return;\n              state.hover = false;\n              if (!state.pinned && !control.matches(\":focus-visible\")) setOpen(state, false);\n            });\n            control.addEventListener(\"focus\", function () {\n              if (control.matches(\":focus-visible\")) setOpen(state, true);\n            });\n            control.addEventListener(\"blur\", function () {\n              state.pinned = false;\n              if (!state.hover) setOpen(state, false);\n            });\n            control.addEventListener(\"click\", function (event) {\n              event.stopPropagation();\n              if (busy) return;\n              openFullscreen(state);\n            });\n          }\n        }\n        group.node.appendChild(card);\n        group.states.push(state);\n        page.states.push(state);\n        if (p === 0) activateImage(state);\n      }\n    }\n\n    const mobileStates = pages.flatMap(page => page.states).slice(0, sourceCount);\n    mobileStates.forEach(state => {\n      state.home = document.createComment(\"Galerieplatz\");\n      state.card.before(state.home);\n    });\n    let settleTimer = 0, railFrame = 0, railWidth = 0, suppressClickUntil = 0;\n    let touchStart = null;\n    function refreshMobile(announce) {\n      if (!phoneMode) return;\n      mobileStates.forEach((state, index) => {\n        const selected = index === mobileIndex;\n        state.card.inert = !selected;\n        state.card.setAttribute(\"aria-hidden\", String(!selected));\n        if (state.button) state.button.tabIndex = selected ? 0 : -1;\n      });\n      previous.setAttribute(\"aria-disabled\", String(mobileIndex === 0));\n      forward.setAttribute(\"aria-disabled\", String(mobileIndex === mobileStates.length - 1));\n      next.setAttribute(\"aria-disabled\", String(mobileIndex === mobileStates.length - 1));\n      refreshPageNumber();\n      counter.textContent = \"Nach links oder rechts wischen\";\n      if (announce) status.textContent = btText(\"Gericht \",\"Dish \") + (mobileIndex + 1) + btText(\" von \",\" of \") + mobileStates.length;\n    }\n    function scrollMobile(index) {\n      if (!phoneMode || index < 0 || index >= mobileStates.length) return;\n      if (active) setOpen(active, false);\n      mobileIndex = index;\n      rail.scrollTo({ left:index * rail.clientWidth, behavior:reduced.matches ? \"instant\" : \"smooth\" });\n      clearTimeout(settleTimer);\n      settleTimer = setTimeout(() => refreshMobile(true), reduced.matches ? 0 : 900);\n    }\n    rail.addEventListener(\"scroll\", () => {\n      if (!phoneMode) return;\n      if (active) setOpen(active, false);\n      clearTimeout(settleTimer);\n      settleTimer = setTimeout(() => {\n        mobileIndex = Math.max(0, Math.min(mobileStates.length - 1, Math.round(rail.scrollLeft \/ rail.clientWidth)));\n        refreshMobile(true);\n      }, 160);\n    }, { passive:true });\n    rail.addEventListener(\"touchstart\", event => {\n      touchStart = event.touches.length === 1 ? { x:event.touches[0].clientX, y:event.touches[0].clientY } : null;\n    }, { passive:true });\n    rail.addEventListener(\"touchmove\", event => {\n      if (!touchStart || event.touches.length !== 1) return;\n      const dx = Math.abs(event.touches[0].clientX - touchStart.x);\n      const dy = Math.abs(event.touches[0].clientY - touchStart.y);\n      if (dx > 12 && dx > dy) suppressClickUntil = performance.now() + 450;\n    }, { passive:true });\n    rail.addEventListener(\"click\", event => {\n      if (performance.now() < suppressClickUntil) { event.preventDefault(); event.stopImmediatePropagation(); }\n    }, true);\n    view.addEventListener(\"keydown\", event => {\n      if (event.key !== \"ArrowLeft\" && event.key !== \"ArrowRight\") return;\n      event.preventDefault(); event.stopPropagation();\n      const direction = event.key === \"ArrowRight\" ? 1 : -1;\n      if (phoneMode) {\n        const target = mobileIndex + direction;\n        if (target < 0 || target >= mobileStates.length) return;\n        \/\/ Fokus vor dem Inert-Schalten auf die immer erreichbare Men\u00fc-Steuerung legen.\n        next.focus({ preventScroll:true });\n        scrollMobile(target);\n        return;\n      }\n      showNext(event, direction);\n    });\n    function syncMode() {\n      const nextPhoneMode = phoneQuery.matches;\n      if (phoneMode === nextPhoneMode) return;\n      navigationEpoch++;\n      queuedDirection = 0;\n      clearTimeout(settleTimer);\n      if (active) setOpen(active, false);\n      busy = false;\n      view.setAttribute(\"aria-busy\", \"false\");\n      const focusedCard = pages.flatMap(page => page.states).find(state => state.card.contains(document.activeElement));\n      if (phoneMode === true) currentPage = Math.min(pages.length - 1, Math.floor(mobileIndex \/ slotCount));\n      else mobileIndex = Math.min(sourceCount - 1, currentPage * slotCount);\n      phoneMode = nextPhoneMode;\n      dock.classList.toggle(\"btcg2-phone\", phoneMode);\n      pages.forEach((page, index) => {\n        page.node.classList.remove(\"is-leaving\");\n        page.node.classList.toggle(\"is-current\", index === currentPage);\n        page.node.inert = phoneMode || index !== currentPage;\n        page.node.setAttribute(\"aria-hidden\", String(phoneMode || index !== currentPage));\n        page.states.forEach(state => {\n          state.card.inert = false;\n          state.card.removeAttribute(\"aria-hidden\");\n          if (state.button) state.button.tabIndex = !phoneMode && index === currentPage ? 0 : -1;\n        });\n      });\n      mobileStates.forEach(state => {\n        if (phoneMode) { rail.appendChild(state.card); activateImage(state); }\n        else state.home.after(state.card);\n      });\n      rail.inert = !phoneMode;\n      rail.setAttribute(\"aria-hidden\", String(!phoneMode));\n      pagingButtons.forEach(button => {\n        button.setAttribute(\"aria-controls\", phoneMode ? rail.id : stage.id);\n        button.setAttribute(\"aria-disabled\", \"false\");\n      });\n      previous.setAttribute(\"aria-label\", phoneMode ? btText(\"Vorheriges Gericht\",\"Previous dish\") : btText(\"Vorherige K\u00f6stlichkeiten\",\"Previous dishes\"));\n      forward.setAttribute(\"aria-label\", phoneMode ? btText(\"N\u00e4chstes Gericht\",\"Next dish\") : btText(\"N\u00e4chste K\u00f6stlichkeiten\",\"Next dishes\"));\n      next.setAttribute(\"aria-label\", phoneMode ? btText(\"Men\u00fc: n\u00e4chstes Gericht\",\"Menu: next dish\") : btText(\"Men\u00fc: n\u00e4chste K\u00f6stlichkeiten anzeigen\",\"Menu: show next dishes\"));\n      hint.textContent = phoneMode ? btText(\"Nach links oder rechts wischen oder Men\u00fc-Pfeile benutzen. Antippen \u00f6ffnet Details. Nach oben oder unten scrollen f\u00fchrt durch die Seite.\",\"Swipe left or right, or use the menu arrows. Tap to open details. Scroll up or down to move through the page.\") : btText(\"Bild mit Enter, Leertaste oder Antippen im Vollbild \u00f6ffnen. Im Vollbild zeigt ein Klick auf das Bild das n\u00e4chste Foto. Schwarzer Bereich, Minus oder Escape schlie\u00dfen. Men\u00fc zeigt die n\u00e4chste Auswahl in denselben Bildfl\u00e4chen.\",\"Press Enter or Space, or tap an image, to open full screen. Click the full-screen image for the next photo. Click the dark area or the minus button, or press Escape, to close. Menu shows the next selection in the same panels.\");\n      if (phoneMode) {\n        rail.scrollTo({ left:mobileIndex * rail.clientWidth, behavior:\"instant\" });\n        refreshMobile(false);\n      }\n      refreshPageNumber();\n      status.textContent = phoneMode ? btText(\"Gericht \",\"Dish \") + (mobileIndex + 1) + btText(\" von \",\" of \") + sourceCount : btText(\"Men\u00fcansicht \",\"Menu view \") + (pageCount === 1 ? layoutIndex + 1 : currentPage + 1) + btText(\" von \",\" of \") + layoutCount;\n      if (focusedCard) next.focus({ preventScroll:true });\n    }\n\n    function waitForImage(state) {\n      if (state.requested && state.img.complete && !state.img.naturalWidth) {\n        state.requested = false;\n        delete state.img.dataset.fallback;\n        state.img.removeAttribute(\"src\");\n        state.img.removeAttribute(\"srcset\");\n        state.card.classList.remove(\"is-image-error\");\n      }\n      activateImage(state);\n      state.img.loading = \"eager\";\n      if (state.img.complete && state.img.naturalWidth) return Promise.resolve(true);\n      return new Promise(resolve => {\n        let timer;\n        function done(ok) {\n          clearTimeout(timer);\n          state.img.removeEventListener(\"load\", loaded);\n          state.img.removeEventListener(\"error\", failed);\n          resolve(ok);\n        }\n        function loaded() { done(true); }\n        function failed() { if (state.card.classList.contains(\"is-image-error\")) done(false); }\n        state.img.addEventListener(\"load\", loaded);\n        state.img.addEventListener(\"error\", failed);\n        timer = setTimeout(() => done(state.img.complete && state.img.naturalWidth > 0), 6000);\n      });\n    }\n\n    async function showNext(event, direction) {\n      event.stopPropagation();\n      if (phoneMode) { scrollMobile(mobileIndex + direction); return; }\n      if (!phoneMode && pageCount === 1 && sourceCount > 1) {\n        if (busy) return;\n        const epoch = navigationEpoch, group = pages[0];\n        busy = true;\n        if (active) setOpen(active, false);\n        pagingButtons.forEach(button => button.setAttribute(\"aria-disabled\", \"true\"));\n        view.setAttribute(\"aria-busy\", \"true\");\n        let motion = null;\n        try {\n          if (!reduced.matches && group.node.animate) {\n            motion = group.node.animate([{opacity:1},{opacity:0}],{duration:180,easing:\"ease\",fill:\"forwards\"});\n            await motion.finished.catch(() => {});\n          }\n          if (!view.isConnected || epoch !== navigationEpoch) return;\n          layoutIndex = (layoutIndex + direction + layoutCount) % layoutCount;\n          group.states.forEach((state, index) => { state.slot = (index + layoutIndex * 2) % slotCount; });\n          refreshPageNumber();\n          layout();\n          if (motion) { motion.cancel(); motion = null; }\n          if (!reduced.matches && group.node.animate) {\n            motion = group.node.animate([{opacity:0},{opacity:1}],{duration:280,easing:\"ease\",fill:\"forwards\"});\n            await motion.finished.catch(() => {});\n          }\n          if (epoch === navigationEpoch) status.textContent = btText(\"Men\u00fcansicht \",\"Menu view \") + (layoutIndex + 1) + btText(\" von \",\" of \") + layoutCount;\n        } finally {\n          if (motion) motion.cancel();\n          if (epoch === navigationEpoch) {\n            busy = false;\n            view.setAttribute(\"aria-busy\", \"false\");\n            pagingButtons.forEach(button => button.setAttribute(\"aria-disabled\", \"false\"));\n            updateButton();\n          }\n        }\n        return;\n      }\n      if (busy) { queuedDirection = direction; return; }\n      if (pageCount < 2) return;\n      const epoch = navigationEpoch;\n      busy = true;\n      if (active) setOpen(active, false);\n      pagingButtons.forEach(button => button.setAttribute(\"aria-disabled\", \"true\"));\n      view.setAttribute(\"aria-busy\", \"true\");\n      status.textContent = btText(\"Die n\u00e4chste Men\u00fcauswahl wird geladen.\",\"Loading the next menu selection.\");\n      const target = (currentPage + direction + pageCount) % pageCount;\n      const ready = await Promise.all(pages[target].states.map(waitForImage));\n      if (!view.isConnected || epoch !== navigationEpoch) return;\n      \/\/ Bei Ladeproblemen bleibt die bisherige vollst\u00e4ndige Auswahl stehen.\n      if (ready.some(ok => !ok)) {\n        status.textContent = btText(\"Die n\u00e4chste Auswahl konnte noch nicht vollst\u00e4ndig geladen werden. Bitte erneut versuchen.\",\"The next selection could not be fully loaded. Please try again.\");\n      } else {\n        const old = pages[currentPage], fresh = pages[target];\n        old.node.inert = true;\n        old.node.setAttribute(\"aria-hidden\", \"true\");\n        old.states.forEach(s => { if (s.button) s.button.tabIndex = -1; });\n        \/\/ Zuf\u00e4llige Startreihenfolge, maximal 480ms Abstand zwischen erster\n        \/\/ und letzter Karte. Die alte Ansicht bleibt als l\u00fcckenloser Untergrund.\n        const order = shuffle(fresh.states.slice());\n        const spread = reduced.matches ? 0 : Math.min(480, Math.max(0, (order.length - 1) * 110));\n        order.forEach((state, rank) => {\n          const delay = order.length > 1 ? Math.round(rank * spread \/ (order.length - 1)) : 0;\n          state.card.style.setProperty(\"--btcg-card-delay\", delay + \"ms\");\n        });\n        \/\/ Auch bei schnellem Zur\u00fcckbl\u00e4ttern muss die verdeckte Ansicht bei 0 starten.\n        void fresh.node.offsetWidth;\n        old.node.classList.add(\"is-leaving\");\n        old.node.classList.remove(\"is-current\");\n        fresh.node.inert = true;\n        fresh.node.setAttribute(\"aria-hidden\", \"false\");\n        fresh.states.forEach(state => { if (state.button) state.button.tabIndex = -1; });\n        fresh.node.classList.add(\"is-current\");\n        currentPage = target;\n        refreshPageNumber();\n        await new Promise(resolve => setTimeout(resolve, reduced.matches ? 0 : 1030 + spread));\n        if (epoch !== navigationEpoch) return;\n        old.node.classList.remove(\"is-leaving\");\n        fresh.node.inert = false;\n        fresh.states.forEach(state => { if (state.button) state.button.tabIndex = 0; });\n        status.textContent = btText(\"Auswahl \",\"Selection \") + (target + 1) + btText(\" von \",\" of \") + pageCount + \". \" + slotCount + btText(\" Bildfl\u00e4chen. Die Anordnung bleibt gleich.\",\" image panels. The layout stays the same.\");\n      }\n      busy = false;\n      view.setAttribute(\"aria-busy\", \"false\");\n      pagingButtons.forEach(button => button.setAttribute(\"aria-disabled\", \"false\"));\n      updateButton();\n      if (queuedDirection && !phoneMode && !fullscreen) {\n        const pending = queuedDirection;\n        queuedDirection = 0;\n        showNext({ stopPropagation() {} }, pending);\n      }\n    }\n    if(layoutCount>1) installEdgeNavigation(view, function(event,direction){ if(!phoneMode && !fullscreen) showNext(event,direction); },stage.id);\n    next.addEventListener(\"click\", event => showNext(event, 1));\n    forward.addEventListener(\"click\", event => showNext(event, 1));\n    previous.addEventListener(\"click\", event => showNext(event, -1));\n\n    let galleryWheelX = 0, galleryWheelTimer = 0;\n    view.addEventListener(\"wheel\", event => {\n      if (phoneMode || fullscreen || busy || pageCount < 2) return;\n      const ax = Math.abs(event.deltaX), ay = Math.abs(event.deltaY);\n      if (ax < 4 || ax <= ay * 1.15) return;\n      event.preventDefault();\n      event.stopPropagation();\n      galleryWheelX += event.deltaX;\n      clearTimeout(galleryWheelTimer);\n      galleryWheelTimer = window.setTimeout(() => { galleryWheelX = 0; }, 180);\n      if (Math.abs(galleryWheelX) < 48) return;\n      const direction = galleryWheelX > 0 ? 1 : -1;\n      galleryWheelX = 0;\n      showNext(event, direction);\n    }, { passive:false });\n\n    function galleryAcceptsDirectionKeys() {\n      const rect = view.getBoundingClientRect();\n      const vh = window.visualViewport ? window.visualViewport.height : window.innerHeight;\n      return rect.height > 0 && rect.top < vh * .72 && rect.bottom > vh * .28;\n    }\n\n    document.addEventListener(\"keydown\", event => {\n      if (fullscreen || event.defaultPrevented || (event.key !== \"ArrowLeft\" && event.key !== \"ArrowRight\")) return;\n      const target = event.target;\n      if (target && target.closest && target.closest(\"input, textarea, select, [contenteditable='true']\")) return;\n      if (!galleryAcceptsDirectionKeys()) return;\n      event.preventDefault();\n      const direction = event.key === \"ArrowRight\" ? 1 : -1;\n      if (phoneMode) scrollMobile(mobileIndex + direction);\n      else showNext(event, direction);\n    });\n    view.addEventListener(\"keydown\", function (event) {\n      if (event.key === \"Enter\" || event.key === \" \") event.stopPropagation();\n    });\n    document.addEventListener(\"keydown\", function (event) {\n      if (event.key === \"Escape\" && active) setOpen(active, false);\n    });\n    document.addEventListener(\"pointerdown\", function (event) {\n      if (active && !view.contains(event.target)) setOpen(active, false);\n    }, { passive: true });\n\n    const row = source.closest(\".et_pb_row\");\n    let seamOffset = 0;\n    function closeSeam() {\n      if (!row) return;\n      const previous = row.previousElementSibling;\n      const oldGallery = previous && previous.querySelector(\"#bt-cantina-menu\");\n      if (oldGallery && oldGallery.getBoundingClientRect().height > 0) {\n        const edge = oldGallery.getBoundingClientRect().bottom;\n        const gap = row.getBoundingClientRect().top - edge + seamOffset;\n        seamOffset = gap > .5 && gap <= 80 ? gap : 0;\n        row.style.setProperty(\"margin-top\", -seamOffset + \"px\", \"important\");\n      }\n      \/\/ Nur den unteren Abschluss der eigenen letzten Galeriezeile korrigieren.\n      const section = row.parentElement;\n      if (section && section.classList.contains(\"et_pb_section\") && !row.nextElementSibling) {\n        const padding = parseFloat(getComputedStyle(section).paddingBottom) || 0;\n        if (padding <= 80) row.style.setProperty(\"margin-bottom\", -padding + \"px\", \"important\");\n      }\n    }\n\n    function layout() {\n      const width = view.getBoundingClientRect().width;\n      if (width < 1) return;\n      syncMode();\n      \/\/ Bestehende Kontakt-\/Footer-Positionierung beibehalten.\n      dock.style.removeProperty(\"bottom\");\n      dockInset = parseFloat(getComputedStyle(dock).bottom) || 24;\n      if (dockBottomValue !== null) dock.style.bottom = dockBottomValue.toFixed(2) + \"px\";\n      const height = view.getBoundingClientRect().height;\n      const geometry = phoneMode ? null : makeMosaic(slotCount, width, height);\n      \/\/ Measure the shared dock once before card style writes.\n      const dockWidth=phoneMode ? 0 : dock.getBoundingClientRect().width;\n      const dockRight=phoneMode ? 0 : (parseFloat(getComputedStyle(dock).right)||0);\n      blocks.forEach(group => {\n        group.states.forEach(state => {\n          if(phoneMode) { state.img.sizes=Math.ceil(width)+\"px\"; return; }\n          const r=geometry[state.slot];\n          const left=Math.round(r.x*width), top=Math.round(r.y*height);\n          const right=Math.round((r.x+r.w)*width), bottom=Math.round((r.y+r.h)*height);\n          Object.assign(state.card.style,{left:left+\"px\",top:top+\"px\",width:(right-left)+\"px\",height:(bottom-top)+\"px\"});\n          state.img.sizes=Math.ceil(phoneMode ? width : right-left)+\"px\";\n          const corner=r.x+r.w>.99999 && r.y+r.h>.99999;\n          state.card.classList.toggle(\"btcg-dock-corner\",corner);\n          const freeWidth=Math.max(130,right-left-dockWidth-dockRight-55);\n          state.card.style.setProperty(\"--btcg-label-width\",freeWidth+\"px\");\n        });\n      });\n      if (phoneMode && Math.abs(width - railWidth) > .5) {\n        railWidth = width;\n        if (railFrame) cancelAnimationFrame(railFrame);\n        railFrame = requestAnimationFrame(() => {\n          railFrame = 0;\n          rail.scrollTo({ left:mobileIndex * rail.clientWidth, behavior:\"instant\" });\n        });\n      }\n      closeSeam();\n      updateButton();\n    }\n\n    let dockBottomValue = null, dockTargetBottom = 0, dockFloorBottom = 0;\n    let dockMotionFrame = 0, dockMotionTime = 0;\n    function placeDock(target, floor) {\n      dockTargetBottom = target;\n      dockFloorBottom = floor;\n      if (reduced.matches || dockBottomValue === null) {\n        if (dockMotionFrame) cancelAnimationFrame(dockMotionFrame);\n        dockMotionFrame = 0;\n        dockBottomValue = target;\n        dock.style.bottom = target.toFixed(2) + \"px\";\n        return;\n      }\n      \/\/ Bei sehr schnellem Scrollen den Footer trotzdem niemals \u00fcberdecken.\n      dockBottomValue = Math.max(dockBottomValue, floor);\n      dock.style.bottom = dockBottomValue.toFixed(2) + \"px\";\n      if (dockMotionFrame || Math.abs(dockTargetBottom-dockBottomValue)<.1) return;\n      dockMotionTime = 0;\n      function glide(time) {\n        if (!dock.isConnected) { dockMotionFrame = 0; return; }\n        const dt = dockMotionTime ? Math.min(64, time - dockMotionTime) : 16;\n        dockMotionTime = time;\n        dockBottomValue += (dockTargetBottom - dockBottomValue) * (1 - Math.exp(-dt \/ 190));\n        dockBottomValue = Math.max(dockFloorBottom, dockBottomValue);\n        const settled = Math.abs(dockTargetBottom - dockBottomValue) < .1;\n        if (settled) dockBottomValue = dockTargetBottom;\n        dock.style.bottom = dockBottomValue.toFixed(2) + \"px\";\n        dockMotionFrame = settled ? 0 : requestAnimationFrame(glide);\n        if (settled) updateButton();\n      }\n      dockMotionFrame = requestAnimationFrame(glide);\n    }\n\n    function updateButton() {\n      if (!dock.children.length) return;\n      const vv = window.visualViewport;\n      const layoutHeight = document.documentElement.clientHeight;\n      const viewportTop = vv ? vv.offsetTop : 0;\n      const vh = vv ? vv.height : layoutHeight;\n      const viewportBottom = viewportTop + vh;\n      const entryLine = viewportTop + vh * .65;\n      const galleryRect = view.getBoundingClientRect();\n      const focused = document.activeElement;\n      const hasKeyboardFocus = node => node.contains(focused) && focused.matches(\":focus-visible\");\n      const hasEntered = (node, line) => {\n        if (!node || !node.getClientRects().length) return false;\n        const rect = node.getBoundingClientRect();\n        return rect.height > 0 && rect.top <= line;\n      };\n\n      \/\/ Ab \u00dcber uns durchgehend sichtbar, auch in Cantina und Chef.\n      \/\/ Beim Zur\u00fcckscrollen vor \u00dcber uns wieder weich ausblenden.\n      const aboutEntered = hasEntered(aboutSection || view, entryLine);\n      const musicRect = musicSection && musicSection.getBoundingClientRect();\n      const inMusic = !!(musicRect && musicRect.height > 0 && musicRect.top < viewportBottom && musicRect.bottom > viewportTop);\n      const showReserve = !!originalReserve && originalReserve.isConnected && window.btReserveAreaVisible();\n\n      const footerRect = footerSection && footerSection.getClientRects().length\n        ? footerSection.getBoundingClientRect() : null;\n      const footerTop = footerRect && footerRect.height > 0 ? footerRect.top : Infinity;\n      const normalBottom = Math.max(0, layoutHeight - viewportBottom) + dockInset;\n      \/\/ Fr\u00fch und unauff\u00e4llig 40px anheben; am Footer danach insgesamt 60px Abstand.\n      const proximity = Math.max(0, Math.min(1, (viewportBottom + 160 - footerTop) \/ 200));\n      const smoothProximity = proximity * proximity * (3 - 2 * proximity);\n      const contactRect = contactSection && contactSection.getClientRects().length\n        ? contactSection.getBoundingClientRect() : null;\n      \/* \u201eHier reservieren\u201c erst dann, wenn 70 % des Kontaktbereichs im sichtbaren Fenster liegen.\n         Bei sehr hohen Kontaktbereichen wird gegen die sichtbare Fensterh\u00f6he gerechnet. *\/\n      let contactVisibleRatio = 0;\n      if (contactRect && contactRect.height > 0) {\n        const visibleTop = Math.max(contactRect.top, viewportTop);\n        const visibleBottom = Math.min(contactRect.bottom, viewportBottom);\n        const visibleHeight = Math.max(0, visibleBottom - visibleTop);\n        contactVisibleRatio = visibleHeight \/ Math.max(1, Math.min(contactRect.height, vh));\n      }\n      const atContact = contactVisibleRatio >= .70 || !!(contactRect && footerRect &&\n        contactRect.top <= viewportTop + vh * .30 && footerRect.top < viewportBottom);\n\n      \/\/ Der Intro-Text darf ausschlie\u00dflich im \u00dcBER UNS sichtbar sein.\n      const aboutRect = aboutSection && aboutSection.getClientRects().length\n        ? aboutSection.getBoundingClientRect() : null;\n      const atAbout = aboutRect && aboutRect.height > 0 &&\n        aboutRect.top <= viewportTop + vh * .62 && aboutRect.bottom > viewportTop + vh * .38;\n      reserveAboutActive = !!atAbout;\n      reserve.classList.toggle(\"btcg2-about-muted\", reserveAboutActive);\n\n      \/\/ Der feste Button bleibt in jedem Bereich eine Cantina-Reservierung.\n      reserve.dataset.action = \"reservation\";\n      reserve.setAttribute(\"aria-label\", btText(\"Tisch in der Tausend Cantina reservieren\",\"Reserve a table at Tausend Cantina\"));\n      reserve.setAttribute(\"aria-haspopup\", \"dialog\");\n      reserve.setAttribute(\"aria-controls\", \"bt-reservation-modal\");\n      reserve.setAttribute(\"aria-expanded\",\n        String(!!document.querySelector(\"#bt-reservation-modal.is-open\")));\n\n      \/\/ Intro label is selected below, only when the reservation control is actually visible.\n\n      \/\/ Kontakt \u00e4ndert nur den Text \u2013 die Kapsel bleibt exakt an derselben Position.\n      \/\/ Sasha 20.10.: Reservierbutton in der endg\u00fcltigen Footer-Ansicht 10px tiefer.\n      const contactOffset = atContact ? 10 : -10;\n      let bottom = Math.max(normalBottom + 40 * smoothProximity, layoutHeight - footerTop + 60) - contactOffset;\n      let footerFloor = Math.max(normalBottom, layoutHeight - footerTop + 20) - contactOffset;\n      const dockHeight = Math.max(46, dock.getBoundingClientRect().height);\n      let fits = layoutHeight - bottom - dockHeight >= viewportTop + 12;\n      \/\/ Ein fokussierter Button bleibt erreichbar; nach Fokuswechsel regul\u00e4r ausblenden.\n      if (!fits && hasKeyboardFocus(dock)) {\n        bottom = Math.max(normalBottom, layoutHeight - viewportTop - dockHeight - 12);\n        fits = true;\n        footerFloor = Math.min(footerFloor, bottom);\n      }\n      placeDock(bottom, footerFloor);\n      const dockTop = layoutHeight - dockBottomValue - dockHeight;\n      const dockBottom = layoutHeight - dockBottomValue;\n      \/\/ Men\u00fc fr\u00fch zeigen; beim Verlassen rechtzeitig und weiterhin weich ausblenden.\n      \/\/ In beiden Scrollrichtungen dieselbe gro\u00dfz\u00fcgige Sichtbarkeitszone.\n      const galleryEntered = galleryRect.height > 0 &&\n        galleryRect.top < viewportTop + vh * .90 &&\n        galleryRect.bottom > viewportTop + vh * .92;\n      const showPager = sourceCount > 1 &&\n        ((galleryEntered && fits) || hasKeyboardFocus(pager));\n      const show = fits && (showReserve || showPager);\n\n      \/\/ Once per page view: first reservation exposure.\n      if (show && showReserve && !reserveIntroStarted) {\n        reserveIntroStarted = true;\n        reserveIntroFinished = reduced.matches;\n        if (!reserveIntroFinished) reserveIntroTimer = window.setTimeout(() => {\n          reserveIntroFinished = true;\n          updateButton();\n        }, 4200);\n      }\n      const label = atContact ? btText(\"Hier reservieren\",\"Reserve here\") :\n        reserveIntroStarted && !reserveIntroFinished ? btText(\"Ihre Reservierung\",\"Your reservation\") : btText(\"Reservieren\",\"Reserve\");\n      if (show && showReserve) setReserveLabel(label, !reserveLayer, false);\n\n      \/\/ Erst die jeweilige Gruppe aus der Tab-Reihenfolge nehmen; dann ausblenden.\n      pagingButtons.forEach(button => button.tabIndex = show && showPager ? 0 : -1);\n      reserve.tabIndex = show && showReserve ? 0 : -1;\n      pager.inert = !showPager;\n      pager.setAttribute(\"aria-hidden\", String(!showPager));\n      pager.classList.toggle(\"is-active\", show && showPager);\n      reserve.inert = !showReserve;\n      reserve.setAttribute(\"aria-hidden\", String(!showReserve));\n      reserve.hidden = false;\n      dock.classList.toggle(\"is-visible\", show);\n      dock.setAttribute(\"aria-hidden\", String(!show));\n      dock.inert = !show;\n    }\n\n    source.insertAdjacentElement(\"afterend\", view);\n    source.classList.add(\"btcg-source-ready\");\n    if (dock.children.length) document.body.appendChild(dock);\n    if (row) row.classList.add(\"btcg-row-active\");\n    layout();\n    installGalleryAnchor();\n    let frame = 0, buttonFrame = 0;\n    function scheduleLayout() {\n      if (frame) return;\n      frame = requestAnimationFrame(function () { frame = 0; layout(); });\n    }\n    function scheduleButton() {\n      if (buttonFrame) return;\n      buttonFrame = requestAnimationFrame(function () { buttonFrame = 0; updateButton(); });\n    }\n    window.addEventListener(\"resize\", scheduleLayout, { passive: true });\n    window.addEventListener(\"scroll\", scheduleButton, { passive: true });\n    dock.addEventListener(\"focusout\", scheduleButton);\n    if (reduced.addEventListener) reduced.addEventListener(\"change\", scheduleButton);\n    if (window.visualViewport) {\n      window.visualViewport.addEventListener(\"resize\", scheduleButton, { passive:true });\n      window.visualViewport.addEventListener(\"scroll\", scheduleButton, { passive:true });\n    }\n    view.addEventListener(\"focusin\", scheduleButton);\n    if (\"ResizeObserver\" in window) {\n      let lastWidth = -1, lastHeight = -1;\n      const observer = new ResizeObserver(function (entries) {\n        const { width, height } = entries[0].contentRect;\n        if (Math.abs(width - lastWidth) < .5 && Math.abs(height - lastHeight) < .5) return;\n        lastWidth = width; lastHeight = height; scheduleLayout();\n      });\n      observer.observe(view);\n      const sectionObserver = new ResizeObserver(scheduleButton);\n      [document.body, aboutSection, contactSection, footerSection]\n        .filter(Boolean).forEach(node => sectionObserver.observe(node));\n    }\n    if (document.fonts && document.fonts.ready) document.fonts.ready.then(scheduleLayout);\n    window.addEventListener(\"load\", scheduleLayout, { once: true });\n    return true;\n  }\n\n  function boot() {\n    let attempts = 0;\n    function attempt() {\n      try {\n        if (start()) return;\n      } catch (error) {\n        const source = document.getElementById(SOURCE_ID);\n        const view = document.getElementById(VIEW_ID);\n        if (view) view.remove();\n        const dock = document.getElementById(\"btcg2-dock\");\n        if (dock) dock.remove();\n        if (source && source.closest(\".et_pb_row\")) source.closest(\".et_pb_row\").classList.remove(\"btcg-row-active\");\n        if (source) source.classList.remove(\"btcg-source-ready\");\n        console.error(\"Cantina Gallery: Aufbau abgebrochen; Divi-Galerie bleibt sichtbar.\", error);\n        return;\n      }\n      if (++attempts < 20) setTimeout(attempt, 250);\n      else console.warn(\"Cantina Gallery: Galerie-ID oder Textmodul fehlt, oder die Galerie enth\u00e4lt keine lesbaren Bilder.\");\n    }\n    attempt();\n  }\n  if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", boot, { once: true });\n  else boot();\n})();\n\n}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',btV4CantinaRun,{once:true});else btV4CantinaRun();})();\n}\n<\/script>\n<style>@media(min-width:768px){\n\n\/* Standard-Hover: wei\u00df *\/\n#btcg2-dock > .btcg2-reserve:not(.bt-final-chef-menu):hover {\n  color: #fff !important;\n  border-color: rgba(234, 11, 95, .6) !important;\n  background-color: rgba(234, 11, 95, .12) !important;\n}\n\n\/* Nur wenn der Button direkt \u00fcber Chef\/Menu liegt *\/\n#btcg2-dock > .btcg2-reserve.bt-final-chef-menu:hover {\n  color: #000 !important;\n  border-color: #000 !important;\n  background-color: rgba(234, 11, 95, .12) !important;\n}\n\n}<\/style>\n<script>\nif(!window.matchMedia('(max-width:767px)').matches){\n(function(){function btV4CantinaRun(){\/* bt-near-cantina-v1 *\/if(!btV4CantinaRun.btNearReady && 'IntersectionObserver' in window){var btNearTargets=document.querySelectorAll('#cantina,#cantina-chef,#cantina-menu,#kontakt');if(btNearTargets.length){var btNearObserver=new IntersectionObserver(function(entries){if(!entries.some(function(e){return e.isIntersecting;}))return;btNearObserver.disconnect();btV4CantinaRun.btNearReady=true;btV4CantinaRun();},{rootMargin:'100% 0px 100% 0px'});btNearTargets.forEach(function(el){btNearObserver.observe(el);});return;}}\n(function () {\n  \"use strict\";\n\n  if (window.__btFinalButtonAreaHover) return;\n  window.__btFinalButtonAreaHover = true;\n\n  function init() {\n    var dock = document.getElementById(\"btcg2-dock\");\n    var chef = document.getElementById(\"cantina-chef\");\n    var menu = document.getElementById(\"cantina-menu\");\n    var gallery =\n      document.getElementById(\"cantina-gallery\") ||\n      document.getElementById(\"bt-cantina-gallery-view\");\n\n    if (!dock || !chef || !menu || !gallery) {\n      setTimeout(init, 300);\n      return;\n    }\n\n    function buttonIsInside(section, button) {\n      var sectionRect = section.getBoundingClientRect();\n      var buttonRect = button.getBoundingClientRect();\n\n      var buttonCenterY =\n        buttonRect.top + buttonRect.height \/ 2;\n\n      return (\n        buttonCenterY >= sectionRect.top &&\n        buttonCenterY <= sectionRect.bottom\n      );\n    }\n\n    function update() {\n      var reserve =\n        dock.querySelector(\":scope > .btcg2-reserve\");\n\n      if (!reserve) return;\n\n      reserve.classList.remove(\n        \"bt-black-hover\",\n        \"btcg2-black-hover\",\n        \"bt-chef-menu-hover\"\n      );\n\n      \/* Gallery hat immer Vorrang und bleibt wei\u00df *\/\n      var buttonOverGallery =\n        buttonIsInside(gallery, reserve);\n\n      var buttonOverChefOrMenu =\n        buttonIsInside(chef, reserve) ||\n        buttonIsInside(menu, reserve);\n\n      var blackHover =\n        buttonOverChefOrMenu &&\n        !buttonOverGallery;\n\n      reserve.classList.toggle(\n        \"bt-final-chef-menu\",\n        blackHover\n      );\n    }\n\n    window.addEventListener(\"scroll\", update, { passive: true });\n    window.addEventListener(\"resize\", update);\n\n    if (window.visualViewport) {\n      window.visualViewport.addEventListener(\n        \"resize\",\n        update,\n        { passive: true }\n      );\n\n      window.visualViewport.addEventListener(\n        \"scroll\",\n        update,\n        { passive: true }\n      );\n    }\n\n    update();\n  }\n\n  init();\n})();\n\n}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',btV4CantinaRun,{once:true});else btV4CantinaRun();})();\n}\n<\/script>\n<script>\nif(!window.matchMedia('(max-width:767px)').matches){\n(function(){function btV4CantinaRun(){\/* bt-near-cantina-v1 *\/if(!btV4CantinaRun.btNearReady && 'IntersectionObserver' in window){var btNearTargets=document.querySelectorAll('#cantina,#cantina-chef,#cantina-menu,#kontakt');if(btNearTargets.length){var btNearObserver=new IntersectionObserver(function(entries){if(!entries.some(function(e){return e.isIntersecting;}))return;btNearObserver.disconnect();btV4CantinaRun.btNearReady=true;btV4CantinaRun();},{rootMargin:'100% 0px 100% 0px'});btNearTargets.forEach(function(el){btNearObserver.observe(el);});return;}}\n(function () {\n  \"use strict\";\n\n  if (window.__btGallerySoftScrollTop) return;\n  window.__btGallerySoftScrollTop = true;\n\n  var SCROLL_DURATION = 1100;\n\n  function init() {\n    var dock = document.getElementById(\"btcg2-dock\");\n    var gallery = document.getElementById(\"bt-cantina-gallery-view\");\n\n    if (!dock || !gallery) {\n      setTimeout(init, 300);\n      return;\n    }\n\n    function easeInOut(t) {\n      return t < 0.5\n        ? 4 * t * t * t\n        : 1 - Math.pow(-2 * t + 2, 3) \/ 2;\n    }\n\n    function slideGalleryToTop() {\n      var startY = window.pageYOffset;\n\n      var targetY =\n        gallery.getBoundingClientRect().top +\n        window.pageYOffset;\n\n      var distance = targetY - startY;\n      var startTime = performance.now();\n\n      function animate(now) {\n        var progress =\n          Math.min(\n            1,\n            (now - startTime) \/ SCROLL_DURATION\n          );\n\n        var eased = easeInOut(progress);\n\n        window.scrollTo(\n          0,\n          startY + distance * eased\n        );\n\n        if (progress < 1) {\n          requestAnimationFrame(animate);\n        }\n      }\n\n      requestAnimationFrame(animate);\n    }\n\n    dock.addEventListener(\n      \"click\",\n      function (event) {\n        var target = event.target.closest(\n          \".btcg2-next, .btcg2-arrow\"\n        );\n\n        if (!target) return;\n\n        if (\n          target.getAttribute(\"aria-disabled\") === \"true\"\n        ) {\n          return;\n        }\n\n        slideGalleryToTop();\n      },\n      true\n    );\n  }\n\n  init();\n})();\n\n}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',btV4CantinaRun,{once:true});else btV4CantinaRun();})();\n}\n<\/script>\n<style>@media(min-width:768px){\n\n\n\/* Nur Blur-Wechsel zus\u00e4tzlich weich machen.\n   Die vorhandene Gallery-CSS k\u00fcmmert sich bereits\n   um Background- und Width-Animationen. *\/\n\n#btcg2-dock .btcg2-reserve {\n  transition:\n    width 860ms cubic-bezier(.22,1,.36,1),\n    color 400ms ease,\n    background-color 500ms ease,\n    border-color 400ms ease,\n    backdrop-filter 500ms ease,\n    -webkit-backdrop-filter 500ms ease !important;\n}\n\n\n}<\/style>\n<script>\nif(!window.matchMedia('(max-width:767px)').matches){\n(function(){function btV4CantinaRun(){\/* bt-near-cantina-v1 *\/if(!btV4CantinaRun.btNearReady && 'IntersectionObserver' in window){var btNearTargets=document.querySelectorAll('#cantina,#cantina-chef,#cantina-menu,#kontakt');if(btNearTargets.length){var btNearObserver=new IntersectionObserver(function(entries){if(!entries.some(function(e){return e.isIntersecting;}))return;btNearObserver.disconnect();btV4CantinaRun.btNearReady=true;btV4CantinaRun();},{rootMargin:'100% 0px 100% 0px'});btNearTargets.forEach(function(el){btNearObserver.observe(el);});return;}}\n(function () {\n  \"use strict\";\n\n\n  function initReserveBackground() {\n\n    const dock =\n      document.getElementById(\"btcg2-dock\");\n\n    const reserve =\n      dock &&\n      dock.querySelector(\".btcg2-reserve\");\n\n\n    const gallery =\n      document.getElementById(\n        \"bt-cantina-gallery-view\"\n      );\n\n\n    \/*\n     * Button und Gallery werden dynamisch\n     * vom bestehenden Gallery-Code erzeugt.\n     *\/\n    if (\n      !dock ||\n      !reserve ||\n      !gallery\n    ) {\n\n      window.setTimeout(\n        initReserveBackground,\n        250\n      );\n\n      return;\n    }\n\n\n    let frame = 0;\n\n    let currentMode = \"\";\n\n\n    \/* =====================================================\n       FARBEN\n    ===================================================== *\/\n\n    const CHEF = {\n      r:237,\n      g:242,\n      b:252\n    };\n\n\n    const MENU = {\n      r:227,\n      g:236,\n      b:243\n    };\n\n\n    const TOLERANCE = 7;\n\n\n\n    \/* =====================================================\n       CSS-FARBE LESEN\n    ===================================================== *\/\n\n    function readRGB(value) {\n\n      if (!value) return null;\n\n\n      const match =\n        String(value).match(\n          \/rgba?[(] *([0-9.]+)[, ]+([0-9.]+)[, ]+([0-9.]+)(?:[, \/]+([0-9.]+))?\/i\n        );\n\n\nif (!match) return null;\n\n\n      return {\n\n        r:Number(match[1]),\n\n        g:Number(match[2]),\n\n        b:Number(match[3]),\n\n        a:\n          match[4] == null\n            ? 1\n            : Number(match[4])\n\n      };\n    }\n\n\n\n    function matchesColor(\n      rgb,\n      target\n    ) {\n\n      if (\n        !rgb ||\n        rgb.a <= 0.02\n      ) {\n        return false;\n      }\n\n\n      return (\n        Math.abs(rgb.r - target.r) <= TOLERANCE &&\n        Math.abs(rgb.g - target.g) <= TOLERANCE &&\n        Math.abs(rgb.b - target.b) <= TOLERANCE\n      );\n    }\n\n\n\n    \/* =====================================================\n       AUCH PSEUDO-ELEMENTE PR\u00dcFEN\n\n       Falls Divi den sichtbaren Hintergrund\n       \u00fcber ::before oder ::after setzt.\n    ===================================================== *\/\n\n    function backgroundType(node) {\n\n      if (\n        !node ||\n        node.nodeType !== 1\n      ) {\n        return \"\";\n      }\n\n\n      const styles = [\n\n        getComputedStyle(node),\n\n        getComputedStyle(\n          node,\n          \"::before\"\n        ),\n\n        getComputedStyle(\n          node,\n          \"::after\"\n        )\n\n      ];\n\n\n      for (\n        const style of styles\n      ) {\n\n        const rgb =\n          readRGB(\n            style.backgroundColor\n          );\n\n\n        if (\n          matchesColor(\n            rgb,\n            MENU\n          )\n        ) {\n          return \"menu\";\n        }\n\n\n        if (\n          matchesColor(\n            rgb,\n            CHEF\n          )\n        ) {\n          return \"chef\";\n        }\n      }\n\n\n      return \"\";\n    }\n\n\n\n    \/* =====================================================\n       ELEMENT + ELTERN NACH HINTERGRUND DURCHSUCHEN\n    ===================================================== *\/\n\n    function detectLightArea(\n      element\n    ) {\n\n      let node =\n        element;\n\n\n      while (\n        node &&\n        node !== document.documentElement\n      ) {\n\n        \/*\n         * FOOD GALLERY hat immer Vorrang.\n         *\/\n        if (\n          node === gallery ||\n          (\n            node.closest &&\n            node.closest(\n              \"#bt-cantina-gallery-view\"\n            )\n          )\n        ) {\n          return \"gallery\";\n        }\n\n\n        const type =\n          backgroundType(node);\n\n\n        if (type) {\n          return type;\n        }\n\n\n        node =\n          node.parentElement;\n      }\n\n\n      return \"\";\n    }\n\n\n\n    \/* =====================================================\n       BUTTON-STYLES\n    ===================================================== *\/\n\n    function setChef() {\n\n      if (\n        currentMode === \"chef\"\n      ) {\n        return;\n      }\n\n\n      currentMode =\n        \"chef\";\n\n\n      reserve.style.setProperty(\n        \"background-color\",\n        \"rgba(237,242,252,.86)\",\n        \"important\"\n      );\n\n\n      reserve.style.setProperty(\n        \"backdrop-filter\",\n        \"blur(12px) saturate(110%)\",\n        \"important\"\n      );\n\n\n      reserve.style.setProperty(\n        \"-webkit-backdrop-filter\",\n        \"blur(12px) saturate(110%)\",\n        \"important\"\n      );\n    }\n\n\n\n    function setMenu() {\n\n      if (\n        currentMode === \"menu\"\n      ) {\n        return;\n      }\n\n\n      currentMode =\n        \"menu\";\n\n\n      reserve.style.setProperty(\n        \"background-color\",\n        \"rgba(227,236,243,.86)\",\n        \"important\"\n      );\n\n\n      reserve.style.setProperty(\n        \"backdrop-filter\",\n        \"blur(12px) saturate(110%)\",\n        \"important\"\n      );\n\n\n      reserve.style.setProperty(\n        \"-webkit-backdrop-filter\",\n        \"blur(12px) saturate(110%)\",\n        \"important\"\n      );\n    }\n\n\n\n    function setOriginal() {\n\n      if (\n        currentMode === \"original\"\n      ) {\n        return;\n      }\n\n\n      currentMode =\n        \"original\";\n\n\n      \/*\n       * Vorhandene Gallery-CSS \u00fcbernimmt\n       * danach wieder den Originalzustand:\n       *\n       * rgba(5,5,5,.46)\n       * blur(7px)\n       *\/\n\n      reserve.style.removeProperty(\n        \"background-color\"\n      );\n\n\n      reserve.style.removeProperty(\n        \"backdrop-filter\"\n      );\n\n\n      reserve.style.removeProperty(\n        \"-webkit-backdrop-filter\"\n      );\n    }\n\n\n\n    \/* =====================================================\n       AKTUELLEN HINTERGRUND UNTER DEM BUTTON ERMITTELN\n    ===================================================== *\/\n\n    function update() {\n\n      frame = 0;\n\n\n      const rect =\n        reserve.getBoundingClientRect();\n\n\n      if (\n        !rect.width ||\n        !rect.height\n      ) {\n        return;\n      }\n\n\n      \/*\n       * Direkt unter der Mitte\n       * des sichtbaren Reservierungsbuttons.\n       *\/\n\n      const x =\n        Math.min(\n          window.innerWidth - 2,\n          Math.max(\n            1,\n            rect.left +\n            rect.width \/ 2\n          )\n        );\n\n\n      const y =\n        Math.min(\n          window.innerHeight - 2,\n          Math.max(\n            1,\n            rect.top +\n            rect.height \/ 2\n          )\n        );\n\n\n      const stack =\n        document.elementsFromPoint(\n          x,\n          y\n        );\n\n\n      let mode = \"\";\n\n\n      for (\n        const element of stack\n      ) {\n\n        \/*\n         * Dock und Button selbst \u00fcberspringen.\n         *\/\n\n        if (\n          element === dock ||\n          element === reserve ||\n          dock.contains(element)\n        ) {\n          continue;\n        }\n\n\n        \/*\n         * Gallery hat absolute Priorit\u00e4t.\n         *\/\n\n        if (\n          element === gallery ||\n          (\n            element.closest &&\n            element.closest(\n              \"#bt-cantina-gallery-view\"\n            )\n          )\n        ) {\n\n          mode =\n            \"gallery\";\n\n          break;\n        }\n\n\n        const detected =\n          detectLightArea(\n            element\n          );\n\n\n        if (\n          detected === \"gallery\"\n        ) {\n\n          mode =\n            \"gallery\";\n\n          break;\n        }\n\n\n        if (\n          detected === \"menu\"\n        ) {\n\n          mode =\n            \"menu\";\n\n          break;\n        }\n\n\n        if (\n          detected === \"chef\"\n        ) {\n\n          mode =\n            \"chef\";\n\n          break;\n        }\n      }\n\n\n\n      \/* ===================================================\n         ANWENDEN\n      =================================================== *\/\n\n      if (\n        mode === \"chef\"\n      ) {\n\n        setChef();\n\n        return;\n      }\n\n\n      if (\n        mode === \"menu\"\n      ) {\n\n        setMenu();\n\n        return;\n      }\n\n\n      \/*\n       * Gallery + alle \u00fcbrigen Bereiche\n       * benutzen Originalzustand.\n       *\/\n\n      setOriginal();\n    }\n\n\n\n    function schedule() {\n\n      if (frame) return;\n\n\n      frame =\n        requestAnimationFrame(\n          update\n        );\n    }\n\n\n\n    \/* =====================================================\n       EVENTS\n    ===================================================== *\/\n\n    window.addEventListener(\n      \"scroll\",\n      schedule,\n      {\n        passive:true\n      }\n    );\n\n\n    window.addEventListener(\n      \"resize\",\n      schedule,\n      {\n        passive:true\n      }\n    );\n\n\n    if (\n      window.visualViewport\n    ) {\n\n      window.visualViewport\n        .addEventListener(\n          \"scroll\",\n          schedule,\n          {\n            passive:true\n          }\n        );\n\n\n      window.visualViewport\n        .addEventListener(\n          \"resize\",\n          schedule,\n          {\n            passive:true\n          }\n        );\n    }\n\n\n    update();\n  }\n\n\n\n  \/* =======================================================\n     START\n  ======================================================= *\/\n\n  if (\n    document.readyState ===\n    \"loading\"\n  ) {\n\n    document.addEventListener(\n      \"DOMContentLoaded\",\n      initReserveBackground,\n      {\n        once:true\n      }\n    );\n\n  } else {\n\n    initReserveBackground();\n\n  }\n\n})();\n\n}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',btV4CantinaRun,{once:true});else btV4CantinaRun();})();\n}\n<\/script>\n<style id=\"bt-button-unity-v1\">@media(min-width:768px){\n\nbody.page-id-9606{--bt-control-size:44px;--bt-control-bottom:calc(32px + env(safe-area-inset-bottom,0px));--bt-control-accent:#ea0b5f;--bt-control-ink:#d0cdc7;--bt-control-hover:#ea0b5f;--bt-eq-visual-size:36px;--bt-eq-visual-left:4px;--bt-eq-bar-scale:.8}\nbody.page-id-9606 #bt-mini-eq-control{top:auto!important;bottom:var(--bt-control-bottom)!important;left:max(20px,env(safe-area-inset-left,0px))!important;right:auto!important;width:auto!important;height:var(--bt-control-size)!important;transform:none!important;transition:left .65s cubic-bezier(.22,1,.36,1),opacity .35s ease}\nbody.page-id-9606 #bt-mini-eq-control #bt-mini-eq-button,\nbody.page-id-9606 #btcg2-dock>button.btcg2-reserve,\nbody.page-id-9606 #btcg2-dock>.btcg2-pager{box-sizing:border-box!important;height:var(--bt-control-size)!important;min-height:var(--bt-control-size)!important;border-radius:999px!important;color:var(--bt-control-ink)!important;border:1px solid var(--bt-control-ink)!important;background:rgba(12,12,12,.78)!important;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);transition:width .86s cubic-bezier(.22,1,.36,1),color 1.1s cubic-bezier(.45,0,.55,1),border-color 1.1s cubic-bezier(.45,0,.55,1),background-color 1.1s cubic-bezier(.45,0,.55,1)}\nbody.page-id-9606 #bt-mini-eq-control #bt-mini-eq-button{width:var(--bt-control-size)!important;min-width:var(--bt-control-size)!important;padding:0!important;transform:none!important;display:inline-flex!important;align-items:center;justify-content:center}\nbody.page-id-9606 #bt-mini-eq-control.bt-mini-eq-navigation{left:max(64px,env(safe-area-inset-left,0px))!important}\nbody.page-id-9606 #bt-mini-eq-control.bt-mini-eq-navigation #bt-mini-eq-button{width:84px!important;padding:0 18px!important;font-size:14px!important;line-height:1!important;text-align:center!important;animation:none!important}\nbody.page-id-9606 #bt-mini-eq-control.bt-mini-eq-navigation #bt-mini-eq-button .bt-mini-eq-nav-label{display:flex!important;align-items:center!important;justify-content:center!important;box-sizing:border-box!important;width:100%!important;height:100%!important;line-height:1!important;margin:0!important;padding:0 0 1px .09em!important;text-indent:0!important;transform:none!important}\nbody.page-id-9606 #btcg2-dock{bottom:var(--bt-control-bottom);right:max(52px,env(safe-area-inset-right,0px))!important;align-items:center!important;height:var(--bt-control-size)!important}\nbody.page-id-9606 #btcg2-dock>button.btcg2-reserve{font-size:14px!important;padding:0 18px!important}\nbody.page-id-9606 #btcg2-dock>.btcg2-pager{padding:0 5px!important;gap:0!important}\nbody.page-id-9606 #btcg2-dock>.btcg2-pager button{min-height:42px!important;height:42px!important;color:inherit!important}\nbody.page-id-9606 #btcg2-dock>.btcg2-pager .btcg2-arrow{min-width:36px!important;width:36px!important}\nbody.page-id-9606 #bt-mini-eq-button .bt-mini-eq-bars span{background:currentColor!important}\nbody.page-id-9606 #bt-mini-eq-control #bt-mini-eq-button:hover,\nbody.page-id-9606 #btcg2-dock>button.btcg2-reserve:hover,\nbody.page-id-9606 #btcg2-dock>.btcg2-pager:hover{color:var(--bt-control-hover)!important;border-color:var(--bt-control-hover)!important}\nbody.page-id-9606 #bt-mini-eq-control #bt-mini-eq-button:focus-visible,\nbody.page-id-9606 #btcg2-dock button:focus-visible{outline:2px solid var(--bt-control-hover)!important;outline-offset:4px!important;color:var(--bt-control-hover)!important}\n\n\/* Compact painted EQ at the page edge, with an unchanged 44px touch target. *\/\nbody.page-id-9606 #bt-mini-eq-control:not(.bt-mini-eq-navigation) #bt-mini-eq-button{position:relative!important;border-color:transparent!important;background:transparent!important;backdrop-filter:none!important;-webkit-backdrop-filter:none!important;box-shadow:none!important}\nbody.page-id-9606 #bt-mini-eq-control:not(.bt-mini-eq-navigation) #bt-mini-eq-button::before{content:\"\";position:absolute;box-sizing:border-box;width:var(--bt-eq-visual-size);height:var(--bt-eq-visual-size);left:var(--bt-eq-visual-left);top:50%;transform:translateY(-50%);border:1px solid currentColor;border-radius:50%;background:rgba(12,12,12,.78);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);pointer-events:none}\nbody.page-id-9606 #bt-mini-eq-control:not(.bt-mini-eq-navigation) #bt-mini-eq-button .bt-mini-eq-bars{position:absolute!important;left:calc(var(--bt-eq-visual-left) + var(--bt-eq-visual-size)\/2)!important;top:50%!important;transform:translate(-50%,-50%) scale(var(--bt-eq-bar-scale))!important;transform-origin:center!important;pointer-events:none}\n\n#bt-button-threads{position:fixed;inset:0;width:100%;height:100%;z-index:2147483645;pointer-events:none!important;opacity:0}\n#bt-button-threads.is-on{opacity:1}\nbody.bt-button-threads-active #bt-theme-cursor{opacity:0!important}\n@media(max-width:767px){body.page-id-9606{--bt-control-bottom:calc(18px + env(safe-area-inset-bottom,0px));--bt-eq-visual-size:28px;--bt-eq-visual-left:1px;--bt-eq-bar-scale:.65}\nbody.page-id-9606 #bt-mini-eq-control{left:max(20px,env(safe-area-inset-left,0px))!important}\nbody.page-id-9606 #bt-mini-eq-control.bt-mini-eq-navigation{left:max(24px,env(safe-area-inset-left,0px))!important}\nbody.page-id-9606 #btcg2-dock{right:max(16px,env(safe-area-inset-right,0px))!important;gap:6px!important}\nbody.page-id-9606 #btcg2-dock>.btcg2-pager{padding:0 2px!important}\nbody.page-id-9606 #btcg2-dock>.btcg2-pager .btcg2-next{padding:0 6px!important}\nbody.page-id-9606 #btcg2-dock>.btcg2-pager .btcg2-arrow{min-width:30px!important;width:30px!important}}\n@media(prefers-reduced-motion:reduce){body.page-id-9606 #bt-mini-eq-control{transition:none!important}#bt-button-threads{display:none!important}body.page-id-9606 #bt-mini-eq-button,body.page-id-9606 #btcg2-dock>*{transition:none!important}}\n@media(forced-colors:active){body.page-id-9606 #bt-mini-eq-button,body.page-id-9606 #btcg2-dock>*{color:ButtonText!important;border-color:ButtonText!important;background:ButtonFace!important}#bt-button-threads{display:none!important}body.page-id-9606 #bt-mini-eq-control:not(.bt-mini-eq-navigation) #bt-mini-eq-button::before{background:ButtonFace;border-color:ButtonText}}\n\n\/* V3: weicher Farbwechsel; Footer-Position bleibt unter Kontrolle der Scroll-Logik. *\/\n@media(prefers-reduced-motion:no-preference){\n body.page-id-9606 #bt-mini-eq-control #bt-mini-eq-button,\n body.page-id-9606 #btcg2-dock>button.btcg2-reserve,\n body.page-id-9606 #btcg2-dock>.btcg2-pager{\n  transition:width .86s cubic-bezier(.22,1,.36,1),color 1.1s cubic-bezier(.45,0,.55,1),border-color 1.1s cubic-bezier(.45,0,.55,1),background-color 1.1s cubic-bezier(.45,0,.55,1)!important;\n }\n}\n\n\n\/* V3 Galerie: Sichtbarkeit weich \u00fcberblenden; Farbwechsel und Bewegungsreduktion bewahren. *\/\n@media(prefers-reduced-motion:no-preference){\n body.page-id-9606 #btcg2-dock>.btcg2-pager{\n  transition:opacity .9s cubic-bezier(.4,0,.2,1),transform 1.1s cubic-bezier(.22,1,.36,1),visibility 0s linear .9s,color 1.1s cubic-bezier(.45,0,.55,1),border-color 1.1s cubic-bezier(.45,0,.55,1),background-color 1.1s cubic-bezier(.45,0,.55,1)!important;\n }\n body.page-id-9606 #btcg2-dock>.btcg2-pager.is-active{transition-delay:0s!important}\n}\n\n\/* Der kleine Equalizer bleibt erreichbar und tritt im Ruhezustand zurueck. *\/\nbody.page-id-9606 #bt-mini-eq-control:not(.bt-mini-eq-navigation) #bt-mini-eq-button{opacity:.46!important}\nbody.page-id-9606 #bt-mini-eq-control:not(.bt-mini-eq-navigation) #bt-mini-eq-button:is(:hover,:focus-visible){opacity:1!important}\n@media(prefers-reduced-motion:no-preference){\n body.page-id-9606 #bt-mini-eq-control:not(.bt-mini-eq-navigation) #bt-mini-eq-button{\n  transition:opacity .65s ease,color 1.1s cubic-bezier(.45,0,.55,1),border-color 1.1s cubic-bezier(.45,0,.55,1),background-color 1.1s cubic-bezier(.45,0,.55,1)!important;\n }\n}\n@media(forced-colors:active){body.page-id-9606 #bt-mini-eq-control:not(.bt-mini-eq-navigation) #bt-mini-eq-button{opacity:1!important}}\n\n\/* V3 Galerie \u00b7 optische Feinausrichtung \u00b7 18.10.2026 *\/\nbody.page-id-9606 #btcg2-dock>.btcg2-pager{position:relative!important;left:3px!important}\nbody.page-id-9606 #btcg2-dock .btcg2-page-count{position:relative!important;top:-2px!important}\n\n\n\/* Sasha19.10.22:55 \u00b7 Reservierung: Rahmen ruhig zusammen mit dem Text \u00e4ndern. *\/\nbody.page-id-9606 #btcg2-dock>button.btcg2-reserve{--bt-control-ink:#b9b6b0}\n@media(prefers-reduced-motion:no-preference){\n body.page-id-9606 #btcg2-dock>button.btcg2-reserve{\n  transition:width 1.2s cubic-bezier(.4,0,.2,1),color 1.1s cubic-bezier(.45,0,.55,1),border-color 1.1s cubic-bezier(.45,0,.55,1),background-color 1.1s cubic-bezier(.45,0,.55,1)!important;\n }\n}\n\n}<\/style>\n<script id=\"bt-button-unity-logic-v2\">\nif(!window.matchMedia('(max-width:767px)').matches){\n(function(){function btV4CantinaRun(){\/* bt-near-cantina-v1 *\/if(!btV4CantinaRun.btNearReady && 'IntersectionObserver' in window){var btNearTargets=document.querySelectorAll('#about,#cantina,#cantina-chef,#cantina-menu,#kontakt');if(btNearTargets.length){var btNearObserver=new IntersectionObserver(function(entries){if(!entries.some(function(e){return e.isIntersecting;}))return;btNearObserver.disconnect();btV4CantinaRun.btNearReady=true;btV4CantinaRun();},{rootMargin:'100% 0px 100% 0px'});btNearTargets.forEach(function(el){btNearObserver.observe(el);});return;}}\n(function(){\n'use strict';\nwindow.__btReserveGooV1=true;\nvar sections=['cantina','cantina-chef','cantina-menu','bt-cantina-gallery-view','bt-cantina-gallery'],frame=0;\nfunction inCantina(cy){\n var ids=['banner-cantina','cantina','cantina-chef','cantina-menu','speisekarte','cantina-koch','art','bt-cantina-gallery-view','bt-cantina-gallery'];\n var nodes=document.elementsFromPoint(Math.max(1,innerWidth-80),Math.max(1,Math.min(innerHeight-1,cy)));\n for(var i=0;i<nodes.length;i++){\n  var n=nodes[i];if(n.closest('#btcg2-dock,#bt-v4-phone-reserve,#bt-mini-eq-control,.bt-mg,#bt-theme-cursor'))continue;\n  var s=n.closest('.et_pb_section');if(s)return ids.indexOf(s.id)>=0;\n }\n return false;\n}\nfunction repairCantinaLinkNames(){document.querySelectorAll('#cantina a,#cantina-chef a').forEach(function(a){var label=a.getAttribute('aria-label')||'';if((a.textContent||'').trim()&&\/^(?:Bar Tausend Startseite|Bar Tausend home page)$\/.test(label)){a.removeAttribute('aria-label');}});}\nfunction update(){frame=0;repairCantinaLinkNames();document.querySelectorAll('#bt-mini-eq-button,#btcg2-dock>button.btcg2-reserve,#btcg2-dock>.btcg2-pager').forEach(function(e){\nvar r=e.getBoundingClientRect(),cy=r.height?r.top+r.height\/2:innerHeight-(innerWidth<=767?40:54),cantina=e.classList.contains('btcg2-pager')||inCantina(cy);\n[['--bt-control-accent',cantina?'#c27a50':'#ea0b5f'],['--bt-control-ink',cantina?'#c27a50':e.classList.contains('btcg2-reserve')?'#ea0b5f':'#d0cdc7'],['--bt-control-hover',cantina?'#d0cdc7':'#ea0b5f']].forEach(function(p){if(e.style.getPropertyValue(p[0])!==p[1])e.style.setProperty(p[0],p[1]);});\n});}\n\/* bt-reserve-accent-class-v1 23.10.2026 *\/function btAccentSync(){var rb=document.querySelector('#btcg2-dock>.btcg2-reserve'),on=!!(rb&&rb.style.getPropertyValue('--bt-control-accent')==='#c27a50'),b=document.body;if(b.classList.contains('bt-reserve-cantina-accent')!==on)b.classList.toggle('bt-reserve-cantina-accent',on);}function btUpdateV3(){update();btAccentSync();}function request(){if(!frame)frame=requestAnimationFrame(btUpdateV3);}\nwindow.addEventListener('scroll',request,{passive:true});window.addEventListener('resize',request,{passive:true});\n[document.getElementById('btcg2-dock'),document.getElementById('bt-mini-eq-control')].forEach(function(e){if(e)new MutationObserver(request).observe(e,{attributes:true,attributeFilter:['class','style','hidden','aria-hidden']});});\nrequest();\n})();\n\n}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',btV4CantinaRun,{once:true});else btV4CantinaRun();})();\n}\n<\/script>\n<script id=\"bt-v3-fluid-magnet\">\nif(!window.matchMedia('(max-width:767px)').matches){\n(function(){function btV4CantinaRun(){\/* bt-near-cantina-v1 *\/if(!btV4CantinaRun.btNearReady && 'IntersectionObserver' in window){var btNearTargets=document.querySelectorAll('#about,#cantina,#cantina-chef,#cantina-menu,#kontakt');if(btNearTargets.length){var btNearObserver=new IntersectionObserver(function(entries){if(!entries.some(function(e){return e.isIntersecting;}))return;btNearObserver.disconnect();btV4CantinaRun.btNearReady=true;btV4CantinaRun();},{rootMargin:'100% 0px 100% 0px'});btNearTargets.forEach(function(el){btNearObserver.observe(el);});return;}}\n\/* TAUSEND V3 \u00b7 FLUESSIGER TROPFEN-MAGNET FUER BUTTONS (nach 4P V02 V57, Seite 340)\n   Nur Seite 9606. Ersetzt die bisherige gerade Magnetlinie aus Snippet 71.\n   - Runde Buttons < 80px (MUSIK\/EQ): analytischer Metaball, der Rahmen selbst fliesst zum Zeiger (wie 4P).\n   - Pillen\/Rechtecke (Reservierung, Galerie-Menue, weitere [data-bt-magnet]): Goo-Filter, aus dem nur der\n     Rahmen ausgeschnitten wird, so dass Button-Rahmen und Tropfenkette eine einzige Linie bilden.\n   Farbe = die eigene Rahmenfarbe des Buttons (Kupfer #C27A50 im Cantina-Kontext, Elfenbein ausserhalb).\n   Keine Positionsaenderung der Buttons (MAG = 0). Nur Maus mit Hover, nicht bei reduzierter Bewegung. *\/\n(function(){\n'use strict';\nvar body=document.body;\nif(!body||!body.classList.contains('page-id-9606')){return;}\nvar mq=function(q){try{return window.matchMedia(q).matches;}catch(e){return false;}};\nif(mq('(prefers-reduced-motion: reduce)')){return;}\nif(!mq('(hover: hover) and (pointer: fine)')||mq('(forced-colors: active)')){return;}\nwindow.__btReserveGooV1=true;\n\nvar SEL='#bt-mini-eq-button,#btcg2-dock>button.btcg2-reserve,#btcg2-dock>.btcg2-pager';\nvar R=120,CIRC_MAX=80,CIRC_REACH=54,DOT=5.5,MAG=0;\nvar NS='http:\/\/www.w3.org\/2000\/svg';\nvar mk=function(n,a){var e=document.createElementNS(NS,n),k;for(k in a){e.setAttribute(k,a[k]);}return e;};\n\nvar st=document.createElement('style');\nst.textContent=\".bt-mg{position:fixed;left:0;top:0;width:100vw;height:100vh;z-index:2147483647;pointer-events:none;overflow:visible;opacity:0;transition:opacity .22s ease}.bt-mg.is-on{opacity:1}.bt-mg-hide{border-color:transparent!important}body.page-id-9606 #btcg2-dock>button.btcg2-reserve.bt-mg-hide,body.page-id-9606 #btcg2-dock>.btcg2-pager.bt-mg-hide,body.page-id-9606 #bt-mini-eq-control #bt-mini-eq-button.bt-mg-hide{border-color:transparent!important}body.page-id-9606 #bt-mini-eq-control:not(.bt-mini-eq-navigation) #bt-mini-eq-button.bt-mg-hide::before{border-color:transparent!important}body.bt-mg-active #bt-theme-cursor{opacity:0!important}\";\ndocument.head.appendChild(st);\n\nvar svg=mk('svg',{'class':'bt-mg','aria-hidden':'true',focusable:'false'});\nvar defs=mk('defs',{});\n\/* Goo: Weichzeichnen + Alpha-Schwelle verschmilzt Button-Form und Tropfen. *\/\nvar fO=mk('filter',{id:'bt-mg-o',filterUnits:'userSpaceOnUse','color-interpolation-filters':'sRGB'});\nfO.appendChild(mk('feGaussianBlur',{'in':'SourceGraphic',stdDeviation:'6',result:'b'}));\nfO.appendChild(mk('feColorMatrix',{'in':'b',type:'matrix',values:'0 0 0 0 0  0 0 0 0 0  0 0 0 0 0  0 0 0 20 -8',result:'g'}));\nvar ero=mk('feMorphology',{'in':'g',operator:'erode',radius:'1',result:'e'});fO.appendChild(ero);\nfO.appendChild(mk('feComposite',{'in':'g',in2:'e',operator:'out',result:'ring'}));\nvar fl=mk('feFlood',{'flood-color':'#d0cdc7',result:'c'});fO.appendChild(fl);\nvar outC=mk('feComposite',{'in':'c',in2:'ring',operator:'in'});fO.appendChild(outC);\ndefs.appendChild(fO);\n\/* Maske fuer gefuellte Buttons: Button-Flaeche bleibt frei, damit Text und Hintergrund sichtbar bleiben. *\/\nvar mask=mk('mask',{id:'bt-mg-m',maskUnits:'userSpaceOnUse',x:'0',y:'0',width:'100%',height:'100%'});\nmask.appendChild(mk('rect',{x:'-99999',y:'-99999',width:'199999',height:'199999',fill:'#fff'}));\nvar mHole=mk('rect',{fill:'#000'});mask.appendChild(mHole);\ndefs.appendChild(mask);\nsvg.appendChild(defs);\n\nvar gG=mk('g',{filter:'url(#bt-mg-o)'});\nvar shape=mk('rect',{fill:'#000'});gG.appendChild(shape);\nvar B=[],k;for(k=0;k<5;k++){var c=mk('circle',{fill:'#000',r:'0'});gG.appendChild(c);B.push({n:c,x:-999,y:-999,r:0});}\nsvg.appendChild(gG);\nvar mpath=mk('path',{fill:'none','stroke-linejoin':'round'});svg.appendChild(mpath);\nvar dot=mk('circle',{r:String(DOT)});svg.appendChild(dot);\nbody.appendChild(svg);\n\n\/* --- Metaball (unveraendert aus 4P V57) --- *\/\nvar V=function(c,a,r){return [c[0]+Math.cos(a)*r,c[1]+Math.sin(a)*r];};\nvar DI=function(p,q){var x=p[0]-q[0],y=p[1]-q[1];return Math.sqrt(x*x+y*y);};\nvar F=function(p){return p[0].toFixed(1)+' '+p[1].toFixed(1);};\nvar mball=function(c1,r1,c2,r2,whole){\nvar d=DI(c1,c2),v=0.5,hs=2.4,u1=0,u2=0;\nif(d<=Math.abs(r1-r2)){return '';}\nif(d<r1+r2){u1=Math.acos(Math.max(-1,Math.min(1,(r1*r1+d*d-r2*r2)\/(2*r1*d))));u2=Math.acos(Math.max(-1,Math.min(1,(r2*r2+d*d-r1*r1)\/(2*r2*d))));}\nvar ab=Math.atan2(c2[1]-c1[1],c2[0]-c1[0]),ms=Math.acos(Math.max(-1,Math.min(1,(r1-r2)\/d)));\nvar a1=ab+u1+(ms-u1)*v,a2=ab-u1-(ms-u1)*v,a3=ab+Math.PI-u2-(Math.PI-u2-ms)*v,a4=ab-Math.PI+u2+(Math.PI-u2-ms)*v;\nvar p1=V(c1,a1,r1),p2=V(c1,a2,r1),p3=V(c2,a3,r2),p4=V(c2,a4,r2);\nvar tr=r1+r2,d2=Math.min(v*hs,DI(p1,p3)\/tr)*Math.min(1,(d*2)\/(r1+r2)),r1b=r1*d2,r2b=r2*d2;\nvar h1=V(p1,a1-Math.PI\/2,r1b),h2=V(p2,a2+Math.PI\/2,r1b),h3=V(p3,a3+Math.PI\/2,r2b),h4=V(p4,a4-Math.PI\/2,r2b);\nvar span2=(a4+2*Math.PI)-a3;while(span2>2*Math.PI){span2-=2*Math.PI;}var lg2=span2>Math.PI?1:0;\nvar s='M'+F(p1)+' C'+F(h1)+' '+F(h3)+' '+F(p3)+' A'+r2.toFixed(1)+' '+r2.toFixed(1)+' 0 '+lg2+' 1 '+F(p4)+' C'+F(h4)+' '+F(h2)+' '+F(p2);\ns+=whole?(' A'+r1.toFixed(1)+' '+r1.toFixed(1)+' 0 1 0 '+F(p1)+' Z'):(' A'+r1.toFixed(1)+' '+r1.toFixed(1)+' 0 0 1 '+F(p1)+' Z');\nreturn s;\n};\n\nvar transparent=function(c){return !c||c==='transparent'||\/rgba\\([^)]*,\\s*0\\)$\/.test(c);};\nvar visualRect=function(b){\nvar r=b.getBoundingClientRect(),cs=getComputedStyle(b);\nif(b.id==='bt-mini-eq-button'&&!b.parentElement.classList.contains('bt-mini-eq-navigation')){\n var size=parseFloat(cs.getPropertyValue('--bt-eq-visual-size'))||28;\n var left=r.left+(parseFloat(cs.getPropertyValue('--bt-eq-visual-left'))||0),top=r.top+(r.height-size)\/2;\n return {left:left,right:left+size,top:top,bottom:top+size,width:size,height:size};\n}return r;};\nvar style=function(b){\nvar cs=getComputedStyle(b);\nreturn {bw:Math.max(1,parseFloat(cs.borderTopWidth)||1),col:cs.color,fill:false,rad:parseFloat(cs.borderTopLeftRadius)||999};\n};\nvar list=[],lt=0,mx=-999,my=-999,raf=0,cur=null,mode='',lastMove=0;\nvar near=function(){\nvar now=Date.now();if(now-lt>1500){lt=now;list=Array.prototype.slice.call(document.querySelectorAll(SEL));}\nvar best=null,bd=R,i,b,r;\nfor(i=0;i<list.length;i++){b=list[i];if(b.closest('[aria-hidden=\"true\"],[inert],[hidden],#bt-mini-eq-control.bt-mini-eq-away'))continue;r=visualRect(b);\nif(r.width<4||r.bottom<0||r.top>window.innerHeight){continue;}\nvar rad=Math.min(r.width,r.height)\/2,ax,ay,bx,by;\nif(r.width>=r.height){ax=r.left+rad;bx=r.right-rad;ay=by=r.top+rad;}else{ay=r.top+rad;by=r.bottom-rad;ax=bx=r.left+rad;}\nvar sx=bx-ax,sy=by-ay,sl=sx*sx+sy*sy,u=sl>0?Math.max(0,Math.min(1,((mx-ax)*sx+(my-ay)*sy)\/sl)):0,qx=ax+sx*u,qy=ay+sy*u;\nvar dx=mx-qx,dy=my-qy,dc=Math.sqrt(dx*dx+dy*dy)||1,d=dc-rad;\nif(d<bd&&d>1){var cs=getComputedStyle(b);if(cs.visibility==='hidden'||parseFloat(cs.opacity)<0.3){continue;}\nbd=d;best={b:b,r:r,d:d,px:qx+dx\/dc*(rad-1.5),py:qy+dy\/dc*(rad-1.5)};}}\nreturn best;\n};\nvar release=function(){\nif(cur){cur.b.classList.remove('bt-mg-hide');if(MAG){cur.b.style.translate='';}}\ncur=null;mode='';svg.classList.remove('is-on');body.classList.remove('bt-mg-active');\n};\nvar grab=function(t){\nif(cur&&cur.b===t.b){return;}\nrelease();cur={b:t.b,s:style(t.b)};\nvar j;for(j=0;j<B.length;j++){B[j].x=mx;B[j].y=my;}\nif(!cur.s.fill){cur.b.classList.add('bt-mg-hide');}\n};\nvar tick=function(){\nraf=0;\nif(Date.now()-lastMove>2200||document.hidden||mq('(prefers-reduced-motion: reduce)')||mq('(forced-colors: active)')||!mq('(hover: hover) and (pointer: fine)')||document.querySelector('dialog[open]')||document.documentElement.classList.contains('bt-reservation-is-open')||document.getElementById('btcg-fullscreen')){release();return;}\nvar t=near();\nif(!t){release();return;}\ngrab(t);\nvar s=style(cur.b),rr=t.r,f=1-t.d\/R;\nif(MAG){cur.b.style.translate=((mx-(rr.left+rr.width\/2))*MAG\/R*f).toFixed(2)+'px '+((my-(rr.top+rr.height\/2))*MAG\/R*f).toFixed(2)+'px';}\ndot.setAttribute('cx',mx.toFixed(1));dot.setAttribute('cy',my.toFixed(1));dot.setAttribute('fill',s.col);\nvar circ=Math.abs(rr.width-rr.height)<2&&rr.width<CIRC_MAX;\nif(circ){\nvar c1=[rr.left+rr.width\/2,rr.top+rr.height\/2],r1=rr.width\/2;\nif(DI(c1,[mx,my])>=r1+CIRC_REACH){release();return;}\ngG.style.display='none';mpath.style.display='';\nmpath.setAttribute('d',mball(c1,r1,[mx,my],DOT+0.5,!s.fill));\nif(s.fill){mpath.setAttribute('fill',s.col);mpath.setAttribute('stroke','none');}\nelse{mpath.setAttribute('fill','none');mpath.setAttribute('stroke',s.col);mpath.setAttribute('stroke-width',String(s.bw));}\n}else{\nmpath.style.display='none';gG.style.display='';\n\/* Button-Form exakt auf den Button legen; der Goo-Rahmen ersetzt den echten Rahmen. *\/\nvar rx=Math.min(s.rad,rr.height\/2,rr.width\/2),inset=s.fill?0:s.bw\/2;\nshape.setAttribute('x',(rr.left+inset).toFixed(1));shape.setAttribute('y',(rr.top+inset).toFixed(1));\nshape.setAttribute('width',(rr.width-2*inset).toFixed(1));shape.setAttribute('height',(rr.height-2*inset).toFixed(1));\nshape.setAttribute('rx',Math.max(0,rx-inset).toFixed(1));\nB[0].x=mx;B[0].y=my;B[0].r=9;\nvar K=[0,0.45,0.32,0.22,0.5],P=[0,0.28,0.52,0.76,1],m;\nfor(m=1;m<5;m++){var gx=mx+(t.px-mx)*P[m],gy=my+(t.py-my)*P[m];B[m].x+=(gx-B[m].x)*K[m];B[m].y+=(gy-B[m].y)*K[m];}\nB[1].r=3+5*f;B[2].r=2+5*f*f;B[3].r=2+5*f*f;B[4].r=3+8*f;\nfor(m=0;m<5;m++){B[m].n.setAttribute('cx',B[m].x.toFixed(1));B[m].n.setAttribute('cy',B[m].y.toFixed(1));B[m].n.setAttribute('r',B[m].r.toFixed(1));}\nvar x0=Math.min(rr.left,mx-20),y0=Math.min(rr.top,my-20),x1=Math.max(rr.right,mx+20),y1=Math.max(rr.bottom,my+20);\nfO.setAttribute('x',(x0-40).toFixed(0));fO.setAttribute('y',(y0-40).toFixed(0));\nfO.setAttribute('width',(x1-x0+80).toFixed(0));fO.setAttribute('height',(y1-y0+80).toFixed(0));\nfl.setAttribute('flood-color',s.col);\nif(s.fill){outC.setAttribute('in2','g');gG.setAttribute('mask','url(#bt-mg-m)');\nmHole.setAttribute('x',(rr.left+0.5).toFixed(1));mHole.setAttribute('y',(rr.top+0.5).toFixed(1));mHole.setAttribute('width',(rr.width-1).toFixed(1));mHole.setAttribute('height',(rr.height-1).toFixed(1));mHole.setAttribute('rx',Math.max(0,rx-0.5).toFixed(1));}\nelse{outC.setAttribute('in2','ring');gG.removeAttribute('mask');ero.setAttribute('radius',String(s.bw));}\n}\nsvg.classList.add('is-on');body.classList.add('bt-mg-active');\nraf=requestAnimationFrame(tick);\n};\ndocument.addEventListener('pointermove',function(e){if(e.pointerType!=='mouse'){return;}mx=e.clientX;my=e.clientY;lastMove=Date.now();if(!raf){raf=requestAnimationFrame(tick);}},{passive:true});\nwindow.addEventListener('scroll',function(){if(cur&&!raf){raf=requestAnimationFrame(tick);}},{passive:true});\ndocument.documentElement.addEventListener('mouseleave',function(){mx=-999;my=-999;if(!raf){raf=requestAnimationFrame(tick);}});\ndocument.addEventListener('pointerdown',function(){release();},{passive:true});\nwindow.addEventListener('blur',release);\ndocument.addEventListener('visibilitychange',release);\n['(prefers-reduced-motion: reduce)','(forced-colors: active)','(hover: hover) and (pointer: fine)'].forEach(function(q){window.matchMedia(q).addEventListener('change',release);});\n})();\n\n\n}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',btV4CantinaRun,{once:true});else btV4CantinaRun();})();\n}\n<\/script><script id=\"bt-gallery-coming-soon-script\">\nif(!window.matchMedia('(max-width:767px)').matches){\n(function(){function btV4CantinaRun(){\/* bt-near-cantina-v1 *\/if(!btV4CantinaRun.btNearReady && 'IntersectionObserver' in window){var btNearTargets=document.querySelectorAll('#cantina,#cantina-chef,#cantina-menu,#kontakt');if(btNearTargets.length){var btNearObserver=new IntersectionObserver(function(entries){if(!entries.some(function(e){return e.isIntersecting;}))return;btNearObserver.disconnect();btV4CantinaRun.btNearReady=true;btV4CantinaRun();},{rootMargin:'100% 0px 100% 0px'});btNearTargets.forEach(function(el){btNearObserver.observe(el);});return;}}\n(function(){\n \"use strict\";\n var message=\"Coming soon\";\n\n \/\/ Set false to remove only the waves; the Coming-soon mask stays active.\n var WAVE_ENABLED=false;\n var fine=window.matchMedia(\"(hover:hover) and (pointer:fine)\");\n var calm=window.matchMedia(\"(prefers-reduced-motion:reduce)\");\n var activeWaves=new Set(),activeTextWaves=new Set();\n function quietWaves(){activeWaves.forEach(function(a){a.cancel();});activeTextWaves.forEach(function(a){a.cancel();});activeWaves.clear();activeTextWaves.clear();}\n document.addEventListener(\"visibilitychange\",function(){if(document.hidden)quietWaves();});\n if(calm.addEventListener)calm.addEventListener(\"change\",function(e){if(e.matches)quietWaves();});\n function addWaves(host,copy){\n   if(!WAVE_ENABLED || !fine.matches || calm.matches || !host.animate)return;\n   var layer=document.createElement(\"span\");\n   layer.className=\"bt-gallery-soon-waves\";\n   layer.setAttribute(\"aria-hidden\",\"true\");\n   var pool=[];\n   for(var k=0;k<3;k++){\n     var ring=document.createElement(\"span\");\n     ring.className=\"bt-gallery-soon-wave\";\n     layer.appendChild(ring);pool.push({el:ring,busy:false});\n   }\n   host.appendChild(layer);\n   var last=-1000,lastX=-1000,lastY=-1000,textWave=null;\n   function ripple(e){\n     if(e.pointerType!==\"mouse\" || calm.matches || !fine.matches || document.hidden)return;\n     var now=performance.now();\n     if(now-last<680 || Math.hypot(e.clientX-lastX,e.clientY-lastY)<36)return;\n     var slot=pool.find(function(p){return !p.busy;});\n     if(!slot || activeWaves.size>=3)return;\n     var rect=host.getBoundingClientRect();\n     if(!rect.width || !rect.height)return;\n     var priorX=lastX,priorY=lastY;last=now;lastX=e.clientX;lastY=e.clientY;\n     slot.el.style.left=(e.clientX-rect.left)+\"px\";\n     slot.el.style.top=(e.clientY-rect.top)+\"px\";\n     slot.busy=true;\n     var dx=Math.max(-44,Math.min(44,(e.clientX-priorX)*.35));\n     var dy=Math.max(-24,Math.min(24,(e.clientY-priorY)*.25));\n     var turn=(e.clientX\/Math.max(1,rect.width)*24-12).toFixed(1);\n     var a=slot.el.animate([\n       {transform:\"translate(-50%,-50%) rotate(\"+turn+\"deg) scale(.35,.3)\",opacity:0},\n       {transform:\"translate(-48%,-52%) rotate(\"+(Number(turn)+9)+\"deg) scale(1.05,.76)\",opacity:.48,offset:.28},\n       {transform:\"translate(calc(-50% + \"+dx+\"px),calc(-50% + \"+(dy-18)+\"px)) rotate(\"+(Number(turn)+24)+\"deg) scale(1.65,.95)\",opacity:0}\n     ],{duration:4200,easing:\"cubic-bezier(.22,.45,.28,1)\"});\n     activeWaves.add(a);\n     if(!textWave){\n       var strength=1-Math.min(1,Math.hypot((e.clientX-rect.left-rect.width\/2)\/Math.max(1,rect.width*.7),(e.clientY-rect.top-rect.height\/2)\/Math.max(1,rect.height*.8)));\n       var lift=(.7+strength*.9).toFixed(2);\n       textWave=copy.animate([\n         {transform:\"translate3d(0,var(--bt-soon-lift,-4vh),0)\",opacity:.78},\n         {transform:\"translate3d(0,calc(var(--bt-soon-lift,-4vh) - \"+lift+\"px),0)\",opacity:.88+strength*.05,offset:.32},\n         {transform:\"translate3d(0,var(--bt-soon-lift,-4vh),0)\",opacity:.78}\n       ],{duration:4200,easing:\"cubic-bezier(.25,.45,.3,1)\"});\n       var textAnimation=textWave;\n       activeTextWaves.add(textAnimation);\n       function textFinished(){activeTextWaves.delete(textAnimation);textWave=null;}\n       textAnimation.finished.then(textFinished,textFinished);\n     }\n     function finished(){slot.busy=false;activeWaves.delete(a);}\n     a.finished.then(finished,finished);\n   }\n   host.addEventListener(\"pointerenter\",ripple,{passive:true});\n   host.addEventListener(\"pointermove\",ripple,{passive:true});\n }\n\n function normaliseCards(host){\n   host.querySelectorAll('.btcg-page[role=\"list\"],.btcg-mobile-rail[role=\"list\"]').forEach(function(page){page.setAttribute('role','group');});\n   host.querySelectorAll('article.btcg-card[role=\"listitem\"]').forEach(function(card){card.removeAttribute('role');});\n }\n function addLayer(host){\n   if(!host || host.querySelector(\":scope>.bt-gallery-soon-message\"))return;\n   normaliseCards(host);\n   new MutationObserver(function(records){\n     if(records.some(function(record){return record.type==='attributes' || record.addedNodes.length>0;}))normaliseCards(host);\n   }).observe(host,{childList:true,subtree:true,attributes:true,attributeFilter:['role']});\n   var note=document.createElement(\"p\");\n   note.className=\"bt-gallery-soon-message\";\n   note.setAttribute(\"lang\",\"en\");\n   note.style.setProperty(\"text-transform\",\"uppercase\",\"important\");\n   note.setAttribute(\"data-no-translation\",\"\");\n   note.setAttribute(\"role\",\"status\");\n   var copy=document.createElement(\"span\");\n   copy.className=\"bt-gallery-soon-copy\";\n   var kicker=document.createElement(\"span\");\n   kicker.className=\"bt-gallery-soon-kicker\";\n   kicker.textContent=\"Cantina \u00b7 Menu gallery\";\n   var title=document.createElement(\"span\");\n   title.className=\"bt-gallery-soon-title\";\n   title.textContent=message;\n   copy.appendChild(kicker);copy.appendChild(document.createTextNode(\" \"));copy.appendChild(title);\n   note.appendChild(copy);\n   addWaves(host,copy);\n   host.appendChild(note);\n }\n function init(){\n   var menu=document.getElementById(\"cantina-menu\");\n   var view=document.getElementById(\"bt-cantina-gallery-view\");\n   if(view)addLayer(view);\n   else if(menu){\n     var waiting=new MutationObserver(function(){\n       var gallery=document.getElementById(\"bt-cantina-gallery-view\");\n       if(gallery){addLayer(gallery);waiting.disconnect();}\n     });\n     waiting.observe(menu,{childList:true,subtree:true});\n   }\n   addLayer(document.getElementById(\"btcg-fullscreen\"));\n   new MutationObserver(function(records){\n     records.forEach(function(record){\n       record.addedNodes.forEach(function(node){\n         if(node.nodeType===1 && node.id===\"btcg-fullscreen\")addLayer(node);\n       });\n     });\n   }).observe(document.body,{childList:true});\n }\n if(document.readyState===\"loading\")document.addEventListener(\"DOMContentLoaded\",init,{once:true});\n else init();\n})();\n\n}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',btV4CantinaRun,{once:true});else btV4CantinaRun();})();\n}\n<\/script><script>(function(){function btV4CantinaRun(){\/* bt-near-cantina-v1 *\/if(!btV4CantinaRun.btNearReady && 'IntersectionObserver' in window){var btNearTargets=document.querySelectorAll('#about,#cantina,#cantina-chef,#cantina-menu,#kontakt');if(btNearTargets.length){var btNearObserver=new IntersectionObserver(function(entries){if(!entries.some(function(e){return e.isIntersecting;}))return;btNearObserver.disconnect();btV4CantinaRun.btNearReady=true;btV4CantinaRun();},{rootMargin:'100% 0px 100% 0px'});btNearTargets.forEach(function(el){btNearObserver.observe(el);});return;}}\n\/* V3 native Cantina request form: existing reservation dialog and native Divi mail. *\/\n(function(){\n'use strict';\nfunction init(){\nif(!document.body.classList.contains('page-id-9606')||document.body.classList.contains('et-fb'))return;\nvar en=\/^en\/i.test(document.documentElement.lang),tries=0;\nfunction mount(){\nvar src=document.getElementById('bt-reservation-native'),modal=document.getElementById('bt-reservation-modal');\nvar tool=modal&&modal.querySelector('.bt-reservation-tool');\nif(!src||!tool){if(++tries<30)setTimeout(mount,120);return;}\nvar old=modal.querySelector('#bt-opentable-widget');if(old){old.hidden=true;old.style.setProperty('display','none','important');}\ntool.appendChild(src);modal.classList.add('bt-native-ready');modal.setAttribute('aria-labelledby','bt-native-reservation-title');\nvar close=modal.querySelector('.bt-reservation-close');if(close)close.setAttribute('aria-label',en?'Close reservation request':'Reservierungsanfrage schlie\u00dfen');\nvar form=src.querySelector('form');if(!form)return;\nvar fields={name:'Your name',email:'Your email address',date:'Preferred date',time:'Preferred time',guests:'Number of guests',phone:'Phone (optional)',message:'Message and requests (optional)'};\nObject.keys(fields).forEach(function(id){\nvar input=form.querySelector('[data-original_id=\"'+id+'\"]');if(!input)return;\nvar wrap=input.closest('.et_pb_contact_field'),label=wrap&&wrap.querySelector('label');\nif(en&&label)label.textContent=fields[id]+(input.getAttribute('data-required_mark')==='required'?' *':'');\ninput.removeAttribute('placeholder');\nif(input.getAttribute('data-required_mark')==='required'){input.required=true;input.setAttribute('aria-required','true');}\nif(id==='date'){\ninput.type='date';var parts=new Intl.DateTimeFormat('en-CA',{timeZone:'Europe\/Berlin',year:'numeric',month:'2-digit',day:'2-digit'}).formatToParts(new Date());\nvar dateParts={};parts.forEach(function(p){dateParts[p.type]=p.value});input.min=dateParts.year+'-'+dateParts.month+'-'+dateParts.day;\ninput.addEventListener('input',function(){input.setCustomValidity('');if(!input.value)return;var day=new Date(input.value+'T12:00:00').getDay();if(day<4||day>6)input.setCustomValidity(en?'Please choose a Thursday, Friday or Saturday.':'Bitte w\u00e4hlen Sie Donnerstag, Freitag oder Samstag.');});\n}\nif(id==='time'){input.type='time';input.min='19:00';input.max='23:00';input.step='900';}\nif(id==='guests'){input.type='number';input.min='1';input.step='1';input.inputMode='numeric';}\nif(id==='phone'){input.type='tel';input.autocomplete='tel';}\nif(id==='name')input.autocomplete='name';\nif(id==='email'){input.type='email';input.autocomplete='email';input.inputMode='email';input.autocapitalize='none';}\n});\nvar submit=form.querySelector('button[type=\"submit\"]');if(en&&submit)submit.textContent='Request a table';\nform.addEventListener('submit',function(e){if(!form.checkValidity()){e.preventDefault();e.stopImmediatePropagation();form.reportValidity();}},true);\nvar successDE='Vielen Dank. Ihre Reservierungsanfrage wurde \u00fcbermittelt. Unser Cantina-Team best\u00e4tigt die Verf\u00fcgbarkeit per E-Mail. Die Reservierung ist erst nach unserer Best\u00e4tigung verbindlich.';\nvar successEN='Thank you. Your reservation request has been sent. Our Cantina team will confirm availability by email. Your table is reserved only after our confirmation.';\nif(en)new MutationObserver(function(){var msg=src.querySelector('.et-pb-contact-message');if(msg&&msg.textContent.trim()===successDE)msg.textContent=successEN;}).observe(src,{childList:true,subtree:true});\n}\nmount();\n\n}\nif(document.readyState==='loading')document.addEventListener('DOMContentLoaded',init,{once:true});else init();\n})();\n\n}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',btV4CantinaRun,{once:true});else btV4CantinaRun();})();<\/script><style>@media(min-width:768px){\n\n\/* Native Reservierungsquelle bleibt im Builder vollst\u00e4ndig bearbeitbar. *\/\nbody.page-id-9606:not(.et-fb) #page-container #bt-reservation-native{display:none!important}\nbody.page-id-9606 #bt-reservation-modal .bt-reservation-tool{width:min(760px,calc(100vw - 40px))!important;padding:30px 34px!important;border-radius:14px!important;background:rgba(13,13,13,.92)!important}\nbody.page-id-9606 #bt-reservation-modal.is-open .bt-reservation-tool{transform:translateY(0) scale(1)!important}\nbody.page-id-9606 #bt-reservation-modal .bt-reservation-tool>#bt-reservation-native{display:block!important;margin:0!important;padding:0!important;background:transparent!important;min-height:0!important;height:auto!important;width:100%!important}\nbody.page-id-9606 #bt-reservation-native>.et_pb_row{width:100%!important;max-width:none!important;margin:0!important;padding:0!important;display:block!important}\nbody.page-id-9606 #bt-reservation-native .et_pb_column{width:100%!important;margin:0!important;padding:0!important;float:none!important}\nbody.page-id-9606 #bt-reservation-native .et_pb_module{margin:0!important;padding:0!important;max-width:none!important;width:100%!important}\nbody.page-id-9606 #bt-reservation-native .bt-res-en{display:none!important}\nhtml[lang^=\"en\"] body.page-id-9606 #bt-reservation-native .bt-res-de{display:none!important}\nhtml[lang^=\"en\"] body.page-id-9606 #bt-reservation-native .bt-res-en{display:inline!important}\nbody.page-id-9606 #bt-reservation-native p{font-family:\"Poppins\",sans-serif!important;font-size:13px!important;font-weight:400!important;line-height:1.65!important;text-transform:none!important;letter-spacing:0!important;color:#c7c1b9!important;margin:0!important;padding:0!important}\nbody.page-id-9606 #bt-reservation-native .bt-reservation-kicker{font:500 12px\/1.5 \"Oswald\",sans-serif!important;letter-spacing:.12em!important;color:#c27a50!important;margin-bottom:7px!important}\nbody.page-id-9606 #bt-reservation-native h2{font:500 clamp(28px,3vw,38px)\/1.15 \"Oswald\",sans-serif!important;letter-spacing:0!important;color:#ebebeb!important;padding:0!important;margin:0 0 14px!important}\nbody.page-id-9606 #bt-reservation-native .bt-reservation-intro{margin-bottom:24px!important}\nbody.page-id-9606 #bt-reservation-native form.et_pb_contact_form{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:16px 22px!important;margin:0!important;padding:0!important}\nbody.page-id-9606 #bt-reservation-native .et_pb_contact_field{grid-column:span 1!important;width:100%!important;max-width:100%!important;min-width:0!important;margin:0!important;padding:0!important;float:none!important}\nbody.page-id-9606 #bt-reservation-native .et_pb_contact_field[data-id=\"message\"]{grid-column:1\/-1!important}\nbody.page-id-9606 #bt-reservation-native .et_pb_contact_form_label{display:block!important;position:static!important;width:auto!important;height:auto!important;clip:auto!important;clip-path:none!important;overflow:visible!important;margin:0 0 7px!important;font:400 12px\/1.4 \"Poppins\",sans-serif!important;letter-spacing:.01em!important;text-transform:none!important;color:#d1cbc2!important}\nbody.page-id-9606 #bt-reservation-native :is(input:not([type=\"hidden\"]),select,textarea){display:block!important;box-sizing:border-box!important;width:100%!important;min-width:0!important;min-height:44px!important;border:1px solid #45413d!important;border-radius:6px!important;background:#171717!important;color:#ebebeb!important;font:400 15px\/1.45 \"Poppins\",sans-serif!important;text-transform:none!important;letter-spacing:0!important;padding:11px 13px!important;color-scheme:dark;transition:border-color .4s,background-color .4s!important}\nbody.page-id-9606 #bt-reservation-native textarea{min-height:80px!important;resize:vertical!important}\nbody.page-id-9606 #bt-reservation-native :is(input,select,textarea):focus-visible{outline:1px solid #c27a50!important;outline-offset:2px!important;border-color:#c27a50!important;background:#202020!important}\nbody.page-id-9606 #bt-reservation-native .et_contact_bottom_container{grid-column:1\/-1!important;float:none!important;display:flex!important;justify-content:flex-start!important;align-items:center!important;margin:4px 0 0!important;padding:0!important;width:100%!important;height:auto!important}\nbody.page-id-9606 #bt-reservation-native button.et_pb_contact_submit{font:500 16px\/1.2 \"Oswald\",sans-serif!important;min-height:44px!important;max-width:100%!important;width:auto!important;padding:11px 22px!important;letter-spacing:.02em!important;border:1px solid #c27a50!important;border-radius:999px!important;color:#c27a50!important;background:transparent!important;margin:0!important;transition:color .7s,border-color .7s!important}\nbody.page-id-9606 #bt-reservation-native button.et_pb_contact_submit:after{display:none!important}\nbody.page-id-9606 #bt-reservation-native button.et_pb_contact_submit:is(:hover,:focus-visible){color:#ebebeb!important;border-color:#ebebeb!important}\nbody.page-id-9606 #bt-reservation-native .bt-form-note{font:400 10px\/1.65 \"Poppins\",sans-serif!important;color:#aaa39a!important;margin:16px 0 0!important;padding:0!important}\nbody.page-id-9606 #bt-reservation-native .bt-form-note a{color:#c8b297!important}\nbody.page-id-9606 #bt-reservation-native .bt-reservation-confirmation{margin-top:14px!important;color:#c7c1b9!important;font-size:12px!important}\nbody.page-id-9606 #bt-reservation-native .et-pb-contact-message{font:400 14px\/1.7 \"Poppins\",sans-serif!important;color:#ebebeb!important;text-transform:none!important}\n@media(max-width:767px){\nbody.page-id-9606 #bt-reservation-modal{padding:68px 16px 18px!important}\nbody.page-id-9606 #bt-reservation-modal .bt-reservation-tool{width:100%!important;padding:25px 21px!important;max-height:calc(100dvh - 90px)!important}\nbody.page-id-9606 #bt-reservation-native form.et_pb_contact_form{gap:16px!important}\nbody.page-id-9606 #bt-reservation-native .et_pb_contact_field{grid-column:1\/-1!important}\nbody.page-id-9606 #bt-reservation-native h2{font-size:29px!important}\n}\n@media(prefers-reduced-motion:reduce){body.page-id-9606 #bt-reservation-native *{transition:none!important}}\n\nbody.page-id-9606 #page-container #kontakt #kontakt1>.et_pb_column>.et_pb_text:nth-child(4){translate:0 var(--bt-contact-pay-shift,0px)!important}\nbody.page-id-9606 #bt-reservation-native .bt-reservation-intro span,body.page-id-9606 #bt-reservation-native .bt-reservation-confirmation span,body.page-id-9606 #bt-reservation-native .bt-form-note a{text-transform:none!important;font-weight:400!important;letter-spacing:0!important}\nbody.page-id-9606 #bt-reservation-native .et_pb_contact_main_title:empty{display:none!important}\nbody.page-id-9606 #bt-reservation-native .et_pb_contact{padding:0!important;margin:0!important}\nbody.page-id-9606 #bt-reservation-native .et-pb-contact-message:empty{display:none!important}\nbody.page-id-9606 #bt-reservation-native form .et_pb_contact_form_label{padding:0!important;margin:0 0 7px!important}\n\nbody.page-id-9606 #bt-reservation-native>.et_pb_row>.et_pb_column{display:block!important}\nbody.page-id-9606 #bt-reservation-native .bt-reservation-intro{margin-bottom:20px!important}\n\n@media(min-width:768px) and (max-width:1180px) and (max-height:850px){\nbody.page-id-9606 #page-container #kontakt #kontakt1>.et_pb_column:first-child{row-gap:16px!important}\nbody.page-id-9606 #page-container #kontakt h2{font-size:28px!important;line-height:1.12!important;padding-bottom:7px!important}\nbody.page-id-9606 #page-container #kontakt h5{font-size:19px!important;line-height:1.24!important}\nbody.page-id-9606 #page-container #kontakt .bt-live-opening-hours{margin-top:10px!important}\nbody.page-id-9606 #page-container #kontakt .bt-live-contact-times p{font-size:12px!important;line-height:1.4!important;margin-top:5px!important}\nbody.page-id-9606 #page-container #kontakt h5.h5-button{font-size:15px!important}\nbody.page-id-9606 #page-container #kontakt .bt-contact-hours-phone{font-size:19px!important;line-height:1.24!important;margin-bottom:10px!important}\nbody.page-id-9606 #page-container #kontakt .bt-contact-reservation-original{font-size:14px!important;line-height:1.5!important}\n}\n@media(min-width:981px) and (max-width:1180px){\nbody.page-id-9606 #page-container #footer>.et_pb_row:first-child{display:grid!important;grid-template-columns:minmax(0,1fr) 110px minmax(0,1.4fr)!important;gap:24px!important;align-items:center!important}\nbody.page-id-9606 #page-container #footer>.et_pb_row:first-child>.et_pb_column{width:100%!important;min-width:0!important;margin:0!important}\nbody.page-id-9606 #page-container #footer>.et_pb_row:first-child>.et_pb_column:first-child{display:flex!important;align-items:center!important;justify-content:flex-start!important;gap:16px!important}\nbody.page-id-9606 #page-container #footer>.et_pb_row:first-child>.et_pb_column:first-child>.et_pb_text:nth-child(2){width:44px!important;max-width:44px!important;flex:0 0 44px!important;margin:0!important;transform:none!important;translate:none!important}\nbody.page-id-9606 #page-container #footer>.et_pb_row:first-child>.et_pb_column:first-child>.et_pb_text:nth-child(2) img{width:44px!important;height:44px!important;object-fit:contain!important}\nbody.page-id-9606 #page-container #footer .social-footer-logos{gap:12px!important}\nbody.page-id-9606 #page-container #footer .social-footer-logos .bt-footer-social-title{font-size:13px!important;margin:0!important}\n}\n\n\n\/* TAUSEND \u00b7 Formularverfeinerung nach Sasha 19.10.2026 16:12 *\/\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"]{--bt-form-accent:#ea0b5f!important}\nhtml body.page-id-9606:not(.et-fb).bt-reserve-cantina-accent :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"]{--bt-form-accent:#c27a50!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mail-form{display:flex!important;position:fixed!important;inset:0!important;width:100%!important;height:100dvh!important;max-height:none!important;margin:0!important;padding:32px 24px!important;z-index:999999!important;align-items:flex-start!important;justify-content:center!important;overflow:auto!important;overscroll-behavior:contain;box-sizing:border-box!important;transform:none!important;opacity:0;visibility:hidden;pointer-events:none;background:rgba(0,0,0,.7)!important;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);transition:opacity .55s ease,visibility 0s linear .55s!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mail-form.bt-mf-open{opacity:1;visibility:visible;pointer-events:auto;transition:opacity .55s ease,visibility 0s!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mail-form>.et_pb_row,html body.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready .bt-reservation-tool{width:100%!important;max-width:640px!important;box-sizing:border-box!important;padding:32px 36px 28px!important;background:rgba(14,14,14,.97)!important;border:1px solid #ffffff1c!important;border-radius:14px!important;box-shadow:0 20px 80px #0006!important;margin:auto!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mail-form>.et_pb_row{position:relative!important;flex-shrink:0!important;animation:none!important;transform:translateY(10px)!important;transition:transform .65s cubic-bezier(.22,.61,.36,1)!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mail-form.bt-mf-open>.et_pb_row{transform:translateY(0)!important}\nhtml body.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready{display:grid!important;grid-template-columns:minmax(0,640px)!important;grid-template-rows:max-content!important;align-content:safe center!important;justify-content:center!important;padding:32px 24px!important;box-sizing:border-box!important;background:rgba(0,0,0,.7)!important;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);transition:opacity .55s ease,visibility 0s linear .55s!important}\nhtml body.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready.is-open{transition:opacity .55s ease,visibility 0s!important}\nhtml body.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready .bt-reservation-tool{grid-area:1\/1!important;max-height:calc(100dvh - 64px)!important;overflow:auto!important;margin:0!important;transform:translateY(10px)!important;transition:transform .65s cubic-bezier(.22,.61,.36,1)!important}\nhtml body.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready.is-open .bt-reservation-tool{transform:translateY(0)!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] :is(h2,h3){font-size:25px!important;line-height:1.2!important;font-weight:400!important;letter-spacing:.015em!important;color:#dedbd6!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mf-open .et_pb_column{gap:20px!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container form.et_pb_contact_form{gap:14px 24px!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container .et_pb_contact_form_label{font:400 11px\/1.5 \"Poppins\",sans-serif!important;letter-spacing:.015em!important;color:#c0bbb5!important;margin-bottom:5px!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container .input{box-sizing:border-box!important;min-height:44px!important;height:44px;padding:10px 13px!important;border:1px solid #ffffff24!important;border-radius:8px!important;background:rgba(255,255,255,.018)!important;box-shadow:none!important;color:#e4e1dc!important;font:400 15px\/1.5 \"Poppins\",sans-serif!important;transition:border-color .6s ease,background-color .6s ease!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container .input:hover{border-color:#ffffff48!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container .input:focus{background:rgba(255,255,255,.035)!important;border-color:var(--bt-form-accent)!important;outline:none!important;box-shadow:none!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container .input:focus-visible{outline:1px solid var(--bt-form-accent)!important;outline-offset:2px!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container textarea.input{height:68px;min-height:68px!important;max-height:220px!important;resize:vertical!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container .et_contact_bottom_container{width:100%!important;display:flex!important;justify-content:flex-end!important;align-items:center!important;margin:4px 0 0!important;padding:0!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container button.et_pb_contact_submit{min-height:44px!important;padding:10px 20px!important;border:1px solid var(--bt-form-accent)!important;border-radius:8px!important;background:transparent!important;color:var(--bt-form-accent)!important;font:400 14px\/1.4 \"Oswald\",sans-serif!important;letter-spacing:.045em!important;margin:0!important;transition:color .7s ease,border-color .7s ease,background-color .7s ease!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container button.et_pb_contact_submit:hover{background:rgba(255,255,255,.025)!important;color:#e4e1dc!important;border-color:#e4e1dc!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container button.et_pb_contact_submit:focus-visible{outline:1px solid var(--bt-form-accent)!important;outline-offset:3px!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] :is(.bt-mf-close,.bt-reservation-close){width:44px!important;height:44px!important;min-height:44px!important;border:0!important;border-radius:8px!important;background:transparent!important;color:#aaa49c!important;font-size:22px!important;transition:color .7s ease!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] :is(.bt-mf-close,.bt-reservation-close):hover{background:transparent!important;color:#e4e1dc!important;border:0!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .bt-mf-close{top:10px!important;right:10px!important}\nhtml body.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready>button.bt-reservation-close{grid-area:1\/1!important;position:relative!important;inset:auto!important;align-self:start!important;justify-self:end!important;margin:9px!important;z-index:2!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] :is(.bt-form-note,.bt-form-note *){font:400 10px\/1.65 \"Poppins\",sans-serif!important;color:#99948e!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .bt-form-note{margin-top:16px!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .bt-form-note a{color:#bdb7ae!important;transition:color .7s ease!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .bt-form-note a:hover,html body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .bt-form-note a:focus-visible{color:var(--bt-form-accent)!important}\nhtml body.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native .bt-reservation-kicker{color:var(--bt-form-accent)!important;font:400 10px\/1.5 \"Poppins\",sans-serif!important;letter-spacing:.14em!important;margin-bottom:9px!important;padding-right:24px!important}\nhtml body.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native h2{font-size:25px!important;font-weight:400!important;line-height:1.2!important;letter-spacing:.015em!important;color:#dedbd6!important;margin-bottom:12px!important;padding-right:14px!important}\nhtml body.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native .bt-reservation-intro{font-size:12px!important;line-height:1.7!important;margin-bottom:18px!important;color:#bcb8b2!important}\nhtml body.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native .bt-reservation-confirmation{font-size:10px!important;margin-top:8px!important;line-height:1.65!important;color:#99948e!important}\n@media(max-width:600px){\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mail-form,html body.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready{padding:16px!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mail-form>.et_pb_row,html body.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready .bt-reservation-tool{padding:28px 22px 24px!important;border-radius:12px!important}\nhtml body.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready .bt-reservation-tool{max-height:calc(100dvh - 32px)!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container form.et_pb_contact_form{grid-template-columns:1fr!important;gap:13px!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_field{grid-column:1\/-1!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] :is(h2,h3),html body.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native h2{font-size:23px!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container .input{font-size:16px!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container button.et_pb_contact_submit{width:100%!important}\n}\n@media(prefers-reduced-motion:reduce){html body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"],html body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] *{transition:none!important;animation:none!important}}\n@media(forced-colors:active){html body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container .input{border:1px solid FieldText!important;background:Field!important;color:FieldText!important}html body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container button.et_pb_contact_submit{border-color:ButtonText!important;color:ButtonText!important}}\n\n\/* Gleiche Innenkante: Divis 90%-Spalte im Dialog vollst\u00e4ndig f\u00fcllen. *\/\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mail-form>.et_pb_row{display:block!important}\nhtml body.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mail-form>.et_pb_row>.et_pb_column{width:100%!important;max-width:100%!important;flex-basis:auto!important;margin:0!important;display:flex!important;flex-direction:column!important;align-items:stretch!important;gap:20px!important}\n\/* Sasha \u00b7 schmale, ruhige Formulare \u00b7 19.10.2026 *\/\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mail-form{background:rgba(0,0,0,.78)!important;backdrop-filter:blur(8px)!important;-webkit-backdrop-filter:blur(8px)!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mail-form>.et_pb_row,html body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready .bt-reservation-tool{max-width:580px!important;padding:32px!important;border:1px solid #ffffff20!important;border-radius:18px!important;background:#131313!important;box-shadow:0 24px 80px #0008!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready{grid-template-columns:minmax(0,580px)!important;background:rgba(0,0,0,.78)!important;backdrop-filter:blur(8px)!important;-webkit-backdrop-filter:blur(8px)!important;--bt-form-accent:#c27a50!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] :is(h2,h3),html body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native h2{font:400 24px\/1.25 \"Oswald\",sans-serif!important;letter-spacing:0!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container form.et_pb_contact_form{gap:18px 24px!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container .et_pb_contact_form_label{font:400 12px\/1.5 \"Poppins\",sans-serif!important;color:#c5c0b9!important;letter-spacing:0!important;margin-bottom:4px!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container .input{height:42px;min-height:42px!important;padding:8px 0!important;border:0!important;border-bottom:1px solid #ffffff40!important;border-radius:0!important;background:transparent!important;box-shadow:none!important;color:#eeeae4!important;color-scheme:dark}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container .input:hover{border-bottom-color:#ffffff80!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container .input:is(:focus,:focus-visible){border:0!important;border-bottom:2px solid var(--bt-form-accent)!important;outline:none!important;box-shadow:none!important;background:transparent!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container textarea.input{height:76px;min-height:76px!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container button.et_pb_contact_submit{min-height:44px!important;border-radius:999px!important;padding:0 22px!important;font:400 14px\/1 \"Oswald\",sans-serif!important;letter-spacing:.035em!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .bt-form-note{font-size:12px!important;line-height:1.9!important;color:#b9b3ab!important;margin-top:26px!important;padding:0!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal .bt-reservation-kicker{color:#c27a50!important;letter-spacing:.11em!important}\nhtml body.page-id-9606 #page-container #kontakt #kontakt1>div.et_pb_column:first-child>div.et_pb_text:nth-child(3){padding-top:0!important;align-self:start!important}\n@media(max-width:767px){html body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mail-form>.et_pb_row,html body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready .bt-reservation-tool{padding:28px 24px!important}html body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container .input{font-size:16px!important}}\n@media(forced-colors:active){html body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container .input:focus-visible{outline:2px solid Highlight!important;outline-offset:2px!important}}\n\n\n\/* Sasha 19.10.19:48 \u00b7 luftige Formulare, gemeinsamer dezenter Aufbau *\/\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mail-form>.et_pb_row, html body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready .bt-reservation-tool{max-width:680px!important;padding:40px 44px!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready{grid-template-columns:minmax(0,680px)!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container form.et_pb_contact_form{gap:26px 32px!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container .et_pb_contact_form_label{margin-bottom:8px!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container .input{height:44px;min-height:44px!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container textarea.input{height:88px;min-height:88px!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native .bt-reservation-kicker{margin-bottom:12px!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native h2{margin-bottom:16px!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native .bt-reservation-intro{margin-bottom:26px!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_contact_bottom_container{margin-top:8px!important}\n@keyframes btFormSoftBuild{from{opacity:0;transform:translate3d(0,8px,0)}to{opacity:1;transform:translate3d(0,0,0)}}\n@keyframes btContentSoftBuild{from{opacity:0;translate:0 8px}to{opacity:1;translate:0 0}}\n@media(prefers-reduced-motion:no-preference){\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.is-open #bt-reservation-native .et_pb_text,\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mf-open>.et_pb_row>.et_pb_column>.et_pb_text{animation:btFormSoftBuild .65s cubic-bezier(.22,.61,.36,1) both!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.is-open .et_pb_contact_field,\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mf-open .et_pb_contact_field{animation:btFormSoftBuild .6s cubic-bezier(.22,.61,.36,1) both!important;animation-delay:80ms!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.is-open .et_pb_contact_field:nth-child(n+3),\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mf-open .et_pb_contact_field:nth-child(n+3){animation-delay:140ms!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.is-open .et_pb_contact_field:nth-child(n+5),\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mf-open .et_pb_contact_field:nth-child(n+5){animation-delay:200ms!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.is-open .et_pb_contact_field:nth-child(n+7),\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mf-open .et_pb_contact_field:nth-child(n+7){animation-delay:260ms!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.is-open :is(.et_contact_bottom_container,.bt-form-note),\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mf-open :is(.et_contact_bottom_container,.bt-form-note){animation:btFormSoftBuild .6s cubic-bezier(.22,.61,.36,1) 300ms both!important}\n\/* Vorhandene Divi-Sichtbarkeit steuert den Aufbau, keine neue Scrollschleife. *\/\nbody.page-id-9606:not(.et-fb) #page-container .et_pb_section:not(#home):not(#musik) .et_animated{animation-name:btContentSoftBuild!important;animation-duration:.8s!important;animation-timing-function:cubic-bezier(.22,.61,.36,1)!important}\nbody.page-id-9606:not(.et-fb) #page-container #kontakt #kontakt1 .et_pb_text.et_animated>.et_pb_text_inner{animation:btContentSoftBuild .8s cubic-bezier(.22,.61,.36,1) both!important}\n}\n@media(max-width:767px){html body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"].bt-mail-form>.et_pb_row, html body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready .bt-reservation-tool{padding:32px 24px!important}html body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container form.et_pb_contact_form{gap:24px!important}}\n@media(prefers-reduced-motion:reduce){html body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"],html body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] *,body.page-id-9606 #page-container #kontakt #kontakt1 .et_pb_text>.et_pb_text_inner{animation:none!important;transition:none!important;translate:none!important}}\n\n\/* Sasha19.10.23:03 \u00b7 Akzent am Schlie\u00dfen und echte Seitenscrollsperre bei Formularen. *\/\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] :is(.bt-mf-close,.bt-reservation-close){color:var(--bt-form-accent,#ea0b5f)!important;transition:color .7s ease!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found,#bt-newsletter-details,#bt-reservation-modal)[role=\"dialog\"] :is(.bt-mf-close,.bt-reservation-close):is(:hover,:focus-visible){color:#fff!important}\nhtml:has(body.page-id-9606:not(.et-fb) .bt-mail-form.bt-mf-open),\nhtml.bt-reservation-is-open:has(body.page-id-9606:not(.et-fb)),\nbody.page-id-9606:not(.et-fb):has(.bt-mail-form.bt-mf-open),\nbody.page-id-9606:not(.et-fb):has(#bt-reservation-modal.is-open){overflow:hidden!important;overscroll-behavior:none!important}\nbody.page-id-9606:not(.et-fb) :is(.bt-mail-form.bt-mf-open,#bt-reservation-modal.is-open){overflow-y:auto!important;overscroll-behavior:contain!important}\n\n}<\/style>\n<style id=\"bt-v4-cantina-native-phone\">\nbody:not(.et-fb) #cantina .et_pb_code{display:none!important}\n@media(max-width:767px){\nbody.page-id-9606 #cantina,body.page-id-9606 #cantina-chef,body.page-id-9606 #cantina-menu{position:relative!important;inset:auto!important;transform:none!important;height:auto!important;min-height:0!important;overflow:visible!important}\nbody.page-id-9606 #cantina-chef .bt-eva-v10,body.page-id-9606 #cantina-chef .bt-eva-v10 img{position:relative!important;opacity:1!important;visibility:visible!important;clip-path:none!important;transform:none!important}\nbody.page-id-9606 #cantina-chef .bt-eva-v10 canvas{display:none!important}\nbody.page-id-9606 #bt-v4-phone-reserve{position:fixed;right:18px;bottom:calc(24px + env(safe-area-inset-bottom,0px));z-index:99999;transition:opacity .25s ease;opacity:0;visibility:hidden;pointer-events:none}\nbody.page-id-9606 #bt-v4-phone-reserve.is-visible{opacity:1;visibility:visible;pointer-events:auto}\nbody.page-id-9606 #bt-v4-phone-reserve button{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:auto;max-width:calc(100vw - 36px);min-height:44px;padding:10px 20px;border:1px solid #c27a50;border-radius:999px;background:#111;color:#c27a50;font:400 17px\/1.2 Oswald,sans-serif;text-transform:uppercase;white-space:nowrap;cursor:pointer}\nbody.page-id-9606 #bt-v4-phone-reserve button:focus-visible{outline:2px solid #fff;outline-offset:3px}\n}\n<\/style>\n<script id=\"bt-v4-cantina-native-phone-script\">\n(function(){\n'use strict';\nif(!matchMedia('(max-width:767px)').matches||document.body.classList.contains('et-fb'))return;\nfunction init(){\n var source=document.querySelector('#cantina .cantina-reservation-button');\n if(!source||document.getElementById('bt-v4-phone-reserve'))return;\n var en=\/^en\/i.test(document.documentElement.lang),dock=document.createElement('div'),button=document.createElement('button');\n dock.id='bt-v4-phone-reserve';button.type='button';button.textContent=en?'Reserve':'Reservieren';\n button.setAttribute('aria-label',en?'Reserve a table at Tausend Cantina':'Tisch in der Tausend Cantina reservieren');\n button.setAttribute('aria-haspopup','dialog');button.setAttribute('aria-controls','bt-reservation-modal');button.className='btcg2-reserve';\n button.addEventListener('click',function(){source.click();});\n dock.appendChild(button);document.body.appendChild(dock);\n function show(on){dock.classList.toggle('is-visible',on);dock.inert=!on;dock.setAttribute('aria-hidden',String(!on));}\n var pressReached=false;\n function applyTone(){document.body.classList.toggle('bt-phone-cantina-visible',cantinaActive.size>0&&!pressReached);}\n var cantinaActive=new Set(),cantinaSections=document.querySelectorAll('#banner-cantina,#cantina,#cantina-chef,#cantina-menu,#speisekarte,#cantina-koch,#art');\n if('IntersectionObserver' in window){var cantinaObserver=new IntersectionObserver(function(entries){entries.forEach(function(entry){if(entry.isIntersecting)cantinaActive.add(entry.target);else cantinaActive.delete(entry.target);});applyTone();},{rootMargin:'-35% 0px -35% 0px',threshold:0});cantinaSections.forEach(function(section){cantinaObserver.observe(section);});}\n var press=document.getElementById('presse');\n if(press&&'IntersectionObserver' in window)new IntersectionObserver(function(entries){var entry=entries[0];pressReached=entry.isIntersecting||entry.boundingClientRect.top<0;applyTone();},{threshold:0}).observe(press);\n var about=document.getElementById('about'),visibilityFrame=0;\n var updateFooter=window.btCreateReserveFooterGlide(dock,document.getElementById('footer'));\n function refreshVisibility(){\n  visibilityFrame=0;\n  var music=document.getElementById('musik'),musicRect=music&&music.getBoundingClientRect();\n  var inMusic=!!(musicRect&&musicRect.height>0&&musicRect.top<innerHeight&&musicRect.bottom>0);\n  updateFooter();\n  show(window.btReserveAreaVisible());\n }\n function requestVisibility(){if(!visibilityFrame)visibilityFrame=requestAnimationFrame(refreshVisibility);}\n window.addEventListener('scroll',requestVisibility,{passive:true});window.addEventListener('resize',requestVisibility,{passive:true});refreshVisibility();\n}\nif(document.readyState==='loading')document.addEventListener('DOMContentLoaded',init,{once:true});else init();\n})();\n<\/script><style id=\"bt-v4-mobile-cantina-popup\">@media(max-width:767px){\n\/* =========================================================\n   CANTINA \u00b7 RESERVIERUNGSBUTTON\n========================================================= *\/\n\n.cantina-reservation-wrap {\n  margin:17px 0 0 !important;\n  padding:0 !important;\n  line-height:0 !important;\n}\n\n#cantina .cantina-reservation-button {\n  display:inline-flex !important;\n  align-items:center !important;\n  justify-content:center !important;\n\n  box-sizing:border-box !important;\n\n  width:auto !important;\n  min-width:0 !important;\n  height:auto !important;\n\n  margin:0 !important;\n  padding:12px 20px 13px !important;\n\n  border:1px solid rgba(234, 11, 95, .9) !important;\n  border-radius:999px !important;\n\n  background:rgba(5, 5, 5, .24) !important;\n\n  -webkit-backdrop-filter:\n    blur(7px)\n    saturate(115%);\n  backdrop-filter:\n    blur(7px)\n    saturate(115%);\n\n  color:#ea0b5f !important;\n\n  font-family:Oswald, sans-serif !important;\n  font-size:19px !important;\n  font-weight:900 !important;\n  line-height:1 !important;\n  letter-spacing:0 !important;\n  text-transform:uppercase !important;\n  white-space:nowrap !important;\n\n  box-shadow:\n    0 5px 18px rgba(0, 0, 0, .12) !important;\n\n  cursor:pointer !important;\n\n  transition:\n    color 700ms ease,\n    background-color 700ms ease,\n    border-color 700ms ease,\n    box-shadow 700ms ease !important;\n}\n\n#cantina .cantina-reservation-button:hover,\n#cantina .cantina-reservation-button:focus-visible {\n  color:#ffffff !important;\n  background:rgba(234, 11, 95, .15) !important;\n  border-color:#ea0b5f !important;\n\n  box-shadow:\n    0 7px 24px rgba(0, 0, 0, .2),\n    inset 0 0 18px rgba(234, 11, 95, .06) !important;\n}\n\n\n\/* =========================================================\n   CANTINA \u00b7 RESERVIERUNGSFENSTER\n========================================================= *\/\n\n#bt-reservation-modal {\n  position:fixed !important;\n  inset:0 !important;\n\n  width:100vw !important;\n  height:100vh !important;\n  height:100dvh !important;\n\n  z-index:2147483646 !important;\n\n  display:grid !important;\n  place-items:center !important;\n\n  box-sizing:border-box !important;\n  padding:70px 22px 25px !important;\n\n  background:rgba(0, 0, 0, 0) !important;\n\n  -webkit-backdrop-filter:\n    blur(0)\n    brightness(1);\n  backdrop-filter:\n    blur(0)\n    brightness(1);\n\n  opacity:0 !important;\n  visibility:hidden !important;\n  pointer-events:none !important;\n\n  transition:\n    opacity 550ms ease,\n    background-color 550ms ease,\n    backdrop-filter 550ms ease,\n    visibility 0s linear 550ms !important;\n}\n\n#bt-reservation-modal.is-open {\n  background:rgba(0, 0, 0, .52) !important;\n\n  -webkit-backdrop-filter:\n    blur(14px)\n    brightness(.78);\n  backdrop-filter:\n    blur(14px)\n    brightness(.78);\n\n  opacity:1 !important;\n  visibility:visible !important;\n  pointer-events:auto !important;\n\n  transition:\n    opacity 550ms ease,\n    background-color 550ms ease,\n    backdrop-filter 550ms ease,\n    visibility 0s !important;\n}\n\n\n\/* Schlie\u00dfen-X *\/\n\n#bt-reservation-modal .bt-reservation-close {\n  appearance:none !important;\n  -webkit-appearance:none !important;\n\n  position:absolute !important;\n  top:22px !important;\n  right:22px !important;\n\n  z-index:10 !important;\n\n  display:grid !important;\n  place-items:center !important;\n\n  width:38px !important;\n  height:38px !important;\n  min-width:38px !important;\n  min-height:38px !important;\n\n  margin:0 !important;\n  padding:0 0 2px !important;\n\n  border:1px solid rgba(255, 255, 255, .46) !important;\n  border-radius:50% !important;\n\n  background:rgba(8, 8, 8, .48) !important;\n\n  color:#ffffff !important;\n\n  font-family:Arial, sans-serif !important;\n  font-size:25px !important;\n  font-weight:300 !important;\n  line-height:1 !important;\n\n  cursor:pointer !important;\n\n  transition:\n    color 500ms ease,\n    border-color 500ms ease,\n    background-color 500ms ease !important;\n}\n\n#bt-reservation-modal .bt-reservation-close::before,\n#bt-reservation-modal .bt-reservation-close::after {\n  display:none !important;\n  content:none !important;\n}\n\n#bt-reservation-modal .bt-reservation-close:hover {\n  color:#ea0b5f !important;\n  border-color:#ea0b5f !important;\n  background:rgba(8, 8, 8, .75) !important;\n}\n\n\n\/* Mittiges Reservierungsfeld *\/\n\n#bt-reservation-modal .bt-reservation-tool {\n  width:min(600px, calc(100vw - 34px)) !important;\n  max-height:calc(100dvh - 100px) !important;\n\n  box-sizing:border-box !important;\n  overflow:auto !important;\n\n  padding:32px !important;\n\n  border:1px solid rgba(255, 255, 255, .14) !important;\n  border-radius:20px !important;\n\n  background:rgba(13, 13, 13, .78) !important;\n\n  -webkit-backdrop-filter:\n    blur(22px)\n    saturate(110%);\n  backdrop-filter:\n    blur(22px)\n    saturate(110%);\n\n  box-shadow:\n    0 30px 90px rgba(0, 0, 0, .52) !important;\n\n  opacity:0 !important;\n\n  transform:\n    translateY(18px)\n    scale(.98) !important;\n\n  transition:\n    opacity 500ms ease,\n    transform 650ms cubic-bezier(.22, .61, .36, 1) !important;\n}\n\n#bt-reservation-modal.is-open\n.bt-reservation-tool {\n  opacity:1 !important;\n\n  transform:\n    translateY(0)\n    scale(1) !important;\n}\n\n\n\/* OpenTable-Vorschau *\/\n\n#bt-reservation-modal .bt-ot-brand {\n  display:flex !important;\n  align-items:center !important;\n  justify-content:center !important;\n  gap:8px !important;\n\n  margin:0 0 22px !important;\n\n  color:rgba(255, 255, 255, .72) !important;\n\n  font-family:Poppins, sans-serif !important;\n  font-size:11px !important;\n  font-weight:500 !important;\n  line-height:1 !important;\n}\n\n#bt-reservation-modal .bt-ot-dot {\n  width:9px !important;\n  height:9px !important;\n\n  border-radius:50% !important;\n  background:#ea0b5f !important;\n\n  box-shadow:\n    0 0 13px rgba(234, 11, 95, .65) !important;\n}\n\n#bt-reservation-modal .bt-ot-title {\n  margin:0 0 28px !important;\n  padding:0 !important;\n\n  color:#ffffff !important;\n\n  font-family:Oswald, sans-serif !important;\n  font-size:33px !important;\n  font-weight:700 !important;\n  line-height:1 !important;\n  text-align:center !important;\n}\n\n#bt-reservation-modal .bt-ot-fields {\n  display:grid !important;\n  grid-template-columns:repeat(3, minmax(0, 1fr)) !important;\n\n  gap:1px !important;\n\n  overflow:hidden !important;\n\n  border:1px solid rgba(255, 255, 255, .12) !important;\n  border-radius:13px !important;\n\n  background:rgba(255, 255, 255, .12) !important;\n}\n\n#bt-reservation-modal .bt-ot-field {\n  box-sizing:border-box !important;\n  padding:14px 15px !important;\n\n  background:rgba(0, 0, 0, .34) !important;\n}\n\n#bt-reservation-modal .bt-ot-label {\n  display:block !important;\n\n  margin:0 0 6px !important;\n\n  color:rgba(255, 255, 255, .44) !important;\n\n  font-family:Poppins, sans-serif !important;\n  font-size:8px !important;\n  font-weight:500 !important;\n  line-height:1 !important;\n  letter-spacing:.13em !important;\n}\n\n#bt-reservation-modal .bt-ot-value {\n  display:block !important;\n\n  color:#ffffff !important;\n\n  font-family:Poppins, sans-serif !important;\n  font-size:13px !important;\n  font-weight:400 !important;\n  line-height:1.25 !important;\n  white-space:nowrap !important;\n}\n\n#bt-reservation-modal .bt-ot-find {\n  display:flex !important;\n  align-items:center !important;\n  justify-content:center !important;\n\n  width:100% !important;\n  box-sizing:border-box !important;\n\n  margin:14px 0 0 !important;\n  padding:13px 20px 14px !important;\n\n  border:1px solid #ea0b5f !important;\n  border-radius:999px !important;\n\n  background:#ea0b5f !important;\n  color:#ffffff !important;\n\n  font-family:Oswald, sans-serif !important;\n  font-size:17px !important;\n  font-weight:700 !important;\n  line-height:1 !important;\n  text-align:center !important;\n}\n\n#bt-reservation-modal .bt-ot-note {\n  margin:15px 0 0 !important;\n  padding:0 !important;\n\n  color:rgba(255, 255, 255, .42) !important;\n\n  font-family:Poppins, sans-serif !important;\n  font-size:9px !important;\n  line-height:1.45 !important;\n  text-align:center !important;\n}\n\n\n\/* Sp\u00e4teres echtes OpenTable *\/\n\n#bt-opentable-widget iframe {\n  display:block !important;\n\n  width:100% !important;\n  min-height:430px !important;\n\n  border:0 !important;\n  border-radius:14px !important;\n\n  background:#ffffff !important;\n}\n\n\n@media (max-width:600px) {\n  #bt-reservation-modal {\n    padding:\n      68px\n      15px\n      18px !important;\n  }\n\n  #bt-reservation-modal .bt-reservation-close {\n    top:16px !important;\n    right:16px !important;\n  }\n\n  #bt-reservation-modal .bt-reservation-tool {\n    width:100% !important;\n    padding:25px 18px 21px !important;\n    border-radius:17px !important;\n  }\n\n  #bt-reservation-modal .bt-ot-title {\n    font-size:28px !important;\n  }\n\n  #bt-reservation-modal .bt-ot-fields {\n    grid-template-columns:1fr !important;\n  }\n}\n\n\n\/* Native Reservierungsquelle bleibt im Builder vollst\u00e4ndig bearbeitbar. *\/\nbody.page-id-9606:not(.et-fb) #page-container #bt-reservation-native{display:none!important}\nbody.page-id-9606 #bt-reservation-modal .bt-reservation-tool{width:min(760px,calc(100vw - 40px))!important;padding:30px 34px!important;border-radius:14px!important;background:rgba(13,13,13,.92)!important}\nbody.page-id-9606 #bt-reservation-modal.is-open .bt-reservation-tool{transform:translateY(0) scale(1)!important}\nbody.page-id-9606 #bt-reservation-modal .bt-reservation-tool>#bt-reservation-native{display:block!important;margin:0!important;padding:0!important;background:transparent!important;min-height:0!important;height:auto!important;width:100%!important}\nbody.page-id-9606 #bt-reservation-native>.et_pb_row{width:100%!important;max-width:none!important;margin:0!important;padding:0!important;display:block!important}\nbody.page-id-9606 #bt-reservation-native .et_pb_column{width:100%!important;margin:0!important;padding:0!important;float:none!important}\nbody.page-id-9606 #bt-reservation-native .et_pb_module{margin:0!important;padding:0!important;max-width:none!important;width:100%!important}\nbody.page-id-9606 #bt-reservation-native .bt-res-en{display:none!important}\nhtml[lang^=\"en\"] body.page-id-9606 #bt-reservation-native .bt-res-de{display:none!important}\nhtml[lang^=\"en\"] body.page-id-9606 #bt-reservation-native .bt-res-en{display:inline!important}\nbody.page-id-9606 #bt-reservation-native p{font-family:\"Poppins\",sans-serif!important;font-size:13px!important;font-weight:400!important;line-height:1.65!important;text-transform:none!important;letter-spacing:0!important;color:#c7c1b9!important;margin:0!important;padding:0!important}\nbody.page-id-9606 #bt-reservation-native .bt-reservation-kicker{font:500 12px\/1.5 \"Oswald\",sans-serif!important;letter-spacing:.12em!important;color:#c27a50!important;margin-bottom:7px!important}\nbody.page-id-9606 #bt-reservation-native h2{font:500 clamp(28px,3vw,38px)\/1.15 \"Oswald\",sans-serif!important;letter-spacing:0!important;color:#ebebeb!important;padding:0!important;margin:0 0 14px!important}\nbody.page-id-9606 #bt-reservation-native .bt-reservation-intro{margin-bottom:24px!important}\nbody.page-id-9606 #bt-reservation-native form.et_pb_contact_form{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:16px 22px!important;margin:0!important;padding:0!important}\nbody.page-id-9606 #bt-reservation-native .et_pb_contact_field{grid-column:span 1!important;width:100%!important;max-width:100%!important;min-width:0!important;margin:0!important;padding:0!important;float:none!important}\nbody.page-id-9606 #bt-reservation-native .et_pb_contact_field[data-id=\"message\"]{grid-column:1\/-1!important}\nbody.page-id-9606 #bt-reservation-native .et_pb_contact_form_label{display:block!important;position:static!important;width:auto!important;height:auto!important;clip:auto!important;clip-path:none!important;overflow:visible!important;margin:0 0 7px!important;font:400 12px\/1.4 \"Poppins\",sans-serif!important;letter-spacing:.01em!important;text-transform:none!important;color:#d1cbc2!important}\nbody.page-id-9606 #bt-reservation-native :is(input:not([type=\"hidden\"]),select,textarea){display:block!important;box-sizing:border-box!important;width:100%!important;min-width:0!important;min-height:44px!important;border:1px solid #45413d!important;border-radius:6px!important;background:#171717!important;color:#ebebeb!important;font:400 15px\/1.45 \"Poppins\",sans-serif!important;text-transform:none!important;letter-spacing:0!important;padding:11px 13px!important;color-scheme:dark;transition:border-color .4s,background-color .4s!important}\nbody.page-id-9606 #bt-reservation-native textarea{min-height:80px!important;resize:vertical!important}\nbody.page-id-9606 #bt-reservation-native :is(input,select,textarea):focus-visible{outline:1px solid #c27a50!important;outline-offset:2px!important;border-color:#c27a50!important;background:#202020!important}\nbody.page-id-9606 #bt-reservation-native .et_contact_bottom_container{grid-column:1\/-1!important;float:none!important;display:flex!important;justify-content:flex-start!important;align-items:center!important;margin:4px 0 0!important;padding:0!important;width:100%!important;height:auto!important}\nbody.page-id-9606 #bt-reservation-native button.et_pb_contact_submit{font:500 16px\/1.2 \"Oswald\",sans-serif!important;min-height:44px!important;max-width:100%!important;width:auto!important;padding:11px 22px!important;letter-spacing:.02em!important;border:1px solid #c27a50!important;border-radius:999px!important;color:#c27a50!important;background:transparent!important;margin:0!important;transition:color .7s,border-color .7s!important}\nbody.page-id-9606 #bt-reservation-native button.et_pb_contact_submit:after{display:none!important}\nbody.page-id-9606 #bt-reservation-native button.et_pb_contact_submit:is(:hover,:focus-visible){color:#ebebeb!important;border-color:#ebebeb!important}\nbody.page-id-9606 #bt-reservation-native .bt-form-note{font:400 10px\/1.65 \"Poppins\",sans-serif!important;color:#aaa39a!important;margin:16px 0 0!important;padding:0!important}\nbody.page-id-9606 #bt-reservation-native .bt-form-note a{color:#c8b297!important}\nbody.page-id-9606 #bt-reservation-native .bt-reservation-confirmation{margin-top:14px!important;color:#c7c1b9!important;font-size:12px!important}\nbody.page-id-9606 #bt-reservation-native .et-pb-contact-message{font:400 14px\/1.7 \"Poppins\",sans-serif!important;color:#ebebeb!important;text-transform:none!important}\n@media(max-width:767px){\nbody.page-id-9606 #bt-reservation-modal{padding:68px 16px 18px!important}\nbody.page-id-9606 #bt-reservation-modal .bt-reservation-tool{width:100%!important;padding:25px 21px!important;max-height:calc(100dvh - 90px)!important}\nbody.page-id-9606 #bt-reservation-native form.et_pb_contact_form{gap:16px!important}\nbody.page-id-9606 #bt-reservation-native .et_pb_contact_field{grid-column:1\/-1!important}\nbody.page-id-9606 #bt-reservation-native h2{font-size:29px!important}\n}\n@media(prefers-reduced-motion:reduce){body.page-id-9606 #bt-reservation-native *{transition:none!important}}\n\n\nbody.page-id-9606 #bt-reservation-modal:not(.is-open){display:none!important;backdrop-filter:none!important;-webkit-backdrop-filter:none!important}body.page-id-9606 #bt-reservation-modal.is-open{display:grid!important;backdrop-filter:none!important;-webkit-backdrop-filter:none!important;background:rgba(0,0,0,.85)!important}body.page-id-9606 #bt-reservation-native{display:none!important}body.page-id-9606 #bt-reservation-modal #bt-reservation-native{display:block!important}body.page-id-9606 #bt-reservation-native h2{font:400 25px\/1.2 Oswald,sans-serif!important}body.page-id-9606 #bt-reservation-modal .bt-reservation-tool{margin:0!important;max-height:calc(100dvh - 95px)!important;overflow-y:auto!important;overscroll-behavior:contain}body.page-id-9606 #cantina #bt-reservation-native{display:none!important}}<\/style>\n<!-- TAUSEND \u00b7 CANTINA \u00b7 Textkarte Kupfer V2 \u00b7 21.10.2026 -->\n<style id=\"bt-cantina-textmenu-style\">\n#btcm-menu{--btcm-copper:#c27a50;box-sizing:border-box;width:min(1040px,calc(100vw - 64px));max-width:1040px;max-height:calc(100dvh - 48px);padding:0;margin:auto;border:1px solid rgba(194,122,80,.4);border-radius:12px;background:#191817;color:#ebe7e1;box-shadow:0 35px 110px rgba(0,0,0,.55);overflow:hidden;text-align:left;cursor:auto!important}\n#btcm-menu[open]{display:flex;flex-direction:column}\n#btcm-menu::backdrop{background:rgba(0,0,0,.8);animation:btcm-backdrop-in .36s ease both}\n#btcm-menu.btcm-closing::backdrop{animation:btcm-backdrop-out .22s ease both}\n@keyframes btcm-backdrop-in{from{opacity:0}to{opacity:1}}\n@keyframes btcm-backdrop-out{from{opacity:1}to{opacity:0}}\n#btcm-menu *{box-sizing:border-box;cursor:auto!important;text-shadow:none!important}\n#btcm-menu :is(p,h2,h3,small,span,button){font-family:Poppins,sans-serif!important;font-weight:400!important}\n#btcm-menu .btcm-head{position:relative;display:flex;align-items:center;justify-content:space-between;flex:none;gap:30px;margin:0 40px;padding:30px 64px 25px 0;border-bottom:1px solid rgba(194,122,80,.35)}\n#btcm-menu .btcm-brand{margin:0 0 9px!important;padding:0!important;color:#c27a50!important;font:400 10px\/1.5 Poppins,sans-serif!important;letter-spacing:3px!important;text-transform:uppercase!important}\n#btcm-menu h2{margin:0!important;padding:0!important;color:#ebe7e1!important;font:400 clamp(38px,4.8vw,52px)\/1.08 Oswald,sans-serif!important;letter-spacing:1.5px!important;text-transform:uppercase!important}\n#btcm-menu .btcm-signature{display:block;margin-top:10px;color:#b8afa6!important;font:400 12px\/1.5 Poppins,sans-serif!important;letter-spacing:.7px!important;text-transform:none!important}\n#btcm-menu .btcm-logo{display:block;width:116px!important;height:116px!important;max-width:116px!important;object-fit:contain;margin:0!important;padding:0!important;opacity:.85}\n#btcm-menu .btcm-close{position:absolute;right:-16px;top:16px;display:grid;place-items:center;width:44px;height:44px;margin:0!important;padding:0!important;border:0;border-radius:50%;background:transparent;color:#c27a50!important;font:300 27px\/1 Poppins,sans-serif!important;cursor:pointer!important;transition:color .3s ease,background-color .3s ease}\n#btcm-menu .btcm-close *{cursor:pointer!important}\n#btcm-menu .btcm-close:hover{color:#fff!important;background:rgba(194,122,80,.1)}\n#btcm-menu .btcm-close:focus-visible{outline:1px solid #c27a50;outline-offset:2px}\n#btcm-menu .btcm-body{flex:1 1 auto;min-height:0;padding:8px 40px 10px;overflow:auto;overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:#c27a50 transparent;-webkit-overflow-scrolling:touch}\n#btcm-menu .btcm-body::-webkit-scrollbar{width:3px}\n#btcm-menu .btcm-body::-webkit-scrollbar-thumb{background:#c27a50;border-radius:3px}\n#btcm-menu ul{position:relative;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:repeat(4,auto);grid-auto-flow:column;column-gap:64px;list-style:none!important;margin:0!important;padding:0!important}\n#btcm-menu ul:after{position:absolute;content:'';width:1px;top:24px;bottom:24px;left:50%;background:rgba(194,122,80,.19);pointer-events:none}\n#btcm-menu .btcm-item{display:grid;grid-template-columns:20px minmax(0,1fr) 42px;column-gap:12px;align-content:start;margin:0!important;padding:22px 0!important;border:0;border-bottom:1px solid rgba(235,231,225,.075);list-style:none!important}\n#btcm-menu .btcm-item:nth-child(4),#btcm-menu .btcm-item:nth-child(8){border-bottom:0}\n#btcm-menu .btcm-number{padding-top:3px;color:#c27a50!important;font:400 9px\/1.5 Poppins,sans-serif!important;letter-spacing:1px!important;opacity:.8}\n#btcm-menu h3{margin:0!important;padding:0!important;color:#ebe7e1!important;font:500 13px\/1.65 Poppins,sans-serif!important;letter-spacing:.5px!important;text-transform:uppercase!important}\n#btcm-menu .btcm-details{margin:7px 0 0!important;padding:0!important;color:#aaa39a!important;font:400 10.5px\/1.8 Poppins,sans-serif!important;letter-spacing:.25px!important;text-transform:uppercase!important}\n#btcm-menu .btcm-keys{display:block;margin-top:6px;color:#928a81!important;font:400 9px\/1.4 Poppins,sans-serif!important;letter-spacing:.3px!important}\n#btcm-menu .btcm-price{display:block;padding-top:0;white-space:nowrap;color:#c27a50!important;text-align:right;font:400 19px\/1.3 Oswald,sans-serif!important;letter-spacing:.2px!important}\n#btcm-menu .btcm-price small{display:block;margin-top:4px;color:#aaa39a!important;font:400 9px\/1.4 Poppins,sans-serif!important;letter-spacing:.2px!important;text-transform:none!important}\n#btcm-menu .btcm-foot{display:flex;justify-content:space-between;align-items:center;flex:none;gap:20px;margin:0 40px;padding:16px 0 20px;border-top:1px solid rgba(194,122,80,.35)}\n#btcm-menu .btcm-foot span{color:#aaa39a!important;font:400 9px\/1.6 Poppins,sans-serif!important;letter-spacing:1px!important;text-transform:uppercase!important}\n#btcm-menu .btcm-foot span:last-child{color:#c27a50!important;white-space:nowrap}\nhtml.btcm-open,html.btcm-open body{overflow:hidden!important}\nhtml.btcm-open body{padding-right:var(--btcm-body-padding,0px)!important}\n@media(max-width:767px){\n #btcm-menu{width:calc(100vw - 24px);max-height:calc(100dvh - 24px);border-radius:10px}\n #btcm-menu .btcm-head{margin:0 24px;padding:24px 32px 21px 0;gap:16px}\n #btcm-menu .btcm-brand{font-size:9px!important;letter-spacing:2px!important}\n #btcm-menu .btcm-logo{width:76px!important;height:76px!important;max-width:76px!important}\n #btcm-menu .btcm-close{right:-18px;top:8px}\n #btcm-menu .btcm-signature{font-size:11px!important;margin-top:8px}\n #btcm-menu .btcm-body{padding:3px 24px 4px}\n #btcm-menu ul{display:block}\n #btcm-menu ul:after{display:none}\n #btcm-menu .btcm-item{padding:19px 0!important;grid-template-columns:18px minmax(0,1fr) 40px;column-gap:10px}\n #btcm-menu .btcm-item:nth-child(4){border-bottom:1px solid rgba(235,231,225,.075)}\n #btcm-menu h3{font-size:12px!important;line-height:1.6!important}\n #btcm-menu .btcm-details{font-size:10px!important}\n #btcm-menu .btcm-foot{margin:0 24px;padding:13px 0 16px;gap:16px}\n #btcm-menu .btcm-foot span{font-size:8px!important;letter-spacing:.7px!important}\n}\n@media(prefers-reduced-motion:reduce){#btcm-menu .btcm-close{transition:none}#btcm-menu::backdrop{animation:none!important}}\nbody.et-fb #btcm-menu{display:none!important}\n<\/style>\n<dialog id=\"btcm-menu\" aria-labelledby=\"btcm-title\">\n <header class=\"btcm-head\">\n  <div><p class=\"btcm-brand\">TAUSEND CANTINA<\/p><h2 id=\"btcm-title\">Men\u00fc<\/h2><span class=\"btcm-signature\">by CHEHUB<\/span><\/div>\n  <img loading=\"lazy\" class=\"btcm-logo\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Cantina-CheHub-EvaChe-Logo-04.png\" width=\"116\" height=\"116\" alt=\"CheHub\" decoding=\"async\">\n  <button class=\"btcm-close\" type=\"button\" aria-label=\"Men\u00fc schlie\u00dfen\"><span aria-hidden=\"true\">\u00d7<\/span><\/button>\n <\/header>\n <div class=\"btcm-body\" tabindex=\"0\" aria-label=\"Speisekarte\"><ul lang=\"de\">\n<li class=\"btcm-item\"><span class=\"btcm-number\" aria-hidden=\"true\">01<\/span><div><h3>Auster des Tages<\/h3><small class=\"btcm-keys\">(14)<\/small><\/div><span class=\"btcm-price\">6 \u20ac<small>pro St\u00fcck<\/small><\/span><\/li>\n<li class=\"btcm-item\"><span class=\"btcm-number\" aria-hidden=\"true\">02<\/span><div><h3>Gefrorener Gurkensalat<\/h3><p class=\"btcm-details\">Roter Essig \u00b7 Shiso<\/p><small class=\"btcm-keys\">(11)<\/small><\/div><span class=\"btcm-price\">9 \u20ac<\/span><\/li>\n<li class=\"btcm-item\"><span class=\"btcm-number\" aria-hidden=\"true\">03<\/span><div><h3>Ger\u00f6stete Paprika<\/h3><\/div><span class=\"btcm-price\">9 \u20ac<\/span><\/li>\n<li class=\"btcm-item\"><span class=\"btcm-number\" aria-hidden=\"true\">04<\/span><div><h3>Kristall-Teigtasche mit Garnelen<\/h3><small class=\"btcm-keys\">(1,2,6,11)<\/small><\/div><span class=\"btcm-price\">12 \u20ac<small>pro St\u00fcck<\/small><\/span><\/li>\n<li class=\"btcm-item\"><span class=\"btcm-number\" aria-hidden=\"true\">05<\/span><div><h3>Gef\u00fcllte Kr\u00e4uterseitlinge<\/h3><p class=\"btcm-details\">Gebratene Fr\u00fchlingszwiebel \u00b7 Bambussprossen \u00b7 Schnittlauch\u00f6l<\/p><\/div><span class=\"btcm-price\">12 \u20ac<\/span><\/li>\n<li class=\"btcm-item\"><span class=\"btcm-number\" aria-hidden=\"true\">06<\/span><div><h3>Aubergine<\/h3><p class=\"btcm-details\">Aprikose \u00b7 Soja<\/p><small class=\"btcm-keys\">(6)<\/small><\/div><span class=\"btcm-price\">13 \u20ac<\/span><\/li>\n<li class=\"btcm-item\"><span class=\"btcm-number\" aria-hidden=\"true\">07<\/span><div><h3>Rotgeschmorte Schweinerippchen<\/h3><small class=\"btcm-keys\">(6)<\/small><\/div><span class=\"btcm-price\">15 \u20ac<\/span><\/li>\n<li class=\"btcm-item\"><span class=\"btcm-number\" aria-hidden=\"true\">08<\/span><div><h3>Karamellisierte Birne<\/h3><p class=\"btcm-details\">Tr\u00fcffelnebel<\/p><\/div><span class=\"btcm-price\">12 \u20ac<\/span><\/li>\n <\/ul><\/div>\n <footer class=\"btcm-foot\"><span>Chinese roots. Her own rules.<\/span><span>TAUSEND \u00b7 BERLIN<\/span><\/footer>\n<\/dialog>\n<script id=\"bt-cantina-textmenu-script\">\n(function(d,w){\n 'use strict';\n if(w.__btCantinaTextMenu)return;\n w.__btCantinaTextMenu=true;\n function init(){\n  if(d.body.classList.contains('et-fb'))return;\n  var modal=d.getElementById('btcm-menu');\n  if(!modal||typeof modal.showModal!=='function')return;\n  d.body.appendChild(modal);\n  var closeButton=modal.querySelector('.btcm-close'),lastTrigger=null,closing=false,motion=null;\n  var reduced=w.matchMedia('(prefers-reduced-motion: reduce)');\n  var english=(d.documentElement.lang||'').toLowerCase().indexOf('en')===0;\n  if(english){d.getElementById('btcm-title').textContent='Menu';closeButton.setAttribute('aria-label','Close menu');modal.querySelector('.btcm-body').setAttribute('aria-label','Food menu');}\n  var links=d.querySelectorAll('#cantina a[href=\"#cantina-menu\"],#cantina a[href$=\"\/#cantina-menu\"],#cantina-chef a[href=\"#cantina-menu\"],#cantina-chef a[href$=\"\/#cantina-menu\"]');\n  links.forEach(function(a){a.setAttribute('data-btcm-open','');a.setAttribute('href','#btcm-menu');a.setAttribute('aria-haspopup','dialog');a.setAttribute('aria-controls','btcm-menu');});\n  function open(trigger){\n   if(modal.open||closing)return;\n   var scrollbar=Math.max(0,w.innerWidth-d.documentElement.clientWidth);\n   d.body.style.setProperty('--btcm-body-padding',(parseFloat(w.getComputedStyle(d.body).paddingRight)||0)+scrollbar+'px');\n   lastTrigger=trigger;modal.classList.remove('btcm-closing');modal.showModal();d.documentElement.classList.add('btcm-open');\n   modal.querySelector('.btcm-body').scrollTop=0;\n   closeButton.focus({preventScroll:true});\n   if(!reduced.matches&&modal.animate)motion=modal.animate([{opacity:0,transform:'translateY(12px) scale(.985)'},{opacity:1,transform:'translateY(0) scale(1)'}],{duration:360,easing:'cubic-bezier(.22,.68,.2,1)'});\n  }\n  function finishClose(){\n   modal.close();modal.classList.remove('btcm-closing');d.documentElement.classList.remove('btcm-open');d.body.style.removeProperty('--btcm-body-padding');closing=false;motion=null;\n   if(lastTrigger&&lastTrigger.isConnected)lastTrigger.focus({preventScroll:true});\n  }\n  function close(){\n   if(!modal.open||closing)return;closing=true;\n   var current=w.getComputedStyle(modal),opacity=current.opacity,transform=current.transform;\n   if(motion){motion.cancel();motion=null;}\n   if(reduced.matches||!modal.animate){finishClose();return;}\n   modal.classList.add('btcm-closing');\n   motion=modal.animate([{opacity:opacity,transform:transform},{opacity:0,transform:'translateY(6px)'}],{duration:220,easing:'ease-out'});\n   motion.finished.then(finishClose,finishClose);\n  }\n  w.addEventListener('click',function(e){\n   var trigger=e.target.closest&&e.target.closest('[data-btcm-open],#cantina .cantina-menu-trigger,#cantina-chef .cantina-menu-trigger');\n   if(!trigger)return;\n   e.preventDefault();e.stopImmediatePropagation();open(trigger);\n  },true);\n  w.addEventListener('keydown',function(e){\n   var trigger=e.target.closest&&e.target.closest('[data-btcm-open],#cantina .cantina-menu-trigger,#cantina-chef .cantina-menu-trigger');\n   if(trigger&&(e.key===' '||e.key==='Enter')){e.preventDefault();e.stopImmediatePropagation();open(trigger);}\n  },true);\n  closeButton.addEventListener('click',close);\n  modal.addEventListener('cancel',function(e){e.preventDefault();close();});\n  modal.addEventListener('close',function(){d.documentElement.classList.remove('btcm-open');});\n  modal.addEventListener('click',function(e){if(e.target!==modal)return;var r=modal.getBoundingClientRect();if(e.clientX<r.left||e.clientX>r.right||e.clientY<r.top||e.clientY>r.bottom)close();});\n }\n if(d.readyState==='loading')d.addEventListener('DOMContentLoaded',init,{once:true});else init();\n})(document,window);\n<\/script><\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_145 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_49 et_pb_image et_pb_module et_flex_module bt-cantina-plan-image\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Cantina-BG08-4.png\" alt=\"Grundriss der Tausend Cantina\" width=\"1012\" height=\"1920\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Cantina-BG08-4.png 1012w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Cantina-BG08-4-980x1859.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Cantina-BG08-4-480x911.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1012px, 100vw\" class=\"wp-image-7666\" \/><\/span><\/div>\r\n<div class=\"et_pb_text_110 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module bt-phone-return-module\"><div class=\"et_pb_text_inner\" data-et-mv-hidden-tablet=\"true\" data-et-mv-hidden-phone=\"true\"><p><a href=\"#bar\"><span class=\"bt-returnbar-de\" lang=\"de\"><span class=\"bt-returnbar-arrows\" aria-hidden=\"true\">\u25c1\u25c1\u25c1<\/span> Zur Bar<\/span><span class=\"bt-returnbar-en\" lang=\"en\"><span class=\"bt-returnbar-arrows\" aria-hidden=\"true\">\u25c1\u25c1\u25c1<\/span> To the bar<\/span><\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_146 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_111 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p class=\"bt-cantina-eyebrow\">Ihr Abend in der Cantina<\/p>\n<h2 class=\"bt-cantina-small-title\">Zusammenkommen.<br \/>Zusammen genie\u00dfen.<\/h2>\n<p>Firmendinner, Geburtstag oder ein Abend mit Freunden:<\/p>\n<p>Gemeinsam planen wir Ihr Men\u00fc und den passenden Rahmen.<\/p>\n<p>Die Cantina l\u00e4sst sich auch als separater VIP-, Bar- oder Backstage-Bereich nutzen.<\/p>\n<p><a class=\"bt-cantina-text-link\" href=\"#mail-formular-location-rent-requests\">Location anfragen &#x2197;<\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_56 et_pb_row et_flex_row\" id=\"bt-reservation-native\" data-no-translation=\"true\" data-no-dynamic-translation=\"true\">\r\n<div class=\"et_pb_column_147 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\">\r\n<div class=\"et_pb_text_112 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><p class=\"bt-reservation-kicker\">CANTINA by CHEHUB \u00b7 BAR TAUSEND<\/p>\n<h2 id=\"bt-native-reservation-title\"><span class=\"bt-res-de\" data-no-translation>Tisch in der Cantina reservieren<\/span><span class=\"bt-res-en\" data-no-translation lang=\"en\">Reserve a table in the Cantina<\/span><\/h2>\n<p class=\"bt-reservation-intro\"><span class=\"bt-res-de\" data-no-translation>Donnerstag \u2013 Samstag \u00b7 19:00 \u2013 23:00 Uhr<\/span><span class=\"bt-res-en\" data-no-translation lang=\"en\">Thursday \u2013 Saturday \u00b7 7:00 \u2013 11:00 PM<\/span><\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_contact_form_0 et_pb_contact_form_container clearfix et_pb_recaptcha_enabled et_pb_module et_flex_module\" data-form_unique_num=\"0\" data-form_unique_id=\"cc936500-2026-4019-8025-cafe00000001\" id=\"et_pb_contact_form_cc936500-2026-4019-8025-cafe00000001\"><div class=\"et-pb-contact-message\"><\/div><div class=\"et_pb_contact\"><form class=\"et_pb_contact_form et_flex_module\" method=\"post\" action=\"https:\/\/tausendberlin.com\/en\/wp-json\/wp\/v2\/pages\/9606\">\r\n<div class=\"et_pb_contact_field_0 et_pb_contact_field et_pb_module et_flex_module et_flex_column_12_24 et_flex_column_12_24_tablet et_flex_column_24_24_phone\" data-id=\"name\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_0_name_0\">Ihr Name<\/label><input type=\"text\" name=\"et_pb_contact_0_name_0\" id=\"et_pb_contact_0_name_0\" class=\"input\" data-required_mark=\"required\" data-field_type=\"input\" data-original_id=\"name\" placeholder=\"Ihr Name\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_1 et_pb_contact_field et_pb_module et_flex_module et_flex_column_12_24 et_flex_column_12_24_tablet et_flex_column_24_24_phone\" data-id=\"email\" data-type=\"email\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_0_email_1\">Ihre E-Mail-Adresse<\/label><input type=\"text\" name=\"et_pb_contact_0_email_1\" id=\"et_pb_contact_0_email_1\" class=\"input\" data-required_mark=\"required\" data-field_type=\"email\" data-original_id=\"email\" placeholder=\"Ihre E-Mail-Adresse\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_2 et_pb_contact_field et_pb_module et_flex_module et_flex_column_12_24 et_flex_column_12_24_tablet et_flex_column_24_24_phone\" data-id=\"date\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_0_date_2\">Wunschdatum<\/label><input type=\"text\" name=\"et_pb_contact_0_date_2\" id=\"et_pb_contact_0_date_2\" class=\"input\" data-required_mark=\"required\" data-field_type=\"input\" data-original_id=\"date\" placeholder=\"Wunschdatum\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_3 et_pb_contact_field et_pb_module et_flex_module et_flex_column_12_24 et_flex_column_12_24_tablet et_flex_column_24_24_phone\" data-id=\"time\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_0_time_3\">Wunschzeit<\/label><input type=\"text\" name=\"et_pb_contact_0_time_3\" id=\"et_pb_contact_0_time_3\" class=\"input\" data-required_mark=\"required\" data-field_type=\"input\" data-original_id=\"time\" placeholder=\"Wunschzeit\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_4 et_pb_contact_field et_pb_module et_flex_module et_flex_column_12_24 et_flex_column_12_24_tablet et_flex_column_24_24_phone\" data-id=\"guests\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_0_guests_4\">Anzahl G\u00e4ste<\/label><input type=\"text\" name=\"et_pb_contact_0_guests_4\" id=\"et_pb_contact_0_guests_4\" class=\"input\" data-required_mark=\"required\" data-field_type=\"input\" data-original_id=\"guests\" placeholder=\"Anzahl G\u00e4ste\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_5 et_pb_contact_field et_pb_module et_flex_module et_flex_column_12_24 et_flex_column_12_24_tablet et_flex_column_24_24_phone\" data-id=\"phone\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_0_phone_5\">Telefon (optional)<\/label><input type=\"text\" name=\"et_pb_contact_0_phone_5\" id=\"et_pb_contact_0_phone_5\" class=\"input\" data-required_mark=\"not_required\" data-field_type=\"input\" data-original_id=\"phone\" placeholder=\"Telefon (optional)\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_6 et_pb_contact_field et_pb_module et_flex_module et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\" data-id=\"message\" data-type=\"textarea\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_0_message_6\">Nachricht und W\u00fcnsche (optional)<\/label><textarea name=\"et_pb_contact_0_message_6\" id=\"et_pb_contact_0_message_6\" class=\"et_pb_contact_message input\" data-required_mark=\"not_required\" data-field_type=\"textarea\" data-original_id=\"message\" placeholder=\"Nachricht und W\u00fcnsche (optional)\"><\/textarea><\/div>\r\n<input type=\"hidden\" name=\"et_pb_contactform_submit_cc936500-2026-4019-8025-cafe00000001\" value=\"et_contact_proccess\" \/><div class=\"et_contact_bottom_container\"><div class=\"et_pb_button_wrapper\"><button type=\"submit\" name=\"et_builder_submit_button\" class=\"et_pb_button et_pb_contact_submit\">Reservierung anfragen<\/button><\/div><\/div><input type=\"hidden\" id=\"_wpnonce-et-pb-contact-form-submitted-cc936500-2026-4019-8025-cafe00000001\" name=\"_wpnonce-et-pb-contact-form-submitted-cc936500-2026-4019-8025-cafe00000001\" value=\"1e7a16e61e\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/en\/wp-json\/wp\/v2\/pages\/9606\" \/><\/form><\/div><\/div>\r\n<div class=\"et_pb_text_113 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><p class=\"bt-reservation-confirmation\"><span class=\"bt-res-de\" data-no-translation>Reservierung nach Best\u00e4tigung per E-Mail.<\/span><span class=\"bt-res-en\" data-no-translation lang=\"en\">Reservation confirmed by email.<\/span><\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_code_36 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\">\n<style id=\"bt-reservation-refinement-v5\">\nhtml body.page-id-9606:not(.et-fb) #bt-reservation-modal #bt-reservation-native#bt-reservation-native .bt-form-note{box-sizing:border-box!important;margin-top:28px!important;padding-left:8px!important;text-indent:-8px!important;align-self:auto!important}\nhtml body.page-id-9606:not(.et-fb) #bt-reservation-modal #bt-reservation-native#bt-reservation-native .bt-reservation-confirmation{padding-left:8px!important}\n@media(min-width:768px){html body.page-id-9606 #bt-reservation-modal #bt-reservation-native#bt-reservation-native .et_contact_bottom_container{justify-content:flex-end!important}}\n\n\/* Kontaktformulare: gleitende Feldbeschriftung mit freiem Abstand zur Eingabe. *\/\nhtml body.page-id-9606.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found):not(#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container.et_pb_contact_form_container .bt-compact-field .et_pb_contact_form_label{top:20px!important;opacity:1!important;font:400 15px\/1.5 Poppins,sans-serif!important;transform:translateY(0) scale(1)!important;transform-origin:left top!important;transition:transform 550ms cubic-bezier(.22,.61,.36,1),color 550ms ease!important}\nhtml body.page-id-9606.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found):not(#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container.et_pb_contact_form_container .bt-compact-field:is(.bt-has-value,.bt-field-filled,.bt-native-picker,:focus-within) .et_pb_contact_form_label{transform:translateY(-18px) scale(.72)!important}\nhtml body.page-id-9606.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found):not(#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container.et_pb_contact_form_container .bt-compact-field .input.input{height:60px;min-height:60px!important;padding:26px 0 8px!important}\nhtml body.page-id-9606.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found):not(#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container.et_pb_contact_form_container .bt-compact-field textarea.input.input{height:96px;min-height:96px!important}\nhtml body.page-id-9606.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found):not(#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container.et_pb_contact_form_container .bt-compact-field .input.input::placeholder{color:transparent!important;opacity:0!important}\nhtml body.page-id-9606.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found):not(#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container.et_pb_contact_form_container .et_contact_bottom_container{margin-top:22px!important}\nhtml body.page-id-9606.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found):not(#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container.et_pb_contact_form_container button.et_pb_contact_submit{padding:0 22px 2px!important}\nhtml body.page-id-9606 #mail-formular-booking-requests#mail-formular-booking-requests#mail-formular-booking-requests :is(h1,h2,h3){margin-top:20px!important;margin-bottom:20px!important}\n@media(prefers-reduced-motion:reduce){html body.page-id-9606.page-id-9606.page-id-9606:not(.et-fb) :is(#mail-formular-booking-requests,#mail-formular-location-rent-requests,#mail-formular-lost-and-found):not(#bt-reservation-modal)[role=\"dialog\"] .et_pb_contact_form_container.et_pb_contact_form_container .bt-compact-field .et_pb_contact_form_label{transition:none!important}}\n@keyframes btReservationSoft{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready.is-open .bt-reservation-tool{animation:btReservationSoft .7s cubic-bezier(.22,.61,.36,1) both}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready.is-open #bt-reservation-native .et_pb_text,html body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready.is-open #bt-reservation-native .et_pb_contact_field{animation:btReservationSoft .65s cubic-bezier(.22,.61,.36,1) both}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready.is-open #bt-reservation-native .et_pb_contact_field:nth-child(2){animation-delay:.04s}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready.is-open #bt-reservation-native .et_pb_contact_field:nth-child(3){animation-delay:.08s}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready.is-open #bt-reservation-native .et_pb_contact_field:nth-child(4){animation-delay:.12s}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready.is-open #bt-reservation-native .et_pb_contact_field:nth-child(n+5){animation-delay:.16s}\n@media(max-width:767px){\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready{padding:58px 14px 16px!important;align-items:start!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready .bt-reservation-tool{width:100%!important;max-width:430px!important;max-height:calc(100dvh - 74px)!important;padding:23px 21px 20px!important;border:1px solid #38332f!important;border-radius:10px!important;background:#10100f!important;box-shadow:0 18px 70px #0008!important;scrollbar-width:thin;scrollbar-color:#665143 transparent}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready .bt-reservation-close{top:9px!important;right:15px!important;width:40px!important;height:40px!important;font-size:28px!important;border-color:#665e56!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native,html body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native>.et_pb_column{display:block!important;gap:0!important;row-gap:0!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .et_pb_module{margin:0!important;padding:0!important;min-height:0!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .et_pb_code{display:none!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .bt-reservation-kicker{font:400 10px\/1.5 Oswald,sans-serif!important;letter-spacing:.14em!important;margin:0 0 8px!important;color:#c58d69!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native h2{font:400 27px\/1.15 Oswald,sans-serif!important;margin:0 0 10px!important;padding:0!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .bt-reservation-intro{font:400 11px\/1.6 Poppins,sans-serif!important;margin:0 0 17px!important;color:#aaa59e!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .et_pb_contact_form_container,html body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .et_pb_contact{display:block!important;gap:0!important;margin:0!important;padding:0!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native form.et_pb_contact_form{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:11px 16px!important;margin:0!important;padding:0!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .et_pb_contact_field{position:relative!important;grid-column:1\/-1!important;width:100%!important;min-width:0!important;margin:0!important;padding:0!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .et_pb_contact_field:is([data-id=\"date\"],[data-id=\"time\"],[data-id=\"guests\"],[data-id=\"phone\"]){grid-column:span 1!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .et_pb_contact_form_label{position:absolute!important;z-index:1!important;top:17px!important;left:0!important;right:0!important;width:auto!important;height:auto!important;margin:0!important;padding:0!important;clip:auto!important;clip-path:none!important;overflow:visible!important;font:400 12px\/1.4 Poppins,sans-serif!important;letter-spacing:0!important;text-transform:none!important;color:#bcb7b0!important;pointer-events:none;transform-origin:left top;transition:top .3s ease,font-size .3s ease,color .3s ease!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .et_pb_contact_field:is(:focus-within,.bt-field-filled,[data-id=\"date\"],[data-id=\"time\"])>.et_pb_contact_form_label{top:3px!important;font-size:9px!important;color:#b79780!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .et_pb_contact_field :is(input:not([type=\"hidden\"]),textarea){box-sizing:border-box!important;width:100%!important;min-width:0!important;max-width:100%!important;height:56px;min-height:56px!important;padding:21px 0 7px!important;border:0!important;border-bottom:1px solid #4c4640!important;border-radius:0!important;outline:none!important;background:transparent!important;box-shadow:none!important;color:#e5e1db!important;font:400 16px\/1.4 Poppins,sans-serif!important;letter-spacing:0!important;transition:border-color .4s ease!important;color-scheme:dark}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .et_pb_contact_field textarea{height:78px;min-height:78px!important;resize:vertical!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .et_pb_contact_field :is(input,textarea):focus{border-bottom-color:#c58d69!important;background:transparent!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .et_pb_contact_field :is(input,textarea).et_contact_error,html body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .et_pb_contact_field :is(input,textarea)[aria-invalid=\"true\"]{border:0!important;border-bottom:1px solid #dc5286!important;background:transparent!important;color:#e5e1db!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .et_pb_contact_field input::-webkit-calendar-picker-indicator{opacity:.6;width:15px;padding:0;margin:0}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .et_pb_contact_field input[type=\"date\"],html body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .et_pb_contact_field input[type=\"time\"]{font-size:14px!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .et_contact_bottom_container{grid-column:1\/-1!important;margin:10px 0 0!important;justify-content:flex-start!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native button.et_pb_contact_submit{font:400 14px\/1.3 Oswald,sans-serif!important;letter-spacing:.035em!important;min-height:43px!important;padding:10px 20px!important;border:1px solid #b98968!important;color:#c79c7d!important;border-radius:999px!important;transition:color .5s ease,border-color .5s ease,background-color .5s ease!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native button.et_pb_contact_submit:is(:hover,:focus-visible){background:#c58d6910!important;color:#ead7c8!important;border-color:#dfb89a!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .bt-form-note{font:400 9px\/1.6 Poppins,sans-serif!important;margin:11px 0 0!important;color:#948e86!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .bt-form-note a{color:#bca38e!important;text-decoration:none!important;border-bottom:1px solid #665143}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .bt-reservation-confirmation{font:400 10px\/1.6 Poppins,sans-serif!important;margin:10px 0 0!important;color:#aaa39a!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .bt-reservation-inline-error{font:400 10px\/1.5 Poppins,sans-serif!important;margin:9px 0 0!important;color:#bcb7b0!important}\nhtml body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .bt-reservation-inline-error[hidden]{display:none!important}\n}\n@media(prefers-reduced-motion:reduce){html body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready .bt-reservation-tool,html body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native .et_pb_text,html body.page-id-9606.page-id-9606:not(.et-fb) #bt-reservation-modal.bt-native-ready #bt-reservation-native .et_pb_contact_field{animation:none!important;transition:none!important}}\n<\/style>\n<script id=\"bt-reservation-refinement-behavior-v5\">\n(function(){\nfunction init(){\nif(document.body.classList.contains('et-fb'))return;\nvar modal=document.getElementById('bt-reservation-modal');if(!modal)return;\n\/* Cantina reservation links use the existing native dialog. *\/\ndocument.addEventListener('click',function(event){\nvar link=event.target.closest('a[data-bt-reservation-link]');\nif(!link)return;\nvar opener=document.querySelector('#cantina .cantina-reservation-button');\nif(!opener)return;\nevent.preventDefault();event.stopPropagation();opener.click();\n},true);\nif(new URLSearchParams(location.search).get('reservierung')==='1'){\nvar reserveLinkAttempts=0;\nfunction openRequestedReservation(){\nvar opener=document.querySelector('#cantina .cantina-reservation-button');\nif(opener&&modal.classList.contains('bt-native-ready')){opener.click();return;}\nif(reserveLinkAttempts++<60)setTimeout(openRequestedReservation,150);\n}\nopenRequestedReservation();\n}\nvar tries=0;\nfunction mount(){\nvar src=modal.querySelector('#bt-reservation-native'),form=src&&src.querySelector('form');\nif(!form){if(tries++<60)setTimeout(mount,150);return;}\nif(form.dataset.btRefined)return;form.dataset.btRefined='true';\nvar en=document.documentElement.lang.toLowerCase().indexOf('en')===0;\nvar fields=Array.prototype.slice.call(form.querySelectorAll('input:not([type=\"hidden\"]),textarea'));\nvar note=src.querySelector('.bt-form-note');\nvar actionRow=form.querySelector('.et_contact_bottom_container');\nif(note&&form)form.insertAdjacentElement('afterend',note);\nif(note){note.textContent=en?'Required \u00b7 ':'Pflichtfelder \u00b7 ';var marker=document.createElement('span');marker.className='bt-required-marker';marker.textContent='* ';note.prepend(marker);var privacy=document.createElement('a');privacy.href=en?'\/en\/impressum\/#datenschutz':'\/impressum\/#datenschutz';privacy.target='_blank';privacy.rel='noopener';privacy.textContent=en?'Privacy':'Datenschutz';note.append(privacy,document.createTextNode(en?' \u00b7 Protected by reCAPTCHA.':' \u00b7 Gesch\u00fctzt durch reCAPTCHA.'));note.dataset.btCompactNote='true';}\nvar error=document.createElement('p');error.className='bt-reservation-inline-error';error.id='bt-reservation-inline-error';error.hidden=true;error.setAttribute('role','status');error.setAttribute('aria-live','polite');form.insertAdjacentElement('afterend',error);\nfunction phone(){return matchMedia('(max-width:767px)').matches;}\nfunction state(input){var wrap=input.closest('.et_pb_contact_field');if(wrap)wrap.classList.toggle('bt-field-filled',!!input.value);}\nfunction clear(input){if(input.validity.valid){input.removeAttribute('aria-invalid');input.removeAttribute('aria-describedby');input.classList.remove('et_contact_error');}if(!fields.some(function(x){return x.getAttribute('aria-invalid')==='true';}))error.hidden=true;}\nfields.forEach(function(input){state(input);input.addEventListener('input',function(){state(input);clear(input);});input.addEventListener('change',function(){state(input);clear(input);});input.addEventListener('blur',function(){state(input);if(phone()&&input.value&&!input.validity.valid){input.setAttribute('aria-invalid','true');error.textContent=input.validity.customError?input.validationMessage:(en?'Please check the marked fields.':'Bitte pr\u00fcfen Sie die markierten Felder.');error.hidden=false;input.setAttribute('aria-describedby',error.id);}});});\nvar focusPending=false;\nform.addEventListener('invalid',function(e){if(!phone())return;e.preventDefault();var input=e.target;input.setAttribute('aria-invalid','true');input.setAttribute('aria-describedby',error.id);error.textContent=input.validity.customError?input.validationMessage:(en?'Please check the marked fields.':'Bitte pr\u00fcfen Sie die markierten Felder.');error.hidden=false;if(!focusPending){focusPending=true;requestAnimationFrame(function(){var first=fields.find(function(x){return !x.validity.valid;});if(first)first.focus();focusPending=false;});}},true);\n}\nmount();\n}\nif(document.readyState==='loading')document.addEventListener('DOMContentLoaded',init,{once:true});else init();\n})();\n<\/script>\n<style id=\"bt-reservation-phone-polish-20261026\">\n@media(max-width:767px){\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready{--bt-form-accent:#c27a50}\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready .bt-reservation-close{\n  width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;\n  font-size:24px!important;line-height:1!important;color:#c27a50!important;border:1px solid #c27a50!important;border-radius:50%!important;\n  transition:color .8s ease,border-color .8s ease,background-color .8s ease!important;\n }\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready .bt-reservation-close::after{\n  content:\"\"!important;display:block!important;position:absolute!important;inset:-4px!important;\n  border:0!important;background:transparent!important;pointer-events:auto!important;\n }\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready .bt-reservation-close:is(:hover,:focus-visible){color:#fff!important;border-color:#fff!important}\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native button.et_pb_contact_submit{color:#c27a50!important;border-color:#c27a50!important}\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native button.et_pb_contact_submit:is(:hover,:focus-visible){color:#fff!important;border-color:#fff!important;background-color:#c27a5010!important}\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .bt-form-note{position:relative!important;padding-left:8px!important;text-indent:0!important;margin-top:31px!important}\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .bt-reservation-kicker,html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .bt-reservation-kicker *{color:#c27a50!important}\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .bt-form-note a{color:#c27a50!important;text-decoration:none!important;border-bottom:0!important;box-shadow:none!important;background-image:none!important;transition:color .8s ease!important}\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .bt-form-note a:is(:hover,:focus-visible){color:#fff!important;text-decoration:none!important;border-bottom:0!important}\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .bt-form-note>.bt-required-marker{position:absolute!important;left:0!important;top:0!important}\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native .bt-reservation-confirmation{padding-left:8px!important;text-indent:0!important}\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native input:is([type=\"date\"],[type=\"time\"])::-webkit-calendar-picker-indicator{\n  opacity:1!important;filter:none!important;width:16px!important;height:16px!important;cursor:pointer;\n }\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native input[type=\"date\"]::-webkit-calendar-picker-indicator{background:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2218%22%20height%3D%2218%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23c27a50%22%20stroke-width%3D%221.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Crect%20x%3D%223.5%22%20y%3D%225%22%20width%3D%2217%22%20height%3D%2216%22%20rx%3D%221.5%22%2F%3E%3Cpath%20d%3D%22M7%203v4m10-4v4M3.5%2010h17%22%2F%3E%3C%2Fsvg%3E\") center\/16px 16px no-repeat!important}\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready #bt-reservation-native#bt-reservation-native input[type=\"time\"]::-webkit-calendar-picker-indicator{background:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2218%22%20height%3D%2218%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23c27a50%22%20stroke-width%3D%221.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Ccircle%20cx%3D%2212%22%20cy%3D%2212%22%20r%3D%229%22%2F%3E%3Cpath%20d%3D%22M12%206.5V12l4%202.5%22%2F%3E%3C%2Fsvg%3E\") center\/16px 16px no-repeat!important}\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready,html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready *{scrollbar-width:thin!important;scrollbar-color:#c27a508f transparent!important}\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready::-webkit-scrollbar,html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready *::-webkit-scrollbar{width:2px!important;height:2px!important}\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready::-webkit-scrollbar-track,html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready *::-webkit-scrollbar-track{background:transparent!important}\n html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready::-webkit-scrollbar-thumb,html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready *::-webkit-scrollbar-thumb{background:#c27a508f!important;border-radius:2px!important}\n @supports selector(::-webkit-scrollbar){\n  html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready,html body.page-id-9606:not(.et-fb) #bt-reservation-modal#bt-reservation-modal#bt-reservation-modal.bt-native-ready *{scrollbar-width:auto!important;scrollbar-color:auto!important}\n }\n}\n<\/style><\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_10 et_pb_section et_section_regular et_block_section bt-cantina-editor-section\" id=\"cantina-chef\">\r\n<div class=\"et_pb_row_57 et_pb_row et_block_row\">\r\n<div class=\"et_pb_column_148 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_50 et_pb_image et_pb_module et_flex_module bt-eva-phone-logo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Cantina-CheHub-EvaChe-Logo-04.png\" alt=\"CHEHUB \u2013 Logo mit gezeichnetem Kreis\" width=\"1080\" height=\"1080\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Cantina-CheHub-EvaChe-Logo-04.png 1080w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Cantina-CheHub-EvaChe-Logo-04-980x980.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Cantina-CheHub-EvaChe-Logo-04-480x480.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1080px, 100vw\" class=\"wp-image-8629\" \/><\/span><\/div>\r\n<div class=\"et_pb_text_114 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p class=\"bt-cantina-eyebrow\">Die K\u00f6chin hinter <span class=\"bt-chehub-name\">CHEHUB<\/span><\/p>\n<h2 class=\"bt-cantina-title\">EVA CHE<\/h2>\n<p class=\"bt-cantina-subtitle\">Chinese roots. Her own rules.<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_115 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p>Chinesische Wurzeln, aufgewachsen in Tschechien, heute zwischen Prag und Berlin: Eva Che verbindet diese Einfl\u00fcsse in ihrer K\u00fcche. Mit <span class=\"bt-chehub-name\">CHEHUB<\/span> bringt sie ihre pers\u00f6nliche Handschrift in die Cantina.<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_116 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p>2020 wechselte sie aus der Mode- und Luxuswelt in die K\u00fcche. Seitdem kocht sie f\u00fcr Saint Laurent, Soho House und internationale Events. 2024 wurde sie von Forbes in die Liste \u201e30 Under 30\u201c aufgenommen.<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_117 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p>In der offenen K\u00fcche der Cantina erleben Sie Eva Che und ihr Team aus n\u00e4chster N\u00e4he.<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_118 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module bt-cantina-menu-link-block\"><div class=\"et_pb_text_inner\"><p><a href=\"#speisekarte\" class=\"bt-cantina-text-link\">Das Cantina-Men\u00fc entdecken &#x2197;<\/a><\/p>\n<p class=\"bt-cantina-page-link\"><a href=\"https:\/\/tausendberlin.com\/cantina\/\" class=\"bt-cantina-text-link\">Cantina &#x2197;<\/a><\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_119 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p class=\"bt-cantina-quote\">\u201eOhne guten Service schmeckt selbst das beste Essen nicht.\u201c<\/p>\n<p class=\"bt-cantina-credit\">\u2014 Eva Che<\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_149 et_pb_column et_pb_column_1_2 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_120 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p class=\"bt-cantina-portrait-caption\">Eva Che \u00b7 <span class=\"bt-chehub-name\">CHEHUB<\/span><\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_image_51 et_pb_image et_pb_module et_flex_module bt-eva-v10\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-EvaChe-CheHub-04.png\" alt=\"Eva Che \u00b7 CHEHUB\" width=\"1080\" height=\"1400\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-EvaChe-CheHub-04.png 1080w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-EvaChe-CheHub-04-980x1270.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-EvaChe-CheHub-04-480x622.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1080px, 100vw\" class=\"wp-image-8680\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n<div class=\"et_pb_section_12 et_pb_section et_section_regular et_block_section ct-section ct-foodmenu\" id=\"speisekarte\">\r\n<div class=\"et_pb_row_61 et_pb_row et_flex_row ct-card-head\">\r\n<div class=\"et_pb_column_154 et_pb_column et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone ct-card-head-copy\">\r\n<div class=\"et_pb_text_129 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module ct-card-brand\"><div class=\"et_pb_text_inner\"><p>Tausend Cantina<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_heading_0 et_pb_heading et_pb_module et_flex_module ct-card-title\"><div class=\"et_pb_heading_container\"><h2 class=\"et_pb_module_header\">Speisekarte<\/h2><\/div><\/div>\r\n<div class=\"et_pb_text_130 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module ct-card-signature\"><div class=\"et_pb_text_inner\"><p>by CHEHUB<\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_155 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone ct-card-head-logo\">\r\n<div class=\"et_pb_image_52 et_pb_image et_pb_module et_flex_module ct-card-logo\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Cantina-CheHub-EvaChe-Logo-04.png\" alt=\"CheHub \u2013 Logo mit gezeichnetem Kreis\" width=\"1080\" height=\"1080\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Cantina-CheHub-EvaChe-Logo-04.png 1080w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Cantina-CheHub-EvaChe-Logo-04-980x980.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Cantina-CheHub-EvaChe-Logo-04-480x480.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1080px, 100vw\" class=\"wp-image-8629\" \/><\/span><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_62 et_pb_row et_flex_row ct-card-body\">\r\n<div class=\"et_pb_column_156 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone ct-card-body-column\" role=\"list\" aria-label=\"Speisekarte\">\r\n<div class=\"et_pb_text_131 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module ct-card-dish\" role=\"listitem\" lang=\"de\"><div class=\"et_pb_text_inner\"><div class=\"btcm-item\">\n<div class=\"btcm-number\" aria-hidden=\"true\">\n<p>01<\/p>\n<\/div>\n<div class=\"ct-dish-copy\">\n<h3>Auster des Tages<\/h3>\n<p class=\"btcm-keys\">(14)<\/p>\n<\/div>\n<div class=\"btcm-price\">\n<p>6 \u20ac<small>pro St\u00fcck<\/small><\/p>\n<\/div>\n<\/div>\n<\/div><\/div>\r\n<div class=\"et_pb_text_132 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module ct-card-dish\" role=\"listitem\" lang=\"de\"><div class=\"et_pb_text_inner\"><div class=\"btcm-item\">\n<div class=\"btcm-number\" aria-hidden=\"true\">\n<p>02<\/p>\n<\/div>\n<div class=\"ct-dish-copy\">\n<h3>Gefrorener Gurkensalat<\/h3>\n<p class=\"btcm-details\">Roter Essig \u00b7 Shiso<\/p>\n<p class=\"btcm-keys\">(11)<\/p>\n<\/div>\n<div class=\"btcm-price\">\n<p>9 \u20ac<\/p>\n<\/div>\n<\/div>\n<\/div><\/div>\r\n<div class=\"et_pb_text_133 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module ct-card-dish\" role=\"listitem\" lang=\"de\"><div class=\"et_pb_text_inner\"><div class=\"btcm-item\">\n<div class=\"btcm-number\" aria-hidden=\"true\">\n<p>03<\/p>\n<\/div>\n<div class=\"ct-dish-copy\">\n<h3>Ger\u00f6stete Paprika<\/h3>\n<\/div>\n<div class=\"btcm-price\">\n<p>9 \u20ac<\/p>\n<\/div>\n<\/div>\n<\/div><\/div>\r\n<div class=\"et_pb_text_134 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module ct-card-dish\" role=\"listitem\" lang=\"de\"><div class=\"et_pb_text_inner\"><div class=\"btcm-item\">\n<div class=\"btcm-number\" aria-hidden=\"true\">\n<p>04<\/p>\n<\/div>\n<div class=\"ct-dish-copy\">\n<h3>Kristall-Teigtasche mit Garnelen<\/h3>\n<p class=\"btcm-keys\">(1,2,6,11)<\/p>\n<\/div>\n<div class=\"btcm-price\">\n<p>12 \u20ac<small>pro St\u00fcck<\/small><\/p>\n<\/div>\n<\/div>\n<\/div><\/div>\r\n<div class=\"et_pb_text_135 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module ct-card-dish\" role=\"listitem\" lang=\"de\"><div class=\"et_pb_text_inner\"><div class=\"btcm-item\">\n<div class=\"btcm-number\" aria-hidden=\"true\">\n<p>05<\/p>\n<\/div>\n<div class=\"ct-dish-copy\">\n<h3>Gef\u00fcllte Kr\u00e4uterseitlinge<\/h3>\n<p class=\"btcm-details\">Gebratene Fr\u00fchlingszwiebel \u00b7 Bambussprossen \u00b7 Schnittlauch\u00f6l<\/p>\n<\/div>\n<div class=\"btcm-price\">\n<p>12 \u20ac<\/p>\n<\/div>\n<\/div>\n<\/div><\/div>\r\n<div class=\"et_pb_text_136 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module ct-card-dish\" role=\"listitem\" lang=\"de\"><div class=\"et_pb_text_inner\"><div class=\"btcm-item\">\n<div class=\"btcm-number\" aria-hidden=\"true\">\n<p>06<\/p>\n<\/div>\n<div class=\"ct-dish-copy\">\n<h3>Aubergine<\/h3>\n<p class=\"btcm-details\">Aprikose \u00b7 Soja<\/p>\n<p class=\"btcm-keys\">(6)<\/p>\n<\/div>\n<div class=\"btcm-price\">\n<p>13 \u20ac<\/p>\n<\/div>\n<\/div>\n<\/div><\/div>\r\n<div class=\"et_pb_text_137 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module ct-card-dish\" role=\"listitem\" lang=\"de\"><div class=\"et_pb_text_inner\"><div class=\"btcm-item\">\n<div class=\"btcm-number\" aria-hidden=\"true\">\n<p>07<\/p>\n<\/div>\n<div class=\"ct-dish-copy\">\n<h3>Rotgeschmorte Schweinerippchen<\/h3>\n<p class=\"btcm-keys\">(6)<\/p>\n<\/div>\n<div class=\"btcm-price\">\n<p>15 \u20ac<\/p>\n<\/div>\n<\/div>\n<\/div><\/div>\r\n<div class=\"et_pb_text_138 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module ct-card-dish\" role=\"listitem\" lang=\"de\"><div class=\"et_pb_text_inner\"><div class=\"btcm-item\">\n<div class=\"btcm-number\" aria-hidden=\"true\">\n<p>08<\/p>\n<\/div>\n<div class=\"ct-dish-copy\">\n<h3>Karamellisierte Birne<\/h3>\n<p class=\"btcm-details\">Tr\u00fcffelnebel<\/p>\n<\/div>\n<div class=\"btcm-price\">\n<p>12 \u20ac<\/p>\n<\/div>\n<\/div>\n<\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_63 et_pb_row et_flex_row ct-card-foot\">\r\n<div class=\"et_pb_column_157 et_pb_column et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone ct-card-foot-copy\">\r\n<div class=\"et_pb_text_139 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module ct-card-claim\"><div class=\"et_pb_text_inner\"><p>Chinese roots. Her own rules.<\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_158 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone ct-card-foot-place\">\r\n<div class=\"et_pb_text_140 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module ct-card-location\"><div class=\"et_pb_text_inner\"><p>Tausend \u00b7 Berlin<\/p>\n<\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n<\/div>\r\n<div class=\"et_pb_section_13 et_pb_section et_section_regular et_block_section et-pb-has-background-video et_pb_preload\" id=\"cantina-koch\"><span class=\"et-pb-background-video\"><video autoplay loop playsinline muted><source type=\"video\/mp4\" data-src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/Cantina-BG-Kitchen-v2.mp4\" \/><\/video><\/span><span class=\"et-pb-background-video et-pb-background-video_phone\"><video autoplay loop playsinline muted><source type=\"video\/mp4\" data-src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/Cantina-BG-Kitchen-mobile-v2.mp4\" \/><\/video><\/span><span class=\"et-pb-background-video et-pb-background-video_tablet\"><video autoplay loop playsinline muted><source type=\"video\/mp4\" data-src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/Cantina-BG-Kitchen-v2.mp4\" \/><\/video><\/span>\r\n<div class=\"et_pb_row_65 et_pb_row et_block_row\">\r\n<div class=\"et_pb_column_160 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_141 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module bt-title-reveal\"><div class=\"et_pb_text_inner\"><h3 style=\"text-align: right; font-size:34px!important; letter-spacing:-1px!important;\">\"Kochen ist eine Kunst \u2013 Genie\u00dfen ihr sch\u00f6nster Moment.\"<\/h3>\n<\/div><\/div>\r\n<div class=\"et_pb_text_142 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p style=\"text-align: right;\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/04\/BarTausend-Restaurant-Award-Guru-Empfohlen-300x246.png\" alt=\"Restaurant Guru Empfohlen\" width=\"150\" height=\"123\" \/>\u00a0 \u00a0 \u00a0 \u00a0 <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/04\/BarTausend-Restaurant-Award-Guru-Exzellent-Service-300x246.png\" alt=\"Restaurant Guru Exzellenter Service\" width=\"150\" height=\"123\" \/>\u00a0 \u00a0 \u00a0 \u00a0<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/04\/BarTausend-Restaurant-Award-Guru-Exzellent-Atmosphaere-300x246.png\" alt=\"Restaurant Guru Exzellente Atmosph\u00e4re\" width=\"150\" height=\"123\" \/><\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_code_39 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n@media (max-width: 980px) {\n  #cantina-koch .et_pb_section_video_bg {\n    overflow: hidden !important;\n    background: #0a0a0a !important;\n  }\n\n  #cantina-koch .et_pb_section_video_bg video {\n    margin-left: 0 !important;\n    object-fit: cover !important;\n    object-position: 50% 50% !important;\n    background: #0a0a0a !important;\n    -webkit-backface-visibility: hidden;\n    backface-visibility: hidden;\n  }\n}\n\n@media (max-width: 767px) {\n  \/* Auf dem Handy ausschlie\u00dflich das Mobilvideo anzeigen *\/\n  #cantina-koch > .et_pb_section_video_bg {\n    display: none !important;\n  }\n\n  #cantina-koch > .et_pb_section_video_bg_phone {\n    display: block !important;\n    visibility: visible !important;\n  }\n\n  \/* Bildschirmf\u00fcllend, ohne seitliche Verschiebung *\/\n  #cantina-koch .et_pb_section_video_bg_phone video {\n    position: fixed !important;\n    top: 0 !important;\n    left: 0 !important;\n    width: 100vw !important;\n    height: 100vh !important;\n    min-width: 100vw !important;\n    min-height: 100vh !important;\n    max-width: none !important;\n    margin: 0 !important;\n    transform: none !important;\n    object-fit: cover !important;\n    object-position: center center !important;\n  }\n}\n<\/style><\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_14 et_pb_section et_section_regular et_block_section et_pb_section_parallax\" id=\"art\"><span class=\"et-pb-parallax-wrapper et-pb-parallax-hidden-tablet\"><span class=\"et-pb-parallax-background et-pb-parallax-background--css et-pb-parallax-background-module--divi-section-14\" style=\"background-image:url(https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-Cantina-BG06.webp)\"><\/span><\/span>\r\n<div class=\"et_pb_row_66 et_pb_row et_block_row\">\r\n<div class=\"et_pb_column_161 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_143 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h1>Kunst<\/h1>\n<\/div><\/div>\r\n<div class=\"et_pb_text_144 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\" data-et-mv-hidden-tablet=\"true\" data-et-mv-hidden-phone=\"true\"><h3>\u201eFLYING CELLS\u201c DES K\u00dcNSTLERDUOS AROTIN &amp; SERGHEJ.<\/h3>\n<\/div><\/div>\r\n<div class=\"et_pb_text_145 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h3 style=\"font-size: 20px!important; line-height: 26px!important;\">Die Backroom Cantina in der Bar Tausend, in der schon Leonardo DiCaprio und Topmodel Bar Rafaeli zu Gast gewesen sein sollen, ist der geheime Treffpunkt der nationalen und internationalen Prominenz in Berlin-Mitte. Wer hier speisen will, muss allerdings erst einmal den Eingang finden!<\/h3>\n<p>ZITAT: TOP10Berlin<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_code_40 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n@media (max-width: 980px){\n\n  \/* Section transparent machen *\/\n  #art{\n    position: relative !important;\n    overflow: hidden !important;\n    background-image: none !important;\n    background-color: transparent !important;\n    z-index: 2 !important;\n  }\n\n  \/* Divi Parallax deaktivieren *\/\n  #art .et_parallax_bg_wrap,\n  #art .et_parallax_bg{\n    display: none !important;\n  }\n}\n<\/style>\n\n<script>\n(function(){\n  if (!window.matchMedia || !window.matchMedia(\"(max-width: 980px)\").matches) return;\n\n  const section = document.getElementById(\"art\");\n  if (!section) return;\n\n  const container = document.getElementById(\"page-container\") || document.body;\n\n  const IMG_URL = \"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-Cantina-BG06.webp\";\n\n  let layer = container.querySelector(\"#bt-fixed-standbild-art\");\n  if (!layer){\n    layer = document.createElement(\"div\");\n    layer.id = \"bt-fixed-standbild-art\";\n    container.insertBefore(layer, container.firstChild);\n  }\n\n  layer.style.position = \"fixed\";\n  layer.style.left = \"0\";\n  layer.style.top  = \"0\";\n  layer.style.width = \"100vw\";\n  layer.style.pointerEvents = \"none\";\n  layer.style.zIndex = \"1\";\n  layer.style.opacity = \"0\";\n  layer.style.overflow = \"hidden\";\n  layer.style.transform = \"translateZ(0)\";\n  layer.style.willChange = \"clip-path, opacity, height\";\n\n  let img = layer.querySelector(\"img.bt-standbild-img\");\n  if (!img){\n    img = document.createElement(\"img\");\n    img.className = \"bt-standbild-img\";\n    img.alt = \"\";\n    img.decoding = \"async\";\n    img.loading = \"eager\";\n    layer.appendChild(img);\n  }\n  img.src = IMG_URL;\n\n  img.style.position = \"absolute\";\n  img.style.inset = \"0\";\n  img.style.width = \"100%\";\n  img.style.height = \"100%\";\n  img.style.objectFit = \"cover\";\n  img.style.objectPosition = \"center center\";\n  img.style.transform = \"translateZ(0)\";\n\n  function setClip(v){\n    layer.style.clipPath = v;\n    layer.style.webkitClipPath = v;\n  }\n\n  let lockedH = 0;\n  function getVH(){\n    if (window.visualViewport && window.visualViewport.height){\n      return window.visualViewport.height;\n    }\n    return window.innerHeight || 1;\n  }\n  function ensureLockedHeight(){\n    const h = getVH();\n    if (h > lockedH) lockedH = h;\n    layer.style.height = lockedH + \"px\";\n  }\n\n  let ticking = false;\n\n  function update(){\n    ticking = false;\n\n    ensureLockedHeight();\n\n    const r = section.getBoundingClientRect();\n    const vh = getVH();\n    const vw = window.innerWidth || 1;\n\n    if (r.bottom <= 0 || r.top >= vh){\n      layer.style.opacity = \"0\";\n      setClip(\"inset(100% 0 0 0)\");\n      return;\n    }\n\n    const top    = Math.max(0, r.top);\n    const bottom = Math.max(0, vh - r.bottom);\n    const left   = Math.max(0, r.left);\n    const right  = Math.max(0, vw - r.right);\n\n    const clip =\n      \"inset(\" +\n      top.toFixed(2) + \"px \" +\n      right.toFixed(2) + \"px \" +\n      bottom.toFixed(2) + \"px \" +\n      left.toFixed(2) + \"px)\";\n\n    layer.style.opacity = \"1\";\n    setClip(clip);\n  }\n\n  function requestTick(){\n    if(!ticking){\n      ticking = true;\n      requestAnimationFrame(update);\n    }\n  }\n\n  ensureLockedHeight();\n  update();\n\n  window.addEventListener(\"scroll\", requestTick, {passive:true});\n  window.addEventListener(\"resize\", requestTick);\n  window.addEventListener(\"load\", requestTick);\n\n  if (window.visualViewport){\n    window.visualViewport.addEventListener(\"resize\", requestTick);\n    window.visualViewport.addEventListener(\"scroll\", requestTick);\n  }\n})();\n<\/script>\n<\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_15 et_pb_section et_section_regular et_block_section et_pb_section_parallax hero-section\" id=\"event\"><span class=\"et-pb-parallax-wrapper et-pb-parallax-hidden-tablet\"><span class=\"et-pb-parallax-background et-pb-parallax-background--css et-pb-parallax-background-module--divi-section-15\" style=\"background-image:url(https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-BabylonBerlinMakingOf-03.webp)\"><\/span><\/span>\r\n<div class=\"et_pb_row_67 et_pb_row et_block_row hero-bottom\">\r\n<div class=\"et_pb_column_162 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_146 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h1>Ihr Event<\/h1>\n<\/div><\/div>\r\n<div class=\"et_pb_text_147 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\" data-et-mv-hidden-phone=\"true\"><h3>Suchen Sie eine exklusive Location im Herzen Berlins \u2026 BAR TAUSEND.<\/h3>\n<p>Ob Premierenfeier mit 200 G\u00e4sten oder Firmendinner f\u00fcr 10 Personen \u2013 unser erfahrenes Eventteam erstellt Ihnen gerne ein individuelles Angebot.<br data-start=\"182\" data-end=\"185\" \/>Bitte senden Sie Ihre Anfrage an: <a href=\"#mail-formular-location-rent-requests\">event@tausendberlin.com<\/a><\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_148 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module\" id=\"pdf-booklet\"><div class=\"et_pb_text_inner\"><h3 class=\"download-link\"><a href=\"\/\" target=\"_blank\" rel=\"noopener\">Download Booklet<\/a><\/h3>\n<\/div><\/div>\r\n<div class=\"et_pb_code_41 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><script>\n(function(){\n  var FILE_URL = 'https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-Booklet-2024-Deutsch.pdf';\n  var FILE_NAME = 'BarTausend-Booklet-2024-Deutsch.pdf';\n\n  function wireDownload(){\n    var el = document.getElementById('pdf-booklet');\n    if (!el) return;\n\n    \/\/ Der Divi-Button ist meist direkt <a>. Falls nicht, suche darin.\n    var a = el.tagName && el.tagName.toLowerCase() === 'a' ? el : el.querySelector('a');\n    if (!a) return;\n\n    \/\/ Link-Ziel setzen (\u00fcberschreibt ggf. \"#\")\n    a.setAttribute('href', FILE_URL);\n    a.setAttribute('rel', 'noopener');\n\n    \/\/ Divi-Smooth-Scroll & \"#\" aushebeln: wir \u00fcbernehmen den Klick komplett\n    a.addEventListener('click', function(ev){\n      ev.preventDefault();\n      ev.stopImmediatePropagation();\n\n      \/\/ tempor\u00e4ren Link erzeugen \u2192 download hart ansto\u00dfen\n      var tmp = document.createElement('a');\n      tmp.href = FILE_URL;\n      tmp.setAttribute('download', FILE_NAME); \/\/ einige Browser ignorieren das bei Cross-Origin, dann wird ge\u00f6ffnet\n      tmp.rel = 'noopener';\n      document.body.appendChild(tmp);\n      tmp.click();\n      setTimeout(function(){ document.body.removeChild(tmp); }, 0);\n    }, {passive:false, capture:true});\n  }\n\n  \/\/ warten bis Divi das DOM aufgebaut hat\n  if (document.readyState === 'complete' || document.readyState === 'interactive') {\n    setTimeout(wireDownload, 0);\n  } else {\n    document.addEventListener('DOMContentLoaded', wireDownload);\n  }\n})();\n<\/script>\n<\/div><\/div>\r\n<div class=\"et_pb_code_42 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n\/* =========================\n   MOBILE: Zoom\/Parallax AUS (damit Standbild nicht \u00fcberlagert wird)\n   ========================= *\/\n@media (max-width: 980px){\n  \/* Overlay (unser Zoom-Layer) darf auf Mobile nie sichtbar sein *\/\n  #event .bt-event-zoom-overlay{\n    display: none !important;\n    opacity: 0 !important;\n    visibility: hidden !important;\n  }\n\n  \/* Divi Parallax Layer im Event auf Mobile aus (damit nix dr\u00fcber liegt) *\/\n  #event .et-pb-parallax-wrapper,\n  #event .et-pb-parallax-background,\n  #event .et_parallax_bg_wrap,\n  #event .et_parallax_bg_wrap .et_parallax_bg,\n  #event .et_pb_parallax_css{\n    display: none !important;\n  }\n\n  \/* Event-Section selbst sauber \u201cleer\u201d lassen (Standbild kommt von unserem fixed <img>) *\/\n  #event{\n    background-image: none !important;\n    background-color: transparent !important;\n  }\n}\n\n\/* =========================\n   DESKTOP + iPAD (>=981px): Zoom AN\n   ========================= *\/\n@media (min-width: 981px){\n\n  #event{\n    position: relative !important;\n    overflow: hidden !important;\n  }\n\n  \/* Divi Parallax NICHT transformen -> Standbild bleibt *\/\n  #event .et-pb-parallax-wrapper,\n  #event .et-pb-parallax-background,\n  #event .et_parallax_bg_wrap,\n  #event .et_parallax_bg_wrap .et_parallax_bg,\n  #event .et_pb_parallax_css{\n    background-position: center center !important;\n  }\n\n  \/* Overlay-Layer (nur das wird skaliert) *\/\n  #event .bt-event-zoom-overlay{\n    position: absolute;\n    inset: 0;\n    background-repeat: no-repeat;\n    background-size: cover;\n    background-position: center center;\n    transform: scale(1);\n    transform-origin: center;\n    will-change: transform;\n    pointer-events: none;\n    z-index: 1;\n  }\n\n  \/* Content nach vorne *\/\n  #event .et_pb_row,\n  #event .et_pb_row_inner,\n  #event .et_pb_module{\n    position: relative !important;\n    z-index: 2 !important;\n  }\n}\n<\/style>\n\n<script>\n(function(){\n  function isMobile(){ return window.matchMedia && window.matchMedia(\"(max-width: 980px)\").matches; }\n\n  function ready(fn){\n    if(document.readyState !== 'loading') fn();\n    else document.addEventListener('DOMContentLoaded', fn);\n  }\n  function clamp(v,min,max){ return Math.max(min, Math.min(max, v)); }\n\n  \/\/ Mobile: Overlay falls vorhanden entfernen (sonst \u00fcberlagert er das Standbild)\n  function killOverlayOnMobile(){\n    if(!isMobile()) return;\n    var el = document.querySelector('#event');\n    if(!el) return;\n    var ov = el.querySelector('.bt-event-zoom-overlay');\n    if(ov) ov.remove();\n  }\n\n  ready(function(){\n    killOverlayOnMobile();\n\n    \/\/ Desktop\/iPad: Zoom initialisieren\n    if(isMobile()) return;\n    \/\/ Doppelinstanz verhindern\n    if(window.__btEventZoomV2) return;\n\n    var el = document.querySelector('#event');\n    if(!el) return;\n\n    var bgSourceEl =\n      el.querySelector('.et-pb-parallax-background') ||\n      el.querySelector('.et_parallax_bg') ||\n      el.querySelector('.et_pb_parallax_css');\n\n    var bgImage = null;\n    if(bgSourceEl){\n      var x = getComputedStyle(bgSourceEl).backgroundImage;\n      if(x && x !== 'none') bgImage = x;\n    }\n    if(!bgImage){\n      var y = getComputedStyle(el).backgroundImage;\n      if(y && y !== 'none') bgImage = y;\n    }\n    if(!bgImage) return;\n\n    var overlay = el.querySelector('.bt-event-zoom-overlay');\n    if(!overlay){\n      overlay = document.createElement('div');\n      overlay.className = 'bt-event-zoom-overlay';\n      el.insertBefore(overlay, el.firstChild);\n    }\n    overlay.style.backgroundImage = bgImage;\n    window.__btEventZoomV2 = true;\n\n    var maxScale = 1.45;\n    var visible = false, finalPending = false, queued = false, last = '';\n\n    function paint(){\n      queued = false;\n\n      \/\/ Breakpoint-Schutz: bei Wechsel auf Tablet\/Phone sofort entfernen\n      if(isMobile()){\n        killOverlayOnMobile();\n        return;\n      }\n\n      \/\/ Au\u00dferhalb des Viewports wird nicht gemessen; nur ein Endzustand beim Verlassen\n      if(!visible && !finalPending) return;\n      finalPending = false;\n\n      var r = el.getBoundingClientRect();\n      var vh = window.innerHeight || document.documentElement.clientHeight;\n      var s;\n\n      if(r.top <= 0){\n        s = 'scale(1)';\n      }else{\n        var progress = clamp((vh - r.top) \/ vh, 0, 1);\n        s = 'scale(' + (1 + (maxScale - 1) * (1 - progress)).toFixed(4) + ')';\n      }\n\n      if(s !== last){\n        overlay.style.transform = s;\n        last = s;\n      }\n    }\n\n    function queue(){\n      if(!queued){\n        queued = true;\n        requestAnimationFrame(paint);\n      }\n    }\n\n    new IntersectionObserver(function(entries){\n      var now = entries[0].isIntersecting;\n      if(!now && visible) finalPending = true;\n      visible = now;\n      queue();\n    }).observe(el);\n\n    window.addEventListener('scroll', function(){\n      if(visible) queue();\n    }, {passive:true});\n\n    window.addEventListener('resize', function(){\n      last = '';\n      queue();\n    });\n\n    queue();\n  });\n\n  \/\/ Tablet\/Phone-Wechsel: Overlay entfernen, auch wenn ready() nicht mehr l\u00e4uft\n  window.addEventListener('resize', killOverlayOnMobile);\n})();\n<\/script>\n<\/div><\/div>\r\n<div class=\"et_pb_code_43 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n@media (max-width: 980px){\n\n  \/* Section transparent *\/\n  #event{\n    position: relative !important;\n    overflow: hidden !important;\n    background-image: none !important;\n    background-color: transparent !important;\n    z-index: 2 !important;\n  }\n\n  \/* Divi Parallax deaktivieren *\/\n  #event .et_parallax_bg_wrap,\n  #event .et_parallax_bg{\n    display: none !important;\n  }\n}\n<\/style>\n\n<script>\n(function(){\n  if (!window.matchMedia || !window.matchMedia(\"(max-width: 980px)\").matches) return;\n\n  const section = document.getElementById(\"event\");\n  if (!section) return;\n\n  const container = document.getElementById(\"page-container\") || document.body;\n\n  const IMG_URL = \"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-BabylonBerlinMakingOf-03.webp\";\n\n  let layer = container.querySelector(\"#bt-fixed-standbild-event\");\n  if (!layer){\n    layer = document.createElement(\"div\");\n    layer.id = \"bt-fixed-standbild-event\";\n    container.insertBefore(layer, container.firstChild);\n  }\n\n  layer.style.position = \"fixed\";\n  layer.style.left = \"0\";\n  layer.style.top  = \"0\";\n  layer.style.width = \"100vw\";\n  layer.style.pointerEvents = \"none\";\n  layer.style.zIndex = \"1\";\n  layer.style.opacity = \"0\";\n  layer.style.overflow = \"hidden\";\n  layer.style.transform = \"translateZ(0)\";\n  layer.style.willChange = \"clip-path, opacity, height\";\n\n  let img = layer.querySelector(\"img.bt-standbild-img\");\n  if (!img){\n    img = document.createElement(\"img\");\n    img.className = \"bt-standbild-img\";\n    img.alt = \"\";\n    img.decoding = \"async\";\n    img.loading = \"eager\";\n    layer.appendChild(img);\n  }\n  img.src = IMG_URL;\n\n  img.style.position = \"absolute\";\n  img.style.inset = \"0\";\n  img.style.width = \"100%\";\n  img.style.height = \"100%\";\n  img.style.objectFit = \"cover\";\n  img.style.objectPosition = \"center center\";\n  img.style.transform = \"translateZ(0)\";\n\n  function setClip(v){\n    layer.style.clipPath = v;\n    layer.style.webkitClipPath = v;\n  }\n\n  let lockedH = 0;\n  function getVH(){\n    if (window.visualViewport && window.visualViewport.height){\n      return window.visualViewport.height;\n    }\n    return window.innerHeight || 1;\n  }\n  function ensureLockedHeight(){\n    const h = getVH();\n    if (h > lockedH) lockedH = h;\n    layer.style.height = lockedH + \"px\";\n  }\n\n  let ticking = false;\n\n  function update(){\n    ticking = false;\n\n    ensureLockedHeight();\n\n    const r = section.getBoundingClientRect();\n    const vh = getVH();\n    const vw = window.innerWidth || 1;\n\n    if (r.bottom <= 0 || r.top >= vh){\n      layer.style.opacity = \"0\";\n      setClip(\"inset(100% 0 0 0)\");\n      return;\n    }\n\n    const top    = Math.max(0, r.top);\n    const bottom = Math.max(0, vh - r.bottom);\n    const left   = Math.max(0, r.left);\n    const right  = Math.max(0, vw - r.right);\n\n    const clip =\n      \"inset(\" +\n      top.toFixed(2) + \"px \" +\n      right.toFixed(2) + \"px \" +\n      bottom.toFixed(2) + \"px \" +\n      left.toFixed(2) + \"px)\";\n\n    layer.style.opacity = \"1\";\n    setClip(clip);\n  }\n\n  function requestTick(){\n    if(!ticking){\n      ticking = true;\n      requestAnimationFrame(update);\n    }\n  }\n\n  ensureLockedHeight();\n  update();\n\n  window.addEventListener(\"scroll\", requestTick, {passive:true});\n  window.addEventListener(\"resize\", requestTick);\n  window.addEventListener(\"load\", requestTick);\n\n  if (window.visualViewport){\n    window.visualViewport.addEventListener(\"resize\", requestTick);\n    window.visualViewport.addEventListener(\"scroll\", requestTick);\n  }\n})();\n<\/script>\n<\/div><\/div>\r\n<div class=\"et_pb_code_44 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n\/* =========================================================\n   BT \u2014 EVENT BG OVERLAY (CLEAN, NO GRADIENT)\n   ========================================================= *\/\n\n#event{\n  position: relative !important;\n}\n\n\/* Schwarzes Overlay *\/\n#event::after{\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  background: #000;\n  pointer-events: none;\n  z-index: 1;\n}\n\n\/* Content nach vorne *\/\n#event .et_pb_row,\n#event .et_pb_row_inner,\n#event .et_pb_module{\n  position: relative !important;\n  z-index: 2 !important;\n}\n\n\/* Desktop *\/\n@media (min-width: 981px){\n  #event::after{\n    opacity: 0.2 !important;\n  }\n}\n\n\/* Mobile *\/\n@media (max-width: 980px){\n  #event::after{\n    opacity: 0.3 !important;\n  }\n}\n<\/style><\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_16 et_pb_section et_section_regular et_block_section\" id=\"presse\">\r\n<div class=\"et_pb_row_68 et_pb_row et_block_row press-head-row\">\r\n<div class=\"et_pb_column_163 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_149 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module\"><div class=\"et_pb_text_inner\" data-et-mv-hidden-phone=\"true\"><h1>Presse<\/h1>\n<\/div><\/div>\r\n<div class=\"et_pb_text_150 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module\"><div class=\"et_pb_text_inner\" data-et-mv-hidden-phone=\"true\"><h1 style=\"text-align: right;\">BAR TAUSEND<\/h1>\n<\/div><\/div>\r\n<div class=\"et_pb_code_45 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n  #presse{\n    position: relative !important;\n    overflow: hidden !important;\n  }\n\n  \/* Divi Parallax NICHT transformen -> Standbild bleibt *\/\n  #presse :is(.et_parallax_bg_wrap, .et-pb-parallax-wrapper),\n  #presse :is(.et_parallax_bg_wrap, .et-pb-parallax-wrapper) :is(.et_parallax_bg, .et-pb-parallax-background),\n  #presse .et_pb_parallax_css{\n    background-position: center center !important; \/* falls Offset: center -100px *\/\n  }\n\n  \/* Overlay-Layer (nur das wird skaliert) *\/\n  #presse .bt-event-zoom-overlay{\n    position: absolute;\n    inset: 0;\n    background-repeat: no-repeat;\n    background-size: cover;\n    background-position: center center; \/* falls Offset: center -100px *\/\n    transform: scale(1);\n    transform-origin: center;\n    will-change: transform;\n    pointer-events: none;\n    z-index: 1; \/* ueber Parallax, unter Content *\/\n  }\n\n  \/* Content nach vorne *\/\n  #presse .et_pb_row,\n  #presse .et_pb_row_inner,\n  #presse .et_pb_module{\n    position: relative !important;\n    z-index: 2 !important;\n  }\n<\/style>\n\n<script>\n(function(){\n  function ready(fn){\n    if(document.readyState !== 'loading') fn();\n    else document.addEventListener('DOMContentLoaded', fn);\n  }\n  function clamp(v,min,max){ return Math.max(min, Math.min(max, v)); }\n\n  ready(function(){\n    const el = document.querySelector('#presse');\n    if(!el) return;\n\n    \/\/ BG Quelle finden (True Parallax oder CSS Parallax)\n    const bgSourceEl =\n      el.querySelector(':is(.et_parallax_bg, .et-pb-parallax-background)') ||\n      el.querySelector('.et_pb_parallax_css');\n\n    \/\/ Hintergrundbild ermitteln\n    let bgImage = null;\n    if(bgSourceEl){\n      const x = getComputedStyle(bgSourceEl).backgroundImage;\n      if(x && x !== 'none') bgImage = x;\n    }\n    if(!bgImage){\n      const y = getComputedStyle(el).backgroundImage;\n      if(y && y !== 'none') bgImage = y;\n    }\n    \/\/ Divi may load its generated background CSS after DOMContentLoaded.\n    \/\/ Keep the configured image available so the zoom always initializes.\n    if(!bgImage) bgImage = \"url(\\\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-BG18.jpg\\\")\";\n\n    \/\/ Overlay erstellen \/ finden\n    let overlay = el.querySelector('.bt-event-zoom-overlay');\n    if(!overlay){\n      overlay = document.createElement('div');\n      overlay.className = 'bt-event-zoom-overlay';\n      el.insertBefore(overlay, el.firstChild);\n    }\n    overlay.style.backgroundImage = bgImage;\n\n    \/\/ SETTINGS\n    const maxScale = 1.45; \/\/ gro\u00df beim Reinkommen\n\n    function update(){\n      const r = el.getBoundingClientRect();\n      const vh = window.innerHeight || document.documentElement.clientHeight;\n\n      \/\/ Sobald Section \"angekommen\" ist (top <= 0): klein behalten\n      if(r.top <= 0){\n        overlay.style.transform = 'scale(1)';\n        return;\n      }\n\n      \/\/ Solange sie von unten rein kommt: gro\u00df -> klein\n      const progress = clamp((vh - r.top) \/ vh, 0, 1);\n      const scale = 1 + (maxScale - 1) * (1 - progress);\n\n      overlay.style.transform = 'scale(' + scale.toFixed(4) + ')';\n    }\n\n    update();\n    window.addEventListener('scroll', update, {passive:true});\n    window.addEventListener('resize', update);\n  });\n})();\n<\/script>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_164 et_pb_column et_pb_column_1_2 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_151 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module\"><div class=\"et_pb_text_inner\" data-et-mv-hidden-phone=\"true\"><h1 style=\"text-align: right;\">CANTINA<\/h1>\n<\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_69 et_pb_row et_block_row press-head-row2\">\r\n<div class=\"et_pb_column_165 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_152 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module scroll-fx\"><div class=\"et_pb_text_inner\"><h3 style=\"font-size: 20px!important; line-height: 26px!important;\">\u201cEine der besten Bars IN Berlin.\u201d<\/h3>\n<p>Thomas Henry<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_153 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module scroll-fx2\"><div class=\"et_pb_text_inner\"><h3 style=\"font-size: 20px!important; line-height: 26px!important;\">\"Ein Teil des Reizes der Bar liegt darin, dass sich alles ein wenig geheim anf\u00fchlt und so eine anregende Atmosph\u00e4re entsteht, die zu hedonistischem Vergn\u00fcgen einl\u00e4dt.\"<\/h3>\n<p>The Guardian<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_154 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module scroll-fx\"><div class=\"et_pb_text_inner\"><h3 style=\"font-size: 20px!important; line-height: 26px!important;\">\u201cAuf diese Bar musste Berlin lange warten.\u201d<\/h3>\n<p>Die Welt<\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_166 et_pb_column et_pb_column_1_2 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_155 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module scroll-fx\"><div class=\"et_pb_text_inner\"><h3 style=\"text-align: right; font-size: 20px!important; line-height: 26px!important;\">\u201cStilvoll und gehoben\u201d<\/h3>\n<p style=\"text-align: right;\">The Culturetip<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_156 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module press-head-row3\"><div class=\"et_pb_text_inner\" data-et-mv-hidden-phone=\"true\"><h3 style=\"text-align: right; font-size: 20px!important; line-height: 26px!important;\">\u201cVersteckt hinter einer<br \/>unscheinbaren T\u00fcr beim<br \/>S-Bahnhof Friedrich\u00adstra\u00dfe<br \/>befindet sich ein Bar-Hotspot.<br \/>Die Einrichtung erinnert an die<br \/>Goldenen Zwanziger: Dunkle W\u00e4nde,<br \/>schwere Sessel, hell erleuchtete<br \/>Lichttrichter und ein Dancefloor kn\u00fcpfen<br \/>an das alte Berlin an. Die Cocktailkarte liest<br \/>sich kreativ und weltoffen.\u201d<\/h3>\n<p style=\"text-align: right;\">Falstaff Barguide 2024 - Cocktailbars<\/p>\n<\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_17 et_pb_section et_section_regular et_block_section et_pb_section_parallax\" id=\"presse-fox\"><span class=\"et-pb-parallax-wrapper et-pb-parallax-hidden-tablet\"><span class=\"et-pb-parallax-background et-pb-parallax-background--css et-pb-parallax-background-module--divi-section-17\" style=\"background-image:url(https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-BG19.jpg)\"><\/span><\/span>\r\n<div class=\"et_pb_row_70 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4\">\r\n<div class=\"et_pb_column_167 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_157 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h4 style=\"text-align: center;\">Tausend Video<\/h4>\n<h2 style=\"text-align: center;\">PETER FOX<\/h2>\n<h3 style=\"text-align: center;\">03.05.2024<\/h3>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_168 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_158 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\"><div class=\"et_pb_text_inner\" data-et-mv-hidden-tablet=\"true\" data-et-mv-hidden-phone=\"true\"><p><strong>PETER FOX FT. REEZY \u2013 TOAST<\/strong><\/p>\n<p><strong>Der Berliner Musikpionier Peter Fox hat uns die Ehre erwiesen und sein neues Musikvideo \u201eTOAST\u201c in der Bar Tausend gedreht.<\/strong><\/p>\n<p><strong>Musik produziert von Peter Fox &amp; The Krauts.<\/strong><br \/><strong>Video produziert von EasyDoesit.<\/strong><\/p>\n<p><strong>Das Video findet ihr hier auf <a href=\"https:\/\/www.youtube.com\/watch?v=0rfEWd_2QTo\" target=\"_blank\" rel=\"noopener\">YouTube<\/a>.<\/strong><\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_code_46 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n@media (max-width: 980px){\n\n  \/* Section transparent machen *\/\n  #presse-fox{\n    position: relative !important;\n    overflow: hidden !important;\n    background-image: none !important;\n    background-color: transparent !important;\n    z-index: 2 !important;\n  }\n\n  \/* Divi Parallax deaktivieren *\/\n  #presse-fox .et_parallax_bg_wrap,\n  #presse-fox .et_parallax_bg{\n    display: none !important;\n  }\n}\n<\/style>\n\n<script>\n(function(){\n  if (!window.matchMedia || !window.matchMedia(\"(max-width: 980px)\").matches) return;\n\n  const section = document.getElementById(\"presse-fox\");\n  if (!section) return;\n\n  const container = document.getElementById(\"page-container\") || document.body;\n  const IMG_URL = \"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-BG19.jpg\";\n\n  let layer = container.querySelector(\"#bt-fixed-standbild-presse-fox\");\n  if (!layer){\n    layer = document.createElement(\"div\");\n    layer.id = \"bt-fixed-standbild-presse-fox\";\n    container.insertBefore(layer, container.firstChild);\n  }\n\n  layer.style.position = \"fixed\";\n  layer.style.left = \"0\";\n  layer.style.top  = \"0\";\n  layer.style.width = \"100vw\";\n  layer.style.pointerEvents = \"none\";\n  layer.style.zIndex = \"1\";\n  layer.style.opacity = \"0\";\n  layer.style.overflow = \"hidden\";\n  layer.style.transform = \"translateZ(0)\";\n  layer.style.willChange = \"clip-path, opacity, height\";\n\n  let img = layer.querySelector(\"img.bt-standbild-img\");\n  if (!img){\n    img = document.createElement(\"img\");\n    img.className = \"bt-standbild-img\";\n    img.alt = \"\";\n    img.decoding = \"async\";\n    img.loading = \"eager\";\n    layer.appendChild(img);\n  }\n  img.src = IMG_URL;\n\n  img.style.position = \"absolute\";\n  img.style.inset = \"0\";\n  img.style.width = \"100%\";\n  img.style.height = \"100%\";\n  img.style.objectFit = \"cover\";\n  img.style.objectPosition = \"center center\";\n  img.style.transform = \"translateZ(0)\";\n\n  function setClip(v){\n    layer.style.clipPath = v;\n    layer.style.webkitClipPath = v;\n  }\n\n  \/\/ Viewport-H\u00f6he locken (gegen iOS\/Safari Pumping)\n  let lockedH = 0;\n  function getVH(){\n    if (window.visualViewport && window.visualViewport.height){\n      return window.visualViewport.height;\n    }\n    return window.innerHeight || 1;\n  }\n  function ensureLockedHeight(){\n    const h = getVH();\n    if (h > lockedH) lockedH = h;\n    layer.style.height = lockedH + \"px\";\n  }\n\n  let ticking = false;\n\n  function update(){\n    ticking = false;\n\n    ensureLockedHeight();\n\n    const r = section.getBoundingClientRect();\n    const vh = getVH();\n    const vw = window.innerWidth || 1;\n\n    if (r.bottom <= 0 || r.top >= vh){\n      layer.style.opacity = \"0\";\n      setClip(\"inset(100% 0 0 0)\");\n      return;\n    }\n\n    const top    = Math.max(0, r.top);\n    const bottom = Math.max(0, vh - r.bottom);\n    const left   = Math.max(0, r.left);\n    const right  = Math.max(0, vw - r.right);\n\n    const clip =\n      \"inset(\" +\n      top.toFixed(2) + \"px \" +\n      right.toFixed(2) + \"px \" +\n      bottom.toFixed(2) + \"px \" +\n      left.toFixed(2) + \"px)\";\n\n    layer.style.opacity = \"1\";\n    setClip(clip);\n  }\n\n  function requestTick(){\n    if(!ticking){\n      ticking = true;\n      requestAnimationFrame(update);\n    }\n  }\n\n  ensureLockedHeight();\n  update();\n\n  window.addEventListener(\"scroll\", requestTick, {passive:true});\n  window.addEventListener(\"resize\", requestTick);\n  window.addEventListener(\"load\", requestTick);\n\n  if (window.visualViewport){\n    window.visualViewport.addEventListener(\"resize\", requestTick);\n    window.visualViewport.addEventListener(\"scroll\", requestTick);\n  }\n})();\n<\/script>\n<\/div><\/div>\r\n<div class=\"et_pb_code_47 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n\/* =========================================================\n   BT \u2014 EVENT BG OVERLAY (CLEAN, NO GRADIENT)\n   ========================================================= *\/\n\n#presse-fox{\n  position: relative !important;\n}\n\n\/* Schwarzes Overlay *\/\n#presse-fox::after{\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  background: #000;\n  pointer-events: none;\n  z-index: 1;\n}\n\n\/* Content nach vorne *\/\n#presse-fox .et_pb_row,\n#presse-fox .et_pb_row_inner,\n#presse-fox .et_pb_module{\n  position: relative !important;\n  z-index: 2 !important;\n}\n\n\/* Desktop *\/\n@media (min-width: 981px){\n  #presse-fox::after{\n    opacity: 0.2 !important;\n  }\n}\n\n\/* Mobile *\/\n@media (max-width: 980px){\n  #presse-fox::after{\n    opacity: 0.3 !important;\n  }\n}\n<\/style><\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_169 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_53 et_pb_image et_animated et_pb_module et_block_module\"><a href=\"https:\/\/www.youtube.com\/watch?v=0rfEWd_2QTo\" target=\"_blank\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-PeterFox-MusicVideo-Toast-02.jpg\" width=\"1080\" height=\"1080\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-PeterFox-MusicVideo-Toast-02.jpg 1080w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-PeterFox-MusicVideo-Toast-02-980x980.jpg 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-PeterFox-MusicVideo-Toast-02-480x480.jpg 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1080px, 100vw\" class=\"wp-image-3166\" alt=\"Bar Tausend - Peter Fox - Music Video - Toast\" title=\"BarTausend-PeterFox-MusicVideo-Toast-02\" \/><\/span><\/a><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_row_71 et_pb_row et_pb_row_1-4_1-2_1-4 et_pb_gutters2 et_block_row et_block_row_1-4_1-2_1-4\">\r\n<div class=\"et_pb_column_170 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_159 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h4 style=\"text-align: center;\">Berlin Fashion Week<\/h4>\n<h2 style=\"text-align: center;\">Perlensau<\/h2>\n<h3 style=\"text-align: center;\">03.07.2026<\/h3>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_171 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_160 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module fc-readmore\"><div class=\"et_pb_text_inner\" data-et-mv-hidden-tablet=\"true\"><p><strong>PERLENSAU S\/S27<\/strong><\/p>\n<p><strong>Die Bar Tausend war Teil der Berlin Fashion Week und Gastgeber der Pr\u00e4sentation von Perlensau S\/S27 \u2013 Geometry of the Future. Das KALTBLUT Magazine war backstage dabei und zeigt exklusive Eindr\u00fccke der Runway Show und Afterparty.<\/strong><\/p>\n<p><strong><a href=\"https:\/\/www.kaltblut-magazine.com\/backstage-at-perlensau-s-s27-geometry-of-the-future\/\" target=\"_blank\" rel=\"noopener\">BACKSTAGE IM KALTBLUT MAGAZINE<\/a><\/strong><\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_code_48 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n\/* =========================================================\n   BT \u2014 EVENT BG OVERLAY (CLEAN, NO GRADIENT)\n   ========================================================= *\/\n\n#presse-fox{\n  position: relative !important;\n}\n\n\/* Schwarzes Overlay *\/\n#presse-fox::after{\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  background: #000;\n  pointer-events: none;\n  z-index: 1;\n}\n\n\/* Content nach vorne *\/\n#presse-fox .et_pb_row,\n#presse-fox .et_pb_row_inner,\n#presse-fox .et_pb_module{\n  position: relative !important;\n  z-index: 2 !important;\n}\n\n\/* Desktop *\/\n@media (min-width: 981px){\n  #presse-fox::after{\n    opacity: 0.2 !important;\n  }\n}\n\n\/* Mobile *\/\n@media (max-width: 980px){\n  #presse-fox::after{\n    opacity: 0.3 !important;\n  }\n}\n<\/style><\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_172 et_pb_column et_pb_column_1_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_image_54 et_pb_image et_animated et_pb_module et_block_module\"><a href=\"https:\/\/www.kaltblut-magazine.com\/backstage-at-perlensau-s-s27-geometry-of-the-future\/\" target=\"_blank\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/07\/BarTausend-Perlensau-Shin-Jeong-Hoon-@sh1nfoto-7.webp\" width=\"560\" height=\"560\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/07\/BarTausend-Perlensau-Shin-Jeong-Hoon-@sh1nfoto-7.webp 560w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/07\/BarTausend-Perlensau-Shin-Jeong-Hoon-@sh1nfoto-7-480x480.webp 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 560px, 100vw\" class=\"wp-image-6969\" alt=\"Bar Tausend - Perlensau- Fashion Week\" title=\"BarTausend-Perlensau-Shin-Jeong-Hoon-@sh1nfoto-7\" \/><\/span><\/a><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_18 et_pb_section et_section_regular et_block_section et_pb_section_parallax\" id=\"vip\"><span class=\"et-pb-parallax-wrapper et-pb-parallax-hidden-tablet\"><span class=\"et-pb-parallax-background et-pb-parallax-background--css et-pb-parallax-background-module--divi-section-18\" style=\"background-image:url(https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-02-3.jpg)\"><\/span><\/span>\r\n<div class=\"et_pb_row_72 et_pb_row et_block_row\">\r\n<div class=\"et_pb_column_173 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_161 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module bt-title-reveal\"><div class=\"et_pb_text_inner\"><h2 style=\"text-align: center; line-height:52px!important; font-size:44px!important;  letter-spacing:-1px!important;\">We create your night.<br \/>We create your experience.<\/h2>\n<\/div><\/div>\r\n<div class=\"et_pb_code_49 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n@media (max-width: 980px){\n\n  \/* Section transparent *\/\n  #vip{\n    position: relative !important;\n    overflow: hidden !important;\n    background-image: none !important;\n    background-color: transparent !important;\n    z-index: 2 !important;\n  }\n\n  \/* Divi Parallax deaktivieren *\/\n  #vip .et_parallax_bg_wrap,\n  #vip .et_parallax_bg{\n    display: none !important;\n  }\n}\n<\/style>\n\n<script>\n(function(){\n  if (!window.matchMedia || !window.matchMedia(\"(max-width: 980px)\").matches) return;\n\n  const section = document.getElementById(\"vip\");\n  if (!section) return;\n\n  const container = document.getElementById(\"page-container\") || document.body;\n  const IMG_URL = \"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-02-3.jpg\";\n\n  let layer = container.querySelector(\"#bt-fixed-standbild-vip\");\n  if (!layer){\n    layer = document.createElement(\"div\");\n    layer.id = \"bt-fixed-standbild-vip\";\n    container.insertBefore(layer, container.firstChild);\n  }\n\n  layer.style.position = \"fixed\";\n  layer.style.left = \"0\";\n  layer.style.top  = \"0\";\n  layer.style.width = \"100vw\";\n  layer.style.pointerEvents = \"none\";\n  layer.style.zIndex = \"1\";\n  layer.style.opacity = \"0\";\n  layer.style.overflow = \"hidden\";\n  layer.style.transform = \"translateZ(0)\";\n  layer.style.willChange = \"clip-path, opacity, height\";\n\n  let img = layer.querySelector(\"img.bt-standbild-img\");\n  if (!img){\n    img = document.createElement(\"img\");\n    img.className = \"bt-standbild-img\";\n    img.alt = \"\";\n    img.decoding = \"async\";\n    img.loading = \"eager\";\n    layer.appendChild(img);\n  }\n  img.src = IMG_URL;\n\n  img.style.position = \"absolute\";\n  img.style.inset = \"0\";\n  img.style.width = \"100%\";\n  img.style.height = \"100%\";\n  img.style.objectFit = \"cover\";\n  img.style.objectPosition = \"center center\";\n  img.style.transform = \"translateZ(0)\";\n\n  function setClip(v){\n    layer.style.clipPath = v;\n    layer.style.webkitClipPath = v;\n  }\n\n  let lockedH = 0;\n  function getVH(){\n    if (window.visualViewport && window.visualViewport.height){\n      return window.visualViewport.height;\n    }\n    return window.innerHeight || 1;\n  }\n  function ensureLockedHeight(){\n    const h = getVH();\n    if (h > lockedH) lockedH = h;\n    layer.style.height = lockedH + \"px\";\n  }\n\n  let ticking = false;\n\n  function update(){\n    ticking = false;\n\n    ensureLockedHeight();\n\n    const r = section.getBoundingClientRect();\n    const vh = getVH();\n    const vw = window.innerWidth || 1;\n\n    if (r.bottom <= 0 || r.top >= vh){\n      layer.style.opacity = \"0\";\n      setClip(\"inset(100% 0 0 0)\");\n      return;\n    }\n\n    const top    = Math.max(0, r.top);\n    const bottom = Math.max(0, vh - r.bottom);\n    const left   = Math.max(0, r.left);\n    const right  = Math.max(0, vw - r.right);\n\n    const clip =\n      \"inset(\" +\n      top.toFixed(2) + \"px \" +\n      right.toFixed(2) + \"px \" +\n      bottom.toFixed(2) + \"px \" +\n      left.toFixed(2) + \"px)\";\n\n    layer.style.opacity = \"1\";\n    setClip(clip);\n  }\n\n  function requestTick(){\n    if(!ticking){\n      ticking = true;\n      requestAnimationFrame(update);\n    }\n  }\n\n  ensureLockedHeight();\n  update();\n\n  window.addEventListener(\"scroll\", requestTick, {passive:true});\n  window.addEventListener(\"resize\", requestTick);\n  window.addEventListener(\"load\", requestTick);\n\n  if (window.visualViewport){\n    window.visualViewport.addEventListener(\"resize\", requestTick);\n    window.visualViewport.addEventListener(\"scroll\", requestTick);\n  }\n})();\n<\/script>\n<\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_19 et_pb_section et_section_regular et_block_section et-pb-has-background-video et_pb_preload et_pb_section_parallax\" id=\"kontakt\"><span class=\"et-pb-parallax-wrapper et-pb-parallax-hidden-tablet\"><span class=\"et-pb-parallax-background et-pb-parallax-background--css et-pb-parallax-background-module--divi-section-19 et_parallax_bg_phone_exist\" style=\"background-image:url(https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-01-3.jpg)\"><\/span><\/span><span class=\"et-pb-parallax-wrapper\"><span class=\"et-pb-parallax-background et-pb-parallax-background--css et-pb-parallax-background_phone et-pb-parallax-background_phone-module--divi-section-19\" style=\"background-image:url(https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-01-3.jpg)\"><\/span><\/span><span class=\"et-pb-background-video\"><video autoplay loop playsinline muted><source type=\"video\/mp4\" data-src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Motion-v2.mp4\" \/><\/video><\/span><span class=\"et-pb-background-video et-pb-background-video_phone\"><video autoplay loop playsinline muted><source type=\"video\/mp4\" data-src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/10\/BarTausend-Motion-mobile-v2.mp4\" \/><\/video><\/span>\r\n<div class=\"et_pb_row_73 et_pb_row et_block_row scroll-fx\" id=\"kontakt1\">\r\n<div class=\"et_pb_column_174 et_pb_column et_pb_column_1_2 et_block_column et_pb_css_mix_blend_mode_passthrough et_animated\">\r\n<div class=\"et_pb_text_162 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module bt-live-contact-times\"><div class=\"et_pb_text_inner\"><h2 class=\"bt-contact-v2\">Bar Tausend<\/h2>\n<p class=\"bt-contact-address\">Schiffbauerdamm 11<br \/>10117 Berlin<\/p>\n<p class=\"bt-live-opening-hours\"><span class=\"bt-contact-de\" data-no-translation>Mittwoch ab 21:00 Uhr<br \/>Donnerstag \u2013 Samstag ab 19:00 Uhr<\/span><span class=\"bt-contact-en\" lang=\"en\" data-no-translation>Wednesday from 9:00 PM<br \/>Thursday \u2013 Saturday from 7:00 PM<\/span><\/p>\n<p class=\"bt-contact-ticket-note\"><span class=\"bt-contact-de\" data-no-translation>Ticketpreise k\u00f6nnen variieren.<\/span><span class=\"bt-contact-en\" lang=\"en\" data-no-translation>Ticket prices may vary.<\/span><\/p>\n<p class=\"bt-contact-route\"><a href=\"#open-stadtplan\" id=\"toggle-stadtplan\" aria-controls=\"open-stadtplan\" aria-expanded=\"false\"><span class=\"bt-contact-de\" data-no-translation>Route planen<\/span><span class=\"bt-contact-en\" lang=\"en\" data-no-translation>Plan route<\/span><span class=\"bt-contact-route-arrow\" aria-hidden=\"true\">&#x2197;<\/span><\/a><\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_163 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h3 class=\"bt-contact-cantina-title\">Cantina <span>by CHEHUB<\/span><\/h3>\n<p class=\"bt-contact-cantina-hours\"><span class=\"bt-contact-de\" data-no-translation>Donnerstag \u2013 Samstag<br \/>19:00 \u2013 23:00 Uhr<\/span><span class=\"bt-contact-en\" lang=\"en\" data-no-translation>Thursday \u2013 Saturday<br \/>7:00 \u2013 11:00 PM<\/span><\/p>\n<p class=\"bt-contact-reservation-label\"><span class=\"bt-contact-de\" data-no-translation>Reservierung<\/span><span class=\"bt-contact-en\" lang=\"en\" data-no-translation>Reservation<\/span><\/p>\n<p class=\"bt-contact-cantina-email\"><a class=\"bt-contactlinks__mail\" href=\"#reservierung\" data-bt-reservation-link=\"true\" aria-haspopup=\"dialog\" aria-controls=\"bt-reservation-modal\">cantina(at)tausendberlin.com<\/a><\/p>\n<p class=\"bt-contact-softopening\">Soft Opening<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_164 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><div class=\"bt-contactlinks\">\n<a class=\"bt-contactlinks__item\" href=\"#mail-formular-booking-requests\"><span class=\"bt-contactlinks__title\">DJ &amp; Artist Booking<\/span><span class=\"bt-contactlinks__mail\">booking(at)tausendberlin.com<\/span><span class=\"bt-contact-arrow\" aria-hidden=\"true\">&#x2197;<\/span><\/a><br \/>\n<a class=\"bt-contactlinks__item\" href=\"#mail-formular-location-rent-requests\"><span class=\"bt-contactlinks__title\">Location &amp; Event Rentals<\/span><span class=\"bt-contactlinks__mail\">event(at)tausendberlin.com<\/span><span class=\"bt-contact-arrow\" aria-hidden=\"true\">&#x2197;<\/span><\/a><br \/>\n<a class=\"bt-contactlinks__item\" href=\"#mail-formular-lost-and-found\"><span class=\"bt-contactlinks__title\">Lost &amp; Found \/ Group Request<\/span><span class=\"bt-contactlinks__mail\">host(at)tausendberlin.com<\/span><span class=\"bt-contact-arrow\" aria-hidden=\"true\">&#x2197;<\/span><\/a>\n<\/div>\n<\/div><\/div>\r\n<div class=\"et_pb_text_165 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p class=\"payment-info\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/Cash-Logo-254x300-1.png\" width=\"254\" height=\"300\" alt=\"Bargeld\" class=\"wp-image-2084 alignnone size-medium\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/Electronic-Cash-Logo-02.png\" width=\"492\" height=\"580\" alt=\"EC-Karte\"><\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_code_50 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n@media (max-width: 980px){\n\n  \/* Section transparent *\/\n  #kontakt{\n    position: relative !important;\n    overflow: hidden !important;\n    background-image: none !important;\n    background-color: transparent !important;\n    z-index: 2 !important;\n  }\n\n  \/* Divi Parallax deaktivieren *\/\n  #kontakt .et_parallax_bg_wrap,\n  #kontakt .et_parallax_bg{\n    display: none !important;\n  }\n}\n<\/style>\n\n<script>\n(function(){\n  if (!window.matchMedia || !window.matchMedia(\"(max-width: 980px)\").matches) return;\n\n  const section = document.getElementById(\"kontakt1\");\n  if (!section) return;\n\n  const container = document.getElementById(\"page-container\") || document.body;\n  const IMG_URL = \"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-01-3.jpg\";\n\n  \/* bt-phone-local-background-v1: no viewport-wide layer or scroll clipping. *\/\n  if(window.matchMedia(\"(max-width:767px)\").matches){\n    const phoneHost=document.getElementById(\"kontakt\");\n    if(!phoneHost)return;\n    const applyPhoneBackground=function(){\n      phoneHost.style.setProperty(\"background-image\",\"url(\"+IMG_URL+\")\",\"important\");\n      phoneHost.style.setProperty(\"background-size\",\"cover\",\"important\");\n      phoneHost.style.setProperty(\"background-position\",\"center center\",\"important\");\n      phoneHost.style.setProperty(\"background-repeat\",\"no-repeat\",\"important\");\n      phoneHost.style.setProperty(\"background-attachment\",\"scroll\",\"important\");\n      phoneHost.dataset.btNativePhoneBackground=\"ready\";\n      lockPhoneMedia();\n    };\n    \/* Keep the video crop steady when only the browser bars change height. *\/\n    let phoneMediaWidth=0;\n    const lockPhoneMedia=function(){\n      const width=phoneHost.clientWidth;\n      if(!width||width===phoneMediaWidth)return;\n      phoneMediaWidth=width;\n      phoneHost.style.removeProperty(\"--bt-contact-media-h\");\n      const video=phoneHost.querySelector(\".et-pb-background-video_phone video\");\n      const height=video?parseFloat(getComputedStyle(video).height):0;\n      phoneHost.style.setProperty(\"--bt-contact-media-h\",Math.round(height||window.innerHeight+140)+\"px\");\n      phoneHost.dataset.btNativePhoneMediaWidth=String(width);\n    };\n    window.addEventListener(\"resize\",function(){\n      if(phoneHost.dataset.btNativePhoneBackground===\"ready\")lockPhoneMedia();\n    },{passive:true});\n    let prepared=false;\n    const prepare=function(){\n      if(prepared)return;prepared=true;\n      if(!(\"IntersectionObserver\" in window)){applyPhoneBackground();return;}\n      const near=new IntersectionObserver(function(entries){\n        if(entries.some(function(entry){return entry.isIntersecting;})){applyPhoneBackground();near.disconnect();}\n      },{rootMargin:\"180% 0px 180% 0px\"});\n      near.observe(phoneHost);\n    };\n    const intro=window.__btMobileIntro;\n    if(intro&&!intro.done&&intro.ready)intro.ready.then(prepare,prepare);else prepare();\n    setTimeout(prepare,4000);\n    return;\n  }\n\n\n  let layer = container.querySelector(\"#bt-fixed-standbild-kontakt1\");\n  if (!layer){\n    layer = document.createElement(\"div\");\n    layer.id = \"bt-fixed-standbild-kontakt1\";\n    container.insertBefore(layer, container.firstChild);\n  }\n\n  layer.style.position = \"fixed\";\n  layer.style.left = \"0\";\n  layer.style.top  = \"0\";\n  layer.style.width = \"100vw\";\n  layer.style.pointerEvents = \"none\";\n  layer.style.zIndex = \"1\";\n  layer.style.opacity = \"0\";\n  layer.style.overflow = \"hidden\";\n  layer.style.transform = \"translateZ(0)\";\n  layer.style.willChange = \"clip-path, opacity, height\";\n  layer.style.filter = \"brightness(0.6)\";\nlayer.style.webkitFilter = \"brightness(0.6)\";\n\n  let img = layer.querySelector(\"img.bt-standbild-img\");\n  if (!img){\n    img = document.createElement(\"img\");\n    img.className = \"bt-standbild-img\";\n    img.alt = \"\";\n    img.decoding = \"async\";\n    img.loading = \"eager\";\n    layer.appendChild(img);\n  }\n  (function(t,u){var go=function(){if(!img.getAttribute(\"src\"))img.src=u;};if(!(\"IntersectionObserver\" in window)||!t){go();return;}var io=new IntersectionObserver(function(es){for(var i=0;i!==es.length;i++){if(es[i].isIntersecting){go();io.disconnect();break;}}},{rootMargin:\"150% 0px 150% 0px\"});io.observe(t);})(typeof section!==\"undefined\"?section:(typeof banner!==\"undefined\"?banner:null),IMG_URL); \/* Perf Claude 18.10.2026: Standbild erst laden, wenn die Sektion naeher als 1,5 Bildschirmhoehen ist *\/\n\n\n  img.style.position = \"absolute\";\n  img.style.inset = \"0\";\n  img.style.width = \"100%\";\n  img.style.height = \"100%\";\n  img.style.objectFit = \"cover\";\n  img.style.objectPosition = \"center center\";\n  img.style.transform = \"translateZ(0)\";\n\n  function setClip(v){\n    layer.style.clipPath = v;\n    layer.style.webkitClipPath = v;\n  }\n\n  let lockedH = 0;\n  function getVH(){\n    if (window.visualViewport && window.visualViewport.height){\n      return window.visualViewport.height;\n    }\n    return window.innerHeight || 1;\n  }\n  function ensureLockedHeight(){\n    const h = getVH();\n    if (h > lockedH) lockedH = h;\n    layer.style.height = lockedH + \"px\";\n  }\n\n  let ticking = false;\n\n  function update(){\n    ticking = false;\n\n    ensureLockedHeight();\n\n    const r = section.getBoundingClientRect();\n    const vh = getVH();\n    const vw = window.innerWidth || 1;\n\n    if (r.bottom <= 0 || r.top >= vh){\n      layer.style.opacity = \"0\";\n      setClip(\"inset(100% 0 0 0)\");\n      return;\n    }\n\n    const top    = Math.max(0, r.top);\n    const bottom = Math.max(0, vh - r.bottom);\n    const left   = Math.max(0, r.left);\n    const right  = Math.max(0, vw - r.right);\n\n    const clip =\n      \"inset(\" +\n      top.toFixed(2) + \"px \" +\n      right.toFixed(2) + \"px \" +\n      bottom.toFixed(2) + \"px \" +\n      left.toFixed(2) + \"px)\";\n\n    layer.style.opacity = \"1\";\n    setClip(clip);\n  }\n\n  function requestTick(){\n    if(!ticking){\n      ticking = true;\n      requestAnimationFrame(update);\n    }\n  }\n\n  ensureLockedHeight();\n  update();\n\n  window.addEventListener(\"scroll\", requestTick, {passive:true});\n  window.addEventListener(\"resize\", requestTick);\n  window.addEventListener(\"load\", requestTick);\n\n  if (window.visualViewport){\n    window.visualViewport.addEventListener(\"resize\", requestTick);\n    window.visualViewport.addEventListener(\"scroll\", requestTick);\n  }\n})();\n<\/script>\n\n<style id=\"bt-phone-contact-stable-media\">\n@media(max-width:767px){html body.page-id-9606 #page-container #kontakt#kontakt .et-pb-background-video_phone video{height:var(--bt-contact-media-h,calc(100lvh + 140px))!important;}}\n<\/style>\n<\/div><\/div>\r\n<div class=\"et_pb_code_51 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n\/* =========================================================\n   KONTAKT1 \u2014 BG POSITION (wie vorher, safe)\n   ========================================================= *\/\n\n\/* Section Hintergrund (Bild) *\/\n#kontakt{\n  background-position: center bottom !important;\n  background-size: cover !important;\n  background-repeat: no-repeat !important;\n}\n\n\/* Divi Parallax Background (Bild-Layer) *\/\n#kontakt :is(.et_parallax_bg_wrap, .et-pb-parallax-wrapper) :is(.et_parallax_bg, .et-pb-parallax-background){\n  background-position: center bottom !important;\n  background-size: cover !important;\n}\n\n\/* =========================================================\n   KONTAKT1 \u2014 OVERLAY, OHNE TEXT-SHIFT\n   - Overlay sitzt zwischen BG (z=-3) und Content (normal)\n   - Content wird NICHT angefasst\n   ========================================================= *\/\n\n.bt-kontakt-sec{\n  position: relative !important;\n  isolation: isolate !important; \/* h\u00e4lt negative z-index im Container *\/\n}\n\n\/* Overlay \u00fcber BG, aber unter Content *\/\n.bt-kontakt-sec::before{\n  content:\"\";\n  position: absolute;\n  inset: 0;\n  background: rgba(0,0,0,0.2); \/* <- St\u00e4rke hier *\/\n  pointer-events: none;\n  z-index: -2;\n}\n\n\/* Divi BG-Layer (Video + Parallax Wrap) nach ganz hinten *\/\n.bt-kontakt-sec :is(.et_pb_section_video_bg, .et-pb-background-video, .et_parallax_bg_wrap, .et-pb-parallax-wrapper){\n  z-index: -3 !important;\n}\n<\/style>\n\n<script>\n(function(){\n  const anchor = document.getElementById(\"kontakt\");\n  if (!anchor) return;\n\n  \/\/ WICHTIG: echte Divi-Section treffen\n  const sec = anchor.closest(\".et_pb_section\");\n  if (!sec) return;\n\n  sec.classList.add(\"bt-kontakt-sec\");\n})();\n<\/script>\n\n\n\n\n\n\n<style id=\"bt-kontakt-vid-mobil\">\n@media (max-width: 980px) {\n  html body #kontakt.et_pb_section :is(.et_pb_section_video_bg, .et-pb-background-video) video {\n    top: auto !important;\n    bottom: 0 !important;\n    left: 0 !important;\n    right: auto !important;\n    width: 100vw !important;\n    height: calc(100vh + 140px) !important;\n    height: calc(100lvh + 140px) !important;\n    min-width: 0 !important;\n    min-height: 0 !important;\n    max-width: none !important;\n    max-height: none !important;\n    object-fit: cover !important;\n    object-position: 50% 100% !important;\n  }\n}\n@media (max-width: 767px) {\n  \/* Sektion mindestens so hoch wie der Bildschirm ohne Adressleiste *\/\n  html body #kontakt.et_pb_section {\n    min-height: 100vh !important;\n    min-height: 100lvh !important;\n  }\n}\n<\/style>\n\n<style id=\"bt-p1-mobile-content-visible\">\n\/* P1 mobile: native Inhalte ohne Divi-Einblendwartezeit. *\/\n@media(max-width:980px){\n html body.page-id-9606:not(.et-fb):not(.et_fb) #page-container :is(#about,#banner-tuer,#bar,#drinks-banner,#barcards,#banner-cantina,#cantina,#cantina-chef,#cantina-menu,#cantina-koch,#art,#event,#presse,#presse-fox,#vip,#kontakt,#footer) .et_animated{\n  opacity:1!important;\n  animation:none!important;\n  transform:none!important;\n }\n}\n<\/style>\n\n\n<!-- Kontakt \u00b7 Textbl\u00f6cke folgen wieder dem Footer wie in V3. -->\n<style id=\"bt-v3-contact-copy-glide\">\n@media(min-width:768px){\nhtml body.page-id-9606:not(.et-fb) #page-container #kontakt#kontakt:has(.bt-contact-v2) #kontakt1>.et_pb_column:first-child>.et_pb_text:nth-child(-n+3){translate:0 var(--bt-contact-copy-shift,-40px)!important}\n}\n@media(prefers-reduced-motion:reduce){\nhtml body.page-id-9606:not(.et-fb) #page-container #kontakt#kontakt:has(.bt-contact-v2) #kontakt1>.et_pb_column:first-child>.et_pb_text:nth-child(-n+3){translate:none!important}\n}\n<\/style>\n<script>\n(function(){\n'use strict';\nfunction init(){\nif(document.body.classList.contains('et-fb'))return;\nvar section=document.getElementById('kontakt'),footer=document.getElementById('footer');\nif(!section||!footer)return;\nvar reduced=matchMedia('(prefers-reduced-motion:reduce)'),frame=0,previousTime=0,current=null,target=0,footerProgress=0;\nfunction write(value){section.style.setProperty('--bt-contact-copy-shift',value.toFixed(2)+'px');section.style.setProperty('--bt-contact-footer-progress',(reduced.matches?footerProgress:Math.max(0,Math.min(1,1+value\/40))).toFixed(4));}\nfunction draw(time){\nframe=0;var dt=previousTime?Math.min(64,time-previousTime):16;previousTime=time;\nif(current===null||reduced.matches)current=target;\nelse current+=(target-current)*(1-Math.exp(-dt\/155));\nif(Math.abs(current-target)<.02)current=target;\nwrite(current);\nif(current!==target)frame=requestAnimationFrame(draw);else previousTime=0;\n}\nfunction update(){\nvar r=footer.getBoundingClientRect(),vh=innerHeight||document.documentElement.clientHeight;\nvar amount=Math.max(0,Math.min(1,(vh-r.top)\/Math.max(1,Math.min(r.height,vh*.4))));\nvar progress=amount*amount*(3-2*amount);footerProgress=progress;\ntarget=innerWidth<768||reduced.matches?0:-40*(1-progress);\nif(!frame)frame=requestAnimationFrame(draw);\n}\naddEventListener('scroll',update,{passive:true});addEventListener('resize',update,{passive:true});addEventListener('load',update,{once:true});\nif(reduced.addEventListener)reduced.addEventListener('change',update);\nif(document.fonts)document.fonts.ready.then(update);\nupdate();\n}\nif(document.readyState==='loading')document.addEventListener('DOMContentLoaded',init,{once:true});else init();\n})();\n<\/script>\n<style id=\"bt-v5-contact-footer-fine-tuning\">\n@media(min-width:768px){\nhtml body.page-id-9606:not(.et-fb) #page-container #kontakt#kontakt:has(.bt-contact-v2) #kontakt1>.et_pb_column:first-child>.et_pb_text:nth-child(-n+3)>.et_pb_text_inner{translate:0 calc(15px * var(--bt-contact-footer-progress,0))!important}\nhtml body.page-id-9606:not(.et-fb) #page-container #kontakt#kontakt:has(.bt-contact-v2) #kontakt1>.et_pb_column:first-child>.et_pb_text:nth-child(4)>.et_pb_text_inner{translate:0 calc(10px * var(--bt-contact-footer-progress,0))!important}\n}\n<\/style>\n<style id=\"bt-contact-mobile-ready-20261023\">\n@media(max-width:767px){\nhtml body #page-container #kontakt#kontakt{isolation:isolate!important;opacity:1!important;visibility:visible!important;clip-path:none!important;transform:none!important;animation:none!important}\nhtml body #page-container #kontakt#kontakt::before{content:\"\";position:absolute;inset:0;pointer-events:none;z-index:-2;background:rgba(0,0,0,.4)!important;opacity:1!important;visibility:visible!important;transform:none!important;clip-path:none!important;animation:none!important;transition:none!important}\nhtml body #page-container #kontakt#kontakt #kontakt1#kontakt1,\nhtml body #page-container #kontakt#kontakt #kontakt1#kontakt1 :is(.et_pb_column,.et_pb_text,.et_pb_text_inner,.bt-title-reveal,.bt-vis,.bt-w,.bt-wi){opacity:1!important;visibility:visible!important;transform:none!important;translate:none!important;clip-path:none!important;animation:none!important;transition:none!important}\n}\n<\/style>\n<style id=\"bt-route-arrow-refine-20261023\">\nhtml body #page-container#page-container #kontakt#kontakt #kontakt1 .bt-contact-route a>.bt-contact-route-arrow{font-size:16px!important;top:2px!important;line-height:18px!important}\n@media(max-width:767px){html body #page-container#page-container #kontakt#kontakt #kontakt1 .bt-contact-route a>.bt-contact-route-arrow{font-size:15px!important;top:-1px!important;align-self:center!important}}\n<\/style>\n<style id=\"bt-phone-payment-gap-20261024\">\n@media(max-width:767px){html body.page-id-9606 #page-container#page-container #kontakt#kontakt #kontakt1 .payment-info{gap:9px!important;}}\n<\/style>\n<style id=\"bt-contact-phone-permanent-20261024\">\n@media(max-width:767px){\nhtml body #page-container#page-container #kontakt#kontakt #kontakt1#kontakt1,\nhtml body #page-container#page-container #kontakt#kontakt #kontakt1#kontakt1 :is(.et_pb_column,.et_pb_text,.et_pb_text_inner,h2,h3,h4,h5,p,.bt-title-reveal,.bt-vis,.bt-w,.bt-wi,.bt-contactlinks,.bt-contactlinks__item,.bt-contactlinks__title,.bt-contactlinks__mail){opacity:1!important;visibility:visible!important;animation:none!important;animation-delay:0s!important;transition-property:color,background-color,border-color!important;filter:none!important;clip-path:none!important;content-visibility:visible!important;}\nhtml body #page-container#page-container #kontakt#kontakt #kontakt1#kontakt1 :is(.et_pb_column,.et_pb_text,.et_pb_text_inner){transform:none!important;translate:none!important;will-change:auto!important;}\n}\n<\/style>\n<style id=\"bt-route-desktop-compact-20261026\">\n@media(min-width:981px){\n html body.page-id-9606 #page-container#page-container #kontakt#kontakt #kontakt1 .bt-contact-route a{\n  width:max-content!important;min-width:0!important;max-width:100%!important;\n  grid-template-columns:max-content 16px!important;column-gap:8px!important;gap:8px!important;padding:0 10px 0 15px!important;\n }\n html body.page-id-9606 #page-container#page-container #kontakt#kontakt #kontakt1 .bt-contact-route a>.bt-contact-route-arrow{\n  width:16px!important;min-width:16px!important;height:18px!important;flex:0 0 16px!important;\n  font:400 16px\/18px Poppins,sans-serif!important;align-self:center!important;top:-1px!important;\n }\n}\n<\/style><style id=\"bt-desktop-payment-refine-20261026\">\n@media(min-width:981px){\n html body.page-id-9606:not(.et-fb) #page-container #kontakt#kontakt:has(.bt-contact-v2) #kontakt1>.et_pb_column:first-child>.et_pb_text:nth-child(4)>.et_pb_text_inner{\n  translate:0 calc(20px * var(--bt-contact-footer-progress,0))!important;\n }\n html body.page-id-9606 #page-container#page-container #kontakt#kontakt #kontakt1 .payment-info{gap:5px!important}\n}\n<\/style><\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_175 et_pb_column et_pb_column_1_2 et-last-child et_block_column et_pb_column_empty et_pb_css_mix_blend_mode_passthrough\"><\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_20 et_pb_section et_section_regular et_block_section\" id=\"open-stadtplan\">\r\n<div class=\"et_pb_row_74 et_pb_row et_block_row\">\r\n<div class=\"et_pb_column_176 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_code_52 et_pb_code et_pb_module map-under-menu\"><div class=\"et_pb_code_inner\"><!-- KONSULAT \u2013 Google Maps (deine Ma\u00dfe) -->\n<div class=\"map-wrap\">\n  <iframe\n    title=\"Karte: Bar Tausend \u2013 10117 Berlin-Mitte\"\n    loading=\"lazy\"\n    referrerpolicy=\"no-referrer-when-downgrade\"\n    allowfullscreen\n    data-src=\"https:\/\/www.google.com\/maps\/embed?pb=!1m18!1m12!1m3!1d4855.403447282817!2d13.381877477218946!3d52.520736872061384!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x47a851c3cd43c323%3A0x28063ae038243078!2sBAR%20TAUSEND!5e0!3m2!1sde!2sde!4v1768960002794!5m2!1sde!2sde\">\n  <\/iframe>\n<\/div>\n\n\n<style>\n  .map-wrap{\n    position:relative;\n    width:100%;\n    height:850px;                 \/* Basis\/Fallback *\/\n    border-radius:0 0 14px 14px;\n    overflow:hidden;\n    box-shadow:0 8px 28px rgba(0,0,0,.08);\n    background:#f3f5f7;\n    isolation:isolate;\n    z-index:10000;\n  }\n  .map-wrap iframe{\n    position:absolute; inset:0;\n    width:100%; height:100%;\n    border:0;\n    pointer-events:auto;\n  }\n\n  \/* Tablet \/ Phone *\/\n  @media (max-width:980px){ .map-wrap{ height:520px; } }\n  @media (max-width:767px){ .map-wrap{ height:100vh; height:100dvh; min-height:100svh; } }\n\n  \/* Desktop: volle H\u00f6he minus 70px *\/\n  @media (min-width:981px){\n    .map-wrap{\n      height:calc(100vh - 70px);\n      height:calc(100svh - 70px);   \/* moderne Units *\/\n      min-height:420px;\n    }\n  }\n\n  \/* Divi-Pseudo-Overlays Klicks durchlassen *\/\n  .map-guard:before, .map-guard:after,\n  .map-guard .et_pb_row:before, .map-guard .et_pb_row:after{\n    pointer-events:none !important;\n  }\n<\/style>\n\n<script>\n  \/\/ Optional: Divi-Container \u201eentsch\u00e4rfen\u201c, damit nichts die Map \u00fcberdeckt\n  document.addEventListener('DOMContentLoaded', function(){\n    var wrap = document.querySelector('.map-wrap');\n    if(!wrap) return;\n    var section = wrap.closest('.et_pb_section');\n    var row     = wrap.closest('.et_pb_row');\n    if(section) section.classList.add('map-guard');\n    if(row)     row.classList.add('map-guard');\n  }, {passive:true});\n<\/script>\n\n\n\n\n\n\n\n<style>\n  \/* 1) Section\/Row\/Modul um die Map: Abst\u00e4nde killen, nur dort wo wir .map-guard setzen *\/\n  .map-guard.et_pb_section{ padding:0 !important; }\n  .map-guard .et_pb_row{ padding:0 !important; }\n  .map-guard .et_pb_code, \n  .map-guard .et_pb_module{ margin:0 !important; }\n\n  \/* 2) Viewport-Units robuster: zuerst dvh\/svh, dann vh als Fallback *\/\n  @media (min-width:981px){\n    \/* bevorzugt: \"dvh\" (dynamic), dann \"svh\" (small), zuletzt klassisch \"vh\" *\/\n    @supports (height: 100dvh){\n      .map-wrap{ height: calc(100dvh - 70px); }\n    }\n    @supports (height: 100svh){\n      .map-wrap{ height: calc(100svh - 70px); }\n    }\n    \/* Fallback f\u00fcr \u00e4ltere Browser *\/\n    .map-wrap{ height: calc(100vh - 70px); }\n  }\n<\/style>\n\n<script>\n  \/\/ wir markieren die umgebende Section\/Row schon \u2013 erweitern das nur minimal:\n  document.addEventListener('DOMContentLoaded', function(){\n    var wrap = document.querySelector('.map-wrap');\n    if(!wrap) return;\n    var section = wrap.closest('.et_pb_section');\n    var row     = wrap.closest('.et_pb_row');\n    if(section) section.classList.add('map-guard');\n    if(row)     row.classList.add('map-guard');\n  }, {passive:true});\n<\/script>\n\n\n\n\n\n\n<style>\n  \/* Nur die Section\/Row\/Column, die wir via JS mit .map-guard markieren *\/\n  .map-guard.et_pb_section{\n    padding:0 !important;\n    margin:0 !important;\n    min-height:0 !important;\n    height:auto !important;\n    background:transparent !important;\n  }\n  .map-guard .et_pb_row{\n    padding:0 !important;\n    margin:0 !important;\n    min-height:0 !important;\n    height:auto !important;\n  }\n  .map-guard .et_pb_column{\n    padding:0 !important;\n    margin:0 !important;\n    min-height:0 !important;\n    height:auto !important;\n  }\n  .map-guard .et_pb_module,\n  .map-guard .et_pb_code{\n    margin:0 !important;\n  }\n  .map-guard .et_pb_module:last-child{\n    margin-bottom:0 !important;\n  }\n\n  \/* Sicherheitsnetz: Map-Box ohne typografische \u201eLuft\u201c *\/\n  .map-wrap{ line-height:0; }\n  .map-wrap iframe{ display:block; }\n<\/style>\n\n<script>\n  \/\/ Markiert die umgebende Section\/Row der Map f\u00fcr die obigen Regeln\n  document.addEventListener('DOMContentLoaded', function(){\n    var wrap = document.querySelector('.map-wrap');\n    if(!wrap) return;\n    var section = wrap.closest('.et_pb_section');\n    var row     = wrap.closest('.et_pb_row');\n    if(section) section.classList.add('map-guard');\n    if(row)     row.classList.add('map-guard');\n  }, {passive:true});\n<\/script>\n\n\n<\/div><\/div>\r\n<div class=\"et_pb_code_53 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><!-- =========================\n     STADTPLAN \u2014 Toggle + Auto Close\n========================= -->\n\n<style>\n#open-stadtplan{\n  overflow: hidden;\n  max-height: 0;\n  opacity: 0;\n  transform: translateY(-10px);\n  transition: max-height 0.6s ease, opacity 0.4s ease, transform 0.4s ease;\n}\n#open-stadtplan.is-open{\n  max-height: 2000px;\n  opacity: 1;\n  transform: translateY(0);\n}\n<\/style>\n\n<script>\n(function(){\n  const toggle = document.getElementById(\"toggle-stadtplan\");\n  const plan = document.getElementById(\"open-stadtplan\");\n  if(!toggle || !plan) return;\n  let seen = false;\n  let alignTimer = 0;\n  function adminHeight(){\n    const bar = document.getElementById(\"wpadminbar\");\n    return bar && bar.getBoundingClientRect().bottom > 0 ? bar.getBoundingClientRect().height : 0;\n  }\n  function fitMap(){\n    const footer = document.getElementById(\"footer\");\n    const copyright = document.querySelector(\".copyright\");\n    const tail = copyright ? copyright.closest(\".et_pb_section\") : null;\n    const footerHeight = (footer ? footer.getBoundingClientRect().height : 0) + (tail && tail !== footer ? tail.getBoundingClientRect().height : 0);\n    const mobile = window.matchMedia(\"(max-width:767px)\").matches;\n    const viewportHeight = mobile && window.visualViewport ? window.visualViewport.height : (window.innerHeight || document.documentElement.clientHeight);\n    const height = Math.max(160, viewportHeight - (mobile ? 0 : footerHeight) - adminHeight());\n    plan.style.setProperty(\"--bt-map-fit-height\", height + \"px\");\n  }\n  function visible(){\n    const r = plan.getBoundingClientRect();\n    const vh = window.innerHeight || document.documentElement.clientHeight;\n    return r.bottom > vh*0.15 && vh*0.85 > r.top;\n  }\n  function autoClose(){\n    if(Number(plan.dataset.btOpeningUntil||0)>Date.now()) return;\n    if(!plan.classList.contains(\"is-open\")) return;\n    if(visible()){\n      seen = true;\n    }else if(seen){\n      plan.classList.remove(\"is-open\");\n      const liveToggle = document.getElementById(\"toggle-stadtplan\");\n      if(liveToggle) liveToggle.setAttribute(\"aria-expanded\", \"false\");\n      seen = false;\n    }\n  }\n  document.addEventListener(\"click\", function(e){\n    const liveToggle = e.target && e.target.closest ? e.target.closest(\"#toggle-stadtplan\") : null;\n    if(!liveToggle) return;\n    e.preventDefault();\n    e.stopImmediatePropagation();\n    const open = !plan.classList.contains(\"is-open\");\n    liveToggle.setAttribute(\"aria-expanded\", String(open));\n    seen = false;\n    clearTimeout(alignTimer);\n    fitMap();\n    plan.dataset.btOpeningUntil = String(Date.now()+2200);\n    plan.classList.toggle(\"is-open\", open);\n    if(open){\n      plan.querySelectorAll('iframe[data-src]').forEach(function(frame){\n        const url = frame.getAttribute('data-src');\n        if(url && !frame.hasAttribute('src')){\n          frame.setAttribute('loading','eager');\n          frame.setAttribute('src',url);\n          frame.removeAttribute('data-src');\n        }\n      });\n      alignTimer = setTimeout(function(){\n        if(!plan.classList.contains(\"is-open\")) return;\n        fitMap();\n        const top = window.scrollY + plan.getBoundingClientRect().top - adminHeight();\n        window.scrollTo({top:Math.max(0, top), behavior:window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches ? \"auto\" : \"smooth\"});\n      },650);\n    }\n  }, true);\n  function observeFooter(){\n    fitMap();\n    if(!window.ResizeObserver) return;\n    const observer = new ResizeObserver(fitMap);\n    const footer = document.getElementById(\"footer\");\n    const copyright = document.querySelector(\".copyright\");\n    if(footer) observer.observe(footer);\n    if(copyright) observer.observe(copyright.closest(\".et_pb_section\") || copyright);\n  }\n  if(document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", observeFooter, {once:true});\n  else observeFooter();\n  if(document.fonts) document.fonts.ready.then(fitMap);\n  window.addEventListener(\"scroll\", autoClose, {passive:true});\n  window.addEventListener(\"resize\", fitMap, {passive:true});\n  if(window.visualViewport) window.visualViewport.addEventListener(\"resize\", fitMap, {passive:true});\n})();\n<\/script>\n\n<style id=\"bt-reserve-map-contrast-20261026\">\n\/* Der bestehende Hintergrundwechsel \u00fcbernimmt Ein- und Ausblenden der Karte. *\/\nhtml body.page-id-9606:has(#open-stadtplan.is-open) :is(#btcg2-dock#btcg2-dock,#bt-v4-phone-reserve#bt-v4-phone-reserve)>button.btcg2-reserve{\n background-color:rgba(5,5,5,.94)!important;\n}\n<\/style><\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_21 et_pb_section et_section_regular et_block_section\" id=\"footer\">\r\n<div class=\"et_pb_row_75 et_pb_row et_pb_gutters1 et_block_row\">\r\n<div class=\"et_pb_column_177 et_pb_column et_pb_column_1_3 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_166 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\" data-et-mv-hidden-tablet=\"true\"><div class=\"social-footer-logos\">\n<h2 class=\"bt-footer-social-title\">Follow us<\/h2>\n<p><a class=\"instagram-footer-logo\" href=\"https:\/\/www.instagram.com\/bar.tausend.berlin\/\" target=\"_blank\" rel=\"noopener\"><br \/><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/Instagram-Logo-02.png\" alt=\"Instagram\"  width=\"150\" height=\"150\" \/><br \/><\/a><\/p>\n<p><a class=\"resident-advisor-footer-logo\" href=\"https:\/\/de.ra.co\/clubs\/13913\" target=\"_blank\" rel=\"noopener\"><br \/><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/ResidentAdvisor_logo_2.png\" alt=\"Resident Advisor\"  width=\"150\" height=\"150\" \/><br \/><\/a><\/p>\n<\/div>\n<\/div><\/div>\r\n<div class=\"et_pb_text_167 et_pb_text et_pb_bg_layout_light et_clickable et_pb_module et_block_module\"><div class=\"et_pb_text_inner\" data-et-mv-hidden-phone=\"true\"><p style=\"text-align: center;\"><img decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/NoPhoto-300x297-1.png\" width=\"70\" alt=\"Fotografieren verboten!\" class=\"wp-image-730 alignnone size-medium\" style=\"display: block; margin-left: auto; margin-right: auto;\" \/><\/p>\n<p style=\"margin-top: -9px; text-align: center;\">No Foto<\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_178 et_pb_column et_pb_column_1_3 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_168 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p><a href=\"#home\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-Logo-Ani-01.apng\" alt=\"Bar Tausend Logo\" style=\"display: block; margin-left: auto; margin-right: auto;\" width=\"140\" height=\"140\" \/><\/a><\/p>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_179 et_pb_column et_pb_column_1_3 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_169 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h2 class=\"bt-footer-newsletter-title\">Newsletter<\/h2>\n<\/div><\/div>\r\n<div class=\"et_pb_contact_form_1 et_pb_contact_form_container clearfix et_pb_recaptcha_enabled et_pb_module et_flex_module bt-newsletter-info\" data-form_unique_num=\"1\" data-form_unique_id=\"b9970076-521a-42b5-8077-55967772df87\" id=\"tausend-newsletter-new\"><div class=\"et-pb-contact-message\"><\/div><div class=\"et_pb_contact\"><form class=\"et_pb_contact_form et_flex_module\" method=\"post\" action=\"https:\/\/tausendberlin.com\/en\/wp-json\/wp\/v2\/pages\/9606\">\r\n<div class=\"et_pb_contact_field_7 et_pb_contact_field et_pb_module et_flex_module et_flex_column_12_24 et_flex_column_12_24_tablet et_flex_column_12_24_phone\" data-id=\"name-newsletter-new\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_1_name-newsletter-new_7\">IHR NAME<\/label><input type=\"text\" name=\"et_pb_contact_1_name-newsletter-new_7\" id=\"et_pb_contact_1_name-newsletter-new_7\" class=\"input\" data-required_mark=\"required\" data-field_type=\"input\" data-original_id=\"name-newsletter-new\" placeholder=\"IHR NAME\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_8 et_pb_contact_field et_pb_module et_flex_module et_flex_column_12_24 et_flex_column_12_24_tablet et_flex_column_12_24_phone\" data-id=\"email-newsletter-new\" data-type=\"email\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_1_email-newsletter-new_8\">IHRE E-MAIL-ADRESSE<\/label><input type=\"text\" name=\"et_pb_contact_1_email-newsletter-new_8\" id=\"et_pb_contact_1_email-newsletter-new_8\" class=\"input\" data-required_mark=\"required\" data-field_type=\"email\" data-original_id=\"email-newsletter-new\" placeholder=\"IHRE E-MAIL-ADRESSE\" title=\"\" value=\"\" \/><\/div>\r\n<input type=\"hidden\" name=\"et_pb_contactform_submit_b9970076-521a-42b5-8077-55967772df87\" value=\"et_contact_proccess\" \/><div class=\"et_contact_bottom_container\"><div class=\"et_pb_button_wrapper\"><button type=\"submit\" name=\"et_builder_submit_button\" class=\"et_pb_button et_pb_contact_submit\">SENDEN<\/button><\/div><\/div><input type=\"hidden\" id=\"_wpnonce-et-pb-contact-form-submitted-b9970076-521a-42b5-8077-55967772df87\" name=\"_wpnonce-et-pb-contact-form-submitted-b9970076-521a-42b5-8077-55967772df87\" value=\"8b516ec54d\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/en\/wp-json\/wp\/v2\/pages\/9606\" \/><\/form><\/div><\/div>\r\n<div class=\"et_pb_code_54 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style id=\"bt-v5-newsletter-fine-tuning\">\nhtml body.page-id-9606 #page-container #footer#footer .bt-newsletter-info-toggle{opacity:.65!important;transition:opacity .7s ease!important}\nhtml body.page-id-9606 #page-container #footer#footer .bt-newsletter-info-toggle:is(:hover,:focus-visible){opacity:.95!important}\nhtml body.page-id-9606 #page-container #footer .bt-footer-newsletter-title{translate:0 -2px}\nhtml body.page-id-9606 #page-container #footer #tausend-newsletter-new input.input{padding-top:10px!important;padding-bottom:8px!important}\nhtml body.page-id-9606 #page-container #footer #tausend-newsletter-new .et_contact_bottom_container{translate:2px 0!important}\nhtml body.page-id-9606 #page-container #footer #tausend-newsletter-new .et_pb_contact_submit{translate:none!important}\n@media(max-width:980px){html body.page-id-9606 #page-container #footer #tausend-newsletter-new input.input{padding-top:14px!important;padding-bottom:12px!important}}\nhtml body.page-id-9606 #page-container #footer #tausend-newsletter-new .et_contact_bottom_container::after{left:50%!important;top:50%!important;right:auto!important;bottom:auto!important;margin:0!important;transform:translate(-50%,-50%) translateX(-2px) rotate(45deg)!important}\n\/* Ruhiger Infokreis: das i bleibt auch beim Hover lesbar. *\/\nhtml body.page-id-9606 #page-container #footer#footer .bt-newsletter-info-toggle span{color:#b9b6b0!important;border-color:#7a7772!important;background:transparent!important;font:500 12px\/1 Georgia,serif!important;text-transform:none!important;transition:color .7s ease,border-color .7s ease,background-color .7s ease!important}\nhtml body.page-id-9606 #page-container #footer#footer .bt-newsletter-info-toggle:is(:hover,:focus-visible) span{color:#d0cdc7!important;border-color:#aaa69f!important;background:rgba(255,255,255,.025)!important}\nhtml body.page-id-9606 #page-container #footer#footer .bt-newsletter-info-toggle:focus-visible{outline:1px solid #aaa69f!important;outline-offset:0!important;border-radius:50%}\n@media(prefers-reduced-motion:reduce){html body.page-id-9606 #page-container #footer#footer .bt-newsletter-info-toggle,html body.page-id-9606 #page-container #footer#footer .bt-newsletter-info-toggle span{transition:none!important}}\n<\/style>\n<style id=\"bt-v5-phone-footer-reserve-hide-style\">html.bt-phone-sound-off body.page-id-9606.bt-phone-footer-visible :is(#bt-v4-phone-reserve,#btcg2-dock){opacity:0!important;visibility:hidden!important;pointer-events:none!important;transition:opacity .4s ease,visibility 0s linear .4s!important}<\/style>\n<script id=\"bt-v5-phone-footer-reserve-hide\">\n(function(){function init(){if(document.body.classList.contains('et-fb'))return;var hero=document.getElementById('home');if(hero&&'IntersectionObserver' in window)new IntersectionObserver(function(es){document.body.classList.toggle('bt-phone-hero-visible',es[0].isIntersecting);},{rootMargin:'-30px 0px 0px 0px',threshold:0}).observe(hero);var f=document.getElementById('footer');if(!f)return;function set(on){document.body.classList.toggle('bt-phone-footer-visible',on);}\nif('IntersectionObserver' in window)new IntersectionObserver(function(es){set(es[0].isIntersecting);},{threshold:0}).observe(f);\nelse{function check(){var r=f.getBoundingClientRect();set(r.top<innerHeight&&r.bottom>0);}addEventListener('scroll',check,{passive:true});addEventListener('resize',check,{passive:true});check();}}\nif(document.readyState==='loading')document.addEventListener('DOMContentLoaded',init,{once:true});else init();})();\n<\/script>\n<style id=\"bt-newsletter-lowercase-info\">\n@layer btMobileUppercase{html body.page-id-9606:not(.et-fb) #page-container #footer#footer .bt-newsletter-info-toggle>span{text-transform:lowercase!important;}}\n<\/style>\n\n<style id=\"bt-newsletter-gap-refine-20261023\">\nhtml body #page-container #footer#footer #tausend-newsletter-new#tausend-newsletter-new>.et_pb_contact{margin-top:-3px!important}\n<\/style>\n<style id=\"bt-phone-newsletter-title-20261024\">\n\/* Move only the heading; the info control keeps its own position. *\/\n@media(max-width:767px){html body.page-id-9606 #page-container #footer#footer .bt-footer-newsletter-title{position:relative!important;top:3px!important;}}\n<\/style><\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_22 et_pb_section et_section_regular et_flex_section bt-mail-form\" id=\"mail-formular-booking-requests\">\r\n<div class=\"et_pb_row_76 et_pb_row et_flex_row\">\r\n<div class=\"et_pb_column_180 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_170 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><h2>DJ &amp; Artist Booking<\/h2>\n<\/div><\/div>\r\n<div class=\"et_pb_contact_form_2 et_pb_contact_form_container clearfix et_pb_recaptcha_enabled et_pb_module et_flex_module\" data-form_unique_num=\"2\" data-form_unique_id=\"c8c148c75d8f3f801dac1c2b760e7f5f\" id=\"et_pb_contact_form_c8c148c75d8f3f801dac1c2b760e7f5f\"><div class=\"et-pb-contact-message\"><\/div><div class=\"et_pb_contact\"><form class=\"et_pb_contact_form et_flex_module\" method=\"post\" action=\"https:\/\/tausendberlin.com\/en\/wp-json\/wp\/v2\/pages\/9606\">\r\n<div class=\"et_pb_contact_field_9 et_pb_contact_field et_pb_module et_flex_module et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\" data-id=\"name\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_2_name_9\">Ihr Name<\/label><input type=\"text\" name=\"et_pb_contact_2_name_9\" id=\"et_pb_contact_2_name_9\" class=\"input\" data-required_mark=\"required\" data-field_type=\"input\" data-original_id=\"name\" placeholder=\"Ihr Name\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_10 et_pb_contact_field et_pb_module et_flex_module et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\" data-id=\"email\" data-type=\"email\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_2_email_10\">Ihre E-Mail-Adresse<\/label><input type=\"text\" name=\"et_pb_contact_2_email_10\" id=\"et_pb_contact_2_email_10\" class=\"input\" data-required_mark=\"required\" data-field_type=\"email\" data-original_id=\"email\" placeholder=\"Ihre E-Mail-Adresse\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_11 et_pb_contact_field et_pb_module et_flex_module et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\" data-id=\"company\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_2_company_11\">Ihre Firma (optional)<\/label><input type=\"text\" name=\"et_pb_contact_2_company_11\" id=\"et_pb_contact_2_company_11\" class=\"input\" data-required_mark=\"not_required\" data-field_type=\"input\" data-original_id=\"company\" placeholder=\"Ihre Firma (optional)\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_12 et_pb_contact_field et_pb_module et_flex_module et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\" data-id=\"subject\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_2_subject_12\">Betreff<\/label><input type=\"text\" name=\"et_pb_contact_2_subject_12\" id=\"et_pb_contact_2_subject_12\" class=\"input\" data-required_mark=\"required\" data-field_type=\"input\" data-original_id=\"subject\" placeholder=\"Betreff\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_13 et_pb_contact_field et_pb_module et_flex_module et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\" data-id=\"message\" data-type=\"textarea\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_2_message_13\">Ihre Nachricht<\/label><textarea name=\"et_pb_contact_2_message_13\" id=\"et_pb_contact_2_message_13\" class=\"et_pb_contact_message input\" data-required_mark=\"required\" data-field_type=\"textarea\" data-original_id=\"message\" placeholder=\"Ihre Nachricht\"><\/textarea><\/div>\r\n<input type=\"hidden\" name=\"et_pb_contactform_submit_c8c148c75d8f3f801dac1c2b760e7f5f\" value=\"et_contact_proccess\" \/><div class=\"et_contact_bottom_container\"><div class=\"et_pb_button_wrapper\"><button type=\"submit\" name=\"et_builder_submit_button\" class=\"et_pb_button et_pb_contact_submit\">Anfrage senden<\/button><\/div><\/div><input type=\"hidden\" id=\"_wpnonce-et-pb-contact-form-submitted-c8c148c75d8f3f801dac1c2b760e7f5f\" name=\"_wpnonce-et-pb-contact-form-submitted-c8c148c75d8f3f801dac1c2b760e7f5f\" value=\"0bcfcf7729\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/en\/wp-json\/wp\/v2\/pages\/9606\" \/><\/form><\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_23 et_pb_section et_section_regular et_flex_section bt-mail-form\" id=\"mail-formular-location-rent-requests\">\r\n<div class=\"et_pb_row_77 et_pb_row et_flex_row\">\r\n<div class=\"et_pb_column_181 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_171 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><h2>Location-Anfrage<\/h2>\n<\/div><\/div>\r\n<div class=\"et_pb_contact_form_3 et_pb_contact_form_container clearfix et_pb_recaptcha_enabled et_pb_module et_flex_module\" data-form_unique_num=\"3\" data-form_unique_id=\"18200769180150812bee1644c9ec79c1\" id=\"et_pb_contact_form_18200769180150812bee1644c9ec79c1\"><div class=\"et-pb-contact-message\"><\/div><div class=\"et_pb_contact\"><form class=\"et_pb_contact_form et_flex_module\" method=\"post\" action=\"https:\/\/tausendberlin.com\/en\/wp-json\/wp\/v2\/pages\/9606\">\r\n<div class=\"et_pb_contact_field_14 et_pb_contact_field et_pb_module et_flex_module et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\" data-id=\"name\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_3_name_14\">Ihr Name<\/label><input type=\"text\" name=\"et_pb_contact_3_name_14\" id=\"et_pb_contact_3_name_14\" class=\"input\" data-required_mark=\"required\" data-field_type=\"input\" data-original_id=\"name\" placeholder=\"Ihr Name\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_15 et_pb_contact_field et_pb_module et_flex_module et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\" data-id=\"email\" data-type=\"email\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_3_email_15\">Ihre E-Mail-Adresse<\/label><input type=\"text\" name=\"et_pb_contact_3_email_15\" id=\"et_pb_contact_3_email_15\" class=\"input\" data-required_mark=\"required\" data-field_type=\"email\" data-original_id=\"email\" placeholder=\"Ihre E-Mail-Adresse\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_16 et_pb_contact_field et_pb_module et_flex_module et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\" data-id=\"company\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_3_company_16\">Ihre Firma (optional)<\/label><input type=\"text\" name=\"et_pb_contact_3_company_16\" id=\"et_pb_contact_3_company_16\" class=\"input\" data-required_mark=\"not_required\" data-field_type=\"input\" data-original_id=\"company\" placeholder=\"Ihre Firma (optional)\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_17 et_pb_contact_field et_pb_module et_flex_module et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\" data-id=\"subject\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_3_subject_17\">Betreff<\/label><input type=\"text\" name=\"et_pb_contact_3_subject_17\" id=\"et_pb_contact_3_subject_17\" class=\"input\" data-required_mark=\"required\" data-field_type=\"input\" data-original_id=\"subject\" placeholder=\"Betreff\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_18 et_pb_contact_field et_pb_module et_flex_module et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\" data-id=\"message\" data-type=\"textarea\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_3_message_18\">Ihre Nachricht<\/label><textarea name=\"et_pb_contact_3_message_18\" id=\"et_pb_contact_3_message_18\" class=\"et_pb_contact_message input\" data-required_mark=\"required\" data-field_type=\"textarea\" data-original_id=\"message\" placeholder=\"Ihre Nachricht\"><\/textarea><\/div>\r\n<input type=\"hidden\" name=\"et_pb_contactform_submit_18200769180150812bee1644c9ec79c1\" value=\"et_contact_proccess\" \/><div class=\"et_contact_bottom_container\"><div class=\"et_pb_button_wrapper\"><button type=\"submit\" name=\"et_builder_submit_button\" class=\"et_pb_button et_pb_contact_submit\">Anfrage senden<\/button><\/div><\/div><input type=\"hidden\" id=\"_wpnonce-et-pb-contact-form-submitted-18200769180150812bee1644c9ec79c1\" name=\"_wpnonce-et-pb-contact-form-submitted-18200769180150812bee1644c9ec79c1\" value=\"3268ed89b9\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/en\/wp-json\/wp\/v2\/pages\/9606\" \/><\/form><\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_24 et_pb_section et_section_regular et_flex_section bt-mail-form\" id=\"mail-formular-lost-and-found\">\r\n<div class=\"et_pb_row_78 et_pb_row et_flex_row\">\r\n<div class=\"et_pb_column_182 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_172 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><h2>Lost &amp; Found<\/h2>\n<\/div><\/div>\r\n<div class=\"et_pb_contact_form_4 et_pb_contact_form_container clearfix et_pb_recaptcha_enabled et_pb_module et_flex_module\" data-form_unique_num=\"4\" data-form_unique_id=\"05af36844251c47efacbd02634ccd3c9\" id=\"et_pb_contact_form_05af36844251c47efacbd02634ccd3c9\"><div class=\"et-pb-contact-message\"><\/div><div class=\"et_pb_contact\"><form class=\"et_pb_contact_form et_flex_module\" method=\"post\" action=\"https:\/\/tausendberlin.com\/en\/wp-json\/wp\/v2\/pages\/9606\">\r\n<div class=\"et_pb_contact_field_19 et_pb_contact_field et_pb_module et_flex_module et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\" data-id=\"name\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_4_name_19\">Ihr Name<\/label><input type=\"text\" name=\"et_pb_contact_4_name_19\" id=\"et_pb_contact_4_name_19\" class=\"input\" data-required_mark=\"required\" data-field_type=\"input\" data-original_id=\"name\" placeholder=\"Ihr Name\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_20 et_pb_contact_field et_pb_module et_flex_module et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\" data-id=\"email\" data-type=\"email\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_4_email_20\">Ihre E-Mail-Adresse<\/label><input type=\"text\" name=\"et_pb_contact_4_email_20\" id=\"et_pb_contact_4_email_20\" class=\"input\" data-required_mark=\"required\" data-field_type=\"email\" data-original_id=\"email\" placeholder=\"Ihre E-Mail-Adresse\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_21 et_pb_contact_field et_pb_module et_flex_module et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\" data-id=\"company\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_4_company_21\">Ihre Firma (optional)<\/label><input type=\"text\" name=\"et_pb_contact_4_company_21\" id=\"et_pb_contact_4_company_21\" class=\"input\" data-required_mark=\"not_required\" data-field_type=\"input\" data-original_id=\"company\" placeholder=\"Ihre Firma (optional)\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_22 et_pb_contact_field et_pb_module et_flex_module et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\" data-id=\"subject\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_4_subject_22\">Betreff<\/label><input type=\"text\" name=\"et_pb_contact_4_subject_22\" id=\"et_pb_contact_4_subject_22\" class=\"input\" data-required_mark=\"required\" data-field_type=\"input\" data-original_id=\"subject\" placeholder=\"Betreff\" title=\"\" value=\"\" \/><\/div>\r\n<div class=\"et_pb_contact_field_23 et_pb_contact_field et_pb_module et_flex_module et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\" data-id=\"message\" data-type=\"textarea\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_4_message_23\">Ihre Nachricht<\/label><textarea name=\"et_pb_contact_4_message_23\" id=\"et_pb_contact_4_message_23\" class=\"et_pb_contact_message input\" data-required_mark=\"required\" data-field_type=\"textarea\" data-original_id=\"message\" placeholder=\"Ihre Nachricht\"><\/textarea><\/div>\r\n<input type=\"hidden\" name=\"et_pb_contactform_submit_05af36844251c47efacbd02634ccd3c9\" value=\"et_contact_proccess\" \/><div class=\"et_contact_bottom_container\"><div class=\"et_pb_button_wrapper\"><button type=\"submit\" name=\"et_builder_submit_button\" class=\"et_pb_button et_pb_contact_submit\">Anfrage senden<\/button><\/div><\/div><input type=\"hidden\" id=\"_wpnonce-et-pb-contact-form-submitted-05af36844251c47efacbd02634ccd3c9\" name=\"_wpnonce-et-pb-contact-form-submitted-05af36844251c47efacbd02634ccd3c9\" value=\"a0e3436032\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/en\/wp-json\/wp\/v2\/pages\/9606\" \/><\/form><\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_25 et_pb_section et_section_regular et_block_section bt-copyright-overscroll\">\r\n<div class=\"et_pb_row_79 et_pb_row et_block_row\">\r\n<div class=\"et_pb_column_183 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_blurb_0 et_pb_blurb et_pb_bg_layout_light et_pb_blurb_position_top et_pb_module et_block_module\"><div class=\"et_pb_blurb_content\"><div class=\"et_pb_blurb_container\"><div class=\"et_pb_blurb_description\" data-et-mv-hidden-tablet=\"true\" data-et-mv-hidden-phone=\"true\"><p class=\"copyright\" style=\"text-align: center; font-size: 12px!important;\"><span>\u00a9 2026 Bar Tausend \u00b7 Agentur 103<\/span><span class=\"bt-copyright-separator\" aria-hidden=\"true\"> \u00a0|\u00a0\u00a0<\/span><span role=\"navigation\" aria-label=\"Footer\" style=\"display: inline-block;\"><a href=\"https:\/\/tausendberlin.com\/impressum#karriere\" style=\"display: inline-block;\">Karriere<\/a> \u00a0|\u00a0 <a href=\"https:\/\/tausendberlin.com\/impressum\" style=\"display: inline-block;\">Impressum<\/a> \u00a0|\u00a0 <a href=\"https:\/\/tausendberlin.com\/impressum\/#datenschutz\" style=\"display: inline-block;\">Datenschutz<\/a><\/span><\/p>\n<\/div><\/div><\/div><\/div>\r\n<div class=\"et_pb_code_55 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n\n\/* =========================================\n   FRONTEND \u2013 Video wird zum Standbild\n   (dein urspr\u00fcnglicher Effekt bleibt)\n   ========================================= *\/\nhtml:not(.et-fb):not(.et_fb) :is(.et_pb_section_video_bg, .et-pb-background-video) .mejs-mediaelement{\n  clip-path: inset(0% 0% 0% 0%);\n}\n\nhtml:not(.et-fb):not(.et_fb) :is(.et_pb_section_video_bg, .et-pb-background-video) video{\n  position: fixed;\n  top: 0;\n  left: 0;\n\n  \/* sorgt daf\u00fcr, dass es trotzdem korrekt f\u00fcllt *\/\n  min-width: 100%;\n  min-height: 100%;\n  object-fit: cover;\n  object-position: center center;\n}\n\n\n\/* =========================================\n   DIVI BUILDER \u2013 normales Verhalten zur\u00fcck\n   ========================================= *\/\nhtml.et-fb :is(.et_pb_section_video_bg, .et-pb-background-video) video,\nhtml.et_fb :is(.et_pb_section_video_bg, .et-pb-background-video) video,\nbody.et-fb :is(.et_pb_section_video_bg, .et-pb-background-video) video,\nbody.et_fb :is(.et_pb_section_video_bg, .et-pb-background-video) video{\n\n  position: absolute !important;\n  top: 50% !important;\n  left: 50% !important;\n  transform: translate(-50%, -50%) !important;\n\n  width: auto !important;\n  height: auto !important;\n  min-width: 100% !important;\n  min-height: 100% !important;\n\n  object-fit: cover !important;\n  object-position: center center !important;\n}\n\n\/* Clip-Path zerst\u00f6rt im Builder die Berechnung *\/\nhtml.et-fb :is(.et_pb_section_video_bg, .et-pb-background-video) .mejs-mediaelement,\nhtml.et_fb :is(.et_pb_section_video_bg, .et-pb-background-video) .mejs-mediaelement,\nbody.et-fb :is(.et_pb_section_video_bg, .et-pb-background-video) .mejs-mediaelement,\nbody.et_fb :is(.et_pb_section_video_bg, .et-pb-background-video) .mejs-mediaelement{\n  clip-path: none !important;\n}\n\n<\/style>\n\n\n\n\n\n\n\n\n\n\n\n\n\n<style id=\"bt-newsletter-divi5-compat\">\n\/* Divi 5: neue Feldklassen und Button-Huelle, vorhandenes Design behalten. *\/\n#tausend-newsletter-new form.et_pb_contact_form{\n  align-items:center !important;\n}\n#tausend-newsletter-new form.et_pb_contact_form > .et_pb_contact_field{\n  grid-column:auto !important;\n  grid-row:1 !important;\n  min-width:0 !important;\n}\n#tausend-newsletter-new form.et_pb_contact_form > .et_contact_bottom_container{\n  grid-column:3 \/ 4 !important;\n  grid-row:1 !important;\n  align-self:center !important;\n}\n#tausend-newsletter-new .et_contact_bottom_container > .et_pb_button_wrapper{\n  display:flex !important;\n  align-items:center !important;\n  justify-content:center !important;\n  width:40px !important;\n  height:40px !important;\n  min-height:40px !important;\n  padding:0 !important;\n  margin:0 !important;\n  line-height:0 !important;\n}\n@media (max-width:767px){\n  #tausend-newsletter-new form.et_pb_contact_form > .et_pb_contact_field{\n    grid-column:1 \/ -1 !important;\n    grid-row:auto !important;\n  }\n  #tausend-newsletter-new form.et_pb_contact_form > .et_contact_bottom_container{\n    grid-column:1 \/ -1 !important;\n    grid-row:auto !important;\n    margin-top:12px !important;\n  }\n}\n<\/style>\n<style id=\"bt-newsletter-button-divi5-v4\">\nbody #page-container .et_pb_section #tausend-newsletter-new .et_contact_bottom_container{\n  align-self:center!important;overflow:visible!important;width:32px!important;height:32px!important;min-width:32px!important;max-width:32px!important;max-height:32px!important;flex:0 0 32px!important;\n}\nbody #page-container .et_pb_section #tausend-newsletter-new .et_contact_bottom_container .et_pb_button_wrapper{\n  display:flex!important;align-items:center!important;justify-content:center!important;\n  padding:0!important;margin:0!important;line-height:0!important;width:32px!important;height:32px!important;min-height:32px!important;\n}\nbody #page-container .et_pb_section #tausend-newsletter-new .et_contact_bottom_container button.et_pb_contact_submit{\n  position:relative!important;top:auto!important;transform:none!important;translate:none!important;\n  margin:0!important;padding:0!important;width:32px!important;height:32px!important;\n  min-width:32px!important;max-width:32px!important;min-height:32px!important;max-height:32px!important;line-height:0!important;box-sizing:border-box!important;\n}\nbody #page-container .et_pb_section #tausend-newsletter-new .et_contact_bottom_container button.et_pb_contact_submit::before,\nbody #page-container .et_pb_section #tausend-newsletter-new .et_contact_bottom_container button.et_pb_contact_submit::after{\n  content:none!important;display:none!important;\n}\nbody #page-container .et_pb_section #tausend-newsletter-new .et_contact_bottom_container::after{\n  width:8px!important;height:8px!important;transform:translateX(-2px) rotate(45deg)!important;\n}\n@media(min-width:768px){body #page-container .et_pb_section #tausend-newsletter-new form.et_pb_contact_form{grid-template-columns:minmax(0,1fr) minmax(0,1fr) 32px!important;}}<\/style><style id=\"bt-mobile-layout-divi5-v1\">\n@media(max-width:980px){\n  body #page-container #about{height:auto!important;min-height:100svh!important;padding-top:52px!important;padding-bottom:48px!important;}\n  body #page-container #about > .et_pb_row{\n    position:relative!important;inset:auto!important;top:auto!important;left:auto!important;right:auto!important;bottom:auto!important;\n    transform:none!important;translate:none!important;width:100%!important;max-width:none!important;height:auto!important;min-height:0!important;\n    margin:0!important;display:block!important;\n  }\n  body #page-container #about > .et_pb_row > .et_pb_column{width:100%!important;max-width:none!important;flex-basis:100%!important;float:none!important;margin:0!important;}\n  body #page-container #about > .et_pb_row > .et_pb_column:empty{display:none!important;}\n  body #page-container #home :is(.et_parallax_bg_wrap,.et-pb-parallax-wrapper){display:none!important;}\n  body #page-container #home.bt-startbanner{\n    --bt-start-height:100svh;\n    height:100svh!important;min-height:100svh!important;\n  }\n  body #page-container #home .bt-video-row{height:100svh!important;min-height:100svh!important;}\n  body #page-container #home .bt-standbild-layer img{height:100svh!important;max-height:none!important;}\n  body #page-container #bar,\n  body #page-container #bar :is(.et_parallax_bg,.et-pb-parallax-background){background-attachment:scroll!important;}\n}\n@media(max-width:767px){\n  body #page-container #image-gallery-01{margin-top:28px!important;}\n}\n#bar{isolation:isolate!important;}\n#bar::after{content:\"\";position:absolute;inset:0;background:rgba(0,0,0,.18);z-index:1;pointer-events:none;}\n#bar > .et_pb_row{position:relative;z-index:2;}\n<\/style><\/div><\/div>\r\n<div class=\"et_pb_code_56 et_pb_code et_pb_module bt-enter-anchor-code\"><div class=\"et_pb_code_inner\"><script id=\"bt-v5-enter-sections\">\n(function(d,w){\n\"use strict\";\nif(d.body.classList.contains(\"et-fb\")||\/[?&]et_fb=1\/.test(location.search))return;\nfunction visible(el){var s=getComputedStyle(el);return el.getClientRects().length&&el.getBoundingClientRect().height>1&&s.display!==\"none\"&&s.visibility!==\"hidden\";}\nfunction sections(){var list=Array.from(d.querySelectorAll(\".et_pb_section\")).filter(function(el){\n return !el.classList.contains(\"bt-enter-skip\")&&!\/^mail-formular-|^bt-reservation|^open-stadtplan$\/.test(el.id)&&!el.closest(\".et-l--header,.et-l--footer,.popup,[role=dialog],[aria-hidden=true]\")&&visible(el);\n});var footer=list.findIndex(function(el){return el.id===\"footer\";});return footer<0?list:list.slice(0,footer+1);\n}\nfunction modalOpen(){return Array.from(d.querySelectorAll('[aria-modal=\"true\"],dialog[open]')).some(visible);}\nd.addEventListener(\"keydown\",function(e){\n if(e.key!==\"Enter\"||e.defaultPrevented||e.repeat||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)return;\n var target=d.activeElement;\n if(target&&target.closest('input,textarea,select,a,button,summary,[role=\"button\"],[role=\"menuitem\"],[role=\"tab\"],[contenteditable]:not([contenteditable=\"false\"])'))return;\n if(modalOpen())return;\n var list=sections();if(!list.length)return;\n var admin=d.getElementById(\"wpadminbar\"),offset=admin?Math.max(0,admin.getBoundingClientRect().bottom):0;\n var line=(w.scrollY||0)+offset+12;\n var scroller=d.scrollingElement||d.documentElement;\n var atEnd=(w.scrollY||0)+w.innerHeight>=scroller.scrollHeight-4;\n var next=atEnd?list[0]:(list.find(function(el){return el.getBoundingClientRect().top+(w.scrollY||0)>line;})||list[0]);\n e.preventDefault();\n w.scrollTo({top:Math.max(0,next.getBoundingClientRect().top+(w.scrollY||0)-offset),behavior:w.matchMedia(\"(prefers-reduced-motion:reduce)\").matches?\"instant\":\"smooth\"});\n});\n})(document,window);\n<\/script>\n<style>.bt-enter-anchor-code,\n.bt-enter-anchor-code .et_pb_code_inner{\n  display:none !important;\n  height:0 !important;\n  min-height:0 !important;\n  max-height:0 !important;\n  margin:0 !important;\n  padding:0 !important;\n  border:0 !important;\n  overflow:hidden !important;\n  visibility:hidden !important;\n}<\/style><\/div><\/div>\r\n<div class=\"et_pb_code_57 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><!-- =========================================================\n     BAR TAUSEND \u00b7 CURSOR (Logo-Zeiger + weich aus\/ein)\n\n     EINBAU\n     Den KOMPLETTEN Inhalt des vorhandenen Moduls\n     \u201eCURSOR \u00b7 SOFT AUSBLENDEN\u201c durch diesen Code ersetzen.\n     Kein neues Modul anlegen (sonst wird der Footer h\u00f6her).\n\n     WAS ES MACHT\n     - Logo-Zeiger folgt der Maus, \u00fcber Links\/Buttons die zweite Form\n     - blendet beim ersten Bewegen weich ein\n     - nach 5 Sekunden ohne Bewegung weich aus, bei Bewegung weich ein\n     - beim Verlassen des Browserfensters weich aus\n     - auf hellen Cantina-Fl\u00e4chen dunkel, in Gallery 02 hell\n     - nur mit Maus (Handy\/Tablet behalten ihr normales Verhalten)\n========================================================= -->\n\n<style>\n@media (hover:hover) and (pointer:fine) {\n\n  html:has(body.bt-theme-cursor-active),\n  html body.page-id-9606.bt-theme-cursor-active,\n  html body.page-id-9606.bt-theme-cursor-active *,\n  html body.page-id-9606.bt-theme-cursor-active :is(#btcm-menu,#bt-reservation-modal,#btcg-fullscreen),\n  html body.page-id-9606.bt-theme-cursor-active :is(#btcm-menu,#bt-reservation-modal,#btcg-fullscreen) *,\n  html body.page-id-9606.bt-theme-cursor-active :is(#btcm-menu,#btcg-fullscreen)::backdrop {\n    cursor: none !important;\n  }\n\n  #bt-theme-cursor {\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 16px;\n    height: 16px;\n    z-index: 2147483647;\n    opacity: 0;\n    visibility: hidden;\n    pointer-events: none;\n    filter: brightness(1);\n    transition:\n      filter 900ms cubic-bezier(.22, .61, .36, 1),\n      opacity 450ms ease,\n      visibility 0s linear 450ms;\n    will-change: transform, filter, opacity;\n  }\n\n  \/* weich einblenden *\/\n  #bt-theme-cursor.is-visible {\n    opacity: 1;\n    visibility: visible;\n    transition:\n      filter 900ms cubic-bezier(.22, .61, .36, 1),\n      opacity 450ms ease,\n      visibility 0s;\n  }\n\n  \/* weich ausblenden (Ruhe oder Fenster verlassen) *\/\n  #bt-theme-cursor.bt-cursor-hidden {\n    opacity: 0 !important;\n    visibility: hidden !important;\n    transition:\n      filter 900ms cubic-bezier(.22, .61, .36, 1),\n      opacity 600ms ease,\n      visibility 0s linear 600ms !important;\n  }\n\n  \/* dunkler Zeiger auf hellen Fl\u00e4chen *\/\n  #bt-theme-cursor.is-dark {\n    filter: brightness(.14) contrast(1.2);\n  }\n\n  #bt-theme-cursor::before,\n  #bt-theme-cursor::after {\n    content: \"\";\n    position: absolute;\n    inset: 0;\n    width: 16px;\n    height: 16px;\n    background-position: center;\n    background-repeat: no-repeat;\n    background-size: contain;\n    transition: opacity 180ms ease;\n  }\n\n  \/* normaler Zeiger *\/\n  #bt-theme-cursor::before {\n    background-image: url(\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/Cursor-3.png\");\n    opacity: 1;\n  }\n\n  \/* Zeiger \u00fcber Links \/ Buttons *\/\n  #bt-theme-cursor::after {\n    background-image: url(\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/Cursor-4.png\");\n    opacity: 0;\n  }\n  #bt-theme-cursor.is-interactive::before { opacity: 0; }\n  #bt-theme-cursor.is-interactive::after { opacity: .65 !important; }\n}\n<\/style>\n\n<script>\n(function () {\n  \"use strict\";\n\n  var INACTIVE_TIME = 5000; \/* nach 5 s ohne Bewegung weich ausblenden *\/\n\n  function initCursor() {\n    \/* nur einmal pro Seite, nicht im Builder, nur mit Maus *\/\n    if (window.__btThemeCursor) return;\n    if (document.body.classList.contains(\"et-fb\")) return;\n    if (!window.matchMedia(\"(hover:hover) and (pointer:fine)\").matches) return;\n    window.__btThemeCursor = true;\n    window.__btCursorAutoHide = true;\n\n    var cursor = document.getElementById(\"bt-theme-cursor\");\n    if (!cursor) {\n      cursor = document.createElement(\"span\");\n      cursor.id = \"bt-theme-cursor\";\n      cursor.setAttribute(\"aria-hidden\", \"true\");\n      document.body.appendChild(cursor);\n    }\n\n    var mouseX = -100;\n    var mouseY = -100;\n    var frameRequested = false;\n    var revealRequested = false;\n    var idleTimer = null;\n    var pointedEl = null;\n    var cursorHitTestNeeded = false;\n\n    function updateCursor() {\n      frameRequested = false;\n      \/* Pointer events already identify the target; only scrolling needs a fresh hit-test. *\/\n      var el = pointedEl;\n      if (cursorHitTestNeeded || !el || !el.isConnected) el = document.elementFromPoint(mouseX, mouseY);\n      cursorHitTestNeeded = false;\n      pointedEl = el;\n      if (revealRequested) { revealRequested = false; show(); }\n      cursor.style.transform = \"translate3d(\" + (mouseX - 8) + \"px,\" + (mouseY - 8) + \"px,0)\";\n      if (!el) return;\n\n      \/* Cantina hell = Zeiger dunkel, Gallery 02 hat Vorrang (hell) *\/\n      var isGallery02 = el.closest(\"#bt-cantina-gallery-view\");\n      var isLight = el.closest(\"#cantina-chef, #cantina-menu\");\n      var dark = Boolean(isLight) && !isGallery02;\n      if (cursor.classList.contains(\"is-dark\") !== dark) cursor.classList.toggle(\"is-dark\", dark);\n\n      \/* Links \/ Buttons *\/\n      var isInteractive = el.closest(\"a, button, [role='button'], input, textarea, select, .et_pb_button, .bt-lineup-shell\");\n      var interactive = Boolean(isInteractive);\n      if (cursor.classList.contains(\"is-interactive\") !== interactive) cursor.classList.toggle(\"is-interactive\", interactive);\n    }\n\n    function requestCursorUpdate() {\n      if (frameRequested) return;\n      frameRequested = true;\n      requestAnimationFrame(updateCursor);\n    }\n\n    function hide() {\n      revealRequested = false;\n      clearTimeout(idleTimer);\n      cursor.classList.add(\"bt-cursor-hidden\");\n    }\n\n    function show() {\n      if (!cursor.classList.contains(\"is-visible\")) cursor.classList.add(\"is-visible\");\n      if (cursor.classList.contains(\"bt-cursor-hidden\")) cursor.classList.remove(\"bt-cursor-hidden\");\n      clearTimeout(idleTimer);\n      idleTimer = setTimeout(hide, INACTIVE_TIME);\n    }\n\n    window.addEventListener(\"pointermove\", function (event) {\n      if (event.pointerType && event.pointerType !== \"mouse\") return;\n      mouseX = event.clientX;\n      mouseY = event.clientY;\n      pointedEl = event.target;\n      revealRequested = true;\n      requestCursorUpdate();\n    }, { passive: true });\n\n    function refreshCursorTarget() { cursorHitTestNeeded = true; requestCursorUpdate(); }\n    window.addEventListener(\"scroll\", refreshCursorTarget, { passive: true });\n    window.addEventListener(\"resize\", refreshCursorTarget, { passive: true });\n\n    \/* Browserfenster verlassen: weich ausblenden *\/\n    document.addEventListener(\"mouseleave\", hide);\n    document.addEventListener(\"mouseout\", function (event) {\n      if (!event.relatedTarget) hide();\n    });\n    window.addEventListener(\"blur\", hide);\n    document.addEventListener(\"visibilitychange\", function () {\n      if (document.hidden) hide();\n    });\n\n    document.body.classList.add(\"bt-theme-cursor-active\");\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", initCursor);\n  } else {\n    initCursor();\n  }\n})();\n<\/script>\n<style id=\"bt-cursor-modal-compat\">\n@media (hover:hover) and (pointer:fine) {\n  \/* Native Modal-Dialoge liegen \u00fcber allen normalen z-index-Ebenen. *\/\n  body.bt-theme-cursor-active dialog[open],\n  body.bt-theme-cursor-active dialog[open] *,\n  body.bt-theme-cursor-active dialog[open]::backdrop {\n    cursor:url(\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/Cursor-3.png\") 8 8, auto !important;\n  }\n  body.bt-theme-cursor-active dialog[open] :is(a,button,[role=\"button\"],.et_pb_button),\n  body.bt-theme-cursor-active dialog[open] :is(a,button,[role=\"button\"],.et_pb_button) * {\n    cursor:url(\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/Cursor-4.png\") 8 8, pointer !important;\n  }\n  body:has(dialog[open]) #bt-theme-cursor { visibility:hidden !important; opacity:0 !important; }\n}\n<\/style>\n\n<style id=\"bt-v5-cursor-window-exit\">\n@media(hover:hover) and (pointer:fine){\nhtml body.bt-cursor-outside #bt-theme-cursor,\nhtml body.bt-cursor-outside dialog[open] #bt-theme-cursor,\nhtml body.bt-cursor-outside :is(.bt-reserve-goo,.bt-mg){\nopacity:0!important;visibility:hidden!important;transition:none!important;\n}\n}\n<\/style>\n<script id=\"bt-v5-cursor-window-exit-logic\">\n(function(){\n'use strict';\nfunction init(){\nif(document.body.classList.contains('et-fb')||!matchMedia('(hover:hover) and (pointer:fine)').matches||document.body.dataset.btCursorExitReady)return;\ndocument.body.dataset.btCursorExitReady='1';\nfunction leave(){\nif(!document.body.classList.contains('bt-cursor-outside'))document.body.classList.add('bt-cursor-outside');\nvar cursor=document.getElementById('bt-theme-cursor');\nif(cursor){if(!cursor.classList.contains('bt-cursor-hidden'))cursor.classList.add('bt-cursor-hidden');if(cursor.classList.contains('is-visible'))cursor.classList.remove('is-visible');}\n}\nfunction move(e){\nif(e.pointerType&&e.pointerType!=='mouse')return;\nif(document.hidden||e.clientX<0||e.clientY<0||e.clientX>=innerWidth||e.clientY>=innerHeight){leave();return;}\nif(document.body.classList.contains('bt-cursor-outside'))document.body.classList.remove('bt-cursor-outside');\n}\nfunction out(e){if(!e.relatedTarget)leave();}\ndocument.addEventListener('pointermove',move,{capture:true,passive:true});\ndocument.addEventListener('pointerout',out,{capture:true,passive:true});\ndocument.addEventListener('mouseout',out,{capture:true,passive:true});\ndocument.documentElement.addEventListener('pointerleave',leave,{passive:true});\ndocument.documentElement.addEventListener('mouseleave',leave,{passive:true});\ndocument.addEventListener('mouseleave',leave,{passive:true});\nwindow.addEventListener('blur',leave);\nwindow.addEventListener('pagehide',leave);\ndocument.addEventListener('visibilitychange',function(){if(document.hidden)leave();});\nleave();\n}\nif(document.readyState==='loading')document.addEventListener('DOMContentLoaded',init,{once:true});else init();\n})();\n<\/script><\/div><\/div>\r\n<div class=\"et_pb_code_58 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><script id=\"bt-form-compact-behaviour-20261020\">\n(function(){\n'use strict';\nif(document.body.classList.contains('et-fb'))return;\nvar en=\/^en\/i.test(document.documentElement.lang);\nvar ids=['mail-formular-booking-requests','mail-formular-location-rent-requests','mail-formular-lost-and-found','bt-reservation-modal'];\nfunction prepare(){\nids.forEach(function(id){\nvar box=document.getElementById(id);if(!box)return;\nbox.querySelectorAll('.et_pb_contact_field').forEach(function(field){\nif(field.classList.contains('bt-compact-field'))return;\nvar input=field.querySelector('input:not([type=\"hidden\"]),textarea'),label=field.querySelector('label');\nif(!input||!label)return;\nfield.classList.add('bt-compact-field');\nvar text=label.textContent.trim().replace(\/\\s+\/g,' ');\ninput.setAttribute('placeholder',text);\nif(!input.getAttribute('aria-label'))input.setAttribute('aria-label',text);\nif(input.type==='date'||input.type==='time')field.classList.add('bt-native-picker');\nfunction sync(){field.classList.toggle('bt-has-value',Boolean(input.value));if(input.getAttribute('aria-invalid')==='true'&&input.validity.valid)input.removeAttribute('aria-invalid');}\ninput.addEventListener('input',sync);input.addEventListener('change',sync);\ninput.addEventListener('invalid',function(){input.setAttribute('aria-invalid','true');});\nsync();\n});\nbox.querySelectorAll('.bt-form-note').forEach(function(note){\nif(note.dataset.btCompactNote)return;note.dataset.btCompactNote='true';\nnote.innerHTML=(en?'* Required \u00b7 <a href=\"\/en\/impressum\/#datenschutz\" target=\"_blank\" rel=\"noopener\">Privacy<\/a> \u00b7 Protected by reCAPTCHA.':'* Pflichtfeld \u00b7 <a href=\"\/impressum\/#datenschutz\" target=\"_blank\" rel=\"noopener\">Datenschutz<\/a> \u00b7 Gesch\u00fctzt durch reCAPTCHA.');\n});\n});\n}\nfunction start(){\nprepare();\nids.forEach(function(id){var box=document.getElementById(id);if(box)new MutationObserver(function(){prepare();}).observe(box,{childList:true,subtree:true});});\n}\nif(document.readyState==='complete')start();else window.addEventListener('load',start,{once:true});\n})();\n<\/script><\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":9,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_et_pb_use_builder":"on","_et_pb_page_layout":"et_right_sidebar","_et_pb_side_nav":"off","footnotes":""},"class_list":["post-9606","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/tausendberlin.com\/en\/wp-json\/wp\/v2\/pages\/9606","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tausendberlin.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tausendberlin.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tausendberlin.com\/en\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/tausendberlin.com\/en\/wp-json\/wp\/v2\/comments?post=9606"}],"version-history":[{"count":34,"href":"https:\/\/tausendberlin.com\/en\/wp-json\/wp\/v2\/pages\/9606\/revisions"}],"predecessor-version":[{"id":9641,"href":"https:\/\/tausendberlin.com\/en\/wp-json\/wp\/v2\/pages\/9606\/revisions\/9641"}],"wp:attachment":[{"href":"https:\/\/tausendberlin.com\/en\/wp-json\/wp\/v2\/media?parent=9606"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}