{
  "version": 3,
  "sources": ["../../../static_src/js/core/antigravity.js", "../../../static_src/js/core/dialog.js", "../../../static_src/js/lib/live.js", "../../../static_src/js/pages/event.js"],
  "sourcesContent": ["// Efeito \"bolinhas de disco\" (s\u00F3 nas telas de auth do consumidor): um campo de\n// bolinhas (tipo isopor) que INFLAM com bounce (mola) quando o mouse passa perto,\n// ativando tipo globo de espelho de festa \u2014 cada uma brilha com um specular e um\n// glow. Cores DEEVO (rosa + violeta). Canvas 2D, respeita prefers-reduced-motion.\n// gradiente da LOGO DEEVO: rosa (topo-esquerda) \u2192 violeta (baixo-direita)\nconst PINK = [255, 45, 155];\nconst VIOLET = [162, 107, 255];\nconst SPACING = 44; // px entre as bolinhas (grade com jitter)\nconst RADIUS = 200; // raio de \"toque\" do mouse\nconst BASE_R = 1.9; // raio em repouso\nconst GROW = 12; // quanto incha perto do mouse\nconst TWO_PI = Math.PI * 2;\n\n// cor no gradiente rosa\u2192violeta (t: 0 rosa \u2026 1 violeta)\nfunction mix(t) {\n  t = t < 0 ? 0 : t > 1 ? 1 : t;\n  const r = (PINK[0] + (VIOLET[0] - PINK[0]) * t) | 0;\n  const g = (PINK[1] + (VIOLET[1] - PINK[1]) * t) | 0;\n  const b = (PINK[2] + (VIOLET[2] - PINK[2]) * t) | 0;\n  return `rgb(${r},${g},${b})`;\n}\n\nexport function initAntigravity(root = document, opts = {}) {\n  const canvas = root.querySelector('[data-antigravity]');\n  if (!canvas) return;\n  const ctx = canvas.getContext('2d');\n  const reduce = matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n  // modo \"dichavado\" (mais suave/espa\u00E7ado) \u2014 usado na p\u00E1gina do evento\n  const subtle = !!opts.subtle;\n  const ambient = !!opts.ambient; // ignora o mouse, s\u00F3 pulsa levinho no fundo\n  const spacing = subtle ? 66 : SPACING; // mais espa\u00E7ado\n  const grow = subtle ? 9 : GROW; // incha menos\n  const idleA = subtle ? 0.09 : 0.18; // mais discreto em repouso\n  const inflA = subtle ? 0.45 : 0.72; // brilha menos perto do mouse\n  const beatAmt = subtle ? 0.45 : 1.15; // batida mais leve\n  const glowAmt = subtle ? 0.5 : 1;\n\n  let W = 0;\n  let H = 0;\n  let dots = [];\n  let raf = 0;\n  let t = 0;\n  const mouse = { x: -9999, y: -9999, on: false };\n\n  function build() {\n    const dpr = Math.min(window.devicePixelRatio || 1, 2);\n    W = canvas.clientWidth;\n    H = canvas.clientHeight;\n    canvas.width = Math.round(W * dpr);\n    canvas.height = Math.round(H * dpr);\n    ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n    dots = [];\n    const jitter = spacing * 0.4;\n    for (let x = spacing / 2; x < W; x += spacing) {\n      for (let y = spacing / 2; y < H; y += spacing) {\n        const px = x + (Math.random() - 0.5) * jitter;\n        const py = y + (Math.random() - 0.5) * jitter;\n        // diagonal rosa\u2192violeta (igual \u00E0 logo) + jitter leve pra n\u00E3o bandar\n        const grad = (px / W + py / H) / 2 + (Math.random() - 0.5) * 0.14;\n        dots.push({\n          x: px,\n          y: py,\n          r: BASE_R,\n          vr: 0, // velocidade do raio (mola)\n          color: mix(grad),\n          tw: Math.random() * TWO_PI, // fase do brilho ocioso (disco)\n        });\n      }\n    }\n  }\n\n  function draw() {\n    ctx.clearRect(0, 0, W, H);\n    // pulso \"na batida\" (~125 BPM): thump com ataque r\u00E1pido e decaimento \u2014 techno\n    const phase = (t % 0.48) / 0.48;\n    const beat = Math.pow(1 - phase, 2.2); // 1 na batida \u2192 decai at\u00E9 a pr\u00F3xima\n    const beatR = 1 + beat * beatAmt; // quanto a bolinha cresce na batida\n    for (const p of dots) {\n      let infl = 0;\n      if (mouse.on && !ambient) {\n        const dx = mouse.x - p.x;\n        const dy = mouse.y - p.y;\n        const dist = Math.hypot(dx, dy);\n        const n = Math.max(0, 1 - dist / RADIUS);\n        infl = n * n * (3 - 2 * n); // smoothstep \u2014 inchada suave\n      }\n      // cintila (globo de espelho) + pulsa na batida + incha perto do mouse\n      const twinkle = 1 + Math.sin(t * 2.2 + p.tw) * 0.22;\n      const target = BASE_R * twinkle * beatR + infl * grow;\n      // mola: overshoot + assenta = bounce (tipo bolinha de isopor)\n      if (reduce) {\n        p.r = target;\n      } else {\n        p.vr += (target - p.r) * 0.2;\n        p.vr *= 0.68;\n        p.r += p.vr;\n      }\n      const alpha = idleA + beat * 0.14 * glowAmt + infl * inflA; // brilha mais na batida\n\n      // glow s\u00F3 nas ativas (perto do mouse) \u2014 barato\n      ctx.shadowBlur = infl > 0.12 ? (6 + infl * 14) * glowAmt : 0;\n      ctx.shadowColor = p.color;\n      ctx.globalAlpha = alpha;\n      ctx.fillStyle = p.color;\n      ctx.beginPath();\n      ctx.arc(p.x, p.y, Math.max(0.4, p.r), 0, TWO_PI);\n      ctx.fill();\n\n      // specular (bolinha 3D brilhante) quando inflada\n      if (p.r > 3.2) {\n        ctx.shadowBlur = 0;\n        ctx.globalAlpha = alpha * 0.7;\n        ctx.fillStyle = '#ffffff';\n        ctx.beginPath();\n        ctx.arc(p.x - p.r * 0.3, p.y - p.r * 0.3, p.r * 0.32, 0, TWO_PI);\n        ctx.fill();\n      }\n    }\n    ctx.shadowBlur = 0;\n    ctx.globalAlpha = 1;\n  }\n\n  function loop() {\n    t += 0.016;\n    draw();\n    raf = requestAnimationFrame(loop);\n  }\n\n  if (!ambient) {\n    const toLocal = (e) => {\n      const r = canvas.getBoundingClientRect();\n      mouse.x = e.clientX - r.left;\n      mouse.y = e.clientY - r.top;\n      mouse.on = true;\n    };\n    window.addEventListener('pointermove', toLocal, { passive: true });\n    window.addEventListener('pointerdown', toLocal, { passive: true });\n    window.addEventListener('pointerleave', () => (mouse.on = false));\n    window.addEventListener('blur', () => (mouse.on = false));\n  }\n\n  let rt;\n  window.addEventListener('resize', () => {\n    clearTimeout(rt);\n    rt = setTimeout(build, 150);\n  });\n\n  build();\n  if (reduce) {\n    draw();\n  } else {\n    loop();\n    document.addEventListener('visibilitychange', () => {\n      cancelAnimationFrame(raf);\n      if (!document.hidden) loop();\n    });\n  }\n}\n", "// Modais <dialog> \u2014 abrir/fechar + trava de scroll, pra QUALQUER p\u00E1gina.\n//\n// Isto morava dentro do pages/event.js, ent\u00E3o modal s\u00F3 funcionava na p\u00E1gina do rol\u00EA:\n// a da casa (que precisa do \"ver todos os dias\" do hor\u00E1rio) carregava o markup do\n// <dialog> e nada acontecia no clique. Como o comportamento n\u00E3o tem nada de espec\u00EDfico\n// do evento, subiu pro core.\n//\n// A trava de scroll existe porque `showModal()` sozinho deixa o body rolar atr\u00E1s do\n// modal no iOS. Guardamos o scrollY, fixamos o body e devolvemos a posi\u00E7\u00E3o ao fechar \u2014\n// sem isso a p\u00E1gina \"pula pro topo\" quando o modal fecha.\n\nlet scrollTravado = 0;\n\nfunction travarPagina() {\n  scrollTravado = window.scrollY;\n  document.body.style.top = `-${scrollTravado}px`;\n  document.body.classList.add('is-locked');\n}\n\nfunction destravarPagina() {\n  document.body.classList.remove('is-locked');\n  document.body.style.top = '';\n  window.scrollTo(0, scrollTravado);\n}\n\n/** Embrulha um <dialog> com trava de scroll + fechar no X / backdrop / Esc. */\nexport function prepararDialog(dialog) {\n  if (!dialog || dialog.dataset.ready) return;\n  dialog.dataset.ready = '1';\n  dialog.addEventListener('click', (e) => {\n    const fechar = e.target.closest('[data-dialog-close], [data-mural-close]');\n    if (fechar || e.target === dialog) dialog.close();\n  });\n  // `close` cobre os tr\u00EAs jeitos de fechar: X, backdrop e Esc (que o browser dispara)\n  dialog.addEventListener('close', destravarPagina);\n  const abrir = dialog.showModal.bind(dialog);\n  dialog.showModal = () => {\n    travarPagina();\n    abrir();\n  };\n}\n\nexport function initDialogs() {\n  if (document.body.dataset.dialogsReady) return; // uma vez por p\u00E1gina, nunca duas\n  document.body.dataset.dialogsReady = '1';\n  document.querySelectorAll('dialog').forEach(prepararDialog);\n  // delegado, N\u00C3O no elemento: card trocado inteiro pelo HTMX (ex.: as expectativas\n  // quando algu\u00E9m fala ou apaga) mataria um listener preso nele\n  document.addEventListener('click', (e) => {\n    const abridor = e.target.closest('[data-mural-open], [data-dialog-open]');\n    if (!abridor) return;\n    const id = abridor.dataset.dialogOpen || 'mural-modal';\n    const dialog = document.getElementById(id);\n    if (!dialog || dialog.open) return; // showModal() em modal j\u00E1 aberto lan\u00E7a\n    prepararDialog(dialog); // idempotente \u2014 cobre dialog que chegou por HTMX\n    dialog.showModal();\n  });\n}\n", "// Tempo-ao-vivo compartilhado (mapa, p\u00E1gina do evento, ingressos):\n// contadores regressivos, estado do evento e slot atual do timetable.\n\nconst pad2 = (n) => String(n).padStart(2, '0');\n\nexport function fmtCountdown(ms) {\n  const total = Math.max(0, Math.floor(ms / 1000));\n  const d = Math.floor(total / 86400);\n  const h = Math.floor((total % 86400) / 3600);\n  const m = Math.floor((total % 3600) / 60);\n  if (d > 0) return `${d}d ${pad2(h)}h${pad2(m)}`;\n  return `${pad2(h)}:${pad2(m)}:${pad2(total % 60)}`;\n}\n\n// estado do evento agora: pre (conta pro come\u00E7o) | live (conta pro fim) | over\nexport function eventPhase(startsAt, endsAt, now = Date.now()) {\n  const start = new Date(startsAt).getTime();\n  const end = new Date(endsAt).getTime();\n  if (now < start) return { phase: 'pre', text: `come\u00E7a em ${fmtCountdown(start - now)}` };\n  if (now <= end) return { phase: 'live', text: `ao vivo \u00B7 termina em ${fmtCountdown(end - now)}` };\n  return { phase: 'over', text: 'encerrado' };\n}\n\n// pin do mapa: ao vivo (verde+notas) > hoje (rosa) > amanh\u00E3 (\u00E2mbar) > demais\nexport function pinState(startsAt, endsAt, now = new Date()) {\n  const start = new Date(startsAt);\n  if (now >= start && now <= new Date(endsAt)) return 'is-live';\n  const day = new Date(now);\n  day.setHours(0, 0, 0, 0);\n  const evDay = new Date(start);\n  evDay.setHours(0, 0, 0, 0);\n  const diff = Math.round((evDay - day) / 864e5);\n  if (diff === 0) return 'is-tonight';\n  if (diff === 1) return 'is-tomorrow';\n  return '';\n}\n\n// 'HH:MM' de cada slot vira Date ancorado no come\u00E7o do evento;\n// slot que \"volta no rel\u00F3gio\" cruzou a meia-noite (+1 dia, monot\u00F4nico)\nexport function slotDates(startsAt, lineupTimes) {\n  const start = new Date(startsAt);\n  let prev = null;\n  return lineupTimes.map((time) => {\n    const [h, m] = time.split(':').map(Number);\n    const dt = new Date(start);\n    dt.setHours(h, m, 0, 0);\n    while (prev && dt <= prev) dt.setDate(dt.getDate() + 1);\n    prev = dt;\n    return dt;\n  });\n}\n\n// \u00EDndice do ato tocando AGORA (-1 fora do per\u00EDodo do evento)\nexport function activeSlotIndex(startsAt, endsAt, slots, now = new Date()) {\n  if (now < new Date(startsAt) || now > new Date(endsAt)) return -1;\n  let idx = -1;\n  slots.forEach((dt, i) => {\n    if (dt <= now) idx = i;\n  });\n  return idx;\n}\n\n// registro \u00FAnico de elementos que atualizam por segundo;\n// quem sai do DOM \u00E9 descartado sozinho\nconst tickers = new Set();\nlet interval = null;\n\nexport function addTicker(el, update) {\n  tickers.add({ el, update });\n  update();\n  if (!interval) {\n    interval = setInterval(() => {\n      for (const t of tickers) {\n        if (!t.el.isConnected) {\n          tickers.delete(t);\n          continue;\n        }\n        t.update();\n      }\n    }, 1000);\n  }\n}\n\n// urg\u00EAncia do timer pela dist\u00E2ncia do come\u00E7o:\n//   >1h normal \u00B7 \u22641h 'soon' (amarelo) \u00B7 \u226430min 'imminent' (vermelho pscando) \u00B7 ao vivo 'live' (verde)\nconst HOUR = 3600e3;\nconst HALF_HOUR = 1800e3;\nexport function countdownUrgency(startsAt, phase, now = Date.now()) {\n  if (phase === 'live') return 'live';\n  if (phase !== 'pre') return ''; // over/encerrado: sem cor\n  const toStart = new Date(startsAt).getTime() - now;\n  if (toStart <= HALF_HOUR) return 'imminent';\n  if (toStart <= HOUR) return 'soon';\n  return '';\n}\n\n// linha de contador de um card (home/ingressos): pre/live/over + bolinha + cor de urg\u00EAncia\nexport function attachCountdown(container, startsAt, endsAt) {\n  const line = document.createElement('span');\n  line.className = 'rail-countdown';\n  line.innerHTML = '<span class=\"live-dot\" hidden></span><span class=\"rail-countdown-text\"></span>';\n  container.appendChild(line);\n  const text = line.querySelector('.rail-countdown-text');\n  const dot = line.querySelector('.live-dot');\n  addTicker(line, () => {\n    const now = Date.now();\n    const st = eventPhase(startsAt, endsAt, now);\n    text.textContent = st.text;\n    dot.hidden = st.phase !== 'live';\n    const urg = countdownUrgency(startsAt, st.phase, now);\n    line.classList.toggle('is-live', urg === 'live');\n    line.classList.toggle('is-soon', urg === 'soon');\n    line.classList.toggle('is-imminent', urg === 'imminent');\n    container.closest('.rail-card, .m-card, .ticket-stub')?.classList.toggle(\n      'is-live',\n      st.phase === 'live'\n    );\n  });\n  return line;\n}\n\n// marca o ato atual num <ol>/<ul> de timetable (li na ordem do lineup):\n// bolinha verde + timer decrescente do slot; ao zerar, re-marca o pr\u00F3ximo\nexport function markLiveSlot(listEl, startsAt, endsAt, lineupTimes) {\n  const rows = listEl.querySelectorAll('li');\n  const slots = slotDates(startsAt, lineupTimes);\n  const idx = activeSlotIndex(startsAt, endsAt, slots);\n  if (idx < 0 || !rows[idx]) return;\n  const li = rows[idx];\n  const badge = document.createElement('span');\n  badge.className = 'tt-live';\n  badge.innerHTML = '<span class=\"live-dot\"></span><span class=\"tt-timer\"></span>';\n  li.classList.add('is-playing');\n  li.appendChild(badge);\n  const slotEnd = slots[idx + 1] || new Date(endsAt);\n  const timer = badge.querySelector('.tt-timer');\n  addTicker(badge, () => {\n    const left = slotEnd - Date.now();\n    if (left <= 0) {\n      badge.remove();\n      li.classList.remove('is-playing');\n      markLiveSlot(listEl, startsAt, endsAt, lineupTimes);\n      return;\n    }\n    timer.textContent = fmtCountdown(left);\n  });\n}\n", "// P\u00E1gina do evento \u2014 previs\u00E3o hora a hora + compartilhar + stubs de compra.\n// P\u00E1gina \u00E9 server-rendered; JS aqui \u00E9 s\u00F3 o que precisa de rede/API do browser.\n\nimport { initAntigravity } from '../core/antigravity.js';\nimport { initDialogs } from '../core/dialog.js';\nimport { addTicker, attachCountdown, eventPhase, fmtCountdown, markLiveSlot } from '../lib/live.js';\n\nconst cfg = JSON.parse(document.getElementById('event-config').textContent);\n\nconst pad = (n) => String(n).padStart(2, '0');\nconst dayStr = (dt) => `${dt.getFullYear()}-${pad(dt.getMonth() + 1)}-${pad(dt.getDate())}`;\n\nfunction svgIcon(name) {\n  return `<svg class=\"size-4\" aria-hidden=\"true\"><use href=\"${cfg.iconsUrl}#icon-${name}\"></use></svg>`;\n}\n\nfunction wxIcon(code, hour) {\n  const night = hour >= 18 || hour < 6;\n  if (code === 0) return night ? 'moon' : 'sun';\n  if (code <= 3) return 'cloud';\n  if (code === 45 || code === 48) return 'cloud-fog';\n  if (code <= 57) return 'cloud-drizzle';\n  if (code <= 67 || (code >= 80 && code <= 82)) return 'cloud-rain';\n  if (code <= 77 || code === 85 || code === 86) return 'snowflake';\n  return 'cloud-lightning';\n}\n\nconst WX_MAX_DAYS = 14; // at\u00E9 onde a previs\u00E3o \u00E9 confi\u00E1vel (open-meteo d\u00E1 ~16)\n\nfunction wxDaysAway(start) {\n  return Math.floor((start.getTime() - Date.now()) / 86400e3);\n}\n\n// A previs\u00E3o s\u00F3 existe ~16 dias \u00E0 frente (open-meteo). Antes disso n\u00E3o adianta\n// consultar: em vez de \"indispon\u00EDvel\" \u2014 que soa como erro nosso \u2014 a gente diz que\n// o rol\u00EA ainda est\u00E1 longe e quando o tempo aparece.\nasync function loadWeather() {\n  const box = document.getElementById('wx');\n  const start = new Date(cfg.startsAt);\n  const end = new Date(start.getTime() + 5 * 3600e3);\n  const faltam = wxDaysAway(start);\n  if (faltam > WX_MAX_DAYS) {\n    box.innerHTML =\n      `<span class=\"meta-strip\">o rol\u00EA ainda est\u00E1 longe \u2014 faltam ${faltam} dias. ` +\n      `a previs\u00E3o aparece aqui quando faltarem ${WX_MAX_DAYS}.</span>`;\n    return;\n  }\n  try {\n    const url =\n      `https://api.open-meteo.com/v1/forecast?latitude=${cfg.lat}&longitude=${cfg.lng}` +\n      '&hourly=temperature_2m,precipitation_probability,weather_code' +\n      `&timezone=America%2FSao_Paulo&start_date=${dayStr(start)}&end_date=${dayStr(end)}`;\n    const resp = await fetch(url);\n    if (!resp.ok) throw new Error(`HTTP ${resp.status}`);\n    const data = await resp.json();\n    const cells = [];\n    for (let i = 0; i <= 5; i++) {\n      const dt = new Date(start.getTime() + i * 3600e3);\n      const idx = data.hourly.time.indexOf(`${dayStr(dt)}T${pad(dt.getHours())}:00`);\n      if (idx === -1) continue;\n      const rain = data.hourly.precipitation_probability?.[idx] ?? 0;\n      cells.push(\n        `<div class=\"wx-cell\" title=\"${rain}% de chance de chuva\">` +\n          `<span>${pad(dt.getHours())}h</span>` +\n          svgIcon(wxIcon(data.hourly.weather_code[idx], dt.getHours())) +\n          `<span class=\"wx-temp\">${Math.round(data.hourly.temperature_2m[idx])}\u00B0</span>` +\n          (rain >= 30 ? `<span>${rain}%</span>` : '') +\n          '</div>'\n      );\n    }\n    box.innerHTML = cells.join('') || '<span class=\"meta-strip\">sem dados pro hor\u00E1rio</span>';\n  } catch {\n    box.innerHTML = '<span class=\"meta-strip\">previs\u00E3o indispon\u00EDvel</span>';\n  }\n}\n\nfunction initShare() {\n  const share = async () => {\n    const payload = { title: `${cfg.title} \u2014 DEEVO`, url: location.href };\n    if (navigator.share) {\n      try {\n        await navigator.share(payload);\n      } catch {\n        /* usu\u00E1rio cancelou \u2014 sem drama */\n      }\n      return;\n    }\n    await navigator.clipboard.writeText(location.href);\n    window.deevoToast?.('Link copiado!', 'success');\n  };\n  // v\u00E1rios gatilhos: header flutuante (mobile) + linha de CTA (desktop)\n  document.querySelectorAll('[data-share]').forEach((btn) => btn.addEventListener('click', share));\n}\n\n// contador regressivo no hero (abaixo do local): cor por urg\u00EAncia via attachCountdown.\n// n\u00E3o mostra em evento j\u00E1 encerrado.\nfunction initCountdown() {\n  const box = document.getElementById('ev-countdown');\n  if (!box || !cfg.startsAt || !cfg.endsAt) return;\n  if (eventPhase(cfg.startsAt, cfg.endsAt).phase === 'over') return;\n  attachCountdown(box, cfg.startsAt, cfg.endsAt);\n}\n\n// LOCAL SECRETO: contador at\u00E9 o endere\u00E7o ser revelado. Mesma pe\u00E7a do contador do rol\u00EA\n// (cor por urg\u00EAncia), s\u00F3 que o alvo \u00E9 `address_reveal_at` \u2014 que \u00E9 sempre antes do evento.\nfunction initRevealCountdown() {\n  const box = document.querySelector('[data-reveal-at]');\n  const at = box?.dataset.revealAt;\n  if (!at) return;\n  attachCountdown(box, at, at);\n}\n\nfunction initLiveTimetable() {\n  const timetable = document.getElementById('timetable');\n  if (!timetable || !cfg.endsAt) return;\n  // uma marca\u00E7\u00E3o POR PISTA: com dois palcos rolando junto, cada um tem o seu \"agora\"\n  // (antes o \u00EDndice era contado no container inteiro e ca\u00EDa no artista errado).\n  const stages = timetable.querySelectorAll('[data-tt-stage]');\n  (stages.length ? stages : [timetable]).forEach((stage) => {\n    const times = [...stage.querySelectorAll('li[data-time]')].map((li) => li.dataset.time);\n    if (times.length) markLiveSlot(stage, cfg.startsAt, cfg.endsAt, times);\n  });\n}\n\n// timer ao vivo de retirada do pr\u00EAmio nos cards de sorteio j\u00E1 sorteado\nfunction initRaffleClaimTimers() {\n  document.querySelectorAll('[data-rl-claim-deadline]').forEach((el) => {\n    const end = new Date(el.dataset.rlClaimDeadline).getTime();\n    if (Number.isNaN(end)) return;\n    addTicker(el, () => {\n      const left = end - Date.now();\n      el.textContent = left <= 0 ? 'prazo encerrado' : fmtCountdown(left);\n    });\n  });\n}\n\n// \u2500\u2500 suspense do line-up: countdown do line-up completo + revela\u00E7\u00E3o por artista \u2500\u2500\n// bate no alvo \u2192 recarrega a p\u00E1gina 1x (o servidor ent\u00E3o serve os revelados).\nfunction initLineupSuspense() {\n  let reloadPending = false;\n  const scheduleReload = () => {\n    if (reloadPending) return;\n    reloadPending = true;\n    setTimeout(() => window.location.reload(), 1500);\n  };\n  const tick = (host, out, iso, onZero, label = (s) => s) => {\n    const target = new Date(iso).getTime();\n    if (Number.isNaN(target)) return;\n    addTicker(host, () => {\n      const left = target - Date.now();\n      if (left <= 0) {\n        out.textContent = onZero;\n        scheduleReload();\n        return;\n      }\n      out.textContent = label(fmtCountdown(left));\n    });\n  };\n  // banner \"line-up completo em \u2026\"\n  const banner = document.querySelector('[data-lineup-countdown]');\n  if (banner) {\n    const out = banner.querySelector('[data-lc-time]');\n    if (out) tick(banner, out, banner.dataset.lineupCountdown, 'no ar!');\n  }\n  // cada artista mist\u00E9rio do timetable conta pra sua pr\u00F3pria revela\u00E7\u00E3o\n  document.querySelectorAll('#timetable [data-reveal]').forEach((node) => {\n    const out = node.querySelector('[data-lc-reveal]');\n    if (out) tick(node, out, node.dataset.reveal, 'revelando\u2026', (s) => `revela em ${s}`);\n  });\n}\n\n// \u2500\u2500 parallax da capa: a imagem do hero desliza (levinho) com o mouse \u2500\u2500\n// desktop s\u00F3 (hover), respeita reduzir-movimento. Sem JS = imagem est\u00E1tica normal.\nfunction initHeroParallax() {\n  const hero = document.querySelector('.ev-hero.has-cover');\n  const cover = hero?.querySelector('.ev-hero-cover');\n  if (!cover) return;\n  if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n  if (!window.matchMedia('(hover: hover)').matches) return;\n  const MAX = 16; // deslocamento m\u00E1ximo em px\n  cover.style.transition = 'transform 0.18s ease-out';\n  cover.style.transform = 'scale(1.08)'; // zoom base pra o deslize n\u00E3o revelar as bordas\n  let raf = 0;\n  const onMove = (e) => {\n    const r = hero.getBoundingClientRect();\n    const dx = (e.clientX - (r.left + r.width / 2)) / (r.width / 2 || 1); // -1..1\n    const dy = (e.clientY - (r.top + r.height / 2)) / (r.height / 2 || 1);\n    cancelAnimationFrame(raf);\n    raf = requestAnimationFrame(() => {\n      cover.style.transform = `scale(1.08) translate(${(-dx * MAX).toFixed(1)}px, ${(-dy * MAX).toFixed(1)}px)`;\n    });\n  };\n  window.addEventListener('mousemove', onMove, { passive: true });\n  document.addEventListener('mouseleave', () => {\n    cancelAnimationFrame(raf);\n    cover.style.transform = 'scale(1.08)';\n  });\n}\n\n// os modais (expectativas + card\u00E1pios) agora v\u00EAm do core/dialog.js \u2014 o mesmo\n// comportamento \u00E9 usado pela p\u00E1gina da CASA, que n\u00E3o carrega este arquivo\n\n// o mini-mapa sob demanda virou core/lazy-map.js \u2014 a p\u00E1gina da CASA usa o mesmo\n\nloadWeather();\ninitShare();\ninitCountdown();\ninitRevealCountdown();\ninitLiveTimetable();\ninitRaffleClaimTimers();\ninitLineupSuspense();\ninitHeroParallax();\ninitDialogs();\ninitAntigravity(document, { subtle: true, ambient: true }); // pontinhos s\u00F3 pulsando no fundo\n"],
  "mappings": "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",
  "names": ["PINK", "VIOLET", "SPACING", "RADIUS", "BASE_R", "GROW", "TWO_PI", "mix", "r", "g", "b", "initAntigravity", "root", "opts", "canvas", "ctx", "reduce", "subtle", "ambient", "spacing", "grow", "idleA", "inflA", "beatAmt", "glowAmt", "W", "H", "dots", "raf", "t", "mouse", "build", "dpr", "jitter", "x", "y", "px", "py", "grad", "draw", "phase", "beat", "beatR", "p", "infl", "dx", "dy", "dist", "n", "twinkle", "target", "alpha", "loop", "toLocal", "e", "rt", "scrollTravado", "travarPagina", "destravarPagina", "prepararDialog", "dialog", "e", "abrir", "initDialogs", "abridor", "id", "pad2", "n", "fmtCountdown", "ms", "total", "d", "h", "m", "eventPhase", "startsAt", "endsAt", "now", "start", "end", "slotDates", "startsAt", "lineupTimes", "start", "prev", "time", "h", "m", "dt", "activeSlotIndex", "endsAt", "slots", "now", "idx", "i", "tickers", "interval", "addTicker", "el", "update", "t", "HOUR", "HALF_HOUR", "countdownUrgency", "phase", "toStart", "attachCountdown", "container", "line", "text", "dot", "st", "eventPhase", "urg", "markLiveSlot", "listEl", "rows", "li", "badge", "slotEnd", "timer", "left", "fmtCountdown", "cfg", "pad", "n", "dayStr", "dt", "svgIcon", "name", "wxIcon", "code", "hour", "night", "WX_MAX_DAYS", "wxDaysAway", "start", "loadWeather", "box", "end", "faltam", "url", "resp", "data", "cells", "i", "idx", "rain", "initShare", "share", "payload", "btn", "initCountdown", "eventPhase", "attachCountdown", "initRevealCountdown", "at", "initLiveTimetable", "timetable", "stages", "stage", "times", "li", "markLiveSlot", "initRaffleClaimTimers", "el", "addTicker", "left", "fmtCountdown", "initLineupSuspense", "reloadPending", "scheduleReload", "tick", "host", "out", "iso", "onZero", "label", "s", "target", "banner", "node", "initHeroParallax", "hero", "cover", "MAX", "raf", "onMove", "e", "dx", "dy", "initDialogs", "initAntigravity"]
}
