<body>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Rastreio Premium - Sistema Logístico</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap" rel="stylesheet">
<style>
:root {
--primary: #4f46e5;
--primary-dark: #3730a3;
--success: #10b981;
--text-main: #1e293b;
--text-sec: #64748b;
--dark-grey-bg: #f8fafc;
--light-text: #334155;
--label-grey: #64748b;
--bright-green: #059669;
--card-shadow: 0 10px 30px -5px rgba(0, 0, 0, 0.12), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
--card-hover-shadow: 0 25px 35px -5px rgba(0, 0, 0, 0.15), 0 10px 10px -5px rgba(0, 0, 0, 0.08);
}
* {
box-sizing: border-box;
font-family: 'Inter', sans-serif;
}
body {
background-color: #f8fafc;
background-image: none;
margin: 0;
padding: 24px;
min-height: 100vh;
}
.container {
max-width: 1400px;
margin: 0 auto;
padding-bottom: 80px;
}
#feed {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(340px, 1fr));
gap: 24px;
justify-content: center;
}
.card {
background: #ffffff;
border-radius: 12px;
padding: 24px;
box-shadow: var(--card-shadow);
border-top: 5px solid var(--primary);
transition: transform 0.2s ease, box-shadow 0.2s ease;
content-visibility: auto;
display: flex;
flex-direction: column;
justify-content: space-between;
width: 100%;
}
.card:hover {
transform: translateY(-4px);
box-shadow: var(--card-hover-shadow);
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
gap: 10px;
}
.code {
color: var(--primary-dark);
font-weight: 800;
font-size: 1.15rem;
letter-spacing: 0.5px;
white-space: nowrap;
}
.status-badge {
display: flex;
align-items: center;
gap: 6px;
background: #dcfce7;
color: #166534;
padding: 6px 14px;
border-radius: 6px;
font-size: 0.75rem;
font-weight: 800;
text-transform: uppercase;
white-space: nowrap;
}
.status-dot {
width: 8px;
height: 8px;
background-color: #166534;
border-radius: 50%;
display: inline-block;
}
.client-name {
font-weight: 700;
font-size: 1.1rem;
color: var(--text-main);
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 20px;
}
.route-path {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
padding: 16px;
border: 1px dashed #cbd5e1;
margin-bottom: 20px;
background: #ffffff;
border-radius: 8px;
}
.city-tag {
background: white;
color: var(--text-main);
padding: 8px 14px;
border-radius: 6px;
font-size: 0.85rem;
font-weight: 700;
display: flex;
align-items: center;
gap: 6px;
border: 1px solid #e2e8f0;
box-shadow: 0 1px 2px rgba(0,0,0,0.05);
white-space: nowrap;
}
.separator {
flex-grow: 1;
height: 2px;
background: linear-gradient(to right, #cbd5e1 50%, transparent 50%);
background-size: 8px 2px;
}
.timeline-footer {
display: flex;
justify-content: space-between;
background: #f8fafc;
border-radius: 8px;
padding: 16px;
border: 1px solid #e2e8f0;
gap: 10px;
}
.step {
display: flex;
flex-direction: column;
flex: 1;
}
.step-label {
font-size: 0.65rem;
text-transform: uppercase;
font-weight: 800;
color: var(--label-grey);
margin-bottom: 6px;
white-space: nowrap;
}
.step-val {
font-size: 0.95rem;
font-weight: 700;
color: var(--text-main);
white-space: nowrap;
}
.delivery-time {
color: var(--bright-green);
text-align: right;
}
.stats-counter {
position: fixed;
bottom: 20px;
right: 20px;
background: var(--primary);
color: white;
padding: 12px 24px;
border-radius: 30px;
box-shadow: 0 10px 25px -5px rgba(79, 70, 229, 0.5);
font-weight: 800;
font-size: 0.95rem;
z-index: 100;
transition: transform 0.1s ease;
}
.pulse-animation {
transform: scale(1.05);
}
@media (max-width: 600px) {
body {
padding: 8px;
}
.container {
padding-bottom: 70px;
}
#feed {
grid-template-columns: 1fr;
gap: 16px;
}
.card {
padding: 16px;
}
.card-header {
margin-bottom: 16px;
}
.code {
font-size: 1.05rem;
}
.status-badge {
padding: 6px 10px;
font-size: 0.7rem;
}
.client-name {
font-size: 1rem;
margin-bottom: 16px;
}
.route-path {
padding: 12px 10px;
margin-bottom: 16px;
}
.city-tag {
padding: 6px 10px;
font-size: 0.8rem;
}
.timeline-footer {
padding: 12px;
}
.step-val {
font-size: 0.85rem;
}
.stats-counter {
bottom: 15px;
right: 15px;
left: 15px;
text-align: center;
}
}
</style>
<div class="container">
<div id="feed"></div>
</div>
<div class="stats-counter" id="counter">Carregando...</div>
<script>
const agoraInicio = new Date();
const inicioDoDia = new Date(agoraInicio.getFullYear(), agoraInicio.getMonth(), agoraInicio.getDate());
let entregasTotais = Math.floor((agoraInicio - inicioDoDia) / 5000);
function atualizarContador() {
const counterElement = document.getElementById('counter');
counterElement.classList.add('pulse-animation');
counterElement.innerText = `${entregasTotais.toLocaleString('pt-BR')} Pedidos Entregues nas últimas 48H`;
entregasTotais++;
setTimeout(() => {
counterElement.classList.remove('pulse-animation');
}, 200);
const intervalos = [1000, 3000, 5000];
const proximoTempo = intervalos[Math.floor(Math.random() * intervalos.length)];
setTimeout(atualizarContador, proximoTempo);
}
atualizarContador();
const nomes = [
"Miguel", "Arthur", "Gael", "Théo", "Heitor", "Ravi", "Davi", "Bernardo", "Noah", "Gabriel", "Samuel", "Pedro", "Lucas", "Benjamin", "Matheus", "Isaac", "Joaquim", "Anthony", "Lorenzo", "Adryan", "Pietro", "Gustavo", "Nicolas", "Murilo", "Vitor", "Leonardo", "Bento", "Enzo", "Henry", "João", "Lucca", "Emanuel", "Cauã", "Felipe", "Eduardo", "Yuri", "Benício", "Augusto", "Vinícius", "Bryan", "Santino", "Tiago", "Jorge", "Ruan", "Alexandre", "Otávio", "Caleb", "Matias", "Josué", "Danilo",
"Helena", "Alice", "Laura", "Maria", "Sophia", "Manuela", "Maitê", "Liz", "Cecília", "Isabella", "Luísa", "Eloá", "Heloísa", "Júlia", "Ayla", "Valentina", "Antonella", "Ísis", "Maya", "Lívia", "Lorena", "Giovanna", "Beatriz", "Mariana", "Clara", "Bianca", "Aurora", "Larissa", "Emanuelly", "Isadora", "Ana", "Sarah", "Rebeca", "Vitória", "Yasmin", "Marina", "Alícia", "Lavínia", "Pietra", "Bella", "Nicole", "Mirella", "Stella", "Olívia", "Jade", "Clarice", "Luna", "Catarina", "Zoe", "Malu",
"Rafael", "Diego", "Bruno", "Marcelo", "Thiago", "Fernando", "Ricardo", "Rodrigo", "Marcos", "Paulo", "Carlos", "Roberto", "Luiz", "Antônio", "Francisco", "José", "Leandro", "Anderson", "Douglas", "Fábio", "André", "Caio", "Breno", "Ícaro", "Kauê", "Renato", "Victor", "Daniel", "Wesley", "William", "Washington", "Cleber", "Emerson", "Everton", "Gilberto", "Igor", "Juliano", "Julio", "Kauã", "Levi", "Luan", "Márcio", "Mário", "Mauro", "Michel", "Pablo", "Patrick", "Renan", "Robson", "Wallace",
"Aline", "Amanda", "Bruna", "Camila", "Carolina", "Daniela", "Fernanda", "Gabriela", "Jéssica", "Juliana", "Letícia", "Luciana", "Marcela", "Natália", "Patrícia", "Priscila", "Renata", "Roberta", "Sabrina", "Tatiane", "Thaís", "Vanessa", "Alessandra", "Bárbara", "Caroline", "Cíntia", "Cristiane", "Débora", "Eliane", "Fabiana", "Flávia", "Franciele", "Gisele", "Gleice", "Jaqueline", "Joana", "Josefa", "Joyce", "Kátia", "Kelly", "Laís", "Leila", "Márcia", "Marlene", "Michele", "Mônica", "Naiara", "Paloma", "Pamela", "Paula", "Raquel", "Rita", "Rosana", "Sandra", "Silvana", "Simone", "Sônia", "Suelen", "Talita", "Tatiana", "Valéria"
];
const sobrenomes = [
"Silva", "Santos", "Oliveira", "Souza", "Rodrigues", "Ferreira", "Alves", "Pereira", "Lima", "Gomes", "Costa", "Ribeiro", "Martins", "Carvalho", "Almeida", "Lopes", "Soares", "Fernandes", "Vieira", "Barbosa", "Arantes", "Machado", "Rocha", "Dias", "Moreira", "Nunes", "Marques", "Teixeira", "Mendes", "Freitas", "Cardoso", "Ramos", "Gonçalves", "Santana", "Borges", "Melo", "Pinto", "Cavalcante", "Araújo", "Correia", "Castro", "Azevedo", "Pires", "Miranda", "Barros", "Monteiro", "Moraes", "Andrade", "Nascimento", "Cavalcanti", "Fontes", "Medeiros", "Magalhães", "Duarte", "Guimarães", "Maia", "Siqueira", "Farias", "Porto", "Xavier", "Viana", "Brito", "Figueiredo", "Batista", "Pacheco", "Guedes", "Neves", "Valente", "Bezerra", "Peixoto", "Tavares", "Queiroz", "Aguiar", "Arruda", "Mesquita", "Mello", "Sales", "Cunha", "Macedo", "Dantas", "Varela", "Simões", "Passos", "Bueno", "Garrido", "Paredes", "Pontes", "Lins", "Lira", "Chagas", "Falcão", "Bermudes", "Nolasco", "Amaral", "Muniz", "Rezende"
];
const destinos = [
{ uf: "AC", cidade: "Rio Branco" }, { uf: "AL", cidade: "Maceió" }, { uf: "AP", cidade: "Macapá" },
{ uf: "AM", cidade: "Manaus" }, { uf: "BA", cidade: "Salvador" }, { uf: "CE", cidade: "Fortaleza" },
{ uf: "DF", cidade: "Brasília" }, { uf: "ES", cidade: "Vitória" }, { uf: "GO", cidade: "Goiânia" },
{ uf: "MA", cidade: "São Luís" }, { uf: "MT", cidade: "Cuiabá" }, { uf: "MS", cidade: "Campo Grande" },
{ uf: "MG", cidade: "Belo Horizonte" }, { uf: "PA", cidade: "Belém" }, { uf: "PB", cidade: "João Pessoa" },
{ uf: "PR", cidade: "Curitiba" }, { uf: "PE", cidade: "Recife" }, { uf: "PI", cidade: "Teresina" },
{ uf: "RJ", cidade: "Rio de Janeiro" }, { uf: "RN", cidade: "Natal" }, { uf: "RS", cidade: "Porto Alegre" },
{ uf: "RO", cidade: "Porto Velho" }, { uf: "RR", cidade: "Boa Vista" }, { uf: "SC", cidade: "Florianópolis" },
{ uf: "SP", cidade: "São Paulo" }, { uf: "SE", cidade: "Aracaju" }, { uf: "TO", cidade: "Palmas" }
];
const nomesUsados = new Set();
function gerarNomeUnico() {
let nomeCompleto;
do {
const n = nomes[Math.floor(Math.random() * nomes.length)];
const s = sobrenomes[Math.floor(Math.random() * sobrenomes.length)];
nomeCompleto = `${n} ${s}`;
} while (nomesUsados.has(nomeCompleto));
nomesUsados.add(nomeCompleto);
return nomeCompleto;
}
function gerarEncomenda() {
const dest = destinos[Math.floor(Math.random() * destinos.length)];
const nomeStr = gerarNomeUnico();
// --- NOVA LÓGICA DE DATA E HORA ---
let dEntrega = new Date(); // Pega o dia e hora de AGORA
dEntrega.setHours(dEntrega.getHours() - 2); // Volta exatas 2 horas no tempo
dEntrega.setMinutes(Math.floor(Math.random() * 60)); // Sorteia os minutos para não ficar tudo idêntico
let dEnvio = new Date(dEntrega);
const diasAtras = Math.floor(Math.random() * 7) + 5;
dEnvio.setDate(dEnvio.getDate() - diasAtras);
const codigo = `PY${Math.floor(Math.random() * 1000000000).toString().padStart(9, '0')}BR`;
const opt = { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute:'2-digit' };
return {
codigo, nome: nomeStr, local: `${dest.cidade}/${dest.uf}`,
envio: dEnvio.toLocaleDateString('pt-BR', opt),
entrega: dEntrega.toLocaleDateString('pt-BR', opt),
dias: diasAtras
};
}
const feed = document.getElementById('feed');
const frag = document.createDocumentFragment();
for (let i = 0; i < 750; i++) {
const item = gerarEncomenda();
const el = document.createElement('div');
el.className = 'card';
el.innerHTML = `
<div class="card-header">
<span class="code">${item.codigo}</span>
<div class="status-badge">
<span class="status-dot"></span>
ENTREGUE
</div>
</div>
<div class="client-name">
<svg width="20" height="20" fill="none" stroke="var(--primary)" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"></path></svg>
${item.nome}
</div>
<div class="route-path">
<span class="city-tag">🇵🇾 PY</span>
<div class="separator"></div>
<svg width="20" height="20" fill="none" stroke="var(--primary-dark)" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 5l7 7-7 7M5 5l7 7-7 7"></path></svg>
<div class="separator"></div>
<span class="city-tag">🇧🇷 ${item.local}</span>
</div>
<div class="timeline-footer">
<div class="step">
<span class="step-label">Postagem</span>
<span class="step-val">${item.envio}</span>
</div>
<div class="step" style="text-align: right;">
<span class="step-label">Chegada (+${item.dias} Dias)</span>
<span class="step-val delivery-time">${item.entrega}</span>
</div>
</div>
`;
frag.appendChild(el);
}
feed.appendChild(frag);
</script>
</body>
