Ciągły podgląd katalogu: nowe, planowane, zamykające się i aktualne nabory z flagami
weryfikacji (termin · status · regulamin). Dane z API — bez mocków.
{KINDS.map((k) => (
{
setKind(k.id);
setFirmMode(false);
}}
className="btn"
style={{
background: kind === k.id && !firmMode ? `${k.color}22` : 'transparent',
border: `1px solid ${kind === k.id && !firmMode ? k.color : 'var(--border-subtle)'}`,
color: kind === k.id && !firmMode ? '#fff' : 'var(--text-secondary)',
borderRadius: 10,
padding: '0.55rem 0.9rem',
fontWeight: 700,
fontSize: '0.8rem',
}}
>
{k.label}
{counts && typeof counts[k.id] === 'number' ? ` (${counts[k.id]})` : ''}
))}
(firmMode ? setFirmMode(false) : void loadPulse(kind))}
style={{
marginLeft: 'auto',
display: 'inline-flex',
alignItems: 'center',
gap: 6,
background: 'transparent',
border: '1px solid var(--border-subtle)',
color: 'var(--text-secondary)',
}}
>
Odśwież
Doradca firmowy (Firm Pulse)
setNip(e.target.value)}
placeholder="NIP (10 cyfr)"
inputMode="numeric"
style={{
flex: '0 0 160px',
padding: '0.65rem 0.8rem',
borderRadius: 10,
border: '1px solid var(--border-subtle)',
background: 'var(--bg-base)',
color: 'var(--text-primary)',
}}
/>
setDescription(e.target.value)}
placeholder="Opis inwestycji / branża (opcjonalnie)"
style={{
flex: 1,
minWidth: 200,
padding: '0.65rem 0.8rem',
borderRadius: 10,
border: '1px solid var(--border-subtle)',
background: 'var(--bg-base)',
color: 'var(--text-primary)',
}}
/>
void runFirm()}
disabled={firmLoading}
style={{
display: 'inline-flex',
alignItems: 'center',
gap: 8,
background: 'linear-gradient(90deg, var(--accent-green), #3b82f6)',
color: '#000',
fontWeight: 800,
border: 'none',
borderRadius: 10,
padding: '0.65rem 1.1rem',
}}
>
{firmLoading ? : }
Dopasuj
{firmMode && firmData?.company && (
Firma: {(firmData.company as { name?: string }).name || '—'} · NIP{' '}
{(firmData.company as { nip?: string }).nip || nip || '—'}
{typeof firmData.alert_count === 'number' ? ` · alert-ready: ${firmData.alert_count}` : ''}
{!!firmData.gaps?.length && (
Luki rejestrów: {firmData.gaps.slice(0, 3).join(' · ')}
)}
)}
{quality && (
terminy: {Math.round((quality.deadline_rate || 0) * 100)}%
regulaminy: {Math.round((quality.regulation_rate || 0) * 100)}%
{quality.deadline_backfilled ? (
backfill z tekstu: {quality.deadline_backfilled}
) : null}
)}
{(loading || firmLoading) && (
)}
{!loading && !firmLoading && items.length === 0 && (
Brak pozycji dla wybranego rodzaju. Spróbuj „Aktualne” lub odśwież katalog naborów.
)}
);
}