File size: 7,073 Bytes
85dca58 79cf005 85dca58 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | /* App shell + cold-start state + spec sections that live below the
prototype: typography spec, palette spec, glyph spec, MapLibre style.json
fragments, layout grids, PDF template preview, accessibility checklist,
design rationale, reference register sketches.
*/
const SAMPLE_QUERIES = [
{ mode: "address", q: "80 Pioneer Street, Red Hook, Brooklyn",
sub: "Address-mode · Sandy edge · IBZ · NYCHA proximity" },
{ mode: "neighborhood", q: "Far Rockaway flood exposure briefing",
sub: "Neighborhood-mode · chronic stormwater · 2050 SLR" },
{ mode: "development", q: "Hunts Point proposed rezoning , flood-context check",
sub: "Development-check · CEQR §817 · 311 proxy density" },
];
const ColdStart = ({ onPick, onSubmit }) => {
const [v, setV] = useState("");
return (
<section className="cold-start" aria-label="Empty query state">
<div className="cold-start-band">
<p className="cold-start-deck">
<strong>Riprap</strong> is a citation-grounded Flood Exposure Briefing tool for New York City.
Type an address, neighborhood, or proposed development , Riprap returns a written briefing
where every numeric claim links to its primary public-record source.
</p>
<p className="cold-start-deck cold-start-deck-secondary">
Built for agency analysts, planners, journalists, community boards, and researchers.
<strong> Not for individual residents making personal property decisions.</strong>
{" "}For residents seeking flood guidance, see <a href="https://www.floodhelpny.org" className="cold-start-redir">FloodHelpNY</a>.
For real-time conditions, see <a href="https://www.floodnet.nyc" className="cold-start-redir">FloodNet NYC</a>.
</p>
</div>
<form
className="cold-start-form"
onSubmit={(e) => { e.preventDefault(); onSubmit?.(v); }}
role="search"
>
<label htmlFor="riprap-query" className="cold-start-label section-label">Query</label>
<div className="cold-start-input-row">
<input
id="riprap-query"
type="text"
value={v}
onChange={(e) => setV(e.target.value)}
placeholder="address · neighborhood · proposed development"
className="cold-start-input"
autoComplete="off"
/>
<button type="submit" className="cold-start-submit">Generate briefing →</button>
</div>
</form>
<div className="cold-start-samples">
<span className="section-label cold-start-samples-label">Sample queries</span>
<div className="cold-start-samples-grid">
{SAMPLE_QUERIES.map((s, i) => (
<button
key={i}
type="button"
className="cold-start-sample"
onClick={() => onPick?.(s)}
>
<span className="cold-start-sample-mode">{s.mode}</span>
<span className="cold-start-sample-q">{s.q}</span>
<span className="cold-start-sample-sub">{s.sub}</span>
<span className="cold-start-sample-arrow" aria-hidden="true">↗</span>
</button>
))}
</div>
</div>
<div className="cold-start-trust">
<span className="section-label">How Riprap is built</span>
<p className="cold-start-thesis">
<span className="cold-start-thesis-stone-dot cold-start-thesis-stone-dot-cornerstone" aria-hidden="true"></span><strong>Cornerstone</strong> remembers.{" "}
<span className="cold-start-thesis-stone-dot cold-start-thesis-stone-dot-keystone" aria-hidden="true"></span><strong>Keystone</strong> tallies.
{" "}<span className="cold-start-thesis-stone-dot cold-start-thesis-stone-dot-touchstone" aria-hidden="true"></span><strong>Touchstone</strong> watches.{" "}
<span className="cold-start-thesis-stone-dot cold-start-thesis-stone-dot-lodestone" aria-hidden="true"></span><strong>Lodestone</strong> projects.
{" "}<span className="cold-start-thesis-stone-dot cold-start-thesis-stone-dot-capstone" aria-hidden="true"></span><strong>Capstone</strong> writes it all down with citations.
</p>
<ul className="cold-start-trust-list">
<li>Five named cognitive roles compose ~25 atomic specialists. <a href="#spec-stones">Architecture →</a></li>
<li>All foundation models <strong>Apache-2.0</strong>; no commercial APIs at runtime.</li>
<li>All data from public-record federal, state, and city sources.</li>
<li>Four epistemic tiers , empirical, modeled, proxy, synthetic prior , visible in the briefing margin and the trace.</li>
<li>Sections without supporting documents are omitted entirely. Silence over confabulation.</li>
</ul>
<a href="#methodology" className="cold-start-method-link">Methodology paper →</a>
</div>
</section>
);
};
const AppHeader = ({ query, onResetCold, onOpenMethodology }) => (
<header className="app-header" data-screen-label="App header">
<div className="app-header-inner">
<div className="app-header-left">
<span className="riprap-wordmark" aria-label="Riprap">riprap</span>
<span className="app-header-sep">/</span>
<span className="app-header-context">Flood Exposure Briefing</span>
</div>
<div className="app-header-mid">
<button
type="button"
className="app-header-query"
onClick={onResetCold}
aria-label="Edit query"
>
<span className="app-header-query-icon" aria-hidden="true">⌕</span>
<span className="app-header-query-text">{query}</span>
<span className="app-header-query-edit">edit</span>
</button>
</div>
<div className="app-header-right">
<a className="app-header-link" href="#methodology" onClick={(e) => { e.preventDefault(); onOpenMethodology?.(); }}>methodology</a>
<a className="app-header-link" href="#export-pdf">export PDF</a>
<span className="app-header-status" aria-live="polite">
<span className="app-header-status-dot" aria-hidden="true"></span>
live
</span>
</div>
</div>
</header>
);
const AppFooter = () => (
<footer className="app-footer">
<div className="app-footer-inner">
<p className="app-footer-guard">
<strong>Riprap does not predict damage.</strong>
{" "}This tool is for professional analytical work, not personal property decisions.
For residents, see <a href="https://www.floodhelpny.org">FloodHelpNY</a> · <a href="https://www.floodnet.nyc">FloodNet NYC</a>.
</p>
<p className="app-footer-build">
All foundation models Apache-2.0 · All data from public-record federal, state, and city sources · No commercial APIs contacted at runtime · Riprap v0.4.3 · build 2026-05-05
</p>
</div>
</footer>
);
Object.assign(window, { ColdStart, AppHeader, AppFooter });
|