civicsetu / frontend /src /components /CitationsPanel.tsx
adeshboudh16
frontend: sync hf-safe logo and hydration updates
1714902
'use client';
import { useState } from 'react';
import { JURISDICTION_COLORS, JURISDICTION_LABELS } from '@/lib/constants';
import type { Citation } from '@/lib/types';
interface Props {
citations: Citation[];
}
export function CitationsPanel({ citations }: Props) {
const [open, setOpen] = useState(false);
return (
<div className="mt-3">
<button
type="button"
onClick={() => setOpen(value => !value)}
className="inline-flex items-center gap-2 font-mono text-[10px] uppercase tracking-[0.2em] text-white/30 transition-[color,transform] duration-150 ease-out hover:text-[#4f98a3] active:scale-[0.97]"
>
<span className={`transition-transform duration-150 ease-out ${open ? 'rotate-180' : ''}`}>
<svg suppressHydrationWarning xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 -960 960 960" width="20px" fill="#e3e3e3"><path d="M480-384 288-576h384L480-384Z"/></svg>
</span>
{citations.length} citation{citations.length === 1 ? '' : 's'}
</button>
{open ? (
<div className="mt-3 space-y-2">
{citations.map(citation => {
const color = JURISDICTION_COLORS[citation.jurisdiction] ?? '#888';
return (
<article key={citation.chunk_id} className="border border-white/[0.07] bg-white/[0.025] p-3">
<div className="flex items-start justify-between gap-3">
<div className="min-w-0 space-y-1">
<p className="font-mono text-[10px] uppercase tracking-[0.2em] text-white/30">
Sec {citation.section_id}
</p>
<p className="truncate text-[12px] font-medium text-white/70">{citation.doc_name}</p>
</div>
<span
className="shrink-0 px-1.5 py-0.5 font-mono text-[9px] uppercase tracking-[0.14em]"
style={{ backgroundColor: `${color}24`, color }}
>
{JURISDICTION_LABELS[citation.jurisdiction] ?? citation.jurisdiction}
</span>
</div>
<div className="mt-3 flex flex-wrap items-center gap-x-4 gap-y-2 font-mono text-[9px] uppercase tracking-[0.16em] text-white/30">
<span>Effective {citation.effective_date ?? 'not listed'}</span>
<a
href={citation.source_url}
target="_blank"
rel="noreferrer"
className="inline-block text-[#4f98a3] transition-[color,transform] duration-150 ease-out hover:text-[#8ad2de] active:scale-[0.97]"
>
Source
</a>
</div>
</article>
);
})}
</div>
) : null}
</div>
);
}