<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<style>#b1111{--orange:#FF5B00;--orange-soft:#FFE6D6;--ink:#1C1C1E;--ink-2:#3A3A3E;--muted:#6B6B70;--paper:#FAF6F1;--card:#FFFFFF;--line:#E8E1D8;--pink:#FF4FA3;--pink-soft:#FFE1EF;--radius:18px;--display:"Anton","Impact","Arial Narrow",sans-serif;--body:"Inter",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;}#b1111,#b1111 *{box-sizing:border-box}@media (prefers-reduced-motion:reduce){#b1111{scroll-behavior:auto}#b1111,#b1111 *{transition:none!important;animation:none!important}}#b1111{margin:0;overflow-x:clip;background:var(--paper);color:var(--ink);font-family:var(--body);font-size:16px;line-height:1.55}#b1111 a{color:inherit}#b1111 img{max-width:100%;display:block}#b1111 .wrap{max-width:1160px;margin:0 auto;padding:0 20px}#b1111 .sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}#b1111 .skip{position:absolute;left:-999px;top:8px;background:var(--ink);color:#fff;padding:10px 14px;border-radius:10px;z-index:100}#b1111 .skip:focus{left:8px}#b1111 :focus-visible{outline:3px solid var(--pink);outline-offset:3px;border-radius:6px}#b1111 .preview-bar{background:var(--ink);color:#fff;font-size:13px}#b1111 .preview-bar .wrap{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:38px}#b1111 .preview-bar b{font-weight:600}#b1111 .preview-bar .dot{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--pink);margin-right:8px;vertical-align:middle}#b1111 .preview-bar button{background:transparent;color:#fff;border:1px solid rgba(255,255,255,.35);border-radius:999px;padding:5px 12px;font:inherit;cursor:pointer}#b1111 .preview-bar button:hover{border-color:#fff}#b1111 .tbd{display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.78em;font-weight:600;letter-spacing:.01em;color:#8A4B00;background:#FFF4E5;border:1px dashed #E0A15C;border-radius:6px;padding:1px 6px;white-space:normal;line-height:1.45}#b1111 header.site{position:relative;z-index:2;background:rgba(250,246,241,.92);backdrop-filter:saturate(1.2) blur(8px);border-bottom:1px solid var(--line)}#b1111 header.site .wrap{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:64px}#b1111 .logo{display:inline-flex;align-items:center;padding:4px 0}#b1111 .logo img{height:30px;width:auto}@media (max-width:620px){#b1111 .logo img{height:24px}}#b1111 nav.main ul{display:flex;gap:6px;list-style:none;margin:0;padding:0}#b1111 nav.main a{display:block;text-decoration:none;font-weight:600;font-size:15px;padding:8px 12px;border-radius:999px}#b1111 nav.main a:hover{background:var(--orange-soft)}#b1111 .hero{padding:48px 0 40px}#b1111 .hero-grid{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(0,.8fr);gap:48px;align-items:center}#b1111 .eyebrow{display:inline-flex;align-items:center;gap:8px;font-weight:600;font-size:14px;letter-spacing:.02em;color:var(--ink-2);background:#fff;border:1px solid var(--line);border-radius:999px;padding:6px 14px;margin:0 0 20px}#b1111 .eyebrow .sq{width:10px;height:10px;border-radius:3px;background:var(--orange)}#b1111 h1{font-family:var(--display);font-weight:400;text-transform:uppercase;font-size:clamp(44px,5.4vw,72px);line-height:1.2;letter-spacing:.015em;margin:0 0 20px}#b1111 h1 .price{color:var(--orange)}#b1111 h1 .scope{background:linear-gradient(to bottom,transparent 0,transparent 19%,var(--pink) 19%,var(--pink) 86%,transparent 86%);color:var(--ink);padding:0 .12em;box-decoration-break:clone;-webkit-box-decoration-break:clone;border-radius:0}#b1111 .lead{font-size:clamp(17px,1.6vw,20px);color:var(--ink-2);max-width:34em;margin:0 0 16px}#b1111 .scope-note{display:flex;gap:10px;align-items:flex-start;background:#fff;border:1.5px solid var(--ink);border-radius:14px;padding:12px 16px;font-weight:600;max-width:34em;margin:0 0 24px}#b1111 .scope-note svg{flex:none;margin-top:3px}#b1111 .ctas{display:flex;flex-wrap:wrap;align-items:center;gap:12px 20px}#b1111 .btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:50px;padding:0 24px;border-radius:999px;font:600 16px/1 var(--body);text-decoration:none;border:0;cursor:pointer}#b1111 .btn-primary{background:var(--orange);color:var(--ink)}#b1111 .btn-primary:hover{background:#ff6f1f}#b1111 .link-sec{font-weight:600;text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:2px;text-decoration-color:var(--orange)}#b1111 .hero-visual img{width:100%;height:auto;border-radius:20px;box-shadow:0 24px 50px -28px rgba(28,28,30,.5)}@media (min-width:981px){#b1111 .hero-visual{width:100
%;max-width:440px;justify-self:end}}#b1111 .b11cd{display:flex;align-items:center;gap:16px;margin-top:28px;padding:14px 18px;background:#fff;border:1px solid var(--line);border-radius:16px;max-width:34em}#b1111 .b11cd{flex-wrap:wrap}#b1111 .b11cd .b11num{display:flex;gap:14px;font-family:var(--display);font-size:44px;line-height:1;color:var(--orange);font-variant-numeric:tabular-nums}#b1111 .b11cd .b11num span{display:flex;flex-direction:column;align-items:center;min-width:1.4em}#b1111 .b11cd .b11num small{font-family:var(--body);font-size:12px;font-weight:600;color:var(--muted);margin-top:4px;text-transform:uppercase;letter-spacing:.05em}#b1111 .b11cd .b11txt{font-size:15px;color:var(--ink-2)}#b1111 .b11cd .b11txt strong{display:block;color:var(--ink);font-size:17px}#b1111 .status{display:none;margin:28px 0 0;max-width:34em;padding:14px 18px;border-radius:14px;font-weight:600}#b1111 .status.on{display:block}#b1111 .status.s-open{background:#E7F7EC;border:1px solid #9ED3AE}#b1111 .status.s-pre{background:#fff;border:1px solid var(--line)}#b1111 .status.s-sold{background:var(--pink-soft);border:1px solid var(--pink)}#b1111 .status.s-ended{background:#EDEDEF;border:1px solid #C9C9CE}#b1111 .facts{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin:8px 0 0}#b1111 .fact{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:18px}#b1111 .fact dt{font-size:13px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin-bottom:6px}#b1111 .fact dd{margin:0;font-weight:600}#b1111 section.block{padding:64px 0}#b1111 .sec-head{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:20px;margin-bottom:28px}#b1111 h2{font-family:var(--display);font-weight:400;text-transform:uppercase;font-size:clamp(36px,5vw,56px);line-height:1;margin:0 0 8px}#b1111 .sec-head p{margin:0;color:var(--ink-2)}#b1111 .search{position:relative;flex:1 1 320px;max-width:420px}#b1111 .search input{width:100%;height:52px;border:1.5px solid var(--ink);border-radius:999px;padding:0 20px 0 48px;font:500 16px var(--body);background:#fff;color:var(--ink)}#b1111 .search svg{position:absolute;left:18px;top:50%;transform:translateY(-50%)}#b1111 .cities{display:flex;flex-wrap:wrap;gap:8px;margin:-8px 0 20px}#b1111 .cities button{font:600 14px var(--body);padding:8px 14px;border-radius:999px;border:1.5px solid var(--line);background:#fff;color:var(--ink);cursor:pointer;min-height:40px}#b1111 .cities button[aria-pressed="true"]{background:var(--ink);color:#fff;border-color:var(--ink)}#b1111 .result-count{margin-top:0;font-size:14px;color:var(--muted);margin:-12px 0 20px}#b1111 .events{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;list-style:none;margin:0;padding:0}#b1111 .ev{position:relative;display:flex;flex-direction:column;background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:20px;min-width:0}#b1111 .ev-img{margin:-20px -20px 16px;aspect-ratio:16/9;background:var(--orange-soft);border-radius:var(--radius) var(--radius) 0 0;overflow:hidden}#b1111 .ev-img img{width:100%;height:100%;object-fit:cover}#b1111 .ev-top{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-bottom:10px}#b1111 .ev-no{font-size:13px;font-weight:600;color:var(--muted);font-variant-numeric:tabular-nums}#b1111 .badge{font-size:12px;font-weight:700;border-radius:999px;padding:4px 10px}#b1111 .badge-sold{background:var(--pink-soft);color:#9B1458}#b1111 .badge-ended{background:#EDEDEF;color:var(--ink-2)}#b1111 .ev h3{font-size:19px;line-height:1.25;margin:0 0 14px;overflow-wrap:anywhere}#b1111 .ev dl{margin:0 0 14px;display:grid;gap:8px;font-size:14px}#b1111 .ev dl div{display:grid;grid-template-columns:118px 1fr;gap:8px}#b1111 .ev dt{color:var(--muted)}#b1111 .ev dd{margin:0;min-width:0}#b1111 .quota{background:var(--orange-soft);border-radius:12px;padding:10px 12px;font-size:14px;margin:0 0 14px}#b1111 .quota strong{font-size:16px}#b1111 .ev-price{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 10px;margin:auto 0 14px}#b1111 .ev-price .amt{font-family:var(--display);font-size:34px;line-height:1}#b1111 .ev-price .note{font-size:12px;color:var(--muted)}#b1111 .ev .btn-card{display:flex;align-items:center;justify-content:center;min-height:46px;border-radius:999px;border:1.5px solid var(--ink);font-weight:600;text-decoration:none;background:#fff}#b1111 .ev a.btn-card:hover{background:var(--ink);color:#fff}#b1111 .ev .btn-card[aria-disabled="true"]{border-style:dashed;color:var(--muted);border-color:var(--muted);cursor:not-allowed}#b1111 .ev.is-off{opacity:.72}#b1111 .ev .off-msg{font-size:14px;font-weight:600;color:#9B1458;m
argin:0 0 12px}#b1111 .ev.is-ended .off-msg{color:var(--ink-2)}#b1111 .empty{display:none;padding:28px;text-align:center;background:#fff;border:1px dashed var(--line);border-radius:var(--radius)}#b1111 .terms{background:#fff;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}#b1111 .terms-grid{display:grid;grid-template-columns:.9fr 1.1fr;gap:40px;align-items:start}#b1111 .key-terms{list-style:none;margin:0;padding:0;display:grid;gap:12px}#b1111 .key-terms li{display:flex;gap:12px;padding:14px 16px;border:1px solid var(--line);border-radius:14px;background:var(--paper)}#b1111 .key-terms .k{flex:none;width:28px;height:28px;border-radius:8px;background:var(--orange);color:var(--ink);font-weight:700;display:grid;place-items:center;font-size:14px}#b1111 details{border:1px solid var(--line);border-radius:14px;background:var(--paper);margin-bottom:10px}#b1111 summary{cursor:pointer;list-style:none;padding:16px 48px 16px 18px;font-weight:600;position:relative}#b1111 summary::-webkit-details-marker{display:none}#b1111 summary::after{content:"";position:absolute;right:20px;top:50%;width:10px;height:10px;border-right:2px solid var(--ink);border-bottom:2px solid var(--ink);transform:translateY(-70%) rotate(45deg);transition:transform .2s}#b1111 details[open] summary::after{transform:translateY(-30%) rotate(-135deg)}#b1111 details .body{padding:0 18px 16px;color:var(--ink-2)}#b1111 details ul{margin:0;padding-left:20px}#b1111 details li{margin:0 0 8px}#b1111 footer.site{padding:36px 0 48px;font-size:14px;color:var(--muted)}#b1111 footer.site .wrap{display:flex;flex-wrap:wrap;justify-content:space-between;gap:12px}#b1111 .review{position:fixed;top:0;right:0;bottom:0;width:min(440px,100%);background:#fff;border-left:1px solid var(--line);box-shadow:-20px 0 40px -20px rgba(0,0,0,.25);z-index:60;transform:translateX(105%);transition:transform .25s;display:flex;flex-direction:column}#b1111 .review:not(.open){visibility:hidden;transition:transform .25s,visibility 0s .25s}#b1111 .review.open{transform:none}#b1111 .review header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--line)}#b1111 .review h2{font-family:var(--body);text-transform:none;font-size:18px;font-weight:700;margin:0}#b1111 .review .close{background:none;border:0;font-size:26px;line-height:1;cursor:pointer;padding:4px 8px}#b1111 .review .scroll{overflow:auto;padding:16px 20px 32px;font-size:14px}#b1111 .review h3{font-size:14px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin:22px 0 8px}#b1111 .review ul{margin:0;padding-left:18px}#b1111 .review li{margin-bottom:6px}#b1111 .review fieldset{border:1px solid var(--line);border-radius:12px;padding:10px 14px}#b1111 .review label{display:flex;gap:8px;align-items:center;padding:4px 0;cursor:pointer}@media (max-width:980px){#b1111 .hero-grid{grid-template-columns:minmax(0,1fr);gap:36px}#b1111 .facts{grid-template-columns:repeat(2,1fr)}#b1111 .events{grid-template-columns:repeat(2,1fr)}#b1111 .terms-grid{grid-template-columns:1fr}}@media (max-width:620px){#b1111 .wrap{padding:0 16px}#b1111 .hero{padding:28px 0 28px}#b1111 h1{font-size:clamp(34px,10.4vw,60px)}#b1111 nav.main a{font-size:14px;padding:8px 9px}#b1111 .facts{grid-template-columns:1fr}#b1111 .events{grid-template-columns:1fr}#b1111 .ev dl div{grid-template-columns:104px 1fr}#b1111 .btn{width:100%}#b1111 .ctas{flex-direction:column;align-items:stretch;text-align:center}#b1111 section.block{padding:48px 0}#b1111 .preview-bar .hide-sm{display:none}}#b1111{font-family:var(--body);background:var(--paper);color:var(--ink);line-height:1.55;font-size:16px;text-align:left}#b1111 h1,#b1111 h2,#b1111 h3,#b1111 p,#b1111 ul,#b1111 dl{margin-top:0}#b1111 a{text-decoration:inherit}#b1111 h1,#b1111 h2,#b1111 h3,#b1111 p,#b1111 li,#b1111 dt,#b1111 dd,#b1111 summary,#b1111 a,#b1111 span,#b1111 label,#b1111 legend{color:inherit}#b1111 h1,#b1111 h2,#b1111 h3{font-weight:inherit;letter-spacing:inherit}#b1111 .ev h3{font-weight:700}#b1111 details ul,#b1111 .review ul{list-style:disc}#b1111 .btn-primary{color:var(--ink)}#b1111{--orange:#E04307;--orange-dk:#C93C06;--orange-soft:#FDEEE7;--ink:#0D0D0D;--ink-2:#3C3C3C;--muted:#6E6E6E;--paper:#FFFFFF;--line:#E6E6E6;--radius:4px;--display:"Nunito",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;--body:"Nunito",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;font-weight:500;background:#fff}#b1111 header.site{background:#fff;border-bottom:0;box-shadow:0 1px 3px rgba(0,0,0,.27)}#b1111 .hero{background:#fff}#b1111 h1{font-weight:800;text-transform:none;letter-spacing:-.01em;line-height:1.14;font-size:clamp(36px,4.6vw,58px)}#b1111 h1 .sc
ope{background:linear-gradient(to bottom,transparent 58%,#FFD3BF 58%,#FFD3BF 92%,transparent 92%);color:var(--ink);padding:0 .06em;border-radius:0}#b1111 h1 .price{color:var(--orange)}#b1111 h2{font-weight:700;text-transform:none;letter-spacing:0;font-size:clamp(28px,3.2vw,36px);line-height:1.2}#b1111 .eyebrow{border:0;background:#F4F4F4;border-radius:4px;font-weight:700}#b1111 .scope-note{border:1px solid var(--line);border-left:4px solid var(--orange);border-radius:4px;background:#fff}#b1111 .btn{border-radius:2px;text-transform:uppercase;font-weight:700;letter-spacing:.02em;font-size:15px;min-height:46px}#b1111 .btn-primary{background:var(--orange-dk);color:#fff}#b1111 .btn-primary:hover{background:#B03404}#b1111 .link-sec{text-decoration-color:var(--orange);text-decoration-thickness:2px}#b1111 .status,#b1111 .b11cd{border-radius:4px}#b1111 .b11cd .b11num{font-weight:800;color:var(--orange)}#b1111 .hero-visual img{border-radius:4px;box-shadow:0 1px 3px rgba(0,0,0,.2)}#b1111 .fact{background:#F7F7F7;border:0;border-radius:4px}#b1111 .fact dt{letter-spacing:.04em}#b1111 .search input{border:1px solid #CFCFCF;border-radius:2px;height:48px}#b1111 .cities button{border-radius:2px;border:1px solid #CFCFCF;font-weight:700}#b1111 .cities button[aria-pressed="true"]{background:var(--orange-dk);border-color:var(--orange-dk);color:#fff}#b1111 .ev{border:0;border-radius:4px;box-shadow:0 1px 3px rgba(0,0,0,.22);padding:16px}#b1111 .ev-img{margin:-16px -16px 14px;border-radius:4px 4px 0 0}#b1111 .ev h3{font-size:16px;font-weight:700;line-height:1.3}#b1111 .ev-no{font-weight:600}#b1111 .quota{background:#F4F4F4;border-radius:4px}#b1111 .ev-price .amt{font-weight:800;font-size:28px;color:var(--orange)}#b1111 .ev .btn-card{border:1px solid var(--orange);border-radius:2px;text-transform:uppercase;font-size:14px;font-weight:700;min-height:42px}#b1111 .ev a.btn-card:hover{background:var(--orange-dk);border-color:var(--orange-dk);color:#fff}#b1111 .badge{border-radius:2px}#b1111 .terms{background:#F7F7F7;border:0}#b1111 .key-terms li{background:#fff;border:0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.12)}#b1111 .key-terms .k{border-radius:2px;background:var(--orange-dk);color:#fff}#b1111 details{background:#fff;border:0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.12)}#b1111 details a{color:var(--orange-dk);text-decoration:underline;text-underline-offset:2px}#b1111 footer.site{background:#fff}@media (max-width:620px){#b1111 h1{font-size:clamp(30px,8.4vw,42px)}#b1111 .ev{padding:14px}#b1111 .ev-img{margin:-14px -14px 12px}}</style>
<div id="b1111">
<div class="preview-bar" id="previewBar" role="note">
<div class="wrap">
<span><span class="dot" aria-hidden="true"></span><b>Önizleme — yayında değil</b><span class="hide-sm"> · Taslak, hukuk kontrolüne tabidir.</span></span>
<button type="button" id="openReview" aria-controls="review" aria-expanded="false">İnceleme notları</button>
</div>
</div>
<header class="site">
<div class="wrap">
<a class="logo" href="#top"><img src="https://storage.mlcdn.com/account_image/111589/BklpTzlUgGU7RTIvKHPQDagEUn7qIxniCvLGQ80L.png" alt="Biletino" width="962" height="253"></a>
<nav class="main" aria-label="Sayfa içi">
<ul>
<li><a href="#etkinlikler">Etkinlikler</a></li>
<li><a href="#kosullar">Kampanya koşulları</a></li>
</ul>
</nav>
</div>
</header>
<main id="top">
<section class="hero" aria-labelledby="h-title">
<div class="wrap">
<div class="hero-grid">
<div>
<p class="eyebrow"><span class="sq" aria-hidden="true"></span>11 Kasım 2026 · Çarşamba · 11.11 – 23.59</p>
<h1 id="h-title">11.11’de <span class="scope">seçili etkinliklerde</span> biletler <span class="price">11 TL!</span></h1>
<p class="lead">11’i biraz fazla ciddiye aldık. 11 Kasım için etkinliğini şimdiden seç.</p>
<p class="scope-note">
<svg width="18" height="18" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="10" fill="none" stroke="currentColor" stroke-width="2"/><path d="M12 7v6M12 16.5v.5" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"/></svg>
<span>Belirlenen bilet kategorilerinde, etkinlik bazında sınırlı kontenjanla.</span>
</p>
<div class="ctas">
<a class="btn btn-primary" href="#etkinlikler">Etkinlikleri keşfet</a>
<a class="link-sec" href="#kosullar">Kampanya koşullarını incele</a>
</div>
<div id="status" class="status" role="status" aria-live="polite"></div>
<div class="b11cd" id="
countdown" aria-live="polite" hidden>
<span class="b11num" id="cdNum">–</span>
<span class="b11txt"><strong id="cdHead"></strong><span id="cdSub"></span></span>
</div>
</div>
<div class="hero-visual">
<picture>
<source media="(min-width: 981px)" srcset="https://storage.mlcdn.com/account_image/111589/IDnxWdZvDpyo1g1vXLF5zcppV64fMCufEPASnhjq.png" width="1080" height="1350">
<img src="https://storage.mlcdn.com/account_image/111589/uFs0cMviE2UwRWy5UXEuctcLIOO8NyCoRsytuh2n.png" width="1920" height="1080" alt="" decoding="async">
</picture>
</div>
</div>
<dl class="facts" aria-label="Kampanya özeti">
<div class="fact"><dt>Tarih</dt><dd>11 Kasım 2026</dd></div>
<div class="fact"><dt>Satış saatleri</dt><dd>11.11 – 23.59</dd></div>
<div class="fact"><dt>Kapsam</dt><dd>Seçili etkinlikler, belirlenen bilet kategorileri</dd></div>
<div class="fact"><dt>Fiyat</dt><dd>11 TL, vergiler ve zorunlu ücretler dahil toplam ödeme</dd></div>
</dl>
</div>
</section>
<section class="block" id="etkinlikler" aria-labelledby="h-events">
<div class="wrap">
<div class="sec-head">
<div>
<h2 id="h-events">Senin planın hangisi?</h2>
<p>Etkinliğini seç. Her etkinliğe ayrılan kampanyalı bilet adedi kartında yazıyor.</p>
</div>
<div class="search" role="search">
<label for="q" class="sr-only">Etkinlik adına göre ara</label>
<svg width="20" height="20" viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="7" fill="none" stroke="currentColor" stroke-width="2"/><path d="m20 20-4.2-4.2" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>
<input id="q" type="search" placeholder="Etkinlik adına göre ara" autocomplete="off">
</div>
</div>
<div class="cities" id="cities" role="group" aria-label="Şehre göre filtrele"></div>
<p class="result-count" id="resultCount" aria-live="polite"></p>
<ul class="events" id="events"></ul>
<div class="empty" id="empty">Bu isimle bir etkinlik bulamadık. Başka bir kelime dener misin?</div>
</div>
</section>
<section class="block terms" id="kosullar" aria-labelledby="h-terms">
<div class="wrap terms-grid">
<div>
<h2 id="h-terms">Kampanya koşulları</h2>
<p style="color:var(--ink-2);margin:0 0 20px">Kısaca bilmen gerekenler:</p>
<ul class="key-terms">
<li><span class="k">1</span><span><strong>11 Kasım 2026, saat 11.11 – 23.59</strong>, Türkiye saatiyle.</span></li>
<li><span class="k">2</span><span>Yalnızca bu sayfadaki <strong>seçili etkinliklerde</strong> ve <strong>belirlenen bilet kategorilerinde</strong> geçerli.</span></li>
<li><span class="k">3</span><span>Her etkinliğin <strong>kampanyalı bilet adedi</strong> ayrı ve kartında yazıyor. O etkinliğin kontenjanı bitince kampanyalı satış durur.</span></li>
<li><span class="k">4</span><span>Ödeyeceğin toplam tutar <strong>11 TL</strong>; vergiler ve zorunlu ücretler dahil.</span></li>
<li><span class="k">5</span><span>Satış <strong>biletino.com</strong> ve <strong>Biletino App</strong> üzerinden; indirim otomatik uygulanır, kod gerekmez.</span></li>
</ul>
</div>
<div>
<details open>
<summary>Süre ve kapsam</summary>
<div class="body"><ul>
<li>Kampanya, 11 Kasım 2026 tarihinde saat 11.11 ile 23.59 arasında, Türkiye saatiyle geçerli.</li>
<li>Yalnızca bu sayfada belirtilen seçili etkinliklerde ve belirlenen bilet kategorilerinde geçerli.</li>
</ul></div>
</details>
<details>
<summary>Fiyat ve kontenjan</summary>
<div class="body"><ul>
<li>Kampanyaya dahil biletlerin toplam satış fiyatı, tüm vergiler ve zorunlu ücretler dahil 11 TL’dir.</li>
<li>Kampanyalı biletler, etkinlik bazında ayrılan kontenjanlarla sınırlı. Her etkinliğin kontenjanı bu sayfada gösteriliyor.</li>
<li>Bir etkinliğin kampanya kontenjanı tükenince o etkinlikte kampanyalı fiyatla satın alma yapılamaz. Kampanya süresi bitince kalan kontenjanlar için de kampanyalı satış sona erer.</li>
</ul></div>
</details>
<details>
<summary>Satış kanalları ve indirim</summary>
<div class="body"><ul>
<li>Kampan
yalı biletler biletino.com ve Biletino App üzerinden satılır.</li>
<li>İndirim, etkinlik sayfasında ayrı bir bilet kategorisi olarak açılır ve otomatik uygulanır; kod gerekmez.</li>
</ul></div>
</details>
<details>
<summary>Diğer kampanyalarla birleştirme</summary>
<div class="body"><ul>
<li>Kampanya, aksi açıkça belirtilmedikçe diğer indirim veya promosyonlarla birleştirilemez.</li>
</ul></div>
</details>
<details>
<summary>Cayma, iptal ve iade</summary>
<div class="body"><ul>
<li>Belirli bir tarihte veya dönemde sunulan etkinlik hizmetlerinde, taraflarca aksi kararlaştırılmadıkça koşulsuz 14 günlük cayma hakkı bulunmaz.</li>
<li>Etkinliğin iptali, hizmetin sunulmaması, tarih, yer veya içerikte esaslı değişiklik ya da sözleşmeye aykırılık halinde mevzuattan doğan hakların saklıdır.</li>
<li>İade gereken durumlarda fiilen ödenen tutar esas alınır; zorunlu ücretler aleyhine iade dışında bırakılmaz.</li>
</ul></div>
</details>
<details>
<summary>İletişim ve başvuru</summary>
<div class="body"><ul>
<li>Bilgi ve başvuru: <a href="https://biletino.com" target="_blank" rel="noopener">biletino.com</a> ve <a href="mailto:info@biletino.com">info@biletino.com</a></li>
<li>İade başvuruları: <a href="https://biletino.com" target="_blank" rel="noopener">biletino.com</a> ve <a href="mailto:info@biletino.com">info@biletino.com</a></li>
</ul></div>
</details>
</div>
</div>
</section>
</main>
<footer class="site">
<div class="wrap">
<span>Biletino · 11.11 kampanyası</span>
<a href="#top">Başa dön</a>
</div>
</footer>
<aside class="review" id="review" aria-labelledby="review-title" aria-hidden="true">
<header>
<h2 id="review-title">İnceleme notları</h2>
<button class="close" type="button" id="closeReview" aria-label="Paneli kapat">×</button>
</header>
<div class="scroll">
<fieldset>
<legend>Satış durumunu önizle</legend>
<label><input type="radio" name="st" value="oncesi" checked> Satış öncesi</label>
<label><input type="radio" name="st" value="acik"> Satış açık</label>
<label><input type="radio" name="st" value="etkinlik_tukendi"> Bir etkinliğin kotası tükenmiş (örnek)</label>
<label><input type="radio" name="st" value="tum_tukendi"> Tüm kotalar tükenmiş</label>
<label><input type="radio" name="st" value="bitti"> Süre bitmiş</label>
</fieldset>
<p style="color:var(--muted)">Bu seçici yalnızca görünümü değiştirir. Sayfa satış, ödeme veya stok sistemine bağlı değil.</p>
<h3>Açık noktalar</h3>
<ul>
<li>Üyelik/katılım şartı belirtilmedi; ilgili satır sayfadan kaldırıldı.</li>
<li>Birleştirme için istisna belirtilmedi; genel kural cümlesi kaldı.</li>
<li>Kişi başı limit sayfada yer almıyor (ekip kararı).</li>
</ul>
<h3>Veri notu</h3>
<ul>
<li>Etkinlik listesi tablodaki “Sayfa” sekmesinden her ziyarette okunuyor (yalnızca bu sekme web’de yayında; “11.11” sekmesindeki ONAY satırları). 6 Kasım 17.30 itibarıyla 23 kayıt / 185 bilet. Toplam sayı sayfada kullanılmadı. Tablo okunamazsa sayfadaki yedek liste gösterilir.</li>
<li>Aynı adlı “Nation to Nation” kayıtları (64567, 64568, 64569) birleştirilmedi.</li>
<li>Tarih, mekan, şehir ve bağlantılar biletino.com etkinlik sayfalarından alındı (6 Kasım). Şehir filtresi bu veriye dayanıyor; tür filtresi eklenmedi.</li>
<li><b>Sitede “11.11 Kampanyası” kategorisi yalnızca 7 etkinlikte açık:</b> 64792, 64876, 64877, 63729, 64902, 64110, 64728. Diğer 15 etkinlikte kategori yok.</li>
<li><b>Sitedeki kampanya fiyatları 11 TL değil, karışık:</b> 64876 ve 64877 → 11,00 TL; 64110 → 18,50 TL; 64792, 63729, 64902, 64728 → 21,00 TL. Sayfa 11 TL’yi zorunlu ücretler dahil toplam olarak gösteriyor; yayından önce sitedeki fiyatların buna eşitlenmesi gerekiyor.</li>
<li>Satış saatleri 11.11 – 23.59 olarak onaylandı (6 Kasım). Sitede kampanya kategorisi 11.10’dan geçerli ayarlı; 1 dakikalık fark düzeltilmeli.</li>
<li>64900 ve 64906 ücretsiz olduğu için tablodaki “Sayfada Göster: Hayır” ile sayfadan çıkarıldı.</li>
</ul>
<h3>Hukuk onayı gereken kararlar</h3>
<ul>
<li>Ana başlıkta “seçili etkinliklerde” vurgusu ve kapsam kutusunun yeterliliği</li>
<li>Bilet kategorisi ve önceki fiyat kartlardan kaldırıldı (ekip kararı, 6 Kas
ım). Hukuk görüşü kategori bilgisinin ana alanda anlaşılmasını istiyordu; bu, kapsam kutusundaki genel ifadeyle karşılanıyor.</li>
<li>Kampanya görseli: “seçili etkinlikler” bilgisi görselde yalnızca alt satırda, kategori bilgisi yok ve “Sınırlı sayıda” rozeti var. Sayfada bu eksikleri başlık ve kapsam kutusu karşılıyor; görselin kendisi ayrıca hukuk onayına tabi.</li>
<li>Geri sayım 11 Kasım 11.11’e göre çalışıyor; satış açılınca 23.59’a kalan süreyi gösteriyor</li>
<li>Koşul metinlerindeki sadeleştirmeler (anlam korunarak)</li>
<li>Durum mesajları ve kart üzerindeki fiyat ifadesi</li>
</ul>
<h3>Bağlı olmayan işlevler</h3>
<ul>
<li>Satın alma, ödeme ve gerçek zamanlı stok bağlı değil. Tükendi bilgisi tablodaki “Tükendi” sütunundan (Evet) okunur; tüm etkinlikler işaretlenince sayfa “tükendi” moduna geçer.</li>
<li>“Bana hatırlat” / takvime ekle eklenmedi</li>
</ul>
</div>
</aside>
<script>
(function(){
/* ============ AYARLAR ============ */
const CONFIG = {
preview: false, // false: önizleme şeridi ve inceleme paneli kaldırılır
state: "oncesi", // oncesi | acik | tum_tukendi | bitti (autoState açıksa saat belirler; tum_tukendi elle)
campaignDate: "2026-11-11",
start: "2026-11-11T11:11:00+03:00",
end: "2026-11-11T23:59:00+03:00",
sheetCsv: "https://docs.google.com/spreadsheets/d/e/2PACX-1vQfQwqquA-HLP08FanZ5Uy-v1H3zGbNdPZhqhqs3pgCu588tT49DHwiedkRg9WUgmNAOTGp1LhM6p0D/pub?gid=531159172"+String.fromCharCode(38)+"single=true"+String.fromCharCode(38)+"output=csv", // Google Sheets "Web'de yayınla" CSV adresi; boşsa sayfadaki liste kullanılır
autoState: true // satış öncesi / açık / bitti durumunu saate göre seçer (stok durumu elle)
};
/* biletino.com etkinlik sayfalarından (6 Kasım 2026): tarih, mekan, şehir, bağlantı ve
sitede '11.11 Kampanyası' kategorisi açılmış etkinlikler. Saatler kullanılmadı. */
const SITE = {"64792": {"tarih": "2026-11-26", "mekan": "Social Hall Mersin, Yenişehir", "sehir": "Mersin", "url": "https://biletino.com/tr/e-1dzs/emre-nalbantoglu-konseri-mersin/", "kategori": "11.11 Kampanyası"}, "64876": {"tarih": "2026-11-14", "mekan": "The Clubhouse Jazz Bar, Sheraton Ankara, Çankaya", "sehir": "Ankara", "url": "https://biletino.com/tr/e-1e24/zeynep-burcu-altinel/", "kategori": "11.11 Kampanyası"}, "64877": {"tarih": "2026-11-20", "mekan": "The Clubhouse Jazz Bar, Sheraton Ankara, Çankaya", "sehir": "Ankara", "url": "https://biletino.com/tr/e-1e25/nedime-girisken-timeless-covers/", "kategori": "11.11 Kampanyası"}, "64932": {"tarih": "2026-11-27", "mekan": "The Clubhouse Jazz Bar, Sheraton Ankara, Çankaya", "sehir": "Ankara", "url": "https://biletino.com/tr/e-1e3o/ege-pekel-iskar/", "kategori": null}, "63729": {"tarih": "2026-11-14", "mekan": "Grand Pera Emek Sahnesi, Beyoğlu", "sehir": "İstanbul", "url": "https://biletino.com/tr/e-1d69/tedxreset-2026/", "kategori": "11.11 Kampanyası"}, "64902": {"tarih": "2026-11-14", "mekan": "Artı2, Şişli", "sehir": "İstanbul", "url": "https://biletino.com/tr/e-1e2u/saturday-at-arti2istanbul/", "kategori": "11.11 Kampanyası"}, "64752": {"tarih": "2026-12-31", "mekan": "ORBIT 001, Ürgüp", "sehir": "Nevşehir", "url": "https://biletino.com/tr/e-1dyo/orbit-001/", "kategori": null}, "64110": {"tarih": "2026-11-14", "mekan": "Holly Stone, Çankaya", "sehir": "Ankara", "url": "https://biletino.com/tr/e-1dgu/kobra-murat-ile-girls-night/", "kategori": "11.11 Kampanyası"}, "64728": {"tarih": "2026-12-11", "mekan": "Backyard Secrets, Çankaya", "sehir": "Ankara", "url": "https://biletino.com/tr/e-1dy0/groove-night-ii/", "kategori": "11.11 Kampanyası"}, "64858": {"tarih": "2026-11-14", "mekan": "Park Inn by Radisson, Konak", "sehir": "İzmir", "url": "https://biletino.com/tr/e-1e1m/salma-hf-nightshift-sessions/", "kategori": null}, "64900": {"tarih": "2026-11-12", "mekan": "Yabangee Base, Beyoğlu", "sehir": "İstanbul", "url": "https://biletino.com/tr/e-1e2s/language-exchange-multilanguage-cultural-social-club/", "kategori": null}, "64567": {"tarih": "2026-11-14", "mekan": "Yabangee Base, Beyoğlu", "sehir": "İstanbul", "url": "https://biletino.com/tr/e-1dtj/nation-to-nation-an-international-meetup-event/", "kategori": null}, "64905": {"tarih": "2026-11-16", "mekan": "Yabangee Base, Beyoğlu", "sehir": "İstanbul", "url": "https://biletino.com/tr/e-1e2x/soundcheck-an-all-music-quiz-2000s-today/", "kategori": null}, "64564": {"tarih": "2026-11-17", "mekan": "Sanat Teras, Beyoğlu", "sehir": "İstanbul", "url": "https://biletino.com/tr/e-1dtg/trivia-night-258-questions-in-english-turkish/", "kategori": null}, "64906": {"tarih": "2026-11-19", "mekan": "Yabangee Base, Beyoğlu", "sehir": "İstanbul", "url": "https://biletino.com/tr/e-1e2y/international-k
araoke-games-night/", "kategori": null}, "64568": {"tarih": "2026-11-21", "mekan": "Yabangee Base, Beyoğlu", "sehir": "İstanbul", "url": "https://biletino.com/tr/e-1dtk/nation-to-nation-an-international-meetup-event/", "kategori": null}, "64565": {"tarih": "2026-11-24", "mekan": "Sanat Teras, Beyoğlu", "sehir": "İstanbul", "url": "https://biletino.com/tr/e-1dth/trivia-night-259-questions-in-english-turkish/", "kategori": null}, "64904": {"tarih": "2026-11-24", "mekan": "Yabangee Base, Beyoğlu", "sehir": "İstanbul", "url": "https://biletino.com/tr/e-1e2w/speed-friending-networking-games-night/", "kategori": null}, "64569": {"tarih": "2026-11-28", "mekan": "Yabangee Base, Beyoğlu", "sehir": "İstanbul", "url": "https://biletino.com/tr/e-1dtl/nation-to-nation-an-international-meetup-event/", "kategori": null}, "64854": {"tarih": "2026-12-05", "mekan": "Kalt, Bornova", "sehir": "İzmir", "url": "https://biletino.com/tr/e-1e1i/tanerman-kalt-izmir/", "kategori": null}, "64771": {"tarih": "2026-11-28", "mekan": "Radisson Hotel Mersin, Yenişehir", "sehir": "Mersin", "url": "https://biletino.com/tr/e-1dz7/green-river-mersin-the-next-chapter/", "kategori": null}, "64830": {"tarih": "2026-11-20", "mekan": "Rabarba Rooftop, Çankaya", "sehir": "Ankara", "url": "https://biletino.com/tr/e-1e0u/midnight/", "kategori": null}, "64921": {"tarih": "2026-11-13", "mekan": "Bosnalı Hotel, Seyhan", "sehir": "Adana", "url": "https://biletino.com/tr/e-1e3d/kervan-sessions-3/", "kategori": null}};
/* Etkinlik verisi: 6 Kasım takip tablosu, yalnızca ONAY kayıtları.
null alanlar sayfada [TAMAMLANACAK] olarak görünür. */
const EVENTS = [
[64792,"Emre Nalbantoğlu Konseri - Mersin",5],
[64876,"Zeynep Burcu Altınel",20],
[64877,"Nedime Girişken - Timeless Covers",20],
[64932,"Ege Pekel & ISKAR",20],
[63729,"TEDxReset 2026",11],
[64902,"Saturday at Artı2İstanbul",5],
[64752,"ORBIT 001",11],
[64110,"Kobra Murat ile Girls Night",11],
[64728,"GROOVE NIGHT II",5],
[64858,"SALMA H°F — NightShift Sessions",11],
[64567,"Nation to Nation: An International Meetup Event",5],
[64905,"Soundcheck - An All Music Quiz: 2000s - Today",5],
[64564,"Trivia Night #258: Questions in English & Turkish",5],
[64568,"Nation to Nation: An International Meetup Event",5],
[64565,"Trivia Night #259: Questions in English & Turkish",5],
[64904,"Speed Friending & Networking Games Night",5],
[64569,"Nation to Nation: An International Meetup Event",5],
[64854,"TANERMAN — KALT İZMİR",5],
[64771,"GREEN RIVER — MERSIN — THE NEXT CHAPTER",5],
[64830,"Midnight",5],
[64921,"KERVAN SESSIONS 3",6]
].map(([no,ad,kontenjan]) => ({
no, ad, kontenjan,
tarih:SITE[no]?.tarih||null, mekan:SITE[no]?.mekan||null, sehir:SITE[no]?.sehir||null,
kategori:SITE[no]?.kategori||null,
gorsel:`https://resources-biletino.s3.eu-west-1.amazonaws.com/content/event/${no}/960x540.jpg`,
oncekiFiyat:null, // yalnızca doğrulanmış indirim öncesi fiyat (TL)
url:SITE[no]?.url||null, // biletino.com etkinlik sayfası
tukendi:false // gerçek stok verisiyle güncellenmeli
}));
/* ============ YARDIMCILAR ============ */
const $ = s => document.querySelector(s);
const esc = s => String(s).replace(/[&<>"']/g, c => ({"&":"\x26amp;","<":"\x26lt;",">":"\x26gt;",'"':"\x26quot;","'":"\x26#39;"}[c]));
const tbd = t => `<span class="tbd">[TAMAMLANACAK]${t ? " " + t : ""}</span>`;
const fold = s => s.toLocaleLowerCase("tr")
.replace(/[ıi̇]/g,"i").replace(/ş/g,"s").replace(/ğ/g,"g").replace(/ü/g,"u").replace(/ö/g,"o").replace(/ç/g,"c")
.normalize("NFD").replace(/\p{M}/gu,"").replace(/\s+/g," ").trim();
const trDate = d => new Intl.DateTimeFormat('tr-TR',{day:'numeric',month:'long',year:'numeric',weekday:'long',timeZone:'UTC'}).format(new Date(d+'T00:00:00Z'));
const tl = n => new Intl.NumberFormat("tr-TR").format(n) + " TL";
let state = CONFIG.state;
let city = "";
function renderCities(){
const cs = [...new Set(EVENTS.map(e => e.sehir).filter(Boolean))].sort((a,b)=>a.localeCompare(b,'tr'));
$("#cities").innerHTML = ['', ...cs].map(c => `<button type="button" data-c="${esc(c)}" aria-pressed="${c===city}">${c ? esc(c) : 'Tüm şehirler'}</button>`).join('');
$("#cities").querySelectorAll('button').forEach(b => b.addEventListener('click', () => { city = b.dataset.c; renderCities(); render(); }));
}
/* ============ ETKİNLİK KARTLARI ============ */
function card(e){
const ended = state === "bitti";
const sold = !ended && (state === "tum_tukendi" || e.tukendi);
const off = ended || sold;
const when = (e.tarih || e.mekan) ? esc([e.tarih && trDate(e.tarih), e.mekan && (e.mekan + (e.sehir ? ', ' + e.sehir : ''))].filter(Boolean).join(' · ')) : '';
const btn = e.url
? `<a class="btn-card" href="${esc(e.url)}" target="_blank" rel=
"noopener">Etkinliği incele<span class="sr-only">: ${esc(e.ad)}</span></a>`
: `<span class="btn-card" role="link" aria-disabled="true">Etkinliği incele · bağlantı eklenecek</span>`;
return `<li class="ev${off ? " is-off" : ""}${ended ? " is-ended" : ""}">
<div class="ev-img"><img src="${esc(e.gorsel)}" alt="" loading="lazy" width="960" height="540" onerror="this.parentNode.remove()"></div>
<div class="ev-top"><span class="ev-no">Etkinlik no. ${e.no}</span>${
ended ? '<span class="badge badge-ended">Kampanya sona erdi</span>' :
sold ? '<span class="badge badge-sold">Kontenjan tükendi</span>' : ""}</div>
<h3>${esc(e.ad)}</h3>
<dl>
${when ? '<div><dt>Tarih ve mekan</dt><dd>' + when + '</dd></div>' : ''}
</dl>
<p class="quota">Bu etkinliğe ayrılan kampanyalı bilet: <strong>${e.kontenjan}</strong></p>
${sold ? '<p class="off-msg">Bu etkinliğin kampanya kontenjanı tükendi.</p>' : ""}
${ended ? '<p class="off-msg">11.11 kampanyası sona erdi.</p>' : ""}
<div class="ev-price"><span class="amt">11 TL</span><span class="note">vergiler ve zorunlu ücretler dahil toplam</span></div>
${btn}
</li>`;
}
function render(){
if(!manual&&state==='acik'&&EVENTS.length&&EVENTS.every(e=>e.tukendi)){state='tum_tukendi';renderStatus();$('#countdown').hidden=true;}
const q = fold($("#q").value);
const list = EVENTS.filter(e => (!city || e.sehir === city) && (!q || fold(e.ad).includes(q) || String(e.no).includes(q)));
$("#events").innerHTML = list.map(card).join("");
$("#empty").style.display = list.length ? "none" : "block";
$("#resultCount").textContent = (q || city) ? `${list.length} etkinlik bulundu` : `${list.length} etkinlik`;
}
/* ============ DURUM ŞERİDİ ============ */
function renderStatus(){
const el = $("#status");
const map = {
oncesi: ["s-pre", `11 TL’lik biletler 11 Kasım saat 11.11’de satışa çıkıyor. Şimdilik etkinliğini seç, koşullara göz at.`],
acik: ["s-open", `11.11 kampanyası açık. Saat 23.59’a kadar ya da etkinliğin kampanya kontenjanı bitene kadar.`],
etkinlik_tukendi: ["s-open", `11.11 kampanyası açık. Kontenjanı tükenen etkinlikler kartlarında belirtiliyor.`],
tum_tukendi: ["s-sold", "11 TL’lik kampanyalı biletler tükendi."],
bitti: ["s-ended", "11.11 kampanyası sona erdi."]
};
const [cls, txt] = map[state];
el.className = "status on " + cls;
el.innerHTML = txt;
}
/* ============ GERİ SAYIM ============
11 Kasım 11.11'e (satış öncesi) ya da 23.59'a (satış açıkken) kalan süre. */
const T0 = Date.parse(CONFIG.start), T1 = Date.parse(CONFIG.end);
function autoState(){
if (!CONFIG.autoState || manual) return;
const now = Date.now();
const v = now < T0 ? "oncesi" : now < T1 ? "acik" : "bitti";
if (v !== state && state !== "tum_tukendi"){ state = v; renderStatus(); render(); }
}
let manual = false;
function renderCountdown(){
autoState();
const box = $("#countdown");
if (state === "bitti" || state === "tum_tukendi"){ box.hidden = true; return; }
const target = state === "oncesi" ? T0 : T1;
let ms = Math.max(0, target - Date.now());
box.hidden = false;
const d = Math.floor(ms/864e5), h = Math.floor(ms%864e5/36e5), m = Math.floor(ms%36e5/6e4);
$("#cdNum").innerHTML = `<span>${d}<small>gün</small></span><span>${h}<small>saat</small></span><span>${m}<small>dk</small></span>`;
$("#cdHead").textContent = state === "oncesi" ? "11 TL’lik biletlere kalan süre" : "Kampanyanın bitmesine kalan süre";
$("#cdSub").textContent = state === "oncesi" ? "11 Kasım 2026, saat 11.11 (Türkiye saati)" : "11 Kasım 2026, saat 23.59 (Türkiye saati)";
}
setInterval(renderCountdown, 30000);
/* ============ İNCELEME PANELİ ============ */
function setState(v){
state = v; manual = true;
EVENTS.forEach(e => e.tukendi = !!e._t);
if (v === "etkinlik_tukendi") EVENTS[0].tukendi = true;
renderStatus(); renderCountdown(); render();
}
function setupReview(){
const panel = $("#review"), openBtn = $("#openReview");
const toggle = open => { panel.classList.toggle("open", open); panel.setAttribute("aria-hidden", !open); openBtn.setAttribute("aria-expanded", open); if (open) $("#closeReview").focus(); else openBtn.focus(); };
openBtn.addEventListener("click", () => toggle(true));
$("#closeReview").addEventListener("click", () => toggle(false));
document.addEventListener("keydown", e => { if (e.key === "Escape" && panel.classList.contains("open")) toggle(false); });
panel.querySelectorAll('input[name="st"]').forEach(r => r.addEventListener("change", () => setState(r.valu
e)));
}
/* ============ GOOGLE SHEETS ============
CONFIG.sheetCsv doluysa, yayınlanan sekmeden etkinlik listesi her ziyarette okunur.
Gerekli sütunlar: Etkinlik No, Etkinlik, Kampanyalı Bilet. İsteğe bağlı: Sayfada Göster, Etkinlik Tarihi, Mekan, Şehir.
Okunamazsa sayfadaki liste kullanılır. */
function parseCSV(t){const rows=[];let r=[],v='',q=false;for(let i=0;i<t.length;i++){const k=t.charCodeAt(i);if(q){if(k===34){if(t.charCodeAt(i+1)===34){v+='"';i++;}else q=false;}else v+=t[i];}else if(k===34)q=true;else if(k===44){r.push(v);v='';}else if(k===10){r.push(v);rows.push(r);r=[];v='';}else if(k!==13)v+=t[i];}if(v!==''||r.length){r.push(v);rows.push(r);}return rows;}
function toISO(s){const m=String(s||'').match(/([0-9]{1,2})[./-]([0-9]{1,2})[./-]([0-9]{4})/);if(!m)return null;return m[3]+'-'+('0'+m[2]).slice(-2)+'-'+('0'+m[1]).slice(-2);}
function loadSheet(){
if(!CONFIG.sheetCsv)return;
const u=CONFIG.sheetCsv+(CONFIG.sheetCsv.indexOf('?')<0?'?':'&')+'_='+Date.now();
fetch(u).then(r=>r.ok?r.text():Promise.reject(r.status)).then(t=>{
const rows=parseCSV(t).filter(r=>r.some(c=>c.trim()));
if(rows.length<2)return;
const H=rows[0].map(h=>fold(h));
const find=fn=>H.findIndex(fn);
const cNo=find(h=>h==='no'||h.indexOf('etkinlik no')>=0||h.indexOf('etkinlik id')>=0||h==='id');
const cAd=find((h,i)=>i!==cNo&&(h==='etkinlik'||h.indexOf('etkinlik ad')>=0));
const cAdet=find(h=>h.indexOf('bilet')>=0||h.indexOf('kontenjan')>=0||h.indexOf('adet')>=0);
const cGos=find(h=>h.indexOf('goster')>=0||h.indexOf('yayin')>=0);
const cTar=find(h=>h.indexOf('etkinlik tarih')>=0);
const cMek=find(h=>h.indexOf('mekan')>=0);
const cSeh=find(h=>h.indexOf('sehir')>=0);
const cTuk=find(h=>h.indexOf('tukendi')>=0);
if(cNo<0)return;
const list=[];
rows.slice(1).forEach(r=>{
const no=parseInt(String(r[cNo]||'').replace(/[^0-9]/g,''),10);if(!no)return;
if(cGos>=0&&/^(hayir|h|no|false|0)$/.test(fold(r[cGos]||'')))return;
const s=SITE[no]||{};
list.push({no:no,ad:(cAd>=0&&r[cAd]?r[cAd].trim():'')||('Etkinlik '+no),kontenjan:parseInt(r[cAdet],10)||0,
tarih:(cTar>=0&&toISO(r[cTar]))||s.tarih||null,mekan:(cMek>=0&&r[cMek]&&r[cMek].trim())||s.mekan||null,sehir:(cSeh>=0&&r[cSeh]&&r[cSeh].trim())||s.sehir||null,
gorsel:'https://resources-biletino.s3.eu-west-1.amazonaws.com/content/event/'+no+'/960x540.jpg',url:'https://biletino.com/tr/e-'+no.toString(36)+'/',tukendi:false,_t:cTuk>=0&&/^(evet|e|x|true|1|var|tukendi)$/.test(fold(r[cTuk]||''))});
});
if(!list.length)return;
list.forEach(e=>{e.tukendi=!!e._t});
EVENTS.splice(0,EVENTS.length,...list);
if(city&&!EVENTS.some(e=>e.sehir===city))city='';
renderCities();render();
}).catch(e=>console.warn('b1111: tablo okunamadı, sayfadaki liste kullanılıyor',e));
}
/* ============ BAŞLAT ============ */
if (!CONFIG.preview){ $("#previewBar").remove(); $("#review").remove(); }
else setupReview();
$("#q").addEventListener("input", render);
renderCities(); renderStatus(); renderCountdown(); render(); loadSheet();
})();
</script>
</div>