{"id":201,"date":"2026-03-03T12:15:23","date_gmt":"2026-03-03T12:15:23","guid":{"rendered":"https:\/\/danishdrift.dk\/?page_id=201"},"modified":"2026-05-29T18:14:40","modified_gmt":"2026-05-29T18:14:40","slug":"kalender","status":"publish","type":"page","link":"https:\/\/danishdrift.dk\/en\/kalender\/","title":{"rendered":"Calendar"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"201\" class=\"elementor elementor-201\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-badb204 e-con-full e-flex e-con e-parent\" data-id=\"badb204\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6dafb40 elementor-widget elementor-widget-html\" data-id=\"6dafb40\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- ============================= -->\n<!-- DDC \u2013 SHEET EVENT + TRACK MAP + PROGRAM + DHB MAP -->\n<!-- ============================= -->\n\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700;800;900&family=Teko:wght@600;700&display=swap\" rel=\"stylesheet\">\n\n<style>\n  :root{\n    --ddc-bg:#070A10;\n    --ddc-bg2:#05070C;\n    --ddc-card:rgba(255,255,255,0.06);\n    --ddc-stroke:rgba(255,255,255,0.12);\n    --ddc-text:#FFFFFF;\n    --ddc-dim:#A9B0BC;\n    --ddc-red:#E50914;\n    --ddc-red2:#FF2A2A;\n    --ddc-shadow:0 18px 60px rgba(0,0,0,0.55);\n    --ddc-radius:18px;\n    --ddc-max:1200px;\n\n    --ddc-bgimg:url('https:\/\/danishdrift.dk\/wp-content\/uploads\/2026\/03\/AVM_1583-1.jpg');\n    --ddc-track-bgimg:url('https:\/\/danishdrift.dk\/wp-content\/uploads\/2026\/03\/ChatGPT-Image-3.-mar.-2026-12.59.35.png');\n  }\n\n  html{\n    scroll-behavior:smooth;\n  }\n\n  .ddc-bleed{\n    position:relative;\n    left:50%;\n    right:50%;\n    margin-left:-50vw;\n    margin-right:-50vw;\n    width:100vw;\n  }\n\n  .ddc-wrap{\n    max-width:var(--ddc-max);\n    margin:0 auto;\n    position:relative;\n    z-index:2;\n  }\n\n  .ddc-btn{\n    position:relative;\n    display:inline-flex;\n    align-items:center;\n    justify-content:center;\n    gap:10px;\n    padding:12px 16px;\n    border-radius:14px;\n    text-decoration:none;\n    font-weight:900;\n    letter-spacing:.10em;\n    text-transform:uppercase;\n    font-size:12px;\n    border:1px solid rgba(255,255,255,0.14);\n    background:rgba(255,255,255,0.06);\n    color:#fff !important;\n    -webkit-text-fill-color:#fff;\n    transition:transform .22s cubic-bezier(.2,.8,.2,1), border-color .22s ease, background .22s ease, box-shadow .22s ease;\n    box-shadow:0 10px 30px rgba(0,0,0,0.25);\n    white-space:nowrap;\n    cursor:pointer;\n    overflow:hidden;\n    backdrop-filter:blur(8px);\n  }\n\n  .ddc-btn::before{\n    content:\"\";\n    position:absolute;\n    top:0;\n    left:-60%;\n    width:60%;\n    height:100%;\n    background:linear-gradient(120deg, transparent, rgba(255,255,255,0.22), transparent);\n    transform:skewX(-20deg);\n    transition:.6s ease;\n    pointer-events:none;\n  }\n\n  .ddc-btn:hover::before{\n    left:120%;\n  }\n\n  .ddc-btn:hover{\n    color:#fff !important;\n    -webkit-text-fill-color:#fff;\n    transform:translateY(-2px);\n    background:rgba(255,255,255,0.08);\n    border-color:rgba(255,255,255,0.30);\n    box-shadow:0 14px 40px rgba(0,0,0,0.35), 0 0 18px rgba(255,0,0,0.14);\n  }\n\n  .ddc-btn--primary{\n    border:0;\n    background:linear-gradient(135deg, rgba(255,26,26,0.92), rgba(229,9,20,0.92) 45%, rgba(179,0,0,0.92));\n    box-shadow:0 12px 34px rgba(229,9,20,0.26);\n  }\n\n  .ddc-btn--primary:hover{\n    color:#fff !important;\n    -webkit-text-fill-color:#fff;\n    transform:translateY(-3px) scale(1.02);\n    box-shadow:0 18px 52px rgba(255,0,0,0.32);\n  }\n\n  .ddc-btn--ticket{\n    border:1px solid rgba(255,255,255,0.18);\n    background:\n      radial-gradient(120px 70px at 20% 0%, rgba(255,255,255,0.20), transparent 62%),\n      linear-gradient(135deg, #E50914, #FF2A2A 52%, #B30000);\n    color:#fff !important;\n    -webkit-text-fill-color:#fff;\n    box-shadow:0 14px 38px rgba(229,9,20,0.34);\n  }\n\n  .ddc-btn--ticket:hover{\n    color:#fff !important;\n    -webkit-text-fill-color:#fff;\n    transform:translateY(-3px) scale(1.02);\n    box-shadow:0 18px 52px rgba(255,0,0,0.38);\n  }\n\n  .ddc-cal{\n    position:relative;\n    color:var(--ddc-text);\n    padding:70px 18px;\n    font-family:Inter, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;\n    overflow:hidden;\n    background:linear-gradient(180deg, var(--ddc-bg), var(--ddc-bg2));\n    isolation:isolate;\n  }\n\n  .ddc-cal::before{\n    content:\"\";\n    position:absolute;\n    inset:-60px;\n    background-image:var(--ddc-bgimg);\n    background-size:cover;\n    background-position:center;\n    filter:blur(2px) brightness(0.72) saturate(1.05);\n    transform:scale(1.08);\n    z-index:0;\n  }\n\n  .ddc-cal::after{\n    content:\"\";\n    position:absolute;\n    inset:0;\n    z-index:1;\n    background:\n      radial-gradient(900px 300px at 12% 0%, rgba(229,9,20,0.16), transparent 60%),\n      radial-gradient(900px 300px at 88% 0%, rgba(255,42,42,0.12), transparent 60%),\n      radial-gradient(700px 420px at 50% 120%, rgba(255,255,255,0.06), transparent 55%),\n      linear-gradient(180deg, rgba(7,10,16,0.86), rgba(5,7,12,0.92));\n  }\n\n  .ddc-cal__head{\n    display:flex;\n    align-items:flex-end;\n    justify-content:space-between;\n    gap:18px;\n    margin-bottom:22px;\n  }\n\n  .ddc-cal__badge{\n    display:inline-flex;\n    align-items:center;\n    gap:10px;\n    width:fit-content;\n    background:rgba(229,9,20,0.12);\n    border:1px solid rgba(255,42,42,0.28);\n    padding:10px 14px;\n    border-radius:999px;\n    font-weight:800;\n    letter-spacing:.10em;\n    text-transform:uppercase;\n    font-size:12px;\n  }\n\n  .ddc-cal__dot{\n    width:9px;\n    height:9px;\n    border-radius:50%;\n    background:var(--ddc-red2);\n    box-shadow:0 0 0 4px rgba(255,42,42,0.15);\n  }\n\n  .ddc-cal__title{\n    margin:10px 0 6px;\n    font-family:Teko, sans-serif;\n    font-size:52px;\n    line-height:.95;\n    letter-spacing:1px;\n    text-transform:uppercase;\n  }\n\n  .ddc-cal__lead{\n    margin:0;\n    color:var(--ddc-dim);\n    max-width:720px;\n    line-height:1.7;\n    font-size:14px;\n  }\n\n  .ddc-events{\n    margin-top:18px;\n    display:grid;\n    grid-template-columns:1fr;\n    gap:16px;\n  }\n\n  .ddc-card{\n    background:var(--ddc-card);\n    border:1px solid var(--ddc-stroke);\n    border-radius:var(--ddc-radius);\n    box-shadow:var(--ddc-shadow);\n    overflow:hidden;\n    position:relative;\n    backdrop-filter:blur(10px);\n  }\n\n  .ddc-feature{\n    padding:18px;\n    background:\n      radial-gradient(520px 260px at 18% 10%, rgba(255,42,42,0.18), transparent 60%),\n      radial-gradient(620px 280px at 85% 0%, rgba(229,9,20,0.14), transparent 65%),\n      rgba(255,255,255,0.04);\n  }\n\n  .ddc-feature__top{\n    display:flex;\n    align-items:flex-start;\n    justify-content:space-between;\n    gap:14px;\n    margin-bottom:14px;\n  }\n\n  .ddc-date{\n    display:flex;\n    align-items:center;\n    gap:12px;\n    padding:10px 12px;\n    border-radius:16px;\n    background:rgba(0,0,0,0.22);\n    border:1px solid rgba(255,255,255,0.12);\n    backdrop-filter:blur(10px);\n  }\n\n  .ddc-date__box{\n    width:44px;\n    height:44px;\n    border-radius:14px;\n    display:flex;\n    flex-direction:column;\n    align-items:center;\n    justify-content:center;\n    background:linear-gradient(135deg, rgba(229,9,20,0.85), rgba(255,42,42,0.70));\n    font-weight:900;\n    letter-spacing:.08em;\n    text-transform:uppercase;\n  }\n\n  .ddc-date__box span{\n    line-height:1;\n  }\n\n  .ddc-date__box .ddc-day{\n    font-size:16px;\n  }\n\n  .ddc-date__box .ddc-mon{\n    font-size:10px;\n    opacity:.95;\n  }\n\n  .ddc-date__meta{\n    display:flex;\n    flex-direction:column;\n    gap:2px;\n  }\n\n  .ddc-date__meta strong{\n    font-size:13px;\n    letter-spacing:.08em;\n    text-transform:uppercase;\n  }\n\n  .ddc-date__meta em{\n    font-style:normal;\n    color:var(--ddc-dim);\n    font-size:13px;\n  }\n\n  .ddc-tag{\n    display:inline-flex;\n    align-items:center;\n    gap:8px;\n    padding:10px 12px;\n    border-radius:999px;\n    border:1px solid rgba(255,255,255,0.12);\n    background:rgba(255,255,255,0.04);\n    font-weight:900;\n    letter-spacing:.10em;\n    text-transform:uppercase;\n    font-size:11px;\n    white-space:nowrap;\n    backdrop-filter:blur(10px);\n  }\n\n  .ddc-tag .ddc-pulse{\n    width:8px;\n    height:8px;\n    border-radius:50%;\n    background:var(--ddc-red2);\n    box-shadow:0 0 0 4px rgba(255,42,42,0.14);\n  }\n\n  .ddc-tag--live{\n    background:rgba(229,9,20,0.18);\n    border-color:rgba(255,42,42,0.35);\n  }\n\n  .ddc-tag--done{\n    background:rgba(30,180,95,0.14);\n    border-color:rgba(30,180,95,0.35);\n  }\n\n  .ddc-tag--hidden{\n    display:none;\n  }\n\n  .ddc-feature h3{\n    margin:0 0 8px;\n    font-family:Teko, sans-serif;\n    font-size:38px;\n    line-height:1;\n    text-transform:uppercase;\n    letter-spacing:1px;\n  }\n\n  .ddc-feature p{\n    margin:0 0 14px;\n    color:var(--ddc-dim);\n    line-height:1.7;\n    font-size:14px;\n    max-width:760px;\n  }\n\n  .ddc-feature__row{\n    display:flex;\n    gap:12px;\n    flex-wrap:wrap;\n    align-items:center;\n    justify-content:space-between;\n  }\n\n  .ddc-meta{\n    display:flex;\n    gap:10px;\n    flex-wrap:wrap;\n  }\n\n  .ddc-pill{\n    display:inline-flex;\n    align-items:center;\n    gap:8px;\n    padding:10px 12px;\n    border-radius:999px;\n    background:rgba(0,0,0,0.22);\n    border:1px solid rgba(255,255,255,0.10);\n    color:#fff;\n    font-size:13px;\n    backdrop-filter:blur(10px);\n  }\n\n  .ddc-pill small{\n    color:var(--ddc-dim);\n    font-size:13px;\n  }\n\n  .ddc-ctaRow{\n    display:flex;\n    gap:10px;\n    flex-wrap:wrap;\n  }\n\n  .ddc-loader,\n  .ddc-error{\n    color:#fff;\n    padding:18px;\n    border-radius:18px;\n    border:1px solid rgba(255,255,255,0.12);\n    background:rgba(0,0,0,0.25);\n  }\n\n  .ddc-error{\n    border-color:rgba(255,42,42,0.35);\n    background:rgba(229,9,20,0.12);\n  }\n\n\n  \/* ========================================= *\/\n  \/* EVENT STATUS VISUALS - CLEAN BADGES *\/\n  \/* ========================================= *\/\n\n  \/* Afsluttet: kortet bliver diskret, men status vises kun \u00e9n gang i den normale badge *\/\n  .ddc-feature--finished{\n    opacity:.62;\n    filter:saturate(.65) brightness(.82);\n  }\n\n  .ddc-feature--finished .ddc-tag{\n    background:rgba(255,255,255,0.08);\n    border-color:rgba(255,255,255,0.16);\n    color:#fff;\n  }\n\n  .ddc-feature--finished .ddc-tag .ddc-pulse{\n    background:rgba(255,255,255,0.45);\n    box-shadow:0 0 0 4px rgba(255,255,255,0.08);\n  }\n\n  \/* Aflyst: mere tydelig d\u00e6mpning + streg, men ingen ekstra tekst ovenp\u00e5 badge *\/\n  .ddc-feature--cancelled{\n    opacity:.48;\n    filter:grayscale(1) brightness(.72);\n  }\n\n  .ddc-feature--cancelled::before{\n    content:\"\";\n    position:absolute;\n    left:-10%;\n    top:50%;\n    width:120%;\n    height:3px;\n    background:linear-gradient(90deg, transparent, rgba(255,42,42,.85), transparent);\n    transform:rotate(-5deg);\n    z-index:5;\n    pointer-events:none;\n  }\n\n  .ddc-feature--cancelled .ddc-tag{\n    background:rgba(229,9,20,0.22);\n    border-color:rgba(255,42,42,0.42);\n  }\n\n  .ddc-feature--cancelled .ddc-tag .ddc-pulse{\n    background:var(--ddc-red2);\n    box-shadow:0 0 0 4px rgba(255,42,42,0.14);\n  }\n\n  \/* Udsat: d\u00e6mpet orange badge *\/\n  .ddc-feature--postponed{\n    opacity:.75;\n    filter:saturate(.78) brightness(.9);\n  }\n\n  .ddc-feature--postponed .ddc-tag{\n    background:rgba(255,140,0,0.16);\n    border-color:rgba(255,140,0,0.36);\n  }\n\n  .ddc-feature--postponed .ddc-tag .ddc-pulse{\n    background:#ff9d2e;\n    box-shadow:0 0 0 4px rgba(255,140,0,0.14);\n  }\n\n  \/* Live: mere synligt kort og aktiv badge *\/\n  .ddc-feature--live{\n    border-color:rgba(255,42,42,.45);\n    box-shadow:\n      0 18px 60px rgba(0,0,0,0.55),\n      0 0 34px rgba(229,9,20,0.20);\n  }\n\n  .ddc-feature--live .ddc-tag{\n    background:rgba(229,9,20,0.26);\n    border-color:rgba(255,42,42,0.45);\n    box-shadow:0 0 22px rgba(229,9,20,.22);\n  }\n\n  .ddc-track{\n    position:relative;\n    width:100vw;\n    left:50%;\n    right:50%;\n    margin-left:-50vw;\n    margin-right:-50vw;\n    overflow:hidden;\n    color:var(--ddc-text);\n    font-family:Inter, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;\n    background:linear-gradient(180deg, var(--ddc-bg), var(--ddc-bg2));\n    padding:clamp(56px, 6vw, 92px) 18px;\n  }\n\n  .ddc-track[hidden]{\n    display:none !important;\n  }\n\n  .ddc-track__bg{\n    position:absolute;\n    inset:0;\n    background-image:var(--ddc-track-bgimg);\n    background-size:cover;\n    background-position:center;\n    background-repeat:no-repeat;\n    background-attachment:fixed;\n    transform:scale(1.04);\n    filter:saturate(1.05) contrast(1.05);\n    opacity:.95;\n  }\n\n  .ddc-track__overlay{\n    position:absolute;\n    inset:0;\n    background:\n      radial-gradient(1100px 520px at 20% 15%, rgba(229,9,20,.16), transparent 60%),\n      radial-gradient(1000px 420px at 85% 10%, rgba(255,42,42,.12), transparent 60%),\n      linear-gradient(180deg, rgba(7,10,16,.74), rgba(5,7,12,.90));\n    backdrop-filter:blur(2px);\n  }\n\n  .ddc-track__wrap{\n    position:relative;\n    max-width:1200px;\n    margin:0 auto;\n    z-index:2;\n  }\n\n  .ddc-track__top{\n    max-width:760px;\n    margin:0 0 22px;\n  }\n\n  .ddc-track__label{\n    display:inline-block;\n    font-family:Teko, Inter, system-ui, sans-serif;\n    font-weight:700;\n    letter-spacing:.10em;\n    text-transform:uppercase;\n    font-size:15px;\n    padding:8px 12px;\n    border-radius:999px;\n    background:rgba(229,9,20,.12);\n    border:1px solid rgba(229,9,20,.30);\n  }\n\n  .ddc-track__title{\n    margin:10px 0 6px;\n    font-family:Teko, Inter, system-ui, sans-serif;\n    font-weight:700;\n    text-transform:uppercase;\n    letter-spacing:.02em;\n    font-size:clamp(34px, 4.2vw, 54px);\n    line-height:1;\n  }\n\n  .ddc-track__lead{\n    margin:0;\n    color:var(--ddc-dim);\n    font-size:16px;\n    line-height:1.55;\n  }\n\n  .ddc-track__grid{\n    display:grid;\n    grid-template-columns:1.1fr .9fr;\n    gap:18px;\n    margin-top:18px;\n  }\n\n  .ddc-track__card{\n    background:var(--ddc-card);\n    border:1px solid var(--ddc-stroke);\n    border-radius:18px;\n    box-shadow:var(--ddc-shadow);\n    overflow:hidden;\n  }\n\n  .ddc-track__cardTop{\n    display:flex;\n    align-items:center;\n    justify-content:space-between;\n    gap:12px;\n    padding:16px 16px 12px;\n    border-bottom:1px solid rgba(255,255,255,0.10);\n    background:linear-gradient(180deg, rgba(255,255,255,0.06), rgba(255,255,255,0.03));\n  }\n\n  .ddc-track__cardTitle{\n    font-family:Teko, Inter, system-ui, sans-serif;\n    text-transform:uppercase;\n    letter-spacing:.06em;\n    font-weight:700;\n    font-size:20px;\n  }\n\n  .ddc-track__btn{\n    display:inline-flex;\n    align-items:center;\n    gap:10px;\n    padding:10px 14px;\n    border-radius:999px;\n    border:1px solid rgba(229,9,20,.45);\n    background:linear-gradient(180deg, rgba(229,9,20,.18), rgba(229,9,20,.10));\n    color:#fff !important;\n    -webkit-text-fill-color:#fff;\n    text-decoration:none;\n    font-weight:700;\n    font-size:14px;\n    transition:transform .18s ease, background .18s ease, border-color .18s ease;\n    white-space:nowrap;\n  }\n\n  .ddc-track__btn:hover{\n    color:#fff !important;\n    -webkit-text-fill-color:#fff;\n    transform:translateY(-1px);\n    border-color:rgba(255,42,42,.70);\n    background:linear-gradient(180deg, rgba(255,42,42,.26), rgba(229,9,20,.12));\n  }\n\n  .ddc-track__map{\n    position:relative;\n    width:100%;\n    aspect-ratio:16 \/ 10;\n    background:rgba(0,0,0,.25);\n  }\n\n  .ddc-track__map iframe{\n    position:absolute;\n    inset:0;\n    width:100%;\n    height:100%;\n    border:0;\n  }\n\n  .ddc-track__mini{\n    display:grid;\n    grid-template-columns:1fr 1fr;\n    gap:10px;\n    padding:14px 16px 16px;\n  }\n\n  .ddc-miniItem{\n    border:1px solid rgba(255,255,255,0.10);\n    background:rgba(0,0,0,0.18);\n    border-radius:14px;\n    padding:12px 12px;\n  }\n\n  .ddc-miniKey{\n    display:block;\n    color:var(--ddc-dim);\n    font-size:12px;\n    letter-spacing:.08em;\n    text-transform:uppercase;\n    margin-bottom:6px;\n  }\n\n  .ddc-miniVal{\n    display:block;\n    font-weight:600;\n    font-size:14px;\n    line-height:1.35;\n  }\n\n  .ddc-dhbMapCard{\n    margin-top:18px;\n  }\n\n  .ddc-dhbMapCard[hidden]{\n    display:none !important;\n  }\n\n  .ddc-dhbMapPreview{\n    position:relative;\n    background:#05070C;\n    overflow:hidden;\n  }\n\n  .ddc-dhbMapPreview img{\n    display:block;\n    width:100%;\n    height:auto;\n    max-height:540px;\n    object-fit:contain;\n    background:#05070C;\n  }\n\n  .ddc-dhbMapPreview__actions{\n    padding:14px 16px 16px;\n    display:flex;\n    gap:10px;\n    flex-wrap:wrap;\n    border-top:1px solid rgba(255,255,255,0.10);\n  }\n\n  .ddc-track__infoGrid{\n    padding:16px;\n    display:grid;\n    gap:12px;\n  }\n\n  .ddc-infoBox{\n    display:flex;\n    gap:12px;\n    align-items:flex-start;\n    padding:14px 14px;\n    border-radius:16px;\n    border:1px solid rgba(255,255,255,0.10);\n    background:rgba(0,0,0,0.18);\n  }\n\n  .ddc-infoIcon{\n    flex:0 0 auto;\n    width:36px;\n    height:36px;\n    border-radius:12px;\n    display:grid;\n    place-items:center;\n    background:rgba(229,9,20,.14);\n    border:1px solid rgba(229,9,20,.28);\n    color:#fff;\n    margin-top:1px;\n  }\n\n  .ddc-infoTitle{\n    font-family:Teko, Inter, system-ui, sans-serif;\n    text-transform:uppercase;\n    letter-spacing:.06em;\n    font-weight:700;\n    font-size:18px;\n    margin:0 0 4px;\n  }\n\n  .ddc-infoText{\n    color:rgba(255,255,255,.86);\n    font-size:14px;\n    line-height:1.5;\n  }\n\n  .ddc-infoList{\n    margin:8px 0 0;\n    padding-left:18px;\n    color:rgba(255,255,255,.86);\n    font-size:14px;\n    line-height:1.55;\n  }\n\n  .ddc-infoList li{\n    margin:4px 0;\n  }\n\n  .ddc-infoBox--note{\n    background:linear-gradient(180deg, rgba(229,9,20,.14), rgba(0,0,0,.16));\n    border-color:rgba(229,9,20,.22);\n  }\n\n  .ddc-program-modal{\n    position:fixed;\n    inset:0;\n    z-index:99999;\n    display:flex;\n    align-items:center;\n    justify-content:center;\n    padding:20px;\n    background:rgba(0,0,0,0.78);\n    backdrop-filter:blur(8px);\n    opacity:0;\n    visibility:hidden;\n    pointer-events:none;\n    transition:opacity .25s ease, visibility .25s ease;\n  }\n\n  .ddc-program-modal.is-open{\n    opacity:1;\n    visibility:visible;\n    pointer-events:auto;\n  }\n\n  .ddc-program-modal__dialog{\n    position:relative;\n    width:min(1100px, 100%);\n    max-height:90vh;\n    background:#0A0D14;\n    border:1px solid rgba(255,255,255,0.10);\n    border-radius:22px;\n    overflow:hidden;\n    box-shadow:0 24px 80px rgba(0,0,0,0.45);\n  }\n\n  .ddc-program-modal__top{\n    display:flex;\n    align-items:center;\n    justify-content:space-between;\n    gap:12px;\n    padding:14px 16px;\n    border-bottom:1px solid rgba(255,255,255,0.08);\n    background:rgba(255,255,255,0.03);\n  }\n\n  .ddc-program-modal__title{\n    font-family:Teko, sans-serif;\n    font-size:30px;\n    line-height:1;\n    letter-spacing:.05em;\n    text-transform:uppercase;\n    color:#fff;\n  }\n\n  .ddc-program-close{\n    width:42px;\n    height:42px;\n    border-radius:12px;\n    border:1px solid rgba(255,255,255,0.12);\n    background:rgba(255,255,255,0.06);\n    color:#fff;\n    cursor:pointer;\n    font-size:22px;\n    line-height:1;\n    display:grid;\n    place-items:center;\n  }\n\n  .ddc-program-close:hover{\n    background:rgba(255,255,255,0.10);\n  }\n\n  .ddc-program-slider{\n    position:relative;\n    padding:16px 16px 12px;\n  }\n\n  .ddc-program-slider__viewport{\n    overflow:hidden;\n    border-radius:18px;\n    background:#05070C;\n  }\n\n  .ddc-program-slider__track{\n    display:flex;\n    transition:transform .35s ease;\n  }\n\n  .ddc-program-slide{\n    min-width:100%;\n    display:flex;\n    align-items:center;\n    justify-content:center;\n    background:#05070C;\n  }\n\n  .ddc-program-slide img{\n    display:block;\n    width:100%;\n    height:auto;\n    max-height:72vh;\n    object-fit:contain;\n  }\n\n  .ddc-program-arrow{\n    position:absolute;\n    top:50%;\n    transform:translateY(-50%);\n    z-index:5;\n    width:50px;\n    height:50px;\n    border-radius:999px;\n    border:1px solid rgba(255,255,255,0.14);\n    background:rgba(7,10,16,0.75);\n    color:#fff;\n    cursor:pointer;\n    display:grid;\n    place-items:center;\n  }\n\n  .ddc-program-arrow:hover{\n    background:rgba(255,255,255,0.10);\n  }\n\n  .ddc-program-arrow--prev{\n    left:28px;\n  }\n\n  .ddc-program-arrow--next{\n    right:28px;\n  }\n\n  .ddc-program-dots{\n    display:flex;\n    justify-content:center;\n    align-items:center;\n    gap:10px;\n    padding:14px 0 4px;\n  }\n\n  .ddc-program-dot{\n    width:10px;\n    height:10px;\n    border:0;\n    border-radius:999px;\n    background:rgba(255,255,255,0.28);\n    cursor:pointer;\n  }\n\n  .ddc-program-dot.is-active{\n    background:var(--ddc-red2);\n    box-shadow:0 0 0 4px rgba(255,42,42,0.14);\n  }\n\n  .ddc-map-popup{\n    padding:16px;\n    background:#05070C;\n  }\n\n  .ddc-map-popup img{\n    display:block;\n    width:100%;\n    height:auto;\n    max-height:76vh;\n    object-fit:contain;\n    border-radius:18px;\n    background:#05070C;\n  }\n\n  @media (max-width: 980px){\n    .ddc-cal{\n      padding:60px 16px;\n    }\n\n    .ddc-cal__head{\n      flex-direction:column;\n      align-items:flex-start;\n    }\n\n    .ddc-cal__title{\n      font-size:46px;\n    }\n\n    .ddc-track__grid{\n      grid-template-columns:1fr;\n    }\n\n    .ddc-track__mini{\n      grid-template-columns:1fr;\n    }\n\n    .ddc-track__bg{\n      background-attachment:scroll;\n    }\n  }\n\n  @media (max-width: 640px){\n    .ddc-cal__title{\n      font-size:40px;\n    }\n\n    .ddc-feature h3{\n      font-size:34px;\n    }\n\n    .ddc-feature__top,\n    .ddc-feature__row{\n      flex-direction:column;\n      align-items:flex-start;\n    }\n\n    .ddc-ctaRow{\n      width:100%;\n      display:grid;\n      grid-template-columns:1fr;\n    }\n\n    .ddc-ctaRow .ddc-btn{\n      width:100%;\n    }\n\n    .ddc-program-arrow{\n      width:42px;\n      height:42px;\n    }\n\n    .ddc-program-arrow--prev{\n      left:20px;\n    }\n\n    .ddc-program-arrow--next{\n      right:20px;\n    }\n\n    .ddc-map-popup{\n      padding:12px;\n    }\n\n    .ddc-map-popup img{\n      max-height:72vh;\n      border-radius:14px;\n    }\n  }\n\n  \/* =========================================================\n     FIX: Fjern s\u00e6son-badge\n  ========================================================= *\/\n  .ddc-cal__badge{\n    display:none !important;\n  }\n\n<\/style>\n\n<section class=\"ddc-cal ddc-bleed\" aria-label=\"Kalender \u2013 Danish Drift Championship\">\n  <div class=\"ddc-wrap\">\n\n    <header class=\"ddc-cal__head\">\n      <div>\n        <div class=\"ddc-cal__badge\" id=\"ddcSeasonBadge\">\n          <span class=\"ddc-cal__dot\" aria-hidden=\"true\"><\/span> S\u00e6son\n        <\/div>\n        <h2 class=\"ddc-cal__title\" id=\"ddcCalendarTitle\">Kalender<\/h2>\n        <p class=\"ddc-cal__lead\" id=\"ddcCalendarLead\">\n          Her finder du \u00e5rets events. N\u00e5r du trykker p\u00e5 et event, \u00e5bner vi automatisk track map og praktisk info l\u00e6ngere nede p\u00e5 siden.\n        <\/p>\n      <\/div>\n    <\/header>\n\n    <div class=\"ddc-events\" id=\"ddcEventsMount\">\n      <div class=\"ddc-loader\">Henter kalender fra Google Sheets...<\/div>\n    <\/div>\n\n  <\/div>\n<\/section>\n\n<section class=\"ddc-track\" id=\"ddcTrackSection\" aria-label=\"Track map og praktisk info\" hidden>\n  <div class=\"ddc-track__bg\" id=\"ddcTrackBg\" aria-hidden=\"true\"><\/div>\n  <div class=\"ddc-track__overlay\" aria-hidden=\"true\"><\/div>\n\n  <div class=\"ddc-track__wrap\">\n    <header class=\"ddc-track__top\">\n      <div class=\"ddc-track__label\" id=\"ddcTrackLabel\">TRACK MAP<\/div>\n      <h2 class=\"ddc-track__title\" id=\"ddcTrackTitle\">Find vej & praktisk info<\/h2>\n      <p class=\"ddc-track__lead\" id=\"ddcTrackLead\"><\/p>\n    <\/header>\n\n    <div class=\"ddc-track__grid\">\n\n      <article class=\"ddc-track__card\">\n        <div class=\"ddc-track__cardTop\">\n          <div class=\"ddc-track__cardTitle\" id=\"ddcMapCardTitle\">Map<\/div>\n          <a class=\"ddc-track__btn\" id=\"ddc-findvej\" href=\"#\" target=\"_blank\" rel=\"noopener\">\n            Find vej\n            <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" aria-hidden=\"true\">\n              <path fill=\"currentColor\" d=\"M14 3h7v7h-2V6.41l-9.29 9.3-1.42-1.42 9.3-9.29H14V3ZM5 5h6v2H7v10h10v-4h2v6H5V5Z\"><\/path>\n            <\/svg>\n          <\/a>\n        <\/div>\n\n        <div class=\"ddc-track__map\">\n          <iframe\n            id=\"ddc-map-iframe\"\n            title=\"Kort og rute\"\n            loading=\"lazy\"\n            referrerpolicy=\"no-referrer-when-downgrade\"\n            allowfullscreen\n            src=\"\">\n          <\/iframe>\n        <\/div>\n\n        <div class=\"ddc-track__mini\">\n          <div class=\"ddc-miniItem\">\n            <span class=\"ddc-miniKey\" id=\"ddcMiniDateLabel\">Dato<\/span>\n            <span class=\"ddc-miniVal\" id=\"ddcMiniDate\">-<\/span>\n          <\/div>\n          <div class=\"ddc-miniItem\">\n            <span class=\"ddc-miniKey\" id=\"ddcMiniMapLabel\">Map<\/span>\n            <span class=\"ddc-miniVal\" id=\"ddcMiniMap\">-<\/span>\n          <\/div>\n          <div class=\"ddc-miniItem\">\n            <span class=\"ddc-miniKey\" id=\"ddcMiniAddressLabel\">Adresse<\/span>\n            <span class=\"ddc-miniVal\" id=\"ddc-address\">-<\/span>\n          <\/div>\n          <div class=\"ddc-miniItem\">\n            <span class=\"ddc-miniKey\" id=\"ddcMiniParkingLabel\">Parkering<\/span>\n            <span class=\"ddc-miniVal\" id=\"ddcMiniParking\">-<\/span>\n          <\/div>\n        <\/div>\n      <\/article>\n\n      <aside class=\"ddc-track__card\">\n        <div class=\"ddc-track__infoGrid\">\n\n          <div class=\"ddc-infoBox\">\n            <div class=\"ddc-infoIcon\" aria-hidden=\"true\">\n              <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M12 2a7 7 0 0 1 7 7c0 5-7 13-7 13S5 14 5 9a7 7 0 0 1 7-7Zm0 9.5A2.5 2.5 0 1 0 12 6.5a2.5 2.5 0 0 0 0 5Z\"><\/path><\/svg>\n            <\/div>\n            <div>\n              <div class=\"ddc-infoTitle\" id=\"ddcInfoLocationTitle\">Lokation<\/div>\n              <div class=\"ddc-infoText\" id=\"ddc-location\">-<\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"ddc-infoBox\">\n            <div class=\"ddc-infoIcon\" aria-hidden=\"true\">\n              <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M7 2h2v2h6V2h2v2h3v18H4V4h3V2Zm13 6H6v12h14V8ZM6 6h14V6H6Z\"><\/path><\/svg>\n            <\/div>\n            <div>\n              <div class=\"ddc-infoTitle\" id=\"ddcInfoDateTitle\">Eventdato<\/div>\n              <div class=\"ddc-infoText\" id=\"ddcInfoDate\">-<\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"ddc-infoBox\">\n            <div class=\"ddc-infoIcon\" aria-hidden=\"true\">\n              <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M7 2h2v2h6V2h2v2h3v18H4V4h3V2Zm13 6H6v12h14V8ZM6 6h14V6H6Z\"><\/path><\/svg>\n            <\/div>\n            <div>\n              <div class=\"ddc-infoTitle\" id=\"ddcInfoTimesTitle\">Tider<\/div>\n              <div class=\"ddc-infoText\" id=\"ddcInfoTimes\">-<\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"ddc-infoBox\">\n            <div class=\"ddc-infoIcon\" aria-hidden=\"true\">\n              <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M4 6h16v10H4V6Zm2 2v6h12V8H6Zm-2 10h16v2H4v-2Z\"><\/path><\/svg>\n            <\/div>\n            <div>\n              <div class=\"ddc-infoTitle\" id=\"ddcInfoParkingTitle\">Parkering<\/div>\n              <div class=\"ddc-infoText\" id=\"ddcInfoParking\">-<\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"ddc-infoBox\">\n            <div class=\"ddc-infoIcon\" aria-hidden=\"true\">\n              <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M3 4h18v2H3V4Zm2 4h14l-1 14H6L5 8Zm4 3v8h2v-8H9Zm4 0v8h2v-8h-2Z\"><\/path><\/svg>\n            <\/div>\n            <div>\n              <div class=\"ddc-infoTitle\" id=\"ddcInfoBringTitle\">Hvad m\u00e5 du tage med<\/div>\n              <ul class=\"ddc-infoList\" id=\"ddcBringList\"><\/ul>\n            <\/div>\n          <\/div>\n\n          <div class=\"ddc-infoBox ddc-infoBox--note\">\n            <div>\n              <div class=\"ddc-infoTitle\" id=\"ddcInfoImportantTitle\">Vigtigt<\/div>\n              <div class=\"ddc-infoText\" id=\"ddcImportantText\">-<\/div>\n            <\/div>\n          <\/div>\n\n        <\/div>\n      <\/aside>\n    <\/div>\n\n    <article class=\"ddc-track__card ddc-dhbMapCard\" id=\"ddcDhbMapCard\">\n      <div class=\"ddc-track__cardTop\">\n        <div class=\"ddc-track__cardTitle\" id=\"ddcDhbMapInlineTitle\">Kort: DHB omr\u00e5de<\/div>\n        <button class=\"ddc-track__btn ddc-open-dhb-map\" type=\"button\" id=\"ddcDhbMapInlineBtn\">\n          \u00c5bn kort\n        <\/button>\n      <\/div>\n\n      <div class=\"ddc-dhbMapPreview\">\n        <img decoding=\"async\" id=\"ddcDhbMapPreviewImg\" src=\"\" alt=\"DHB kort\">\n      <\/div>\n\n      <div class=\"ddc-dhbMapPreview__actions\">\n        <button class=\"ddc-btn ddc-open-dhb-map\" type=\"button\" id=\"ddcDhbMapInlineBtn2\">Se stort kort<\/button>\n      <\/div>\n    <\/article>\n\n  <\/div>\n<\/section>\n\n<!-- PROGRAM POPUP -->\n<div class=\"ddc-program-modal\" id=\"ddcProgramModal\" aria-hidden=\"true\">\n  <div class=\"ddc-program-modal__dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"ddcProgramTitle\">\n    <div class=\"ddc-program-modal__top\">\n      <div class=\"ddc-program-modal__title\" id=\"ddcProgramTitle\">Program<\/div>\n      <button class=\"ddc-program-close\" id=\"ddcProgramClose\" type=\"button\" aria-label=\"Luk\">\u00d7<\/button>\n    <\/div>\n\n    <div class=\"ddc-program-slider\">\n      <button class=\"ddc-program-arrow ddc-program-arrow--prev\" id=\"ddcProgramPrev\" type=\"button\" aria-label=\"Forrige\">\n        <svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" aria-hidden=\"true\">\n          <path fill=\"currentColor\" d=\"M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z\"><\/path>\n        <\/svg>\n      <\/button>\n\n      <div class=\"ddc-program-slider__viewport\">\n        <div class=\"ddc-program-slider__track\" id=\"ddcProgramTrack\"><\/div>\n      <\/div>\n\n      <button class=\"ddc-program-arrow ddc-program-arrow--next\" id=\"ddcProgramNext\" type=\"button\" aria-label=\"N\u00e6ste\">\n        <svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" aria-hidden=\"true\">\n          <path fill=\"currentColor\" d=\"m8.59 16.59 1.41 1.41 6-6-6-6-1.41 1.41L13.17 12z\"><\/path>\n        <\/svg>\n      <\/button>\n\n      <div class=\"ddc-program-dots\" id=\"ddcProgramDots\"><\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- DHB MAP POPUP -->\n<div class=\"ddc-program-modal\" id=\"ddcDhbMapModal\" aria-hidden=\"true\">\n  <div class=\"ddc-program-modal__dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"ddcDhbMapTitle\">\n    <div class=\"ddc-program-modal__top\">\n      <div class=\"ddc-program-modal__title\" id=\"ddcDhbMapTitle\">Kort DHB<\/div>\n      <button class=\"ddc-program-close\" id=\"ddcDhbMapClose\" type=\"button\" aria-label=\"Luk\">\u00d7<\/button>\n    <\/div>\n\n    <div class=\"ddc-map-popup\">\n      <img decoding=\"async\" id=\"ddcDhbMapPopupImg\" src=\"\" alt=\"DHB kort\">\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n(() => {\n  const DDC_SHEET_CSV_URL = \"https:\/\/docs.google.com\/spreadsheets\/d\/e\/2PACX-1vT1jLzMxItw4MyaLMNdLoiCcuELPRJ0ea5PjuDc1-UeC1EIgsoBPjo_aq-yWmdu2wzmcIrzGcMiB3IM\/pub?gid=0&single=true&output=csv\";\n\n  const DDC_TICKET_SALES_URL = \"https:\/\/danishdrift.dk\/Billetsalg\";\n\n  const root = document.querySelector('.ddc-cal');\n  const eventsMount = document.getElementById('ddcEventsMount');\n  const trackSection = document.getElementById('ddcTrackSection');\n  const mapIframe = document.getElementById('ddc-map-iframe');\n  const findVej = document.getElementById('ddc-findvej');\n\n  const seasonBadge = document.getElementById('ddcSeasonBadge');\n  const calendarTitle = document.getElementById('ddcCalendarTitle');\n  const calendarLead = document.getElementById('ddcCalendarLead');\n\n  const trackBg = document.getElementById('ddcTrackBg');\n  const trackLabel = document.getElementById('ddcTrackLabel');\n  const trackTitle = document.getElementById('ddcTrackTitle');\n  const trackLead = document.getElementById('ddcTrackLead');\n  const mapCardTitle = document.getElementById('ddcMapCardTitle');\n\n  const miniDate = document.getElementById('ddcMiniDate');\n  const miniMap = document.getElementById('ddcMiniMap');\n  const miniAddress = document.getElementById('ddc-address');\n  const miniParking = document.getElementById('ddcMiniParking');\n\n  const locationEl = document.getElementById('ddc-location');\n  const infoDate = document.getElementById('ddcInfoDate');\n  const infoTimes = document.getElementById('ddcInfoTimes');\n  const infoParking = document.getElementById('ddcInfoParking');\n  const bringList = document.getElementById('ddcBringList');\n  const importantText = document.getElementById('ddcImportantText');\n\n  const dhbMapCard = document.getElementById('ddcDhbMapCard');\n  const dhbMapPreviewImg = document.getElementById('ddcDhbMapPreviewImg');\n  const dhbMapPopupImg = document.getElementById('ddcDhbMapPopupImg');\n  const dhbMapInlineTitle = document.getElementById('ddcDhbMapInlineTitle');\n  const dhbMapInlineBtn = document.getElementById('ddcDhbMapInlineBtn');\n  const dhbMapInlineBtn2 = document.getElementById('ddcDhbMapInlineBtn2');\n\n  const modal = document.getElementById('ddcProgramModal');\n  const closeProgramBtn = document.getElementById('ddcProgramClose');\n  const prevBtn = document.getElementById('ddcProgramPrev');\n  const nextBtn = document.getElementById('ddcProgramNext');\n  const programTrack = document.getElementById('ddcProgramTrack');\n  const programDots = document.getElementById('ddcProgramDots');\n\n  const mapModal = document.getElementById('ddcDhbMapModal');\n  const closeMapBtn = document.getElementById('ddcDhbMapClose');\n\n  let allEvents = [];\n  let activeEvent = null;\n  let currentSlide = 0;\n  let totalSlides = 0;\n\n  if(!root || !eventsMount || !trackSection) return;\n\n  function detectLang(){\n    const params = new URLSearchParams(window.location.search);\n    const q = (params.get('lang') || '').toLowerCase();\n    const htmlLang = (document.documentElement.getAttribute('lang') || '').toLowerCase();\n    const bodyClass = (document.body.className || '').toLowerCase();\n    const path = (window.location.pathname || '').toLowerCase();\n\n    if (\n      q.startsWith('en') ||\n      htmlLang.startsWith('en') ||\n      bodyClass.includes('lang-en') ||\n      bodyClass.includes('english') ||\n      path.startsWith('\/en\/') ||\n      path === '\/en'\n    ) {\n      return 'en';\n    }\n\n    return 'da';\n  }\n\n  function t(da, en){\n    return detectLang() === 'en' ? en : da;\n  }\n\n  function clean(value){\n    return (value || '').toString().trim();\n  }\n\n  function get(row, keys, fallback = ''){\n    for (const key of keys) {\n      if (row[key] !== undefined && clean(row[key]) !== '') return clean(row[key]);\n    }\n    return fallback;\n  }\n\n  function escapeHtml(str){\n    return clean(str)\n      .replaceAll('&', '&amp;')\n      .replaceAll('<', '&lt;')\n      .replaceAll('>', '&gt;')\n      .replaceAll('\"', '&quot;')\n      .replaceAll(\"'\", '&#039;');\n  }\n\n  function parseNumber(value, fallback){\n    const normalized = clean(value).replace(',', '.');\n    const parsed = parseFloat(normalized);\n    return Number.isFinite(parsed) ? parsed : fallback;\n  }\n\n  function ddcParseCSV(text) {\n    const rows = [];\n    let current = [];\n    let value = \"\";\n    let insideQuotes = false;\n\n    for (let i = 0; i < text.length; i++) {\n      const char = text[i];\n      const next = text[i + 1];\n\n      if (char === '\"' && insideQuotes && next === '\"') {\n        value += '\"';\n        i++;\n      } else if (char === '\"') {\n        insideQuotes = !insideQuotes;\n      } else if (char === \",\" && !insideQuotes) {\n        current.push(value.trim());\n        value = \"\";\n      } else if ((char === \"\\n\" || char === \"\\r\") && !insideQuotes) {\n        if (value || current.length) {\n          current.push(value.trim());\n          rows.push(current);\n          current = [];\n          value = \"\";\n        }\n        if (char === \"\\r\" && next === \"\\n\") i++;\n      } else {\n        value += char;\n      }\n    }\n\n    if (value || current.length) {\n      current.push(value.trim());\n      rows.push(current);\n    }\n\n    if (!rows.length) return [];\n\n    const headers = rows.shift().map(h => h.trim());\n    return rows\n      .filter(row => row.some(cell => clean(cell) !== ''))\n      .map(row => {\n        const obj = {};\n        headers.forEach((header, index) => {\n          obj[header] = row[index] || \"\";\n        });\n        return obj;\n      });\n  }\n\n  function formatDate(dateString){\n    const value = clean(dateString);\n    if (!value) return '';\n\n    const parts = value.split('-');\n    if (parts.length === 3) {\n      const date = new Date(Number(parts[0]), Number(parts[1]) - 1, Number(parts[2]));\n      if (!isNaN(date)) {\n        return date.toLocaleDateString(detectLang() === 'en' ? 'en-GB' : 'da-DK', {\n          day: 'numeric',\n          month: 'long',\n          year: 'numeric'\n        });\n      }\n    }\n\n    const date = new Date(value);\n    if (isNaN(date)) return value;\n\n    return date.toLocaleDateString(detectLang() === 'en' ? 'en-GB' : 'da-DK', {\n      day: 'numeric',\n      month: 'long',\n      year: 'numeric'\n    });\n  }\n\n  function formatShortDay(dateString){\n    const value = clean(dateString);\n    const parts = value.split('-');\n    let date = null;\n\n    if (parts.length === 3) {\n      date = new Date(Number(parts[0]), Number(parts[1]) - 1, Number(parts[2]));\n    } else {\n      date = new Date(value);\n    }\n\n    if (!date || isNaN(date)) return { day: '', mon: '' };\n\n    const day = String(date.getDate()).padStart(2, '0');\n    const mon = date.toLocaleDateString('da-DK', { month:'short' }).replace('.', '').toUpperCase();\n\n    return { day, mon };\n  }\n\n  function parseSheetTime(value){\n    const raw = clean(value);\n\n    if (!raw) {\n      return null;\n    }\n\n    \/\/ Google Sheets kan eksportere tid som decimaltal, fx 0.333333 = 08:00\n    if (\/^\\d+(\\.\\d+)?$\/.test(raw)) {\n      const num = Number(raw);\n\n      if (Number.isFinite(num) && num > 0 && num < 1) {\n        const totalMinutes = Math.round(num * 24 * 60);\n        return {\n          hour: Math.floor(totalMinutes \/ 60),\n          minute: totalMinutes % 60\n        };\n      }\n\n      \/\/ Hvis der bare st\u00e5r 8 eller 08\n      if (Number.isFinite(num) && num >= 0 && num <= 23) {\n        return {\n          hour: Math.floor(num),\n          minute: 0\n        };\n      }\n    }\n\n    \/\/ 08:00, 8:00, 08.00, 8.30, 08:00:00\n    let match = raw.match(\/^(\\d{1,2})[:.](\\d{1,2})(?::\\d{1,2})?$\/);\n    if (match) {\n      return {\n        hour: Math.min(23, Number(match[1])),\n        minute: Math.min(59, Number(match[2]))\n      };\n    }\n\n    \/\/ 0800 eller 0830\n    match = raw.match(\/^(\\d{1,2})(\\d{2})$\/);\n    if (match) {\n      return {\n        hour: Math.min(23, Number(match[1])),\n        minute: Math.min(59, Number(match[2]))\n      };\n    }\n\n    return null;\n  }\n\n  function formatSheetTime(value){\n    const parsed = parseSheetTime(value);\n    if (!parsed) return clean(value);\n\n    return `${String(parsed.hour).padStart(2, '0')}:${String(parsed.minute).padStart(2, '0')}`;\n  }\n\n  function getEventStartTimeText(event){\n    const raw = get(event, [\n      'Start_Time',\n      'start_time',\n      'start_time ',\n      'starttid',\n      'start_tid',\n      'start time',\n      'event_time',\n      'time'\n    ]);\n\n    return formatSheetTime(raw);\n  }\n\n  function getDriversBriefingText(event){\n    const raw = get(event, [\n      'Drivers_briefing',\n      'drivers_briefing',\n      'drivers briefing',\n      'driver_briefing',\n      'driver_briefing_time',\n      'briefing_time',\n      'briefing'\n    ]);\n\n    return formatSheetTime(raw);\n  }\n\n  function getEventSortTime(event){\n    const dateValue = get(event, ['event_start_date', 'start_date', 'date', 'event_day']);\n    const timeValue = getEventStartTimeText(event);\n    const parts = clean(dateValue).split('-');\n\n    let date = null;\n\n    if (parts.length === 3) {\n      date = new Date(Number(parts[0]), Number(parts[1]) - 1, Number(parts[2]));\n    } else {\n      date = new Date(dateValue);\n    }\n\n    if (!date || isNaN(date)) return Infinity;\n\n    const parsedTime = parseSheetTime(timeValue);\n\n    if (parsedTime) {\n      date.setHours(parsedTime.hour, parsedTime.minute, 0, 0);\n    }\n\n    return date.getTime();\n  }\n\n  function dateRange(event){\n    const start = get(event, ['event_start_date', 'start_date', 'date', 'event_day']);\n    const end = get(event, ['event_end_date', 'end_date']);\n\n    const startText = formatDate(start);\n    const endText = formatDate(end);\n\n    if (startText && endText && startText !== endText) return `${startText} - ${endText}`;\n    return startText || endText || '';\n  }\n\n  function statusLabel(status){\n    const s = clean(status).toLowerCase();\n\n    if (s === 'live') return t('Live nu', 'Live now');\n    if (s === 'afsluttet') return t('Afsluttet', 'Finished');\n    if (s === 'udsat') return t('Udsat', 'Postponed');\n    if (s === 'aflyst') return t('Aflyst', 'Cancelled');\n    if (s === 'skjult') return t('Skjult', 'Hidden');\n    if (s === 'kommende') return t('Kommende', 'Upcoming');\n\n    return clean(status) || t('Kommende', 'Upcoming');\n  }\n\n  function statusClass(status){\n    const s = clean(status).toLowerCase();\n    if (s === 'live') return 'ddc-tag--live';\n    if (s === 'afsluttet') return 'ddc-tag--done';\n    if (s === 'skjult') return 'ddc-tag--hidden';\n    return '';\n  }\n\n  function buildOsmEmbed(lat, lng){\n    const zoomBox = 0.008;\n    const left = (lng - zoomBox).toFixed(6);\n    const right = (lng + zoomBox).toFixed(6);\n    const top = (lat + zoomBox).toFixed(6);\n    const bottom = (lat - zoomBox).toFixed(6);\n\n    return `https:\/\/www.openstreetmap.org\/export\/embed.html?bbox=${left}%2C${bottom}%2C${right}%2C${top}&layer=mapnik&marker=${lat}%2C${lng}`;\n  }\n\n  function googleMapsLink(mapQuery){\n    return `https:\/\/www.google.com\/maps\/search\/?api=1&query=${encodeURIComponent(mapQuery)}`;\n  }\n\n  function getProgramImages(event){\n    return [\n      get(event, ['program_image_1', 'program_1', 'program_url_1']),\n      get(event, ['program_image_2', 'program_2', 'program_url_2']),\n      get(event, ['program_image_3', 'program_3', 'program_url_3']),\n      get(event, ['program_image_4', 'program_4', 'program_url_4']),\n      get(event, ['program_image_5', 'program_5', 'program_url_5'])\n    ].filter(Boolean);\n  }\n\n  function getDhbMapUrl(event){\n    return get(event, [\n      'dhb_map_url',\n      'map_image_url',\n      'area_map_url',\n      'map_button_Link',\n      'map_button_link',\n      'map_button_URL',\n      'map_button_url',\n      'map_button'\n    ]);\n  }\n\n  function getDhbMapButtonText(event){\n    return get(event, [\n      'map_button_Text',\n      'map_button_text',\n      'map_button_label',\n      'map_button_title',\n      'dhb_map_button_text'\n    ], t('Kort DHB', 'DHB Map'));\n  }\n\n  function setBackgroundsFromEvent(event){\n    const eventBg = get(event, ['event_background_url', 'calendar_background_url', 'background_url']);\n    const trackBgUrl = get(event, ['track_background_url', 'track_bg_url']);\n\n    if (eventBg) {\n      root.style.setProperty('--ddc-bgimg', `url('${eventBg}')`);\n    }\n\n    if (trackBgUrl) {\n      trackBg.style.backgroundImage = `url('${trackBgUrl}')`;\n    } else {\n      trackBg.style.backgroundImage = `var(--ddc-track-bgimg)`;\n    }\n  }\n\n  function renderEvents(events){\n    if (!events.length) {\n      eventsMount.innerHTML = `<div class=\"ddc-error\">${t('Ingen events fundet i Google Sheet.', 'No events found in Google Sheet.')}<\/div>`;\n      return;\n    }\n\n    const firstYear = get(events[0], ['event_year', 'year'], '');\n    seasonBadge.innerHTML = `<span class=\"ddc-cal__dot\" aria-hidden=\"true\"><\/span> ${firstYear ? t('S\u00e6son ', 'Season ') + firstYear : t('S\u00e6son', 'Season')}`;\n    calendarTitle.textContent = t('Kalender', 'Calendar');\n    calendarLead.textContent = t(\n      'Her finder du \u00e5rets events. N\u00e5r du trykker p\u00e5 et event, \u00e5bner vi automatisk track map og praktisk info l\u00e6ngere nede p\u00e5 siden.',\n      'Here you will find this year\u2019s events. When you click an event, we automatically open the track map and practical info further down the page.'\n    );\n\n    \/\/ Billetsalg vises kun p\u00e5 den n\u00e6rmeste aktive\/kommende event\n    const ticketEventIndex = events.findIndex(event => {\n      const status = get(event, ['event_status', 'status']).toLowerCase();\n      return status === 'live' || status === 'kommende' || status === 'udsat' || status === '';\n    });\n\n    eventsMount.innerHTML = events.map((event, index) => {\n      const eventId = get(event, ['event_id'], `event-${index}`);\n      const title = get(event, ['event_name', 'title'], 'DDC Event');\n      const where = get(event, ['where', 'place', 'location', 'city'], '');\n      const location = get(event, ['location', 'track_name', 'map_name'], where);\n      const status = get(event, ['event_status', 'status'], 'Kommende');\n      const text = get(event, ['event_text', 'description', 'lead'], '\u00c5rets event i kalenderen.');\n      const type = get(event, ['event_type', 'type'], 'L\u00f8b');\n      const dateText = dateRange(event);\n      const startTime = getEventStartTimeText(event);\n      const driversBriefing = getDriversBriefingText(event);\n      const short = formatShortDay(get(event, ['event_start_date', 'start_date', 'event_day', 'date']));\n      const dateBoxDay = short.day || '??';\n      const dateBoxMon = short.mon || 'DDC';\n      const programImages = getProgramImages(event);\n      const dhbMap = getDhbMapUrl(event);\n      const dhbMapButtonText = getDhbMapButtonText(event);\n      const cleanStatus = clean(status).toLowerCase();\n\n      const shouldShowTicketButton = index === ticketEventIndex && !['afsluttet', 'aflyst', 'skjult'].includes(cleanStatus);\n\n      let eventStateClass = \"\";\n      let openButtonText = t('Se event', 'View event');\n\n      if (cleanStatus === \"afsluttet\") {\n        eventStateClass = \"ddc-feature--finished\";\n        openButtonText = t('Se info', 'View info');\n      }\n\n      if (cleanStatus === \"aflyst\") {\n        eventStateClass = \"ddc-feature--cancelled\";\n        openButtonText = t('Se info', 'View info');\n      }\n\n      if (cleanStatus === \"udsat\") {\n        eventStateClass = \"ddc-feature--postponed\";\n        openButtonText = t('Se info', 'View info');\n      }\n\n      if (cleanStatus === \"live\") {\n        eventStateClass = \"ddc-feature--live\";\n        openButtonText = t('Live info', 'Live info');\n      }\n\n      return `\n        <article class=\"ddc-card ddc-feature ${eventStateClass}\" data-ddc-event-index=\"${index}\" data-event-id=\"${escapeHtml(eventId)}\">\n          <div class=\"ddc-feature__top\">\n            <div class=\"ddc-date\" aria-label=\"Dato\">\n              <div class=\"ddc-date__box\" aria-hidden=\"true\">\n                <span class=\"ddc-day\">${escapeHtml(dateBoxDay)}<\/span>\n                <span class=\"ddc-mon\">${escapeHtml(dateBoxMon)}<\/span>\n              <\/div>\n              <div class=\"ddc-date__meta\">\n                <strong>${escapeHtml(title)}<\/strong>\n                <em>${escapeHtml(where ? where + ' \u2022 DDC Event' : 'DDC Event')}<\/em>\n              <\/div>\n            <\/div>\n\n            <div class=\"ddc-tag ${statusClass(status)}\" aria-label=\"Status\">\n              <span class=\"ddc-pulse\" aria-hidden=\"true\"><\/span>\n              ${escapeHtml(statusLabel(status))}\n            <\/div>\n          <\/div>\n\n          <h3>${escapeHtml(title)}<\/h3>\n          <p>${escapeHtml(text)}<\/p>\n\n          <div class=\"ddc-feature__row\">\n            <div class=\"ddc-meta\" aria-label=\"Event detaljer\">\n              <div class=\"ddc-pill\"><small>${t('Dato:', 'Date:')}<\/small> <span>${escapeHtml(dateText)}<\/span><\/div>\n              ${startTime ? `<div class=\"ddc-pill\"><small>${t('Start:', 'Start:')}<\/small> <span>${escapeHtml(startTime)}<\/span><\/div>` : ''}\n              ${driversBriefing ? `<div class=\"ddc-pill\"><small>${t('Briefing:', 'Briefing:')}<\/small> <span>${escapeHtml(driversBriefing)}<\/span><\/div>` : ''}\n              <div class=\"ddc-pill\"><small>${t('Sted:', 'Location:')}<\/small> <span>${escapeHtml(where || location)}<\/span><\/div>\n              <div class=\"ddc-pill\"><small>${t('Type:', 'Type:')}<\/small> <span>${escapeHtml(type)}<\/span><\/div>\n            <\/div>\n\n            <div class=\"ddc-ctaRow\" aria-label=\"Knapper\">\n              <button class=\"ddc-btn ddc-btn--primary ddc-open-event\" type=\"button\" data-ddc-open=\"${index}\">${openButtonText}<\/button>\n              ${shouldShowTicketButton ? `<a class=\"ddc-btn ddc-btn--ticket\" href=\"${DDC_TICKET_SALES_URL}\">${t('Billetsalg', 'Tickets')}<\/a>` : ''}\n              ${programImages.length ? `<button class=\"ddc-btn ddc-open-program\" type=\"button\" data-ddc-program=\"${index}\">${t('Program', 'Program')}<\/button>` : ''}\n              ${dhbMap ? `<button class=\"ddc-btn ddc-open-dhb-map\" type=\"button\" data-ddc-map=\"${index}\">${escapeHtml(dhbMapButtonText)}<\/button>` : ''}\n            <\/div>\n          <\/div>\n        <\/article>\n      `;\n    }).join('');\n\n    eventsMount.querySelectorAll('[data-ddc-open]').forEach(btn => {\n      btn.addEventListener('click', () => openEvent(events[Number(btn.dataset.ddcOpen)]));\n    });\n\n    eventsMount.querySelectorAll('[data-ddc-program]').forEach(btn => {\n      btn.addEventListener('click', () => openProgram(events[Number(btn.dataset.ddcProgram)]));\n    });\n\n    eventsMount.querySelectorAll('[data-ddc-map]').forEach(btn => {\n      btn.addEventListener('click', () => openDhbMap(events[Number(btn.dataset.ddcMap)]));\n    });\n  }\n\n  function updateTrackFromEvent(event){\n    activeEvent = event;\n\n    const title = get(event, ['event_name', 'title'], 'DDC Event');\n    const dateText = dateRange(event);\n    const where = get(event, ['where', 'place', 'city'], '');\n    const location = get(event, ['location', 'track_name', 'map_name'], where || title);\n    const address = get(event, ['address', 'event_address'], '');\n    const mapQuery = get(event, ['map_query'], address || location || title);\n    const lat = parseNumber(get(event, ['lat', 'latitude']), 54.8689899);\n    const lng = parseNumber(get(event, ['lng', 'lon', 'longitude']), 9.2613491);\n    const parking = get(event, ['parking_text', 'parking'], 'F\u00f8lg skilte ved ankomst \u2013 park\u00e9r kun i markerede omr\u00e5der.');\n    const important = get(event, ['important_text', 'important'], 'Hold dig bag hegn og afsp\u00e6rringer. F\u00f8lg crew og officials\u2019 anvisninger.');\n    const dhbMap = getDhbMapUrl(event);\n    const dhbMapButtonText = getDhbMapButtonText(event);\n\n    const startTime = getEventStartTimeText(event);\n    const briefing = getDriversBriefingText(event);\n    const gates = formatSheetTime(get(event, ['gates_time', 'gates'])) || '';\n    const trackHot = formatSheetTime(get(event, ['track_hot_time', 'track_hot'])) || get(event, ['track_hot_time', 'track_hot'], '');\n\n    const bringItems = [\n      get(event, ['bring_1'], 'H\u00f8rev\u00e6rn \/ \u00f8repropper'),\n      get(event, ['bring_2'], 'Varmt t\u00f8j + regnjakke'),\n      get(event, ['bring_3'], 'Stol\/t\u00e6ppe til tribune\/pit-omr\u00e5de'),\n      get(event, ['bring_4'], 'Kamera (respekt\u00e9r afsp\u00e6rringer)')\n    ].filter(Boolean);\n\n    setBackgroundsFromEvent(event);\n\n    trackLabel.textContent = 'TRACK MAP';\n    trackTitle.textContent = t('Find vej & praktisk info', 'Directions & practical info');\n    trackLead.textContent = `${dateText} \u2022 Map: ${location}`;\n    mapCardTitle.textContent = `Map: ${location}`;\n\n    miniDate.textContent = dateText || '-';\n    miniMap.textContent = location || '-';\n    miniAddress.textContent = address || '-';\n    miniParking.textContent = parking;\n\n    locationEl.textContent = location || '-';\n    infoDate.textContent = dateText || '-';\n    const timeLines = [];\n\n    if (startTime) {\n      timeLines.push(`<strong>${t('Start:', 'Start:')}<\/strong> ${escapeHtml(startTime)}`);\n    }\n\n    if (briefing) {\n      timeLines.push(`<strong>Drivers briefing:<\/strong> ${escapeHtml(briefing)}`);\n    }\n\n    if (gates) {\n      timeLines.push(`<strong>Gates:<\/strong> ${escapeHtml(gates)}`);\n    }\n\n    if (trackHot) {\n      timeLines.push(`<strong>Track hot:<\/strong> ${escapeHtml(trackHot)}`);\n    }\n\n    infoTimes.innerHTML = timeLines.length ? timeLines.join('<br>') : '-';\n    infoParking.textContent = parking;\n    importantText.textContent = important;\n\n    bringList.innerHTML = bringItems.map(item => `<li>${escapeHtml(item)}<\/li>`).join('');\n\n    mapIframe.src = buildOsmEmbed(lat, lng);\n    findVej.href = googleMapsLink(mapQuery);\n    findVej.innerHTML = `${t('Find vej', 'Directions')}\n      <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" aria-hidden=\"true\">\n        <path fill=\"currentColor\" d=\"M14 3h7v7h-2V6.41l-9.29 9.3-1.42-1.42 9.3-9.29H14V3ZM5 5h6v2H7v10h10v-4h2v6H5V5Z\"><\/path>\n      <\/svg>`;\n\n    if (dhbMap) {\n      dhbMapCard.hidden = false;\n      if (dhbMapInlineTitle) dhbMapInlineTitle.textContent = dhbMapButtonText;\n      if (dhbMapInlineBtn) dhbMapInlineBtn.textContent = dhbMapButtonText;\n      if (dhbMapInlineBtn2) dhbMapInlineBtn2.textContent = t('Se stort kort', 'View large map');\n      dhbMapPreviewImg.src = dhbMap;\n      dhbMapPopupImg.src = dhbMap;\n    } else {\n      dhbMapCard.hidden = true;\n      dhbMapPreviewImg.src = '';\n      dhbMapPopupImg.src = '';\n    }\n  }\n\n  function openEvent(event){\n    const wasOpen = !trackSection.hidden;\n    const sameEvent = activeEvent && get(activeEvent, ['event_id']) === get(event, ['event_id']);\n\n    if (wasOpen && sameEvent) {\n      trackSection.hidden = true;\n      return;\n    }\n\n    updateTrackFromEvent(event);\n    trackSection.hidden = false;\n\n    requestAnimationFrame(() => {\n      trackSection.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    });\n  }\n\n  function buildProgramSlides(event){\n    const images = getProgramImages(event);\n    currentSlide = 0;\n    totalSlides = images.length;\n\n    programTrack.innerHTML = images.map((url, index) => `\n      <div class=\"ddc-program-slide\">\n        <img decoding=\"async\" src=\"${escapeHtml(url)}\" alt=\"Program billede ${index + 1}\">\n      <\/div>\n    `).join('');\n\n    programDots.innerHTML = images.map((_, index) => `\n      <button class=\"ddc-program-dot ${index === 0 ? 'is-active' : ''}\" type=\"button\" data-slide=\"${index}\" aria-label=\"Billede ${index + 1}\"><\/button>\n    `).join('');\n\n    programDots.querySelectorAll('.ddc-program-dot').forEach(dot => {\n      dot.addEventListener('click', () => {\n        currentSlide = parseInt(dot.dataset.slide, 10) || 0;\n        updateProgramSlider();\n      });\n    });\n\n    updateProgramSlider();\n  }\n\n  function updateProgramSlider(){\n    if (!programTrack || !totalSlides) return;\n    programTrack.style.transform = `translateX(-${currentSlide * 100}%)`;\n\n    programDots.querySelectorAll('.ddc-program-dot').forEach((dot, index) => {\n      dot.classList.toggle('is-active', index === currentSlide);\n    });\n  }\n\n  function openProgram(event){\n    if (!modal) return;\n\n    const title = get(event, ['program_title'], t('Program', 'Program'));\n    document.getElementById('ddcProgramTitle').textContent = title;\n\n    buildProgramSlides(event);\n\n    if (!totalSlides) return;\n\n    modal.classList.add('is-open');\n    modal.setAttribute('aria-hidden', 'false');\n    document.body.style.overflow = 'hidden';\n  }\n\n  function closeProgram(){\n    if (!modal) return;\n    modal.classList.remove('is-open');\n    modal.setAttribute('aria-hidden', 'true');\n    document.body.style.overflow = '';\n  }\n\n  function nextSlide(){\n    if (!totalSlides) return;\n    currentSlide = (currentSlide + 1) % totalSlides;\n    updateProgramSlider();\n  }\n\n  function prevSlide(){\n    if (!totalSlides) return;\n    currentSlide = (currentSlide - 1 + totalSlides) % totalSlides;\n    updateProgramSlider();\n  }\n\n  function openDhbMap(event){\n    if (event) updateTrackFromEvent(event);\n\n    if (!mapModal || !dhbMapPopupImg.src) return;\n    mapModal.classList.add('is-open');\n    mapModal.setAttribute('aria-hidden', 'false');\n    document.body.style.overflow = 'hidden';\n  }\n\n  function closeDhbMap(){\n    if (!mapModal) return;\n    mapModal.classList.remove('is-open');\n    mapModal.setAttribute('aria-hidden', 'true');\n    document.body.style.overflow = '';\n  }\n\n  async function loadEvents(){\n    eventsMount.innerHTML = `<div class=\"ddc-loader\">${t('Henter kalender fra Google Sheets...', 'Loading calendar from Google Sheets...')}<\/div>`;\n\n    try {\n      const response = await fetch(DDC_SHEET_CSV_URL + '&cacheBust=' + Date.now(), {\n        cache: 'no-store'\n      });\n\n      if (!response.ok) {\n        throw new Error('Kunne ikke hente Sheet');\n      }\n\n      const csvText = await response.text();\n      const rows = ddcParseCSV(csvText);\n\n      allEvents = rows.filter(row => {\n        const status = get(row, ['event_status', 'status']).toLowerCase();\n        const published = get(row, ['published']).toLowerCase();\n\n        if (status === 'skjult') return false;\n        if (published === 'false' || published === 'nej' || published === 'no' || published === '0') return false;\n\n        return get(row, ['event_id', 'event_name', 'title']) !== '';\n      });\n\n      allEvents.sort((a, b) => {\n        const statusA = get(a, ['event_status', 'status']).toLowerCase();\n        const statusB = get(b, ['event_status', 'status']).toLowerCase();\n\n        const statusOrder = {\n          'live': 1,\n          'kommende': 2,\n          'udsat': 3,\n          'afsluttet': 4,\n          'aflyst': 5,\n          'skjult': 6\n        };\n\n        const orderA = statusOrder[statusA] || 2;\n        const orderB = statusOrder[statusB] || 2;\n\n        if (orderA !== orderB) {\n          return orderA - orderB;\n        }\n\n        const timeA = getEventSortTime(a);\n        const timeB = getEventSortTime(b);\n\n        if (!Number.isFinite(timeA)) return 1;\n        if (!Number.isFinite(timeB)) return -1;\n\n        return timeA - timeB;\n      });\n\n      renderEvents(allEvents);\n\n      if (allEvents[0]) {\n        setBackgroundsFromEvent(allEvents[0]);\n      }\n\n    } catch (error) {\n      console.error('DDC Sheet error:', error);\n      eventsMount.innerHTML = `\n        <div class=\"ddc-error\">\n          Kunne ikke hente kalenderen fra Google Sheets. Tjek at Sheet er publiceret som CSV.\n        <\/div>\n      `;\n    }\n  }\n\n  closeProgramBtn?.addEventListener('click', closeProgram);\n  nextBtn?.addEventListener('click', nextSlide);\n  prevBtn?.addEventListener('click', prevSlide);\n\n  modal?.addEventListener('click', (e) => {\n    if (e.target === modal) closeProgram();\n  });\n\n  document.querySelectorAll('.ddc-open-dhb-map').forEach(btn => {\n    btn.addEventListener('click', () => openDhbMap(activeEvent));\n  });\n\n  closeMapBtn?.addEventListener('click', closeDhbMap);\n\n  mapModal?.addEventListener('click', (e) => {\n    if (e.target === mapModal) closeDhbMap();\n  });\n\n  document.addEventListener('keydown', (e) => {\n    if (e.key === 'Escape') {\n      if (modal && modal.classList.contains('is-open')) closeProgram();\n      if (mapModal && mapModal.classList.contains('is-open')) closeDhbMap();\n    }\n\n    if (!modal || !modal.classList.contains('is-open')) return;\n\n    if (e.key === 'ArrowRight') nextSlide();\n    if (e.key === 'ArrowLeft') prevSlide();\n  });\n\n  loadEvents();\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-29632b0 e-flex e-con-boxed e-con e-parent\" data-id=\"29632b0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>S\u00e6son Kalender Her finder du \u00e5rets events. N\u00e5r du trykker p\u00e5 et event, \u00e5bner vi automatisk track map og praktisk info l\u00e6ngere nede p\u00e5 siden. Henter kalender fra Google Sheets&#8230; TRACK MAP Find vej &#038; praktisk info Map Find vej Dato &#8211; Map &#8211; Adresse &#8211; Parkering &#8211; Lokation &#8211; Eventdato &#8211; Tider &#8211; Parkering [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-201","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Drift Kalender 2026 | DDC Events &amp; L\u00f8bsdatoer | Danish Drift<\/title>\n<meta name=\"description\" content=\"Se Danish Drift Championship kalenderen med alle events, l\u00f8bsdatoer og lokationer for s\u00e6sonen 2026. F\u00e5 overblik over kommende DDC events.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/danishdrift.dk\/en\/kalender\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Drift Kalender 2026 | DDC Events &amp; L\u00f8bsdatoer | Danish Drift\" \/>\n<meta property=\"og:description\" content=\"Se Danish Drift Championship kalenderen med alle events, l\u00f8bsdatoer og lokationer for s\u00e6sonen 2026. F\u00e5 overblik over kommende DDC events.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/danishdrift.dk\/en\/kalender\/\" \/>\n<meta property=\"og:site_name\" content=\"Danish Drift Championship\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/DanishDriftChampionship?locale=da_DK\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-29T18:14:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/danishdrift.dk\/wp-content\/uploads\/2026\/03\/Logo-1024x683.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"683\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/danishdrift.dk\\\/en\\\/kalender\\\/\",\"url\":\"https:\\\/\\\/danishdrift.dk\\\/en\\\/kalender\\\/\",\"name\":\"Drift Kalender 2026 | DDC Events & L\u00f8bsdatoer | Danish Drift\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/danishdrift.dk\\\/en\\\/#website\"},\"datePublished\":\"2026-03-03T12:15:23+00:00\",\"dateModified\":\"2026-05-29T18:14:40+00:00\",\"description\":\"Se Danish Drift Championship kalenderen med alle events, l\u00f8bsdatoer og lokationer for s\u00e6sonen 2026. F\u00e5 overblik over kommende DDC events.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/danishdrift.dk\\\/en\\\/kalender\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/danishdrift.dk\\\/en\\\/kalender\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/danishdrift.dk\\\/en\\\/kalender\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/danishdrift.dk\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kalender\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/danishdrift.dk\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/danishdrift.dk\\\/en\\\/\",\"name\":\"danishdrift.dk\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/danishdrift.dk\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/danishdrift.dk\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/danishdrift.dk\\\/en\\\/#organization\",\"name\":\"danishdrift.dk\",\"url\":\"https:\\\/\\\/danishdrift.dk\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/danishdrift.dk\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/danishdrift.dk\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/cropped-Bold-_D_-with-red-accents.png\",\"contentUrl\":\"https:\\\/\\\/danishdrift.dk\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/cropped-Bold-_D_-with-red-accents.png\",\"width\":512,\"height\":512,\"caption\":\"danishdrift.dk\"},\"image\":{\"@id\":\"https:\\\/\\\/danishdrift.dk\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/DanishDriftChampionship?locale=da_DK\",\"https:\\\/\\\/www.instagram.com\\\/danishdriftchampionship\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Drift Kalender 2026 | DDC Events & L\u00f8bsdatoer | Danish Drift","description":"Se Danish Drift Championship kalenderen med alle events, l\u00f8bsdatoer og lokationer for s\u00e6sonen 2026. F\u00e5 overblik over kommende DDC events.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/danishdrift.dk\/en\/kalender\/","og_locale":"en_US","og_type":"article","og_title":"Drift Kalender 2026 | DDC Events & L\u00f8bsdatoer | Danish Drift","og_description":"Se Danish Drift Championship kalenderen med alle events, l\u00f8bsdatoer og lokationer for s\u00e6sonen 2026. F\u00e5 overblik over kommende DDC events.","og_url":"https:\/\/danishdrift.dk\/en\/kalender\/","og_site_name":"Danish Drift Championship","article_publisher":"https:\/\/www.facebook.com\/DanishDriftChampionship?locale=da_DK","article_modified_time":"2026-05-29T18:14:40+00:00","og_image":[{"width":1024,"height":683,"url":"https:\/\/danishdrift.dk\/wp-content\/uploads\/2026\/03\/Logo-1024x683.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/danishdrift.dk\/en\/kalender\/","url":"https:\/\/danishdrift.dk\/en\/kalender\/","name":"Drift Kalender 2026 | DDC Events & L\u00f8bsdatoer | Danish Drift","isPartOf":{"@id":"https:\/\/danishdrift.dk\/en\/#website"},"datePublished":"2026-03-03T12:15:23+00:00","dateModified":"2026-05-29T18:14:40+00:00","description":"Se Danish Drift Championship kalenderen med alle events, l\u00f8bsdatoer og lokationer for s\u00e6sonen 2026. F\u00e5 overblik over kommende DDC events.","breadcrumb":{"@id":"https:\/\/danishdrift.dk\/en\/kalender\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/danishdrift.dk\/en\/kalender\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/danishdrift.dk\/en\/kalender\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/danishdrift.dk\/"},{"@type":"ListItem","position":2,"name":"Kalender"}]},{"@type":"WebSite","@id":"https:\/\/danishdrift.dk\/en\/#website","url":"https:\/\/danishdrift.dk\/en\/","name":"danishdrift.dk","description":"","publisher":{"@id":"https:\/\/danishdrift.dk\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/danishdrift.dk\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/danishdrift.dk\/en\/#organization","name":"danishdrift.dk","url":"https:\/\/danishdrift.dk\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/danishdrift.dk\/en\/#\/schema\/logo\/image\/","url":"https:\/\/danishdrift.dk\/wp-content\/uploads\/2026\/04\/cropped-Bold-_D_-with-red-accents.png","contentUrl":"https:\/\/danishdrift.dk\/wp-content\/uploads\/2026\/04\/cropped-Bold-_D_-with-red-accents.png","width":512,"height":512,"caption":"danishdrift.dk"},"image":{"@id":"https:\/\/danishdrift.dk\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/DanishDriftChampionship?locale=da_DK","https:\/\/www.instagram.com\/danishdriftchampionship\/"]}]}},"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/danishdrift.dk\/en\/wp-json\/wp\/v2\/pages\/201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/danishdrift.dk\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/danishdrift.dk\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/danishdrift.dk\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/danishdrift.dk\/en\/wp-json\/wp\/v2\/comments?post=201"}],"version-history":[{"count":127,"href":"https:\/\/danishdrift.dk\/en\/wp-json\/wp\/v2\/pages\/201\/revisions"}],"predecessor-version":[{"id":5099,"href":"https:\/\/danishdrift.dk\/en\/wp-json\/wp\/v2\/pages\/201\/revisions\/5099"}],"wp:attachment":[{"href":"https:\/\/danishdrift.dk\/en\/wp-json\/wp\/v2\/media?parent=201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}