import { createSignal, For, Show } from "solid-js"; import { api, type ScreenRow } from "../lib/api"; import { Citations } from "../components/Citations"; const SAVED_KEY = "fs-saved-screeners"; export default function Screener() { const [mode, setMode] = createSignal<"where" | "q">("q"); const [q, setQ] = createSignal(""); const [brokerMin, setBrokerMin] = createSignal(0); const [rows, setRows] = createSignal([]); const [err, setErr] = createSignal(""); const loadSaved = (): Record => { try { return JSON.parse(localStorage.getItem(SAVED_KEY) || "{}"); } catch { return {}; } }; const [saved, setSaved] = createSignal>(loadSaved()); const [sname, setSname] = createSignal(""); async function run() { setErr(""); try { const body = mode() === "q" ? { q: q() || undefined, institutional: { broker_score_min: brokerMin() }, limit: 20 } : { where: q() || undefined, institutional: { broker_score_min: brokerMin() }, limit: 20 }; const r = await api.screen(body); setRows(r.rows); } catch (e) { setErr(String(e)); } } function save() { const all = { ...saved(), [sname().trim() || q().slice(0, 24) || "untitled"]: q() }; localStorage.setItem(SAVED_KEY, JSON.stringify(all)); setSaved(all); } return (

Institutional Screener

10T"} value={q()} onInput={(e) => setQ(e.currentTarget.value)} style={{ width: "320px" }} />

{err()}

{(r) => ( )}
SymbolCompositeBreakdownCitations
{r.symbol} {r.composite.toFixed(1)} {JSON.stringify(r.breakdown)}

Saved screeners

setSname(e.currentTarget.value)} style={{ width: "140px" }} />
    {([n, query]) =>
  • {query.slice(0, 60)}
  • }

Run a screen to see ranked rows with per-row signal breakdown.

); }