{
  "version": 3,
  "sources": ["../../../static_src/js/core/antigravity.js", "../../../static_src/js/core/dialog.js", "../../../static_src/js/lib/live.js", "../../../static_src/js/lib/previsao.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", "// A previs\u00E3o hora a hora DURANTE o rol\u00EA \u2014 a `.weather-strip`, viva.\n//\n// **A faixa anda com o rel\u00F3gio**, e essa regra nasceu no APP (`lib/previsao.dart`).\n// A web ficou pra tr\u00E1s mostrando 6 horas fixas a partir do come\u00E7o, inclusive\n// hora que j\u00E1 passou: o mesmo rol\u00EA respondia diferente nas duas telas, e a\n// resposta errada era a da web \u2014 depois que a festa come\u00E7ou, a previs\u00E3o das 22h\n// n\u00E3o informa mais nada e ocupa o lugar da que informa.\n//\n// A pergunta que a faixa responde n\u00E3o \u00E9 \u00ABcomo vai estar o tempo amanh\u00E3\u00BB, \u00E9\n// **\u00ABeu levo casaco pra essa festa?\u00BB**. Ent\u00E3o: rol\u00EA que n\u00E3o come\u00E7ou mostra a\n// janela inteira; rol\u00EA rolando come\u00E7a na hora ATUAL, que fica em destaque, e\n// cada hora que vira some da faixa e passa o destaque pra seguinte.\n//\n// \u26A0\uFE0F **Uma busca s\u00F3, e quem recorta \u00E9 a JANELA.** A s\u00E9rie da noite inteira fica\n// guardada e o rel\u00F3gio s\u00F3 reposiciona a janela \u2014 refazer o fetch a cada virada\n// de hora seria pedir de novo o que j\u00E1 est\u00E1 na m\u00E3o, numa API de terceiro.\n//\n// \u26A0\uFE0F **O destaque \u00E9 ROSA (o accent), e n\u00E3o o verde.** O verde do produto quer\n// dizer \u00ABo rol\u00EA est\u00E1 acontecendo\u00BB \u2014 o pino, o \u00ABtocando agora\u00BB, o contador. A\n// c\u00E9lula da previs\u00E3o diz outra coisa: \u00ABvoc\u00EA est\u00E1 aqui no rel\u00F3gio\u00BB. Com verde\n// seriam tr\u00EAs verdes na mesma tela respondendo perguntas diferentes.\n//\n// A fonte \u00E9 a open-meteo, chamada DIRETO do cliente: dado de terceiro que n\u00E3o\n// depende de nada nosso, e enfiar no servidor colocaria o produto na frente de\n// uma API que a gente n\u00E3o controla.\n\nexport const WX_MAX_DAYS = 14; // at\u00E9 onde a previs\u00E3o \u00E9 confi\u00E1vel (a API d\u00E1 ~16)\nexport const WX_CELLS = 6; // quantas horas a faixa mostra de uma vez\nconst WX_KEEP = 12; // teto da s\u00E9rie guardada \u2014 rol\u00EA de v\u00E1rios dias n\u00E3o vira tabela\n\nconst pad = (n) => String(n).padStart(2, '0');\nexport const dayStr = (dt) =>\n  `${dt.getFullYear()}-${pad(dt.getMonth() + 1)}-${pad(dt.getDate())}`;\n\nexport function wxDaysAway(start) {\n  return Math.floor((start.getTime() - Date.now()) / 86400e3);\n}\n\n// C\u00F3digo WMO \u2192 cara do tempo. A hora entra porque c\u00E9u limpo \u00E0s 3h da manh\u00E3 \u00E9\n// LUA, n\u00E3o sol \u2014 e rol\u00EA do DEEVO \u00E9 de madrugada.\nexport function 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\n// Busca a noite inteira: `[{ quando, temp, chuva, code }]`, no m\u00E1ximo WX_KEEP.\n//\n// Devolve `{ horas }` ou `{ recado }` \u2014 nunca os dois. O recado \u00E9 primeira\n// pessoa do produto, n\u00E3o erro de sistema: \u00ABo rol\u00EA ainda est\u00E1 longe\u00BB \u00E9 uma\n// resposta; \u00ABprevis\u00E3o indispon\u00EDvel\u00BB \u00E9 o que sobra quando a API n\u00E3o responde.\nexport async function buscarPrevisao({ lat, lng, startsAt }, signal) {\n  const start = new Date(startsAt);\n  const faltam = wxDaysAway(start);\n  if (faltam > WX_MAX_DAYS) {\n    return {\n      recado:\n        `o rol\u00EA ainda est\u00E1 longe \u2014 faltam ${faltam} dias. ` +\n        `a previs\u00E3o aparece aqui quando faltarem ${WX_MAX_DAYS}.`,\n    };\n  }\n  const fim = new Date(start.getTime() + (WX_KEEP - 1) * 3600e3);\n  const url =\n    `https://api.open-meteo.com/v1/forecast?latitude=${lat}&longitude=${lng}` +\n    '&hourly=temperature_2m,precipitation_probability,weather_code' +\n    `&timezone=America%2FSao_Paulo&start_date=${dayStr(start)}&end_date=${dayStr(fim)}`;\n  const resp = await fetch(url, signal ? { signal } : undefined);\n  if (!resp.ok) throw new Error(`HTTP ${resp.status}`);\n  const data = await resp.json();\n\n  const horas = [];\n  for (let i = 0; i < WX_KEEP; 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    horas.push({\n      quando: dt,\n      temp: Math.round(data.hourly.temperature_2m[idx]),\n      chuva: data.hourly.precipitation_probability?.[idx] ?? 0,\n      code: data.hourly.weather_code[idx],\n    });\n  }\n  return { horas, comeco: start };\n}\n\n// O recorte que a tela mostra AGORA \u2014 o port do `Previsao.janela` do app.\n//\n// Antes de come\u00E7ar, a janela \u00E9 o come\u00E7o do rol\u00EA em diante: a previs\u00E3o inteira,\n// que \u00E9 o que ajuda a decidir se vai. Depois que come\u00E7ou, a hora que passou sai\n// da faixa. `rolando` diz que a primeira c\u00E9lula \u00E9 o AGORA, e \u00E9 ela que a tela\n// destaca.\nexport function janelaDaPrevisao(horas, comeco, agora = new Date()) {\n    if (!horas?.length || !comeco) return { horas: [], rolando: false };\n  if (agora < comeco) {\n    return { horas: horas.slice(0, WX_CELLS), rolando: false };\n  }\n  // \u26A0\uFE0F A hora CORRENTE ainda vale a faixa inteira: \u00E0s 01:30 quem interessa \u00E9 a\n  // previs\u00E3o da 01h \u2014 a que est\u00E1 acontecendo \u2014, n\u00E3o a das 02h. Cortar por\n  // `>= agora` faria a c\u00E9lula do momento sumir meia hora cedo demais.\n  const estaHora = new Date(\n    agora.getFullYear(),\n    agora.getMonth(),\n    agora.getDate(),\n    agora.getHours()\n  );\n  const daqui = horas.filter((h) => h.quando >= estaHora);\n  return { horas: daqui.slice(0, WX_CELLS), rolando: daqui.length > 0 };\n}\n\n// Desenha a faixa. `svgIcon` vem de fora porque cada p\u00E1gina monta o `<use>` com\n// o sprite dela.\nexport function pintarPrevisao(box, previsao, svgIcon, agora = new Date()) {\n  if (!box) return;\n  if (previsao?.recado) {\n    box.innerHTML = `<span class=\"meta-strip\">${previsao.recado}</span>`;\n    return;\n  }\n  const { horas, rolando } = janelaDaPrevisao(\n    previsao?.horas,\n    previsao?.comeco,\n    agora\n  );\n  if (!horas.length) {\n    // Rol\u00EA que j\u00E1 acabou n\u00E3o tem previs\u00E3o pra mostrar, e \u00ABsem dados\u00BB soaria como\n    // falha nossa.\n    const acabou = previsao?.horas?.length && rolando === false;\n    box.innerHTML = `<span class=\"meta-strip\">${\n      acabou ? 'o rol\u00EA j\u00E1 acabou' : 'sem dados pro hor\u00E1rio'\n    }</span>`;\n    return;\n  }\n  box.innerHTML = horas\n    .map((h, i) => {\n      const hora = h.quando.getHours();\n      const agoraEssa = i === 0 && rolando;\n      return (\n        `<div class=\"wx-cell${agoraEssa ? ' is-now' : ''}\" title=\"${h.chuva}% de chance de chuva\">` +\n        `<span>${agoraEssa ? 'agora' : `${pad(hora)}h`}</span>` +\n        svgIcon(wxIcon(h.code, hora)) +\n        `<span class=\"wx-temp\">${h.temp}\u00B0</span>` +\n        (h.chuva >= 30 ? `<span>${h.chuva}%</span>` : '') +\n        '</div>'\n      );\n    })\n    .join('');\n}\n\n// Liga a faixa: busca uma vez e rep\u00F5e a janela a cada meio minuto.\n//\n// Meio minuto \u00E9 fino o bastante pra virada da hora n\u00E3o atrasar na tela e grosso\n// o bastante pra n\u00E3o custar nada \u2014 \u00E9 o mesmo intervalo do app.\nexport function ligarPrevisao(box, evento, svgIcon, signal) {\n  let previsao = null;\n  let timer = null;\n\n  const repintar = () => pintarPrevisao(box, previsao, svgIcon);\n\n  buscarPrevisao(evento, signal)\n    .then((p) => {\n      previsao = p;\n      repintar();\n      if (!p.recado) timer = setInterval(repintar, 30_000);\n    })\n    .catch((err) => {\n      if (err?.name === 'AbortError') return;\n      box.innerHTML = '<span class=\"meta-strip\">previs\u00E3o indispon\u00EDvel</span>';\n    });\n\n  return () => {\n    if (timer) clearInterval(timer);\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// \u26A0\uFE0F A regra da previs\u00E3o mora num lugar S\u00D3 (`lib/previsao.js`), e o motivo \u00E9\n// que ela morava em dois: este arquivo e o `panel.js` tinham o mesmo\n// `loadWeather` copiado, ent\u00E3o a faixa viva teria que ser escrita duas vezes \u2014\n// e as duas telas do mesmo rol\u00EA j\u00E1 respondiam diferente do app.\nimport { ligarPrevisao } from '../lib/previsao.js';\n\nconst cfg = JSON.parse(document.getElementById('event-config').textContent);\n\nfunction svgIcon(name) {\n  return `<svg class=\"size-4\" aria-hidden=\"true\"><use href=\"${cfg.iconsUrl}#icon-${name}\"></use></svg>`;\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\n// A faixa ANDA COM O REL\u00D3GIO: rol\u00EA rolando come\u00E7a na hora atual, e a hora que\n// vira sai da faixa. Antes daqui eram 6 horas fixas a partir do come\u00E7o,\n// inclusive hora que j\u00E1 passou \u2014 e a previs\u00E3o das 22h, \u00E0s 2 da manh\u00E3, ocupa o\n// lugar da que responde \u00ABlevo casaco?\u00BB.\nligarPrevisao(\n  document.getElementById('wx'),\n  { lat: cfg.lat, lng: cfg.lng, startsAt: cfg.startsAt },\n  svgIcon\n);\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", "pad", "n", "dayStr", "dt", "wxDaysAway", "start", "wxIcon", "code", "hour", "night", "buscarPrevisao", "lat", "lng", "startsAt", "signal", "faltam", "fim", "url", "resp", "data", "horas", "i", "idx", "janelaDaPrevisao", "comeco", "agora", "estaHora", "daqui", "h", "pintarPrevisao", "box", "previsao", "svgIcon", "rolando", "acabou", "hora", "agoraEssa", "ligarPrevisao", "evento", "timer", "repintar", "p", "err", "cfg", "svgIcon", "name", "initShare", "share", "payload", "btn", "initCountdown", "box", "eventPhase", "attachCountdown", "initRevealCountdown", "at", "initLiveTimetable", "timetable", "stages", "stage", "times", "li", "markLiveSlot", "initRaffleClaimTimers", "el", "end", "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", "ligarPrevisao", "initDialogs", "initAntigravity"]
}
