Não foi possível carregar os dados neste momento. Por favor, retorne em breve.
Briefing Intelligence
O Brasil que amamos, lido através dos números.
Uma leitura essencial do Brasil — fluxos turísticos, contexto econômico, segurança e sazonalidade — com o mundo como um discreto ponto de referência, nunca o assunto principal.
01 · Turismo
A curva de chegadas
Chegadas internacionais indexadas (primeiro ano rastreado = 100), a partir do histórico oficial do Brasil.
Chegadas internacionais — crescimento indexado
Onde o Brasil se posiciona
Percentil entre os países rastreados
—
02 · Economia
Contexto macroeconômico
Cada indicador mostra o valor do Brasil; a marca assinala a média mundial como ponto de referência.
Crescimento e inflação
Percentual, ano mais recente reportado
Lendo os números
O que esses números significam
03 · Segurança
O Brasil entre seus pares mais próximos
Um índice de segurança de 0 a 100 derivado dos níveis oficiais de alertas de viagem. O Brasil é destacado em relação aos países mais próximos na classificação geral.
Índice de segurança — Brasil vs. países com classificação próxima
BrasilMédia entre pares / mundial
04 · Clima e sazonalidade
Quando viajar, região por região
Índice mensal de conforto (0–100) para as cinco macrorregiões — útil para o planejamento sazonal de roteiros.
Índice de conforto mensal por região
Temperatura + precipitação combinadas · mais escuro = mais confortável
Menor confortoMaior conforto
Posicionamento
Brasil no ranking global
Países próximos da posição do Brasil na pontuação combinada (turismo + economia + segurança, com pesos iguais).
#
País
Turismo
Economia
Segurança
Combinado
Acesso privado
Além do benchmark público
Esta página apresenta a leitura essencial. O dossiê completo — séries históricas, detalhamento sub-regional e alertas de atualização — é reservado aos parceiros.
Perfil do destino
Um dossiê comparativo completo sobre o Brasil, atualizado trimestralmente.
Benchmark personalizado
Comparação direta com os destinos com os quais você efetivamente compete.
Monitoramento de sinais
Um alerta discreto sempre que um indicador apresentar mudança significativa.
${rank?.total_countries ?? "—"} países no benchmark
5 macro-regiões cobertas
Fontes: World Bank · US Dept of State · NASA POWER
Atualização de dados: ${d.generated_at ? new Date(d.generated_at).toLocaleDateString('pt-BR', {year:'numeric', month:'short', day:'numeric'}) : "—"}
`;
document.getElementById("ybi-footer-note").textContent =
`YourBrasil Intelligence — Brazil data desk · gerado em ${d.generated_at ? new Date(d.generated_at).toISOString() : "—"}`;
}
function renderTourism(d) {
const host = document.getElementById("chart-tourism-line".replace("chart", "ybi-chart"));
const series = d.brazil.international_arrivals?.series || [];
document.getElementById("ybi-tourism-src").innerHTML = srcLine(d.brazil.international_arrivals, "Série de chegadas");
if (series.length < 2) {
host.innerHTML = `Ainda não há pontos de dados históricos suficientes para traçar uma tendência (necessários pelo menos 2 anos).
`;
document.getElementById("ybi-tourism-sub").textContent = "Aguardando mais histórico";
} else {
const base = series[0].value || 1;
const indexed = series.map(s => ({ year: s.year, index: Math.round((s.value / base) * 100) }));
document.getElementById("ybi-tourism-sub").textContent = `${series[0].year} = 100 · Somente Brasil (veja a nota sobre comparabilidade mundial abaixo)`;
const W = host.clientWidth || 480, H = 220, PAD = { t: 14, r: 40, b: 26, l: 34 };
const values = indexed.map(p => p.index);
const yMin = Math.min(...values) - 10, yMax = Math.max(...values) + 10;
const svg = elx("svg", { width: "100%", height: H, viewBox: `0 0 ${W} ${H}` }, host);
const x = i => PAD.l + (i / (indexed.length - 1)) * (W - PAD.l - PAD.r);
const y = v => H - PAD.b - ((v - yMin) / (yMax - yMin)) * (H - PAD.t - PAD.b);
elx("line", { class: "ybi-axis-line", x1: PAD.l, x2: W - PAD.r, y1: H - PAD.b, y2: H - PAD.b }, svg);
indexed.forEach((p, i) => elx("text", { x: x(i), y: H - 6, "text-anchor": "middle", class: "ybi-muted", "font-size": 11 }, svg).textContent = p.year);
const pts = indexed.map((p, i) => `${x(i)},${y(p.index)}`).join(" ");
elx("polyline", { points: pts, fill: "none", stroke: "#C6A75E", "stroke-width": 2.5, "stroke-linejoin": "round", "stroke-linecap": "round" }, svg);
indexed.forEach((p, i) => elx("circle", { cx: x(i), cy: y(p.index), r: 4, fill: "#C6A75E", stroke: "#131F29", "stroke-width": 2 }, svg));
const lastI = indexed.length - 1;
elx("text", { x: x(lastI) + 8, y: y(indexed[lastI].index) + 4, "font-size": 12, "font-weight": 600, fill: "#C6A75E" }, svg).textContent = indexed[lastI].index;
const tt = tooltip(host);
svg.addEventListener("mousemove", (e) => {
const rect = svg.getBoundingClientRect();
const mx = e.clientX - rect.left;
let i = Math.round(((mx - PAD.l) / (W - PAD.l - PAD.r)) * (indexed.length - 1));
i = Math.max(0, Math.min(indexed.length - 1, i));
tt.show(x(i) * (rect.width / W), 26, `${indexed[i].year} Índice: ${indexed[i].index}`);
});
svg.addEventListener("mouseleave", () => tt.hide());
}
const tourismRank = d.ranking?.nearby?.find(r => r.iso3 === "BRA");
document.getElementById("ybi-tourism-pct").textContent = tourismRank?.tourism !== undefined && tourismRank?.tourism !== null ? tourismRank.tourism + "º" : "—";
document.getElementById("ybi-tourism-pct-context").textContent = "Posição percentil em chegadas internacionais entre todos os países rastreados — maior é mais chegadas.";
document.getElementById("ybi-tourism-pct-src").innerHTML = "Fonte: YourBrasil composite (posição percentil), derivado de dados de chegadas do World Bank";
}
function renderEconomy(d) {
const host = document.getElementById("ybi-meters");
const gdp = d.brazil.gdp_growth_pct, infl = d.brazil.inflation_pct;
const gdpWorld = d.world_context?.gdp_growth_avg, inflWorld = d.world_context?.inflation_avg;
function meterRow(label, metric, world, max) {
if (!metric) return `
${label}: não disponível nas fontes atualmente conectadas
`;
}
host.innerHTML = meterRow("Crescimento do PIB", gdp, gdpWorld, 8) + meterRow("Inflação", infl, inflWorld, 15);
const readHost = document.getElementById("ybi-economy-read");
let html = "";
if (gdp && gdpWorld) {
const delta = Math.round((gdp.value - gdpWorld.value) * 10) / 10;
html += `
${gdp.value.toFixed(1)}%
Crescimento do PIB em ${gdp.year} — ${Math.abs(delta)} pontos ${delta >= 0 ? "acima" : "abaixo"} da média mundial (${gdpWorld.value}%).
Fonte: ${gdp.source}
`;
}
if (infl && inflWorld) {
const delta = Math.round((infl.value - inflWorld.value) * 10) / 10;
html += `
${infl.value.toFixed(1)}%
Inflação em ${infl.year} — ${Math.abs(delta)} pontos ${delta >= 0 ? "acima" : "abaixo"} da média mundial (${inflWorld.value}%).
Fonte: ${infl.source}
`;
}
readHost.innerHTML = html || `
Dados econômicos indisponíveis nas fontes atualmente conectadas.
`;
}
function renderSafety(d) {
const host = document.getElementById("ybi-chart-safety-bar");
const nearby = (d.ranking?.nearby || []).filter(r => r.safety !== null && r.safety !== undefined);
const worldAvg = d.world_context?.safety_score_avg;
document.getElementById("ybi-safety-src").innerHTML = "Fonte: Avisos de Viagem do Departamento de Estado dos EUA, convertidos internamente para uma escala de 0-100";
document.getElementById("ybi-safety-sub").textContent = "0-100, maior = mais seguro · países mais próximos do Brasil no ranking geral";
if (!nearby.length) {
host.innerHTML = `
Dados de segurança indisponíveis nas fontes atualmente conectadas.
`;
tbody.appendChild(tr);
});
}
function ordinalSuffix(n) {
const j = n % 10, k = n % 100;
if (j === 1 && k !== 11) return "º";
if (j === 2 && k !== 12) return "º";
if (j === 3 && k !== 13) return "º";
return "º";
}
fetch(DATA_URL, { cache: "no-store" })
.then(r => { if (!r.ok) throw new Error("HTTP " + r.status); return r.json(); })
.then(d => {
if (Array.isArray(d)) d = d[0] || {};
if (!d.brazil) throw new Error("Dados sem 'brazil' — verifique a saída do fluxo n8n.");
document.getElementById("ybi-loading").classList.add("ybi-hidden");
document.getElementById("ybi-content").classList.remove("ybi-hidden");
renderKPIs(d);
renderTourism(d);
renderEconomy(d);
renderSafety(d);
renderClimate(d);
renderRanking(d);
})
.catch(err => {
document.getElementById("ybi-loading").classList.add("ybi-hidden");
const errEl = document.getElementById("ybi-error");
errEl.textContent = "Não foi possível carregar os dados no momento (" + err.message + "). Por favor, retorne em breve.";
errEl.classList.remove("ybi-hidden");
});
})();
Utilizamos cookies para entender como os visitantes usam este site. Cookies essenciais estão sempre ativos; cookies analíticos são configurados apenas com o seu consentimento.Política de Privacidade
Preferências de cookies
Cookies essenciais
Necessários para o funcionamento do site — não podem ser desativados.
Cookies analíticos
O Google Analytics nos ajuda a entender o uso do site. Desativado até você permitir.