{"id":8542,"date":"2026-10-06T13:10:25","date_gmt":"2026-10-06T11:10:25","guid":{"rendered":"https:\/\/tausendberlin.com\/?page_id=8542"},"modified":"2026-10-18T06:03:44","modified_gmt":"2026-10-18T04:03:44","slug":"bar-tausend-test-02","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>\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><\/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\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      var rect = about.getBoundingClientRect();\n      var viewportHeight =\n        window.innerHeight || root.clientHeight || 1;\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        root.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    updateLayer();\n\n    window.addEventListener(\"scroll\", requestUpdate, { passive: true });\n    window.addEventListener(\"resize\", requestUpdate, { passive: true });\n    window.addEventListener(\"load\", requestUpdate, { passive: true });\n    window.addEventListener(\"pageshow\", requestUpdate, { passive: true });\n\n    if (window.visualViewport) {\n      window.visualViewport.addEventListener(\n        \"resize\", requestUpdate, { 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>\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_4 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.bt-video-wrap{\n  position:relative;\n  width:320px;\n  height:320px;\n  flex:0 0 320px;\n\n  opacity:0;\n  animation:btFadeIn 1.6s ease-out forwards;\n  animation-delay:1.05s;\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_5 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 = 1400, 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 = t * t * t * (t * (t * 6 - 15) + 10);\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><\/div><\/div>\r\n<div class=\"et_pb_code_6 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\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){\n      return {\n        hour:22,\n        minute:0,\n        label:\"10 PM\"\n      };\n    }\n\n    var match = matches[matches.length - 1];\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    var displayHour = hour % 12 || 12;\n    var meridiem = hour < 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    var date = parseDateFromText(text);\n    if(!date) return null;\n\n    var time = parseTimeFromText(text);\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\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_7 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_8 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  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    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\" data-et-mv-hidden-phone=\"true\"><h2 style=\"font-size: 30px!important;\">Mittwoch bis Samstag ab 21:00 UHR.<\/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 style=\"text-align: left;\">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. Von legend\u00e4ren Live-Acts bis hin zu exklusiven Filmproduktionen \u2013 die Bar Tausend war immer wieder 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_9 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>\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_10 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    <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  <\/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\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  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) 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.intersectionRatio >= MINI_HIDE_RATIO - 0.01;\n      });\n      setMiniAway(hideVisible.indexOf(true) !== -1);\n    }, { threshold: [0, 0.25, 0.5, 0.75, 1] });\n\n    observeHideTarget(logo);\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  }\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_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_11 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\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\n    const parent = placeholder.parentElement;\n\n    const rect =\n      parent\n        ? parent.getBoundingClientRect()\n        : placeholder.getBoundingClientRect();\n\n    const topRect =\n      placeholder.getBoundingClientRect();\n\n    const docY =\n      window.pageYOffset ||\n      document.documentElement.scrollTop ||\n      0;\n\n    const docX =\n      window.pageXOffset ||\n      document.documentElement.scrollLeft ||\n      0;\n\n    placeholder.style.height =\n      standWrap.offsetHeight + \"px\";\n\n    standHost.style.left =\n      (rect.left + docX + OFFSET_X) + \"px\";\n\n    standHost.style.top =\n      (topRect.top + docY + OFFSET_Y) + \"px\";\n\n    standHost.style.width =\n      rect.width + \"px\";\n  }\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  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\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\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\n    if(ticking) return;\n\n    ticking = true;\n\n    requestAnimationFrame(() => {\n\n      syncStandHost();\n\n      updateFloatingState();\n\n      ticking = false;\n\n    });\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  }\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_12 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\").forEach(initBlock);\n\n    if(document.fonts && document.fonts.ready){\n      document.fonts.ready.then(() => {\n        document.querySelectorAll(\".fc-readmore\").forEach(computeCollapsedH);\n      });\n    }\n\n    window.addEventListener(\"load\", () => {\n      document.querySelectorAll(\".fc-readmore\").forEach(computeCollapsedH);\n      setTimeout(() => {\n        document.querySelectorAll(\".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_13 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_14 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\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    \/* Scrollen im Text der ge\u00f6ffneten Karte bleibt im Text:\n       Seite und Header-Men\u00fc bekommen davon nichts mit *\/\n    function keepInside(e) {\n      if (item.card.classList.contains(\"has-scroll\")) 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  function fitNames() {\n    var on = mqDrawer.matches && !reduced();\n    var rows = [];\n    \/* 1 \u00b7 zur\u00fccksetzen (nur schreiben) *\/\n    cards().forEach(function (card) {\n      var h2 = card.querySelector(\"h2\");\n      if (!h2) return;\n      var span = nameSpan(h2);\n      var row = {\n        card: card, h2: h2, span: span,\n        wrapped: card.classList.contains(\"is-name-wrap\"),\n        full: card.classList.contains(\"is-name-full\")\n      };\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      rows.push(row);\n    });\n    function restore(row) {\n      if (row.wrapped) row.card.classList.add(\"is-name-wrap\");\n      if (row.full) row.card.classList.add(\"is-name-full\");\n    }\n    if (!on) { rows.forEach(restore); return; }\n    \/* 2 \u00b7 messen (nur lesen) *\/\n    rows.forEach(function (row) {\n      row.avail = row.h2.clientWidth;\n      row.need = row.span.getBoundingClientRect().width;\n      row.fix = !!row.avail && row.need > row.avail + 0.5;\n    });\n    \/* 3 \u00b7 verkleinern (nur schreiben) *\/\n    rows.forEach(function (row) {\n      if (!row.fix) return;\n      var scale = Math.max(NAME_MIN, (row.avail \/ row.need) * 0.995);\n      row.h2.style.setProperty(\"--bt-name-scale\", scale.toFixed(4));\n    });\n    \/* 4 \u00b7 nachmessen (nur lesen) *\/\n    var gap = gapPx();\n    rows.forEach(function (row) {\n      if (row.fix) row.need2 = row.span.getBoundingClientRect().width;\n    });\n    \/* 5 \u00b7 Laufschrift setzen (nur schreiben) *\/\n    rows.forEach(function (row) {\n      if (row.fix) {\n        var need = row.need2, avail = row.avail;\n        var over = need - avail;\n        if (over > 1) {\n          var shift = over + 30;\n          row.card.classList.add(\"is-name-long\");\n          row.h2.style.setProperty(\"--bt-name-shift\", (-shift) + \"px\");\n          row.h2.style.setProperty(\"--bt-name-dur\", Math.max(1.4, shift \/ 38).toFixed(2) + \"s\");\n          \/* offene Karte: Name einzeilig, wenn n\u00f6tig sanft etwas kleiner *\/\n          var fit = Math.min(1, (avail + gap - 18 - 2) \/ need);\n          row.card.btNameWrap = fit < NAME_OPEN_MIN;\n          if (!row.card.btNameWrap && fit < 1) row.h2.style.setProperty(\"--bt-name-open\", fit.toFixed(4));\n        }\n      }\n      restore(row);\n    });\n  }\n\n  \/* Phone: keep the common name row compact; fit only long names to two lines. *\/\n  function fitPhoneNames() {\n    var rows = [];\n    cards().forEach(function (card) {\n      var h2 = card.querySelector(\"h2\");\n      if (!h2) return;\n      h2.style.removeProperty(\"--bt-mobile-name-size\");\n      if (mqDrawer.matches) return;\n      var span = nameSpan(h2), size = px(getComputedStyle(h2).fontSize);\n      rows.push({h2: h2, span: span, base: size, size: size});\n    });\n    for (var pass = 0; pass < 25; pass++) {\n      var changed = [];\n      rows.forEach(function (row) {\n        var lh = px(getComputedStyle(row.h2).lineHeight);\n        if (row.span.getBoundingClientRect().height > lh * 2 + 1 && row.size > 24) {\n          row.size = Math.max(24, row.size - 0.5);\n          changed.push(row);\n        }\n      });\n      if (!changed.length) break;\n      changed.forEach(function (row) { row.h2.style.setProperty(\"--bt-mobile-name-size\", row.size + \"px\"); });\n    }\n  }\n\n  function equalizeHeads() {\n    var mobile = !mqDrawer.matches;\n    var slots = [\n      { selector: \"h4\", property: \"--bt-mobile-category-h\", max: 0 },\n      { selector: \"h3\", property: \"--bt-mobile-date-h\", max: 0 },\n      { selector: \"h2\", property: \"--bt-mobile-name-h\", max: 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    if (mobile) {\n      \/* Read natural slot heights before applying a shared row height. *\/\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) slot.max = Math.max(slot.max, node.getBoundingClientRect().height);\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    list.forEach(function (it) {\n      it.inner.scrollTop = 0;\n      it.mod.classList.add(\"is-measure\");\n    });\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  function layoutAll() {\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 () { shell.classList.remove(\"bt-lu-measuring\"); });\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  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    if (withStart || !startPositioned) positionStart();\n    updateArrows();\n    if (!startPositioned) {\n      startPositioned = true;\n      shell.setAttribute(\"data-bt-start-index\", String(startIndex));\n      shell.classList.add(\"bt-lu-ready\");\n    }\n  }\n  function requestLayout(withStart) {\n    layoutPending = true;\n    if (withStart) layoutStart = true;\n    if (!nearView || 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: \"1200px 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\");\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 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\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\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\");\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    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 h0 = W * imgRatio();\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      \/* 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  \/* 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\") watchThemeCursor();\n    });\n    shell.addEventListener(\"pointerleave\", function () {\n      hovering = false;\n      if (edgeDir) setEdge(0);\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  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    buildArrows();\n    watchNear();\n    requestLayout(true);\n    bindInput();\n\n    \/* Kopfzeilen neu ausrichten, falls Schriften sp\u00e4ter nachladen *\/\n    if (\"ResizeObserver\" in w) {\n      var headTimer = null;\n      var headRO = new ResizeObserver(function () {\n        clearTimeout(headTimer);\n        headTimer = setTimeout(function () {\n          if (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    shell.classList.add(\"bt-lu-ready\");\n\n    function settle() {\n      if (busy || items.some(function (it) { return it.open; })) 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 --><\/div><\/div>\r\n<div class=\"et_pb_code_15 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\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      fallback = name.getClientRects().length > 1 || nr.height > lh * 1.4;\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    \/* Breite jedes Zeichens, inklusive Unterschneidung *\/\n    function widthsOf(str) {\n      var out = [], prev = 0;\n      for (var i = 1; i <= str.length; i++) {\n        meas.textContent = str.slice(0, i);\n        var wd = meas.getBoundingClientRect().width;\n        out.push(Math.max(0, wd - prev));\n        prev = wd;\n      }\n      return out;\n    }\n    var digitW = 0;\n    function digitWidth() {\n      if (digitW) return digitW;\n      for (var i = 0; i < 10; i++) {\n        meas.textContent = String(i);\n        digitW = Math.max(digitW, meas.getBoundingClientRect().width);\n      }\n      return digitW;\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 = fontPx() * 0.56;\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            measLb.textContent = pt.u;\n            var sep = n < all.length - 1;\n            deco = { lb: pt.u, sep: sep };\n            extra = measLb.getBoundingClientRect().width + (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    function 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) { t.textContent = rnd(digit); return; }\n        clearInterval(iv);\n        t.textContent = 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    \/* Tafel von jetzt (cur) nach Ziel (nx) verwandeln \u2013 alles gleitet weich *\/\n    function morph(nx) {\n      if (!alive) return Promise.reject();\n      var from0 = cur || emptyState();\n      var n = Math.max(from0.chars.length, nx.chars.length);\n      var nb = el(\"span\", \"bt-fx\");\n      var cells = [];\n      for (var i = 0; i < n; i++) {\n        var a = from0.chars[i] || \"\", b = nx.chars[i] || \"\";\n        var c = makeCell(a, from0.widths[i], from0.pads[i], from0.decos[i]);\n        nb.appendChild(c);\n        cells.push({ el: c, a: a, b: b, w: nx.widths[i] || 0, p: nx.pads[i] || 0,\n                     da: from0.decos[i] || null, db: nx.decos[i] || null, digit: !!nx.digit[i], i: i });\n      }\n      nb.style.transform = \"scale(\" + (from0.scale || 1) + \")\";\n      if (board) board.remove();\n      board = nb;\n      layer.appendChild(nb);\n      \/* Wrapped phone names fade; align their replacement to the first line too. *\/\n      if (fallback) alignBaseline(nb.firstChild && nb.firstChild.firstChild);\n\n      var sc = scaleFor(nx);\n      nx.scale = sc;\n      void nb.offsetWidth;\n      nb.style.transform = \"scale(\" + sc + \")\";\n\n      var last = 0;\n      cells.forEach(function (c) {\n        var decoChange = decoKey(c.da) !== decoKey(c.db);\n        var delay = c.i * STAGGER;\n        if (c.a === c.b && !decoChange) {\n          c.el.style.width = c.w + \"px\";\n          c.el.style.paddingRight = c.p + \"px\";\n          return;\n        }\n        last = Math.max(last, delay + (FLIPS + 1) * FLIP_MS);\n        setTimeout(function () {\n          if (c.b) { c.el.style.width = c.w + \"px\"; c.el.style.paddingRight = c.p + \"px\"; }\n          if (decoChange) {\n            var old = c.el.querySelector(\".bt-fx-dc\");\n            if (old) { old.classList.remove(\"is-on\"); setTimeout(function () { old.remove(); }, 900); }\n            if (c.db) {\n              var nd = makeDeco(c.db, false);\n              c.el.appendChild(nd);\n              setTimeout(function () { nd.classList.add(\"is-on\"); }, 260);\n            }\n          }\n          if (c.a === c.b) return;\n          flip(c.el, c.b, c.digit, FLIPS, function () {\n            if (!c.b) { c.el.style.width = \"0px\"; c.el.style.paddingRight = \"0px\"; }\n          });\n        }, delay);\n      });\n      cur = nx;\n      nx.els = cells.map(function (c) { return c.el; });\n      return wait(last + 520).then(function () {\n        cells.forEach(function (c) { if (!c.b) c.el.remove(); });\n        nx.els = cells.filter(function (c) { return c.b; }).map(function (c) { return c.el; });\n      });\n    }\n\n    \/* Name -> Tafel (nahtlos, gleiche Stelle, gleiche Schrift) *\/\n    function enter() {\n      if (!alive) return Promise.reject();\n      ensureLayer();\n      place();\n      if (fallback) {\n        cur = emptyState();\n        h2.classList.add(\"bt-fx-fade\");\n        return wait(450);\n      }\n      cur = nameState();\n      cur.scale = 1;\n      var nb = el(\"span\", \"bt-fx\");\n      cur.chars.forEach(function (ch, i) { nb.appendChild(makeCell(ch, cur.widths[i], 0, null)); });\n      if (board) board.remove();\n      board = nb;\n      layer.appendChild(nb);\n      alignBaseline(nb.firstChild && nb.firstChild.firstChild);\n      h2.classList.add(\"bt-fx-on\");\n      return Promise.resolve();\n    }\n    \/* Tafel -> Name *\/\n    function leave() {\n      if (!alive) return Promise.resolve();\n      if (fallback) {\n        return morph(emptyState()).then(function () {\n          if (board) { board.remove(); board = null; }\n          h2.classList.remove(\"bt-fx-fade\");\n          cur = null;\n        });\n      }\n      return morph(nameState()).then(function () {\n        h2.classList.remove(\"bt-fx-on\");\n        if (board) { board.remove(); board = null; }\n        cur = null;\n      });\n    }\n\n    \/* Countdown weiterz\u00e4hlen: ge\u00e4nderte Ziffern flackern kurz *\/\n    function tickCount() {\n      if (!alive) return;\n      var nx = countState();\n      if (!sameShape(cur, nx)) { morph(nx).catch(function () {}); return; }\n      for (var i = 0; i < nx.chars.length; i++) {\n        if (nx.chars[i] !== cur.chars[i] && cur.els && cur.els[i]) {\n          cur.chars[i] = nx.chars[i];\n          flip(cur.els[i], nx.chars[i], true, 2);\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, 250);\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      watchVisibility();\n      digitW = 0;\n      if (layer && board && !fallback) { place(); alignBaseline(board.querySelector(\".bt-fx-t\")); }\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 = \"\";\n  function supervise() {\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_17 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\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    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 () {\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    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_18 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_19 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    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    t.addEventListener(\"wheel\", onWheel, { capture: true, passive: false });\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>\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_animated 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_animated 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_animated 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.webp 1080w, 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-480x480.webp 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-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_animated 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_animated 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_animated 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.webp 1200w, 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-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-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_animated 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.webp 1200w, 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-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-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_animated 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_animated 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_animated 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.webp 1200w, 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-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-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_animated 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_animated 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_animated 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.webp 1200w, 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-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-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_animated 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.webp 1200w, 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-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-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_animated 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_animated 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_animated 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.webp 1200w, 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-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-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_animated 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_animated 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_animated 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.webp 1200w, 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-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-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_animated 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_animated 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_animated 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.webp 1200w, 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-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-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_animated 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_animated 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_animated 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.webp 1200w, 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-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-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_animated 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_animated 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_animated 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.webp 1200w, 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-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-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_animated 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_animated 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_animated 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.webp 1200w, 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-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-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_animated 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_animated 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_animated 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.webp 1200w, 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-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-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_animated 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_animated 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_animated 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.webp 1200w, 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-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-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_animated 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_animated 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_animated 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.webp 1200w, 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-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-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_animated 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>Event soon<\/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_animated 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_animated 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.webp 1200w, 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-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-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_animated 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<\/h2>\n<p><a>Event soon<\/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_animated et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Frankie Balou verbindet Soul, Blues und Jazz mit modernen elektronischen Einfl\u00fcssen und einer Stimme, die gleicherma\u00dfen warm, rau und intim wirken kann. Die in Berlin lebende S\u00e4ngerin und Songwriterin bewegt sich dabei ganz selbstverst\u00e4ndlich zwischen klassischem Songwriting, Clubkultur und Live-Performance.<\/p>\n<p style=\"text-align: center;\">\nGemeinsam mit ihrer Band bringt sie neue, bislang unver\u00f6ffentlichte Eigenkompositionen und ausgew\u00e4hlte pers\u00f6nliche Lieblingsst\u00fccke ins Tausend. Auch abseits ihrer eigenen Musik war Frankie Balou bereits in elektronischen Produktionen zu h\u00f6ren \u2013 unter anderem mit Sharam Jey & Jon Sine sowie LUNAZ. Ein Live-Abend zwischen Soul, tiefem Blues und elektronischer Atmosph\u00e4re.<\/p>\n<p style=\"text-align: center;\">\nMittwoch, 28. Oktober \u00b7 FRANKIE BALOU \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\/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_animated 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.webp 1200w, 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-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-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_animated 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>Event soon<\/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_animated 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_animated 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.webp 1200w, 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-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-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_animated 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>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_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_animated 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, 30. Oktober \u00b7 LE SALON PRIV\u00c9 \u00b7 21 Uhr.<\/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_animated 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.webp 1254w, 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-480x480.webp 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1254px, 100vw\" 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_animated et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Halloween Special<\/h4>\n<h3>Sa | 31.10. | 21 H<\/h3>\n<h2>Sado Opera<\/h2>\n<p><a>Event soon<\/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_animated et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">SADO OPERA bringen ihr exzentrisches Zusammenspiel aus Disco, Boogie und Electro-Funk ins Tausend. Das Berliner Performance-Kollektiv verbindet Musik, Theater und visuelle Kunst zu einem eigenen Kosmos \u2013 irgendwo zwischen Clubnacht, Konzert und \u00fcberdrehter B\u00fchnenshow. Inspiriert von Parliament-Funkadelic, Prince und Liberace trifft dabei Funk auf Electro-Pop, Glamour auf Provokation und jede Menge Energie auf den Dancefloor. <\/p>\n<p style=\"text-align: center;\">Seit 2012 ist SADO OPERA in Berlin zu Hause und unter anderem eng mit der Wilden Renate verbunden. Ihre Shows stehen f\u00fcr Freiheit, Queerness, Humor und hemmungslose Tanzbarkeit \u2013 ziemlich passende Voraussetzungen f\u00fcr unser HALLOWEEN SPECIAL. <\/p>\n<p style=\"text-align: center;\">\nSamstag, 31. Oktober \u00b7 SADO OPERA \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\/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_animated 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.webp 1200w, 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-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-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=\"DJ-ShirKhan\">\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_animated 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>Dario Lessing<\/h2>\n<p><a>Event soon<\/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_animated 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, 04. November \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_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_animated 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.webp 1200w, 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-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-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_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-HeSawYou-20261105\">\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_animated 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>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_animated et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Aus Mexico City bringt heSAWyou einen detailreichen House-Sound ins Tausend: reduzierte Rhythmen, organische Texturen und ein Gesp\u00fcr f\u00fcr die kleinen Verschiebungen, die einen Groove lebendig machen. Der mexikanisch-libanesische DJ und Produzent bewegt sich zwischen Deep House, Minimal und Micro-House und l\u00e4sst seinen Sets Zeit, sich zu entfalten.<\/p>\n<p style=\"text-align: center;\">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 style=\"text-align: center;\">Donnerstag, 5. November \u00b7 heSAWyou \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\/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_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_animated 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_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-Muege-EcrinHazer-Sianza-20261106\">\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_animated 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>M\u00fcge, Ecrin Hazer &amp; Sianza<\/h2>\n<p><a>Event soon<\/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_animated et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Drei Perspektiven auf eine gemeinsame Nacht: M\u00fcge, Ecrin Hazer und Sianza treffen bei TAUSEND HOUSE aufeinander. M\u00fcges Auswahl \u00f6ffnet R\u00e4ume zwischen Ambient, Breaks und Dub; Ecrin Hazer setzt mit New Beat, EBM und Mutant Disco markante Kontraste. Sianza bringt Deep und Soulful House sowie synthgetriebene Clubmusik in diese Begegnung.<\/p>\n<p style=\"text-align: center;\">Hier darf House in unterschiedliche Richtungen wachsen. Zwischen schwebenden Passagen, kantigen Sounds und direkten Rhythmen entsteht ein Abend, der von der Auswahl der drei Artists lebt \u2013 und von den \u00dcberg\u00e4ngen zwischen ihren musikalischen Welten.<\/p>\n<p style=\"text-align: center;\">Freitag, 6. November \u00b7 M\u00fcge, Ecrin Hazer &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\/user-964557456\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"M\u00fcge auf SoundCloud\" aria-label=\"M\u00fcge auf SoundCloud\"><\/a><br \/>\n<a class=\"bt-sound-logo bt-soundcloud\" href=\"https:\/\/soundcloud.com\/ecrinhazer\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"Ecrin Hazer auf SoundCloud\" aria-label=\"Ecrin Hazer auf SoundCloud\"><\/a><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_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_animated 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_23 et_pb_image et_animated 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_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-Shveba\">\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_animated 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>Event soon<\/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_animated et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">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 style=\"text-align: center;\">\nSeit seinem Umzug nach Berlin 2012 ist Dilby international unterwegs und ver\u00f6ffentlicht auf Labels wie 8bit, Crosstown Rebels, Saved Records und Kling Klong. Seine Sets leben von flie\u00dfenden \u00dcberg\u00e4ngen, tiefen Basslines und einem Groove, der sich langsam aufbaut und \u00fcber die Nacht hinweg tr\u00e4gt.<\/p>\n<p style=\"text-align: center;\">Samstag, 7. November \u00b7 DILBY \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\/dilbydj\" target=\"_blank\" rel=\"noopener noreferrer\"><\/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_24 et_pb_image et_animated 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.webp 1200w, 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-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-8407\" alt=\"Dj Dilby\" title=\"BarTausend-260404-Dilby-sw\" \/><\/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_animated 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_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_animated 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_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_25 et_pb_image et_animated 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.webp 1200w, 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-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-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_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-CCTV-20261112\">\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_animated 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_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_animated et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Chicago im Hintergrund, Berlin im Blick: CCTV steht f\u00fcr eine offene Auswahl elektronischer Clubmusik, die sich \u00fcber Bewegung und Verbindung definiert. House bildet den Ausgangspunkt, die Wege dazwischen bleiben frei \u2013 von rhythmischen Details bis zu energiegeladenen Wechseln.<\/p>\n<p style=\"text-align: center;\">Bei TAUSEND ELECTRONICA bekommt diese neugierige Haltung ihren eigenen Raum. CCTV bringt den Geist des Chicagoer Undergrounds mit einer genre\u00fcbergreifenden Auswahl zusammen: direkt, dynamisch und offen f\u00fcr die unerwarteten Tracks, die einer Nacht ihre eigene Richtung geben.<\/p>\n<p style=\"text-align: center;\">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_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_26 et_pb_image et_animated 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_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=\"LeSalonPrive-20261113\">\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_animated 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_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_animated 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_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_27 et_pb_image et_animated 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.webp 1254w, 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-480x480.webp 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1254px, 100vw\" 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_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=\"DJ-FrauHofmann\">\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_animated 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_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_animated 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_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_28 et_pb_image et_animated 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.webp 1200w, 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-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-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_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-Lorikeet-20261118\">\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_animated 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_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_animated 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_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_29 et_pb_image et_animated 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_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-Nikklaas-20261119\">\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_animated 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_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_animated 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_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_30 et_pb_image et_animated 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-Shabi-20261120\">\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_animated 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_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_animated 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_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_31 et_pb_image et_animated 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-DJWerd-Tmnit-20261121\">\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_animated 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_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_animated 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_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_32 et_pb_image et_animated 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_33 et_pb_image et_animated 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-OY-20261125\">\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_animated 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_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_animated 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_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_animated 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=\"LeSalonPrive-20261127\">\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_animated 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_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_animated 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_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_35 et_pb_image et_animated 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.webp 1254w, 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-480x480.webp 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1254px, 100vw\" 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_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=\"LIVE-Flashbaxx-20261202\">\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_animated 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_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_animated 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_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_36 et_pb_image et_animated 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.webp 1200w, 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-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-8813\" \/><\/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=\"DJ-CarlaValenti\">\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_animated 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_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_animated 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_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_37 et_pb_image et_animated 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.webp 1200w, 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-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-7991\" alt=\"Dj Superlover\" title=\"BarTausend-Dj-Superlover-sw\" \/><\/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-MOJELA-20270402\">\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_animated et_pb_module et_block_module\" id=\"lineup-name\"><div class=\"et_pb_text_inner\"><h4>Tausend House<\/h4>\n<h3>Fr | 02.04.2027 | 21 H<\/h3>\n<h2>MOJELA<\/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_animated et_pb_module et_block_module fc-readmore\" id=\"lineup-text\"><div class=\"et_pb_text_inner\"><p style=\"text-align: center;\">Afro House bildet das Fundament von MOJELAs musikalischer Welt. Der aus S\u00fcdafrika stammende und in Amsterdam lebende DJ und Produzent arbeitet mit unterschiedlichen Spielarten von House und versteht seine Sets als eine Reise, deren Richtung sich aus Rhythmus und Auswahl entwickelt.<\/p>\n<p style=\"text-align: center;\">Sein Ansatz als Live-Remixer l\u00e4sst Kl\u00e4nge aufeinandertreffen und neue Verbindungen entstehen. Am 2. April kommt diese Perspektive ins Tausend: ein Abend f\u00fcr vielschichtige House-Musik, afrikanisch gepr\u00e4gte Rhythmen und die Energie, die zwischen den einzelnen Tracks entsteht.<\/p>\n<p style=\"text-align: center;\">Freitag, 2. April 2027 \u00b7 MOJELA \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\/ernest-mojela-250277987\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"MOJELA auf SoundCloud\" aria-label=\"MOJELA auf SoundCloud\"><\/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_38 et_pb_image et_animated 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>\r\n<div class=\"et_pb_section_3 et_pb_section et_section_regular et_block_section\">\r\n<div class=\"et_pb_row_41 et_pb_row et_block_row\">\r\n<div class=\"et_pb_column_112 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_79 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>Jeden Mittwoch bis Samstag 21:00.<\/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>\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_42 et_pb_row et_block_row et_animated\">\r\n<div class=\"et_pb_column_113 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_80 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_20 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\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 >= 0.3) {\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, 0.3],\n        rootMargin: \"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      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><\/div><\/div>\r\n<div class=\"et_pb_code_21 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\"><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\/03\/BarTausend-BG20.jpg)\"><\/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-5\" style=\"background-image:url(https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-BG20.jpg)\"><\/span><\/span>\r\n<div class=\"et_pb_row_43 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_114 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_81 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\"><p>Unsere neue Barkarte ist eine Hommage an die spannendsten Epochen und<br \/>pulsierenden Metropolen dieser Welt. Jeder Drink f\u00e4ngt die unver-<br \/>wechselbare Atmosph\u00e4re und den Charakter dieser Orte ein.<br \/>Erlebe au\u00dfergew\u00f6hnliche Geschmackserlebnisse, die<br \/>durch perfekt abgestimmte Kreationen und hand-<br \/>verlesene Zutaten aus allen Ecken der Welt<br \/>zum Leben erwachen.<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_82 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<\/div><\/div>\r\n<div class=\"et_pb_text_83 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_22 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_84 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p>\u201cOhne Musik w\u00e4re das Leben ein Irrtum.\u201d<\/p>\n<p style=\"margin-top: -10px; margin-left: 190px; color: #7d7d7d!important;\">Friedrich Nietzsche<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_code_23 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><\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_115 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_39 et_pb_image et_pb_module et_block_module\"><a href=\"#cantina\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-Cantina-BG04-2.png\" alt=\"Bar Tausend \u2013 Cantina\" width=\"1080\" height=\"1948\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-Cantina-BG04-2.png 1080w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-Cantina-BG04-2-980x1768.png 980w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-Cantina-BG04-2-480x866.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-3158\" title=\"BarTausend-Cantina-BG04-2\" \/><\/span><\/a><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_116 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_85 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p>Die Bar Tausend ist mehr als nur eine Bar \u2013 sie ist eine Institution. Seit \u00fcber einem Jahrzehnt pr\u00e4gt sie 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. \u0003<\/p>\n<p>Ob Sie einen unvergesslichen Abend mit Freunden verbringen oder eine exklusive Veranstaltung planen \u2013 bei uns sind Sie goldrichtig.<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_86 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><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_44 et_pb_row et_pb_equal_columns et_block_row\">\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_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 style=\"font-size: 20px!important; margin-top: 10px!important;\">Sweet &amp; Sour Cocktail<\/h4>\n<\/div><\/div><\/div><\/div><\/div>\r\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 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><\/div><\/div>\r\n<div class=\"et_pb_code_25 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_45 et_pb_row et_pb_equal_columns et_pb_gutters1 et_block_row bt-barcard-row\">\r\n<div class=\"et_pb_column_118 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_26 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_6ad53e4ce5970\" 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_6ad53e4ce5d31\" 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_6ad53e4ce5fec\" style=\"position:absolute;\"><\/div>\n    <\/div>\n  <\/div>\n<\/div><\/div><\/div>\r\n<div class=\"et_pb_code_27 et_pb_code et_pb_module bt-barcard-system-code\"><div class=\"et_pb_code_inner\"><!--\nBAR TAUSEND \u00b7 CODE SYSTEM V5.9 \u00b7 06.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: 45%; z-index: 12;\n  color: #fff; text-align: center; font: 14px\/1.6 Poppins, sans-serif;\n  text-shadow: 0 1px 3px #000; 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    \/* 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    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\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\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) return;\n        scrollFrame = requestAnimationFrame(function () {\n          scrollFrame = 0;\n          if (pressId === null && lastPointer) 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) {\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    \/* ===================== 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 || !book.enabled || 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      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      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 < 1200;\n        status.textContent = waited > 30000\n          ? (isEnglish ? 'The menu is taking longer than expected to load. Please select it again or reload the page.' : 'Die Karte l\u00e4dt l\u00e4nger als erwartet. Bitte erneut w\u00e4hlen oder die Seite neu laden.')\n          : (isEnglish ? 'Loading menu \u2026' : 'Karte wird geladen \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      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 (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_28 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_29 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_46 et_pb_row et_block_row et_animated\">\r\n<div class=\"et_pb_column_119 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_87 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_30 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\" 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_47 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_120 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_88 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p>Entdecken Sie eine neue Welt hinter den Kulissen der Bar Tausend.<\/p>\n<p>Unsere Cantina ist mehr als nur ein Restaurant \u2013 sie ist ein Erlebnis. Die offene K\u00fcche l\u00e4dt zum Zuschauen ein, w\u00e4hrend unsere K\u00f6che K\u00f6stlichkeiten kreieren.<\/p>\n<p>Die beeindruckende Wandinstallation \u201eFlying Cells\u201c des K\u00fcnstlerduos Arotin &amp; Serghej sorgt f\u00fcr eine einzigartige Atmosph\u00e4re.<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_89 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h1>DIE TAUSEND<br \/>CANTINA<\/h1>\n<\/div><\/div>\r\n<div class=\"et_pb_text_90 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\"><h3 class=\"bt-cantina-hours\" style=\"font-size:26px!important;\">Donnerstag \u2013 Samstag<span class=\"bt-cantina-hours-dot\">\u30fb<\/span><span>19:00 \u2013 23:00 Uhr<\/span><\/h3>\n<p>Softopening<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_text_91 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module quote-bottom\"><div class=\"et_pb_text_inner\" data-et-mv-hidden-phone=\"true\"><p>\u201cEssen ist ein Grundbed\u00fcrfnis f\u00fcr alle Menschen,<br \/>aber nur wenige wissen guten Geschmack zu sch\u00e4tzen..\u201d<\/p>\n<p style=\"margin-top: -8px; margin-left: 315px; color: #7d7d7d!important;\">KONFUZIUS<\/p>\n<\/div><\/div>\r\n<div class=\"et_pb_code_31 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n@media (max-width:980px){\n  \/* Nur Section selbst anfassen *\/\n  #cantina{\n    position:relative!important;\n    overflow:hidden!important;\n    background-image:none!important;\n    background-color:transparent!important;\n    z-index:2!important; \/* Content bleibt \u00fcber dem fixed BG *\/\n  }\n\n  \/* Divi Parallax wirklich aus *\/\n  #cantina .et_parallax_bg_wrap,\n  #cantina .et_parallax_bg{\n    display:none!important;\n  }\n\n  \/* WICHTIG: KEIN Reset von .et_pb_row \/ .et_pb_module etc. *\/\n}\n<\/style>\n\n<script>\n(function(){\n  if(!window.matchMedia || !window.matchMedia(\"(max-width:980px)\").matches) return;\n\n  const ID  = \"cantina\";\n  const IMG = \"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-Cantina-BG03.jpg\";\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  \/\/ Fixed Layer (Overscan gegen 1px N\u00e4hte)\n  const layer = document.createElement(\"div\");\n  layer.setAttribute(LAYER_ATTR, ID);\n  layer.style.position = \"fixed\";\n  layer.style.left = \"-2px\";\n  layer.style.top  = \"-2px\";\n  layer.style.width  = \"calc(100vw + 4px)\";\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  \/\/ Layer-H\u00f6he: visuell (wie getBoundingClientRect), darf wachsen, nie schrumpfen\n  let lockedH = 0, lockedW = 0; \/\/ V3: nur bei Breitenwechsel neu messen\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 + 4) + \"px\";\n    banner.style.minHeight = lockedH + \"px\";\n  }\n\n  let ticking = false;\n\n  function update(){\n    ticking = false;\n\n    ensureLockedHeight();\n\n    const vh = lockedH;\n    const vw = window.innerWidth;\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    \/\/ Clip im selben Koordinatensystem wie r.*\n    const top    = Math.max(0, r.top - 2);\n    const bottom = Math.max(0, vh - r.bottom - 2);\n    const left   = Math.max(0, r.left - 2);\n    const right  = Math.max(0, vw - r.right - 2);\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  update();\n\n  if(!window[LISTENER_FLAG]){\n    window[LISTENER_FLAG] = true;\n    window.addEventListener(\"scroll\", requestTick, {passive:true});\n    window.addEventListener(\"resize\", requestTick);\n    window.addEventListener(\"load\", requestTick);\n  } else {\n    requestTick();\n  }\n\n})();\n<\/script>\n<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_121 et_pb_column et_pb_column_1_4 et_block_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_code_32 et_pb_code et_pb_module bt-cantina-plan-module\"><div class=\"et_pb_code_inner\"><!-- BAR TAUSEND \u00b7 CANTINA-BAUSKIZZE \u00b7 LINK ZUR BAR -->\n\n<div class=\"bt-cantina-plan\">\n\n  <img decoding=\"async\"\n    src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/09\/BarTausend-Cantina-BG08-4.png\"\n    alt=\"Grundriss der Tausend Cantina\"\n  >\n\n  <a\n    class=\"bt-cantina-plan__bar-link\"\n    href=\"#bar\"\n    aria-label=\"Der Weg zur Bar\"\n  >\n    <span class=\"bt-cantina-plan__topline\">\n\n      <svg\n        class=\"bt-cantina-plan__triangles\"\n        viewBox=\"0 0 72 22\"\n        aria-hidden=\"true\"\n      >\n        <path d=\"M20 2 L3 11 L20 20 Z\"><\/path>\n        <path d=\"M45 2 L28 11 L45 20 Z\"><\/path>\n        <path d=\"M70 2 L53 11 L70 20 Z\"><\/path>\n      <\/svg>\n\n      <span>DER WEG ZUR<\/span>\n    <\/span>\n\n    <span class=\"bt-cantina-plan__bar\">BAR<\/span>\n  <\/a>\n\n<\/div>\n\n<style>\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: #ea0b5f !important;\n  text-decoration: none !important;\n  transition: color 800ms ease;\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: inherit;\n  transition: color 800ms ease;\n}\n\n\/* Hover: Text, BAR und Pfeile bilden eine gemeinsame Linkflaeche. *\/\n.bt-cantina-plan__bar-link:hover,\n.bt-cantina-plan__bar-link:focus-visible {\n  color: #ffffff !important;\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<\/style>\n<style>\n@media (prefers-reduced-motion: reduce) {\n  .bt-cantina-plan__bar-link, .bt-cantina-plan__bar, .bt-cantina-plan__triangles { transition: none; }\n}\n<\/style>\n<script>\n(function(){\n  if (!\/^en(?:-|$)\/i.test(document.documentElement.lang || '') && !\/^\\\/en(?:\\\/|$)\/.test(location.pathname)) return;\n  var link = document.querySelector('.bt-cantina-plan__bar-link');\n  if (!link) return;\n  link.setAttribute('aria-label', 'The way to the bar');\n  var text = link.querySelector('.bt-cantina-plan__topline > span');\n  if (text) text.textContent = 'THE WAY TO';\n})();\n<\/script><\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_122 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_92 et_pb_text et_pb_bg_layout_light et_animated et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p>Perfekt f\u00fcr Gruppen: Ob Firmenfeier, Geburtstag oder einfach nur ein Abend mit Freunden \u2013 in unserer Cantina finden Sie den passenden Rahmen.<\/p>\n<p>Wir bieten Ihnen verschiedene Men\u00fcoptionen, darunter auch unser beliebtes Flying Men\u00fc.<\/p>\n<p>&nbsp;<\/p>\n<p>Die Cantina ist mehr als nur ein Restaurant. Sie ist ein Ort zum Entspannen, Feiern und Genie\u00dfen. Ob als VIP-Bereich, Bar oder Backstage-Bereich die M\u00f6glichkeiten sind endlos.<\/p>\n<\/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\">\r\n<div class=\"et_pb_row_48 et_pb_row et_flex_row\">\r\n<div class=\"et_pb_column_123 et_pb_column et-last-child et_block_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_gallery_0 et_pb_gallery et_pb_bg_layout_light et_pb_gallery_grid et_pb_module\" data-auto-rotate=\"off\" data-auto-rotate-speed=\"\" id=\"image-gallery-01\"><div class=\"et_pb_gallery_items et_post_gallery clearfix et_grid_module\" data-per_page=\"4\"><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_0\"><div class=\"et_pb_gallery_image landscape\" data-per_page=\"4\"><a href=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend_011.webp\" title=\"BarTausend_011\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"284\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend_011-400x284.webp\" alt=\"\" class=\"wp-image-3175\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend_011.webp 479w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend_011-400x284.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_1\"><div class=\"et_pb_gallery_image landscape\" data-per_page=\"4\"><a href=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend_034.webp\" title=\"BarTausend_034\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"284\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend_034-400x284.webp\" alt=\"\" class=\"wp-image-3177\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend_034.webp 479w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend_034-400x284.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_2\"><div class=\"et_pb_gallery_image landscape\" data-per_page=\"4\"><a href=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend_005-scaled-1.webp\" title=\"BarTausend_005-scaled-1\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"284\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend_005-scaled-1-400x284.webp\" alt=\"\" class=\"wp-image-3174\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend_005-scaled-1.webp 479w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend_005-scaled-1-400x284.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_3\"><div class=\"et_pb_gallery_image landscape\" data-per_page=\"4\"><a href=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend_020.webp\" title=\"BarTausend_020\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"284\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend_020-400x284.webp\" alt=\"\" class=\"wp-image-3176\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend_020.webp 479w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend_020-400x284.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><\/div><div class=\"et_pb_gallery_item et_pb_grid_item et_pb_gallery_item_0_4\"><div class=\"et_pb_gallery_image landscape\" data-per_page=\"4\"><a href=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/PULPO-scaled-1.webp\" title=\"PULPO-scaled-1\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"284\" src=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/PULPO-scaled-1-400x284.webp\" alt=\"\" class=\"wp-image-3178\" srcset=\"https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/PULPO-scaled-1.webp 479w, https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/PULPO-scaled-1-400x284.webp 480w\" sizes=\"(max-width:479px) 479px, 100vw\" \/><span class=\"et_overlay\" data-icon=\"\" data-icon-tablet=\"\" data-icon-phone=\"\"><\/span><\/a><\/div><\/div><\/div><\/div>\r\n<div class=\"et_pb_code_33 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\">\n\n\n<style>\n\/* GANZ OBEN! verhindert den 15px html-margin sofort *\/\nhtml { margin-right: 0 !important; padding-right: 0 !important; }\n\/* ========= 0) FINAL FIX: html margin-right wird beim Lightbox-Open gesetzt =========\n   Chrome unterst\u00fctzt :has() -> sobald Magnific offen ist, killen wir den html margin-right.\n   Das schl\u00e4gt auch inline \"margin-right: 15px\" (weil !important).\n*\/\nhtml:has(.mfp-wrap.mfp-ready){\n  margin-right: 0 !important;\n}\n\n\/* optional: falls zus\u00e4tzlich padding-right gesetzt wird *\/\nhtml:has(.mfp-wrap.mfp-ready),\nbody:has(.mfp-wrap.mfp-ready){\n  padding-right: 0 !important;\n}\n\n\/* ========= 1) DEIN HOVER-ZOOM ========= *\/\n#image-gallery-01 .et_pb_gallery_item { overflow: hidden; }\n#image-gallery-01 .et_pb_gallery_item img {\n  transition: transform 0.6s ease;\n  transform: scale(1);\n}\n#image-gallery-01 .et_pb_gallery_item:hover img { transform: scale(1.08); }\n\n\/* ========= 2) KEINE PFEILE \/ KEIN COUNTER ========= *\/\n.mfp-arrow,\n.mfp-container .mfp-arrow-left,\n.mfp-container .mfp-arrow-right,\n.mfp-counter { display: none !important; }\n.mfp-arrow:before,\n.mfp-arrow:after { content: \"\" !important; display: none !important; }\n\n\/* ========= 3) CLOSE \"X\" ========= *\/\n.mfp-close{\n  padding: 0 !important;\n  margin: 0 !important;\n  text-indent: 0 !important;\n\n  width: 40px !important;\n  height: 40px !important;\n  border-radius: 999px !important;\n  background: rgba(0,0,0,.22) !important;\n  color: #fff !important;\n\n  display: flex !important;\n  align-items: center !important;\n  justify-content: center !important;\n\n  font-size: 22px !important;\n  line-height: 1 !important;\n\n  opacity: .55 !important;\n  transition: opacity .2s ease, transform .2s ease !important;\n\n  top: 14px !important;\n  right: 14px !important;\n}\n.mfp-close:hover{ opacity: .92 !important; transform: scale(1.04) !important; }\n\n\/* ========= 4) LIGHTBOX selbst nicht scrollbar ========= *\/\n.mfp-wrap, .mfp-container { overflow: hidden !important; }\n\n\/* ========= 5) Overlay sicher \u00fcber allem ========= *\/\n.mfp-bg{ z-index: 999999 !important; }\n.mfp-wrap{ z-index: 1000000 !important; }\n<\/style>\n<\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_11 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>\r\n<div class=\"et_pb_row_49 et_pb_row et_block_row\">\r\n<div class=\"et_pb_column_124 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_93 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_94 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_34 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_12 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-12\" 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_50 et_pb_row et_block_row\">\r\n<div class=\"et_pb_column_125 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_95 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_96 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_97 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_35 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_13 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-13\" 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_51 et_pb_row et_block_row hero-bottom\">\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_text_98 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_99 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_100 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_36 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_37 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  \/\/ &#x2705; Mobile: Overlay falls vorhanden entfernen (sonst \u00fcberlagert er Standbild)\n  function killOverlayOnMobile(){\n    if(!isMobile()) return;\n    const el = document.querySelector('#event');\n    if(!el) return;\n    const ov = el.querySelector('.bt-event-zoom-overlay');\n    if(ov) ov.remove();\n  }\n\n  ready(function(){\n    \/\/ immer einmal ausf\u00fchren (z.B. wenn jemand resized)\n    killOverlayOnMobile();\n\n    \/\/ Desktop\/iPad: Zoom initialisieren\n    if(isMobile()) return;\n\n    const el = document.querySelector('#event');\n    if(!el) return;\n\n    const bgSourceEl =\n      el.querySelector('.et-pb-parallax-background') ||\n      el.querySelector('.et_parallax_bg') ||\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-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    const maxScale = 1.45;\n\n    function update(){\n      \/\/ falls w\u00e4hrenddessen auf Mobile gewechselt wurde\n      if(isMobile()){\n        killOverlayOnMobile();\n        return;\n      }\n\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 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  \/\/ Zus\u00e4tzlich: bei Resize mobile\/desktop Wechsel sauber halten\n  window.addEventListener('resize', killOverlayOnMobile);\n})();\n<\/script>\n<\/div><\/div>\r\n<div class=\"et_pb_code_38 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_39 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_14 et_pb_section et_section_regular et_block_section\" id=\"presse\">\r\n<div class=\"et_pb_row_52 et_pb_row et_block_row press-head-row\">\r\n<div class=\"et_pb_column_127 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_101 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_102 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_40 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_128 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_103 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_53 et_pb_row et_block_row press-head-row2\">\r\n<div class=\"et_pb_column_129 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_104 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_105 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_106 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_130 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_107 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_108 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_15 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-15\" style=\"background-image:url(https:\/\/tausendberlin.com\/wp-content\/uploads\/2026\/03\/BarTausend-BG19.jpg)\"><\/span><\/span>\r\n<div class=\"et_pb_row_54 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_131 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_109 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_132 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_110 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_41 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_42 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_133 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_40 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_55 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_134 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_111 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_135 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_112 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_43 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_136 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_41 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_16 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-16\" 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_56 et_pb_row et_block_row\">\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_113 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_44 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_17 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-17 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-17\" 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_57 et_pb_row et_block_row scroll-fx\" id=\"kontakt1\">\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_114 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\"><h2>Bar Tausend<\/h2>\n<h5 style=\"margin-top: -0px!important;\">Schiffbauerdamm 11\u30fb10117 Berlin<\/h5>\n<h5 style=\"margin-top: 10px!important;\">Mittwoch \u2013 Samstag\u30fb21:00<\/h5>\n<p style=\"font-size: 14px!important; margin-top: -8px; margin-bottom: 3px; font-weight: bold;\">Ticketpreise k\u00f6nnen variieren<\/p>\n<h5 class=\"h5-button\" style=\"margin-top: -6px!important;\"><a href=\"#open-stadtplan\" id=\"toggle-stadtplan\">Route planen<\/a><\/h5>\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\"><h2>Cantina<\/h2>\n<p class=\"bt-contact-hours-desktop\"><span class=\"bt-contact-de\" data-no-translation>Donnerstag \u2013 Samstag\u30fb19:00 \u2013 23:00<\/span><span class=\"bt-contact-en\" lang=\"en\" data-no-translation>Thursday \u2013 Saturday\u30fb7:00 \u2013 11:00 PM<\/span><\/p>\n<p class=\"bt-contact-hours-phone\"><span class=\"bt-contact-de\" data-no-translation>Donnerstag \u2013 Samstag<br \/>19:00 \u2013 23:00<\/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-softopening\">Softopening<\/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\" data-et-mv-hidden-tablet=\"true\"><div class=\"bt-contactlinks\">\n<div class=\"bt-contactlinks__item\"><a class=\"bt-contactlinks__title\" href=\"#mail-formular-booking-requests\">Dj &amp; Artist Booking<\/a><br \/><a class=\"bt-contactlinks__mail\" href=\"#mail-formular-booking-requests\">booking(at)tausendberlin.com<\/a><\/div>\n<div class=\"bt-contactlinks__item\"><a class=\"bt-contactlinks__title\" href=\"#mail-formular-location-rent-requests\">Location &amp; Event Rentals<\/a><br \/><a class=\"bt-contactlinks__mail\" href=\"#mail-formular-location-rent-requests\">event(at)tausendberlin.com<\/a><\/div>\n<div class=\"bt-contactlinks__item\"><a class=\"bt-contactlinks__title\" href=\"#mail-formular-lost-and-found\">Lost & Found \/ Group Request<\/a><br \/><a class=\"bt-contactlinks__mail\" href=\"#mail-formular-lost-and-found\">host(at)tausendberlin.com<\/a><\/div>\n<\/div>\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 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_45 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  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  img.src = IMG_URL;\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<\/div><\/div>\r\n<div class=\"et_pb_code_46 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<\/div><\/div>\r\n<\/div>\r\n<div class=\"et_pb_column_139 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_18 et_pb_section et_section_regular et_block_section\" id=\"open-stadtplan\">\r\n<div class=\"et_pb_row_58 et_pb_row et_block_row\">\r\n<div class=\"et_pb_column_140 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_47 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    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:490px; } }\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_48 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\n  const toggle = document.getElementById(\"toggle-stadtplan\");\n  const plan   = document.getElementById(\"open-stadtplan\");\n  if(!toggle || !plan) return;\n\n  let seen = false;\n\n  function visible(){\n    const r = plan.getBoundingClientRect();\n    const vh = window.innerHeight || document.documentElement.clientHeight;\n    return r.bottom > vh*0.15 && r.top < vh*0.85;\n  }\n\n  function autoClose(){\n    if(!plan.classList.contains(\"is-open\")) return;\n\n    if(visible()){\n      seen = true;\n    }else if(seen){\n      plan.classList.remove(\"is-open\");\n      seen = false;\n    }\n  }\n\n  toggle.addEventListener(\"click\", function(e){\n    e.preventDefault();\n    e.stopPropagation();\n\n    const open = !plan.classList.contains(\"is-open\");\n    plan.classList.toggle(\"is-open\");\n\n    if(open){\n      setTimeout(()=>{\n        plan.scrollIntoView({behavior:\"smooth\", block:\"start\"});\n      },70);\n    }\n  }, true);\n\n  window.addEventListener(\"scroll\", autoClose, {passive:true});\n  window.addEventListener(\"resize\", autoClose);\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\" id=\"footer\">\r\n<div class=\"et_pb_row_59 et_pb_row et_pb_gutters1 et_block_row\">\r\n<div class=\"et_pb_column_141 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_118 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_119 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_142 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_120 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_143 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_121 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_0 et_pb_contact_form_container clearfix et_pb_recaptcha_enabled et_pb_module et_flex_module bt-newsletter-info\" data-form_unique_num=\"0\" 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\/8542\">\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_12_24_phone\" data-id=\"name-newsletter-new\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_0_name-newsletter-new_0\">IHR NAME<\/label><input type=\"text\" name=\"et_pb_contact_0_name-newsletter-new_0\" id=\"et_pb_contact_0_name-newsletter-new_0\" 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_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_12_24_phone\" data-id=\"email-newsletter-new\" data-type=\"email\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_0_email-newsletter-new_1\">IHRE E-MAIL ADRESSE<\/label><input type=\"text\" name=\"et_pb_contact_0_email-newsletter-new_1\" id=\"et_pb_contact_0_email-newsletter-new_1\" 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=\"9dfc77b05d\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/en\/wp-json\/wp\/v2\/pages\/8542\" \/><\/form><\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"et_pb_section_20 et_pb_section et_section_regular et_flex_section bt-mail-form\" id=\"mail-formular-booking-requests\">\r\n<div class=\"et_pb_row_60 et_pb_row et_flex_row\">\r\n<div class=\"et_pb_column_144 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_122 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_1 et_pb_contact_form_container clearfix et_pb_recaptcha_enabled et_pb_module et_flex_module\" data-form_unique_num=\"1\" data-form_unique_id=\"992a670dde86ce9baa98809866ce1eff\" id=\"et_pb_contact_form_992a670dde86ce9baa98809866ce1eff\"><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\/8542\">\r\n<div class=\"et_pb_contact_field_2 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_1_name_2\">Ihr Name<\/label><input type=\"text\" name=\"et_pb_contact_1_name_2\" id=\"et_pb_contact_1_name_2\" 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_3 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_1_email_3\">Ihre E-Mailadresse<\/label><input type=\"text\" name=\"et_pb_contact_1_email_3\" id=\"et_pb_contact_1_email_3\" class=\"input\" data-required_mark=\"required\" data-field_type=\"email\" data-original_id=\"email\" placeholder=\"Ihre E-Mailadresse\" 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_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_1_company_4\">Ihre Firma (optional)<\/label><input type=\"text\" name=\"et_pb_contact_1_company_4\" id=\"et_pb_contact_1_company_4\" 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_5 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_1_subject_5\">Betreff<\/label><input type=\"text\" name=\"et_pb_contact_1_subject_5\" id=\"et_pb_contact_1_subject_5\" 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_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_1_message_6\">Ihre Nachricht<\/label><textarea name=\"et_pb_contact_1_message_6\" id=\"et_pb_contact_1_message_6\" 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_992a670dde86ce9baa98809866ce1eff\" 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-992a670dde86ce9baa98809866ce1eff\" name=\"_wpnonce-et-pb-contact-form-submitted-992a670dde86ce9baa98809866ce1eff\" value=\"c75ceb722e\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/en\/wp-json\/wp\/v2\/pages\/8542\" \/><\/form><\/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_flex_section bt-mail-form\" id=\"mail-formular-location-rent-requests\">\r\n<div class=\"et_pb_row_61 et_pb_row et_flex_row\">\r\n<div class=\"et_pb_column_145 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_123 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_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\/8542\">\r\n<div class=\"et_pb_contact_field_7 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_7\">Ihr Name<\/label><input type=\"text\" name=\"et_pb_contact_2_name_7\" id=\"et_pb_contact_2_name_7\" 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_8 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_8\">Ihre E-Mailadresse<\/label><input type=\"text\" name=\"et_pb_contact_2_email_8\" id=\"et_pb_contact_2_email_8\" class=\"input\" data-required_mark=\"required\" data-field_type=\"email\" data-original_id=\"email\" placeholder=\"Ihre E-Mailadresse\" title=\"\" value=\"\" \/><\/div>\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=\"company\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_2_company_9\">Ihre Firma (optional)<\/label><input type=\"text\" name=\"et_pb_contact_2_company_9\" id=\"et_pb_contact_2_company_9\" 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_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=\"subject\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_2_subject_10\">Betreff<\/label><input type=\"text\" name=\"et_pb_contact_2_subject_10\" id=\"et_pb_contact_2_subject_10\" 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_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=\"message\" data-type=\"textarea\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_2_message_11\">Ihre Nachricht<\/label><textarea name=\"et_pb_contact_2_message_11\" id=\"et_pb_contact_2_message_11\" 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=\"5a3074934a\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/en\/wp-json\/wp\/v2\/pages\/8542\" \/><\/form><\/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-lost-and-found\">\r\n<div class=\"et_pb_row_62 et_pb_row et_flex_row\">\r\n<div class=\"et_pb_column_146 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough\">\r\n<div class=\"et_pb_text_124 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_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\/8542\">\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=\"name\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_3_name_12\">Ihr Name<\/label><input type=\"text\" name=\"et_pb_contact_3_name_12\" id=\"et_pb_contact_3_name_12\" 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_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=\"email\" data-type=\"email\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_3_email_13\">Ihre E-Mailadresse<\/label><input type=\"text\" name=\"et_pb_contact_3_email_13\" id=\"et_pb_contact_3_email_13\" class=\"input\" data-required_mark=\"required\" data-field_type=\"email\" data-original_id=\"email\" placeholder=\"Ihre E-Mailadresse\" title=\"\" value=\"\" \/><\/div>\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=\"company\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_3_company_14\">Ihre Firma (optional)<\/label><input type=\"text\" name=\"et_pb_contact_3_company_14\" id=\"et_pb_contact_3_company_14\" 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_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=\"subject\" data-type=\"input\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_3_subject_15\">Betreff<\/label><input type=\"text\" name=\"et_pb_contact_3_subject_15\" id=\"et_pb_contact_3_subject_15\" 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_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=\"message\" data-type=\"textarea\"><label class=\"et_pb_contact_form_label\" for=\"et_pb_contact_3_message_16\">Ihre Nachricht<\/label><textarea name=\"et_pb_contact_3_message_16\" id=\"et_pb_contact_3_message_16\" 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=\"2748e5373a\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/en\/wp-json\/wp\/v2\/pages\/8542\" \/><\/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_block_section\">\r\n<div class=\"et_pb_row_63 et_pb_row et_block_row\">\r\n<div class=\"et_pb_column_147 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_49 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_50 et_pb_code et_pb_module bt-enter-anchor-code\"><div class=\"et_pb_code_inner\"><script>\n(function(){\n  \"use strict\";\n\n  if (document.body.classList.contains(\"et-fb\")) return;\n\n  var anchors = [\n    \"home\",\n    \"about\",\n    \"musik\",\n    \"banner-tuer\",\n    \"bar\",\n    \"drinks-banner\",\n    \"barcards\",\n    \"banner-cantina\",\n    \"cantina\",\n    \"cantina-koch\",\n    \"art\",\n    \"event\",\n    \"presse\",\n    \"presse-fox\",\n    \"vip\",\n    \"kontakt\",\n    \"footer\"\n  ];\n\n  function isAtBottom(){\n    return (window.innerHeight + window.scrollY) >= (document.body.scrollHeight - 8);\n  }\n\n  function currentIndex(){\n    var y = window.scrollY;\n    var best = 0;\n    var bestDist = Infinity;\n\n    anchors.forEach(function(id, i){\n      var el = document.getElementById(id);\n      if (!el) return;\n\n      var top = el.getBoundingClientRect().top + window.scrollY;\n      var dist = Math.abs(top - y);\n\n      if (dist < bestDist){\n        bestDist = dist;\n        best = i;\n      }\n    });\n\n    return best;\n  }\n\n  function goTop(){\n    window.scrollTo({\n      top: 0,\n      behavior: \"smooth\"\n    });\n  }\n\n  function goNext(){\n    if (isAtBottom()){\n      goTop();\n      return;\n    }\n\n    var index = currentIndex();\n    var next = index + 1;\n\n    if (next >= anchors.length){\n      goTop();\n      return;\n    }\n\n    var target = document.getElementById(anchors[next]);\n    if (!target) return;\n\n    target.scrollIntoView({\n      behavior: \"smooth\",\n      block: \"start\"\n    });\n  }\n\n  document.addEventListener(\"keydown\", function(e){\n    if (e.key !== \"Enter\") return;\n\n    var tag = document.activeElement && document.activeElement.tagName;\n    if (tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\") return; if (document.activeElement && document.activeElement.closest && document.activeElement.closest(\"a, button, summary, [role=button]\")) return;\n\n    e.preventDefault();\n    goNext();\n  });\n})();\n<\/script>\n\n\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_51 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  body.bt-theme-cursor-active,\n  body.bt-theme-cursor-active * {\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: 1; }\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 idleTimer = null;\n\n    function updateCursor() {\n      frameRequested = false;\n      cursor.style.transform = \"translate3d(\" + (mouseX - 8) + \"px,\" + (mouseY - 8) + \"px,0)\";\n\n      var el = document.elementFromPoint(mouseX, mouseY);\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      cursor.classList.toggle(\"is-dark\", Boolean(isLight) && !isGallery02);\n\n      \/* Links \/ Buttons *\/\n      var isInteractive = el.closest(\"a, button, [role='button'], input, textarea, select, .et_pb_button\");\n      cursor.classList.toggle(\"is-interactive\", Boolean(isInteractive));\n    }\n\n    function requestCursorUpdate() {\n      if (frameRequested) return;\n      frameRequested = true;\n      requestAnimationFrame(updateCursor);\n    }\n\n    function hide() {\n      clearTimeout(idleTimer);\n      cursor.classList.add(\"bt-cursor-hidden\");\n    }\n\n    function show() {\n      cursor.classList.add(\"is-visible\");\n      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      show();\n      requestCursorUpdate();\n    }, { passive: true });\n\n    window.addEventListener(\"scroll\", requestCursorUpdate, { passive: true });\n    window.addEventListener(\"resize\", requestCursorUpdate, { 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<\/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-8542","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/tausendberlin.com\/en\/wp-json\/wp\/v2\/pages\/8542","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=8542"}],"version-history":[{"count":140,"href":"https:\/\/tausendberlin.com\/en\/wp-json\/wp\/v2\/pages\/8542\/revisions"}],"predecessor-version":[{"id":9284,"href":"https:\/\/tausendberlin.com\/en\/wp-json\/wp\/v2\/pages\/8542\/revisions\/9284"}],"wp:attachment":[{"href":"https:\/\/tausendberlin.com\/en\/wp-json\/wp\/v2\/media?parent=8542"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}