{{ authError }}

TravelHub
{{ r.emoji }}
{{ r.label }} {{ r.sub }}

Olá, {{ user.name.split(' ')[0] }} 👋

{{ trips.length ? 'Para onde vamos hoje?' : 'Crie sua primeira viagem para começar.' }}

{{ statusLabel(t.status) }} {{ t.days_to_go === 0 ? 'É hoje! 🎉' : 'faltam ' + t.days_to_go + ' dias' }}

{{ t.name }}

📍 {{ [t.city, t.country].filter(Boolean).join(', ') || 'Destino a definir' }}

{{ dateBR(t.start_date) }} → {{ dateBR(t.end_date) }} · {{ t.duration_days }} dias

{{ money(t.spent) }}{{ t.budget > 0 ? ' de ' + money(t.budget) : ' gastos' }}

Nova viagem

🔔 Alertas

{{ a.icon }} {{ a.text }}
Contagem regressiva {{ dash.days_to_go === null ? '—' : (dash.days_to_go > 0 ? dash.days_to_go + ' dias' : (dash.days_to_go === 0 ? 'Hoje! 🎉' : 'Em viagem ✈️')) }} {{ dash.duration_days }} dias de viagem
Gastos totais {{ money(dash.spent) }}
Orçamento disponível {{ dash.budget_left === null ? '—' : money(dash.budget_left) }} de {{ money(dash.budget) }}
Checklist {{ dash.checklist_total ? (dash.checklist_total - dash.checklist_pending) + '/' + dash.checklist_total : '—' }} {{ dash.checklist_pending ? dash.checklist_pending + ' pendente(s)' : (dash.checklist_total ? 'completo ✅' : 'nada ainda') }}

☀️ Clima em {{ currentTrip.city || 'destino' }}

{{ Math.round(weather.now.temp) }}°C {{ weather.now.desc }}
{{ weekdayShort(d.date) }} {{ Math.round(d.max) }}° {{ Math.round(d.min) }}°

{{ weather ? weather.reason : 'Carregando…' }}

🌊 Tábua da maré

{{ weekdayShort(d.date) }} {{ d.date.slice(8,10) }}/{{ d.date.slice(5,7) }} {{ d.quality.level === 'good' ? '🟢' : (d.quality.level === 'ok' ? '🟡' : '🔴') }} {{ d.quality.label }}
{{ t.type === 'high' ? '▲' : '▼' }} {{ t.time }} {{ t.height }}m

⚓ {{ tides.source }}

{{ tides ? tides.reason : 'Carregando…' }}

💸 Gastos por categoria

Nenhum gasto registrado ainda.

✈️ Próximos voos

{{ f.origin }} → {{ f.destination }} {{ f.airline }} {{ f.flight_number }}
{{ dateTimeBR(f.depart_at) }}

Nenhum voo futuro cadastrado.

🏨 Próximos check-ins

{{ l.name }}
{{ dateTimeBR(l.checkin_at) }}

Nenhum check-in futuro.

Nenhuma passagem cadastrada.

✈️ {{ f.origin || '?' }} → {{ f.destination || '?' }}

{{ [f.airline, f.flight_number].filter(Boolean).join(' ') }} · reserva {{ f.booking_code }}

{{ money(f.price) }}
🛫 {{ dateTimeBR(f.depart_at) }} 🛬 {{ dateTimeBR(f.arrive_at) }} Portão {{ f.gate }} Assento {{ f.seat }} {{ f.cabin }} 🧳 {{ f.baggage }} Escalas: {{ f.stops }}

Nenhuma hospedagem cadastrada.

{{ lodgingEmoji(l.kind) }} {{ l.name }}

{{ l.address }}

{{ money(l.price) }}
Check-in {{ dateTimeBR(l.checkin_at) }} Check-out {{ dateTimeBR(l.checkout_at) }} 📞 {{ l.phone }} 🔗 Reserva

Nenhum transporte cadastrado.

{{ transportEmoji(t.kind) }} {{ transportLabel(t.kind) }} — {{ t.company }}

{{ t.origin }} → {{ t.destination }}

{{ money(t.price) }}
🕐 {{ dateTimeBR(t.depart_at) }}

Nenhum lugar salvo{{ placeFilter || placeSearch ? ' com esse filtro' : '' }}.

{{ placeCats[p.category] || p.category }} {{ p.name }} ✔️

{{ p.address }}

{{ '★'.repeat(p.rating) }}{{ '☆'.repeat(5 - p.rating) }}
⏱️ ~{{ p.visit_minutes }} min 🎟️ {{ money(p.ticket_price) }} 🕐 {{ p.opening_hours }} ⭐ Google 🦉 TripAdvisor

Dia livre — adicione eventos ou use o ✨ Gerar automático.

{{ e.time || '—' }} {{ eventEmoji(e.category) }}
{{ e.title }} {{ e.duration_min }} min · {{ e.notes }}
{{ weekdayShort(d) }} {{ d.slice(8,10) }}/{{ d.slice(5,7) }}
{{ e.time }} {{ eventEmoji(e.category) }} {{ e.title }}

livre

{{ calLabel }}
{{ w }}
{{ c.day }}
{{ ev.emoji }} {{ ev.label }}
+{{ c.items.length - 3 }}
Total gasto {{ money(moneySummary.total) }} {{ moneySummary.by_currency.map(c => c.currency + ' ' + c.total.toFixed(2)).join(' · ') }}
Orçamento restante {{ moneySummary.budget_left === null ? '—' : money(moneySummary.budget_left) }}
Média por dia {{ money(moneySummary.daily_avg) }}
Por pessoa {{ bp.name }}: {{ money(bp.total) }}

Por categoria

Por dia

Lançamentos

Nenhum gasto ainda.

{{ expCats[e.category] ? expCats[e.category].split(' ')[0] : '💸' }}
{{ e.description || (expCats[e.category] || e.category) }} {{ dateBR(e.date) }} · 👤 {{ personName(e.person_id) }} · {{ e.currency }}
{{ e.currency === 'BRL' ? money(e.amount) : e.amount.toFixed(2) + ' ' + e.currency }}

Adicionar item

{{ listName }}

{{ items.filter(i => i.done).length }}/{{ items.length }}
{{ i.text }}

Nenhum documento. Guarde passaporte, RG, seguro, vouchers…

{{ docKinds[d.kind] || '📄' }} {{ d.title }}

{{ d.trip_id ? 'Desta viagem' : 'Documento geral' }} · vence {{ dateBR(d.expires_at) }}

{{ docExpireBadge(d).text }}

Registre os momentos da viagem: fotos, textos e emoções, organizados por dia.

{{ j.mood }} {{ dateBR(j.date) }}

{{ j.text }}

Cadastre os acompanhantes para dividir gastos.

{{ p.name[0].toUpperCase() }}

{{ p.name }}

{{ p.contact }}

{{ money(personSpent(p.id)) }}

Dados da viagem

{{ tripFormMsg }}

Foto de capa

Zona de perigo

Excluir a viagem apaga todos os módulos dela. Não pode ser desfeito.

{{ toast }}