{"id":21520,"date":"2026-09-24T11:21:49","date_gmt":"2026-09-24T09:21:49","guid":{"rendered":"https:\/\/management-kolloquium.de\/"},"modified":"2026-09-24T11:21:50","modified_gmt":"2026-09-24T09:21:50","slug":"programm-heilbronn-25","status":"publish","type":"page","link":"https:\/\/management-kolloquium.de\/en\/programm-heilbronn-25\/","title":{"rendered":"Programm Heilbronn 25"},"content":{"rendered":"\n<section id=\"program\" class=\"mmk-schedule relative overflow-x-hidden  py-8 bg-weiss\">\n\n    <style>\n        \/* Scroll-Lock f\u00fcr Modals (inkl. iOS) *\/\n        html.mmk-no-scroll,\n        html.mmk-no-scroll body {\n            overflow: hidden;\n            height: 100%;\n        }\n    <\/style>\n\n    <div class=\"w-full mx-auto max-w-6xl px-4 relative overflow-x-hidden\">\n        \n        <!-- Topbar: Tabs + Suche + (mobil) Filter-Button -->\n        <div class=\"flex flex-col md:flex-row md:items-center md:justify-between gap-3 mb-4 min-w-0\">\n            <div id=\"mmk-tabs\" role=\"tablist\" aria-label=\"Tage\" class=\"flex flex-wrap gap-2 min-w-0\"><\/div>\n\n                            <div class=\"flex items-center gap-2 w-full md:w-auto min-w-0\">\n                    <label for=\"mmk-search\" class=\"sr-only\">Suche<\/label>\n                    <input id=\"mmk-search\" type=\"search\" placeholder=\"Search for speakers, lectures, etc.\" class=\"w-full md:w-96 rounded-[5px] px-3 py-2 text-dunkelblau bg-hellgrau placeholder-dunkelblau\/50 focus:outline-none focus:ring-2 focus:ring-lila\" \/>\n                    <button id=\"mmk-search-btn\" class=\"shrink-0 rounded-[50px] bg-gelb px-3 py-2 font-semibold text-dunkelblau\">search<\/button>\n\n                    <!-- Mobile: Filter \u00f6ffnen -->\n                    <button id=\"mmk-filter-open\" class=\"lg:hidden shrink-0 rounded-[50px] border border-dunkelblau\/20 px-3 py-2 text-dunkelblau\">\n                        Filter\n                    <\/button>\n                <\/div>\n                    <\/div>\n\n        <div class=\"grid grid-cols-1 lg:grid-cols-[260px_1fr] gap-6 min-w-0\">\n                            <aside class=\"hidden lg:block min-w-0 rounded-[5px] border border-dunkelblau\/10 bg-dunkelblau h-max p-4 text-weiss\">\n                    <h3 class=\"text-lg font-bold\">Filter<\/h3>\n\n                    <svg class=\"mt-wb-xxs max-w-full\" width=\"75\" height=\"10\" viewBox=\"0 0 75 10\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                        <path d=\"M49.695 10L41.5002 2.49454L33.2892 9.99872L25.0581 2.49326L16.8539 9.99872L8.64162 2.50225L1.31751 9.39659L0 8.11529L8.62149 0L16.8526 7.51316L25.0555 0.00898703L33.2879 7.51444L41.5015 0.00770317L49.6963 7.51316L57.9086 0.00898703L66.1209 7.51444L73.704 0.600847L75 1.9014L66.1196 9.99872L57.9086 2.49326L49.695 10Z\" fill=\"#EAFF6E\" \/>\n                    <\/svg>\n\n                    <div class=\"mt-4\">\n                        <div class=\"text-[15px] uppercase tracking-wide text-weiss font-semibold mb-wb-xxs mt-[20px]\">Stages<\/div>\n                        <div id=\"filter-stages\" class=\"flex flex-col gap-[10px] break-words [overflow-wrap:anywhere]\"><\/div>\n                    <\/div>\n\n                    <span class=\"block w-full h-[1px] bg-weiss my-wb-xs\"><\/span>\n\n                    <div class=\"mt-4\">\n                        <div class=\"text-[15px] uppercase tracking-wide text-weiss font-semibold my-wb-xxs\">Type<\/div>\n                        <div id=\"filter-categories\" class=\"flex flex-col gap-[10px] break-words [overflow-wrap:anywhere]\"><\/div>\n                    <\/div>\n\n                    <span class=\"block w-full h-[1px] bg-weiss my-wb-xs\"><\/span>\n\n                    <div class=\"mt-4\">\n                        <div class=\"text-[15px] uppercase tracking-wide text-weiss font-semibold my-wb-xxs\">Topic<\/div>\n                        <div id=\"filter-topics\" class=\"flex flex-col gap-[10px] pr-1 break-words [overflow-wrap:anywhere]\"><\/div>\n                    <\/div>\n\n                    <div class=\"mt-4 flex gap-2\">\n                        <button id=\"mmk-reset\" class=\"rounded-[50px] border border-white\/10 px-3 py-2 text-white\/80 hover:bg-white\/10\">reset filters<\/button>\n                    <\/div>\n                <\/aside>\n            \n            <!-- Content -->\n            <main class=\"min-h-[240px] min-w-0\">\n                <div id=\"mmk-loader\" class=\"text-dunkelblau\/70\">Lade Programm\u2026<\/div>\n                <div id=\"mmk-error\" class=\"hidden text-red-600\">Beim Laden ist etwas schiefgelaufen.<\/div>\n                <div id=\"mmk-empty\" class=\"hidden text-dunkelblau\/70\">Keine Ergebnisse mit diesen Filtern.<\/div>\n                <div id=\"mmk-schedule-mount\" class=\"space-y-6 min-w-0\"><\/div>\n            <\/main>\n        <\/div>\n    <\/div>\n\n    <!-- Modal: Details -->\n    <div id=\"mmk-modal\" class=\"fixed inset-0 z-[99999] hidden flex items-center justify-center p-4 overscroll-contain\">\n        <button id=\"mmk-modal-backdrop\" class=\"absolute inset-0 bg-black\/60\" aria-label=\"Schlie\u00dfen (Hintergrund)\"><\/button>\n        <div role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"mmk-modal-title\" class=\"relative z-10 w-full max-w-2xl max-h-[90dvh] overflow-y-auto rounded-[8px] bg-weiss text-dunkelblau shadow-2xl focus:outline-none\">\n            <div class=\"flex items-center justify-between border-b border-dunkelblau\/10 px-4 py-3\">\n                <h3 id=\"mmk-modal-title\" class=\"text-lg font-bold\">Details<\/h3>\n                <button id=\"mmk-modal-close\" class=\"rounded-[50px] px-2 py-1 text-dunkelblau hover:bg-hellgrau\" aria-label=\"Schlie\u00dfen\">\u2715<\/button>\n            <\/div>\n            <div id=\"mmk-modal-body\" class=\"px-4 py-4 text-[15px] leading-relaxed break-words [overflow-wrap:anywhere]\"><\/div>\n            <div class=\"flex justify-end gap-2 border-t border-dunkelblau\/10 px-4 py-3\">\n                <a id=\"mmk-modal-cta\" href=\"#\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"hidden rounded-[60px] bg-lila px-4 py-2 font-semibold text-weiss hover:opacity-90\">register<\/a>\n                <button id=\"mmk-modal-ok\" class=\"rounded-[60px] bg-gelb px-4 py-2 font-semibold text-dunkelblau\">close<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n            <!-- Modal: Filter (nur mobil) -->\n        <div id=\"mmk-filter-modal\" class=\"fixed inset-0 z-[99998] hidden lg:hidden flex items-end sm:items-center justify-center p-0 sm:p-4 overscroll-contain\">\n            <button id=\"mmk-filter-backdrop\" class=\"absolute inset-0 bg-black\/60\" aria-label=\"Filter schlie\u00dfen (Hintergrund)\"><\/button>\n            <div role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"mmk-filter-title\" class=\"relative z-10 w-full sm:max-w-xl max-h-[92dvh] overflow-y-auto rounded-t-[16px] sm:rounded-[12px] bg-weiss text-dunkelblau shadow-2xl\">\n                <div class=\"flex items-center justify-between border-b border-dunkelblau\/10 px-4 py-3\">\n                    <h3 id=\"mmk-filter-title\" class=\"text-lg font-bold\">Filter<\/h3>\n                    <button id=\"mmk-filter-close\" class=\"rounded-[50px] px-2 py-1 text-dunkelblau hover:bg-hellgrau\" aria-label=\"Schlie\u00dfen\">\u2715<\/button>\n                <\/div>\n\n                <div class=\"px-4 py-4 space-y-4\">\n                    <div>\n                        <div class=\"text-[15px] uppercase tracking-wide font-semibold text-dunkelblau mb-2\">Stages<\/div>\n                        <div id=\"mfilter-stages\" class=\"flex flex-col gap-[10px] break-words [overflow-wrap:anywhere]\"><\/div>\n                    <\/div>\n\n                    <div class=\"h-px bg-dunkelblau\/10\"><\/div>\n\n                    <div>\n                        <div class=\"text-[15px] uppercase tracking-wide font-semibold text-dunkelblau mb-2\">Type<\/div>\n                        <div id=\"mfilter-categories\" class=\"flex flex-col gap-[10px] break-words [overflow-wrap:anywhere]\"><\/div>\n                    <\/div>\n\n                    <div class=\"h-px bg-dunkelblau\/10\"><\/div>\n\n                    <div>\n                        <div class=\"text-[15px] uppercase tracking-wide font-semibold text-dunkelblau mb-2\">Topic<\/div>\n                        <div id=\"mfilter-topics\" class=\"flex flex-col gap-[10px] break-words [overflow-wrap:anywhere]\"><\/div>\n                    <\/div>\n                <\/div>\n\n                <div class=\"flex items-center justify-between gap-2 border-t border-dunkelblau\/10 px-4 py-3\">\n                    <button id=\"mmk-filter-reset\" class=\"rounded-[50px] border border-dunkelblau\/20 px-4 py-2 text-dunkelblau\">reset<\/button>\n                    <button id=\"mmk-filter-apply\" class=\"rounded-[60px] bg-gelb px-4 py-2 font-semibold text-dunkelblau\">apply filters<\/button>\n                <\/div>\n            <\/div>\n        <\/div>\n    \n    <script>\n        (function() {\n            \/\/ ===== Flags aus PHP =====\n            const HIDE_FILTERS = false;\n            const HIDE_TIMES = false;\n\n            \/\/ Kill-Switch: wenn true => nirgendwo Register rendern\n            const HIDE_WORKSHOP_REGISTRATION = false;\n\n            const STATIC_TYPE_FILTER = [];\n            const STATIC_STAGE_FILTER = [];\n            const STATIC_TAB_FILTER = [];\n\n\n            \/\/ ===== CONFIG =====\n            const API_URL = 'https:\/\/api.streavent.de\/api\/cms\/webhook\/agenda?eventId=686f7eb5d0fa841ce456cc81';\n            const BEARER = 'sv_webhook_0a0c8770252354c3f06bfdbfcb1083c8d0a85f183e86f0ddce4a666e76d890fb';\n\n            \/\/ ===== Klassen =====\n            const cls = {\n                tab: 'px-4 py-2 rounded-[50px] bg-dunkelblau text-weiss font-semibold aria-selected:bg-gelb aria-selected:text-dunkelblau',\n                chip: 'inline-block rounded-full bg-dunkelblau\/10 text-dunkelblau text-xs px-2 py-1 mr-1 mb-1',\n                badge: 'inline-block bg-gelb text-dunkelblau text-[11px] w-max font-extrabold px-2 py-0.5 rounded-[50px]',\n                card: 'min-w-0 rounded-[5px] border border-dunkelblau\/20 p-wb-xs flex flex-col gap-3',\n                meta: 'text-dunkelblau text-xs font-medium',\n                hourLabel: 'text-sm font-extrabold text-dunkelblau',\n                hr: 'h-px bg-dunkelblau\/10 w-full',\n                checkbox: 'h-4 w-4 accent-gelb',\n                cardGrid: 'grid gap-4 sm:grid-cols-2 xl:grid-cols-3',\n                btnGhost: 'rounded-[60px] border border-dunkelblau\/20 px-3 py-1.5 text-dunkelblau hover:bg-hellgrau text-[15px]',\n                btnCta: 'rounded-[60px] bg-lila px-3 py-1.5 font-semibold text-weiss hover:opacity-90 text-[15px]'\n            };\n\n            \/\/ ===== DOM =====\n            const elTabs = document.getElementById('mmk-tabs');\n            const elMount = document.getElementById('mmk-schedule-mount');\n            const elLoad = document.getElementById('mmk-loader');\n            const elErr = document.getElementById('mmk-error');\n            const elEmpty = document.getElementById('mmk-empty');\n            const elSearch = document.getElementById('mmk-search');\n            const btnSearch = document.getElementById('mmk-search-btn');\n\n            \/\/ Sidebar roots\n            const elStages = document.getElementById('filter-stages');\n            const elCats = document.getElementById('filter-categories');\n            const elTopics = document.getElementById('filter-topics');\n            const btnReset = document.getElementById('mmk-reset');\n\n            \/\/ Mobile Filter modal\n            const btnFilterOpen = document.getElementById('mmk-filter-open');\n            const fModal = document.getElementById('mmk-filter-modal');\n            const fBackdrop = document.getElementById('mmk-filter-backdrop');\n            const fClose = document.getElementById('mmk-filter-close');\n            const fApply = document.getElementById('mmk-filter-apply');\n            const fReset = document.getElementById('mmk-filter-reset');\n            const mStages = document.getElementById('mfilter-stages');\n            const mCats = document.getElementById('mfilter-categories');\n            const mTopics = document.getElementById('mfilter-topics');\n\n            \/\/ Details Modal\n            const modal = document.getElementById('mmk-modal');\n            const modalBody = document.getElementById('mmk-modal-body');\n            const modalTitle = document.getElementById('mmk-modal-title');\n            const modalClose = document.getElementById('mmk-modal-close');\n            const modalOK = document.getElementById('mmk-modal-ok');\n            const modalBG = document.getElementById('mmk-modal-backdrop');\n            const modalCTA = document.getElementById('mmk-modal-cta');\n            let lastFocused = null;\n\n            \/\/ ===== STATE =====\n            let RAW = null;\n            let activeTabIdx = 0;\n            let FILTERED_TABS = [];\n            let filters = {\n                stages: new Set(),\n                categories: new Set(),\n                topics: new Set(),\n                q: ''\n            };\n\n            \/\/ ===== Helpers =====\n            function parseTimeToMinutes(t) {\n                if (!t) return 0;\n                const [h = '0', m = '0'] = String(t).trim().split(':');\n                return (+h || 0) * 60 + (+m || 0);\n            }\n            const pad2 = n => String(n).padStart(2, '0');\n            const minutesToHourLabel = mins => `${pad2(Math.floor(mins\/60))}:00`;\n\n            function groupByHour(entries) {\n                const sorted = [...entries].sort((a, b) => parseTimeToMinutes(a.date) - parseTimeToMinutes(b.date));\n                const g = new Map();\n                for (const it of sorted) {\n                    const k = minutesToHourLabel(parseTimeToMinutes(it.date));\n                    if (!g.has(k)) g.set(k, []);\n                    g.get(k).push(it);\n                }\n                return g;\n            }\n\n            function el(tag, className = '', attrs = {}) {\n                const n = document.createElement(tag);\n                if (className) n.className = className;\n                for (const [k, v] of Object.entries(attrs)) {\n                    if (k === 'text') n.textContent = v;\n                    else if (k === 'html') n.innerHTML = v;\n                    else n.setAttribute(k, v);\n                }\n                return n;\n            }\n\n            const includesCI = (h, n) => String(h || '').toLowerCase().includes(String(n || '').toLowerCase());\n\n            function escapeHTML(str) {\n                return String(str).replace(\/&\/g, '&amp;').replace(\/<\/g, '&lt;').replace(\/>\/g, '&gt;').replace(\/\"\/g, '&quot;').replace(\/'\/g, '&#39;');\n            }\n\n            function escapeAttr(s) {\n                return String(s).replace(\/&\/g, '&amp;').replace(\/\"\/g, '&quot;').replace(\/<\/g, '&lt;').replace(\/>\/g, '&gt;');\n            }\n\n            function linkify(text) {\n                let s = escapeHTML(text || '');\n                s = s.replace(\/(?:https?:\\\/\\\/)[^\\s<]+\/gi, m => `<a href=\"${m}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-lila underline\">${m}<\/a>`);\n                s = s.replace(\/(^|[\\s(])www\\.[^\\s<]+\/gi, (m, p1) => {\n                    const raw = m.trim();\n                    const url = raw.replace(\/^[\\s(]]?\/, '');\n                    return `${p1}<a href=\"http:\/\/${url}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-lila underline\">${url}<\/a>`;\n                });\n                s = s.replace(\/\\n{2,}\/g, '<br><br>').replace(\/\\n\/g, '<br>');\n                return s;\n            }\n\n            function sanitizeAllowedHTML(input) {\n                const c = document.createElement('div');\n                c.innerHTML = input;\n                const allowed = new Set(['A', 'BR', 'STRONG', 'EM', 'B', 'I', 'UL', 'OL', 'LI', 'P', 'DIV', 'SPAN']);\n                (function walk(n) {\n                    [...n.childNodes].forEach(ch => {\n                        if (ch.nodeType === 1) {\n                            if (!allowed.has(ch.tagName)) {\n                                const s = document.createElement('span');\n                                s.textContent = ch.textContent;\n                                ch.replaceWith(s);\n                            } else {\n                                if (ch.tagName === 'A') {\n                                    let href = ch.getAttribute('href') || '';\n                                    if (href && !\/^https?:\\\/\\\/\/i.test(href)) href = 'http:\/\/' + href.replace(\/^\\\/\\\/\/, '');\n                                    ch.setAttribute('href', href || '#');\n                                    ch.setAttribute('target', '_blank');\n                                    ch.setAttribute('rel', 'noopener noreferrer');\n                                    ch.classList.add('text-lila', 'underline');\n                                }\n                                walk(ch);\n                            }\n                        } else if (ch.nodeType === 8) {\n                            ch.remove();\n                        }\n                    });\n                })(c);\n                return c.innerHTML;\n            }\n\n            const renderDescriptionHTML = raw => !raw ? '' : (\/<\\s*[a-z][\\s\\S]*>\/i.test(raw) ? sanitizeAllowedHTML(raw) : linkify(raw));\n\n            function normalizeUrl(u) {\n                if (!u) return '';\n                let url = String(u).trim();\n                if (!\/^https?:\\\/\\\/\/i.test(url)) url = 'http:\/\/' + url.replace(\/^\\\/\\\/\/, '');\n                return url;\n            }\n\n            \/\/ Aggregate aus Tabs (f\u00fcr Filter-Listen)\n            function getAggregatesFromTabs(tabs) {\n                const stages = new Set(),\n                    cats = new Set(),\n                    topics = new Set();\n                tabs.forEach(tab => {\n                    (tab.entries || []).forEach(e => {\n                        if (e.stage) stages.add(e.stage);\n                        (e.category || []).forEach(c => cats.add(c));\n                        (e.type || []).forEach(t => topics.add(t));\n                    });\n                });\n                let allStages = [...stages].sort();\n                let allCategories = [...cats].sort();\n                const allTopics = [...topics].sort();\n\n                if (Array.isArray(STATIC_STAGE_FILTER) && STATIC_STAGE_FILTER.length) {\n                    const wl = new Set(STATIC_STAGE_FILTER);\n                    allStages = allStages.filter(s => wl.has(String(s || '').toLowerCase()));\n                }\n\n                if (Array.isArray(STATIC_TYPE_FILTER) && STATIC_TYPE_FILTER.length) {\n                    const wl = new Set(STATIC_TYPE_FILTER);\n                    allCategories = allCategories.filter(c => wl.has(String(c || '').toLowerCase()));\n                }\n\n                return {\n                    allStages,\n                    allCategories,\n                    allTopics\n                };\n            }\n\n            \/\/ ===== Details-Modal =====\n            function openModal(title, html, opener, linkUrl, headerImg) {\n                lastFocused = opener || document.activeElement;\n                modalTitle.textContent = title || 'Details';\n                const parts = [];\n                if (headerImg && String(headerImg).trim().length) {\n                    parts.push(`<div class=\"mb-3 -mt-2\"><img decoding=\"async\" src=\"${escapeAttr(headerImg)}\" alt=\"\" class=\"w-full h-auto rounded-[6px] object-cover\"\/><\/div>`);\n                }\n                parts.push(`<div>${html||''}<\/div>`);\n                modalBody.innerHTML = parts.join('');\n\n                if (modalCTA) {\n                    if (linkUrl) {\n                        modalCTA.href = normalizeUrl(linkUrl);\n                        modalCTA.classList.remove('hidden');\n                    } else {\n                        modalCTA.href = '#';\n                        modalCTA.classList.add('hidden');\n                    }\n                }\n\n                modal.classList.remove('hidden');\n                document.documentElement.classList.add('mmk-no-scroll');\n                setTimeout(() => modalClose.focus(), 0);\n                document.addEventListener('keydown', e => {\n                    if (e.key === 'Escape') closeModal();\n                }, {\n                    once: true\n                });\n            }\n\n            function closeModal() {\n                modal.classList.add('hidden');\n                document.documentElement.classList.remove('mmk-no-scroll');\n                if (lastFocused && typeof lastFocused.focus === 'function') lastFocused.focus();\n            }\n            modalClose?.addEventListener('click', closeModal);\n            modalOK?.addEventListener('click', closeModal);\n            modalBG?.addEventListener('click', closeModal);\n\n            \/\/ ===== Filter-Renderer (Sidebar & Mobile) =====\n            function makeCheckbox(label, groupKey, checked, applyNow) {\n                const id = `${groupKey}-${label}`.replace(\/\\s+\/g, '-').toLowerCase();\n                const wrap = el('label', 'flex items-center gap-2 text-sm text-inherit');\n                const input = el('input', cls.checkbox, {\n                    type: 'checkbox',\n                    id,\n                    value: label\n                });\n                input.checked = !!checked;\n                input.addEventListener('change', () => {\n                    const set = filters[groupKey];\n                    if (input.checked) set.add(label);\n                    else set.delete(label);\n                    if (applyNow) {\n                        renderContent();\n                        renderAllFiltersUIs();\n                    }\n                });\n                wrap.appendChild(input);\n                wrap.appendChild(el('span', '', {\n                    text: label\n                }));\n                return wrap;\n            }\n\n            function renderFiltersInto(targets, applyNow) {\n                const {\n                    stagesRoot,\n                    catsRoot,\n                    topicsRoot,\n                    theme = 'dark'\n                } = targets;\n                if (!FILTERED_TABS.length) return;\n\n                const {\n                    allStages,\n                    allCategories,\n                    allTopics\n                } = getAggregatesFromTabs(FILTERED_TABS);\n\n                const textColor = theme === 'dark' ? 'text-weiss' : 'text-dunkelblau';\n                if (stagesRoot) {\n                    stagesRoot.innerHTML = '';\n                    allStages.forEach(s => stagesRoot.appendChild(makeCheckbox(s, 'stages', filters.stages.has(s), applyNow)));\n                    stagesRoot.classList.add(textColor);\n                }\n                if (catsRoot) {\n                    catsRoot.innerHTML = '';\n                    allCategories.forEach(c => catsRoot.appendChild(makeCheckbox(c, 'categories', filters.categories.has(c), applyNow)));\n                    catsRoot.classList.add(textColor);\n                }\n                if (topicsRoot) {\n                    topicsRoot.innerHTML = '';\n                    allTopics.forEach(t => topicsRoot.appendChild(makeCheckbox(t, 'topics', filters.topics.has(t), applyNow)));\n                    topicsRoot.classList.add(textColor);\n                }\n            }\n\n            function renderAllFiltersUIs() {\n                if (HIDE_FILTERS) return;\n                if (elStages || elCats || elTopics) {\n                    renderFiltersInto({\n                        stagesRoot: elStages,\n                        catsRoot: elCats,\n                        topicsRoot: elTopics,\n                        theme: 'dark'\n                    }, true);\n                }\n                if (mStages || mCats || mTopics) {\n                    renderFiltersInto({\n                        stagesRoot: mStages,\n                        catsRoot: mCats,\n                        topicsRoot: mTopics,\n                        theme: 'light'\n                    }, false);\n                }\n            }\n\n            \/\/ ===== Tabs =====\n            function getActiveTabs() {\n                const tabs = RAW?.data?.tabs || [];\n                if (Array.isArray(STATIC_TAB_FILTER) && STATIC_TAB_FILTER.length) {\n                    const wl = new Set(STATIC_TAB_FILTER);\n                    return tabs.filter(t => wl.has(String(t.name || '').toLowerCase()));\n                }\n                return tabs;\n            }\n\n            function renderTabs() {\n                const tabs = FILTERED_TABS;\n                elTabs.innerHTML = '';\n                tabs.forEach((t, idx) => {\n                    const btn = el('button', 'min-w-0 ' + cls.tab, {\n                        role: 'tab',\n                        'aria-selected': idx === activeTabIdx ? 'true' : 'false'\n                    });\n                    btn.textContent = t.name || `Tag ${idx+1}`;\n                    btn.addEventListener('click', () => {\n                        activeTabIdx = idx;\n                        renderTabs();\n                        renderContent(true);\n                    });\n                    elTabs.appendChild(btn);\n                });\n                if (activeTabIdx >= tabs.length) activeTabIdx = 0;\n            }\n\n            \/\/ ===== Filter\/Search Logic =====\n            const has = s => s && s.size > 0;\n\n            function passesStaticTypeFilter(item) {\n                if (!Array.isArray(STATIC_TYPE_FILTER) || !STATIC_TYPE_FILTER.length) return true;\n                const cats = (item.category || []).map(c => String(c || '').toLowerCase());\n                return cats.some(c => STATIC_TYPE_FILTER.includes(c));\n            }\n\n            function passesStaticStageFilter(item) {\n                if (!Array.isArray(STATIC_STAGE_FILTER) || !STATIC_STAGE_FILTER.length) return true;\n                const st = String(item.stage || '').toLowerCase();\n                return STATIC_STAGE_FILTER.includes(st);\n            }\n\n            function applyFilters(entries) {\n                const {\n                    stages,\n                    categories,\n                    topics,\n                    q\n                } = filters;\n                return entries.filter(item => {\n                    if (!passesStaticTypeFilter(item)) return false;\n                    if (!passesStaticStageFilter(item)) return false;\n\n                    if (has(stages) && !stages.has(item.stage)) return false;\n\n                    if (has(categories)) {\n                        const cats = item.category || [];\n                        if (!cats.some(c => categories.has(c))) return false;\n                    }\n                    if (has(topics)) {\n                        const tps = item.type || [];\n                        if (!tps.some(tp => topics.has(tp))) return false;\n                    }\n                    if (q && q.trim() !== '') {\n                        const inTitle = includesCI(item.topic, q);\n                        const inDesc = includesCI(item.description, q);\n                        const inSpeaker = (item.speakers || []).some(s => includesCI(s.name, q) || includesCI(s.position, q) || includesCI(s.bio, q));\n                        if (!(inTitle || inDesc || inSpeaker)) return false;\n                    }\n                    return true;\n                });\n            }\n\n            \/\/ ===== Cards =====\n            function renderCard(item) {\n                \/\/ \u00c4nderung: komplette Kachel bg-hellgrau bei Academy I\/II\n                const isAcademy = item.stage === 'Academy I' || item.stage === 'Academy II' || item.stage === 'Academy III' || item.stage === 'Academy IV';\n                const card = el('article', cls.card + (isAcademy ? ' bg-dunkelgrau' : ''));\n\n                \/\/ Meta\n                const meta = el('div', 'flex items-center justify-between ' + cls.meta);\n\n                \/\/ Zeit links (wenn Times sichtbar)\n                if (!HIDE_TIMES) {\n                    meta.appendChild(el('div', '', {\n                        text: `${item.date||''} \u2013 ${item.dateEnd||''}`\n                    }));\n                } else {\n                    \/\/ Stage statt Zeit (wenn Times versteckt) - OHNE bg-hellgrau\n                    meta.appendChild(el('div', '', {\n                        text: item.stage || ''\n                    }));\n                }\n\n                \/\/ Stage rechts (wenn Times sichtbar) - OHNE bg-hellgrau\n                if (!HIDE_TIMES && item.stage) {\n                    meta.appendChild(el('div', '', {\n                        text: item.stage\n                    }));\n                }\n\n                card.appendChild(meta);\n\n                \/\/ Titel\n                if (item.topic) card.appendChild(el('h4', 'text-[15px] font-semibold text-dunkelblau break-words [overflow-wrap:anywhere]', {\n                    text: item.topic.trim()\n                }));\n\n                \/\/ Badge (erste Kategorie)\n                if (Array.isArray(item.category) && item.category.length) {\n                    card.appendChild(el('span', cls.badge, {\n                        text: item.category[0]\n                    }));\n                }\n\n                \/\/ Speaker (mit optionalem Link)\n                if (Array.isArray(item.speakers) && item.speakers.length) {\n                    item.speakers.forEach(sp => {\n                        const wrapperTag = sp.link ? 'a' : 'div';\n                        const attrs = sp.link ? {\n                            href: normalizeUrl(sp.link),\n                            target: '_blank',\n                            rel: 'noopener noreferrer'\n                        } : {};\n                        const row = el(wrapperTag, 'flex items-center gap-3 mt-[10px] min-w-0', attrs);\n\n                        const img = el('img', 'min-w-[45px] !w-[45px] h-auto aspect-square rounded-[50%] overflow-hidden object-cover', {\n                            src: sp.image || '',\n                            alt: sp.name || 'Speaker',\n                            onerror: \"this.style.display='none';\"\n                        });\n                        row.appendChild(img);\n\n                        const info = el('div', 'min-w-0');\n                        if (sp.name) info.appendChild(el('div', 'font-medium text-[15px] leading-tight text-dunkelblau break-words [overflow-wrap:anywhere]', {\n                            text: sp.name\n                        }));\n\n                        \/\/ position statt bio (Fallback)\n                        const speakerLine = sp.position || sp.bio;\n                        if (speakerLine) info.appendChild(el('div', 'text-xs text-dunkelblau\/80 break-words [overflow-wrap:anywhere]', {\n                            text: speakerLine\n                        }));\n\n                        row.appendChild(info);\n                        card.appendChild(row);\n                    });\n                }\n\n                \/\/ Actions\n                const actions = el('div', 'flex flex-wrap items-center gap-2 mt-1');\n                const hasDesc = !!(item.description && String(item.description).trim().length);\n\n                if (hasDesc) {\n                    const btn = el('button', cls.btnGhost + ' self-start', {\n                        type: 'button',\n                        text: 'details'\n                    });\n                    btn.addEventListener('click', (e) => {\n                        const title = item.topic || 'details';\n                        const html = renderDescriptionHTML(String(item.description).trim());\n\n                        openModal(\n                            title,\n                            html,\n                            e.currentTarget,\n                            '',\n                            item.headerImg || ''\n                        );\n                    });\n                    actions.appendChild(btn);\n                }\n\n                if (item.sessionUrl && !HIDE_WORKSHOP_REGISTRATION) {\n                    const a = el('a', cls.btnCta + ' self-start', {\n                        href: normalizeUrl(item.sessionUrl),\n                        target: '_blank',\n                        rel: 'noopener noreferrer'\n                    });\n                    a.textContent = 'register';\n                    actions.appendChild(a);\n                }\n\n                if (actions.childNodes.length) card.appendChild(actions);\n                return card;\n            }\n\n            \/\/ ===== Content =====\n            function renderContent(scrollTop = false) {\n                const tabs = FILTERED_TABS;\n                const current = tabs[activeTabIdx] || {\n                    entries: []\n                };\n                const entries = Array.isArray(current.entries) ? current.entries : [];\n                const filtered = applyFilters(entries);\n\n                elLoad.classList.add('hidden');\n                elErr.classList.add('hidden');\n                elMount.innerHTML = '';\n\n                if (filtered.length === 0) {\n                    elEmpty.classList.remove('hidden');\n                    return;\n                }\n                elEmpty.classList.add('hidden');\n\n                if (HIDE_TIMES) {\n                    const sorted = [...filtered].sort((a, b) => parseTimeToMinutes(a.date) - parseTimeToMinutes(b.date));\n                    const grid = el('div', 'min-w-0 ' + cls.cardGrid);\n                    sorted.forEach(it => grid.appendChild(renderCard(it)));\n                    elMount.appendChild(grid);\n                } else {\n                    const grouped = groupByHour(filtered);\n                    grouped.forEach((items, hour) => {\n                        const wrap = el('section', 'space-y-3 min-w-0');\n                        const head = el('div', 'flex items-center gap-3 min-w-0');\n                        head.appendChild(el('div', cls.hourLabel, {\n                            text: hour\n                        }));\n                        head.appendChild(el('div', cls.hr));\n                        wrap.appendChild(head);\n                        const grid = el('div', 'min-w-0 ' + cls.cardGrid);\n                        items.forEach(it => grid.appendChild(renderCard(it)));\n                        wrap.appendChild(grid);\n                        elMount.appendChild(wrap);\n                    });\n                }\n\n                if (scrollTop) window.scrollTo({\n                    top: elMount.offsetTop - 120,\n                    behavior: 'smooth'\n                });\n            }\n\n            \/\/ ===== Events =====\n            if (!HIDE_FILTERS && elSearch) {\n                elSearch.addEventListener('input', e => {\n                    filters.q = e.target.value;\n                    renderContent();\n                });\n            }\n            if (!HIDE_FILTERS && btnSearch) {\n                btnSearch.addEventListener('click', () => renderContent());\n            }\n\n            \/\/ Sidebar Reset\n            if (!HIDE_FILTERS && btnReset) {\n                btnReset.addEventListener('click', () => {\n                    filters = {\n                        stages: new Set(),\n                        categories: new Set(),\n                        topics: new Set(),\n                        q: ''\n                    };\n                    if (elSearch) elSearch.value = '';\n                    renderAllFiltersUIs();\n                    renderContent();\n                });\n            }\n\n            \/\/ Mobile Filter Modal open\/close\n            function openFilterModal() {\n                fModal?.classList.remove('hidden');\n                document.documentElement.classList.add('mmk-no-scroll');\n                renderAllFiltersUIs();\n            }\n\n            function closeFilterModal() {\n                fModal?.classList.add('hidden');\n                document.documentElement.classList.remove('mmk-no-scroll');\n            }\n            btnFilterOpen?.addEventListener('click', openFilterModal);\n            fBackdrop?.addEventListener('click', closeFilterModal);\n            fClose?.addEventListener('click', closeFilterModal);\n\n            \/\/ Mobile Reset\/Apply\n            fReset?.addEventListener('click', () => {\n                filters = {\n                    stages: new Set(),\n                    categories: new Set(),\n                    topics: new Set(),\n                    q: ''\n                };\n                renderAllFiltersUIs();\n            });\n            fApply?.addEventListener('click', () => {\n                closeFilterModal();\n                renderAllFiltersUIs();\n                renderContent();\n            });\n\n            \/\/ ===== Init =====\n            async function init() {\n                try {\n                    elLoad.classList.remove('hidden');\n                    const resp = await fetch(API_URL, {\n                        headers: {\n                            'Authorization': 'Bearer ' + BEARER,\n                            'Accept': 'application\/json'\n                        }\n                    });\n                    if (!resp.ok) throw new Error('HTTP ' + resp.status);\n                    RAW = await resp.json();\n\n                    FILTERED_TABS = getActiveTabs();\n\n                    renderTabs();\n                    renderAllFiltersUIs();\n                    renderContent();\n                } catch (err) {\n                    console.error(err);\n                    elLoad.classList.add('hidden');\n                    elErr.classList.remove('hidden');\n                }\n            }\n            init();\n        })();\n    <\/script>\n<\/section>","protected":false},"excerpt":{"rendered":"","protected":false},"author":6,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-21520","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/management-kolloquium.de\/en\/wp-json\/wp\/v2\/pages\/21520","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/management-kolloquium.de\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/management-kolloquium.de\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/management-kolloquium.de\/en\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/management-kolloquium.de\/en\/wp-json\/wp\/v2\/comments?post=21520"}],"version-history":[{"count":2,"href":"https:\/\/management-kolloquium.de\/en\/wp-json\/wp\/v2\/pages\/21520\/revisions"}],"predecessor-version":[{"id":21522,"href":"https:\/\/management-kolloquium.de\/en\/wp-json\/wp\/v2\/pages\/21520\/revisions\/21522"}],"wp:attachment":[{"href":"https:\/\/management-kolloquium.de\/en\/wp-json\/wp\/v2\/media?parent=21520"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}