TSX40 linhas1.961 bytes
apps/web/src/components/senador/ResumoTramitacao.tsx
SHA-256
dc9ed4e403990956b4c239341966523d86d10dd88ceb1d0419bef2fafdc896ae
Somente leiturafonte-0531042d9f3e
import type { ResumoTramitacao as Resumo } from '@/lib/types'
const ETAPAS = [
['sem_avanco', 'Sem avanço comprovado', '0'],
['instrucao', 'Avanço deliberativo', '1'],
['aprovado_senado', 'Aprovadas no Senado', '2'],
['camara', 'Destinadas à Câmara', '2'],
['sancao', 'À sanção ou promulgação', '3'],
['norma', 'Transformadas em norma', '4'],
] as const
export default function ResumoTramitacao({ resumo }: { resumo: Resumo }) {
return (
<section className="mt-6 rounded-sm border border-border bg-surface p-5">
<h3 className="font-serif text-xl font-semibold text-ink">Até onde avançaram as proposições</h3>
<p className="mt-2 text-sm text-muted">
{resumo.normativas} proposições normativas apresentadas na janela avaliada.
Cada projeto aparece uma vez, no maior avanço comprovado até{' '}
{resumo.dataCorte.split('-').reverse().join('/')}.
</p>
<dl className="mt-4 grid grid-cols-2 gap-4 md:grid-cols-3">
{ETAPAS.map(([etapa, rotulo, pontos]) => (
<div key={etapa}>
<dt className="text-xs text-muted">{rotulo} · {pontos} {pontos === '1' ? 'ponto' : 'pontos'}</dt>
<dd className="mt-1 font-mono text-xl text-ink">{resumo.porEtapa[etapa]}</dd>
</div>
))}
</dl>
<p className="mt-4 text-sm text-muted">
Avanço ponderado: <strong className="text-ink">{(100 * resumo.proporcao).toLocaleString('pt-BR', { maximumFractionDigits: 1 })}%</strong>{' '}
do máximo possível, antes do ajuste por tamanho da amostra. Não é o percentual de projetos que viraram lei.
Requerimentos e indicações contam na produtividade; a efetividade considera apenas proposições normativas.
</p>
{resumo.evidenciasSemData > 0 && (
<p className="mt-2 text-xs text-muted">Há registros de avanço sem data verificável; eles não acrescentam pontos.</p>
)}
</section>
)
}