ux v0.4.5: nine polish deltas on the Findings region
Browse filesSurgical polish on the shipped v0.4.4 Findings region. None of these
are structural; the card grammar, briefing prose, Mellea status strip,
four-tier palette, cold-start, footer, and PDF template all stay.
P1 — Status semantics (V0.4.5_SPEC §1, "actively misrepresenting
system integrity"). Splits the FSM specialist status from the
four-state ok|warn|error|silent into the five-state
fired / silent_by_design / warned / errored / not_invoked.
- lib/types/card.ts gains a documented SpecialistStatus union
- StoneTally / RunHealthStrip / ProvenanceTrace updated to
branch on the new states
- cardAdapter mapStatus() carefully classifies FSM trace-silent
as silent_by_design, not errored — the spec voice
- Top tally now reads "5 Stones · 21 fired · 5 silent · 1
errored · 24.0s · 25 registered" instead of the old "15/18
functions fired · 3 error" lie
P2 — Capstone meta-card field plumbing (§2). Wires the four metrics
to the reconciler's actual state. Mellea attempts is one-indexed
(initial pass + N rerolls), so attempts=2 surfaces as "1 reroll".
Clean Red Hook now shows "1 reroll · 4/4 grounding · 4 citations
· 24.0s" instead of zeros.
P3 — Full specialist roster (§3). New lib/data/stoneRegistry.ts
listing every specialist each Stone could fire, plus a one-line
skip reason. cardAdapter.fillRosterForStone() projects the
registry over the run's actual members; absent specialists
render as not_invoked with their registered skip reason. The
auditability contract: a reader expanding any Stone sees the
full intended inventory, never a filtered subset.
P4 — Touchstone gains TerraMind LULC + Prithvi-NYC-Pluvial cards
(§4). New lulc card variant with a horizontal stacked class-mix
bar (urban / water / vegetation / barren / wetland — palette is
a layer convention, NOT a tier signal). Prithvi card now uses
the "Prithvi-NYC-Pluvial" source label per spec. Adapter
translates FSM class_fractions into the design-system class-mix
shape with a small bucket router.
P5 — Lodestone gains the fine-tuned TTM Battery card alongside the
existing zero-shot (§5). New timeseries-ft variant whose footer
chrome carries: HF model-card link, RMSE 0.157 m,
"−35% vs persistence" skill chip, AMD MI300X hardware badge.
Title strings on both Lodestone TTM cards updated to make the
pair read as "9.6h regional zero-shot" vs "96h NYC-specialized
fine-tune".
P6 — Drop the "anomaly" tag (§6). The new status counts carry the
same information without the redundant label.
P7 — Stone-tinted accent tokens (§9). Five new CSS vars in tokens.css
(--stone-cornerstone / -keystone / -touchstone / -lodestone /
-capstone), all sit at L≈45 OKLCH, chroma ≤0.04. Applied as:
- 3px left-rule on each StoneRegion header
- 6px dot beside Stone names in the cold-start "How Riprap is
built" five-line list (newly added; replaces nothing)
Print-media override drops all five to #999.
P8 — Hover linking shipped (§8). RipMap accepts a linkedKey prop;
when set the map root gets a 2px accent outline + a "linked: <key>"
badge bottom-right. Click-to-fitBounds() on register rows is
documented as a follow-up — needs a MapLibre handle plumbed
through FindingsRegion → StoneRegion → FindingCard → RegisterBody
plus a register-points feature index keyed by sourceId.
P9 — LAYERS panel restructured by Stone (§7). MapLegend rewrites into
a Stone-grouped catalog with 13 layer rows across the three
spatial Stones, plus the explicit "no map layers — see Findings
cards" row under Lodestone and "not a map layer" under Capstone.
Each Stone section gets its tinted left-rule. Master tier
toggles (the four switches that actually drive map visibility)
sit at the bottom; per-Stone rows resolve ON/OFF from those.
Rows whose layers aren't yet wired into the map render with a
dimmed "off · catalog" caption so the inventory is honest about
what's plumbed vs catalog-only.
Sample fixture (lib/data/findingsSample.ts) + the live route's adapter
both updated to drive the new card variants and statuses. Run-health
strip now lists totals in the spec-voice order.
Build clean, type-check unchanged at 5 pre-existing errors / 3
pre-existing warnings (all in unrelated files). The prerendered
build/q/sample.html carries fc-timeseries-ft + fc-lulc + 5 ×
silent_by_design + 4 × not_invoked + the −35% / MI300X / HF model-card
markers.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- web/sveltekit/build/200.html +9 -9
- web/sveltekit/build/_app/immutable/assets/0.KpTzaSsX.css +0 -0
- web/sveltekit/build/_app/immutable/assets/0.MHa9rmVP.css +0 -0
- web/sveltekit/build/_app/immutable/assets/2.BkIzAsIp.css +1 -0
- web/sveltekit/build/_app/immutable/assets/FindingsRegion.NjYRUAvf.css +0 -1
- web/sveltekit/build/_app/immutable/assets/stoneRegistry.bHiraU77.css +1 -0
- web/sveltekit/build/_app/immutable/chunks/{yTOzveqN.js → B07kFGr7.js} +1 -1
- web/sveltekit/build/_app/immutable/chunks/BV_WLJ_i.js +0 -1
- web/sveltekit/build/_app/immutable/chunks/Bu5KOiaf.js +27 -0
- web/sveltekit/build/_app/immutable/chunks/BwzbOVaY.js +1 -0
- web/sveltekit/build/_app/immutable/chunks/CAli5X_k.js +0 -27
- web/sveltekit/build/_app/immutable/entry/{app.DXmMqCY7.js → app.CWOfOFvh.js} +2 -2
- web/sveltekit/build/_app/immutable/entry/start.CBEzc0_C.js +0 -1
- web/sveltekit/build/_app/immutable/entry/start.CN51yZti.js +1 -0
- web/sveltekit/build/_app/immutable/nodes/{0.BOY_jD4V.js → 0.D8XZI90P.js} +1 -1
- web/sveltekit/build/_app/immutable/nodes/{1.rUM1MjPf.js → 1.DGS2cZTl.js} +1 -1
- web/sveltekit/build/_app/immutable/nodes/{2.DUHn2QIZ.js → 2.CiK-Ot3Z.js} +2 -2
- web/sveltekit/build/_app/immutable/nodes/{3.B4iCcTlf.js → 3.DjnrtyPP.js} +1 -1
- web/sveltekit/build/_app/immutable/nodes/4.C7yZGpb8.js +0 -1
- web/sveltekit/build/_app/immutable/nodes/4.rD3Yr4HV.js +1 -0
- web/sveltekit/build/_app/immutable/nodes/5.CAXEzxjD.js +1 -0
- web/sveltekit/build/_app/immutable/nodes/5.CBtbiPE_.js +0 -1
- web/sveltekit/build/_app/version.json +1 -1
- web/sveltekit/build/index.html +12 -11
- web/sveltekit/build/q/sample.html +0 -0
- web/sveltekit/src/lib/client/cardAdapter.ts +91 -35
- web/sveltekit/src/lib/components/findings/ProvenanceTrace.svelte +35 -7
- web/sveltekit/src/lib/components/findings/RunHealthStrip.svelte +28 -16
- web/sveltekit/src/lib/components/findings/StoneRegion.svelte +24 -5
- web/sveltekit/src/lib/components/findings/StoneTally.svelte +15 -5
- web/sveltekit/src/lib/components/findings/cards/CardBody.svelte +6 -0
- web/sveltekit/src/lib/components/findings/cards/LulcBody.svelte +117 -0
- web/sveltekit/src/lib/components/findings/cards/RegisterBody.svelte +10 -0
- web/sveltekit/src/lib/components/findings/cards/TimeseriesFtBody.svelte +79 -0
- web/sveltekit/src/lib/components/map/MapLegend.svelte +290 -55
- web/sveltekit/src/lib/components/map/RipMap.svelte +31 -2
- web/sveltekit/src/lib/components/shell/ColdStart.svelte +62 -0
- web/sveltekit/src/lib/data/findingsSample.ts +84 -38
- web/sveltekit/src/lib/data/stoneRegistry.ts +296 -0
- web/sveltekit/src/lib/tokens.css +23 -0
- web/sveltekit/src/lib/types/card.ts +44 -2
- web/sveltekit/src/routes/q/[queryId]/+page.svelte +1 -0
- web/sveltekit/src/routes/q/sample/+page.svelte +1 -0
|
@@ -6,33 +6,33 @@
|
|
| 6 |
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
| 7 |
<meta name="description" content="Riprap — citation-grounded NYC flood-exposure briefings." />
|
| 8 |
<title>Riprap — flood-exposure briefing</title>
|
| 9 |
-
<link href="/_app/immutable/entry/start.
|
| 10 |
-
<link href="/_app/immutable/chunks/
|
| 11 |
<link href="/_app/immutable/chunks/DwbuJhNu.js" rel="modulepreload">
|
| 12 |
-
<link href="/_app/immutable/entry/app.
|
| 13 |
<link href="/_app/immutable/chunks/1oGnrPC6.js" rel="modulepreload">
|
| 14 |
<link href="/_app/immutable/chunks/Dlpu43Tj.js" rel="modulepreload">
|
| 15 |
<link href="/_app/immutable/chunks/8F5LpR-T.js" rel="modulepreload">
|
| 16 |
-
<link href="/_app/immutable/nodes/0.
|
| 17 |
<link href="/_app/immutable/chunks/DNaFzQeI.js" rel="modulepreload">
|
| 18 |
-
<link href="/_app/immutable/chunks/
|
| 19 |
<link href="/_app/immutable/chunks/DFFHaukH.js" rel="modulepreload">
|
| 20 |
|
| 21 |
-
<link href="/_app/immutable/assets/0.
|
| 22 |
</head>
|
| 23 |
<body data-sveltekit-preload-data="hover">
|
| 24 |
<div style="display: contents">
|
| 25 |
<script>
|
| 26 |
{
|
| 27 |
-
|
| 28 |
base: ""
|
| 29 |
};
|
| 30 |
|
| 31 |
const element = document.currentScript.parentElement;
|
| 32 |
|
| 33 |
Promise.all([
|
| 34 |
-
import("/_app/immutable/entry/start.
|
| 35 |
-
import("/_app/immutable/entry/app.
|
| 36 |
]).then(([kit, app]) => {
|
| 37 |
kit.start(app, element);
|
| 38 |
});
|
|
|
|
| 6 |
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
| 7 |
<meta name="description" content="Riprap — citation-grounded NYC flood-exposure briefings." />
|
| 8 |
<title>Riprap — flood-exposure briefing</title>
|
| 9 |
+
<link href="/_app/immutable/entry/start.CN51yZti.js" rel="modulepreload">
|
| 10 |
+
<link href="/_app/immutable/chunks/BwzbOVaY.js" rel="modulepreload">
|
| 11 |
<link href="/_app/immutable/chunks/DwbuJhNu.js" rel="modulepreload">
|
| 12 |
+
<link href="/_app/immutable/entry/app.CWOfOFvh.js" rel="modulepreload">
|
| 13 |
<link href="/_app/immutable/chunks/1oGnrPC6.js" rel="modulepreload">
|
| 14 |
<link href="/_app/immutable/chunks/Dlpu43Tj.js" rel="modulepreload">
|
| 15 |
<link href="/_app/immutable/chunks/8F5LpR-T.js" rel="modulepreload">
|
| 16 |
+
<link href="/_app/immutable/nodes/0.D8XZI90P.js" rel="modulepreload">
|
| 17 |
<link href="/_app/immutable/chunks/DNaFzQeI.js" rel="modulepreload">
|
| 18 |
+
<link href="/_app/immutable/chunks/B07kFGr7.js" rel="modulepreload">
|
| 19 |
<link href="/_app/immutable/chunks/DFFHaukH.js" rel="modulepreload">
|
| 20 |
|
| 21 |
+
<link href="/_app/immutable/assets/0.MHa9rmVP.css" rel="stylesheet">
|
| 22 |
</head>
|
| 23 |
<body data-sveltekit-preload-data="hover">
|
| 24 |
<div style="display: contents">
|
| 25 |
<script>
|
| 26 |
{
|
| 27 |
+
__sveltekit_43llsk = {
|
| 28 |
base: ""
|
| 29 |
};
|
| 30 |
|
| 31 |
const element = document.currentScript.parentElement;
|
| 32 |
|
| 33 |
Promise.all([
|
| 34 |
+
import("/_app/immutable/entry/start.CN51yZti.js"),
|
| 35 |
+
import("/_app/immutable/entry/app.CWOfOFvh.js")
|
| 36 |
]).then(([kit, app]) => {
|
| 37 |
kit.start(app, element);
|
| 38 |
});
|
|
The diff for this file is too large to render.
See raw diff
|
|
|
|
The diff for this file is too large to render.
See raw diff
|
|
|
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
.cold-start-stones.svelte-7xcb6n{list-style:none;margin:12px 0 16px;padding:0;display:flex;flex-direction:column;gap:6px}.cold-start-stones.svelte-7xcb6n li:where(.svelte-7xcb6n){display:flex;align-items:baseline;gap:10px;font-family:var(--font-sans);font-size:14px;color:var(--ink-secondary);line-height:1.5}.cold-start-stones.svelte-7xcb6n em:where(.svelte-7xcb6n){font-family:var(--font-serif);font-style:italic;font-size:16px;color:var(--ink);margin-right:2px}.stone-dot.svelte-7xcb6n{display:inline-block;width:6px;height:6px;border-radius:50%;flex:none;align-self:center}
|
|
@@ -1 +0,0 @@
|
|
| 1 |
-
.citation-drawer.svelte-1p339fd a{color:inherit;border-bottom:1px solid var(--rule-soft);text-decoration:none}.citation-drawer.svelte-1p339fd a:hover{border-bottom-color:var(--accent);color:var(--accent)}.rip-map-container.svelte-wk2bu4{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%}.map-frame.svelte-wk2bu4{aspect-ratio:8 / 5.6;position:relative}.rh.svelte-1vuwkv4{display:flex;align-items:center;flex-wrap:wrap;gap:var(--s-2);padding:var(--s-2) var(--s-4);background:var(--paper-deep);border-top:1px solid var(--rule-soft);border-bottom:1px solid var(--rule-soft);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em}.rh-item.svelte-1vuwkv4 strong:where(.svelte-1vuwkv4){font-weight:600;color:var(--ink);margin-right:2px}.rh-sep.svelte-1vuwkv4{opacity:.5}.rh-silent.svelte-1vuwkv4{color:var(--ink-tertiary)}.rh-warn.svelte-1vuwkv4{color:#b7791f}.rh-err.svelte-1vuwkv4{color:#b91c1c}.body-headline.svelte-lygj3j{padding:var(--s-3) var(--s-4) var(--s-2);display:flex;flex-direction:column;gap:var(--s-1)}.fc.is-compact .body-headline.svelte-lygj3j{padding:var(--s-2) var(--s-3)}.headline.svelte-lygj3j{font-family:var(--font-serif);font-style:italic;font-size:28px;font-weight:500;line-height:1.1;letter-spacing:-.01em}.fc.is-compact .headline.svelte-lygj3j{font-size:22px}.subhead.svelte-lygj3j{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em}.body-prose.svelte-lygj3j{margin:var(--s-2) 0 0;font-size:13px;line-height:1.45;color:var(--ink-secondary)}.body-tabular.svelte-1nlkuao{padding:var(--s-2) var(--s-4) var(--s-3)}.fc.is-compact .body-tabular.svelte-1nlkuao{padding:var(--s-2) var(--s-3)}.t.svelte-1nlkuao{width:100%;border-collapse:collapse;font-family:var(--font-mono);font-size:12px}.t.svelte-1nlkuao th:where(.svelte-1nlkuao){text-align:left;font-weight:500;color:var(--ink-tertiary);padding:4px 8px 4px 0;border-bottom:1px solid var(--rule-soft);text-transform:lowercase;letter-spacing:.04em}.t.svelte-1nlkuao td:where(.svelte-1nlkuao){padding:4px 8px 4px 0;border-bottom:1px solid var(--rule-soft);color:var(--ink)}.t.svelte-1nlkuao tr:where(.svelte-1nlkuao):last-child td:where(.svelte-1nlkuao){border-bottom:0}.fc.is-compact .t.svelte-1nlkuao th:where(.svelte-1nlkuao),.fc.is-compact .t.svelte-1nlkuao td:where(.svelte-1nlkuao){padding:2px 6px 2px 0;font-size:11px}.body-sub.svelte-1nlkuao{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-scalars.svelte-stf9c8{padding:var(--s-3) var(--s-4) var(--s-3)}.fc.is-compact .body-scalars.svelte-stf9c8{padding:var(--s-2) var(--s-3)}.row.svelte-stf9c8{display:grid;grid-template-columns:repeat(auto-fit,minmax(80px,1fr));gap:var(--s-3)}.cell.svelte-stf9c8{display:flex;flex-direction:column;gap:2px}.value.svelte-stf9c8{font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500;line-height:1.1}.label.svelte-stf9c8{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.06em;text-transform:lowercase}.body-sub.svelte-stf9c8{margin-top:var(--s-3);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-spark.svelte-jrppts{padding:var(--s-3) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-1)}.fc.is-compact .body-spark.svelte-jrppts{padding:var(--s-2) var(--s-3)}.headline.svelte-jrppts{font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500;line-height:1.1}.subhead.svelte-jrppts{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em;margin-bottom:var(--s-1)}svg.svelte-jrppts{display:block}.body-sub.svelte-jrppts{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-timeseries.svelte-48vbub{padding:var(--s-3) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-2)}.fc.is-compact .body-timeseries.svelte-48vbub{padding:var(--s-2) var(--s-3)}.ts-header.svelte-48vbub{display:flex;align-items:baseline;flex-wrap:wrap;gap:var(--s-2)}.headline.svelte-48vbub{font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500;line-height:1.1}.subhead.svelte-48vbub{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em}svg.svelte-48vbub{display:block}.body-sub.svelte-48vbub{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5;display:flex;flex-direction:column;gap:2px}.spatial-note.svelte-48vbub{color:var(--accent);font-style:italic}.body-forecast.svelte-gqkhpe{padding:var(--s-3) var(--s-4) var(--s-3)}.fc.is-compact .body-forecast.svelte-gqkhpe{padding:var(--s-2) var(--s-3)}svg.svelte-gqkhpe{display:block}.body-sub.svelte-gqkhpe{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}svg.svelte-1lx1psy{display:block}.thumb-placeholder.svelte-1lx1psy{height:120px;background:var(--paper-deep);display:flex;align-items:center;justify-content:center;color:var(--ink-tertiary);font-family:var(--font-mono);font-size:11px;border:1px dashed var(--rule-soft)}.body-raster.svelte-1m43x1m{padding:var(--s-2) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-2)}.fc.is-compact .body-raster.svelte-1m43x1m{padding:var(--s-2) var(--s-3)}.frame.svelte-1m43x1m{position:relative;border:1px solid var(--rule-soft)}.illustrative.svelte-1m43x1m{position:absolute;top:6px;right:6px;background:#1a1a1ab3;color:var(--paper);font-family:var(--font-mono);font-size:9px;padding:2px 6px;letter-spacing:.05em;text-transform:lowercase}.raster-headline.svelte-1m43x1m{font-family:var(--font-mono);font-size:12px;color:var(--ink)}.raster-headline.svelte-1m43x1m span:where(.svelte-1m43x1m):first-child{font-family:var(--font-serif);font-style:italic;font-size:18px;font-weight:500}.body-sub.svelte-1m43x1m{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-register.svelte-1iup6im{padding:var(--s-2) var(--s-4) var(--s-3)}.fc.is-compact .body-register.svelte-1iup6im{padding:var(--s-2) var(--s-3)}.reg-list.svelte-1iup6im{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}.reg-row.svelte-1iup6im{display:grid;grid-template-columns:70px 1fr auto;gap:var(--s-2);align-items:baseline;padding:5px 0;border-bottom:1px solid var(--rule-soft);font-family:var(--font-mono);font-size:12px;line-height:1.4}.reg-row.svelte-1iup6im:last-child{border-bottom:0}.fc.is-compact .reg-row.svelte-1iup6im{padding:3px 0;font-size:11px}.reg-tag.svelte-1iup6im{display:inline-flex;gap:4px;align-items:center;color:var(--ink-tertiary);text-transform:uppercase;letter-spacing:.05em;font-weight:500}.reg-label.svelte-1iup6im{color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.reg-source.svelte-1iup6im{color:var(--ink-tertiary);font-size:10px;letter-spacing:.05em}.reg-silent.svelte-1iup6im{grid-column:2 / span 2;color:var(--ink-tertiary);font-style:italic}.reg-row.silent.svelte-1iup6im{opacity:.65}.body-sub.svelte-1iup6im{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-comparison.svelte-1swqabu{padding:var(--s-3) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-2)}.fc.is-compact .body-comparison.svelte-1swqabu{padding:var(--s-2) var(--s-3)}.cmp-grid.svelte-1swqabu{display:grid;grid-template-columns:1fr auto 1fr;gap:var(--s-3);align-items:stretch}.cell.svelte-1swqabu{display:flex;flex-direction:column;gap:4px}.cell-tier.svelte-1swqabu{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.05em;text-transform:lowercase}.cell-value.svelte-1swqabu{font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500}.cell-aux.svelte-1swqabu{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary)}.divider.svelte-1swqabu{align-self:center;font-family:var(--font-serif);font-style:italic;font-size:14px;color:var(--ink-tertiary);padding-top:18px}.cmp-delta.svelte-1swqabu{font-family:var(--font-mono);font-size:11px;color:var(--ink);border-top:1px solid var(--rule-soft);padding-top:var(--s-2)}.body-sub.svelte-1swqabu{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-meta.svelte-e40scu{padding:var(--s-2) var(--s-4) var(--s-3)}.fc.is-compact .body-meta.svelte-e40scu{padding:var(--s-2) var(--s-3)}.meta-list.svelte-e40scu{margin:0;display:grid;grid-template-columns:1fr;gap:4px}.meta-row.svelte-e40scu{display:grid;grid-template-columns:minmax(110px,max-content) 1fr;gap:var(--s-3);padding:3px 0;border-bottom:1px solid var(--rule-soft);align-items:baseline}.meta-row.svelte-e40scu:last-child{border-bottom:0}dt.svelte-e40scu{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);text-transform:lowercase;letter-spacing:.04em}dd.svelte-e40scu{margin:0;font-family:var(--font-mono);font-size:12px;color:var(--ink)}.body-sub.svelte-e40scu{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.unknown.svelte-1x6xqhh{padding:var(--s-3) var(--s-4);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary)}.fc.svelte-1nuvnzu{background:var(--paper);border:1px solid var(--rule-soft);display:flex;flex-direction:column;transition:background-color .2s ease,border-color .2s ease,outline-color .2s ease;outline:0 solid transparent;outline-offset:0;color:inherit;text-align:left;font:inherit;padding:0;width:100%;animation:svelte-1nuvnzu-fc-fade-in .36s ease-out both}@keyframes svelte-1nuvnzu-fc-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.fc.is-interactive.svelte-1nuvnzu{cursor:pointer}.fc.svelte-1nuvnzu:hover{background:var(--paper-deep)}.fc.is-linked.svelte-1nuvnzu{outline:2px solid var(--accent-graphical);outline-offset:0}.has-illustrative.svelte-1nuvnzu,.fc-tier-synthetic.svelte-1nuvnzu{border-top:1px dashed var(--tier-synthetic-line)}.fc-head.svelte-1nuvnzu{display:flex;justify-content:space-between;align-items:center;padding:var(--s-2) var(--s-4);border-bottom:1px solid var(--rule-soft);background:var(--paper-deep)}.fc.is-compact .fc-head.svelte-1nuvnzu{padding:6px var(--s-3)}.fc-head-source.svelte-1nuvnzu{display:inline-flex;align-items:center;gap:var(--s-2);font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--ink)}.fc-head-source-label.svelte-1nuvnzu{cursor:help}.fc-head-vintage.svelte-1nuvnzu{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.05em}.fc-title.svelte-1nuvnzu{margin:0;padding:var(--s-3) var(--s-4) 0;font-family:var(--font-sans);font-size:14px;font-weight:600;line-height:1.35;color:var(--ink)}.fc.is-compact .fc-title.svelte-1nuvnzu{padding:var(--s-2) var(--s-3) 0;font-size:13px}.fc-foot.svelte-1nuvnzu{display:flex;justify-content:space-between;align-items:center;padding:var(--s-2) var(--s-4);border-top:1px solid var(--rule-soft);background:var(--paper-deep);gap:var(--s-3);margin-top:auto}.fc.is-compact .fc-foot.svelte-1nuvnzu{padding:6px var(--s-3)}.fc-foot-cite.svelte-1nuvnzu{display:inline-flex;align-items:center;gap:4px;background:transparent;border:0;padding:0;cursor:pointer;font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;color:var(--accent)}.fc-foot-cite.svelte-1nuvnzu:hover{color:var(--ink)}.fc-foot-docid.svelte-1nuvnzu{text-transform:uppercase}.fc-foot-docid-mute.svelte-1nuvnzu{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.05em;text-transform:uppercase}.fc-foot-arrow.svelte-1nuvnzu{font-family:var(--font-mono);font-size:11px}.fc-tier-badge.svelte-1nuvnzu{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);font-size:10px;font-weight:500;letter-spacing:.08em;text-transform:uppercase}.fc-tier-badge-empirical.svelte-1nuvnzu{color:var(--tier-empirical)}.fc-tier-badge-modeled.svelte-1nuvnzu{color:var(--tier-modeled)}.fc-tier-badge-proxy.svelte-1nuvnzu{color:var(--tier-proxy)}.fc-tier-badge-synthetic.svelte-1nuvnzu{color:var(--tier-synthetic)}.tally.svelte-1qqbvs2{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em;flex-wrap:wrap}strong.svelte-1qqbvs2{font-weight:600;color:var(--ink)}.silent.svelte-1qqbvs2 strong:where(.svelte-1qqbvs2){color:var(--ink-tertiary)}.warn.svelte-1qqbvs2 strong:where(.svelte-1qqbvs2){color:#b7791f}.err.svelte-1qqbvs2 strong:where(.svelte-1qqbvs2){color:#b91c1c}.sep.svelte-1qqbvs2{color:var(--ink-tertiary);opacity:.6}.prov-tree.svelte-qakefz{list-style:none;margin:0;padding:0;padding-left:calc(var(--depth, 0) * 16px)}.prov-row.svelte-qakefz{display:grid;grid-template-columns:14px max-content max-content 1fr auto;gap:var(--s-2);align-items:baseline;padding:3px 0;font-family:var(--font-mono);font-size:11px;border-bottom:1px dotted var(--rule-soft)}.prov-row.svelte-qakefz:last-child{border-bottom:0}.prov-pip.svelte-qakefz{text-align:center;font-size:10px;line-height:1}.prov-id.svelte-qakefz{color:var(--ink);letter-spacing:.04em;text-transform:lowercase}.prov-tier.svelte-qakefz{display:inline-flex;align-items:center}.prov-name.svelte-qakefz{font-family:var(--font-serif);font-style:italic;font-size:13px;color:var(--ink)}.prov-note.svelte-qakefz{font-family:var(--font-sans);font-size:12px;color:var(--ink-tertiary)}.prov-ms.svelte-qakefz{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary)}.prov-status-silent.svelte-qakefz .prov-name:where(.svelte-qakefz){color:var(--ink-tertiary)}.prov-status-warn.svelte-qakefz .prov-name:where(.svelte-qakefz){color:#b7791f}.prov-status-error.svelte-qakefz .prov-name:where(.svelte-qakefz){color:#b91c1c}.prov-children.svelte-qakefz{padding:0}.region.svelte-16iv0n8{border-top:1px solid var(--rule-soft);padding:var(--s-5) 0 var(--s-5);background:transparent}.region.svelte-16iv0n8:first-of-type{border-top:0}.region-head.svelte-16iv0n8{display:flex;align-items:baseline;justify-content:space-between;gap:var(--s-4);margin-bottom:var(--s-3);flex-wrap:wrap}.region-head-left.svelte-16iv0n8{display:flex;align-items:baseline;gap:var(--s-2);flex-wrap:wrap}.region-num.svelte-16iv0n8{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.1em}.region-name.svelte-16iv0n8{margin:0;font-family:var(--font-serif);font-style:italic;font-size:26px;font-weight:500;color:var(--ink);letter-spacing:-.005em;line-height:1.1}.region-role.svelte-16iv0n8{font-family:var(--font-sans);font-size:14px;color:var(--ink-secondary)}.region-tag.svelte-16iv0n8{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.05em;margin-left:var(--s-2)}.rail.svelte-16iv0n8{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--s-3)}.rail.svelte-16iv0n8>.fc{grid-column:span 4}.rail.svelte-16iv0n8>.fc.fc-register,.rail.svelte-16iv0n8>.fc.fc-timeseries,.rail.svelte-16iv0n8>.fc.fc-forecast,.rail.svelte-16iv0n8>.fc.fc-raster,.rail.svelte-16iv0n8>.fc.fc-raster-pred,.rail.svelte-16iv0n8>.fc.fc-comparison{grid-column:span 6}.rail-capstone.svelte-16iv0n8>.fc{grid-column:span 6}@media(max-width:920px){.rail.svelte-16iv0n8{grid-template-columns:repeat(6,1fr)}.rail.svelte-16iv0n8>.fc{grid-column:span 6}}.silent.svelte-16iv0n8{border:1px dashed var(--rule-soft);padding:var(--s-4);display:flex;flex-direction:column;gap:var(--s-2);background:var(--paper-deep)}.silent-tag.svelte-16iv0n8{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.1em;text-transform:uppercase}.silent-prose.svelte-16iv0n8{margin:0;font-size:13px;color:var(--ink-secondary);line-height:1.5;max-width:var(--measure)}.prov.svelte-16iv0n8{margin-top:var(--s-3)}.prov-toggle.svelte-16iv0n8{background:transparent;border:0;padding:4px 0;cursor:pointer;display:inline-flex;align-items:baseline;gap:var(--s-1);font-family:var(--font-mono);font-size:11px;color:var(--ink-secondary);letter-spacing:.05em}.prov-toggle.svelte-16iv0n8:hover{color:var(--ink)}.prov-caret.svelte-16iv0n8{font-size:10px;color:var(--ink-tertiary)}.prov-meta.svelte-16iv0n8{color:var(--ink-tertiary)}.prov-body.svelte-16iv0n8{margin-top:var(--s-2);padding:var(--s-2) 0;border-top:1px solid var(--rule-soft);border-bottom:1px solid var(--rule-soft)}.region-grammar.svelte-gwg123{border-top:2px solid var(--ink);padding:var(--s-5) 0}.region-head.svelte-gwg123{display:flex;justify-content:space-between;align-items:baseline;flex-wrap:wrap;gap:var(--s-3);margin-bottom:var(--s-3)}.region-head-left.svelte-gwg123{display:flex;align-items:baseline;gap:var(--s-2);flex-wrap:wrap}.region-num.svelte-gwg123{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.1em}.region-name.svelte-gwg123{margin:0;font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500}.region-role.svelte-gwg123{font-family:var(--font-sans);font-size:13px;color:var(--ink-secondary)}.region-tag.svelte-gwg123{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.05em}.grammar-count.svelte-gwg123{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary)}.rail.svelte-gwg123{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--s-3)}.rail.svelte-gwg123>.fc{grid-column:span 4}.rail.svelte-gwg123>.fc.fc-register,.rail.svelte-gwg123>.fc.fc-timeseries,.rail.svelte-gwg123>.fc.fc-forecast,.rail.svelte-gwg123>.fc.fc-raster,.rail.svelte-gwg123>.fc.fc-raster-pred,.rail.svelte-gwg123>.fc.fc-comparison{grid-column:span 6}@media(max-width:920px){.rail.svelte-gwg123{grid-template-columns:repeat(6,1fr)}.rail.svelte-gwg123>.fc{grid-column:span 6}}.findings.svelte-ci42t5{background:var(--paper);color:var(--ink)}.findings-head.svelte-ci42t5{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:var(--s-3);padding:var(--s-3) 0 var(--s-2)}.findings-h2.svelte-ci42t5{margin:0;font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500;color:var(--ink)}.findings-tagline.svelte-ci42t5{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.05em}
|
|
|
|
|
|
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
.citation-drawer.svelte-1p339fd a{color:inherit;border-bottom:1px solid var(--rule-soft);text-decoration:none}.citation-drawer.svelte-1p339fd a:hover{border-bottom-color:var(--accent);color:var(--accent)}.rip-map-container.svelte-wk2bu4{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%}.map-frame.svelte-wk2bu4{aspect-ratio:8 / 5.6;position:relative;transition:outline-color .2s ease;outline:0 solid transparent;outline-offset:0}.map-frame[data-linked].svelte-wk2bu4:not([data-linked=""]){outline:2px solid var(--accent-graphical)}.link-badge.svelte-wk2bu4{position:absolute;bottom:8px;right:8px;padding:3px 8px;background:var(--ink);color:var(--paper);font-family:var(--font-mono);font-size:10px;letter-spacing:.06em;text-transform:lowercase;z-index:5;pointer-events:none}.layers-panel.svelte-1g2dety{background:var(--paper);border:1px solid var(--rule-soft);padding:var(--s-3) var(--s-4) var(--s-4);display:flex;flex-direction:column;gap:var(--s-3);font-family:var(--font-sans)}.layers-head.svelte-1g2dety{padding-bottom:4px}.layers-group.svelte-1g2dety{border-top:1px solid var(--rule-soft);padding-top:var(--s-2);border-left:3px solid var(--stone-tint, var(--rule-soft));padding-left:var(--s-3)}.layers-group.region-cornerstone.svelte-1g2dety{--stone-tint: var(--stone-cornerstone)}.layers-group.region-keystone.svelte-1g2dety{--stone-tint: var(--stone-keystone)}.layers-group.region-touchstone.svelte-1g2dety{--stone-tint: var(--stone-touchstone)}.layers-group.region-lodestone.svelte-1g2dety{--stone-tint: var(--stone-lodestone)}.layers-group.region-capstone.svelte-1g2dety{--stone-tint: var(--stone-capstone)}.layers-group.svelte-1g2dety summary:where(.svelte-1g2dety){cursor:pointer;list-style:none;display:flex;align-items:baseline;gap:var(--s-2);padding:4px 0}.layers-group.svelte-1g2dety summary:where(.svelte-1g2dety)::-webkit-details-marker{display:none}.layers-caret.svelte-1g2dety{font-size:10px;color:var(--ink-tertiary);transition:transform .2s ease}.layers-group.svelte-1g2dety:not([open]) .layers-caret:where(.svelte-1g2dety){transform:rotate(-90deg)}.layers-stone-name.svelte-1g2dety{font-family:var(--font-serif);font-style:italic;font-size:16px;color:var(--ink)}.layers-stone-tag.svelte-1g2dety{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em}.layers-count.svelte-1g2dety{margin-left:auto;font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.05em;text-transform:lowercase}.layers-list.svelte-1g2dety{list-style:none;margin:4px 0 var(--s-2);padding:0;display:flex;flex-direction:column}.layers-row.svelte-1g2dety{display:grid;grid-template-columns:16px 1fr auto;gap:var(--s-2);align-items:center;padding:4px 0;font-family:var(--font-mono);font-size:11px;color:var(--ink);border-bottom:1px dotted var(--rule-soft)}.layers-row.svelte-1g2dety:last-child{border-bottom:0}.layers-row.dim.svelte-1g2dety{opacity:.7}.layers-glyph.svelte-1g2dety{display:inline-flex;align-items:center}.layers-text.svelte-1g2dety{display:flex;flex-direction:column;gap:2px}.layers-label.svelte-1g2dety{color:var(--ink);font-family:var(--font-sans);font-size:12px}.layers-meta.svelte-1g2dety{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);display:inline-flex;align-items:center;gap:4px}.layers-state.svelte-1g2dety{font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;color:var(--ink);text-transform:uppercase}.layers-state-dim.svelte-1g2dety{color:var(--ink-tertiary);text-transform:lowercase;font-style:italic}.layers-row-empty.svelte-1g2dety .layers-empty-text:where(.svelte-1g2dety){grid-column:1 / -1;color:var(--ink-tertiary);font-style:italic;font-family:var(--font-mono);font-size:11px}.layers-masters.svelte-1g2dety{border-top:1px solid var(--rule-soft);padding-top:var(--s-2)}.layers-master-row.svelte-1g2dety{margin-top:4px;display:flex;flex-wrap:wrap;gap:6px}.layers-master.svelte-1g2dety{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;background:var(--paper);border:1px solid var(--rule-soft);cursor:pointer;font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;color:var(--ink)}.layers-master.is-on.svelte-1g2dety{background:var(--paper-deep);border-color:var(--ink)}.layers-master-state.svelte-1g2dety{margin-left:4px;color:var(--ink-tertiary);font-size:9px}.layers-master.is-on.svelte-1g2dety .layers-master-state:where(.svelte-1g2dety){color:var(--ink)}.rh.svelte-1vuwkv4{display:flex;align-items:center;flex-wrap:wrap;gap:var(--s-2);padding:var(--s-2) var(--s-4);background:var(--paper-deep);border-top:1px solid var(--rule-soft);border-bottom:1px solid var(--rule-soft);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em}.rh-item.svelte-1vuwkv4 strong:where(.svelte-1vuwkv4){font-weight:600;color:var(--ink);margin-right:2px}.rh-sep.svelte-1vuwkv4{opacity:.5}.rh-silent.svelte-1vuwkv4{color:var(--ink-tertiary)}.rh-warn.svelte-1vuwkv4{color:#b7791f}.rh-err.svelte-1vuwkv4{color:#b91c1c}.rh-notinvoked.svelte-1vuwkv4{color:var(--ink-tertiary);font-style:italic}.rh-total.svelte-1vuwkv4 strong:where(.svelte-1vuwkv4){color:var(--ink-tertiary)}.body-headline.svelte-lygj3j{padding:var(--s-3) var(--s-4) var(--s-2);display:flex;flex-direction:column;gap:var(--s-1)}.fc.is-compact .body-headline.svelte-lygj3j{padding:var(--s-2) var(--s-3)}.headline.svelte-lygj3j{font-family:var(--font-serif);font-style:italic;font-size:28px;font-weight:500;line-height:1.1;letter-spacing:-.01em}.fc.is-compact .headline.svelte-lygj3j{font-size:22px}.subhead.svelte-lygj3j{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em}.body-prose.svelte-lygj3j{margin:var(--s-2) 0 0;font-size:13px;line-height:1.45;color:var(--ink-secondary)}.body-tabular.svelte-1nlkuao{padding:var(--s-2) var(--s-4) var(--s-3)}.fc.is-compact .body-tabular.svelte-1nlkuao{padding:var(--s-2) var(--s-3)}.t.svelte-1nlkuao{width:100%;border-collapse:collapse;font-family:var(--font-mono);font-size:12px}.t.svelte-1nlkuao th:where(.svelte-1nlkuao){text-align:left;font-weight:500;color:var(--ink-tertiary);padding:4px 8px 4px 0;border-bottom:1px solid var(--rule-soft);text-transform:lowercase;letter-spacing:.04em}.t.svelte-1nlkuao td:where(.svelte-1nlkuao){padding:4px 8px 4px 0;border-bottom:1px solid var(--rule-soft);color:var(--ink)}.t.svelte-1nlkuao tr:where(.svelte-1nlkuao):last-child td:where(.svelte-1nlkuao){border-bottom:0}.fc.is-compact .t.svelte-1nlkuao th:where(.svelte-1nlkuao),.fc.is-compact .t.svelte-1nlkuao td:where(.svelte-1nlkuao){padding:2px 6px 2px 0;font-size:11px}.body-sub.svelte-1nlkuao{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-scalars.svelte-stf9c8{padding:var(--s-3) var(--s-4) var(--s-3)}.fc.is-compact .body-scalars.svelte-stf9c8{padding:var(--s-2) var(--s-3)}.row.svelte-stf9c8{display:grid;grid-template-columns:repeat(auto-fit,minmax(80px,1fr));gap:var(--s-3)}.cell.svelte-stf9c8{display:flex;flex-direction:column;gap:2px}.value.svelte-stf9c8{font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500;line-height:1.1}.label.svelte-stf9c8{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.06em;text-transform:lowercase}.body-sub.svelte-stf9c8{margin-top:var(--s-3);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-spark.svelte-jrppts{padding:var(--s-3) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-1)}.fc.is-compact .body-spark.svelte-jrppts{padding:var(--s-2) var(--s-3)}.headline.svelte-jrppts{font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500;line-height:1.1}.subhead.svelte-jrppts{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em;margin-bottom:var(--s-1)}svg.svelte-jrppts{display:block}.body-sub.svelte-jrppts{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-timeseries.svelte-48vbub{padding:var(--s-3) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-2)}.fc.is-compact .body-timeseries.svelte-48vbub{padding:var(--s-2) var(--s-3)}.ts-header.svelte-48vbub{display:flex;align-items:baseline;flex-wrap:wrap;gap:var(--s-2)}.headline.svelte-48vbub{font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500;line-height:1.1}.subhead.svelte-48vbub{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em}svg.svelte-48vbub{display:block}.body-sub.svelte-48vbub{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5;display:flex;flex-direction:column;gap:2px}.spatial-note.svelte-48vbub{color:var(--accent);font-style:italic}.ft-footer.svelte-1y25lfh{margin:var(--s-2) var(--s-4) var(--s-3);padding-top:var(--s-2);border-top:1px dashed var(--rule-soft);display:flex;flex-wrap:wrap;gap:var(--s-3);align-items:baseline;font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary)}.fc.is-compact .ft-footer.svelte-1y25lfh{margin:var(--s-2) var(--s-3)}.ft-stat.svelte-1y25lfh{display:inline-flex;align-items:baseline;gap:4px;color:var(--ink)}.ft-stat-k.svelte-1y25lfh{font-size:10px;color:var(--ink-tertiary);letter-spacing:.05em;text-transform:uppercase}.ft-skill.svelte-1y25lfh{color:var(--tier-modeled);font-weight:500}.ft-badge.svelte-1y25lfh{border:1px solid var(--ink);color:var(--ink);padding:1px 6px;font-size:10px;letter-spacing:.06em;text-transform:uppercase;background:var(--paper)}.ft-link.svelte-1y25lfh{margin-left:auto;color:var(--accent);text-decoration:none}.ft-link.svelte-1y25lfh:hover{text-decoration:underline}.body-forecast.svelte-gqkhpe{padding:var(--s-3) var(--s-4) var(--s-3)}.fc.is-compact .body-forecast.svelte-gqkhpe{padding:var(--s-2) var(--s-3)}svg.svelte-gqkhpe{display:block}.body-sub.svelte-gqkhpe{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}svg.svelte-1lx1psy{display:block}.thumb-placeholder.svelte-1lx1psy{height:120px;background:var(--paper-deep);display:flex;align-items:center;justify-content:center;color:var(--ink-tertiary);font-family:var(--font-mono);font-size:11px;border:1px dashed var(--rule-soft)}.body-raster.svelte-1m43x1m{padding:var(--s-2) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-2)}.fc.is-compact .body-raster.svelte-1m43x1m{padding:var(--s-2) var(--s-3)}.frame.svelte-1m43x1m{position:relative;border:1px solid var(--rule-soft)}.illustrative.svelte-1m43x1m{position:absolute;top:6px;right:6px;background:#1a1a1ab3;color:var(--paper);font-family:var(--font-mono);font-size:9px;padding:2px 6px;letter-spacing:.05em;text-transform:lowercase}.raster-headline.svelte-1m43x1m{font-family:var(--font-mono);font-size:12px;color:var(--ink)}.raster-headline.svelte-1m43x1m span:where(.svelte-1m43x1m):first-child{font-family:var(--font-serif);font-style:italic;font-size:18px;font-weight:500}.body-sub.svelte-1m43x1m{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-lulc.svelte-1td276x{padding:var(--s-2) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-2)}.fc.is-compact .body-lulc.svelte-1td276x{padding:var(--s-2) var(--s-3)}.frame.svelte-1td276x{position:relative;border:1px solid var(--rule-soft)}.illustrative.svelte-1td276x{position:absolute;top:6px;right:6px;background:#1a1a1ab3;color:var(--paper);font-family:var(--font-mono);font-size:9px;padding:2px 6px;letter-spacing:.05em;text-transform:lowercase}.bar.svelte-1td276x{display:flex;height:10px;border:1px solid var(--rule-soft);overflow:hidden}.bar-seg.svelte-1td276x{flex-shrink:1;flex-basis:0}.legend.svelte-1td276x{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:4px var(--s-3);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary)}.legend.svelte-1td276x li:where(.svelte-1td276x){display:inline-flex;align-items:center;gap:6px}.swatch.svelte-1td276x{display:inline-block;width:10px;height:10px;border:1px solid var(--rule-soft);flex:none}.legend-k.svelte-1td276x{color:var(--ink);text-transform:lowercase;letter-spacing:.04em}.legend-pct.svelte-1td276x{color:var(--ink-tertiary)}.body-sub.svelte-1td276x{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-register.svelte-1iup6im{padding:var(--s-2) var(--s-4) var(--s-3)}.fc.is-compact .body-register.svelte-1iup6im{padding:var(--s-2) var(--s-3)}.reg-list.svelte-1iup6im{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}.reg-row.svelte-1iup6im{display:grid;grid-template-columns:70px 1fr auto;gap:var(--s-2);align-items:baseline;padding:5px 0;border-bottom:1px solid var(--rule-soft);font-family:var(--font-mono);font-size:12px;line-height:1.4}.reg-row.svelte-1iup6im:last-child{border-bottom:0}.fc.is-compact .reg-row.svelte-1iup6im{padding:3px 0;font-size:11px}.reg-tag.svelte-1iup6im{display:inline-flex;gap:4px;align-items:center;color:var(--ink-tertiary);text-transform:uppercase;letter-spacing:.05em;font-weight:500}.reg-label.svelte-1iup6im{color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.reg-source.svelte-1iup6im{color:var(--ink-tertiary);font-size:10px;letter-spacing:.05em}.reg-silent.svelte-1iup6im{grid-column:2 / span 2;color:var(--ink-tertiary);font-style:italic}.reg-row.silent.svelte-1iup6im{opacity:.65}.body-sub.svelte-1iup6im{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-comparison.svelte-1swqabu{padding:var(--s-3) var(--s-4) var(--s-3);display:flex;flex-direction:column;gap:var(--s-2)}.fc.is-compact .body-comparison.svelte-1swqabu{padding:var(--s-2) var(--s-3)}.cmp-grid.svelte-1swqabu{display:grid;grid-template-columns:1fr auto 1fr;gap:var(--s-3);align-items:stretch}.cell.svelte-1swqabu{display:flex;flex-direction:column;gap:4px}.cell-tier.svelte-1swqabu{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.05em;text-transform:lowercase}.cell-value.svelte-1swqabu{font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500}.cell-aux.svelte-1swqabu{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary)}.divider.svelte-1swqabu{align-self:center;font-family:var(--font-serif);font-style:italic;font-size:14px;color:var(--ink-tertiary);padding-top:18px}.cmp-delta.svelte-1swqabu{font-family:var(--font-mono);font-size:11px;color:var(--ink);border-top:1px solid var(--rule-soft);padding-top:var(--s-2)}.body-sub.svelte-1swqabu{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.body-meta.svelte-e40scu{padding:var(--s-2) var(--s-4) var(--s-3)}.fc.is-compact .body-meta.svelte-e40scu{padding:var(--s-2) var(--s-3)}.meta-list.svelte-e40scu{margin:0;display:grid;grid-template-columns:1fr;gap:4px}.meta-row.svelte-e40scu{display:grid;grid-template-columns:minmax(110px,max-content) 1fr;gap:var(--s-3);padding:3px 0;border-bottom:1px solid var(--rule-soft);align-items:baseline}.meta-row.svelte-e40scu:last-child{border-bottom:0}dt.svelte-e40scu{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);text-transform:lowercase;letter-spacing:.04em}dd.svelte-e40scu{margin:0;font-family:var(--font-mono);font-size:12px;color:var(--ink)}.body-sub.svelte-e40scu{margin-top:var(--s-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);line-height:1.5}.unknown.svelte-1x6xqhh{padding:var(--s-3) var(--s-4);font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary)}.fc.svelte-1nuvnzu{background:var(--paper);border:1px solid var(--rule-soft);display:flex;flex-direction:column;transition:background-color .2s ease,border-color .2s ease,outline-color .2s ease;outline:0 solid transparent;outline-offset:0;color:inherit;text-align:left;font:inherit;padding:0;width:100%;animation:svelte-1nuvnzu-fc-fade-in .36s ease-out both}@keyframes svelte-1nuvnzu-fc-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.fc.is-interactive.svelte-1nuvnzu{cursor:pointer}.fc.svelte-1nuvnzu:hover{background:var(--paper-deep)}.fc.is-linked.svelte-1nuvnzu{outline:2px solid var(--accent-graphical);outline-offset:0}.has-illustrative.svelte-1nuvnzu,.fc-tier-synthetic.svelte-1nuvnzu{border-top:1px dashed var(--tier-synthetic-line)}.fc-head.svelte-1nuvnzu{display:flex;justify-content:space-between;align-items:center;padding:var(--s-2) var(--s-4);border-bottom:1px solid var(--rule-soft);background:var(--paper-deep)}.fc.is-compact .fc-head.svelte-1nuvnzu{padding:6px var(--s-3)}.fc-head-source.svelte-1nuvnzu{display:inline-flex;align-items:center;gap:var(--s-2);font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--ink)}.fc-head-source-label.svelte-1nuvnzu{cursor:help}.fc-head-vintage.svelte-1nuvnzu{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.05em}.fc-title.svelte-1nuvnzu{margin:0;padding:var(--s-3) var(--s-4) 0;font-family:var(--font-sans);font-size:14px;font-weight:600;line-height:1.35;color:var(--ink)}.fc.is-compact .fc-title.svelte-1nuvnzu{padding:var(--s-2) var(--s-3) 0;font-size:13px}.fc-foot.svelte-1nuvnzu{display:flex;justify-content:space-between;align-items:center;padding:var(--s-2) var(--s-4);border-top:1px solid var(--rule-soft);background:var(--paper-deep);gap:var(--s-3);margin-top:auto}.fc.is-compact .fc-foot.svelte-1nuvnzu{padding:6px var(--s-3)}.fc-foot-cite.svelte-1nuvnzu{display:inline-flex;align-items:center;gap:4px;background:transparent;border:0;padding:0;cursor:pointer;font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;color:var(--accent)}.fc-foot-cite.svelte-1nuvnzu:hover{color:var(--ink)}.fc-foot-docid.svelte-1nuvnzu{text-transform:uppercase}.fc-foot-docid-mute.svelte-1nuvnzu{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.05em;text-transform:uppercase}.fc-foot-arrow.svelte-1nuvnzu{font-family:var(--font-mono);font-size:11px}.fc-tier-badge.svelte-1nuvnzu{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);font-size:10px;font-weight:500;letter-spacing:.08em;text-transform:uppercase}.fc-tier-badge-empirical.svelte-1nuvnzu{color:var(--tier-empirical)}.fc-tier-badge-modeled.svelte-1nuvnzu{color:var(--tier-modeled)}.fc-tier-badge-proxy.svelte-1nuvnzu{color:var(--tier-proxy)}.fc-tier-badge-synthetic.svelte-1nuvnzu{color:var(--tier-synthetic)}.tally.svelte-1qqbvs2{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.04em;flex-wrap:wrap}strong.svelte-1qqbvs2{font-weight:600;color:var(--ink)}.silent.svelte-1qqbvs2 strong:where(.svelte-1qqbvs2){color:var(--ink-tertiary)}.warn.svelte-1qqbvs2 strong:where(.svelte-1qqbvs2){color:#b7791f}.err.svelte-1qqbvs2 strong:where(.svelte-1qqbvs2){color:#b91c1c}.notinvoked.svelte-1qqbvs2 strong:where(.svelte-1qqbvs2){color:var(--ink-tertiary);font-style:italic}.sep.svelte-1qqbvs2{color:var(--ink-tertiary);opacity:.6}.prov-tree.svelte-qakefz{list-style:none;margin:0;padding:0;padding-left:calc(var(--depth, 0) * 16px)}.prov-row.svelte-qakefz{display:grid;grid-template-columns:14px max-content max-content 1fr auto;gap:var(--s-2);align-items:baseline;padding:3px 0;font-family:var(--font-mono);font-size:11px;border-bottom:1px dotted var(--rule-soft)}.prov-row.svelte-qakefz:last-child{border-bottom:0}.prov-pip.svelte-qakefz{text-align:center;font-size:10px;line-height:1}.prov-id.svelte-qakefz{color:var(--ink);letter-spacing:.04em;text-transform:lowercase}.prov-tier.svelte-qakefz{display:inline-flex;align-items:center}.prov-name.svelte-qakefz{font-family:var(--font-serif);font-style:italic;font-size:13px;color:var(--ink)}.prov-note.svelte-qakefz{font-family:var(--font-sans);font-size:12px;color:var(--ink-tertiary)}.prov-ms.svelte-qakefz{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary)}.prov-status-silent_by_design.svelte-qakefz .prov-name:where(.svelte-qakefz){color:var(--ink-tertiary);font-style:italic}.prov-status-warned.svelte-qakefz .prov-name:where(.svelte-qakefz){color:#b7791f}.prov-status-errored.svelte-qakefz .prov-name:where(.svelte-qakefz){color:#b91c1c}.prov-status-errored.svelte-qakefz .prov-pip:where(.svelte-qakefz){font-weight:700}.prov-status-not_invoked.svelte-qakefz .prov-name:where(.svelte-qakefz){color:var(--ink-tertiary);font-style:italic}.prov-status-not_invoked.svelte-qakefz .prov-id:where(.svelte-qakefz){color:var(--ink-tertiary);opacity:.6}.prov-children.svelte-qakefz{padding:0}.region.svelte-16iv0n8{border-top:1px solid var(--rule-soft);padding:var(--s-5) 0 var(--s-5);background:transparent}.region.svelte-16iv0n8:first-of-type{border-top:0}.region-head.svelte-16iv0n8{display:flex;align-items:baseline;justify-content:space-between;gap:var(--s-4);margin-bottom:var(--s-3);flex-wrap:wrap;border-left:3px solid var(--stone-tint, var(--rule-soft));padding-left:var(--s-3)}.region-cornerstone.svelte-16iv0n8 .region-head:where(.svelte-16iv0n8){--stone-tint: var(--stone-cornerstone)}.region-keystone.svelte-16iv0n8 .region-head:where(.svelte-16iv0n8){--stone-tint: var(--stone-keystone)}.region-touchstone.svelte-16iv0n8 .region-head:where(.svelte-16iv0n8){--stone-tint: var(--stone-touchstone)}.region-lodestone.svelte-16iv0n8 .region-head:where(.svelte-16iv0n8){--stone-tint: var(--stone-lodestone)}.region-capstone.svelte-16iv0n8 .region-head:where(.svelte-16iv0n8){--stone-tint: var(--stone-capstone)}.region-head-left.svelte-16iv0n8{display:flex;align-items:baseline;gap:var(--s-2);flex-wrap:wrap}.region-num.svelte-16iv0n8{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.1em}.region-name.svelte-16iv0n8{margin:0;font-family:var(--font-serif);font-style:italic;font-size:26px;font-weight:500;color:var(--ink);letter-spacing:-.005em;line-height:1.1}.region-role.svelte-16iv0n8{font-family:var(--font-sans);font-size:14px;color:var(--ink-secondary)}.region-tag.svelte-16iv0n8{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.05em;margin-left:var(--s-2)}.rail.svelte-16iv0n8{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--s-3)}.rail.svelte-16iv0n8>.fc{grid-column:span 4}.rail.svelte-16iv0n8>.fc.fc-register,.rail.svelte-16iv0n8>.fc.fc-timeseries,.rail.svelte-16iv0n8>.fc.fc-timeseries-ft,.rail.svelte-16iv0n8>.fc.fc-forecast,.rail.svelte-16iv0n8>.fc.fc-raster,.rail.svelte-16iv0n8>.fc.fc-raster-pred,.rail.svelte-16iv0n8>.fc.fc-lulc,.rail.svelte-16iv0n8>.fc.fc-comparison{grid-column:span 6}.rail-capstone.svelte-16iv0n8>.fc{grid-column:span 6}@media(max-width:920px){.rail.svelte-16iv0n8{grid-template-columns:repeat(6,1fr)}.rail.svelte-16iv0n8>.fc{grid-column:span 6}}.silent.svelte-16iv0n8{border:1px dashed var(--rule-soft);padding:var(--s-4);display:flex;flex-direction:column;gap:var(--s-2);background:var(--paper-deep)}.silent-tag.svelte-16iv0n8{font-family:var(--font-mono);font-size:10px;color:var(--ink-tertiary);letter-spacing:.1em;text-transform:uppercase}.silent-prose.svelte-16iv0n8{margin:0;font-size:13px;color:var(--ink-secondary);line-height:1.5;max-width:var(--measure)}.prov.svelte-16iv0n8{margin-top:var(--s-3)}.prov-toggle.svelte-16iv0n8{background:transparent;border:0;padding:4px 0;cursor:pointer;display:inline-flex;align-items:baseline;gap:var(--s-1);font-family:var(--font-mono);font-size:11px;color:var(--ink-secondary);letter-spacing:.05em}.prov-toggle.svelte-16iv0n8:hover{color:var(--ink)}.prov-caret.svelte-16iv0n8{font-size:10px;color:var(--ink-tertiary)}.prov-meta.svelte-16iv0n8{color:var(--ink-tertiary)}.prov-body.svelte-16iv0n8{margin-top:var(--s-2);padding:var(--s-2) 0;border-top:1px solid var(--rule-soft);border-bottom:1px solid var(--rule-soft)}.region-grammar.svelte-gwg123{border-top:2px solid var(--ink);padding:var(--s-5) 0}.region-head.svelte-gwg123{display:flex;justify-content:space-between;align-items:baseline;flex-wrap:wrap;gap:var(--s-3);margin-bottom:var(--s-3)}.region-head-left.svelte-gwg123{display:flex;align-items:baseline;gap:var(--s-2);flex-wrap:wrap}.region-num.svelte-gwg123{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.1em}.region-name.svelte-gwg123{margin:0;font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500}.region-role.svelte-gwg123{font-family:var(--font-sans);font-size:13px;color:var(--ink-secondary)}.region-tag.svelte-gwg123{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.05em}.grammar-count.svelte-gwg123{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary)}.rail.svelte-gwg123{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--s-3)}.rail.svelte-gwg123>.fc{grid-column:span 4}.rail.svelte-gwg123>.fc.fc-register,.rail.svelte-gwg123>.fc.fc-timeseries,.rail.svelte-gwg123>.fc.fc-forecast,.rail.svelte-gwg123>.fc.fc-raster,.rail.svelte-gwg123>.fc.fc-raster-pred,.rail.svelte-gwg123>.fc.fc-comparison{grid-column:span 6}@media(max-width:920px){.rail.svelte-gwg123{grid-template-columns:repeat(6,1fr)}.rail.svelte-gwg123>.fc{grid-column:span 6}}.findings.svelte-ci42t5{background:var(--paper);color:var(--ink)}.findings-head.svelte-ci42t5{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:var(--s-3);padding:var(--s-3) 0 var(--s-2)}.findings-h2.svelte-ci42t5{margin:0;font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:500;color:var(--ink)}.findings-tagline.svelte-ci42t5{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);letter-spacing:.05em}
|
|
@@ -1 +1 @@
|
|
| 1 |
-
import{s as e,p as r}from"./
|
|
|
|
| 1 |
+
import{s as e,p as r}from"./BwzbOVaY.js";const t={get error(){return r.error},get params(){return r.params},get status(){return r.status},get url(){return r.url}};e.updated.check;const a=t;export{a as p};
|
|
@@ -1 +0,0 @@
|
|
| 1 |
-
var rt=e=>{throw TypeError(e)};var Dt=(e,t,n)=>t.has(e)||rt("Cannot "+n);var y=(e,t,n)=>(Dt(e,t,"read from private field"),n?n.call(e):t.get(e)),A=(e,t,n)=>t.has(e)?rt("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n);import{bc as Pe,bd as Vt,G as at,j as T,k as I,l as O,o as we,be as Bt}from"./DwbuJhNu.js";const M=[];function Ke(e,t=Pe){let n=null;const a=new Set;function r(o){if(Vt(e,o)&&(e=o,n)){const l=!M.length;for(const c of a)c[1](),M.push(c,e);if(l){for(let c=0;c<M.length;c+=2)M[c][0](M[c+1]);M.length=0}}}function i(o){r(o(e))}function s(o,l=Pe){const c=[o,l];return a.add(c),a.size===1&&(n=t(r,i)||Pe),o(e),()=>{a.delete(c),a.size===0&&n&&(n(),n=null)}}return{set:r,update:i,subscribe:s}}class Me{constructor(t,n){this.status=t,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${t}`}}toString(){return JSON.stringify(this.body)}}class Ge{constructor(t,n){try{new Headers({location:n})}catch{throw new Error(`Invalid redirect location ${JSON.stringify(n)}: this string contains characters that cannot be used in HTTP headers`)}this.status=t,this.location=n}}class ze extends Error{constructor(t,n,a){super(a),this.status=t,this.text=n}}new URL("sveltekit-internal://");function Kt(e,t){return e==="/"||t==="ignore"?e:t==="never"?e.endsWith("/")?e.slice(0,-1):e:t==="always"&&!e.endsWith("/")?e+"/":e}function Mt(e){return e.split("%25").map(decodeURI).join("%25")}function Gt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function $e({href:e}){return e.split("#")[0]}function j(){}function zt(...e){let t=5381;for(const n of e)if(typeof n=="string"){let a=n.length;for(;a;)t=t*33^n.charCodeAt(--a)}else if(ArrayBuffer.isView(n)){const a=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let r=a.length;for(;r;)t=t*33^a[--r]}else throw new TypeError("value must be a string or TypedArray");return(t>>>0).toString(36)}new TextEncoder;function Ft(e){const t=atob(e),n=new Uint8Array(t.length);for(let a=0;a<t.length;a++)n[a]=t.charCodeAt(a);return n}const Ht=window.fetch;window.fetch=(e,t)=>((e instanceof Request?e.method:(t==null?void 0:t.method)||"GET")!=="GET"&&X.delete(Fe(e)),Ht(e,t));const X=new Map;function Wt(e,t){const n=Fe(e,t),a=document.querySelector(n);if(a!=null&&a.textContent){a.remove();let{body:r,...i}=JSON.parse(a.textContent);const s=a.getAttribute("data-ttl");return s&&X.set(n,{body:r,init:i,ttl:1e3*Number(s)}),a.getAttribute("data-b64")!==null&&(r=Ft(r)),Promise.resolve(new Response(r,i))}return window.fetch(e,t)}function Jt(e,t,n){if(X.size>0){const a=Fe(e,n),r=X.get(a);if(r){if(performance.now()<r.ttl&&["default","force-cache","only-if-cached",void 0].includes(n==null?void 0:n.cache))return new Response(r.body,r.init);X.delete(a)}}return window.fetch(t,n)}function Fe(e,t){let a=`script[data-sveltekit-fetched][data-url=${JSON.stringify(e instanceof Request?e.url:e)}]`;if(t!=null&&t.headers||t!=null&&t.body){const r=[];t.headers&&r.push([...new Headers(t.headers)].join(",")),t.body&&(typeof t.body=="string"||ArrayBuffer.isView(t.body))&&r.push(t.body),a+=`[data-hash="${zt(...r)}"]`}return a}const Yt=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/;function Xt(e){const t=[];return{pattern:e==="/"?/^\/$/:new RegExp(`^${Zt(e).map(a=>{const r=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(r)return t.push({name:r[1],matcher:r[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const i=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(i)return t.push({name:i[1],matcher:i[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const s=a.split(/\[(.+?)\](?!\])/);return"/"+s.map((l,c)=>{if(c%2){if(l.startsWith("x+"))return je(String.fromCharCode(parseInt(l.slice(2),16)));if(l.startsWith("u+"))return je(String.fromCharCode(...l.slice(2).split("-").map(m=>parseInt(m,16))));const d=Yt.exec(l),[,u,w,p,f]=d;return t.push({name:p,matcher:f,optional:!!u,rest:!!w,chained:w?c===1&&s[0]==="":!1}),w?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return je(l)}).join("")}).join("")}/?$`),params:t}}function Qt(e){return e!==""&&!/^\([^)]+\)$/.test(e)}function Zt(e){return e.slice(1).split("/").filter(Qt)}function en(e,t,n){const a={},r=e.slice(1),i=r.filter(o=>o!==void 0);let s=0;for(let o=0;o<t.length;o+=1){const l=t[o];let c=r[o-s];if(l.chained&&l.rest&&s&&(c=r.slice(o-s,o+1).filter(d=>d).join("/"),s=0),c===void 0)if(l.rest)c="";else continue;if(!l.matcher||n[l.matcher](c)){a[l.name]=c;const d=t[o+1],u=r[o+1];d&&!d.rest&&d.optional&&u&&l.chained&&(s=0),!d&&!u&&Object.keys(a).length===i.length&&(s=0);continue}if(l.optional&&l.chained){s++;continue}return}if(!s)return a}function je(e){return e.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function tn({nodes:e,server_loads:t,dictionary:n,matchers:a}){const r=new Set(t);return Object.entries(n).map(([o,[l,c,d]])=>{const{pattern:u,params:w}=Xt(o),p={id:o,exec:f=>{const m=u.exec(f);if(m)return en(m,w,a)},errors:[1,...d||[]].map(f=>e[f]),layouts:[0,...c||[]].map(s),leaf:i(l)};return p.errors.length=p.layouts.length=Math.max(p.errors.length,p.layouts.length),p});function i(o){const l=o<0;return l&&(o=~o),[l,e[o]]}function s(o){return o===void 0?o:[r.has(o),e[o]]}}function wt(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function ot(e,t,n=JSON.stringify){const a=n(t);try{sessionStorage[e]=a}catch{}}var ht;const U=((ht=globalThis.__sveltekit_144sd2o)==null?void 0:ht.base)??"";var pt;const nn=((pt=globalThis.__sveltekit_144sd2o)==null?void 0:pt.assets)??U??"",rn="1778019603760",vt="sveltekit:snapshot",yt="sveltekit:scroll",bt="sveltekit:states",an="sveltekit:pageurl",z="sveltekit:history",Z="sveltekit:navigation",D={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},Ue=location.origin;function He(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){const n=document.getElementsByTagName("base");t=n.length?n[0].href:document.URL}return new URL(e,t)}function B(){return{x:pageXOffset,y:pageYOffset}}function G(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const st={...D,"":D.hover};function kt(e){let t=e.assignedSlot??e.parentNode;return(t==null?void 0:t.nodeType)===11&&(t=t.host),t}function St(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=kt(e)}}function qe(e,t,n){let a;try{if(a=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&a.hash.match(/^#[^/]/)){const o=location.hash.split("#")[1]||"/";a.hash=`#${o}${a.hash}`}}catch{}const r=e instanceof SVGAElement?e.target.baseVal:e.target,i=!a||!!r||Ae(a,t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),s=(a==null?void 0:a.origin)===Ue&&e.hasAttribute("download");return{url:a,external:i,target:r,download:s}}function ve(e){let t=null,n=null,a=null,r=null,i=null,s=null,o=e;for(;o&&o!==document.documentElement;)a===null&&(a=G(o,"preload-code")),r===null&&(r=G(o,"preload-data")),t===null&&(t=G(o,"keepfocus")),n===null&&(n=G(o,"noscroll")),i===null&&(i=G(o,"reload")),s===null&&(s=G(o,"replacestate")),o=kt(o);function l(c){switch(c){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:st[a??"off"],preload_data:st[r??"off"],keepfocus:l(t),noscroll:l(n),reload:l(i),replace_state:l(s)}}function it(e){const t=Ke(e);let n=!0;function a(){n=!0,t.update(s=>s)}function r(s){n=!1,t.set(s)}function i(s){let o;return t.subscribe(l=>{(o===void 0||n&&l!==o)&&s(o=l)})}return{notify:a,set:r,subscribe:i}}const Et={v:j};function on(){const{set:e,subscribe:t}=Ke(!1);let n;async function a(){clearTimeout(n);try{const r=await fetch(`${nn}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!r.ok)return!1;const s=(await r.json()).version!==rn;return s&&(e(!0),Et.v(),clearTimeout(n)),s}catch{return!1}}return{subscribe:t,check:a}}function Ae(e,t,n){return e.origin!==Ue||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function Pn(e){}const Rt=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...Rt];const sn=new Set([...Rt]);[...sn];function ln(e){return e.filter(t=>t!=null)}function me(e,t){return e+"/"+t}function We(e){return e instanceof Me||e instanceof ze?e.status:500}function cn(e){return e instanceof ze?e.text:"Internal Error"}let R,ee,Ce;const fn=at.toString().includes("$$")||/function \w+\(\) \{\}/.test(at.toString()),lt="a:";var oe,se,ie,le,ce,fe,ue,de,gt,he,mt,pe,_t;fn?(R={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(lt)},ee={current:null},Ce={current:!1}):(R=new(gt=class{constructor(){A(this,oe,T({}));A(this,se,T(null));A(this,ie,T(null));A(this,le,T({}));A(this,ce,T({id:null}));A(this,fe,T({}));A(this,ue,T(-1));A(this,de,T(new URL(lt)))}get data(){return I(y(this,oe))}set data(t){O(y(this,oe),t)}get form(){return I(y(this,se))}set form(t){O(y(this,se),t)}get error(){return I(y(this,ie))}set error(t){O(y(this,ie),t)}get params(){return I(y(this,le))}set params(t){O(y(this,le),t)}get route(){return I(y(this,ce))}set route(t){O(y(this,ce),t)}get state(){return I(y(this,fe))}set state(t){O(y(this,fe),t)}get status(){return I(y(this,ue))}set status(t){O(y(this,ue),t)}get url(){return I(y(this,de))}set url(t){O(y(this,de),t)}},oe=new WeakMap,se=new WeakMap,ie=new WeakMap,le=new WeakMap,ce=new WeakMap,fe=new WeakMap,ue=new WeakMap,de=new WeakMap,gt),ee=new(mt=class{constructor(){A(this,he,T(null))}get current(){return I(y(this,he))}set current(t){O(y(this,he),t)}},he=new WeakMap,mt),Ce=new(_t=class{constructor(){A(this,pe,T(!1))}get current(){return I(y(this,pe))}set current(t){O(y(this,pe),t)}},pe=new WeakMap,_t),Et.v=()=>Ce.current=!0);function un(e){Object.assign(R,e)}const dn=new Set(["icon","shortcut icon","apple-touch-icon"]);let J=null;const N=wt(yt)??{},te=wt(vt)??{},C={url:it({}),page:it({}),navigating:Ke(null),updated:on()};function Je(e){N[e]=B()}function hn(e,t){let n=e+1;for(;N[n];)delete N[n],n+=1;for(n=t+1;te[n];)delete te[n],n+=1}function ne(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(j)}async function xt(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(U||"/");e&&await e.update()}}let Ye,De,ye,P,Ve,S;const be=[],ke=[];let v=null;function Se(){var e;(e=v==null?void 0:v.fork)==null||e.then(t=>t==null?void 0:t.discard()),v=null}const _e=new Map,Lt=new Set,pn=new Set,Q=new Set;let _={branch:[],error:null,url:null},Ut=!1,Ee=!1,ct=!0,re=!1,Y=!1,At=!1,Xe=!1,Tt,k,L,V;const Re=new Set,ft=new Map,ut=new Map;async function Nn(e,t,n){var i,s,o,l;globalThis.__sveltekit_144sd2o&&(globalThis.__sveltekit_144sd2o.query,globalThis.__sveltekit_144sd2o.prerender),document.URL!==location.href&&(location.href=location.href),S=e,await((s=(i=e.hooks).init)==null?void 0:s.call(i)),Ye=tn(e),P=document.documentElement,Ve=t,De=e.nodes[0],ye=e.nodes[1],De(),ye(),k=(o=history.state)==null?void 0:o[z],L=(l=history.state)==null?void 0:l[Z],k||(k=L=Date.now(),history.replaceState({...history.state,[z]:k,[Z]:L},""));const a=N[k];function r(){a&&(history.scrollRestoration="manual",scrollTo(a.x,a.y))}n?(r(),await Ln(Ve,n)):(await F({type:"enter",url:He(S.hash?Tn(new URL(location.href)):location.href),replace_state:!0}),r()),xn()}function gn(){be.length=0,Xe=!1}function It(e){ke.some(t=>t==null?void 0:t.snapshot)&&(te[e]=ke.map(t=>{var n;return(n=t==null?void 0:t.snapshot)==null?void 0:n.capture()}))}function Ot(e){var t;(t=te[e])==null||t.forEach((n,a)=>{var r,i;(i=(r=ke[a])==null?void 0:r.snapshot)==null||i.restore(n)})}function dt(){Je(k),ot(yt,N),It(L),ot(vt,te)}async function Pt(e,t,n,a){let r,i;t.invalidateAll&&Se(),await F({type:"goto",url:He(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:a,accept:()=>{if(t.invalidateAll){Xe=!0,r=new Set;for(const[s,o]of ft)for(const l of o.keys())r.add(me(s,l));i=new Set;for(const[s,o]of ut)for(const l of o.keys())i.add(me(s,l))}t.invalidate&&t.invalidate.forEach(Rn)}}),t.invalidateAll&&we().then(we).then(()=>{for(const[s,o]of ft)for(const[l,{resource:c}]of o)r!=null&&r.has(me(s,l))&&c.refresh();for(const[s,o]of ut)for(const[l,{resource:c}]of o)i!=null&&i.has(me(s,l))&&c.reconnect()})}async function mn(e){if(e.id!==(v==null?void 0:v.id)){Se();const t={};Re.add(t),v={id:e.id,token:t,promise:jt({...e,preload:t}).then(n=>(Re.delete(t),n.type==="loaded"&&n.state.error&&Se(),n)),fork:null}}return v.promise}async function Ne(e){var n;const t=(n=await Te(e,!1))==null?void 0:n.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(a=>a[1]()))}async function $t(e,t,n){var i;const a={params:_.params,route:{id:((i=_.route)==null?void 0:i.id)??null},url:new URL(location.href)};_={...e.state,nav:a};const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(R,e.props.page),Tt=new S.root({target:t,props:{...e.props,stores:C,components:ke},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),Ot(L),n){const s={from:null,to:{...a,scroll:N[k]??B()},willUnload:!1,type:"enter",complete:Promise.resolve()};Q.forEach(o=>o(s))}Ee=!0}async function xe({url:e,params:t,branch:n,errors:a,status:r,error:i,route:s,form:o}){let l="never";if(U&&(e.pathname===U||e.pathname===U+"/"))l="always";else for(const f of n)(f==null?void 0:f.slash)!==void 0&&(l=f.slash);e.pathname=Kt(e.pathname,l),e.search=e.search;const c={type:"loaded",state:{url:e,params:t,branch:n,error:i,route:s},props:{constructors:ln(n).map(f=>f.node.component),page:nt(R)}};o!==void 0&&(c.props.form=o);let d={},u=!R,w=0;for(let f=0;f<Math.max(n.length,_.branch.length);f+=1){const m=n[f],h=_.branch[f];(m==null?void 0:m.data)!==(h==null?void 0:h.data)&&(u=!0),m&&(d={...d,...m.data},u&&(c.props[`data_${w}`]=d),w+=1)}return(!_.url||e.href!==_.url.href||_.error!==i||o!==void 0&&o!==R.form||u)&&(c.props.page={error:i,params:t,route:{id:(s==null?void 0:s.id)??null},state:{},status:r,url:new URL(e),form:o??null,data:u?d:R.data}),c}async function Qe({loader:e,parent:t,url:n,params:a,route:r,server_data_node:i}){var c,d;let s=null;const o={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},l=await e();return{node:l,loader:e,server:i,universal:(c=l.universal)!=null&&c.load?{type:"data",data:s,uses:o}:null,data:s??(i==null?void 0:i.data)??null,slash:((d=l.universal)==null?void 0:d.trailingSlash)??(i==null?void 0:i.slash)}}function _n(e,t,n){let a=e instanceof Request?e.url:e;const r=new URL(a,n);r.origin===n.origin&&(a=r.href.slice(n.origin.length));const i=Ee?Jt(a,r.href,t):Wt(a,t);return{resolved:r,promise:i}}function wn(e,t,n,a,r,i){if(Xe)return!0;if(!r)return!1;if(r.parent&&e||r.route&&t||r.url&&n)return!0;for(const s of r.search_params)if(a.has(s))return!0;for(const s of r.params)if(i[s]!==_.params[s])return!0;for(const s of r.dependencies)if(be.some(o=>o(new URL(s))))return!0;return!1}function Ze(e,t){return(e==null?void 0:e.type)==="data"?e:(e==null?void 0:e.type)==="skip"?t??null:null}function vn(e,t){if(!e)return new Set(t.searchParams.keys());const n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(const a of n){const r=e.searchParams.getAll(a),i=t.searchParams.getAll(a);r.every(s=>i.includes(s))&&i.every(s=>r.includes(s))&&n.delete(a)}return n}function yn({error:e,url:t,route:n,params:a}){return{type:"loaded",state:{error:e,url:t,route:n,params:a,branch:[]},props:{page:nt(R),constructors:[]}}}async function jt({id:e,invalidating:t,url:n,params:a,route:r,preload:i}){if((v==null?void 0:v.id)===e)return Re.delete(v.token),v.promise;const{errors:s,layouts:o,leaf:l}=r,c=[...o,l];s.forEach(h=>h==null?void 0:h().catch(j)),c.forEach(h=>h==null?void 0:h[1]().catch(j));const d=_.url?e!==Le(_.url):!1,u=_.route?r.id!==_.route.id:!1,w=vn(_.url,n);let p=!1;const f=c.map(async(h,g)=>{var $;if(!h)return;const b=_.branch[g];return h[1]===(b==null?void 0:b.loader)&&!wn(p,u,d,w,($=b.universal)==null?void 0:$.uses,a)?b:(p=!0,Qe({loader:h[1],url:n,params:a,route:r,parent:async()=>{var ge;const q={};for(let K=0;K<g;K+=1)Object.assign(q,(ge=await f[K])==null?void 0:ge.data);return q},server_data_node:Ze(h[0]?{type:"skip"}:null,h[0]?b==null?void 0:b.server:void 0)}))});for(const h of f)h.catch(j);const m=[];for(let h=0;h<c.length;h+=1)if(c[h])try{m.push(await f[h])}catch(g){if(g instanceof Ge)return{type:"redirect",location:g.location};if(Re.has(i))return yn({error:await ae(g,{params:a,url:n,route:{id:r.id}}),url:n,params:a,route:r});let b=We(g),x;if(g instanceof Me)x=g.body;else{if(await C.updated.check())return await xt(),await ne(n);x=await ae(g,{params:a,url:n,route:{id:r.id}})}const $=await bn(h,m,s);return $?xe({url:n,params:a,branch:m.slice(0,$.idx).concat($.node),errors:s,status:b,error:x,route:r}):await Nt(n,{id:r.id},x,b)}else m.push(void 0);return xe({url:n,params:a,branch:m,errors:s,status:200,error:null,route:r,form:t?void 0:null})}async function bn(e,t,n){for(;e--;)if(n[e]){let a=e;for(;!t[a];)a-=1;try{return{idx:a+1,node:{node:await n[e](),loader:n[e],data:{},server:null,universal:null}}}catch{continue}}}async function et({status:e,error:t,url:n,route:a}){const r={};let i=null;try{const s=await Qe({loader:De,url:n,params:r,route:a,parent:()=>Promise.resolve({}),server_data_node:Ze(i)}),o={node:await ye(),loader:ye,universal:null,server:null,data:null};return xe({url:n,params:r,branch:[s,o],status:e,error:t,errors:[],route:null})}catch(s){if(s instanceof Ge)return Pt(new URL(s.location,location.href),{},0);throw s}}async function kn(e){const t=e.href;if(_e.has(t))return _e.get(t);let n;try{const a=(async()=>{let r=await S.hooks.reroute({url:new URL(e),fetch:async(i,s)=>_n(i,s,e).promise})??e;if(typeof r=="string"){const i=new URL(e);S.hash?i.hash=r:i.pathname=r,r=i}return r})();_e.set(t,a),n=await a}catch{_e.delete(t);return}return n}async function Te(e,t){if(e&&!Ae(e,U,S.hash)){const n=await kn(e);if(!n)return;const a=Sn(n);for(const r of Ye){const i=r.exec(a);if(i)return{id:Le(e),invalidating:t,route:r,params:Gt(i),url:e}}}}function Sn(e){return Mt(S.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(U.length))||"/"}function Le(e){return(S.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function Ct({url:e,type:t,intent:n,delta:a,event:r,scroll:i}){let s=!1;const o=tt(_,n,e,t,i??null);a!==void 0&&(o.navigation.delta=a),r!==void 0&&(o.navigation.event=r);const l={...o.navigation,cancel:()=>{s=!0,o.reject(new Error("navigation cancelled"))}};return re||Lt.forEach(c=>c(l)),s?null:o}async function F({type:e,url:t,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s={},redirect_count:o=0,nav_token:l={},accept:c=j,block:d=j,event:u}){var K;const w=V;V=l;const p=await Te(t,!1),f=e==="enter"?tt(_,p,t,e):Ct({url:t,type:e,delta:n==null?void 0:n.delta,intent:p,scroll:n==null?void 0:n.scroll,event:u});if(!f){d(),V===l&&(V=w);return}const m=k,h=L;c(),re=!0,Ee&&f.navigation.type!=="enter"&&C.navigating.set(ee.current=f.navigation);let g=p&&await jt(p);if(!g){if(Ae(t,U,S.hash))return await ne(t,i);g=await Nt(t,{id:null},await ae(new ze(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,i)}if(t=(p==null?void 0:p.url)||t,V!==l)return f.reject(new Error("navigation aborted")),!1;if(g.type==="redirect"){if(o<20){await F({type:e,url:new URL(g.location,t),popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s,redirect_count:o+1,nav_token:l}),f.fulfil(void 0);return}g=await et({status:500,error:await ae(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}})}else g.props.page.status>=400&&await C.updated.check()&&(await xt(),await ne(t,i));if(gn(),Je(m),It(h),g.props.page.url.pathname!==t.pathname&&(t.pathname=g.props.page.url.pathname),s=n?n.state:s,!n){const E=i?0:1,H={[z]:k+=E,[Z]:L+=E,[bt]:s};(i?history.replaceState:history.pushState).call(history,H,"",t),i||hn(k,L)}const b=p&&(v==null?void 0:v.id)===p.id?v.fork:null;v!=null&&v.fork&&!b&&Se(),v=null,g.props.page.state=s;let x;if(Ee){const E=(await Promise.all(Array.from(pn,W=>W(f.navigation)))).filter(W=>typeof W=="function");if(E.length>0){let W=function(){E.forEach(Oe=>{Q.delete(Oe)})};E.push(W),E.forEach(Oe=>{Q.add(Oe)})}const H=f.navigation.to;_={...g.state,nav:{params:H.params,route:H.route,url:H.url}},g.props.page&&(g.props.page.url=t);const Ie=b&&await b;Ie?x=Ie.commit():(J=null,Tt.$set(g.props),J&&Object.assign(g.props.page,J),un(g.props.page),x=(K=Bt)==null?void 0:K()),At=!0}else await $t(g,Ve,!1);const{activeElement:$}=document;await x,await we(),await we();let q=null;if(ct){const E=n?n.scroll:r?B():null;E?scrollTo(E.x,E.y):(q=t.hash&&document.getElementById(qt(t)))?q.scrollIntoView():scrollTo(0,0)}const ge=document.activeElement!==$&&document.activeElement!==document.body;!a&&!ge&&An(t,!q),ct=!0,g.props.page&&(J&&Object.assign(g.props.page,J),Object.assign(R,g.props.page)),re=!1,e==="popstate"&&Ot(L),f.fulfil(void 0),f.navigation.to&&(f.navigation.to.scroll=B()),Q.forEach(E=>E(f.navigation)),C.navigating.set(ee.current=null)}async function Nt(e,t,n,a,r){return e.origin===Ue&&e.pathname===location.pathname&&!Ut?await et({status:a,error:n,url:e,route:t}):await ne(e,r)}function En(){let e,t={element:void 0,href:void 0},n;P.addEventListener("mousemove",o=>{const l=o.target;clearTimeout(e),e=setTimeout(()=>{i(l,D.hover)},20)});function a(o){o.defaultPrevented||i(o.composedPath()[0],D.tap)}P.addEventListener("mousedown",a),P.addEventListener("touchstart",a,{passive:!0});const r=new IntersectionObserver(o=>{for(const l of o)l.isIntersecting&&(Ne(new URL(l.target.href)),r.unobserve(l.target))},{threshold:0});async function i(o,l){const c=St(o,P),d=c===t.element&&(c==null?void 0:c.href)===t.href&&l>=n;if(!c||d)return;const{url:u,external:w,download:p}=qe(c,U,S.hash);if(w||p)return;const f=ve(c),m=u&&Le(_.url)===Le(u);if(!(f.reload||m))if(l<=f.preload_data){t={element:c,href:c.href},n=D.tap;const h=await Te(u,!1);if(!h)return;mn(h)}else l<=f.preload_code&&(t={element:c,href:c.href},n=l,Ne(u))}function s(){r.disconnect();for(const o of P.querySelectorAll("a")){const{url:l,external:c,download:d}=qe(o,U,S.hash);if(c||d)continue;const u=ve(o);u.reload||(u.preload_code===D.viewport&&r.observe(o),u.preload_code===D.eager&&Ne(l))}}Q.add(s),s()}function ae(e,t){if(e instanceof Me)return e.body;const n=We(e),a=cn(e);return S.hooks.handleError({error:e,event:t,status:n,message:a})??{message:a}}function qn(e,t={}){return e=new URL(He(e)),e.origin!==Ue?Promise.reject(new Error("goto: invalid URL")):Pt(e,t,0)}function Rn(e){if(typeof e=="function")be.push(e);else{const{href:t}=new URL(e,location.href);be.push(n=>n.href===t)}}function xn(){var t;history.scrollRestoration="manual",addEventListener("beforeunload",n=>{let a=!1;if(dt(),!re){const r=tt(_,void 0,null,"leave"),i={...r.navigation,cancel:()=>{a=!0,r.reject(new Error("navigation cancelled"))}};Lt.forEach(s=>s(i))}a?(n.preventDefault(),n.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&dt()}),(t=navigator.connection)!=null&&t.saveData||En(),P.addEventListener("click",async n=>{if(n.button||n.which!==1||n.metaKey||n.ctrlKey||n.shiftKey||n.altKey||n.defaultPrevented)return;const a=St(n.composedPath()[0],P);if(!a)return;const{url:r,external:i,target:s,download:o}=qe(a,U,S.hash);if(!r)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const l=ve(a);if(!(a instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||o)return;const[d,u]=(S.hash?r.hash.replace(/^#/,""):r.href).split("#"),w=d===$e(location);if(i||l.reload&&(!w||!u)){Ct({url:r,type:"link",event:n})?re=!0:n.preventDefault();return}if(u!==void 0&&w){const[,p]=_.url.href.split("#");if(p===u){if(n.preventDefault(),u===""||u==="top"&&a.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const f=a.ownerDocument.getElementById(decodeURIComponent(u));f&&(f.scrollIntoView(),f.focus())}return}if(Y=!0,Je(k),e(r),!l.replace_state)return;Y=!1}n.preventDefault(),await new Promise(p=>{requestAnimationFrame(()=>{setTimeout(p,0)}),setTimeout(p,100)}),await F({type:"link",url:r,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??r.href===location.href,event:n})}),P.addEventListener("submit",n=>{if(n.defaultPrevented)return;const a=HTMLFormElement.prototype.cloneNode.call(n.target),r=n.submitter;if(((r==null?void 0:r.formTarget)||a.target)==="_blank"||((r==null?void 0:r.formMethod)||a.method)!=="get")return;const o=new URL((r==null?void 0:r.hasAttribute("formaction"))&&(r==null?void 0:r.formAction)||a.action);if(Ae(o,U,!1))return;const l=n.target,c=ve(l);if(c.reload)return;n.preventDefault(),n.stopPropagation();const d=new FormData(l,r);o.search=new URLSearchParams(d).toString(),F({type:"form",url:o,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??o.href===location.href,event:n})}),addEventListener("popstate",async n=>{var a;if(!Be){if((a=n.state)!=null&&a[z]){const r=n.state[z];if(V={},r===k)return;const i=N[r],s=n.state[bt]??{},o=new URL(n.state[an]??location.href),l=n.state[Z],c=_.url?$e(location)===$e(_.url):!1;if(l===L&&(At||c)){s!==R.state&&(R.state=s),e(o),N[k]=B(),i&&scrollTo(i.x,i.y),k=r;return}const u=r-k;await F({type:"popstate",url:o,popped:{state:s,scroll:i,delta:u},accept:()=>{k=r,L=l},block:()=>{history.go(-u)},nav_token:V,event:n})}else if(!Y){const r=new URL(location.href);e(r),S.hash&&location.reload()}}}),addEventListener("hashchange",()=>{Y&&(Y=!1,history.replaceState({...history.state,[z]:++k,[Z]:L},"",location.href))});for(const n of document.querySelectorAll("link"))dn.has(n.rel)&&(n.href=n.href);addEventListener("pageshow",n=>{n.persisted&&C.navigating.set(ee.current=null)});function e(n){_.url=R.url=n,C.page.set(nt(R)),C.page.notify()}}async function Ln(e,{status:t=200,error:n,node_ids:a,params:r,route:i,server_route:s,data:o,form:l}){Ut=!0;const c=new URL(location.href);let d;({params:r={},route:i={id:null}}=await Te(c,!1)||{}),d=Ye.find(({id:p})=>p===i.id);let u,w=!0;try{const p=a.map(async(m,h)=>{const g=o[h];return g!=null&&g.uses&&(g.uses=Un(g.uses)),Qe({loader:S.nodes[m],url:c,params:r,route:i,parent:async()=>{const b={};for(let x=0;x<h;x+=1)Object.assign(b,(await p[x]).data);return b},server_data_node:Ze(g)})}),f=await Promise.all(p);if(d){const m=d.layouts;for(let h=0;h<m.length;h++)m[h]||f.splice(h,0,void 0)}u=await xe({url:c,params:r,branch:f,status:t,error:n,errors:d==null?void 0:d.errors,form:l,route:d??null})}catch(p){if(p instanceof Ge){await ne(new URL(p.location,location.href));return}u=await et({status:We(p),error:await ae(p,{url:c,params:r,route:i}),url:c,route:i}),e.textContent="",w=!1}finally{}u.props.page&&(u.props.page.state={}),await $t(u,e,w)}function Un(e){return{dependencies:new Set((e==null?void 0:e.dependencies)??[]),params:new Set((e==null?void 0:e.params)??[]),parent:!!(e!=null&&e.parent),route:!!(e!=null&&e.route),url:!!(e!=null&&e.url),search_params:new Set((e==null?void 0:e.search_params)??[])}}let Be=!1;function An(e,t=!0){const n=document.querySelector("[autofocus]");if(n)n.focus();else{const a=qt(e);if(a&&document.getElementById(a)){const{x:i,y:s}=B();setTimeout(()=>{const o=history.state;Be=!0,location.replace(new URL(`#${a}`,location.href)),history.replaceState(o,"",e),t&&scrollTo(i,s),Be=!1})}else{const i=document.body,s=i.getAttribute("tabindex");i.tabIndex=-1,i.focus({preventScroll:!0,focusVisible:!1}),s!==null?i.setAttribute("tabindex",s):i.removeAttribute("tabindex")}const r=getSelection();if(r&&r.type!=="None"){const i=[];for(let s=0;s<r.rangeCount;s+=1)i.push(r.getRangeAt(s));setTimeout(()=>{if(r.rangeCount===i.length){for(let s=0;s<r.rangeCount;s+=1){const o=i[s],l=r.getRangeAt(s);if(o.commonAncestorContainer!==l.commonAncestorContainer||o.startContainer!==l.startContainer||o.endContainer!==l.endContainer||o.startOffset!==l.startOffset||o.endOffset!==l.endOffset)return}r.removeAllRanges()}})}}}function tt(e,t,n,a,r=null){var c,d;let i,s;const o=new Promise((u,w)=>{i=u,s=w});return o.catch(j),{navigation:{from:{params:e.params,route:{id:((c=e.route)==null?void 0:c.id)??null},url:e.url,scroll:B()},to:n&&{params:(t==null?void 0:t.params)??null,route:{id:((d=t==null?void 0:t.route)==null?void 0:d.id)??null},url:n,scroll:r},willUnload:!t,type:a,complete:o},fulfil:i,reject:s}}function nt(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Tn(e){const t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function qt(e){let t;if(S.hash){const[,,n]=e.hash.split("#",3);t=n??""}else t=e.hash.slice(1);return decodeURIComponent(t)}export{Nn as a,qn as g,Pn as l,R as p,C as s};
|
|
|
|
|
|
|
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import{k as Ie,o as De,a as v,f as p,s as f,t as ye,d as Ce,c as xe,b as Ae,l as _e}from"./Dlpu43Tj.js";import{q as ve,T as Be,B as we,ba as Oe,i as ze,E as He,aX as Ye,b8 as je,F as We,w as Ue,z as Re,A as ke,h as Ke,ax as Ge,p as X,t as C,a as J,s as i,c as r,r as t,v as re,k as a,J as q,K as ce,G as Qe,bb as Ve,l as pe,j as Se,f as ee}from"./DwbuJhNu.js";import{B as Ze,i as N,p as ie}from"./8F5LpR-T.js";import{e as te,s as m,a as ue,i as oe,b as le,c as Xe,C as Je}from"./CBcGqa-S.js";import{T as ge,c as $e,b as et,d as Fe}from"./Cl16PtNL.js";import{b as tt,_ as at}from"./1oGnrPC6.js";function rt(F,e,S,_,M,n){let u=ve;ve&&Be();var d=null;ve&&we.nodeType===Oe&&(d=we,Be());var x=ve?we:F,h=new Ze(x,!1);ze(()=>{const w=e()||null;var y=w==="svg"?je:void 0;if(w===null){h.ensure(null,null);return}return h.ensure(w,o=>{if(w){if(d=ve?d:Ye(w,y),Ie(d,d),_){ve&&De(w)&&d.append(document.createComment(""));var s=ve?We(d):d.appendChild(Ue());ve&&(s===null?Re(!1):ke(s)),_(d,s)}Ke.nodes.end=d,o.before(d)}ve&&ke(o)}),()=>{}},He),Ge(()=>{}),u&&(Re(!0),ke(x))}var st=p('<a target="_blank" rel="noopener noreferrer"> </a>'),it=p('<li><span class="citation-num"> </span> <div class="citation-body"><div class="citation-line-1"><!> <span class="citation-source"> </span> <span class="citation-vintage"> </span></div> <div class="citation-title"><!></div> <div class="citation-meta"><span class="citation-docid"> </span> <span class="citation-retrieved"> </span></div></div></li>'),nt=p(`<aside class="citation-drawer svelte-1p339fd" aria-label="Citations"><div class="citation-drawer-head"><span class="section-label"> </span> <span class="citation-drawer-meta">live · primary sources</span></div> <ol class="citation-list"></ol> <div class="citation-drawer-foot"><span class="section-label">Trust signals</span> <p class="citation-foot-copy">All foundation models Apache-2.0. All data from public-record federal,
|
| 2 |
+
state, and city sources. No commercial APIs contacted at runtime.</p></div></aside>`);function Ar(F,e){X(e,!0);let S=q(()=>Object.values(e.citations).sort((x,h)=>x.n-h.n));var _=nt(),M=r(_),n=r(M),u=r(n);t(n),re(2),t(M);var d=i(M,2);te(d,21,()=>a(S),x=>x.id,(x,h)=>{var w=it();let y;var o=r(w),s=r(o);t(o);var l=i(o,2),b=r(l),A=r(b);ge(A,{get tier(){return a(h).tier},size:10,get color(){return`var(--tier-${a(h).tier??""})`}});var g=i(A,2),c=r(g,!0);t(g);var k=i(g,2),R=r(k);t(k),t(b);var T=i(b,2),D=r(T);{var j=L=>{var Y=st(),G=r(Y,!0);t(Y),C(()=>{m(Y,"href",a(h).url),f(G,a(h).title)}),v(L,Y)},I=q(()=>a(h).url&&a(h).url.startsWith("http")),O=L=>{var Y=ye();C(()=>f(Y,a(h).title)),v(L,Y)};N(D,L=>{a(I)?L(j):L(O,-1)})}t(T);var z=i(T,2),U=r(z),P=r(U,!0);t(U);var E=i(U,2),B=r(E);t(E),t(z),t(l),t(w),C(()=>{m(w,"id",`cite-${a(h).id??""}`),y=ue(w,1,"citation-item",null,y,{"is-active":$e.active===a(h).id}),f(s,`[${a(h).n??""}]`),f(c,a(h).source),f(R,`v. ${a(h).vintage??""}`),f(P,a(h).docId),f(B,`retr. ${a(h).retrieved??""}`)}),v(x,w)}),t(d),re(2),t(_),C(()=>f(u,`Citations · ${a(S).length??""}`)),v(F,_),J()}const lt="https://basemaps.cartocdn.com/gl/positron-nolabels-gl-style/style.json",Le=`<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
|
| 3 |
+
<rect width="12" height="12" fill="rgba(42,111,168,0.18)"/>
|
| 4 |
+
<g stroke="#2A6FA8" stroke-width="1.4">
|
| 5 |
+
<line x1="-2" y1="2" x2="14" y2="-14"/>
|
| 6 |
+
<line x1="-2" y1="8" x2="14" y2="-8"/>
|
| 7 |
+
<line x1="-2" y1="14" x2="14" y2="-2"/>
|
| 8 |
+
<line x1="-2" y1="20" x2="14" y2="4"/>
|
| 9 |
+
</g>
|
| 10 |
+
</svg>`,ot=`<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
|
| 11 |
+
<rect width="12" height="12" fill="rgba(42,111,168,0.16)"/>
|
| 12 |
+
<g stroke="#2A6FA8" stroke-width="1.1">
|
| 13 |
+
<line x1="-2" y1="6" x2="14" y2="-10"/>
|
| 14 |
+
<line x1="-2" y1="14" x2="14" y2="-2"/>
|
| 15 |
+
<line x1="-2" y1="22" x2="14" y2="6"/>
|
| 16 |
+
</g>
|
| 17 |
+
</svg>`;async function dt(F,e){const S=new Blob([F],{type:"image/svg+xml"}),_=URL.createObjectURL(S);try{return await new Promise((n,u)=>{const d=new Image(e,e);d.onload=()=>n(d),d.onerror=x=>u(x),d.src=_})}finally{URL.revokeObjectURL(_)}}async function vt(F){const e=[["syn-stripe-45",Le,12],["syn-stripe-45-2x",Le,24],["syn-stripe-45-low",ot,12]];for(const[S,_,M]of e)if(!F.hasImage(S))try{const n=await dt(_,M);F.addImage(S,n,{pixelRatio:M/12})}catch(n){console.warn(`syn-stripe registration failed for ${S}`,n)}}var ct=p('<span class="link-badge svelte-wk2bu4" aria-hidden="true"> </span>'),ut=p('<div class="map-frame svelte-wk2bu4"><div role="application" class="rip-map-container svelte-wk2bu4"></div> <!></div>');function Nr(F,e){X(e,!0);let S=ie(e,"activeLayers",19,()=>({empirical:!0,modeled:!0,synthetic:!0,proxy:!0})),_=ie(e,"linkedKey",3,null),M=Se(null),n=null,u=Se(!1);const d={type:"FeatureCollection",features:[]};function x(l,b){if(!n||!a(u))return;const A=n.getSource(l);A&&A.setData(b??d)}function h(l,b){!n||!a(u)||n.getLayer(l)&&n.setLayoutProperty(l,"visibility",b?"visible":"none")}ce(()=>{x("sandy-empirical",e.sandyEmpirical)}),ce(()=>{x("dep-modeled",e.depModeled)}),ce(()=>{x("syn-prior",e.syntheticPrior)}),ce(()=>{x("proxy-311",e.proxy311)}),ce(()=>{x("register-points",e.registerPoints)}),ce(()=>{x("register-polygons",e.registerPolygons)}),ce(()=>{h("tier-empirical-fill",S().empirical),h("tier-empirical-line",S().empirical),h("tier-modeled-fill",S().modeled),h("tier-modeled-line",S().modeled),h("tier-synthetic-fill",S().synthetic),h("tier-synthetic-line",S().synthetic),h("tier-proxy-dots",S().proxy)}),ce(()=>{!n||!a(u)||n.flyTo({center:[e.address.lon,e.address.lat],zoom:15,essential:!0})}),Qe(async()=>{if(!a(M))return;const l=await at(()=>import("./D4L2lGt1.js").then(b=>b.m),[],import.meta.url);n=new l.Map({container:a(M),style:lt,center:[e.address.lon,e.address.lat],zoom:15,attributionControl:{compact:!0}}),n.addControl(new l.NavigationControl({visualizePitch:!1}),"top-right"),n.addControl(new l.ScaleControl({maxWidth:100,unit:"imperial"}),"bottom-left"),n.on("load",()=>{if(!n)return;window.__riprapMap=n,vt(n);const b=()=>({type:"FeatureCollection",features:[]});n.addSource("sandy-empirical",{type:"geojson",data:e.sandyEmpirical??b()}),n.addSource("dep-modeled",{type:"geojson",data:e.depModeled??b()}),n.addSource("syn-prior",{type:"geojson",data:e.syntheticPrior??b()}),n.addSource("proxy-311",{type:"geojson",data:e.proxy311??b()}),n.addSource("register-points",{type:"geojson",data:e.registerPoints??b()}),n.addSource("register-polygons",{type:"geojson",data:e.registerPolygons??b()}),n.addSource("queried-address",{type:"geojson",data:{type:"FeatureCollection",features:[{type:"Feature",geometry:{type:"Point",coordinates:[e.address.lon,e.address.lat]},properties:{label:e.address.label}}]}}),n.addLayer({id:"tier-empirical-fill",type:"fill",source:"sandy-empirical",paint:{"fill-color":"#0B5394","fill-opacity":.4}}),n.addLayer({id:"tier-empirical-line",type:"line",source:"sandy-empirical",paint:{"line-color":"#0B5394","line-width":1.5}}),n.addLayer({id:"tier-modeled-fill",type:"fill",source:"dep-modeled",paint:{"fill-color":"#2A6FA8","fill-opacity":.25}}),n.addLayer({id:"tier-modeled-line",type:"line",source:"dep-modeled",paint:{"line-color":"#2A6FA8","line-width":1.5}}),n.addLayer({id:"tier-synthetic-fill",type:"fill",source:"syn-prior",paint:{"fill-pattern":"syn-stripe-45","fill-opacity":.65}}),n.addLayer({id:"tier-synthetic-line",type:"line",source:"syn-prior",paint:{"line-color":"#2A6FA8","line-width":1.5,"line-dasharray":[4,3]}}),n.addLayer({id:"tier-proxy-dots",type:"circle",source:"proxy-311",paint:{"circle-color":"transparent","circle-stroke-color":"#6B6B6B","circle-stroke-width":1.25,"circle-radius":["interpolate",["linear"],["coalesce",["get","count"],1],1,3,5,6,15,9,30,12]}}),n.addLayer({id:"register-polygons-fill",type:"fill",source:"register-polygons",paint:{"fill-color":"#0B5394","fill-opacity":["interpolate",["linear"],["coalesce",["get","pct_inside_sandy"],0],0,.1,25,.2,50,.32,75,.45]}}),n.addLayer({id:"register-polygons-line",type:"line",source:"register-polygons",paint:{"line-color":"#0B5394","line-width":1,"line-opacity":.85}}),n.addLayer({id:"register-points-circle",type:"circle",source:"register-points",paint:{"circle-color":["case",["==",["get","inside_sandy_2012"],!0],"#0B5394","#6B6B6B"],"circle-stroke-color":"#FAFAF7","circle-stroke-width":1.25,"circle-radius":["match",["get","kind"],"subway",4,"school",5,"hospital",6,"nycha",7,4],"circle-opacity":.9}}),n.on("mouseenter","register-points-circle",()=>{n&&(n.getCanvas().style.cursor="pointer")}),n.on("mouseleave","register-points-circle",()=>{n&&(n.getCanvas().style.cursor="")}),n.on("click","register-points-circle",A=>{var z;if(!n||!((z=A.features)!=null&&z.length))return;const g=A.features[0],c=g.properties??{},k=String(c.name??"?"),R=String(c.kind??"?"),T=c.inside_sandy_2012===!0||c.inside_sandy_2012==="true",D=String(c.doc_id??""),j=`
|
| 18 |
+
<div style="font-family: 'IBM Plex Sans', system-ui; font-size: 12px;">
|
| 19 |
+
<div style="font-weight: 600; color: #1A1A1A;">${k}</div>
|
| 20 |
+
<div style="color: #6B6B6B; font-size: 11px; margin-top: 2px;">${R}</div>
|
| 21 |
+
<div style="margin-top: 6px;">
|
| 22 |
+
<span style="font-family: 'IBM Plex Mono', monospace; font-size: 10.5px; color: ${T?"#0B5394":"#6B6B6B"};">
|
| 23 |
+
inside_sandy_2012=${T}
|
| 24 |
+
</span>
|
| 25 |
+
</div>
|
| 26 |
+
${D?`<div style="margin-top: 4px; font-family: 'IBM Plex Mono', monospace; font-size: 10.5px; color: #B8620A;">[${D}]</div>`:""}
|
| 27 |
+
</div>`,I=new l.Popup({closeButton:!0,offset:12}),O=g.geometry.coordinates;I.setLngLat(O).setHTML(j).addTo(n)}),n.addLayer({id:"queried-halo",type:"circle",source:"queried-address",paint:{"circle-color":"rgba(209, 124, 0, 0.20)","circle-radius":16}}),n.addLayer({id:"queried-pin",type:"circle",source:"queried-address",paint:{"circle-color":"#D17C00","circle-stroke-color":"#FAFAF7","circle-stroke-width":2,"circle-radius":7}}),n.addLayer({id:"queried-label",type:"symbol",source:"queried-address",layout:{"text-field":["get","label"],"text-font":["Open Sans Semibold","Arial Unicode MS Bold"],"text-size":12,"text-offset":[0,-1.6],"text-anchor":"bottom"},paint:{"text-color":"#1A1A1A","text-halo-color":"#FAFAF7","text-halo-width":1.5}}),pe(u,!0)})}),Ve(()=>{n==null||n.remove(),n=null});var w=ut(),y=r(w);tt(y,l=>pe(M,l),()=>a(M));var o=i(y,2);{var s=l=>{var b=ct(),A=r(b);t(b),C(()=>f(A,`linked: ${_()??""}`)),v(l,b)};N(o,l=>{_()&&l(s)})}t(w),C(()=>{m(w,"data-linked",_()??""),m(y,"aria-label",`Flood-exposure map for ${e.address.label??""}`)}),v(F,w),J()}const Ne=["cornerstone","keystone","touchstone","lodestone","capstone"],Me={cornerstone:{name:"Cornerstone",role:"the hazard reader",tag:"what NYC's ground remembers"},keystone:{name:"Keystone",role:"the asset register",tag:"what's exposed"},touchstone:{name:"Touchstone",role:"the live observer",tag:"what's happening now"},lodestone:{name:"Lodestone",role:"the projector",tag:"what's coming"},capstone:{name:"Capstone",role:"the synthesizer",tag:"writes it all down with citations"}};var gt=p('<span class="layers-count svelte-1g2dety"> </span>'),ht=p('<li class="layers-row layers-row-empty svelte-1g2dety"><span class="layers-empty-text svelte-1g2dety">no map layers — see Findings cards</span></li>'),_t=p('<li class="layers-row layers-row-empty svelte-1g2dety"><span class="layers-empty-text svelte-1g2dety">not a map layer</span></li>'),ft=p('<span class="layers-state-dim svelte-1g2dety" title="Not yet wired to map source">off · catalog</span>'),mt=p('<li><span class="layers-glyph svelte-1g2dety" aria-hidden="true"><!></span> <span class="layers-text svelte-1g2dety"><span class="layers-label svelte-1g2dety"> </span> <span class="layers-meta svelte-1g2dety"> <!></span></span> <span class="layers-state svelte-1g2dety"><!></span></li>'),yt=p('<details open=""><summary class="svelte-1g2dety"><span class="layers-caret svelte-1g2dety" aria-hidden="true">▾</span> <span class="layers-stone-name svelte-1g2dety"> </span> <span class="layers-stone-tag svelte-1g2dety"> </span> <!></summary> <ul class="layers-list svelte-1g2dety"><!></ul></details>'),pt=p('<button type="button"><!> <span> </span> <span class="layers-master-state svelte-1g2dety"> </span></button>'),xt=p('<aside class="layers-panel svelte-1g2dety" aria-label="Map layers grouped by Stone"><div class="layers-head svelte-1g2dety"><span class="section-label">Layers · grouped by Stone</span></div> <!> <div class="layers-masters svelte-1g2dety" role="group" aria-label="Master tier toggles"><span class="section-label">Tier toggles</span> <div class="layers-master-row svelte-1g2dety"></div></div></aside>');function Br(F,e){X(e,!0);const S={cornerstone:[{label:"Sandy Inundation Zone (2012)",source:"NYC OEM",tier:"empirical",wired:!0},{label:"FEMA / DEP scenarios",source:"FEMA · NYC DEP",tier:"modeled",wired:!0},{label:"Ida HWM points (2021)",source:"USGS STN",tier:"empirical",wired:!1},{label:"Microtopography (HAND/TWI)",source:"USGS 3DEP",tier:"proxy",wired:!1}],keystone:[{label:"MTA subway entrances",source:"MTA Open Data",tier:"empirical",wired:!0},{label:"NYCHA developments",source:"NYC OD phvi-damg",tier:"empirical",wired:!0},{label:"DOE schools",source:"NYC DOE Locations",tier:"empirical",wired:!0},{label:"DOH hospitals",source:"NYS DOH vn5v-hh5r",tier:"empirical",wired:!0},{label:"TerraMind Buildings (current)",source:"msradam/TerraMind-NYC-Adapters",tier:"synthetic",wired:!1}],touchstone:[{label:"311 flood complaints",source:"NYC 311",tier:"proxy",wired:!0},{label:"FloodNet sensors",source:"FloodNet NYC",tier:"empirical",wired:!1},{label:"TerraMind LULC (current)",source:"msradam/TerraMind-NYC-Adapters",tier:"synthetic",wired:!1},{label:"Prithvi-NYC-Pluvial flood pred.",source:"msradam/Prithvi-EO-2.0-NYC-Pluvial",tier:"modeled",wired:!1}],lodestone:[],capstone:[]};function _(w){return!!e.active[w.tier]}function M(w){return S[w].length}const n=[{k:"empirical",tier:"empirical",label:"EMP"},{k:"modeled",tier:"modeled",label:"MOD"},{k:"proxy",tier:"proxy",label:"PRX"},{k:"synthetic",tier:"synthetic",label:"SYN"}];var u=xt(),d=i(r(u),2);te(d,16,()=>Ne,w=>w,(w,y)=>{var o=yt(),s=r(o),l=i(r(s),2),b=r(l,!0);t(l);var A=i(l,2),g=r(A);t(A);var c=i(A,2);{var k=z=>{var U=gt(),P=r(U,!0);t(U),C(E=>f(P,E),[()=>M(y)]),v(z,U)},R=q(()=>M(y)>0);N(c,z=>{a(R)&&z(k)})}t(s);var T=i(s,2),D=r(T);{var j=z=>{var U=ht();v(z,U)},I=z=>{var U=_t();v(z,U)},O=z=>{var U=xe(),P=ee(U);te(P,17,()=>S[y],oe,(E,B)=>{var L=mt();let Y;var G=r(L),ae=r(G);ge(ae,{get tier(){return a(B).tier},size:11,get color(){return`var(--tier-${a(B).tier??""})`}}),t(G);var Q=i(G,2),Z=r(Q),ne=r(Z,!0);t(Z);var H=i(Z,2),V=r(H),K=i(V);et(K,{get tier(){return a(B).tier},compact:!0}),t(H),t(Q);var W=i(Q,2),$=r(W);{var de=se=>{var me=ft();v(se,me)},fe=se=>{var me=ye("on");v(se,me)},be=q(()=>_(a(B))),he=se=>{var me=ye("off");v(se,me)};N($,se=>{a(B).wired?a(be)?se(fe,1):se(he,-1):se(de)})}t(W),t(L),C(()=>{Y=ue(L,1,"layers-row svelte-1g2dety",null,Y,{dim:!a(B).wired}),f(ne,a(B).label),f(V,`${a(B).source??""} · `)}),v(E,L)}),v(z,U)};N(D,z=>{y==="lodestone"?z(j):y==="capstone"?z(I,1):z(O,-1)})}t(T),t(o),C(()=>{ue(o,1,`layers-group region-${y??""}`,"svelte-1g2dety"),f(b,Me[y].name),f(g,`— ${Me[y].tag??""}`)}),v(w,o)});var x=i(d,2),h=i(r(x),2);te(h,21,()=>n,w=>w.k,(w,y)=>{var o=pt();let s;var l=r(o);ge(l,{get tier(){return a(y).tier},size:11,get color(){return`var(--tier-${a(y).tier??""})`}});var b=i(l,2),A=r(b,!0);t(b);var g=i(b,2),c=r(g,!0);t(g),t(o),C(()=>{s=ue(o,1,"layers-master svelte-1g2dety",null,s,{"is-on":e.active[a(y).k]}),m(o,"aria-pressed",e.active[a(y).k]),f(A,a(y).label),f(c,e.active[a(y).k]?"ON":"OFF")}),Ae("click",o,()=>e.onToggle(a(y).k)),v(w,o)}),t(h),t(x),t(u),v(F,u),J()}Ce(["click"]);var bt=p('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-silent svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> silent</span>',1),wt=p('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-warn svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> warned</span>',1),kt=p('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-err svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> errored</span>',1),St=p('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-notinvoked svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> not invoked</span>',1),Mt=p('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> cache</span>',1),Ct=p('<div class="rh svelte-1vuwkv4"><span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> Stones</span> <span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> fired</span> <!> <!> <!> <!> <span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> </span> <span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> wall-clock</span> <!> <span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-total svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> registered</span></div>');function At(F,e){X(e,!0);function S(H){return H.flatMap(V=>V.children?[V,...S(V.children)]:[V])}let _=q(()=>e.stones.flatMap(H=>S(H.members))),M=q(()=>a(_).length),n=q(()=>a(_).filter(H=>H.status==="fired"||H.status==="warned").length),u=q(()=>a(_).filter(H=>H.status==="silent_by_design").length),d=q(()=>a(_).filter(H=>H.status==="warned").length),x=q(()=>a(_).filter(H=>H.status==="errored").length),h=q(()=>a(_).filter(H=>H.status==="not_invoked").length),w=q(()=>e.wallSeconds==null?"—":e.wallSeconds<1?`${Math.round(e.wallSeconds*1e3)}ms`:`${e.wallSeconds.toFixed(1)}s`);var y=Ct(),o=r(y),s=r(o),l=r(s,!0);t(s),re(),t(o);var b=i(o,4),A=r(b),g=r(A,!0);t(A),re(),t(b);var c=i(b,2);{var k=H=>{var V=bt(),K=i(ee(V),2),W=r(K),$=r(W,!0);t(W),re(),t(K),C(()=>f($,a(u))),v(H,V)};N(c,H=>{a(u)>0&&H(k)})}var R=i(c,2);{var T=H=>{var V=wt(),K=i(ee(V),2),W=r(K),$=r(W,!0);t(W),re(),t(K),C(()=>f($,a(d))),v(H,V)};N(R,H=>{a(d)>0&&H(T)})}var D=i(R,2);{var j=H=>{var V=kt(),K=i(ee(V),2),W=r(K),$=r(W,!0);t(W),re(),t(K),C(()=>f($,a(x))),v(H,V)};N(D,H=>{a(x)>0&&H(j)})}var I=i(D,2);{var O=H=>{var V=St(),K=i(ee(V),2),W=r(K),$=r(W,!0);t(W),re(),t(K),C(()=>f($,a(h))),v(H,V)};N(I,H=>{a(h)>0&&H(O)})}var z=i(I,4),U=r(z),P=r(U,!0);t(U);var E=i(U);t(z);var B=i(z,4),L=r(B),Y=r(L,!0);t(L),re(),t(B);var G=i(B,2);{var ae=H=>{var V=Mt(),K=i(ee(V),2),W=r(K),$=r(W);t(W),re(),t(K),C(de=>f($,`${de??""}%`),[()=>Math.round(e.cacheHit*100)]),v(H,V)};N(G,H=>{e.cacheHit!=null&&H(ae)})}var Q=i(G,4),Z=r(Q),ne=r(Z,!0);t(Z),re(),t(Q),t(y),C(()=>{f(l,e.stones.length),f(g,a(n)),f(P,e.cards.length),f(E,` evidence card${e.cards.length===1?"":"s"}`),f(Y,a(w)),f(ne,a(M))}),v(F,y),J()}var Nt=p('<div class="subhead svelte-lygj3j"> </div>'),Bt=p('<p class="body-prose svelte-lygj3j"> </p>'),Rt=p('<div class="body body-headline svelte-lygj3j"><div class="headline svelte-lygj3j"> </div> <!> <!></div>');function Ft(F,e){X(e,!0);var S=Rt(),_=r(S),M=r(_,!0);t(_);var n=i(_,2);{var u=h=>{var w=Nt(),y=r(w,!0);t(w),C(()=>f(y,e.card.subhead)),v(h,w)};N(n,h=>{e.card.subhead&&h(u)})}var d=i(n,2);{var x=h=>{var w=Bt(),y=r(w,!0);t(w),C(()=>f(y,e.card.body)),v(h,w)};N(d,h=>{e.card.body&&h(x)})}t(S),C(()=>{le(_,`color: var(--tier-${e.card.tier??""});`),f(M,e.card.headline??"")}),v(F,S),J()}var Lt=p('<th class="svelte-1nlkuao"> </th>'),Et=p('<td class="svelte-1nlkuao"> </td>'),Tt=p('<tr class="svelte-1nlkuao"></tr>'),Pt=p('<div class="body-sub svelte-1nlkuao"> </div>'),qt=p('<div class="body body-tabular svelte-1nlkuao"><table class="t svelte-1nlkuao"><thead><tr></tr></thead><tbody></tbody></table> <!></div>');function It(F,e){X(e,!0);var S=qt(),_=r(S),M=r(_),n=r(M);te(n,21,()=>e.card.columns??[],oe,(h,w)=>{var y=Lt(),o=r(y,!0);t(y),C(()=>f(o,a(w))),v(h,y)}),t(n),t(M);var u=i(M);te(u,21,()=>e.card.rows??[],oe,(h,w)=>{var y=Tt();te(y,21,()=>a(w),oe,(o,s)=>{var l=Et(),b=r(l,!0);t(l),C(()=>f(b,a(s))),v(o,l)}),t(y),v(h,y)}),t(u),t(_);var d=i(_,2);{var x=h=>{var w=Pt(),y=r(w,!0);t(w),C(()=>f(y,e.card.sub)),v(h,w)};N(d,h=>{e.card.sub&&h(x)})}t(S),v(F,S),J()}var Dt=p('<div class="cell svelte-stf9c8"><div class="value svelte-stf9c8"> </div> <div class="label svelte-stf9c8"> </div></div>'),Ot=p('<div class="body-sub svelte-stf9c8"> </div>'),zt=p('<div class="body body-scalars svelte-stf9c8"><div class="row svelte-stf9c8"></div> <!></div>');function Ht(F,e){X(e,!0);var S=zt(),_=r(S);te(_,21,()=>e.card.scalars??[],oe,(u,d)=>{var x=Dt(),h=r(x),w=r(h,!0);t(h);var y=i(h,2),o=r(y,!0);t(y),t(x),C(()=>{le(h,`color: var(--tier-${e.card.tier??""});`),f(w,a(d).value),f(o,a(d).label)}),v(u,x)}),t(_);var M=i(_,2);{var n=u=>{var d=Ot(),x=r(d,!0);t(d),C(()=>f(x,e.card.sub)),v(u,d)};N(M,u=>{e.card.sub&&u(n)})}t(S),v(F,S),J()}var Yt=p('<div class="headline svelte-jrppts"> </div>'),jt=p('<div class="subhead svelte-jrppts"> </div>'),Wt=_e("<rect></rect>"),Ut=p('<div class="body-sub svelte-jrppts"> </div>'),Kt=p('<div class="body-sub svelte-jrppts"> </div>'),Gt=p('<div class="body body-spark svelte-jrppts"><!> <!> <svg width="100%" preserveAspectRatio="none" aria-hidden="true" class="svelte-jrppts"></svg> <!> <!></div>');function Qt(F,e){X(e,!0);const S=240,_=38;let M=q(()=>e.card.spark??e.card.histogram??[]),n=q(()=>Math.max(...a(M),1)),u=q(()=>a(M).length),d=q(()=>Math.max(2,S/Math.max(a(u),1)-1.5));var x=Gt(),h=r(x);{var w=c=>{var k=Yt(),R=r(k,!0);t(k),C(()=>{le(k,`color: var(--tier-${e.card.tier??""});`),f(R,e.card.headline)}),v(c,k)};N(h,c=>{e.card.headline&&c(w)})}var y=i(h,2);{var o=c=>{var k=jt(),R=r(k,!0);t(k),C(()=>f(R,e.card.subhead)),v(c,k)};N(y,c=>{e.card.subhead&&c(o)})}var s=i(y,2);m(s,"viewBox","0 0 240 38"),m(s,"height",_),te(s,21,()=>a(M),oe,(c,k,R)=>{var T=Wt();C(()=>{m(T,"x",R/a(u)*S+.5),m(T,"y",_-a(k)/a(n)*_),m(T,"width",a(d)),m(T,"height",a(k)/a(n)*_),m(T,"fill",`var(--tier-${e.card.tier??""})`)}),v(c,T)}),t(s);var l=i(s,2);{var b=c=>{var k=Ut(),R=r(k,!0);t(k),C(()=>f(R,e.card.sparkSub)),v(c,k)};N(l,c=>{e.card.sparkSub&&c(b)})}var A=i(l,2);{var g=c=>{var k=Kt(),R=r(k,!0);t(k),C(()=>f(R,e.card.sub)),v(c,k)};N(A,c=>{!e.card.sparkSub&&e.card.sub&&c(g)})}t(x),v(F,x),J()}var Vt=p('<span class="headline svelte-48vbub"> </span>'),Zt=p('<span class="subhead svelte-48vbub"> </span>'),Xt=p('<span class="spatial-note svelte-48vbub"> </span>'),Jt=p("<span> </span>"),$t=p('<div class="body-sub svelte-48vbub"><!> <!></div>'),ea=p('<div class="body body-timeseries svelte-48vbub"><div class="ts-header svelte-48vbub"><!> <!></div> <svg width="100%" aria-hidden="true" class="svelte-48vbub"><line stroke="#C9C9C5" stroke-width="0.5" stroke-dasharray="2 2"></line><path fill="none" stroke-width="1.4"></path><circle r="3"></circle><text font-size="9" font-family="IBM Plex Mono" text-anchor="middle"> </text><text font-size="8" font-family="IBM Plex Mono" fill="#6B6B6B">now</text><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#6B6B6B"> </text></svg> <!></div>');function Ee(F,e){X(e,!0);const S=240,_=84,M=6,n=q(()=>e.card.timeseries??{hours:96,peak:{x:38,y:47},peakLabel:""}),u=q(()=>h(a(n))),d=q(()=>w(a(u),a(n))),x=q(()=>y(a(u),a(d)));function h(E){const B=[];for(let L=0;L<=E.hours;L++){const Y=6*Math.sin(L/12.42*Math.PI*2),G=38*Math.exp(-Math.pow((L-E.peak.x)/12,2));B.push({x:L,y:Y+G+4})}return B}function w(E,B){const L=Math.max(...E.map(G=>G.y),B.peak.y),Y=Math.min(...E.map(G=>G.y),-10);return{sx:G=>M+G/B.hours*(S-M*2),sy:G=>_-M-14-(G-Y)/(L-Y)*(_-M*2-14)}}function y(E,B){return E.map((L,Y)=>`${Y?"L":"M"} ${B.sx(L.x)} ${B.sy(L.y)}`).join(" ")}var o=ea(),s=r(o),l=r(s);{var b=E=>{var B=Vt(),L=r(B,!0);t(B),C(()=>{le(B,`color: var(--tier-${e.card.tier??""});`),f(L,e.card.headline)}),v(E,B)};N(l,E=>{e.card.headline&&E(b)})}var A=i(l,2);{var g=E=>{var B=Zt(),L=r(B,!0);t(B),C(()=>f(L,e.card.subhead)),v(E,B)};N(A,E=>{e.card.subhead&&E(g)})}t(s);var c=i(s,2);m(c,"viewBox","0 0 240 84"),m(c,"height",_);var k=r(c);m(k,"x1",M),m(k,"x2",S-M);var R=i(k),T=i(R),D=i(T),j=r(D,!0);t(D);var I=i(D);m(I,"x",M),m(I,"y",_-2);var O=i(I);m(O,"x",S-M),m(O,"y",_-2);var z=r(O);t(O),t(c);var U=i(c,2);{var P=E=>{var B=$t(),L=r(B);{var Y=Q=>{var Z=Xt(),ne=r(Z,!0);t(Z),C(()=>f(ne,e.card.spatialNote)),v(Q,Z)};N(L,Q=>{e.card.spatialNote&&Q(Y)})}var G=i(L,2);{var ae=Q=>{var Z=Jt(),ne=r(Z,!0);t(Z),C(()=>f(ne,e.card.sub)),v(Q,Z)};N(G,Q=>{e.card.sub&&Q(ae)})}t(B),v(E,B)};N(U,E=>{(e.card.spatialNote||e.card.sub)&&E(P)})}t(o),C((E,B,L,Y,G,ae)=>{m(k,"y1",E),m(k,"y2",B),m(R,"d",a(x)),m(R,"stroke",`var(--tier-${e.card.tier??""})`),m(T,"cx",L),m(T,"cy",Y),m(T,"fill",`var(--tier-${e.card.tier??""})`),m(D,"x",G),m(D,"y",ae),m(D,"fill",`var(--tier-${e.card.tier??""})`),f(j,a(n).peakLabel),f(z,`+${a(n).hours??""}h`)},[()=>a(d).sy(0),()=>a(d).sy(0),()=>a(d).sx(a(n).peak.x),()=>a(d).sy(a(n).peak.y),()=>a(d).sx(a(n).peak.x),()=>a(d).sy(a(n).peak.y)-6]),v(F,o),J()}var ta=p('<span class="ft-stat svelte-1y25lfh"><span class="ft-stat-k svelte-1y25lfh">RMSE</span> </span>'),aa=p('<span class="ft-stat ft-skill svelte-1y25lfh"> </span>'),ra=p('<span class="ft-badge svelte-1y25lfh" title="Trained on this hardware"> </span>'),sa=p('<a class="ft-link svelte-1y25lfh" target="_blank" rel="noopener noreferrer">Model card ↗</a>'),ia=p('<!> <div class="ft-footer svelte-1y25lfh"><!> <!> <!> <!></div>',1);function na(F,e){X(e,!0);var S=ia(),_=ee(S);Ee(_,{get card(){return e.card}});var M=i(_,2),n=r(M);{var u=s=>{var l=ta(),b=i(r(l));t(l),C(()=>f(b,` ${e.card.rmse??""}`)),v(s,l)};N(n,s=>{e.card.rmse&&s(u)})}var d=i(n,2);{var x=s=>{var l=aa(),b=r(l,!0);t(l),C(()=>f(b,e.card.skillVsPersistence)),v(s,l)};N(d,s=>{e.card.skillVsPersistence&&s(x)})}var h=i(d,2);{var w=s=>{var l=ra(),b=r(l,!0);t(l),C(()=>f(b,e.card.hardwareBadge)),v(s,l)};N(h,s=>{e.card.hardwareBadge&&s(w)})}var y=i(h,2);{var o=s=>{var l=sa();C(b=>m(l,"href",b),[()=>e.card.hfModelCard.startsWith("http")?e.card.hfModelCard:`https://${e.card.hfModelCard}`]),v(s,l)};N(y,s=>{e.card.hfModelCard&&s(o)})}t(M),v(F,S),J()}var la=_e('<circle r="2.2"></circle><text font-size="9" font-family="IBM Plex Mono" text-anchor="middle" fill="#6B6B6B"> </text>',1),oa=p('<div class="body-sub svelte-gqkhpe"> </div>'),da=p('<div class="body body-forecast svelte-gqkhpe"><svg width="100%" aria-hidden="true" class="svelte-gqkhpe"><path fill-opacity="0.18"></path><path fill="none" stroke-width="1.5"></path><!></svg> <!></div>');function va(F,e){X(e,!0);const S=240,_=88,M=6;let n=q(()=>e.card.forecast??[]),u=q(()=>a(n).map((c,k)=>M+k/Math.max(a(n).length-1,1)*(S-M*2))),d=q(()=>Math.max(...a(n).map(c=>c.high),1));function x(c){return _-M-c/a(d)*(_-M*2-12)}let h=q(()=>a(u).map((c,k)=>`${k?"L":"M"} ${c} ${x(a(n)[k].mid)}`).join(" ")),w=q(()=>{if(!a(n).length)return"";const c=a(u).map((R,T)=>`${R} ${x(a(n)[T].low)}`).join(" L "),k=[...a(u)].reverse().map((R,T)=>`${R} ${x(a(n)[a(n).length-1-T].high)}`).join(" L ");return`M ${c} L ${k} Z`});var y=da(),o=r(y);m(o,"viewBox","0 0 240 88"),m(o,"height",_);var s=r(o),l=i(s),b=i(l);te(b,17,()=>a(n),oe,(c,k,R)=>{var T=la(),D=ee(T),j=i(D);m(j,"y",_-1);var I=r(j,!0);t(j),C(O=>{m(D,"cx",a(u)[R]),m(D,"cy",O),m(D,"fill",`var(--tier-${e.card.tier??""})`),m(j,"x",a(u)[R]),f(I,a(k).year)},[()=>x(a(k).mid)]),v(c,T)}),t(o);var A=i(o,2);{var g=c=>{var k=oa(),R=r(k,!0);t(k),C(()=>f(R,e.card.sub)),v(c,k)};N(A,c=>{e.card.sub&&c(g)})}t(y),C(()=>{m(s,"d",a(w)),m(s,"fill",`var(--tier-${e.card.tier??""})`),m(l,"d",a(h)),m(l,"stroke",`var(--tier-${e.card.tier??""})`)}),v(F,y),J()}var ca=_e('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><rect fill="#F2F2EE"></rect><g stroke="#D9D6CC" stroke-width="0.6"><line x1="0" y1="40" y2="40"></line><line x1="0" y1="80" y2="80"></line><line x1="60" y1="0" x2="60"></line><line x1="160" y1="0" x2="160"></line></g><path d="M20 50 Q 60 38 90 56 Q 120 76 150 64 Q 180 50 180 86 Q 130 100 70 96 Q 30 92 20 76 Z" fill="rgba(42,111,168,0.32)" stroke="#2A6FA8" stroke-width="0.7"></path><path d="M40 60 Q 80 54 110 70 Q 140 84 160 78 Q 165 90 130 92 Q 80 90 50 82 Z" fill="rgba(11,83,148,0.36)" stroke="#0B5394" stroke-width="0.6"></path><circle cx="120" cy="74" r="3.2" fill="#D17C00" stroke="#FAFAF7" stroke-width="1.3"></circle><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#6B6B6B">2.13 in/hr · MOD</text></svg>'),ua=_e('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><rect fill="#F2F2EE"></rect><g stroke="#D9D6CC" stroke-width="0.6"><line x1="0" y1="40" y2="40"></line><line x1="0" y1="80" y2="80"></line><line x1="60" y1="0" x2="60"></line><line x1="160" y1="0" x2="160"></line></g><path d="M180 92 Q 200 88 215 96 Q 220 105 200 104 Q 185 102 180 96 Z" fill="rgba(42,111,168,0.18)" stroke="#2A6FA8" stroke-width="0.5" stroke-dasharray="2 2"></path><circle cx="120" cy="60" r="3.2" fill="#D17C00" stroke="#FAFAF7" stroke-width="1.3"></circle><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#6B6B6B">no ponding · MOD</text></svg>'),ga=_e('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><defs><pattern id="rt-s2-rgb" x="0" y="0" width="6" height="6" patternUnits="userSpaceOnUse"><rect width="6" height="6" fill="#7A8E6A"></rect><rect x="0" y="0" width="3" height="3" fill="#8D9C7A"></rect><rect x="3" y="3" width="3" height="3" fill="#69795D"></rect></pattern></defs><rect fill="url(#rt-s2-rgb)"></rect><rect x="0" y="55" height="6" fill="#A8A496"></rect><rect x="115" y="0" width="8" fill="#A8A496"></rect><ellipse cx="50" cy="92" rx="6" ry="3" fill="#2A6FA8" fill-opacity="0.65"></ellipse><text x="6" y="14" font-size="9" font-family="IBM Plex Mono" fill="#FAFAF7">PRITHVI · 0.3%</text><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#FAFAF7">scene 2026-05-02</text></svg>'),ha=_e('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><rect fill="#F2F2EE"></rect><rect x="0" y="0" width="80" height="60" fill="#C66"></rect><rect x="80" y="0" width="60" height="60" fill="#C66"></rect><rect x="140" y="0" width="100" height="38" fill="#C66"></rect><rect x="140" y="38" width="100" height="22" fill="#5B7FB4"></rect><rect x="0" y="60" width="100" height="60" fill="#C66"></rect><rect x="100" y="60" width="50" height="40" fill="#5B8A4A"></rect><rect x="150" y="60" width="50" height="60" fill="#D9C75A"></rect><rect x="200" y="60" width="40" height="60" fill="#C66"></rect><rect x="100" y="100" width="50" height="20" fill="#A89A78"></rect><text x="6" y="14" font-size="9" font-family="IBM Plex Mono" fill="#FAFAF7">LULC · TerraMind</text><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#FAFAF7">scene 2026-05-02</text></svg>'),_a=_e('<rect fill="rgba(42,111,168,0.55)" stroke="#2A6FA8" stroke-width="0.4"></rect>'),fa=_e('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><rect fill="#3A3A38"></rect><!><text x="6" y="14" font-size="9" font-family="IBM Plex Mono" fill="#FAFAF7">BLDG · TerraMind</text><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#FAFAF7">36.2% built</text></svg>'),ma=p('<div class="thumb-placeholder svelte-1lx1psy">raster preview</div>');function Te(F,e){var M=xe(),n=ee(M);{var u=o=>{var s=ca();m(s,"viewBox","0 0 240 120"),m(s,"height",120);var l=r(s);m(l,"width",240),m(l,"height",120);var b=i(l),A=r(b);m(A,"x2",240);var g=i(A);m(g,"x2",240);var c=i(g);m(c,"y2",120);var k=i(c);m(k,"y2",120),t(b);var R=i(b,4);m(R,"x",234),m(R,"y",115),t(s),v(o,s)},d=o=>{var s=ua();m(s,"viewBox","0 0 240 120"),m(s,"height",120);var l=r(s);m(l,"width",240),m(l,"height",120);var b=i(l),A=r(b);m(A,"x2",240);var g=i(A);m(g,"x2",240);var c=i(g);m(c,"y2",120);var k=i(c);m(k,"y2",120),t(b);var R=i(b,3);m(R,"x",234),m(R,"y",115),t(s),v(o,s)},x=o=>{var s=ga();m(s,"viewBox","0 0 240 120"),m(s,"height",120);var l=i(r(s));m(l,"width",240),m(l,"height",120);var b=i(l);m(b,"width",240);var A=i(b);m(A,"height",120);var g=i(A,3);m(g,"x",234),m(g,"y",115),t(s),v(o,s)},h=o=>{var s=ha();m(s,"viewBox","0 0 240 120"),m(s,"height",120);var l=r(s);m(l,"width",240),m(l,"height",120);var b=i(l,11);m(b,"x",234),m(b,"y",115),t(s),v(o,s)},w=o=>{var s=fa();m(s,"viewBox","0 0 240 120"),m(s,"height",120);var l=r(s);m(l,"width",240),m(l,"height",120);var b=i(l);te(b,16,()=>[[10,10,28,18],[42,10,30,16],[78,10,40,22],[124,10,32,18],[162,10,30,18],[198,10,32,18],[10,32,28,16],[42,30,30,18],[124,32,32,16],[162,32,30,16],[198,32,32,16],[10,55,28,18],[42,55,30,18],[78,55,40,18],[124,55,32,18],[162,55,30,18],[198,55,32,18],[10,80,28,16],[42,80,30,16],[78,80,40,16],[124,80,32,16],[162,80,30,16],[10,100,28,12],[42,100,30,12],[78,100,40,12]],oe,(g,c)=>{var k=_a();C(()=>{m(k,"x",c[0]),m(k,"y",c[1]),m(k,"width",c[2]),m(k,"height",c[3])}),v(g,k)});var A=i(b,2);m(A,"x",234),m(A,"y",115),t(s),v(o,s)},y=o=>{var s=ma();v(o,s)};N(n,o=>{e.kind==="stormwater"?o(u):e.kind==="stormwater-dry"?o(d,1):e.kind==="prithvi"?o(x,2):e.kind==="lulc"?o(h,3):e.kind==="buildings"?o(w,4):o(y,-1)})}v(F,M)}var ya=p('<span class="illustrative svelte-1m43x1m" title="Illustrative rendering, not source pixels">illustrative</span>'),pa=p('<span class="svelte-1m43x1m"> </span>'),xa=p('<div class="raster-headline svelte-1m43x1m"><span class="svelte-1m43x1m"> </span> <!></div>'),ba=p('<div class="body-sub svelte-1m43x1m"> </div>'),wa=p('<div class="body body-raster svelte-1m43x1m"><div class="frame svelte-1m43x1m"><!> <!></div> <!> <!></div>');function ka(F,e){X(e,!0);var S=wa(),_=r(S),M=r(_);Te(M,{get kind(){return e.card.rasterKind}});var n=i(M,2);{var u=y=>{var o=ya();v(y,o)};N(n,y=>{(e.card.illustrative||e.card.tier==="synthetic")&&y(u)})}t(_);var d=i(_,2);{var x=y=>{var o=xa(),s=r(o),l=r(s,!0);t(s);var b=i(s,2);{var A=g=>{var c=pa(),k=r(c);t(c),C(()=>f(k,`· ${e.card.subhead??""}`)),v(g,c)};N(b,g=>{e.card.subhead&&g(A)})}t(o),C(()=>{le(s,`color: var(--tier-${e.card.tier??""});`),f(l,e.card.headline)}),v(y,o)};N(d,y=>{e.card.headline&&y(x)})}var h=i(d,2);{var w=y=>{var o=ba(),s=r(o,!0);t(o),C(()=>f(s,e.card.sub)),v(y,o)};N(h,y=>{e.card.sub&&y(w)})}t(S),v(F,S),J()}var Sa=p('<span class="illustrative svelte-1td276x" title="Illustrative rendering, not source pixels">illustrative</span>'),Ma=p('<span class="bar-seg svelte-1td276x"></span>'),Ca=p('<li class="svelte-1td276x"><span class="swatch svelte-1td276x"></span> <span class="legend-k svelte-1td276x"> </span> <span class="legend-pct svelte-1td276x"> </span></li>'),Aa=p('<div class="bar svelte-1td276x" role="img" aria-label="LULC class mix"></div> <ul class="legend svelte-1td276x"></ul>',1),Na=p('<div class="body-sub svelte-1td276x"> </div>'),Ba=p('<div class="body body-lulc svelte-1td276x"><div class="frame svelte-1td276x"><!> <!></div> <!> <!></div>');function Ra(F,e){X(e,!0);let S=q(()=>(e.card.classMix??[]).reduce((o,s)=>o+(s.pct||0),0)||1);var _=Ba(),M=r(_),n=r(M);{let o=q(()=>e.card.rasterKind??"lulc");Te(n,{get kind(){return a(o)}})}var u=i(n,2);{var d=o=>{var s=Sa();v(o,s)};N(u,o=>{(e.card.illustrative||e.card.tier==="synthetic")&&o(d)})}t(M);var x=i(M,2);{var h=o=>{var s=Aa(),l=ee(s);te(l,21,()=>e.card.classMix,A=>A.k,(A,g)=>{var c=Ma();let k;C(()=>{m(c,"title",`${a(g).k??""}: ${a(g).pct??""}%`),k=le(c,"",k,{"flex-grow":a(g).pct/a(S),background:a(g).color})}),v(A,c)}),t(l);var b=i(l,2);te(b,21,()=>e.card.classMix,A=>A.k,(A,g)=>{var c=Ca(),k=r(c);let R;var T=i(k,2),D=r(T,!0);t(T);var j=i(T,2),I=r(j);t(j),t(c),C(()=>{R=le(k,"",R,{background:a(g).color}),f(D,a(g).k),f(I,`${a(g).pct??""}%`)}),v(A,c)}),t(b),v(o,s)};N(x,o=>{var s;(s=e.card.classMix)!=null&&s.length&&o(h)})}var w=i(x,2);{var y=o=>{var s=Na(),l=r(s,!0);t(s),C(()=>f(l,e.card.sub)),v(o,s)};N(w,o=>{e.card.sub&&o(y)})}t(_),v(F,_),J()}var Fa=p('<span class="reg-label svelte-1iup6im"> </span> <span class="reg-source svelte-1iup6im"> </span>',1),La=p('<span class="reg-silent svelte-1iup6im"> </span>'),Ea=p('<li><span class="reg-tag svelte-1iup6im"><!> <span> </span></span> <!></li>'),Ta=p('<div class="body-sub svelte-1iup6im"> </div>'),Pa=p('<div class="body body-register svelte-1iup6im"><ul class="reg-list svelte-1iup6im"></ul> <!></div>');function qa(F,e){X(e,!0);var S=Pa(),_=r(S);te(_,21,()=>e.card.registers??[],oe,(u,d)=>{var x=Ea();let h;var w=r(x),y=r(w);ge(y,{get tier(){return a(d).tier},size:9,get color(){return`var(--tier-${a(d).tier??""})`}});var o=i(y,2),s=r(o,!0);t(o),t(w);var l=i(w,2);{var b=g=>{var c=Fa(),k=ee(c),R=r(k,!0);t(k);var T=i(k,2),D=r(T,!0);t(T),C(()=>{m(k,"title",a(d).detail?`${a(d).label} — ${a(d).detail}`:a(d).label),f(R,a(d).label),f(D,a(d).sourceId??"")}),v(g,c)},A=g=>{var c=La(),k=r(c,!0);t(c),C(()=>f(k,a(d).note)),v(g,c)};N(l,g=>{a(d).label?g(b):g(A,-1)})}t(x),C(()=>{h=ue(x,1,"reg-row svelte-1iup6im",null,h,{silent:!a(d).label}),m(w,"title",a(d).tier),f(s,a(d).reg)}),v(u,x)}),t(_);var M=i(_,2);{var n=u=>{var d=Ta(),x=r(d,!0);t(d),C(()=>f(x,e.card.sub)),v(u,d)};N(M,u=>{e.card.sub&&u(n)})}t(S),v(F,S),J()}var Ia=p('<div class="cell-aux svelte-1swqabu"> </div>'),Da=p('<div class="cell svelte-1swqabu"><div class="cell-tier svelte-1swqabu"><!> <span class="cell-label"> </span></div> <div class="cell-value svelte-1swqabu"> </div> <!></div>'),Oa=p('<div class="cell-aux svelte-1swqabu"> </div>'),za=p('<div class="cell svelte-1swqabu"><div class="cell-tier svelte-1swqabu"><!> <span class="cell-label"> </span></div> <div class="cell-value svelte-1swqabu"> </div> <!></div>'),Ha=p('<div class="cmp-delta svelte-1swqabu"> </div>'),Ya=p('<div class="body-sub svelte-1swqabu"> </div>'),ja=p('<div class="body body-comparison svelte-1swqabu"><div class="cmp-grid svelte-1swqabu"><!> <div class="divider svelte-1swqabu" aria-hidden="true">vs</div> <!></div> <!> <!></div>');function Wa(F,e){X(e,!0);var S=ja(),_=r(S),M=r(_);{var n=o=>{var s=Da(),l=r(s),b=r(l);ge(b,{get tier(){return e.card.left.tier},size:10,get color(){return`var(--tier-${e.card.left.tier??""})`}});var A=i(b,2),g=r(A,!0);t(A),t(l);var c=i(l,2),k=r(c,!0);t(c);var R=i(c,2);{var T=D=>{var j=Ia(),I=r(j,!0);t(j),C(()=>f(I,e.card.left.aux)),v(D,j)};N(R,D=>{e.card.left.aux&&D(T)})}t(s),C(()=>{f(g,e.card.left.label),le(c,`color: var(--tier-${e.card.left.tier??""});`),f(k,e.card.left.value)}),v(o,s)};N(M,o=>{e.card.left&&o(n)})}var u=i(M,4);{var d=o=>{var s=za(),l=r(s),b=r(l);ge(b,{get tier(){return e.card.right.tier},size:10,get color(){return`var(--tier-${e.card.right.tier??""})`}});var A=i(b,2),g=r(A,!0);t(A),t(l);var c=i(l,2),k=r(c,!0);t(c);var R=i(c,2);{var T=D=>{var j=Oa(),I=r(j,!0);t(j),C(()=>f(I,e.card.right.aux)),v(D,j)};N(R,D=>{e.card.right.aux&&D(T)})}t(s),C(()=>{f(g,e.card.right.label),le(c,`color: var(--tier-${e.card.right.tier??""});`),f(k,e.card.right.value)}),v(o,s)};N(u,o=>{e.card.right&&o(d)})}t(_);var x=i(_,2);{var h=o=>{var s=Ha(),l=r(s,!0);t(s),C(()=>f(l,e.card.delta)),v(o,s)};N(x,o=>{e.card.delta&&o(h)})}var w=i(x,2);{var y=o=>{var s=Ya(),l=r(s,!0);t(s),C(()=>f(l,e.card.sub)),v(o,s)};N(w,o=>{e.card.sub&&o(y)})}t(S),v(F,S),J()}var Ua=p('<div class="meta-row svelte-e40scu"><dt class="svelte-e40scu"> </dt> <dd class="svelte-e40scu"> </dd></div>'),Ka=p('<div class="body-sub svelte-e40scu"> </div>'),Ga=p('<div class="body body-meta svelte-e40scu"><dl class="meta-list svelte-e40scu"></dl> <!></div>');function Qa(F,e){X(e,!0);var S=Ga(),_=r(S);te(_,21,()=>e.card.metaRows??[],oe,(u,d)=>{var x=Ua(),h=r(x),w=r(h,!0);t(h);var y=i(h,2),o=r(y,!0);t(y),t(x),C(()=>{f(w,a(d).k),f(o,a(d).v)}),v(u,x)}),t(_);var M=i(_,2);{var n=u=>{var d=Ka(),x=r(d,!0);t(d),C(()=>f(x,e.card.sub)),v(u,d)};N(M,u=>{e.card.sub&&u(n)})}t(S),v(F,S),J()}var Va=p('<div class="unknown svelte-1x6xqhh"> </div>');function Za(F,e){X(e,!0);var S=xe(),_=ee(S);{var M=g=>{Ft(g,{get card(){return e.card}})},n=g=>{It(g,{get card(){return e.card}})},u=g=>{Ht(g,{get card(){return e.card}})},d=g=>{Qt(g,{get card(){return e.card}})},x=g=>{Ee(g,{get card(){return e.card}})},h=g=>{na(g,{get card(){return e.card}})},w=g=>{va(g,{get card(){return e.card}})},y=g=>{ka(g,{get card(){return e.card}})},o=g=>{Ra(g,{get card(){return e.card}})},s=g=>{qa(g,{get card(){return e.card}})},l=g=>{Wa(g,{get card(){return e.card}})},b=g=>{Qa(g,{get card(){return e.card}})},A=g=>{var c=Va(),k=r(c);t(c),C(()=>f(k,`unknown variant: ${e.card.variant??""}`)),v(g,c)};N(_,g=>{e.card.variant==="headline"?g(M):e.card.variant==="tabular"?g(n,1):e.card.variant==="scalars"?g(u,2):e.card.variant==="spark"||e.card.variant==="histogram"?g(d,3):e.card.variant==="timeseries"?g(x,4):e.card.variant==="timeseries-ft"?g(h,5):e.card.variant==="forecast"?g(w,6):e.card.variant==="raster"||e.card.variant==="raster-pred"?g(y,7):e.card.variant==="lulc"?g(o,8):e.card.variant==="register"?g(s,9):e.card.variant==="comparison"?g(l,10):e.card.variant==="meta"?g(b,11):g(A,-1)})}v(F,S),J()}var Xa=p('<button type="button" class="fc-foot-cite svelte-1nuvnzu"><span class="fc-foot-docid svelte-1nuvnzu"> </span> <span class="fc-foot-arrow svelte-1nuvnzu" aria-hidden="true">→</span></button>'),Ja=p('<span class="fc-foot-docid fc-foot-docid-mute svelte-1nuvnzu"> </span>'),$a=p('<header class="fc-head svelte-1nuvnzu"><div class="fc-head-source svelte-1nuvnzu"><!> <span class="fc-head-source-label svelte-1nuvnzu"> </span></div> <span class="fc-head-vintage svelte-1nuvnzu"> </span></header> <h4 class="fc-title svelte-1nuvnzu"> </h4> <!> <footer class="fc-foot svelte-1nuvnzu"><!> <span><!> <span> </span></span></footer>',1);function Pe(F,e){X(e,!0);let S=ie(e,"density",3,"comfortable"),_=ie(e,"linkedKey",3,null),M=q(()=>_()!=null&&e.card.mapLayer!=null&&e.card.mapLayer===_()),n=q(()=>Fe[e.card.tier].short),u=q(()=>e.card.mapLayer!=null);function d(){var s;e.card.mapLayer&&((s=e.onLink)==null||s.call(e,e.card.mapLayer))}function x(){var s;e.card.mapLayer&&((s=e.onLink)==null||s.call(e,null))}function h(s){var l;s.stopPropagation(),e.card.citeId&&((l=e.onCite)==null||l.call(e,e.card.citeId))}function w(s){var l;a(u)&&(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),(l=e.onLink)==null||l.call(e,e.card.mapLayer??null))}var y=xe(),o=ee(y);rt(o,()=>a(u)?"button":"article",!1,(s,l)=>{Xe(s,()=>({type:a(u)?"button":void 0,role:a(u)?"button":"article",class:`fc fc-${e.card.variant??""} fc-tier-${e.card.tier??""}`,"aria-labelledby":`fc-${e.card.id}-title`,"aria-label":`${Fe[e.card.tier].label} card · ${e.card.title} · ${e.card.source}`,onpointerenter:d,onpointerleave:x,onfocus:d,onblur:x,onkeydown:w,[Je]:{"is-compact":S()==="compact","is-linked":a(M),"is-interactive":a(u),"has-illustrative":e.card.illustrative||e.card.tier==="synthetic"||e.card.variant==="comparison"}}),void 0,void 0,void 0,"svelte-1nuvnzu");var b=$a(),A=ee(b),g=r(A),c=r(g);ge(c,{get tier(){return e.card.tier},size:11,get color(){return`var(--tier-${e.card.tier??""})`}});var k=i(c,2),R=r(k,!0);t(k),t(g);var T=i(g,2),D=r(T);t(T),t(A);var j=i(A,2),I=r(j,!0);t(j);var O=i(j,2);Za(O,{get card(){return e.card}});var z=i(O,2),U=r(z);{var P=ae=>{var Q=Xa(),Z=r(Q),ne=r(Z,!0);t(Z),re(2),t(Q),C(()=>{m(Q,"title",`Open ${e.card.docId} in citation drawer`),f(ne,e.card.docId)}),Ae("click",Q,h),v(ae,Q)},E=ae=>{var Q=Ja(),Z=r(Q,!0);t(Q),C(()=>f(Z,e.card.docId)),v(ae,Q)};N(U,ae=>{e.card.citeId?ae(P):ae(E,-1)})}var B=i(U,2),L=r(B);ge(L,{get tier(){return e.card.tier},size:9,get color(){return`var(--tier-${e.card.tier??""})`}});var Y=i(L,2),G=r(Y,!0);t(Y),t(B),t(z),C(()=>{m(k,"title",e.card.agency),f(R,e.card.source),f(D,`v. ${e.card.vintage??""}`),m(j,"id",`fc-${e.card.id}-title`),f(I,e.card.title),ue(B,1,`fc-tier-badge fc-tier-badge-${e.card.tier??""}`,"svelte-1nuvnzu"),m(B,"aria-label",`epistemic tier ${a(n)}`),f(G,a(n))}),v(l,b)}),v(F,y),J()}Ce(["click"]);var er=p('<span class="sep svelte-1qqbvs2">·</span> <span class="silent svelte-1qqbvs2"><strong class="svelte-1qqbvs2"> </strong> silent</span>',1),tr=p('<span class="sep svelte-1qqbvs2">·</span> <span class="warn svelte-1qqbvs2"><strong class="svelte-1qqbvs2"> </strong> warn</span>',1),ar=p('<span class="sep svelte-1qqbvs2">·</span> <span class="err svelte-1qqbvs2"><strong class="svelte-1qqbvs2"> </strong> errored</span>',1),rr=p('<span class="sep svelte-1qqbvs2">·</span> <span class="notinvoked svelte-1qqbvs2"><strong class="svelte-1qqbvs2"> </strong> not invoked</span>',1),sr=p('<span class="tally svelte-1qqbvs2"><span class="cards"> </span> <span class="sep svelte-1qqbvs2">·</span> <span class="fired"><strong class="svelte-1qqbvs2"> </strong> fired</span> <!> <!> <!> <!> <span class="sep svelte-1qqbvs2">·</span> <span class="ms"><strong class="svelte-1qqbvs2"> </strong></span></span>');function ir(F,e){X(e,!0);function S(P){return P.flatMap(E=>E.children?[E,...S(E.children)]:[E])}let _=q(()=>S(e.members)),M=q(()=>a(_).filter(P=>P.status==="fired"||P.status==="warned").length),n=q(()=>a(_).filter(P=>P.status==="silent_by_design").length),u=q(()=>a(_).filter(P=>P.status==="warned").length),d=q(()=>a(_).filter(P=>P.status==="errored").length),x=q(()=>a(_).filter(P=>P.status==="not_invoked").length),h=q(()=>e.members.reduce((P,E)=>Math.max(P,E.ms??0),0));function w(P){return P===0?"—":P<1e3?`${P}ms`:`${(P/1e3).toFixed(1)}s`}var y=sr(),o=r(y),s=r(o);t(o);var l=i(o,4),b=r(l),A=r(b,!0);t(b),re(),t(l);var g=i(l,2);{var c=P=>{var E=er(),B=i(ee(E),2),L=r(B),Y=r(L,!0);t(L),re(),t(B),C(()=>f(Y,a(n))),v(P,E)};N(g,P=>{a(n)>0&&P(c)})}var k=i(g,2);{var R=P=>{var E=tr(),B=i(ee(E),2),L=r(B),Y=r(L,!0);t(L),re(),t(B),C(()=>f(Y,a(u))),v(P,E)};N(k,P=>{a(u)>0&&P(R)})}var T=i(k,2);{var D=P=>{var E=ar(),B=i(ee(E),2),L=r(B),Y=r(L,!0);t(L),re(),t(B),C(()=>f(Y,a(d))),v(P,E)};N(T,P=>{a(d)>0&&P(D)})}var j=i(T,2);{var I=P=>{var E=rr(),B=i(ee(E),2),L=r(B),Y=r(L,!0);t(L),re(),t(B),C(()=>f(Y,a(x))),v(P,E)};N(j,P=>{a(x)>0&&P(I)})}var O=i(j,4),z=r(O),U=r(z,!0);t(z),t(O),t(y),C(P=>{f(s,`${e.cardCount??""} card${e.cardCount===1?"":"s"}`),f(A,a(M)),f(U,P)},[()=>w(a(h))]),v(F,y),J()}var nr=p('<span class="prov-tier svelte-qakefz"><!></span>'),lr=p('<span class="prov-note svelte-qakefz"> </span>'),or=p('<span class="prov-ms svelte-qakefz"> </span>'),dr=p('<li class="prov-children svelte-qakefz"><!></li>'),vr=p('<li><span class="prov-pip svelte-qakefz" aria-hidden="true"> </span> <span class="prov-id svelte-qakefz"> </span> <!> <span class="prov-name svelte-qakefz"> </span> <!> <!></li> <!>',1),cr=p('<ul class="prov-tree svelte-qakefz"></ul>');function qe(F,e){X(e,!0);let S=ie(e,"depth",3,0);function _(u){return{fired:"●",silent_by_design:"○",warned:"▲",errored:"■",not_invoked:"□"}[u]}function M(u){return u.status==="warned"?"#B7791F":u.status==="errored"?"#B91C1C":u.status==="silent_by_design"||u.status==="not_invoked"?"var(--ink-tertiary)":u.tier?`var(--tier-${u.tier})`:"var(--ink)"}var n=cr();te(n,21,()=>e.members,u=>u.id,(u,d)=>{var x=vr(),h=ee(x),w=r(h),y=r(w,!0);t(w);var o=i(w,2),s=r(o,!0);t(o);var l=i(o,2);{var b=I=>{var O=nr(),z=r(O);{let U=q(()=>`var(--tier-${a(d).tier})`);ge(z,{get tier(){return a(d).tier},size:9,get color(){return a(U)}})}t(O),v(I,O)};N(l,I=>{a(d).tier&&I(b)})}var A=i(l,2),g=r(A,!0);t(A);var c=i(A,2);{var k=I=>{var O=lr(),z=r(O);t(O),C(()=>f(z,`— ${a(d).note??""}`)),v(I,O)};N(c,I=>{a(d).note&&I(k)})}var R=i(c,2);{var T=I=>{var O=or(),z=r(O,!0);t(O),C(U=>f(z,U),[()=>a(d).ms<1e3?`${a(d).ms}ms`:`${(a(d).ms/1e3).toFixed(1)}s`]),v(I,O)};N(R,I=>{a(d).ms!=null&&I(T)})}t(h);var D=i(h,2);{var j=I=>{var O=dr(),z=r(O);{let U=q(()=>S()+1);qe(z,{get members(){return a(d).children},get depth(){return a(U)}})}t(O),v(I,O)};N(D,I=>{var O;(O=a(d).children)!=null&&O.length&&I(j)})}C((I,O)=>{ue(h,1,`prov-row prov-status-${a(d).status??""}`,"svelte-qakefz"),le(w,`color: ${I??""};`),f(y,O),f(s,a(d).id),f(g,a(d).name)},[()=>M(a(d)),()=>_(a(d).status)]),v(u,x)}),t(n),C(()=>le(n,`--depth: ${S()??""};`)),v(F,n),J()}var ur=p('<div class="silent svelte-16iv0n8"><span class="silent-tag svelte-16iv0n8">silent</span> <p class="silent-prose svelte-16iv0n8"><!></p></div>'),gr=p("<div></div>"),hr=p('<div class="prov-body svelte-16iv0n8"><!></div>'),_r=p('<section><header class="region-head svelte-16iv0n8"><div class="region-head-left svelte-16iv0n8"><span class="region-num svelte-16iv0n8"> </span> <h3 class="region-name svelte-16iv0n8"> </h3> <span class="region-role svelte-16iv0n8"> </span> <span class="region-tag svelte-16iv0n8"> </span></div> <!></header> <!> <div class="prov svelte-16iv0n8"><button type="button" class="prov-toggle svelte-16iv0n8"><span class="prov-caret svelte-16iv0n8" aria-hidden="true"> </span> <span class="prov-label"> </span> <span class="prov-meta svelte-16iv0n8"> </span></button> <!></div></section>');function fr(F,e){X(e,!0);let S=ie(e,"density",3,"comfortable"),_=ie(e,"provenanceMode",3,"smart"),M=ie(e,"linkedKey",3,null),n=q(()=>Me[e.stone]),u=q(()=>`${Ne.indexOf(e.stone)+1}`.padStart(2,"0")),d=q(()=>e.stone==="capstone");function x(K){return K.flatMap(W=>W.children?[W,...x(W.children)]:[W])}let h=q(()=>x(e.trace.members)),w=q(()=>a(h).length),y=q(()=>a(h).some(K=>K.status==="warned"||K.status==="errored"||K.status==="not_invoked")),o=q(()=>_()==="all-expanded"?!0:_()==="all-collapsed"?!1:a(y)),s=Se(null),l=q(()=>a(s)??a(o));ce(()=>{_(),pe(s,null)});var b=_r(),A=r(b),g=r(A),c=r(g),k=r(c,!0);t(c);var R=i(c,2),T=r(R,!0);t(R);var D=i(R,2),j=r(D);t(D);var I=i(D,2),O=r(I,!0);t(I),t(g);var z=i(g,2);ir(z,{get cardCount(){return e.cards.length},get members(){return e.trace.members}}),t(A);var U=i(A,2);{var P=K=>{var W=ur(),$=i(r(W),2),de=r($);{var fe=he=>{var se=ye("No projection cards landed for this query. Atomic functions still ran (see provenance) and returned silence rather than confabulation.");v(he,se)},be=he=>{var se=ye("No cards for this Stone on this query.");v(he,se)};N(de,he=>{e.stone==="lodestone"?he(fe):he(be,-1)})}t($),t(W),v(K,W)},E=K=>{var W=gr();let $;te(W,21,()=>e.cards,de=>de.id,(de,fe)=>{Pe(de,{get card(){return a(fe)},get density(){return S()},get linkedKey(){return M()},get onCite(){return e.onCite},get onLink(){return e.onLink}})}),t(W),C(()=>$=ue(W,1,"rail svelte-16iv0n8",null,$,{"rail-capstone":a(d)})),v(K,W)};N(U,K=>{e.cards.length===0?K(P):K(E,-1)})}var B=i(U,2),L=r(B),Y=r(L),G=r(Y,!0);t(Y);var ae=i(Y,2),Q=r(ae);t(ae);var Z=i(ae,2),ne=r(Z);t(Z),t(L);var H=i(L,2);{var V=K=>{var W=hr(),$=r(W);qe($,{get members(){return e.trace.members}}),t(W),C(()=>m(W,"id",`prov-body-${e.stone}`)),v(K,W)};N(H,K=>{a(l)&&K(V)})}t(B),t(b),C(()=>{ue(b,1,`region region-${e.stone??""}`,"svelte-16iv0n8"),m(b,"aria-labelledby",`region-h-${e.stone}`),m(b,"data-stone",e.stone),f(k,a(u)),m(R,"id",`region-h-${e.stone}`),f(T,a(n).name),f(j,`· ${a(n).role??""}`),f(O,a(n).tag),m(L,"aria-expanded",a(l)),m(L,"aria-controls",`prov-body-${e.stone}`),f(G,a(l)?"▾":"▸"),f(Q,`${a(l)?"Hide":"Show"} provenance`),f(ne,`· ${a(w)??""} function${a(w)===1?"":"s"}`)}),Ae("click",L,()=>pe(s,!a(l))),v(F,b),J()}Ce(["click"]);var mr=p('<section class="region region-grammar svelte-gwg123" aria-label="Card grammar reference"><header class="region-head svelte-gwg123"><div class="region-head-left svelte-gwg123"><span class="region-num svelte-gwg123">SPEC</span> <h3 class="region-name svelte-gwg123">Card grammar</h3> <span class="region-role svelte-gwg123">· every body variant in the system</span> <span class="region-tag svelte-gwg123">stubs, not findings</span></div> <span class="grammar-count svelte-gwg123"> </span></header> <div class="rail svelte-gwg123"></div></section>');function yr(F,e){let S=ie(e,"density",3,"comfortable");const _=[{id:"grm-headline",stone:"cornerstone",tier:"modeled",variant:"headline",source:"FEMA",agency:"spec",vintage:"spec",title:"Single big number, scenario-tagged",headline:"Zone AE",subhead:"preliminary FIRM, panel ID",sub:"Use when the answer is one categorical state.",docId:"DS-HEADLINE"},{id:"grm-tabular",stone:"cornerstone",tier:"empirical",variant:"tabular",source:"USGS",agency:"spec",vintage:"spec",title:"Small table of observations",columns:["id","value","dist."],rows:[["ROW-001","1.2 m","0.18 mi"],["ROW-002","0.9 m","0.32 mi"],["ROW-003","0.7 m","0.41 mi"]],sub:"Use when 3–8 records each carry the same fields.",docId:"DS-TABULAR"},{id:"grm-scalars",stone:"touchstone",tier:"empirical",variant:"scalars",source:"NWS",agency:"spec",vintage:"spec",title:"Trio of scalar readings",scalars:[{value:"0.02 in",label:"precip · 24h"},{value:"11 mph",label:"wind"},{value:"63°F",label:"temp"}],sub:"Use for current-state dashboards.",docId:"DS-SCALARS"},{id:"grm-spark",stone:"touchstone",tier:"empirical",variant:"spark",source:"FloodNet",agency:"spec",vintage:"spec",title:"Sparkline of recent events",headline:"n events",subhead:"window · peak",spark:[1,2,4,3,7,12,8,5,3,2,4,9,6],docId:"DS-SPARK"},{id:"grm-histogram",stone:"touchstone",tier:"proxy",variant:"histogram",source:"NYC 311",agency:"spec",vintage:"spec",title:"Histogram of binned counts",headline:"n calls",subhead:"window · seasonal note",histogram:[3,2,1,0,1,4,7,12,18,11,5,3,4,2,1,0,2,3,8,9,4,2,1,0],docId:"DS-HIST"},{id:"grm-timeseries",stone:"lodestone",tier:"modeled",variant:"timeseries",source:"Granite TTM",agency:"spec",vintage:"spec",title:"Forecast curve with horizon",headline:"+0.41 m peak",subhead:"+38h · 90% CI",timeseries:{hours:96,peak:{x:38,y:41},peakLabel:"+0.41 m"},spatialNote:"regional",sub:"Spatial-index callout when station ≠ point-of-query.",docId:"DS-TS"},{id:"grm-forecast",stone:"lodestone",tier:"modeled",variant:"forecast",source:"NPCC4",agency:"spec",vintage:"spec",title:"Long-horizon scenario projections",forecast:[{year:2030,low:4,mid:6,high:9},{year:2050,low:13,mid:22,high:30},{year:2100,low:38,mid:71,high:114}],sub:"Use for decadal+ uncertainty cones.",docId:"DS-FCST"},{id:"grm-raster",stone:"cornerstone",tier:"modeled",variant:"raster",source:"NYC DEP",agency:"spec",vintage:"spec",title:"Raster snapshot, mapped layer",rasterKind:"stormwater",headline:"ponding",subhead:"scenario · pixel summary",sub:"Use for any 2D model output.",docId:"DS-RASTER"},{id:"grm-rasterpred",stone:"touchstone",tier:"modeled",variant:"raster-pred",source:"Prithvi-NYC",agency:"spec",vintage:"spec",title:"Raster prediction, illustrative",rasterKind:"prithvi",headline:"n% flooded",subhead:"model · scene id",illustrative:!0,sub:"Same chrome as raster + illustrative tag.",docId:"DS-RASTERPRED"},{id:"grm-register",stone:"keystone",tier:"empirical",variant:"register",source:"NYC OpenData",agency:"spec",vintage:"spec",title:"Composite register list",registers:[{reg:"MTA",tier:"empirical",label:"Station entrance",detail:"0.18 mi · 5",sourceId:"MTA-X",note:null},{reg:"NYCHA",tier:"empirical",label:"Development",detail:"0.41 mi · 2,878 res.",sourceId:"NYCHA-Y",note:null},{reg:"DOH",tier:"empirical",label:null,detail:null,sourceId:null,note:"no acute-care hospital within 1.0 mi"}],sub:"Use when many specialists join into one Stone.",docId:"DS-REGISTER"},{id:"grm-comparison",stone:"keystone",tier:"synthetic",variant:"comparison",source:"EMP × SYN",agency:"spec",vintage:"spec",title:"Documented vs. interpreted",left:{tier:"empirical",label:"documented",value:"31.4%",aux:"n polygons"},right:{tier:"synthetic",label:"interpreted",value:"29.8%",aux:"n polygons"},delta:"Δ = −1.6 pp · agreement strong",sub:"Use to surface model–ground-truth deltas.",docId:"DS-CMP"},{id:"grm-meta",stone:"capstone",tier:"modeled",variant:"meta",source:"Mellea",agency:"spec",vintage:"spec",title:"Capstone reconciliation",metaRows:[{k:"claims",v:"12 / 12 grounded"},{k:"tier mix",v:"EMP 5 · MOD 4 · PRX 2 · SYN 1"},{k:"tier-1 freshness",v:"median 38 d"},{k:"warnings",v:"0"}],sub:"Use to expose the synthesis layer's audit.",docId:"DS-META"}];var M=mr(),n=r(M),u=i(r(n),2),d=r(u);t(u),t(n);var x=i(n,2);te(x,21,()=>_,h=>h.id,(h,w)=>{Pe(h,{get card(){return a(w)},get density(){return S()}})}),t(x),t(M),C(()=>f(d,`${_.length??""} variants`)),v(F,M)}var pr=p('<section class="findings svelte-ci42t5" aria-label="Findings, grouped by Stone"><header class="findings-head svelte-ci42t5"><h2 class="findings-h2 svelte-ci42t5">Findings · grouped by Stone</h2> <span class="findings-tagline svelte-ci42t5">cards = what each Stone found · provenance collapses below</span></header> <!> <!> <!></section>');function Rr(F,e){X(e,!0);let S=ie(e,"density",3,"comfortable"),_=ie(e,"provenanceMode",3,"smart"),M=ie(e,"showGrammar",3,!1),n=ie(e,"linkedKey",3,null),u=q(()=>{const s={cornerstone:[],keystone:[],touchstone:[],lodestone:[],capstone:[]};for(const l of e.data.cards)s[l.stone].push(l);return s}),d=q(()=>{const s={cornerstone:{key:"cornerstone",members:[]},keystone:{key:"keystone",members:[]},touchstone:{key:"touchstone",members:[]},lodestone:{key:"lodestone",members:[]},capstone:{key:"capstone",members:[]}};for(const l of e.data.stones)s[l.key]=l;return s});var x=pr(),h=i(r(x),2);At(h,{get cards(){return e.data.cards},get stones(){return e.data.stones},get wallSeconds(){return e.data.wallSeconds},get cacheHit(){return e.data.cacheHit}});var w=i(h,2);te(w,16,()=>Ne,s=>s,(s,l)=>{fr(s,{get stone(){return l},get cards(){return a(u)[l]},get trace(){return a(d)[l]},get density(){return S()},get provenanceMode(){return _()},get linkedKey(){return n()},get onCite(){return e.onCite},get onLink(){return e.onLink}})});var y=i(w,2);{var o=s=>{yr(s,{get density(){return S()}})};N(y,s=>{M()&&s(o)})}t(x),v(F,x),J()}const xr={cornerstone:[{id:"CORN-001",name:"sandy_inundation.lookup",stepNames:["sandy_inundation","sandy_nta"],tier:"empirical",skipReason:"Sandy 2012 inundation: query outside NYC bounds"},{id:"CORN-002",name:"dep_stormwater.lookup",stepNames:["dep_stormwater","dep_extreme_2080_nta","dep_moderate_2050_nta","dep_moderate_current_nta"],tier:"modeled",skipReason:"NYC DEP stormwater scenarios: query outside NYC bounds"},{id:"CORN-003",name:"usgs_hwm.spatial_join",stepNames:["ida_hwm_2021"],tier:"empirical",skipReason:"USGS Ida HWMs: no marks within 800 m of address"},{id:"CORN-004",name:"prithvi_water.lookup",stepNames:["prithvi_eo_v2"],tier:"modeled",skipReason:"Prithvi-EO Ida polygons: no polygons within 500 m"},{id:"CORN-005",name:"microtopo.dem_hand_twi",stepNames:["microtopo_lidar","microtopo_nta"],tier:"proxy",skipReason:"USGS 3DEP DEM: query outside NYC raster coverage"}],keystone:[{id:"KEY-001",name:"mta_entrance_exposure",stepNames:["mta_entrance_exposure"],tier:"empirical",skipReason:"no entrances within radius"},{id:"KEY-002",name:"nycha.development_join",stepNames:["nycha_development_exposure"],tier:"empirical",skipReason:"no NYCHA developments within 1.0 mi"},{id:"KEY-003",name:"doe.school_join",stepNames:["doe_school_exposure"],tier:"empirical",skipReason:"no DOE schools within 1.0 mi"},{id:"KEY-004",name:"doh.facility_join",stepNames:["doh_hospital_exposure"],tier:"empirical",skipReason:"no acute-care hospitals within 1.0 mi"},{id:"KEY-005",name:"pluto.lot_lookup",stepNames:["pluto_lookup"],tier:"empirical",skipReason:"PLUTO join skipped: queried address not in NYC PLUTO dataset"},{id:"KEY-006",name:"terramind.buildings",stepNames:["terramind_buildings","terramind_synthesis"],tier:"modeled",skipReason:"TerraMind Buildings adapter: heavy specialist disabled (RIPRAP_HEAVY_SPECIALISTS=0)"}],touchstone:[{id:"TCH-001",name:"floodnet.history",stepNames:["floodnet"],tier:"empirical",skipReason:"FloodNet sensor: no deployments within 600 m"},{id:"TCH-002",name:"nyc311.flood_complaints",stepNames:["nyc311","nyc311_nta"],tier:"proxy",skipReason:"NYC 311: no flood-relevant complaints within 200 m"},{id:"TCH-003",name:"nws_obs.metar",stepNames:["nws_obs"],tier:"empirical",skipReason:"NWS hourly METAR: nearest ASOS reports no precipitation"},{id:"TCH-004",name:"noaa_coops.recent",stepNames:["noaa_tides"],tier:"empirical",skipReason:"NOAA tide gauge: nearest station >25 km from address"},{id:"TCH-005",name:"prithvi_nyc_pluvial",stepNames:["prithvi_eo_live"],tier:"modeled",skipReason:"Prithvi-NYC-Pluvial: live segmentation specialist disabled or no <30% cloud Sentinel-2 in last 120 d"},{id:"TCH-006",name:"terramind.lulc",stepNames:["terramind_lulc"],tier:"synthetic",skipReason:"TerraMind LULC adapter: heavy specialist disabled or eo_chip fetch silent"}],lodestone:[{id:"LOD-001",name:"nws_alerts.flood_relevant",stepNames:["nws_alerts"],tier:"modeled",skipReason:"NWS public alerts: no active flood-relevant alerts at this address"},{id:"LOD-002",name:"ttm_battery_surge.zero_shot",stepNames:["ttm_forecast"],tier:"modeled",skipReason:"Granite TTM r2 zero-shot: forecast not interesting (peak |residual| < 0.3 ft)"},{id:"LOD-003",name:"ttm_battery_surge.fine_tune",stepNames:["ttm_battery_surge"],tier:"modeled",skipReason:"Granite TTM Battery fine-tune: forecast not interesting (peak |residual| < 0.3 m)"},{id:"LOD-004",name:"ttm_311_forecast",stepNames:["ttm_311_forecast"],tier:"modeled",skipReason:"NYC 311 weekly forecast: no per-address history to extrapolate"},{id:"LOD-005",name:"floodnet_forecast",stepNames:["floodnet_forecast"],tier:"modeled",skipReason:"FloodNet sensor recurrence: sensor has < silent-floor historical events; forecast omitted"},{id:"LOD-006",name:"npcc4.slr_projection",stepNames:["npcc4_projection"],tier:"modeled",skipReason:"NPCC4 SLR projection: not yet wired into FSM (static reference card on hold)"}],capstone:[{id:"CAP-001",name:"rag.granite_embedding",stepNames:["rag_granite_embedding"],tier:"proxy",skipReason:"Granite Embedding RAG: no policy retrieval (out-of-NYC scope)"},{id:"CAP-002",name:"gliner.typed_extraction",stepNames:["gliner_extract"],tier:"proxy",skipReason:"GLiNER typed extraction: no RAG hits to extract over"},{id:"CAP-003",name:"granite41.compose_briefing",stepNames:["reconcile_granite41","mellea_reconcile_address","reconcile_neighborhood","reconcile_development","reconcile_live_now"],tier:"modeled",skipReason:"Reconciler did not run (no grounded data available)"},{id:"CAP-004",name:"mellea.grounding_check",stepNames:["mellea_grounding"],tier:"modeled",skipReason:"Mellea grounding-check: rolled into reconcile step on this run"}]};function Fr(F,e){const S=xr[F]??[],_=new Map;for(const u of e)_.set(u.name,u);const M=[],n=new Set;for(const u of S){let d;for(const x of u.stepNames){const h=_.get(x);if(h){d=h,n.add(x);break}}d?M.push({...d,id:u.id,name:u.name,tier:d.tier??u.tier??null}):M.push({id:u.id,name:u.name,status:"not_invoked",tier:u.tier??null,note:u.skipReason})}for(const u of e)n.has(u.name)||M.push(u);return M}export{Ar as C,Rr as F,Br as M,Nr as R,Fr as f};
|
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
var rt=e=>{throw TypeError(e)};var Dt=(e,t,n)=>t.has(e)||rt("Cannot "+n);var y=(e,t,n)=>(Dt(e,t,"read from private field"),n?n.call(e):t.get(e)),A=(e,t,n)=>t.has(e)?rt("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n);import{bc as Pe,bd as Vt,G as at,j as T,k as I,l as O,o as we,be as Bt}from"./DwbuJhNu.js";const M=[];function Ke(e,t=Pe){let n=null;const a=new Set;function r(o){if(Vt(e,o)&&(e=o,n)){const l=!M.length;for(const c of a)c[1](),M.push(c,e);if(l){for(let c=0;c<M.length;c+=2)M[c][0](M[c+1]);M.length=0}}}function i(o){r(o(e))}function s(o,l=Pe){const c=[o,l];return a.add(c),a.size===1&&(n=t(r,i)||Pe),o(e),()=>{a.delete(c),a.size===0&&n&&(n(),n=null)}}return{set:r,update:i,subscribe:s}}class Me{constructor(t,n){this.status=t,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${t}`}}toString(){return JSON.stringify(this.body)}}class Ge{constructor(t,n){try{new Headers({location:n})}catch{throw new Error(`Invalid redirect location ${JSON.stringify(n)}: this string contains characters that cannot be used in HTTP headers`)}this.status=t,this.location=n}}class ze extends Error{constructor(t,n,a){super(a),this.status=t,this.text=n}}new URL("sveltekit-internal://");function Kt(e,t){return e==="/"||t==="ignore"?e:t==="never"?e.endsWith("/")?e.slice(0,-1):e:t==="always"&&!e.endsWith("/")?e+"/":e}function Mt(e){return e.split("%25").map(decodeURI).join("%25")}function Gt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function $e({href:e}){return e.split("#")[0]}function j(){}function zt(...e){let t=5381;for(const n of e)if(typeof n=="string"){let a=n.length;for(;a;)t=t*33^n.charCodeAt(--a)}else if(ArrayBuffer.isView(n)){const a=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let r=a.length;for(;r;)t=t*33^a[--r]}else throw new TypeError("value must be a string or TypedArray");return(t>>>0).toString(36)}new TextEncoder;function Ft(e){const t=atob(e),n=new Uint8Array(t.length);for(let a=0;a<t.length;a++)n[a]=t.charCodeAt(a);return n}const Ht=window.fetch;window.fetch=(e,t)=>((e instanceof Request?e.method:(t==null?void 0:t.method)||"GET")!=="GET"&&X.delete(Fe(e)),Ht(e,t));const X=new Map;function Wt(e,t){const n=Fe(e,t),a=document.querySelector(n);if(a!=null&&a.textContent){a.remove();let{body:r,...i}=JSON.parse(a.textContent);const s=a.getAttribute("data-ttl");return s&&X.set(n,{body:r,init:i,ttl:1e3*Number(s)}),a.getAttribute("data-b64")!==null&&(r=Ft(r)),Promise.resolve(new Response(r,i))}return window.fetch(e,t)}function Jt(e,t,n){if(X.size>0){const a=Fe(e,n),r=X.get(a);if(r){if(performance.now()<r.ttl&&["default","force-cache","only-if-cached",void 0].includes(n==null?void 0:n.cache))return new Response(r.body,r.init);X.delete(a)}}return window.fetch(t,n)}function Fe(e,t){let a=`script[data-sveltekit-fetched][data-url=${JSON.stringify(e instanceof Request?e.url:e)}]`;if(t!=null&&t.headers||t!=null&&t.body){const r=[];t.headers&&r.push([...new Headers(t.headers)].join(",")),t.body&&(typeof t.body=="string"||ArrayBuffer.isView(t.body))&&r.push(t.body),a+=`[data-hash="${zt(...r)}"]`}return a}const Yt=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/;function Xt(e){const t=[];return{pattern:e==="/"?/^\/$/:new RegExp(`^${Zt(e).map(a=>{const r=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(r)return t.push({name:r[1],matcher:r[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const i=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(i)return t.push({name:i[1],matcher:i[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const s=a.split(/\[(.+?)\](?!\])/);return"/"+s.map((l,c)=>{if(c%2){if(l.startsWith("x+"))return je(String.fromCharCode(parseInt(l.slice(2),16)));if(l.startsWith("u+"))return je(String.fromCharCode(...l.slice(2).split("-").map(m=>parseInt(m,16))));const d=Yt.exec(l),[,u,w,p,f]=d;return t.push({name:p,matcher:f,optional:!!u,rest:!!w,chained:w?c===1&&s[0]==="":!1}),w?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return je(l)}).join("")}).join("")}/?$`),params:t}}function Qt(e){return e!==""&&!/^\([^)]+\)$/.test(e)}function Zt(e){return e.slice(1).split("/").filter(Qt)}function en(e,t,n){const a={},r=e.slice(1),i=r.filter(o=>o!==void 0);let s=0;for(let o=0;o<t.length;o+=1){const l=t[o];let c=r[o-s];if(l.chained&&l.rest&&s&&(c=r.slice(o-s,o+1).filter(d=>d).join("/"),s=0),c===void 0)if(l.rest)c="";else continue;if(!l.matcher||n[l.matcher](c)){a[l.name]=c;const d=t[o+1],u=r[o+1];d&&!d.rest&&d.optional&&u&&l.chained&&(s=0),!d&&!u&&Object.keys(a).length===i.length&&(s=0);continue}if(l.optional&&l.chained){s++;continue}return}if(!s)return a}function je(e){return e.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function tn({nodes:e,server_loads:t,dictionary:n,matchers:a}){const r=new Set(t);return Object.entries(n).map(([o,[l,c,d]])=>{const{pattern:u,params:w}=Xt(o),p={id:o,exec:f=>{const m=u.exec(f);if(m)return en(m,w,a)},errors:[1,...d||[]].map(f=>e[f]),layouts:[0,...c||[]].map(s),leaf:i(l)};return p.errors.length=p.layouts.length=Math.max(p.errors.length,p.layouts.length),p});function i(o){const l=o<0;return l&&(o=~o),[l,e[o]]}function s(o){return o===void 0?o:[r.has(o),e[o]]}}function wt(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function ot(e,t,n=JSON.stringify){const a=n(t);try{sessionStorage[e]=a}catch{}}var ht;const U=((ht=globalThis.__sveltekit_43llsk)==null?void 0:ht.base)??"";var pt;const nn=((pt=globalThis.__sveltekit_43llsk)==null?void 0:pt.assets)??U??"",rn="1778023076697",vt="sveltekit:snapshot",yt="sveltekit:scroll",bt="sveltekit:states",an="sveltekit:pageurl",z="sveltekit:history",Z="sveltekit:navigation",D={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},Ue=location.origin;function He(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){const n=document.getElementsByTagName("base");t=n.length?n[0].href:document.URL}return new URL(e,t)}function B(){return{x:pageXOffset,y:pageYOffset}}function G(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const st={...D,"":D.hover};function kt(e){let t=e.assignedSlot??e.parentNode;return(t==null?void 0:t.nodeType)===11&&(t=t.host),t}function St(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=kt(e)}}function qe(e,t,n){let a;try{if(a=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&a.hash.match(/^#[^/]/)){const o=location.hash.split("#")[1]||"/";a.hash=`#${o}${a.hash}`}}catch{}const r=e instanceof SVGAElement?e.target.baseVal:e.target,i=!a||!!r||Ae(a,t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),s=(a==null?void 0:a.origin)===Ue&&e.hasAttribute("download");return{url:a,external:i,target:r,download:s}}function ve(e){let t=null,n=null,a=null,r=null,i=null,s=null,o=e;for(;o&&o!==document.documentElement;)a===null&&(a=G(o,"preload-code")),r===null&&(r=G(o,"preload-data")),t===null&&(t=G(o,"keepfocus")),n===null&&(n=G(o,"noscroll")),i===null&&(i=G(o,"reload")),s===null&&(s=G(o,"replacestate")),o=kt(o);function l(c){switch(c){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:st[a??"off"],preload_data:st[r??"off"],keepfocus:l(t),noscroll:l(n),reload:l(i),replace_state:l(s)}}function it(e){const t=Ke(e);let n=!0;function a(){n=!0,t.update(s=>s)}function r(s){n=!1,t.set(s)}function i(s){let o;return t.subscribe(l=>{(o===void 0||n&&l!==o)&&s(o=l)})}return{notify:a,set:r,subscribe:i}}const Et={v:j};function on(){const{set:e,subscribe:t}=Ke(!1);let n;async function a(){clearTimeout(n);try{const r=await fetch(`${nn}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!r.ok)return!1;const s=(await r.json()).version!==rn;return s&&(e(!0),Et.v(),clearTimeout(n)),s}catch{return!1}}return{subscribe:t,check:a}}function Ae(e,t,n){return e.origin!==Ue||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function Pn(e){}const Rt=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...Rt];const sn=new Set([...Rt]);[...sn];function ln(e){return e.filter(t=>t!=null)}function me(e,t){return e+"/"+t}function We(e){return e instanceof Me||e instanceof ze?e.status:500}function cn(e){return e instanceof ze?e.text:"Internal Error"}let R,ee,Ce;const fn=at.toString().includes("$$")||/function \w+\(\) \{\}/.test(at.toString()),lt="a:";var oe,se,ie,le,ce,fe,ue,de,gt,he,mt,pe,_t;fn?(R={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(lt)},ee={current:null},Ce={current:!1}):(R=new(gt=class{constructor(){A(this,oe,T({}));A(this,se,T(null));A(this,ie,T(null));A(this,le,T({}));A(this,ce,T({id:null}));A(this,fe,T({}));A(this,ue,T(-1));A(this,de,T(new URL(lt)))}get data(){return I(y(this,oe))}set data(t){O(y(this,oe),t)}get form(){return I(y(this,se))}set form(t){O(y(this,se),t)}get error(){return I(y(this,ie))}set error(t){O(y(this,ie),t)}get params(){return I(y(this,le))}set params(t){O(y(this,le),t)}get route(){return I(y(this,ce))}set route(t){O(y(this,ce),t)}get state(){return I(y(this,fe))}set state(t){O(y(this,fe),t)}get status(){return I(y(this,ue))}set status(t){O(y(this,ue),t)}get url(){return I(y(this,de))}set url(t){O(y(this,de),t)}},oe=new WeakMap,se=new WeakMap,ie=new WeakMap,le=new WeakMap,ce=new WeakMap,fe=new WeakMap,ue=new WeakMap,de=new WeakMap,gt),ee=new(mt=class{constructor(){A(this,he,T(null))}get current(){return I(y(this,he))}set current(t){O(y(this,he),t)}},he=new WeakMap,mt),Ce=new(_t=class{constructor(){A(this,pe,T(!1))}get current(){return I(y(this,pe))}set current(t){O(y(this,pe),t)}},pe=new WeakMap,_t),Et.v=()=>Ce.current=!0);function un(e){Object.assign(R,e)}const dn=new Set(["icon","shortcut icon","apple-touch-icon"]);let J=null;const N=wt(yt)??{},te=wt(vt)??{},C={url:it({}),page:it({}),navigating:Ke(null),updated:on()};function Je(e){N[e]=B()}function hn(e,t){let n=e+1;for(;N[n];)delete N[n],n+=1;for(n=t+1;te[n];)delete te[n],n+=1}function ne(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(j)}async function xt(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(U||"/");e&&await e.update()}}let Ye,De,ye,P,Ve,S;const be=[],ke=[];let v=null;function Se(){var e;(e=v==null?void 0:v.fork)==null||e.then(t=>t==null?void 0:t.discard()),v=null}const _e=new Map,Lt=new Set,pn=new Set,Q=new Set;let _={branch:[],error:null,url:null},Ut=!1,Ee=!1,ct=!0,re=!1,Y=!1,At=!1,Xe=!1,Tt,k,L,V;const Re=new Set,ft=new Map,ut=new Map;async function Nn(e,t,n){var i,s,o,l;globalThis.__sveltekit_43llsk&&(globalThis.__sveltekit_43llsk.query,globalThis.__sveltekit_43llsk.prerender),document.URL!==location.href&&(location.href=location.href),S=e,await((s=(i=e.hooks).init)==null?void 0:s.call(i)),Ye=tn(e),P=document.documentElement,Ve=t,De=e.nodes[0],ye=e.nodes[1],De(),ye(),k=(o=history.state)==null?void 0:o[z],L=(l=history.state)==null?void 0:l[Z],k||(k=L=Date.now(),history.replaceState({...history.state,[z]:k,[Z]:L},""));const a=N[k];function r(){a&&(history.scrollRestoration="manual",scrollTo(a.x,a.y))}n?(r(),await Ln(Ve,n)):(await F({type:"enter",url:He(S.hash?Tn(new URL(location.href)):location.href),replace_state:!0}),r()),xn()}function gn(){be.length=0,Xe=!1}function It(e){ke.some(t=>t==null?void 0:t.snapshot)&&(te[e]=ke.map(t=>{var n;return(n=t==null?void 0:t.snapshot)==null?void 0:n.capture()}))}function Ot(e){var t;(t=te[e])==null||t.forEach((n,a)=>{var r,i;(i=(r=ke[a])==null?void 0:r.snapshot)==null||i.restore(n)})}function dt(){Je(k),ot(yt,N),It(L),ot(vt,te)}async function Pt(e,t,n,a){let r,i;t.invalidateAll&&Se(),await F({type:"goto",url:He(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:a,accept:()=>{if(t.invalidateAll){Xe=!0,r=new Set;for(const[s,o]of ft)for(const l of o.keys())r.add(me(s,l));i=new Set;for(const[s,o]of ut)for(const l of o.keys())i.add(me(s,l))}t.invalidate&&t.invalidate.forEach(Rn)}}),t.invalidateAll&&we().then(we).then(()=>{for(const[s,o]of ft)for(const[l,{resource:c}]of o)r!=null&&r.has(me(s,l))&&c.refresh();for(const[s,o]of ut)for(const[l,{resource:c}]of o)i!=null&&i.has(me(s,l))&&c.reconnect()})}async function mn(e){if(e.id!==(v==null?void 0:v.id)){Se();const t={};Re.add(t),v={id:e.id,token:t,promise:jt({...e,preload:t}).then(n=>(Re.delete(t),n.type==="loaded"&&n.state.error&&Se(),n)),fork:null}}return v.promise}async function Ne(e){var n;const t=(n=await Te(e,!1))==null?void 0:n.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(a=>a[1]()))}async function $t(e,t,n){var i;const a={params:_.params,route:{id:((i=_.route)==null?void 0:i.id)??null},url:new URL(location.href)};_={...e.state,nav:a};const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(R,e.props.page),Tt=new S.root({target:t,props:{...e.props,stores:C,components:ke},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),Ot(L),n){const s={from:null,to:{...a,scroll:N[k]??B()},willUnload:!1,type:"enter",complete:Promise.resolve()};Q.forEach(o=>o(s))}Ee=!0}async function xe({url:e,params:t,branch:n,errors:a,status:r,error:i,route:s,form:o}){let l="never";if(U&&(e.pathname===U||e.pathname===U+"/"))l="always";else for(const f of n)(f==null?void 0:f.slash)!==void 0&&(l=f.slash);e.pathname=Kt(e.pathname,l),e.search=e.search;const c={type:"loaded",state:{url:e,params:t,branch:n,error:i,route:s},props:{constructors:ln(n).map(f=>f.node.component),page:nt(R)}};o!==void 0&&(c.props.form=o);let d={},u=!R,w=0;for(let f=0;f<Math.max(n.length,_.branch.length);f+=1){const m=n[f],h=_.branch[f];(m==null?void 0:m.data)!==(h==null?void 0:h.data)&&(u=!0),m&&(d={...d,...m.data},u&&(c.props[`data_${w}`]=d),w+=1)}return(!_.url||e.href!==_.url.href||_.error!==i||o!==void 0&&o!==R.form||u)&&(c.props.page={error:i,params:t,route:{id:(s==null?void 0:s.id)??null},state:{},status:r,url:new URL(e),form:o??null,data:u?d:R.data}),c}async function Qe({loader:e,parent:t,url:n,params:a,route:r,server_data_node:i}){var c,d;let s=null;const o={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},l=await e();return{node:l,loader:e,server:i,universal:(c=l.universal)!=null&&c.load?{type:"data",data:s,uses:o}:null,data:s??(i==null?void 0:i.data)??null,slash:((d=l.universal)==null?void 0:d.trailingSlash)??(i==null?void 0:i.slash)}}function _n(e,t,n){let a=e instanceof Request?e.url:e;const r=new URL(a,n);r.origin===n.origin&&(a=r.href.slice(n.origin.length));const i=Ee?Jt(a,r.href,t):Wt(a,t);return{resolved:r,promise:i}}function wn(e,t,n,a,r,i){if(Xe)return!0;if(!r)return!1;if(r.parent&&e||r.route&&t||r.url&&n)return!0;for(const s of r.search_params)if(a.has(s))return!0;for(const s of r.params)if(i[s]!==_.params[s])return!0;for(const s of r.dependencies)if(be.some(o=>o(new URL(s))))return!0;return!1}function Ze(e,t){return(e==null?void 0:e.type)==="data"?e:(e==null?void 0:e.type)==="skip"?t??null:null}function vn(e,t){if(!e)return new Set(t.searchParams.keys());const n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(const a of n){const r=e.searchParams.getAll(a),i=t.searchParams.getAll(a);r.every(s=>i.includes(s))&&i.every(s=>r.includes(s))&&n.delete(a)}return n}function yn({error:e,url:t,route:n,params:a}){return{type:"loaded",state:{error:e,url:t,route:n,params:a,branch:[]},props:{page:nt(R),constructors:[]}}}async function jt({id:e,invalidating:t,url:n,params:a,route:r,preload:i}){if((v==null?void 0:v.id)===e)return Re.delete(v.token),v.promise;const{errors:s,layouts:o,leaf:l}=r,c=[...o,l];s.forEach(h=>h==null?void 0:h().catch(j)),c.forEach(h=>h==null?void 0:h[1]().catch(j));const d=_.url?e!==Le(_.url):!1,u=_.route?r.id!==_.route.id:!1,w=vn(_.url,n);let p=!1;const f=c.map(async(h,g)=>{var $;if(!h)return;const b=_.branch[g];return h[1]===(b==null?void 0:b.loader)&&!wn(p,u,d,w,($=b.universal)==null?void 0:$.uses,a)?b:(p=!0,Qe({loader:h[1],url:n,params:a,route:r,parent:async()=>{var ge;const q={};for(let K=0;K<g;K+=1)Object.assign(q,(ge=await f[K])==null?void 0:ge.data);return q},server_data_node:Ze(h[0]?{type:"skip"}:null,h[0]?b==null?void 0:b.server:void 0)}))});for(const h of f)h.catch(j);const m=[];for(let h=0;h<c.length;h+=1)if(c[h])try{m.push(await f[h])}catch(g){if(g instanceof Ge)return{type:"redirect",location:g.location};if(Re.has(i))return yn({error:await ae(g,{params:a,url:n,route:{id:r.id}}),url:n,params:a,route:r});let b=We(g),x;if(g instanceof Me)x=g.body;else{if(await C.updated.check())return await xt(),await ne(n);x=await ae(g,{params:a,url:n,route:{id:r.id}})}const $=await bn(h,m,s);return $?xe({url:n,params:a,branch:m.slice(0,$.idx).concat($.node),errors:s,status:b,error:x,route:r}):await Nt(n,{id:r.id},x,b)}else m.push(void 0);return xe({url:n,params:a,branch:m,errors:s,status:200,error:null,route:r,form:t?void 0:null})}async function bn(e,t,n){for(;e--;)if(n[e]){let a=e;for(;!t[a];)a-=1;try{return{idx:a+1,node:{node:await n[e](),loader:n[e],data:{},server:null,universal:null}}}catch{continue}}}async function et({status:e,error:t,url:n,route:a}){const r={};let i=null;try{const s=await Qe({loader:De,url:n,params:r,route:a,parent:()=>Promise.resolve({}),server_data_node:Ze(i)}),o={node:await ye(),loader:ye,universal:null,server:null,data:null};return xe({url:n,params:r,branch:[s,o],status:e,error:t,errors:[],route:null})}catch(s){if(s instanceof Ge)return Pt(new URL(s.location,location.href),{},0);throw s}}async function kn(e){const t=e.href;if(_e.has(t))return _e.get(t);let n;try{const a=(async()=>{let r=await S.hooks.reroute({url:new URL(e),fetch:async(i,s)=>_n(i,s,e).promise})??e;if(typeof r=="string"){const i=new URL(e);S.hash?i.hash=r:i.pathname=r,r=i}return r})();_e.set(t,a),n=await a}catch{_e.delete(t);return}return n}async function Te(e,t){if(e&&!Ae(e,U,S.hash)){const n=await kn(e);if(!n)return;const a=Sn(n);for(const r of Ye){const i=r.exec(a);if(i)return{id:Le(e),invalidating:t,route:r,params:Gt(i),url:e}}}}function Sn(e){return Mt(S.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(U.length))||"/"}function Le(e){return(S.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function Ct({url:e,type:t,intent:n,delta:a,event:r,scroll:i}){let s=!1;const o=tt(_,n,e,t,i??null);a!==void 0&&(o.navigation.delta=a),r!==void 0&&(o.navigation.event=r);const l={...o.navigation,cancel:()=>{s=!0,o.reject(new Error("navigation cancelled"))}};return re||Lt.forEach(c=>c(l)),s?null:o}async function F({type:e,url:t,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s={},redirect_count:o=0,nav_token:l={},accept:c=j,block:d=j,event:u}){var K;const w=V;V=l;const p=await Te(t,!1),f=e==="enter"?tt(_,p,t,e):Ct({url:t,type:e,delta:n==null?void 0:n.delta,intent:p,scroll:n==null?void 0:n.scroll,event:u});if(!f){d(),V===l&&(V=w);return}const m=k,h=L;c(),re=!0,Ee&&f.navigation.type!=="enter"&&C.navigating.set(ee.current=f.navigation);let g=p&&await jt(p);if(!g){if(Ae(t,U,S.hash))return await ne(t,i);g=await Nt(t,{id:null},await ae(new ze(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,i)}if(t=(p==null?void 0:p.url)||t,V!==l)return f.reject(new Error("navigation aborted")),!1;if(g.type==="redirect"){if(o<20){await F({type:e,url:new URL(g.location,t),popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s,redirect_count:o+1,nav_token:l}),f.fulfil(void 0);return}g=await et({status:500,error:await ae(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}})}else g.props.page.status>=400&&await C.updated.check()&&(await xt(),await ne(t,i));if(gn(),Je(m),It(h),g.props.page.url.pathname!==t.pathname&&(t.pathname=g.props.page.url.pathname),s=n?n.state:s,!n){const E=i?0:1,H={[z]:k+=E,[Z]:L+=E,[bt]:s};(i?history.replaceState:history.pushState).call(history,H,"",t),i||hn(k,L)}const b=p&&(v==null?void 0:v.id)===p.id?v.fork:null;v!=null&&v.fork&&!b&&Se(),v=null,g.props.page.state=s;let x;if(Ee){const E=(await Promise.all(Array.from(pn,W=>W(f.navigation)))).filter(W=>typeof W=="function");if(E.length>0){let W=function(){E.forEach(Oe=>{Q.delete(Oe)})};E.push(W),E.forEach(Oe=>{Q.add(Oe)})}const H=f.navigation.to;_={...g.state,nav:{params:H.params,route:H.route,url:H.url}},g.props.page&&(g.props.page.url=t);const Ie=b&&await b;Ie?x=Ie.commit():(J=null,Tt.$set(g.props),J&&Object.assign(g.props.page,J),un(g.props.page),x=(K=Bt)==null?void 0:K()),At=!0}else await $t(g,Ve,!1);const{activeElement:$}=document;await x,await we(),await we();let q=null;if(ct){const E=n?n.scroll:r?B():null;E?scrollTo(E.x,E.y):(q=t.hash&&document.getElementById(qt(t)))?q.scrollIntoView():scrollTo(0,0)}const ge=document.activeElement!==$&&document.activeElement!==document.body;!a&&!ge&&An(t,!q),ct=!0,g.props.page&&(J&&Object.assign(g.props.page,J),Object.assign(R,g.props.page)),re=!1,e==="popstate"&&Ot(L),f.fulfil(void 0),f.navigation.to&&(f.navigation.to.scroll=B()),Q.forEach(E=>E(f.navigation)),C.navigating.set(ee.current=null)}async function Nt(e,t,n,a,r){return e.origin===Ue&&e.pathname===location.pathname&&!Ut?await et({status:a,error:n,url:e,route:t}):await ne(e,r)}function En(){let e,t={element:void 0,href:void 0},n;P.addEventListener("mousemove",o=>{const l=o.target;clearTimeout(e),e=setTimeout(()=>{i(l,D.hover)},20)});function a(o){o.defaultPrevented||i(o.composedPath()[0],D.tap)}P.addEventListener("mousedown",a),P.addEventListener("touchstart",a,{passive:!0});const r=new IntersectionObserver(o=>{for(const l of o)l.isIntersecting&&(Ne(new URL(l.target.href)),r.unobserve(l.target))},{threshold:0});async function i(o,l){const c=St(o,P),d=c===t.element&&(c==null?void 0:c.href)===t.href&&l>=n;if(!c||d)return;const{url:u,external:w,download:p}=qe(c,U,S.hash);if(w||p)return;const f=ve(c),m=u&&Le(_.url)===Le(u);if(!(f.reload||m))if(l<=f.preload_data){t={element:c,href:c.href},n=D.tap;const h=await Te(u,!1);if(!h)return;mn(h)}else l<=f.preload_code&&(t={element:c,href:c.href},n=l,Ne(u))}function s(){r.disconnect();for(const o of P.querySelectorAll("a")){const{url:l,external:c,download:d}=qe(o,U,S.hash);if(c||d)continue;const u=ve(o);u.reload||(u.preload_code===D.viewport&&r.observe(o),u.preload_code===D.eager&&Ne(l))}}Q.add(s),s()}function ae(e,t){if(e instanceof Me)return e.body;const n=We(e),a=cn(e);return S.hooks.handleError({error:e,event:t,status:n,message:a})??{message:a}}function qn(e,t={}){return e=new URL(He(e)),e.origin!==Ue?Promise.reject(new Error("goto: invalid URL")):Pt(e,t,0)}function Rn(e){if(typeof e=="function")be.push(e);else{const{href:t}=new URL(e,location.href);be.push(n=>n.href===t)}}function xn(){var t;history.scrollRestoration="manual",addEventListener("beforeunload",n=>{let a=!1;if(dt(),!re){const r=tt(_,void 0,null,"leave"),i={...r.navigation,cancel:()=>{a=!0,r.reject(new Error("navigation cancelled"))}};Lt.forEach(s=>s(i))}a?(n.preventDefault(),n.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&dt()}),(t=navigator.connection)!=null&&t.saveData||En(),P.addEventListener("click",async n=>{if(n.button||n.which!==1||n.metaKey||n.ctrlKey||n.shiftKey||n.altKey||n.defaultPrevented)return;const a=St(n.composedPath()[0],P);if(!a)return;const{url:r,external:i,target:s,download:o}=qe(a,U,S.hash);if(!r)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const l=ve(a);if(!(a instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||o)return;const[d,u]=(S.hash?r.hash.replace(/^#/,""):r.href).split("#"),w=d===$e(location);if(i||l.reload&&(!w||!u)){Ct({url:r,type:"link",event:n})?re=!0:n.preventDefault();return}if(u!==void 0&&w){const[,p]=_.url.href.split("#");if(p===u){if(n.preventDefault(),u===""||u==="top"&&a.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const f=a.ownerDocument.getElementById(decodeURIComponent(u));f&&(f.scrollIntoView(),f.focus())}return}if(Y=!0,Je(k),e(r),!l.replace_state)return;Y=!1}n.preventDefault(),await new Promise(p=>{requestAnimationFrame(()=>{setTimeout(p,0)}),setTimeout(p,100)}),await F({type:"link",url:r,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??r.href===location.href,event:n})}),P.addEventListener("submit",n=>{if(n.defaultPrevented)return;const a=HTMLFormElement.prototype.cloneNode.call(n.target),r=n.submitter;if(((r==null?void 0:r.formTarget)||a.target)==="_blank"||((r==null?void 0:r.formMethod)||a.method)!=="get")return;const o=new URL((r==null?void 0:r.hasAttribute("formaction"))&&(r==null?void 0:r.formAction)||a.action);if(Ae(o,U,!1))return;const l=n.target,c=ve(l);if(c.reload)return;n.preventDefault(),n.stopPropagation();const d=new FormData(l,r);o.search=new URLSearchParams(d).toString(),F({type:"form",url:o,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??o.href===location.href,event:n})}),addEventListener("popstate",async n=>{var a;if(!Be){if((a=n.state)!=null&&a[z]){const r=n.state[z];if(V={},r===k)return;const i=N[r],s=n.state[bt]??{},o=new URL(n.state[an]??location.href),l=n.state[Z],c=_.url?$e(location)===$e(_.url):!1;if(l===L&&(At||c)){s!==R.state&&(R.state=s),e(o),N[k]=B(),i&&scrollTo(i.x,i.y),k=r;return}const u=r-k;await F({type:"popstate",url:o,popped:{state:s,scroll:i,delta:u},accept:()=>{k=r,L=l},block:()=>{history.go(-u)},nav_token:V,event:n})}else if(!Y){const r=new URL(location.href);e(r),S.hash&&location.reload()}}}),addEventListener("hashchange",()=>{Y&&(Y=!1,history.replaceState({...history.state,[z]:++k,[Z]:L},"",location.href))});for(const n of document.querySelectorAll("link"))dn.has(n.rel)&&(n.href=n.href);addEventListener("pageshow",n=>{n.persisted&&C.navigating.set(ee.current=null)});function e(n){_.url=R.url=n,C.page.set(nt(R)),C.page.notify()}}async function Ln(e,{status:t=200,error:n,node_ids:a,params:r,route:i,server_route:s,data:o,form:l}){Ut=!0;const c=new URL(location.href);let d;({params:r={},route:i={id:null}}=await Te(c,!1)||{}),d=Ye.find(({id:p})=>p===i.id);let u,w=!0;try{const p=a.map(async(m,h)=>{const g=o[h];return g!=null&&g.uses&&(g.uses=Un(g.uses)),Qe({loader:S.nodes[m],url:c,params:r,route:i,parent:async()=>{const b={};for(let x=0;x<h;x+=1)Object.assign(b,(await p[x]).data);return b},server_data_node:Ze(g)})}),f=await Promise.all(p);if(d){const m=d.layouts;for(let h=0;h<m.length;h++)m[h]||f.splice(h,0,void 0)}u=await xe({url:c,params:r,branch:f,status:t,error:n,errors:d==null?void 0:d.errors,form:l,route:d??null})}catch(p){if(p instanceof Ge){await ne(new URL(p.location,location.href));return}u=await et({status:We(p),error:await ae(p,{url:c,params:r,route:i}),url:c,route:i}),e.textContent="",w=!1}finally{}u.props.page&&(u.props.page.state={}),await $t(u,e,w)}function Un(e){return{dependencies:new Set((e==null?void 0:e.dependencies)??[]),params:new Set((e==null?void 0:e.params)??[]),parent:!!(e!=null&&e.parent),route:!!(e!=null&&e.route),url:!!(e!=null&&e.url),search_params:new Set((e==null?void 0:e.search_params)??[])}}let Be=!1;function An(e,t=!0){const n=document.querySelector("[autofocus]");if(n)n.focus();else{const a=qt(e);if(a&&document.getElementById(a)){const{x:i,y:s}=B();setTimeout(()=>{const o=history.state;Be=!0,location.replace(new URL(`#${a}`,location.href)),history.replaceState(o,"",e),t&&scrollTo(i,s),Be=!1})}else{const i=document.body,s=i.getAttribute("tabindex");i.tabIndex=-1,i.focus({preventScroll:!0,focusVisible:!1}),s!==null?i.setAttribute("tabindex",s):i.removeAttribute("tabindex")}const r=getSelection();if(r&&r.type!=="None"){const i=[];for(let s=0;s<r.rangeCount;s+=1)i.push(r.getRangeAt(s));setTimeout(()=>{if(r.rangeCount===i.length){for(let s=0;s<r.rangeCount;s+=1){const o=i[s],l=r.getRangeAt(s);if(o.commonAncestorContainer!==l.commonAncestorContainer||o.startContainer!==l.startContainer||o.endContainer!==l.endContainer||o.startOffset!==l.startOffset||o.endOffset!==l.endOffset)return}r.removeAllRanges()}})}}}function tt(e,t,n,a,r=null){var c,d;let i,s;const o=new Promise((u,w)=>{i=u,s=w});return o.catch(j),{navigation:{from:{params:e.params,route:{id:((c=e.route)==null?void 0:c.id)??null},url:e.url,scroll:B()},to:n&&{params:(t==null?void 0:t.params)??null,route:{id:((d=t==null?void 0:t.route)==null?void 0:d.id)??null},url:n,scroll:r},willUnload:!t,type:a,complete:o},fulfil:i,reject:s}}function nt(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Tn(e){const t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function qt(e){let t;if(S.hash){const[,,n]=e.hash.split("#",3);t=n??""}else t=e.hash.slice(1);return decodeURIComponent(t)}export{Nn as a,qn as g,Pn as l,R as p,C as s};
|
|
@@ -1,27 +0,0 @@
|
|
| 1 |
-
import{k as Ee,o as Pe,a as f,f as S,s as _,t as xe,d as pe,c as he,b as we,l as oe}from"./Dlpu43Tj.js";import{q as re,T as ke,B as _e,ba as ze,i as De,E as Te,aX as Re,b8 as He,F as Ne,w as je,z as Se,A as me,h as Oe,ax as We,p as K,t as M,a as G,s as n,c as r,r as a,v as te,k as t,J as P,K as se,G as Ye,bb as Ue,l as ge,j as be,f as J}from"./DwbuJhNu.js";import{B as Ke,i as I,p as ee}from"./8F5LpR-T.js";import{e as $,s as c,a as de,b as ne,i as ie,c as Ge,C as Qe}from"./CBcGqa-S.js";import{T as le,c as Ve,b as Ze,d as Ae}from"./Cl16PtNL.js";import{b as Xe,_ as Je}from"./1oGnrPC6.js";function $e(q,e,k,h,l,p){let b=re;re&&ke();var i=null;re&&_e.nodeType===ze&&(i=_e,ke());var y=re?_e:q,u=new Ke(y,!1);De(()=>{const w=e()||null;var m=w==="svg"?He:void 0;if(w===null){u.ensure(null,null);return}return u.ensure(w,o=>{if(w){if(i=re?i:Re(w,m),Ee(i,i),h){re&&Pe(w)&&i.append(document.createComment(""));var s=re?Ne(i):i.appendChild(je());re&&(s===null?Se(!1):me(s)),h(i,s)}Oe.nodes.end=i,o.before(i)}re&&me(o)}),()=>{}},Te),We(()=>{}),b&&(Se(!0),me(y))}var et=S('<a target="_blank" rel="noopener noreferrer"> </a>'),tt=S('<li><span class="citation-num"> </span> <div class="citation-body"><div class="citation-line-1"><!> <span class="citation-source"> </span> <span class="citation-vintage"> </span></div> <div class="citation-title"><!></div> <div class="citation-meta"><span class="citation-docid"> </span> <span class="citation-retrieved"> </span></div></div></li>'),at=S(`<aside class="citation-drawer svelte-1p339fd" aria-label="Citations"><div class="citation-drawer-head"><span class="section-label"> </span> <span class="citation-drawer-meta">live · primary sources</span></div> <ol class="citation-list"></ol> <div class="citation-drawer-foot"><span class="section-label">Trust signals</span> <p class="citation-foot-copy">All foundation models Apache-2.0. All data from public-record federal,
|
| 2 |
-
state, and city sources. No commercial APIs contacted at runtime.</p></div></aside>`);function rr(q,e){K(e,!0);let k=P(()=>Object.values(e.citations).sort((y,u)=>y.n-u.n));var h=at(),l=r(h),p=r(l),b=r(p);a(p),te(2),a(l);var i=n(l,2);$(i,21,()=>t(k),y=>y.id,(y,u)=>{var w=tt();let m;var o=r(w),s=r(o);a(o);var v=n(o,2),d=r(v),C=r(d);le(C,{get tier(){return t(u).tier},size:10,get color(){return`var(--tier-${t(u).tier??""})`}});var B=n(C,2),g=r(B,!0);a(B);var x=n(B,2),F=r(x);a(x),a(d);var E=n(d,2),z=r(E);{var H=R=>{var L=et(),j=r(L,!0);a(L),M(()=>{c(L,"href",t(u).url),_(j,t(u).title)}),f(R,L)},D=P(()=>t(u).url&&t(u).url.startsWith("http")),A=R=>{var L=xe();M(()=>_(L,t(u).title)),f(R,L)};I(z,R=>{t(D)?R(H):R(A,-1)})}a(E);var T=n(E,2),W=r(T),Q=r(W,!0);a(W);var N=n(W,2),O=r(N);a(N),a(T),a(v),a(w),M(()=>{c(w,"id",`cite-${t(u).id??""}`),m=de(w,1,"citation-item",null,m,{"is-active":Ve.active===t(u).id}),_(s,`[${t(u).n??""}]`),_(g,t(u).source),_(F,`v. ${t(u).vintage??""}`),_(Q,t(u).docId),_(O,`retr. ${t(u).retrieved??""}`)}),f(y,w)}),a(i),te(2),a(h),M(()=>_(b,`Citations · ${t(k).length??""}`)),f(q,h),G()}const rt="https://basemaps.cartocdn.com/gl/positron-nolabels-gl-style/style.json",Me=`<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
|
| 3 |
-
<rect width="12" height="12" fill="rgba(42,111,168,0.18)"/>
|
| 4 |
-
<g stroke="#2A6FA8" stroke-width="1.4">
|
| 5 |
-
<line x1="-2" y1="2" x2="14" y2="-14"/>
|
| 6 |
-
<line x1="-2" y1="8" x2="14" y2="-8"/>
|
| 7 |
-
<line x1="-2" y1="14" x2="14" y2="-2"/>
|
| 8 |
-
<line x1="-2" y1="20" x2="14" y2="4"/>
|
| 9 |
-
</g>
|
| 10 |
-
</svg>`,st=`<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
|
| 11 |
-
<rect width="12" height="12" fill="rgba(42,111,168,0.16)"/>
|
| 12 |
-
<g stroke="#2A6FA8" stroke-width="1.1">
|
| 13 |
-
<line x1="-2" y1="6" x2="14" y2="-10"/>
|
| 14 |
-
<line x1="-2" y1="14" x2="14" y2="-2"/>
|
| 15 |
-
<line x1="-2" y1="22" x2="14" y2="6"/>
|
| 16 |
-
</g>
|
| 17 |
-
</svg>`;async function it(q,e){const k=new Blob([q],{type:"image/svg+xml"}),h=URL.createObjectURL(k);try{return await new Promise((p,b)=>{const i=new Image(e,e);i.onload=()=>p(i),i.onerror=y=>b(y),i.src=h})}finally{URL.revokeObjectURL(h)}}async function nt(q){const e=[["syn-stripe-45",Me,12],["syn-stripe-45-2x",Me,24],["syn-stripe-45-low",st,12]];for(const[k,h,l]of e)if(!q.hasImage(k))try{const p=await it(h,l);q.addImage(k,p,{pixelRatio:l/12})}catch(p){console.warn(`syn-stripe registration failed for ${k}`,p)}}var lt=S('<div class="map-frame svelte-wk2bu4"><div role="application" class="rip-map-container svelte-wk2bu4"></div></div>');function sr(q,e){K(e,!0);let k=ee(e,"activeLayers",19,()=>({empirical:!0,modeled:!0,synthetic:!0,proxy:!0})),h=be(null),l=null,p=be(!1);const b={type:"FeatureCollection",features:[]};function i(m,o){if(!l||!t(p))return;const s=l.getSource(m);s&&s.setData(o??b)}function y(m,o){!l||!t(p)||l.getLayer(m)&&l.setLayoutProperty(m,"visibility",o?"visible":"none")}se(()=>{i("sandy-empirical",e.sandyEmpirical)}),se(()=>{i("dep-modeled",e.depModeled)}),se(()=>{i("syn-prior",e.syntheticPrior)}),se(()=>{i("proxy-311",e.proxy311)}),se(()=>{i("register-points",e.registerPoints)}),se(()=>{i("register-polygons",e.registerPolygons)}),se(()=>{y("tier-empirical-fill",k().empirical),y("tier-empirical-line",k().empirical),y("tier-modeled-fill",k().modeled),y("tier-modeled-line",k().modeled),y("tier-synthetic-fill",k().synthetic),y("tier-synthetic-line",k().synthetic),y("tier-proxy-dots",k().proxy)}),se(()=>{!l||!t(p)||l.flyTo({center:[e.address.lon,e.address.lat],zoom:15,essential:!0})}),Ye(async()=>{if(!t(h))return;const m=await Je(()=>import("./D4L2lGt1.js").then(o=>o.m),[],import.meta.url);l=new m.Map({container:t(h),style:rt,center:[e.address.lon,e.address.lat],zoom:15,attributionControl:{compact:!0}}),l.addControl(new m.NavigationControl({visualizePitch:!1}),"top-right"),l.addControl(new m.ScaleControl({maxWidth:100,unit:"imperial"}),"bottom-left"),l.on("load",()=>{if(!l)return;window.__riprapMap=l,nt(l);const o=()=>({type:"FeatureCollection",features:[]});l.addSource("sandy-empirical",{type:"geojson",data:e.sandyEmpirical??o()}),l.addSource("dep-modeled",{type:"geojson",data:e.depModeled??o()}),l.addSource("syn-prior",{type:"geojson",data:e.syntheticPrior??o()}),l.addSource("proxy-311",{type:"geojson",data:e.proxy311??o()}),l.addSource("register-points",{type:"geojson",data:e.registerPoints??o()}),l.addSource("register-polygons",{type:"geojson",data:e.registerPolygons??o()}),l.addSource("queried-address",{type:"geojson",data:{type:"FeatureCollection",features:[{type:"Feature",geometry:{type:"Point",coordinates:[e.address.lon,e.address.lat]},properties:{label:e.address.label}}]}}),l.addLayer({id:"tier-empirical-fill",type:"fill",source:"sandy-empirical",paint:{"fill-color":"#0B5394","fill-opacity":.4}}),l.addLayer({id:"tier-empirical-line",type:"line",source:"sandy-empirical",paint:{"line-color":"#0B5394","line-width":1.5}}),l.addLayer({id:"tier-modeled-fill",type:"fill",source:"dep-modeled",paint:{"fill-color":"#2A6FA8","fill-opacity":.25}}),l.addLayer({id:"tier-modeled-line",type:"line",source:"dep-modeled",paint:{"line-color":"#2A6FA8","line-width":1.5}}),l.addLayer({id:"tier-synthetic-fill",type:"fill",source:"syn-prior",paint:{"fill-pattern":"syn-stripe-45","fill-opacity":.65}}),l.addLayer({id:"tier-synthetic-line",type:"line",source:"syn-prior",paint:{"line-color":"#2A6FA8","line-width":1.5,"line-dasharray":[4,3]}}),l.addLayer({id:"tier-proxy-dots",type:"circle",source:"proxy-311",paint:{"circle-color":"transparent","circle-stroke-color":"#6B6B6B","circle-stroke-width":1.25,"circle-radius":["interpolate",["linear"],["coalesce",["get","count"],1],1,3,5,6,15,9,30,12]}}),l.addLayer({id:"register-polygons-fill",type:"fill",source:"register-polygons",paint:{"fill-color":"#0B5394","fill-opacity":["interpolate",["linear"],["coalesce",["get","pct_inside_sandy"],0],0,.1,25,.2,50,.32,75,.45]}}),l.addLayer({id:"register-polygons-line",type:"line",source:"register-polygons",paint:{"line-color":"#0B5394","line-width":1,"line-opacity":.85}}),l.addLayer({id:"register-points-circle",type:"circle",source:"register-points",paint:{"circle-color":["case",["==",["get","inside_sandy_2012"],!0],"#0B5394","#6B6B6B"],"circle-stroke-color":"#FAFAF7","circle-stroke-width":1.25,"circle-radius":["match",["get","kind"],"subway",4,"school",5,"hospital",6,"nycha",7,4],"circle-opacity":.9}}),l.on("mouseenter","register-points-circle",()=>{l&&(l.getCanvas().style.cursor="pointer")}),l.on("mouseleave","register-points-circle",()=>{l&&(l.getCanvas().style.cursor="")}),l.on("click","register-points-circle",s=>{var H;if(!l||!((H=s.features)!=null&&H.length))return;const v=s.features[0],d=v.properties??{},C=String(d.name??"?"),B=String(d.kind??"?"),g=d.inside_sandy_2012===!0||d.inside_sandy_2012==="true",x=String(d.doc_id??""),F=`
|
| 18 |
-
<div style="font-family: 'IBM Plex Sans', system-ui; font-size: 12px;">
|
| 19 |
-
<div style="font-weight: 600; color: #1A1A1A;">${C}</div>
|
| 20 |
-
<div style="color: #6B6B6B; font-size: 11px; margin-top: 2px;">${B}</div>
|
| 21 |
-
<div style="margin-top: 6px;">
|
| 22 |
-
<span style="font-family: 'IBM Plex Mono', monospace; font-size: 10.5px; color: ${g?"#0B5394":"#6B6B6B"};">
|
| 23 |
-
inside_sandy_2012=${g}
|
| 24 |
-
</span>
|
| 25 |
-
</div>
|
| 26 |
-
${x?`<div style="margin-top: 4px; font-family: 'IBM Plex Mono', monospace; font-size: 10.5px; color: #B8620A;">[${x}]</div>`:""}
|
| 27 |
-
</div>`,E=new m.Popup({closeButton:!0,offset:12}),z=v.geometry.coordinates;E.setLngLat(z).setHTML(F).addTo(l)}),l.addLayer({id:"queried-halo",type:"circle",source:"queried-address",paint:{"circle-color":"rgba(209, 124, 0, 0.20)","circle-radius":16}}),l.addLayer({id:"queried-pin",type:"circle",source:"queried-address",paint:{"circle-color":"#D17C00","circle-stroke-color":"#FAFAF7","circle-stroke-width":2,"circle-radius":7}}),l.addLayer({id:"queried-label",type:"symbol",source:"queried-address",layout:{"text-field":["get","label"],"text-font":["Open Sans Semibold","Arial Unicode MS Bold"],"text-size":12,"text-offset":[0,-1.6],"text-anchor":"bottom"},paint:{"text-color":"#1A1A1A","text-halo-color":"#FAFAF7","text-halo-width":1.5}}),ge(p,!0)})}),Ue(()=>{l==null||l.remove(),l=null});var u=lt(),w=r(u);Xe(w,m=>ge(h,m),()=>t(h)),a(u),M(()=>c(w,"aria-label",`Flood-exposure map for ${e.address.label??""}`)),f(q,u),G()}var ot=S('<button type="button"><span class="map-legend-swatch" aria-hidden="true"><!></span> <span class="map-legend-text"><span class="map-legend-label"> </span> <span class="map-legend-source"> <!></span></span> <span class="map-legend-toggle" aria-hidden="true"> </span></button>'),vt=S('<div class="map-legend" role="group" aria-label="Map layer toggles"><div class="map-legend-head"><span class="section-label"> </span></div> <!></div>');function ir(q,e){K(e,!0);const k=[{key:"empirical",tier:"empirical",label:"Sandy Inundation Zone (2012)",source:"NYC OEM"},{key:"modeled",tier:"modeled",label:"FEMA / DEP scenarios",source:"FEMA · NYC DEP"},{key:"synthetic",tier:"synthetic",label:"Synthetic SAR (TerraMind)",source:"TerraMind v1.2"},{key:"proxy",tier:"proxy",label:"311 flood complaints",source:"NYC 311"}];let h=P(()=>e.featureCounts===null?k:k.filter(i=>{var u;const y=(u=e.featureCounts)==null?void 0:u[i.key];return y===void 0||y>0}));var l=he(),p=J(l);{var b=i=>{var y=vt(),u=r(y),w=r(u),m=r(w);a(w),a(u);var o=n(u,2);$(o,17,()=>t(h),s=>s.key,(s,v)=>{var d=ot();let C;var B=r(d),g=r(B);le(g,{get tier(){return t(v).tier},size:11,get color(){return`var(--tier-${t(v).tier??""})`}}),a(B);var x=n(B,2),F=r(x),E=r(F,!0);a(F);var z=n(F,2),H=r(z),D=n(H);Ze(D,{get tier(){return t(v).tier},compact:!0}),a(z),a(x);var A=n(x,2),T=r(A,!0);a(A),a(d),M(()=>{C=de(d,1,"map-legend-item",null,C,{"is-on":e.active[t(v).key],"is-off":!e.active[t(v).key]}),c(d,"aria-pressed",e.active[t(v).key]),_(E,t(v).label),_(H,`${t(v).source??""} · `),_(T,e.active[t(v).key]?"ON":"OFF")}),we("click",d,()=>e.onToggle(t(v).key)),f(s,d)}),a(y),M(()=>_(m,`Layers · ${t(h).length??""}`)),f(i,y)};I(p,i=>{t(h).length&&i(b)})}f(q,l),G()}pe(["click"]);const Be=["cornerstone","keystone","touchstone","lodestone","capstone"],dt={cornerstone:{name:"Cornerstone",role:"the hazard reader",tag:"what NYC's ground remembers"},keystone:{name:"Keystone",role:"the asset register",tag:"what's exposed"},touchstone:{name:"Touchstone",role:"the live observer",tag:"what's happening now"},lodestone:{name:"Lodestone",role:"the projector",tag:"what's coming"},capstone:{name:"Capstone",role:"the synthesizer",tag:"writes it all down with citations"}};var ct=S('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> cache</span>',1),ut=S('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-silent svelte-1vuwkv4"> </span>',1),gt=S('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-warn svelte-1vuwkv4"> </span>',1),ht=S('<span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item rh-err svelte-1vuwkv4"> </span>',1),ft=S('<div class="rh svelte-1vuwkv4"><span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> Stones</span> <span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> functions fired</span> <span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> </span> <span class="rh-sep svelte-1vuwkv4">·</span> <span class="rh-item svelte-1vuwkv4"><strong class="svelte-1vuwkv4"> </strong> wall-clock</span> <!> <!> <!> <!></div>');function yt(q,e){K(e,!0);function k(L){return L.flatMap(j=>j.children?[j,...k(j.children)]:[j])}let h=P(()=>e.stones.flatMap(L=>k(L.members))),l=P(()=>t(h).length),p=P(()=>t(h).filter(L=>L.status==="ok").length),b=P(()=>t(h).filter(L=>L.status==="silent").length),i=P(()=>t(h).filter(L=>L.status==="warn").length),y=P(()=>t(h).filter(L=>L.status==="error").length),u=P(()=>e.wallSeconds==null?"—":e.wallSeconds<1?`${Math.round(e.wallSeconds*1e3)}ms`:`${e.wallSeconds.toFixed(1)}s`);var w=ft(),m=r(w),o=r(m),s=r(o,!0);a(o),te(),a(m);var v=n(m,4),d=r(v),C=r(d);a(d),te(),a(v);var B=n(v,4),g=r(B),x=r(g,!0);a(g);var F=n(g);a(B);var E=n(B,4),z=r(E),H=r(z,!0);a(z),te(),a(E);var D=n(E,2);{var A=L=>{var j=ct(),U=n(J(j),2),Y=r(U),Z=r(Y);a(Y),te(),a(U),M(ae=>_(Z,`${ae??""}%`),[()=>Math.round(e.cacheHit*100)]),f(L,j)};I(D,L=>{e.cacheHit!=null&&L(A)})}var T=n(D,2);{var W=L=>{var j=ut(),U=n(J(j),2),Y=r(U);a(U),M(()=>_(Y,`${t(b)??""} silent`)),f(L,j)};I(T,L=>{t(b)>0&&L(W)})}var Q=n(T,2);{var N=L=>{var j=gt(),U=n(J(j),2),Y=r(U);a(U),M(()=>_(Y,`${t(i)??""} warn`)),f(L,j)};I(Q,L=>{t(i)>0&&L(N)})}var O=n(Q,2);{var R=L=>{var j=ht(),U=n(J(j),2),Y=r(U);a(U),M(()=>_(Y,`${t(y)??""} error`)),f(L,j)};I(O,L=>{t(y)>0&&L(R)})}a(w),M(()=>{_(s,e.stones.length),_(C,`${t(p)??""}/${t(l)??""}`),_(x,e.cards.length),_(F,` evidence card${e.cards.length===1?"":"s"}`),_(H,t(u))}),f(q,w),G()}var _t=S('<div class="subhead svelte-lygj3j"> </div>'),mt=S('<p class="body-prose svelte-lygj3j"> </p>'),xt=S('<div class="body body-headline svelte-lygj3j"><div class="headline svelte-lygj3j"> </div> <!> <!></div>');function bt(q,e){K(e,!0);var k=xt(),h=r(k),l=r(h,!0);a(h);var p=n(h,2);{var b=u=>{var w=_t(),m=r(w,!0);a(w),M(()=>_(m,e.card.subhead)),f(u,w)};I(p,u=>{e.card.subhead&&u(b)})}var i=n(p,2);{var y=u=>{var w=mt(),m=r(w,!0);a(w),M(()=>_(m,e.card.body)),f(u,w)};I(i,u=>{e.card.body&&u(y)})}a(k),M(()=>{ne(h,`color: var(--tier-${e.card.tier??""});`),_(l,e.card.headline??"")}),f(q,k),G()}var pt=S('<th class="svelte-1nlkuao"> </th>'),wt=S('<td class="svelte-1nlkuao"> </td>'),kt=S('<tr class="svelte-1nlkuao"></tr>'),St=S('<div class="body-sub svelte-1nlkuao"> </div>'),At=S('<div class="body body-tabular svelte-1nlkuao"><table class="t svelte-1nlkuao"><thead><tr></tr></thead><tbody></tbody></table> <!></div>');function Mt(q,e){K(e,!0);var k=At(),h=r(k),l=r(h),p=r(l);$(p,21,()=>e.card.columns??[],ie,(u,w)=>{var m=pt(),o=r(m,!0);a(m),M(()=>_(o,t(w))),f(u,m)}),a(p),a(l);var b=n(l);$(b,21,()=>e.card.rows??[],ie,(u,w)=>{var m=kt();$(m,21,()=>t(w),ie,(o,s)=>{var v=wt(),d=r(v,!0);a(v),M(()=>_(d,t(s))),f(o,v)}),a(m),f(u,m)}),a(b),a(h);var i=n(h,2);{var y=u=>{var w=St(),m=r(w,!0);a(w),M(()=>_(m,e.card.sub)),f(u,w)};I(i,u=>{e.card.sub&&u(y)})}a(k),f(q,k),G()}var Bt=S('<div class="cell svelte-stf9c8"><div class="value svelte-stf9c8"> </div> <div class="label svelte-stf9c8"> </div></div>'),Ct=S('<div class="body-sub svelte-stf9c8"> </div>'),Ft=S('<div class="body body-scalars svelte-stf9c8"><div class="row svelte-stf9c8"></div> <!></div>');function Lt(q,e){K(e,!0);var k=Ft(),h=r(k);$(h,21,()=>e.card.scalars??[],ie,(b,i)=>{var y=Bt(),u=r(y),w=r(u,!0);a(u);var m=n(u,2),o=r(m,!0);a(m),a(y),M(()=>{ne(u,`color: var(--tier-${e.card.tier??""});`),_(w,t(i).value),_(o,t(i).label)}),f(b,y)}),a(h);var l=n(h,2);{var p=b=>{var i=Ct(),y=r(i,!0);a(i),M(()=>_(y,e.card.sub)),f(b,i)};I(l,b=>{e.card.sub&&b(p)})}a(k),f(q,k),G()}var qt=S('<div class="headline svelte-jrppts"> </div>'),It=S('<div class="subhead svelte-jrppts"> </div>'),Et=oe("<rect></rect>"),Pt=S('<div class="body-sub svelte-jrppts"> </div>'),zt=S('<div class="body-sub svelte-jrppts"> </div>'),Dt=S('<div class="body body-spark svelte-jrppts"><!> <!> <svg width="100%" preserveAspectRatio="none" aria-hidden="true" class="svelte-jrppts"></svg> <!> <!></div>');function Tt(q,e){K(e,!0);const k=240,h=38;let l=P(()=>e.card.spark??e.card.histogram??[]),p=P(()=>Math.max(...t(l),1)),b=P(()=>t(l).length),i=P(()=>Math.max(2,k/Math.max(t(b),1)-1.5));var y=Dt(),u=r(y);{var w=g=>{var x=qt(),F=r(x,!0);a(x),M(()=>{ne(x,`color: var(--tier-${e.card.tier??""});`),_(F,e.card.headline)}),f(g,x)};I(u,g=>{e.card.headline&&g(w)})}var m=n(u,2);{var o=g=>{var x=It(),F=r(x,!0);a(x),M(()=>_(F,e.card.subhead)),f(g,x)};I(m,g=>{e.card.subhead&&g(o)})}var s=n(m,2);c(s,"viewBox","0 0 240 38"),c(s,"height",h),$(s,21,()=>t(l),ie,(g,x,F)=>{var E=Et();M(()=>{c(E,"x",F/t(b)*k+.5),c(E,"y",h-t(x)/t(p)*h),c(E,"width",t(i)),c(E,"height",t(x)/t(p)*h),c(E,"fill",`var(--tier-${e.card.tier??""})`)}),f(g,E)}),a(s);var v=n(s,2);{var d=g=>{var x=Pt(),F=r(x,!0);a(x),M(()=>_(F,e.card.sparkSub)),f(g,x)};I(v,g=>{e.card.sparkSub&&g(d)})}var C=n(v,2);{var B=g=>{var x=zt(),F=r(x,!0);a(x),M(()=>_(F,e.card.sub)),f(g,x)};I(C,g=>{!e.card.sparkSub&&e.card.sub&&g(B)})}a(y),f(q,y),G()}var Rt=S('<span class="headline svelte-48vbub"> </span>'),Ht=S('<span class="subhead svelte-48vbub"> </span>'),Nt=S('<span class="spatial-note svelte-48vbub"> </span>'),jt=S("<span> </span>"),Ot=S('<div class="body-sub svelte-48vbub"><!> <!></div>'),Wt=S('<div class="body body-timeseries svelte-48vbub"><div class="ts-header svelte-48vbub"><!> <!></div> <svg width="100%" aria-hidden="true" class="svelte-48vbub"><line stroke="#C9C9C5" stroke-width="0.5" stroke-dasharray="2 2"></line><path fill="none" stroke-width="1.4"></path><circle r="3"></circle><text font-size="9" font-family="IBM Plex Mono" text-anchor="middle"> </text><text font-size="8" font-family="IBM Plex Mono" fill="#6B6B6B">now</text><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#6B6B6B"> </text></svg> <!></div>');function Yt(q,e){K(e,!0);const k=240,h=84,l=6,p=P(()=>e.card.timeseries??{hours:96,peak:{x:38,y:47},peakLabel:""}),b=P(()=>u(t(p))),i=P(()=>w(t(b),t(p))),y=P(()=>m(t(b),t(i)));function u(N){const O=[];for(let R=0;R<=N.hours;R++){const L=6*Math.sin(R/12.42*Math.PI*2),j=38*Math.exp(-Math.pow((R-N.peak.x)/12,2));O.push({x:R,y:L+j+4})}return O}function w(N,O){const R=Math.max(...N.map(j=>j.y),O.peak.y),L=Math.min(...N.map(j=>j.y),-10);return{sx:j=>l+j/O.hours*(k-l*2),sy:j=>h-l-14-(j-L)/(R-L)*(h-l*2-14)}}function m(N,O){return N.map((R,L)=>`${L?"L":"M"} ${O.sx(R.x)} ${O.sy(R.y)}`).join(" ")}var o=Wt(),s=r(o),v=r(s);{var d=N=>{var O=Rt(),R=r(O,!0);a(O),M(()=>{ne(O,`color: var(--tier-${e.card.tier??""});`),_(R,e.card.headline)}),f(N,O)};I(v,N=>{e.card.headline&&N(d)})}var C=n(v,2);{var B=N=>{var O=Ht(),R=r(O,!0);a(O),M(()=>_(R,e.card.subhead)),f(N,O)};I(C,N=>{e.card.subhead&&N(B)})}a(s);var g=n(s,2);c(g,"viewBox","0 0 240 84"),c(g,"height",h);var x=r(g);c(x,"x1",l),c(x,"x2",k-l);var F=n(x),E=n(F),z=n(E),H=r(z,!0);a(z);var D=n(z);c(D,"x",l),c(D,"y",h-2);var A=n(D);c(A,"x",k-l),c(A,"y",h-2);var T=r(A);a(A),a(g);var W=n(g,2);{var Q=N=>{var O=Ot(),R=r(O);{var L=Y=>{var Z=Nt(),ae=r(Z,!0);a(Z),M(()=>_(ae,e.card.spatialNote)),f(Y,Z)};I(R,Y=>{e.card.spatialNote&&Y(L)})}var j=n(R,2);{var U=Y=>{var Z=jt(),ae=r(Z,!0);a(Z),M(()=>_(ae,e.card.sub)),f(Y,Z)};I(j,Y=>{e.card.sub&&Y(U)})}a(O),f(N,O)};I(W,N=>{(e.card.spatialNote||e.card.sub)&&N(Q)})}a(o),M((N,O,R,L,j,U)=>{c(x,"y1",N),c(x,"y2",O),c(F,"d",t(y)),c(F,"stroke",`var(--tier-${e.card.tier??""})`),c(E,"cx",R),c(E,"cy",L),c(E,"fill",`var(--tier-${e.card.tier??""})`),c(z,"x",j),c(z,"y",U),c(z,"fill",`var(--tier-${e.card.tier??""})`),_(H,t(p).peakLabel),_(T,`+${t(p).hours??""}h`)},[()=>t(i).sy(0),()=>t(i).sy(0),()=>t(i).sx(t(p).peak.x),()=>t(i).sy(t(p).peak.y),()=>t(i).sx(t(p).peak.x),()=>t(i).sy(t(p).peak.y)-6]),f(q,o),G()}var Ut=oe('<circle r="2.2"></circle><text font-size="9" font-family="IBM Plex Mono" text-anchor="middle" fill="#6B6B6B"> </text>',1),Kt=S('<div class="body-sub svelte-gqkhpe"> </div>'),Gt=S('<div class="body body-forecast svelte-gqkhpe"><svg width="100%" aria-hidden="true" class="svelte-gqkhpe"><path fill-opacity="0.18"></path><path fill="none" stroke-width="1.5"></path><!></svg> <!></div>');function Qt(q,e){K(e,!0);const k=240,h=88,l=6;let p=P(()=>e.card.forecast??[]),b=P(()=>t(p).map((g,x)=>l+x/Math.max(t(p).length-1,1)*(k-l*2))),i=P(()=>Math.max(...t(p).map(g=>g.high),1));function y(g){return h-l-g/t(i)*(h-l*2-12)}let u=P(()=>t(b).map((g,x)=>`${x?"L":"M"} ${g} ${y(t(p)[x].mid)}`).join(" ")),w=P(()=>{if(!t(p).length)return"";const g=t(b).map((F,E)=>`${F} ${y(t(p)[E].low)}`).join(" L "),x=[...t(b)].reverse().map((F,E)=>`${F} ${y(t(p)[t(p).length-1-E].high)}`).join(" L ");return`M ${g} L ${x} Z`});var m=Gt(),o=r(m);c(o,"viewBox","0 0 240 88"),c(o,"height",h);var s=r(o),v=n(s),d=n(v);$(d,17,()=>t(p),ie,(g,x,F)=>{var E=Ut(),z=J(E),H=n(z);c(H,"y",h-1);var D=r(H,!0);a(H),M(A=>{c(z,"cx",t(b)[F]),c(z,"cy",A),c(z,"fill",`var(--tier-${e.card.tier??""})`),c(H,"x",t(b)[F]),_(D,t(x).year)},[()=>y(t(x).mid)]),f(g,E)}),a(o);var C=n(o,2);{var B=g=>{var x=Kt(),F=r(x,!0);a(x),M(()=>_(F,e.card.sub)),f(g,x)};I(C,g=>{e.card.sub&&g(B)})}a(m),M(()=>{c(s,"d",t(w)),c(s,"fill",`var(--tier-${e.card.tier??""})`),c(v,"d",t(u)),c(v,"stroke",`var(--tier-${e.card.tier??""})`)}),f(q,m),G()}var Vt=oe('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><rect fill="#F2F2EE"></rect><g stroke="#D9D6CC" stroke-width="0.6"><line x1="0" y1="40" y2="40"></line><line x1="0" y1="80" y2="80"></line><line x1="60" y1="0" x2="60"></line><line x1="160" y1="0" x2="160"></line></g><path d="M20 50 Q 60 38 90 56 Q 120 76 150 64 Q 180 50 180 86 Q 130 100 70 96 Q 30 92 20 76 Z" fill="rgba(42,111,168,0.32)" stroke="#2A6FA8" stroke-width="0.7"></path><path d="M40 60 Q 80 54 110 70 Q 140 84 160 78 Q 165 90 130 92 Q 80 90 50 82 Z" fill="rgba(11,83,148,0.36)" stroke="#0B5394" stroke-width="0.6"></path><circle cx="120" cy="74" r="3.2" fill="#D17C00" stroke="#FAFAF7" stroke-width="1.3"></circle><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#6B6B6B">2.13 in/hr · MOD</text></svg>'),Zt=oe('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><rect fill="#F2F2EE"></rect><g stroke="#D9D6CC" stroke-width="0.6"><line x1="0" y1="40" y2="40"></line><line x1="0" y1="80" y2="80"></line><line x1="60" y1="0" x2="60"></line><line x1="160" y1="0" x2="160"></line></g><path d="M180 92 Q 200 88 215 96 Q 220 105 200 104 Q 185 102 180 96 Z" fill="rgba(42,111,168,0.18)" stroke="#2A6FA8" stroke-width="0.5" stroke-dasharray="2 2"></path><circle cx="120" cy="60" r="3.2" fill="#D17C00" stroke="#FAFAF7" stroke-width="1.3"></circle><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#6B6B6B">no ponding · MOD</text></svg>'),Xt=oe('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><defs><pattern id="rt-s2-rgb" x="0" y="0" width="6" height="6" patternUnits="userSpaceOnUse"><rect width="6" height="6" fill="#7A8E6A"></rect><rect x="0" y="0" width="3" height="3" fill="#8D9C7A"></rect><rect x="3" y="3" width="3" height="3" fill="#69795D"></rect></pattern></defs><rect fill="url(#rt-s2-rgb)"></rect><rect x="0" y="55" height="6" fill="#A8A496"></rect><rect x="115" y="0" width="8" fill="#A8A496"></rect><ellipse cx="50" cy="92" rx="6" ry="3" fill="#2A6FA8" fill-opacity="0.65"></ellipse><text x="6" y="14" font-size="9" font-family="IBM Plex Mono" fill="#FAFAF7">PRITHVI · 0.3%</text><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#FAFAF7">scene 2026-05-02</text></svg>'),Jt=oe('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><rect fill="#F2F2EE"></rect><rect x="0" y="0" width="80" height="60" fill="#C66"></rect><rect x="80" y="0" width="60" height="60" fill="#C66"></rect><rect x="140" y="0" width="100" height="38" fill="#C66"></rect><rect x="140" y="38" width="100" height="22" fill="#5B7FB4"></rect><rect x="0" y="60" width="100" height="60" fill="#C66"></rect><rect x="100" y="60" width="50" height="40" fill="#5B8A4A"></rect><rect x="150" y="60" width="50" height="60" fill="#D9C75A"></rect><rect x="200" y="60" width="40" height="60" fill="#C66"></rect><rect x="100" y="100" width="50" height="20" fill="#A89A78"></rect><text x="6" y="14" font-size="9" font-family="IBM Plex Mono" fill="#FAFAF7">LULC · TerraMind</text><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#FAFAF7">scene 2026-05-02</text></svg>'),$t=oe('<rect fill="rgba(42,111,168,0.55)" stroke="#2A6FA8" stroke-width="0.4"></rect>'),ea=oe('<svg width="100%" aria-hidden="true" class="svelte-1lx1psy"><rect fill="#3A3A38"></rect><!><text x="6" y="14" font-size="9" font-family="IBM Plex Mono" fill="#FAFAF7">BLDG · TerraMind</text><text font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#FAFAF7">36.2% built</text></svg>'),ta=S('<div class="thumb-placeholder svelte-1lx1psy">raster preview</div>');function aa(q,e){var l=he(),p=J(l);{var b=o=>{var s=Vt();c(s,"viewBox","0 0 240 120"),c(s,"height",120);var v=r(s);c(v,"width",240),c(v,"height",120);var d=n(v),C=r(d);c(C,"x2",240);var B=n(C);c(B,"x2",240);var g=n(B);c(g,"y2",120);var x=n(g);c(x,"y2",120),a(d);var F=n(d,4);c(F,"x",234),c(F,"y",115),a(s),f(o,s)},i=o=>{var s=Zt();c(s,"viewBox","0 0 240 120"),c(s,"height",120);var v=r(s);c(v,"width",240),c(v,"height",120);var d=n(v),C=r(d);c(C,"x2",240);var B=n(C);c(B,"x2",240);var g=n(B);c(g,"y2",120);var x=n(g);c(x,"y2",120),a(d);var F=n(d,3);c(F,"x",234),c(F,"y",115),a(s),f(o,s)},y=o=>{var s=Xt();c(s,"viewBox","0 0 240 120"),c(s,"height",120);var v=n(r(s));c(v,"width",240),c(v,"height",120);var d=n(v);c(d,"width",240);var C=n(d);c(C,"height",120);var B=n(C,3);c(B,"x",234),c(B,"y",115),a(s),f(o,s)},u=o=>{var s=Jt();c(s,"viewBox","0 0 240 120"),c(s,"height",120);var v=r(s);c(v,"width",240),c(v,"height",120);var d=n(v,11);c(d,"x",234),c(d,"y",115),a(s),f(o,s)},w=o=>{var s=ea();c(s,"viewBox","0 0 240 120"),c(s,"height",120);var v=r(s);c(v,"width",240),c(v,"height",120);var d=n(v);$(d,16,()=>[[10,10,28,18],[42,10,30,16],[78,10,40,22],[124,10,32,18],[162,10,30,18],[198,10,32,18],[10,32,28,16],[42,30,30,18],[124,32,32,16],[162,32,30,16],[198,32,32,16],[10,55,28,18],[42,55,30,18],[78,55,40,18],[124,55,32,18],[162,55,30,18],[198,55,32,18],[10,80,28,16],[42,80,30,16],[78,80,40,16],[124,80,32,16],[162,80,30,16],[10,100,28,12],[42,100,30,12],[78,100,40,12]],ie,(B,g)=>{var x=$t();M(()=>{c(x,"x",g[0]),c(x,"y",g[1]),c(x,"width",g[2]),c(x,"height",g[3])}),f(B,x)});var C=n(d,2);c(C,"x",234),c(C,"y",115),a(s),f(o,s)},m=o=>{var s=ta();f(o,s)};I(p,o=>{e.kind==="stormwater"?o(b):e.kind==="stormwater-dry"?o(i,1):e.kind==="prithvi"?o(y,2):e.kind==="lulc"?o(u,3):e.kind==="buildings"?o(w,4):o(m,-1)})}f(q,l)}var ra=S('<span class="illustrative svelte-1m43x1m" title="Illustrative rendering, not source pixels">illustrative</span>'),sa=S('<span class="svelte-1m43x1m"> </span>'),ia=S('<div class="raster-headline svelte-1m43x1m"><span class="svelte-1m43x1m"> </span> <!></div>'),na=S('<div class="body-sub svelte-1m43x1m"> </div>'),la=S('<div class="body body-raster svelte-1m43x1m"><div class="frame svelte-1m43x1m"><!> <!></div> <!> <!></div>');function oa(q,e){K(e,!0);var k=la(),h=r(k),l=r(h);aa(l,{get kind(){return e.card.rasterKind}});var p=n(l,2);{var b=m=>{var o=ra();f(m,o)};I(p,m=>{(e.card.illustrative||e.card.tier==="synthetic")&&m(b)})}a(h);var i=n(h,2);{var y=m=>{var o=ia(),s=r(o),v=r(s,!0);a(s);var d=n(s,2);{var C=B=>{var g=sa(),x=r(g);a(g),M(()=>_(x,`· ${e.card.subhead??""}`)),f(B,g)};I(d,B=>{e.card.subhead&&B(C)})}a(o),M(()=>{ne(s,`color: var(--tier-${e.card.tier??""});`),_(v,e.card.headline)}),f(m,o)};I(i,m=>{e.card.headline&&m(y)})}var u=n(i,2);{var w=m=>{var o=na(),s=r(o,!0);a(o),M(()=>_(s,e.card.sub)),f(m,o)};I(u,m=>{e.card.sub&&m(w)})}a(k),f(q,k),G()}var va=S('<span class="reg-label svelte-1iup6im"> </span> <span class="reg-source svelte-1iup6im"> </span>',1),da=S('<span class="reg-silent svelte-1iup6im"> </span>'),ca=S('<li><span class="reg-tag svelte-1iup6im"><!> <span> </span></span> <!></li>'),ua=S('<div class="body-sub svelte-1iup6im"> </div>'),ga=S('<div class="body body-register svelte-1iup6im"><ul class="reg-list svelte-1iup6im"></ul> <!></div>');function ha(q,e){K(e,!0);var k=ga(),h=r(k);$(h,21,()=>e.card.registers??[],ie,(b,i)=>{var y=ca();let u;var w=r(y),m=r(w);le(m,{get tier(){return t(i).tier},size:9,get color(){return`var(--tier-${t(i).tier??""})`}});var o=n(m,2),s=r(o,!0);a(o),a(w);var v=n(w,2);{var d=B=>{var g=va(),x=J(g),F=r(x,!0);a(x);var E=n(x,2),z=r(E,!0);a(E),M(()=>{c(x,"title",t(i).detail?`${t(i).label} — ${t(i).detail}`:t(i).label),_(F,t(i).label),_(z,t(i).sourceId??"")}),f(B,g)},C=B=>{var g=da(),x=r(g,!0);a(g),M(()=>_(x,t(i).note)),f(B,g)};I(v,B=>{t(i).label?B(d):B(C,-1)})}a(y),M(()=>{u=de(y,1,"reg-row svelte-1iup6im",null,u,{silent:!t(i).label}),c(w,"title",t(i).tier),_(s,t(i).reg)}),f(b,y)}),a(h);var l=n(h,2);{var p=b=>{var i=ua(),y=r(i,!0);a(i),M(()=>_(y,e.card.sub)),f(b,i)};I(l,b=>{e.card.sub&&b(p)})}a(k),f(q,k),G()}var fa=S('<div class="cell-aux svelte-1swqabu"> </div>'),ya=S('<div class="cell svelte-1swqabu"><div class="cell-tier svelte-1swqabu"><!> <span class="cell-label"> </span></div> <div class="cell-value svelte-1swqabu"> </div> <!></div>'),_a=S('<div class="cell-aux svelte-1swqabu"> </div>'),ma=S('<div class="cell svelte-1swqabu"><div class="cell-tier svelte-1swqabu"><!> <span class="cell-label"> </span></div> <div class="cell-value svelte-1swqabu"> </div> <!></div>'),xa=S('<div class="cmp-delta svelte-1swqabu"> </div>'),ba=S('<div class="body-sub svelte-1swqabu"> </div>'),pa=S('<div class="body body-comparison svelte-1swqabu"><div class="cmp-grid svelte-1swqabu"><!> <div class="divider svelte-1swqabu" aria-hidden="true">vs</div> <!></div> <!> <!></div>');function wa(q,e){K(e,!0);var k=pa(),h=r(k),l=r(h);{var p=o=>{var s=ya(),v=r(s),d=r(v);le(d,{get tier(){return e.card.left.tier},size:10,get color(){return`var(--tier-${e.card.left.tier??""})`}});var C=n(d,2),B=r(C,!0);a(C),a(v);var g=n(v,2),x=r(g,!0);a(g);var F=n(g,2);{var E=z=>{var H=fa(),D=r(H,!0);a(H),M(()=>_(D,e.card.left.aux)),f(z,H)};I(F,z=>{e.card.left.aux&&z(E)})}a(s),M(()=>{_(B,e.card.left.label),ne(g,`color: var(--tier-${e.card.left.tier??""});`),_(x,e.card.left.value)}),f(o,s)};I(l,o=>{e.card.left&&o(p)})}var b=n(l,4);{var i=o=>{var s=ma(),v=r(s),d=r(v);le(d,{get tier(){return e.card.right.tier},size:10,get color(){return`var(--tier-${e.card.right.tier??""})`}});var C=n(d,2),B=r(C,!0);a(C),a(v);var g=n(v,2),x=r(g,!0);a(g);var F=n(g,2);{var E=z=>{var H=_a(),D=r(H,!0);a(H),M(()=>_(D,e.card.right.aux)),f(z,H)};I(F,z=>{e.card.right.aux&&z(E)})}a(s),M(()=>{_(B,e.card.right.label),ne(g,`color: var(--tier-${e.card.right.tier??""});`),_(x,e.card.right.value)}),f(o,s)};I(b,o=>{e.card.right&&o(i)})}a(h);var y=n(h,2);{var u=o=>{var s=xa(),v=r(s,!0);a(s),M(()=>_(v,e.card.delta)),f(o,s)};I(y,o=>{e.card.delta&&o(u)})}var w=n(y,2);{var m=o=>{var s=ba(),v=r(s,!0);a(s),M(()=>_(v,e.card.sub)),f(o,s)};I(w,o=>{e.card.sub&&o(m)})}a(k),f(q,k),G()}var ka=S('<div class="meta-row svelte-e40scu"><dt class="svelte-e40scu"> </dt> <dd class="svelte-e40scu"> </dd></div>'),Sa=S('<div class="body-sub svelte-e40scu"> </div>'),Aa=S('<div class="body body-meta svelte-e40scu"><dl class="meta-list svelte-e40scu"></dl> <!></div>');function Ma(q,e){K(e,!0);var k=Aa(),h=r(k);$(h,21,()=>e.card.metaRows??[],ie,(b,i)=>{var y=ka(),u=r(y),w=r(u,!0);a(u);var m=n(u,2),o=r(m,!0);a(m),a(y),M(()=>{_(w,t(i).k),_(o,t(i).v)}),f(b,y)}),a(h);var l=n(h,2);{var p=b=>{var i=Sa(),y=r(i,!0);a(i),M(()=>_(y,e.card.sub)),f(b,i)};I(l,b=>{e.card.sub&&b(p)})}a(k),f(q,k),G()}var Ba=S('<div class="unknown svelte-1x6xqhh"> </div>');function Ca(q,e){K(e,!0);var k=he(),h=J(k);{var l=d=>{bt(d,{get card(){return e.card}})},p=d=>{Mt(d,{get card(){return e.card}})},b=d=>{Lt(d,{get card(){return e.card}})},i=d=>{Tt(d,{get card(){return e.card}})},y=d=>{Yt(d,{get card(){return e.card}})},u=d=>{Qt(d,{get card(){return e.card}})},w=d=>{oa(d,{get card(){return e.card}})},m=d=>{ha(d,{get card(){return e.card}})},o=d=>{wa(d,{get card(){return e.card}})},s=d=>{Ma(d,{get card(){return e.card}})},v=d=>{var C=Ba(),B=r(C);a(C),M(()=>_(B,`unknown variant: ${e.card.variant??""}`)),f(d,C)};I(h,d=>{e.card.variant==="headline"?d(l):e.card.variant==="tabular"?d(p,1):e.card.variant==="scalars"?d(b,2):e.card.variant==="spark"||e.card.variant==="histogram"?d(i,3):e.card.variant==="timeseries"?d(y,4):e.card.variant==="forecast"?d(u,5):e.card.variant==="raster"||e.card.variant==="raster-pred"?d(w,6):e.card.variant==="register"?d(m,7):e.card.variant==="comparison"?d(o,8):e.card.variant==="meta"?d(s,9):d(v,-1)})}f(q,k),G()}var Fa=S('<button type="button" class="fc-foot-cite svelte-1nuvnzu"><span class="fc-foot-docid svelte-1nuvnzu"> </span> <span class="fc-foot-arrow svelte-1nuvnzu" aria-hidden="true">→</span></button>'),La=S('<span class="fc-foot-docid fc-foot-docid-mute svelte-1nuvnzu"> </span>'),qa=S('<header class="fc-head svelte-1nuvnzu"><div class="fc-head-source svelte-1nuvnzu"><!> <span class="fc-head-source-label svelte-1nuvnzu"> </span></div> <span class="fc-head-vintage svelte-1nuvnzu"> </span></header> <h4 class="fc-title svelte-1nuvnzu"> </h4> <!> <footer class="fc-foot svelte-1nuvnzu"><!> <span><!> <span> </span></span></footer>',1);function Ce(q,e){K(e,!0);let k=ee(e,"density",3,"comfortable"),h=ee(e,"linkedKey",3,null),l=P(()=>h()!=null&&e.card.mapLayer!=null&&e.card.mapLayer===h()),p=P(()=>Ae[e.card.tier].short),b=P(()=>e.card.mapLayer!=null);function i(){var s;e.card.mapLayer&&((s=e.onLink)==null||s.call(e,e.card.mapLayer))}function y(){var s;e.card.mapLayer&&((s=e.onLink)==null||s.call(e,null))}function u(s){var v;s.stopPropagation(),e.card.citeId&&((v=e.onCite)==null||v.call(e,e.card.citeId))}function w(s){var v;t(b)&&(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),(v=e.onLink)==null||v.call(e,e.card.mapLayer??null))}var m=he(),o=J(m);$e(o,()=>t(b)?"button":"article",!1,(s,v)=>{Ge(s,()=>({type:t(b)?"button":void 0,role:t(b)?"button":"article",class:`fc fc-${e.card.variant??""} fc-tier-${e.card.tier??""}`,"aria-labelledby":`fc-${e.card.id}-title`,"aria-label":`${Ae[e.card.tier].label} card · ${e.card.title} · ${e.card.source}`,onpointerenter:i,onpointerleave:y,onfocus:i,onblur:y,onkeydown:w,[Qe]:{"is-compact":k()==="compact","is-linked":t(l),"is-interactive":t(b),"has-illustrative":e.card.illustrative||e.card.tier==="synthetic"||e.card.variant==="comparison"}}),void 0,void 0,void 0,"svelte-1nuvnzu");var d=qa(),C=J(d),B=r(C),g=r(B);le(g,{get tier(){return e.card.tier},size:11,get color(){return`var(--tier-${e.card.tier??""})`}});var x=n(g,2),F=r(x,!0);a(x),a(B);var E=n(B,2),z=r(E);a(E),a(C);var H=n(C,2),D=r(H,!0);a(H);var A=n(H,2);Ca(A,{get card(){return e.card}});var T=n(A,2),W=r(T);{var Q=U=>{var Y=Fa(),Z=r(Y),ae=r(Z,!0);a(Z),te(2),a(Y),M(()=>{c(Y,"title",`Open ${e.card.docId} in citation drawer`),_(ae,e.card.docId)}),we("click",Y,u),f(U,Y)},N=U=>{var Y=La(),Z=r(Y,!0);a(Y),M(()=>_(Z,e.card.docId)),f(U,Y)};I(W,U=>{e.card.citeId?U(Q):U(N,-1)})}var O=n(W,2),R=r(O);le(R,{get tier(){return e.card.tier},size:9,get color(){return`var(--tier-${e.card.tier??""})`}});var L=n(R,2),j=r(L,!0);a(L),a(O),a(T),M(()=>{c(x,"title",e.card.agency),_(F,e.card.source),_(z,`v. ${e.card.vintage??""}`),c(H,"id",`fc-${e.card.id}-title`),_(D,e.card.title),de(O,1,`fc-tier-badge fc-tier-badge-${e.card.tier??""}`,"svelte-1nuvnzu"),c(O,"aria-label",`epistemic tier ${t(p)}`),_(j,t(p))}),f(v,d)}),f(q,m),G()}pe(["click"]);var Ia=S('<span class="sep svelte-1qqbvs2">·</span> <span class="silent svelte-1qqbvs2"><strong class="svelte-1qqbvs2"> </strong> silent</span>',1),Ea=S('<span class="sep svelte-1qqbvs2">·</span> <span class="warn svelte-1qqbvs2"><strong class="svelte-1qqbvs2"> </strong> warn</span>',1),Pa=S('<span class="sep svelte-1qqbvs2">·</span> <span class="err svelte-1qqbvs2"><strong class="svelte-1qqbvs2"> </strong> error</span>',1),za=S('<span class="tally svelte-1qqbvs2"><span class="cards"> </span> <span class="sep svelte-1qqbvs2">·</span> <span class="fired"><strong class="svelte-1qqbvs2"> </strong> fired</span> <!> <!> <!> <span class="sep svelte-1qqbvs2">·</span> <span class="ms"><strong class="svelte-1qqbvs2"> </strong></span></span>');function Da(q,e){K(e,!0);function k(A){return A.flatMap(T=>T.children?[T,...k(T.children)]:[T])}let h=P(()=>k(e.members)),l=P(()=>t(h).filter(A=>A.status==="ok").length),p=P(()=>t(h).filter(A=>A.status==="silent").length),b=P(()=>t(h).filter(A=>A.status==="warn").length),i=P(()=>t(h).filter(A=>A.status==="error").length),y=P(()=>e.members.reduce((A,T)=>Math.max(A,T.ms??0),0));function u(A){return A===0?"—":A<1e3?`${A}ms`:`${(A/1e3).toFixed(1)}s`}var w=za(),m=r(w),o=r(m);a(m);var s=n(m,4),v=r(s),d=r(v,!0);a(v),te(),a(s);var C=n(s,2);{var B=A=>{var T=Ia(),W=n(J(T),2),Q=r(W),N=r(Q,!0);a(Q),te(),a(W),M(()=>_(N,t(p))),f(A,T)};I(C,A=>{t(p)>0&&A(B)})}var g=n(C,2);{var x=A=>{var T=Ea(),W=n(J(T),2),Q=r(W),N=r(Q,!0);a(Q),te(),a(W),M(()=>_(N,t(b))),f(A,T)};I(g,A=>{t(b)>0&&A(x)})}var F=n(g,2);{var E=A=>{var T=Pa(),W=n(J(T),2),Q=r(W),N=r(Q,!0);a(Q),te(),a(W),M(()=>_(N,t(i))),f(A,T)};I(F,A=>{t(i)>0&&A(E)})}var z=n(F,4),H=r(z),D=r(H,!0);a(H),a(z),a(w),M(A=>{_(o,`${e.cardCount??""} card${e.cardCount===1?"":"s"}`),_(d,t(l)),_(D,A)},[()=>u(t(y))]),f(q,w),G()}var Ta=S('<span class="prov-tier svelte-qakefz"><!></span>'),Ra=S('<span class="prov-note svelte-qakefz"> </span>'),Ha=S('<span class="prov-ms svelte-qakefz"> </span>'),Na=S('<li class="prov-children svelte-qakefz"><!></li>'),ja=S('<li><span class="prov-pip svelte-qakefz" aria-hidden="true"> </span> <span class="prov-id svelte-qakefz"> </span> <!> <span class="prov-name svelte-qakefz"> </span> <!> <!></li> <!>',1),Oa=S('<ul class="prov-tree svelte-qakefz"></ul>');function Fe(q,e){K(e,!0);let k=ee(e,"depth",3,0);function h(b){return{ok:"●",warn:"▲",error:"■",silent:"○"}[b]}function l(b){return b.status==="warn"?"#B7791F":b.status==="error"?"#B91C1C":b.status==="silent"?"var(--ink-tertiary)":b.tier?`var(--tier-${b.tier})`:"var(--ink)"}var p=Oa();$(p,21,()=>e.members,b=>b.id,(b,i)=>{var y=ja(),u=J(y),w=r(u),m=r(w,!0);a(w);var o=n(w,2),s=r(o,!0);a(o);var v=n(o,2);{var d=D=>{var A=Ta(),T=r(A);{let W=P(()=>`var(--tier-${t(i).tier})`);le(T,{get tier(){return t(i).tier},size:9,get color(){return t(W)}})}a(A),f(D,A)};I(v,D=>{t(i).tier&&D(d)})}var C=n(v,2),B=r(C,!0);a(C);var g=n(C,2);{var x=D=>{var A=Ra(),T=r(A);a(A),M(()=>_(T,`— ${t(i).note??""}`)),f(D,A)};I(g,D=>{t(i).note&&D(x)})}var F=n(g,2);{var E=D=>{var A=Ha(),T=r(A,!0);a(A),M(W=>_(T,W),[()=>t(i).ms<1e3?`${t(i).ms}ms`:`${(t(i).ms/1e3).toFixed(1)}s`]),f(D,A)};I(F,D=>{t(i).ms!=null&&D(E)})}a(u);var z=n(u,2);{var H=D=>{var A=Na(),T=r(A);{let W=P(()=>k()+1);Fe(T,{get members(){return t(i).children},get depth(){return t(W)}})}a(A),f(D,A)};I(z,D=>{var A;(A=t(i).children)!=null&&A.length&&D(H)})}M((D,A)=>{de(u,1,`prov-row prov-status-${t(i).status??""}`,"svelte-qakefz"),ne(w,`color: ${D??""};`),_(m,A),_(s,t(i).id),_(B,t(i).name)},[()=>l(t(i)),()=>h(t(i).status)]),f(b,y)}),a(p),M(()=>ne(p,`--depth: ${k()??""};`)),f(q,p),G()}var Wa=S('<div class="silent svelte-16iv0n8"><span class="silent-tag svelte-16iv0n8">silent</span> <p class="silent-prose svelte-16iv0n8"><!></p></div>'),Ya=S("<div></div>"),Ua=S('<div class="prov-body svelte-16iv0n8"><!></div>'),Ka=S('<section><header class="region-head svelte-16iv0n8"><div class="region-head-left svelte-16iv0n8"><span class="region-num svelte-16iv0n8"> </span> <h3 class="region-name svelte-16iv0n8"> </h3> <span class="region-role svelte-16iv0n8"> </span> <span class="region-tag svelte-16iv0n8"> </span></div> <!></header> <!> <div class="prov svelte-16iv0n8"><button type="button" class="prov-toggle svelte-16iv0n8"><span class="prov-caret svelte-16iv0n8" aria-hidden="true"> </span> <span class="prov-label"> </span> <span class="prov-meta svelte-16iv0n8"> </span></button> <!></div></section>');function Ga(q,e){K(e,!0);let k=ee(e,"density",3,"comfortable"),h=ee(e,"provenanceMode",3,"smart"),l=ee(e,"linkedKey",3,null),p=P(()=>dt[e.stone]),b=P(()=>`${Be.indexOf(e.stone)+1}`.padStart(2,"0")),i=P(()=>e.stone==="capstone");function y(X){return X.flatMap(V=>V.children?[V,...y(V.children)]:[V])}let u=P(()=>y(e.trace.members)),w=P(()=>t(u).length),m=P(()=>t(u).some(X=>X.status==="warn"||X.status==="error"||X.status==="silent")),o=P(()=>h()==="all-expanded"?!0:h()==="all-collapsed"?!1:t(m)),s=be(null),v=P(()=>t(s)??t(o));se(()=>{h(),ge(s,null)});var d=Ka(),C=r(d),B=r(C),g=r(B),x=r(g,!0);a(g);var F=n(g,2),E=r(F,!0);a(F);var z=n(F,2),H=r(z);a(z);var D=n(z,2),A=r(D,!0);a(D),a(B);var T=n(B,2);Da(T,{get cardCount(){return e.cards.length},get members(){return e.trace.members}}),a(C);var W=n(C,2);{var Q=X=>{var V=Wa(),ve=n(r(V),2),ue=r(ve);{var fe=ce=>{var ye=xe("No projection cards landed for this query. Atomic functions still ran (see provenance) and returned silence rather than confabulation.");f(ce,ye)},Ie=ce=>{var ye=xe("No cards for this Stone on this query.");f(ce,ye)};I(ue,ce=>{e.stone==="lodestone"?ce(fe):ce(Ie,-1)})}a(ve),a(V),f(X,V)},N=X=>{var V=Ya();let ve;$(V,21,()=>e.cards,ue=>ue.id,(ue,fe)=>{Ce(ue,{get card(){return t(fe)},get density(){return k()},get linkedKey(){return l()},get onCite(){return e.onCite},get onLink(){return e.onLink}})}),a(V),M(()=>ve=de(V,1,"rail svelte-16iv0n8",null,ve,{"rail-capstone":t(i)})),f(X,V)};I(W,X=>{e.cards.length===0?X(Q):X(N,-1)})}var O=n(W,2),R=r(O),L=r(R),j=r(L,!0);a(L);var U=n(L,2),Y=r(U);a(U);var Z=n(U,2),ae=r(Z);a(Z),a(R);var Le=n(R,2);{var qe=X=>{var V=Ua(),ve=r(V);Fe(ve,{get members(){return e.trace.members}}),a(V),M(()=>c(V,"id",`prov-body-${e.stone}`)),f(X,V)};I(Le,X=>{t(v)&&X(qe)})}a(O),a(d),M(()=>{de(d,1,`region region-${e.stone??""}`,"svelte-16iv0n8"),c(d,"aria-labelledby",`region-h-${e.stone}`),c(d,"data-stone",e.stone),_(x,t(b)),c(F,"id",`region-h-${e.stone}`),_(E,t(p).name),_(H,`· ${t(p).role??""}`),_(A,t(p).tag),c(R,"aria-expanded",t(v)),c(R,"aria-controls",`prov-body-${e.stone}`),_(j,t(v)?"▾":"▸"),_(Y,`${t(v)?"Hide":"Show"} provenance`),_(ae,`· ${t(w)??""} function${t(w)===1?"":"s"}${t(m)?" · anomaly":""}`)}),we("click",R,()=>ge(s,!t(v))),f(q,d),G()}pe(["click"]);var Qa=S('<section class="region region-grammar svelte-gwg123" aria-label="Card grammar reference"><header class="region-head svelte-gwg123"><div class="region-head-left svelte-gwg123"><span class="region-num svelte-gwg123">SPEC</span> <h3 class="region-name svelte-gwg123">Card grammar</h3> <span class="region-role svelte-gwg123">· every body variant in the system</span> <span class="region-tag svelte-gwg123">stubs, not findings</span></div> <span class="grammar-count svelte-gwg123"> </span></header> <div class="rail svelte-gwg123"></div></section>');function Va(q,e){let k=ee(e,"density",3,"comfortable");const h=[{id:"grm-headline",stone:"cornerstone",tier:"modeled",variant:"headline",source:"FEMA",agency:"spec",vintage:"spec",title:"Single big number, scenario-tagged",headline:"Zone AE",subhead:"preliminary FIRM, panel ID",sub:"Use when the answer is one categorical state.",docId:"DS-HEADLINE"},{id:"grm-tabular",stone:"cornerstone",tier:"empirical",variant:"tabular",source:"USGS",agency:"spec",vintage:"spec",title:"Small table of observations",columns:["id","value","dist."],rows:[["ROW-001","1.2 m","0.18 mi"],["ROW-002","0.9 m","0.32 mi"],["ROW-003","0.7 m","0.41 mi"]],sub:"Use when 3–8 records each carry the same fields.",docId:"DS-TABULAR"},{id:"grm-scalars",stone:"touchstone",tier:"empirical",variant:"scalars",source:"NWS",agency:"spec",vintage:"spec",title:"Trio of scalar readings",scalars:[{value:"0.02 in",label:"precip · 24h"},{value:"11 mph",label:"wind"},{value:"63°F",label:"temp"}],sub:"Use for current-state dashboards.",docId:"DS-SCALARS"},{id:"grm-spark",stone:"touchstone",tier:"empirical",variant:"spark",source:"FloodNet",agency:"spec",vintage:"spec",title:"Sparkline of recent events",headline:"n events",subhead:"window · peak",spark:[1,2,4,3,7,12,8,5,3,2,4,9,6],docId:"DS-SPARK"},{id:"grm-histogram",stone:"touchstone",tier:"proxy",variant:"histogram",source:"NYC 311",agency:"spec",vintage:"spec",title:"Histogram of binned counts",headline:"n calls",subhead:"window · seasonal note",histogram:[3,2,1,0,1,4,7,12,18,11,5,3,4,2,1,0,2,3,8,9,4,2,1,0],docId:"DS-HIST"},{id:"grm-timeseries",stone:"lodestone",tier:"modeled",variant:"timeseries",source:"Granite TTM",agency:"spec",vintage:"spec",title:"Forecast curve with horizon",headline:"+0.41 m peak",subhead:"+38h · 90% CI",timeseries:{hours:96,peak:{x:38,y:41},peakLabel:"+0.41 m"},spatialNote:"regional",sub:"Spatial-index callout when station ≠ point-of-query.",docId:"DS-TS"},{id:"grm-forecast",stone:"lodestone",tier:"modeled",variant:"forecast",source:"NPCC4",agency:"spec",vintage:"spec",title:"Long-horizon scenario projections",forecast:[{year:2030,low:4,mid:6,high:9},{year:2050,low:13,mid:22,high:30},{year:2100,low:38,mid:71,high:114}],sub:"Use for decadal+ uncertainty cones.",docId:"DS-FCST"},{id:"grm-raster",stone:"cornerstone",tier:"modeled",variant:"raster",source:"NYC DEP",agency:"spec",vintage:"spec",title:"Raster snapshot, mapped layer",rasterKind:"stormwater",headline:"ponding",subhead:"scenario · pixel summary",sub:"Use for any 2D model output.",docId:"DS-RASTER"},{id:"grm-rasterpred",stone:"touchstone",tier:"modeled",variant:"raster-pred",source:"Prithvi-NYC",agency:"spec",vintage:"spec",title:"Raster prediction, illustrative",rasterKind:"prithvi",headline:"n% flooded",subhead:"model · scene id",illustrative:!0,sub:"Same chrome as raster + illustrative tag.",docId:"DS-RASTERPRED"},{id:"grm-register",stone:"keystone",tier:"empirical",variant:"register",source:"NYC OpenData",agency:"spec",vintage:"spec",title:"Composite register list",registers:[{reg:"MTA",tier:"empirical",label:"Station entrance",detail:"0.18 mi · 5",sourceId:"MTA-X",note:null},{reg:"NYCHA",tier:"empirical",label:"Development",detail:"0.41 mi · 2,878 res.",sourceId:"NYCHA-Y",note:null},{reg:"DOH",tier:"empirical",label:null,detail:null,sourceId:null,note:"no acute-care hospital within 1.0 mi"}],sub:"Use when many specialists join into one Stone.",docId:"DS-REGISTER"},{id:"grm-comparison",stone:"keystone",tier:"synthetic",variant:"comparison",source:"EMP × SYN",agency:"spec",vintage:"spec",title:"Documented vs. interpreted",left:{tier:"empirical",label:"documented",value:"31.4%",aux:"n polygons"},right:{tier:"synthetic",label:"interpreted",value:"29.8%",aux:"n polygons"},delta:"Δ = −1.6 pp · agreement strong",sub:"Use to surface model–ground-truth deltas.",docId:"DS-CMP"},{id:"grm-meta",stone:"capstone",tier:"modeled",variant:"meta",source:"Mellea",agency:"spec",vintage:"spec",title:"Capstone reconciliation",metaRows:[{k:"claims",v:"12 / 12 grounded"},{k:"tier mix",v:"EMP 5 · MOD 4 · PRX 2 · SYN 1"},{k:"tier-1 freshness",v:"median 38 d"},{k:"warnings",v:"0"}],sub:"Use to expose the synthesis layer's audit.",docId:"DS-META"}];var l=Qa(),p=r(l),b=n(r(p),2),i=r(b);a(b),a(p);var y=n(p,2);$(y,21,()=>h,u=>u.id,(u,w)=>{Ce(u,{get card(){return t(w)},get density(){return k()}})}),a(y),a(l),M(()=>_(i,`${h.length??""} variants`)),f(q,l)}var Za=S('<section class="findings svelte-ci42t5" aria-label="Findings, grouped by Stone"><header class="findings-head svelte-ci42t5"><h2 class="findings-h2 svelte-ci42t5">Findings · grouped by Stone</h2> <span class="findings-tagline svelte-ci42t5">cards = what each Stone found · provenance collapses below</span></header> <!> <!> <!></section>');function nr(q,e){K(e,!0);let k=ee(e,"density",3,"comfortable"),h=ee(e,"provenanceMode",3,"smart"),l=ee(e,"showGrammar",3,!1),p=ee(e,"linkedKey",3,null),b=P(()=>{const s={cornerstone:[],keystone:[],touchstone:[],lodestone:[],capstone:[]};for(const v of e.data.cards)s[v.stone].push(v);return s}),i=P(()=>{const s={cornerstone:{key:"cornerstone",members:[]},keystone:{key:"keystone",members:[]},touchstone:{key:"touchstone",members:[]},lodestone:{key:"lodestone",members:[]},capstone:{key:"capstone",members:[]}};for(const v of e.data.stones)s[v.key]=v;return s});var y=Za(),u=n(r(y),2);yt(u,{get cards(){return e.data.cards},get stones(){return e.data.stones},get wallSeconds(){return e.data.wallSeconds},get cacheHit(){return e.data.cacheHit}});var w=n(u,2);$(w,16,()=>Be,s=>s,(s,v)=>{Ga(s,{get stone(){return v},get cards(){return t(b)[v]},get trace(){return t(i)[v]},get density(){return k()},get provenanceMode(){return h()},get linkedKey(){return p()},get onCite(){return e.onCite},get onLink(){return e.onLink}})});var m=n(w,2);{var o=s=>{Va(s,{get density(){return k()}})};I(m,s=>{l()&&s(o)})}a(y),f(q,y),G()}export{rr as C,nr as F,ir as M,sr as R};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -1,2 +1,2 @@
|
|
| 1 |
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.
|
| 2 |
-
var S=e=>{throw TypeError(e)};var B=(e,t,r)=>t.has(e)||S("Cannot "+r);var c=(e,t,r)=>(B(e,t,"read from private field"),r?r.call(e):t.get(e)),I=(e,t,r)=>t.has(e)?S("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),k=(e,t,r,n)=>(B(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r);import{b as j,_ as b}from"../chunks/1oGnrPC6.js";import{q as M,T as W,i as X,E as Z,U as $,V as tt,A as et,z as N,a8 as rt,B as at,l as x,a7 as st,k as l,a9 as nt,aa as ot,ab as it,p as ct,ac as ut,K as dt,G as _t,o as mt,f as A,s as lt,a as ft,j as p,c as ht,r as vt,t as gt,J as w}from"../chunks/DwbuJhNu.js";import{h as yt,m as Et,u as bt,a as R,c as D,f as F,t as Rt,s as Pt}from"../chunks/Dlpu43Tj.js";import{B as Ot,p as L,i as V}from"../chunks/8F5LpR-T.js";function q(e,t,r){var n;M&&(n=at,W());var o=new Ot(e);X(()=>{var i=t()??null;if(M){var a=$(n),s=a===rt,m=i!==null;if(s!==m){var P=tt();et(P),o.anchor=P,N(!1),o.ensure(i,i&&(y=>r(y,i))),N(!0);return}}o.ensure(i,i&&(y=>r(y,i)))},Z)}function Tt(e){return class extends At{constructor(t){super({component:e,...t})}}}var f,d;class At{constructor(t){I(this,f);I(this,d);var i;var r=new Map,n=(a,s)=>{var m=it(s,!1,!1);return r.set(a,m),m};const o=new Proxy({...t.props||{},$$events:{}},{get(a,s){return l(r.get(s)??n(s,Reflect.get(a,s)))},has(a,s){return s===st?!0:(l(r.get(s)??n(s,Reflect.get(a,s))),Reflect.has(a,s))},set(a,s,m){return x(r.get(s)??n(s,m),m),Reflect.set(a,s,m)}});k(this,d,(t.hydrate?yt:Et)(t.component,{target:t.target,anchor:t.anchor,props:o,context:t.context,intro:t.intro??!1,recover:t.recover,transformError:t.transformError})),(!((i=t==null?void 0:t.props)!=null&&i.$$host)||t.sync===!1)&&nt(),k(this,f,o.$$events);for(const a of Object.keys(c(this,d)))a==="$set"||a==="$destroy"||a==="$on"||ot(this,a,{get(){return c(this,d)[a]},set(s){c(this,d)[a]=s},enumerable:!0});c(this,d).$set=a=>{Object.assign(o,a)},c(this,d).$destroy=()=>{bt(c(this,d))}}$set(t){c(this,d).$set(t)}$on(t,r){c(this,f)[t]=c(this,f)[t]||[];const n=(...o)=>r.call(this,...o);return c(this,f)[t].push(n),()=>{c(this,f)[t]=c(this,f)[t].filter(o=>o!==n)}}$destroy(){c(this,d).$destroy()}}f=new WeakMap,d=new WeakMap;const Ct={};var xt=F('<div id="svelte-announcer" aria-live="assertive" aria-atomic="true" style="position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px"><!></div>'),It=F("<!> <!>",1);function kt(e,t){ct(t,!0);let r=L(t,"components",23,()=>[]),n=L(t,"data_0",3,null),o=L(t,"data_1",3,null);ut(()=>t.stores.page.set(t.page)),dt(()=>{t.stores,t.page,t.constructors,r(),t.form,n(),o(),t.stores.page.notify()});let i=p(!1),a=p(!1),s=p(null);_t(()=>{const u=t.stores.page.subscribe(()=>{l(i)&&(x(a,!0),mt().then(()=>{x(s,document.title||"untitled page",!0)}))});return x(i,!0),u});const m=w(()=>t.constructors[1]);var P=It(),y=A(P);{var Y=u=>{const h=w(()=>t.constructors[0]);var v=D(),O=A(v);q(O,()=>l(h),(g,E)=>{j(E(g,{get data(){return n()},get form(){return t.form},get params(){return t.page.params},children:(_,pt)=>{var C=D(),K=A(C);q(K,()=>l(m),(U,Q)=>{j(Q(U,{get data(){return o()},get form(){return t.form},get params(){return t.page.params}}),T=>r()[1]=T,()=>{var T;return(T=r())==null?void 0:T[1]})}),R(_,C)},$$slots:{default:!0}}),_=>r()[0]=_,()=>{var _;return(_=r())==null?void 0:_[0]})}),R(u,v)},z=u=>{const h=w(()=>t.constructors[0]);var v=D(),O=A(v);q(O,()=>l(h),(g,E)=>{j(E(g,{get data(){return n()},get form(){return t.form},get params(){return t.page.params}}),_=>r()[0]=_,()=>{var _;return(_=r())==null?void 0:_[0]})}),R(u,v)};V(y,u=>{t.constructors[1]?u(Y):u(z,-1)})}var H=lt(y,2);{var J=u=>{var h=xt(),v=ht(h);{var O=g=>{var E=Rt();gt(()=>Pt(E,l(s))),R(g,E)};V(v,g=>{l(a)&&g(O)})}vt(h),R(u,h)};V(H,u=>{l(i)&&u(J)})}R(e,P),ft()}const St=Tt(kt),Bt=[()=>b(()=>import("../nodes/0.
|
|
|
|
| 1 |
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.D8XZI90P.js","../chunks/Dlpu43Tj.js","../chunks/DwbuJhNu.js","../chunks/DNaFzQeI.js","../chunks/8F5LpR-T.js","../chunks/B07kFGr7.js","../chunks/BwzbOVaY.js","../chunks/DFFHaukH.js","../assets/0.MHa9rmVP.css","../nodes/1.DGS2cZTl.js","../nodes/2.CiK-Ot3Z.js","../chunks/CBcGqa-S.js","../assets/2.BkIzAsIp.css","../nodes/3.DjnrtyPP.js","../chunks/Cl16PtNL.js","../assets/Briefing.Dmn9LgiV.css","../assets/3.BZfqQRM0.css","../nodes/4.rD3Yr4HV.js","../chunks/Bu5KOiaf.js","../chunks/1oGnrPC6.js","../assets/stoneRegistry.bHiraU77.css","../assets/4.BIuIAgmk.css","../nodes/5.CAXEzxjD.js"])))=>i.map(i=>d[i]);
|
| 2 |
+
var S=e=>{throw TypeError(e)};var B=(e,t,r)=>t.has(e)||S("Cannot "+r);var c=(e,t,r)=>(B(e,t,"read from private field"),r?r.call(e):t.get(e)),I=(e,t,r)=>t.has(e)?S("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),k=(e,t,r,n)=>(B(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r);import{b as j,_ as b}from"../chunks/1oGnrPC6.js";import{q as M,T as W,i as X,E as Z,U as $,V as tt,A as et,z as N,a8 as rt,B as at,l as x,a7 as st,k as l,a9 as nt,aa as ot,ab as it,p as ct,ac as ut,K as dt,G as _t,o as mt,f as A,s as lt,a as ft,j as p,c as ht,r as vt,t as gt,J as w}from"../chunks/DwbuJhNu.js";import{h as yt,m as Et,u as bt,a as R,c as D,f as F,t as Rt,s as Pt}from"../chunks/Dlpu43Tj.js";import{B as Ot,p as L,i as V}from"../chunks/8F5LpR-T.js";function q(e,t,r){var n;M&&(n=at,W());var o=new Ot(e);X(()=>{var i=t()??null;if(M){var a=$(n),s=a===rt,m=i!==null;if(s!==m){var P=tt();et(P),o.anchor=P,N(!1),o.ensure(i,i&&(y=>r(y,i))),N(!0);return}}o.ensure(i,i&&(y=>r(y,i)))},Z)}function Tt(e){return class extends At{constructor(t){super({component:e,...t})}}}var f,d;class At{constructor(t){I(this,f);I(this,d);var i;var r=new Map,n=(a,s)=>{var m=it(s,!1,!1);return r.set(a,m),m};const o=new Proxy({...t.props||{},$$events:{}},{get(a,s){return l(r.get(s)??n(s,Reflect.get(a,s)))},has(a,s){return s===st?!0:(l(r.get(s)??n(s,Reflect.get(a,s))),Reflect.has(a,s))},set(a,s,m){return x(r.get(s)??n(s,m),m),Reflect.set(a,s,m)}});k(this,d,(t.hydrate?yt:Et)(t.component,{target:t.target,anchor:t.anchor,props:o,context:t.context,intro:t.intro??!1,recover:t.recover,transformError:t.transformError})),(!((i=t==null?void 0:t.props)!=null&&i.$$host)||t.sync===!1)&&nt(),k(this,f,o.$$events);for(const a of Object.keys(c(this,d)))a==="$set"||a==="$destroy"||a==="$on"||ot(this,a,{get(){return c(this,d)[a]},set(s){c(this,d)[a]=s},enumerable:!0});c(this,d).$set=a=>{Object.assign(o,a)},c(this,d).$destroy=()=>{bt(c(this,d))}}$set(t){c(this,d).$set(t)}$on(t,r){c(this,f)[t]=c(this,f)[t]||[];const n=(...o)=>r.call(this,...o);return c(this,f)[t].push(n),()=>{c(this,f)[t]=c(this,f)[t].filter(o=>o!==n)}}$destroy(){c(this,d).$destroy()}}f=new WeakMap,d=new WeakMap;const Ct={};var xt=F('<div id="svelte-announcer" aria-live="assertive" aria-atomic="true" style="position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px"><!></div>'),It=F("<!> <!>",1);function kt(e,t){ct(t,!0);let r=L(t,"components",23,()=>[]),n=L(t,"data_0",3,null),o=L(t,"data_1",3,null);ut(()=>t.stores.page.set(t.page)),dt(()=>{t.stores,t.page,t.constructors,r(),t.form,n(),o(),t.stores.page.notify()});let i=p(!1),a=p(!1),s=p(null);_t(()=>{const u=t.stores.page.subscribe(()=>{l(i)&&(x(a,!0),mt().then(()=>{x(s,document.title||"untitled page",!0)}))});return x(i,!0),u});const m=w(()=>t.constructors[1]);var P=It(),y=A(P);{var Y=u=>{const h=w(()=>t.constructors[0]);var v=D(),O=A(v);q(O,()=>l(h),(g,E)=>{j(E(g,{get data(){return n()},get form(){return t.form},get params(){return t.page.params},children:(_,pt)=>{var C=D(),K=A(C);q(K,()=>l(m),(U,Q)=>{j(Q(U,{get data(){return o()},get form(){return t.form},get params(){return t.page.params}}),T=>r()[1]=T,()=>{var T;return(T=r())==null?void 0:T[1]})}),R(_,C)},$$slots:{default:!0}}),_=>r()[0]=_,()=>{var _;return(_=r())==null?void 0:_[0]})}),R(u,v)},z=u=>{const h=w(()=>t.constructors[0]);var v=D(),O=A(v);q(O,()=>l(h),(g,E)=>{j(E(g,{get data(){return n()},get form(){return t.form},get params(){return t.page.params}}),_=>r()[0]=_,()=>{var _;return(_=r())==null?void 0:_[0]})}),R(u,v)};V(y,u=>{t.constructors[1]?u(Y):u(z,-1)})}var H=lt(y,2);{var J=u=>{var h=xt(),v=ht(h);{var O=g=>{var E=Rt();gt(()=>Pt(E,l(s))),R(g,E)};V(v,g=>{l(a)&&g(O)})}vt(h),R(u,h)};V(H,u=>{l(i)&&u(J)})}R(e,P),ft()}const St=Tt(kt),Bt=[()=>b(()=>import("../nodes/0.D8XZI90P.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8]),import.meta.url),()=>b(()=>import("../nodes/1.DGS2cZTl.js"),__vite__mapDeps([9,1,2,5,6]),import.meta.url),()=>b(()=>import("../nodes/2.CiK-Ot3Z.js"),__vite__mapDeps([10,1,2,7,11,6,12]),import.meta.url),()=>b(()=>import("../nodes/3.DjnrtyPP.js"),__vite__mapDeps([13,1,2,4,11,5,6,14,3,15,16]),import.meta.url),()=>b(()=>import("../nodes/4.rD3Yr4HV.js"),__vite__mapDeps([17,1,2,4,5,6,14,11,3,15,18,19,20,7,21]),import.meta.url),()=>b(()=>import("../nodes/5.CAXEzxjD.js"),__vite__mapDeps([22,1,2,14,4,11,3,15,18,19,20]),import.meta.url)],Mt=[],Nt={"/":[2],"/print/[queryId]":[3],"/q/sample":[5],"/q/[queryId]":[4]},G={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},jt=Object.fromEntries(Object.entries(G.transport).map(([e,t])=>[e,t.decode])),Ft=Object.fromEntries(Object.entries(G.transport).map(([e,t])=>[e,t.encode])),Gt=!1,Yt=(e,t)=>jt[e](t);export{Yt as decode,jt as decoders,Nt as dictionary,Ft as encoders,Gt as hash,G as hooks,Ct as matchers,Bt as nodes,St as root,Mt as server_loads};
|
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{l as o,a as r}from"../chunks/BV_WLJ_i.js";export{o as load_css,r as start};
|
|
|
|
|
|
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{l as o,a as r}from"../chunks/BwzbOVaY.js";export{o as load_css,r as start};
|
|
@@ -1,2 +1,2 @@
|
|
| 1 |
-
import{d as N,a as i,s as O,b as R,f as l}from"../chunks/Dlpu43Tj.js";import{p as P,c as n,s as p,r as s,v as S,a as C,t as j,f as F,k as y,J as x}from"../chunks/DwbuJhNu.js";import{b as D,s as H}from"../chunks/DNaFzQeI.js";import{p as T,i as g}from"../chunks/8F5LpR-T.js";import{p as _}from"../chunks/
|
| 2 |
For residents, see <a href="https://www.floodhelpny.org">FloodHelpNY</a> · <a href="https://www.floodnet.nyc">FloodNet NYC</a>.</p> <p class="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.2 · build 2026-05-03</p></div></footer>`);function W(o){var r=V();i(o,r)}var $=l('<a href="#region-briefing" class="skip-link">Skip to briefing</a> <a href="#region-map" class="skip-link" style="left: -9999px;">Skip to map</a> <a href="#region-trace" class="skip-link" style="left: -9999px;">Skip to trace</a>',1);function B(o){var r=$();S(4),i(o,r)}var G=l("<!> <!>",1),K=l('<!> <main class="svelte-12qhfyh"><!></main> <!>',1);function oe(o,r){P(r,!0);let v=x(()=>()=>{const e=_.params.queryId;if(!e)return null;try{return decodeURIComponent(e)}catch{return e}}),h=x(()=>_.url.pathname.startsWith("/print/"));var d=K(),c=F(d);{var f=e=>{var a=G(),t=F(a);B(t);var b=p(t,2);{let q=x(()=>y(v)());M(b,{get query(){return y(q)},onResetCold:()=>window.location.href="/"})}i(e,a)};g(c,e=>{y(h)||e(f)})}var u=p(c,2),k=n(u);H(k,()=>r.children),s(u);var m=p(u,2);{var w=e=>{W(e)};g(m,e=>{y(h)||e(w)})}i(o,d),C()}export{oe as component,te as universal};
|
|
|
|
| 1 |
+
import{d as N,a as i,s as O,b as R,f as l}from"../chunks/Dlpu43Tj.js";import{p as P,c as n,s as p,r as s,v as S,a as C,t as j,f as F,k as y,J as x}from"../chunks/DwbuJhNu.js";import{b as D,s as H}from"../chunks/DNaFzQeI.js";import{p as T,i as g}from"../chunks/8F5LpR-T.js";import{p as _}from"../chunks/B07kFGr7.js";import"../chunks/DFFHaukH.js";const U=!0,Y=!0,z="never",te=Object.freeze(Object.defineProperty({__proto__:null,prerender:U,ssr:Y,trailingSlash:z},Symbol.toStringTag,{value:"Module"}));var E=l('<button type="button" class="app-header-query" aria-label="Edit query"><span class="app-header-query-icon" aria-hidden="true">⌕</span> <span class="app-header-query-text"> </span> <span class="app-header-query-edit">edit</span></button>'),J=l('<button type="button" class="app-header-link app-header-link-button svelte-f1belb" aria-label="Open curated PDF view of completed briefing in new tab">export PDF</button>'),L=l('<header class="app-header no-print" data-screen-label="App header"><div class="app-header-inner"><div class="app-header-left"><a href="/" class="riprap-wordmark" aria-label="Riprap home">riprap</a> <span class="app-header-sep">/</span> <span class="app-header-context">flood-exposure briefing</span></div> <div class="app-header-mid"><!></div> <div class="app-header-right"><a class="app-header-link" href="#methodology">methodology</a> <!> <span class="app-header-status" aria-live="polite"><span class="app-header-status-dot" aria-hidden="true"></span> live</span></div></div></header>');function M(o,r){P(r,!0);let v=T(r,"query",3,null);function h(){if(typeof window>"u")return;const a=_.params.queryId??(_.url.pathname==="/q/sample"?"sample":"");a&&window.open(`/print/${encodeURIComponent(a)}`,"_blank","noopener")}var d=L(),c=n(d),f=p(n(c),2),u=n(f);{var k=a=>{var t=E(),b=p(n(t),2),q=n(b,!0);s(b),S(2),s(t),j(()=>O(q,v())),R("click",t,function(...I){var A;(A=r.onResetCold)==null||A.apply(this,I)}),i(a,t)};g(u,a=>{v()&&a(k)})}s(f);var m=p(f,2),w=p(n(m),2);{var e=a=>{var t=J();R("click",t,h),i(a,t)};g(w,a=>{D.ready&&a(e)})}S(2),s(m),s(c),s(d),i(o,d),C()}N(["click"]);var V=l(`<footer class="app-footer no-print"><div class="app-footer-inner"><p class="app-footer-guard"><strong>Riprap does not predict damage.</strong> This tool is for professional analytical work, not personal property decisions.
|
| 2 |
For residents, see <a href="https://www.floodhelpny.org">FloodHelpNY</a> · <a href="https://www.floodnet.nyc">FloodNet NYC</a>.</p> <p class="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.2 · build 2026-05-03</p></div></footer>`);function W(o){var r=V();i(o,r)}var $=l('<a href="#region-briefing" class="skip-link">Skip to briefing</a> <a href="#region-map" class="skip-link" style="left: -9999px;">Skip to map</a> <a href="#region-trace" class="skip-link" style="left: -9999px;">Skip to trace</a>',1);function B(o){var r=$();S(4),i(o,r)}var G=l("<!> <!>",1),K=l('<!> <main class="svelte-12qhfyh"><!></main> <!>',1);function oe(o,r){P(r,!0);let v=x(()=>()=>{const e=_.params.queryId;if(!e)return null;try{return decodeURIComponent(e)}catch{return e}}),h=x(()=>_.url.pathname.startsWith("/print/"));var d=K(),c=F(d);{var f=e=>{var a=G(),t=F(a);B(t);var b=p(t,2);{let q=x(()=>y(v)());M(b,{get query(){return y(q)},onResetCold:()=>window.location.href="/"})}i(e,a)};g(c,e=>{y(h)||e(f)})}var u=p(c,2),k=n(u);H(k,()=>r.children),s(u);var m=p(u,2);{var w=e=>{W(e)};g(m,e=>{y(h)||e(w)})}i(o,d),C()}export{oe as component,te as universal};
|
|
@@ -1 +1 @@
|
|
| 1 |
-
import{a as c,f as u,s as e}from"../chunks/Dlpu43Tj.js";import{p as v,f as l,t as _,a as g,c as p,r as o,s as x}from"../chunks/DwbuJhNu.js";import{p as m}from"../chunks/
|
|
|
|
| 1 |
+
import{a as c,f as u,s as e}from"../chunks/Dlpu43Tj.js";import{p as v,f as l,t as _,a as g,c as p,r as o,s as x}from"../chunks/DwbuJhNu.js";import{p as m}from"../chunks/B07kFGr7.js";var d=u("<h1> </h1> <p> </p>",1);function k(f,i){v(i,!0);var t=d(),r=l(t),h=p(r,!0);o(r);var a=x(r,2),n=p(a,!0);o(a),_(()=>{var s;e(h,m.status),e(n,(s=m.error)==null?void 0:s.message)}),c(f,t),g()}export{k as component};
|
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
import{d as H,e as
|
| 2 |
Type an address, neighborhood, or proposed development — Riprap returns a written briefing
|
| 3 |
where every numeric claim links to its primary public-record source.</p> <p class="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" class="cold-start-redir">FloodHelpNY</a>.
|
| 4 |
-
For real-time conditions, see <a href="https://www.floodnet.nyc" class="cold-start-redir">FloodNet NYC</a>.</p></div> <form class="cold-start-form" role="search"><label for="riprap-query" class="cold-start-label section-label">Query</label> <div class="cold-start-input-row"><input id="riprap-query" type="text" placeholder="address · neighborhood · proposed development" class="cold-start-input" autocomplete="off"/> <button type="submit" class="cold-start-submit">Generate briefing →</button></div></form> <div class="cold-start-samples"><span class="section-label cold-start-samples-label">Sample queries</span> <div class="cold-start-samples-grid"></div></div> <div class="cold-start-trust"><span class="section-label">How Riprap is built</span> <ul class="cold-start-trust-list"><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" class="cold-start-method-link">Methodology paper →</a></div></section>`);function O(e,
|
|
|
|
| 1 |
+
import{d as H,e as Y,a as S,f as q,s as x,b as I}from"../chunks/Dlpu43Tj.js";import"../chunks/DFFHaukH.js";import{m as P,n as f,o as j,u as B,g as L,q as M,p as Q,k as v,a as D,c as o,s as m,v as k,r as t,t as T,l as U,j as V}from"../chunks/DwbuJhNu.js";import{e as $,r as z,i as G}from"../chunks/CBcGqa-S.js";import{g as K}from"../chunks/BwzbOVaY.js";function W(e,s,i=s){var r=new WeakSet;P(e,"input",async l=>{var a=l?e.defaultValue:e.value;if(a=w(e)?_(a):a,i(a),f!==null&&r.add(f),await j(),a!==(a=s())){var u=e.selectionStart,n=e.selectionEnd,b=e.value.length;if(e.value=a??"",n!==null){var c=e.value.length;u===n&&n===b&&c>b?(e.selectionStart=c,e.selectionEnd=c):(e.selectionStart=u,e.selectionEnd=Math.min(n,c))}}}),(M&&e.defaultValue!==e.value||B(s)==null&&e.value)&&(i(w(e)?_(e.value):e.value),f!==null&&r.add(f)),L(()=>{var l=s();if(e===document.activeElement){var a=f;if(r.has(a))return}w(e)&&l===_(e.value)||e.type==="date"&&!l&&!e.value||l!==e.value&&(e.value=l??"")})}function w(e){var s=e.type;return s==="number"||s==="range"}function _(e){return e===""?null:+e}var Z=q('<button type="button" class="cold-start-sample"><span class="cold-start-sample-mode"> </span> <span class="cold-start-sample-q"> </span> <span class="cold-start-sample-sub"> </span> <span class="cold-start-sample-arrow" aria-hidden="true">↗</span></button>'),J=q(`<section class="cold-start" aria-label="Empty query state"><div class="cold-start-band"><p class="cold-start-deck"><strong>Riprap</strong> is a citation-grounded flood-exposure briefing tool for New York City.
|
| 2 |
Type an address, neighborhood, or proposed development — Riprap returns a written briefing
|
| 3 |
where every numeric claim links to its primary public-record source.</p> <p class="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" class="cold-start-redir">FloodHelpNY</a>.
|
| 4 |
+
For real-time conditions, see <a href="https://www.floodnet.nyc" class="cold-start-redir">FloodNet NYC</a>.</p></div> <form class="cold-start-form" role="search"><label for="riprap-query" class="cold-start-label section-label">Query</label> <div class="cold-start-input-row"><input id="riprap-query" type="text" placeholder="address · neighborhood · proposed development" class="cold-start-input" autocomplete="off"/> <button type="submit" class="cold-start-submit">Generate briefing →</button></div></form> <div class="cold-start-samples"><span class="section-label cold-start-samples-label">Sample queries</span> <div class="cold-start-samples-grid"></div></div> <div class="cold-start-trust"><span class="section-label">How Riprap is built</span> <ul class="cold-start-stones svelte-7xcb6n"><li class="svelte-7xcb6n"><span class="stone-dot svelte-7xcb6n" style="background: var(--stone-cornerstone);" aria-hidden="true"></span> <em class="svelte-7xcb6n">Cornerstone</em> remembers — what NYC's ground remembers.</li> <li class="svelte-7xcb6n"><span class="stone-dot svelte-7xcb6n" style="background: var(--stone-keystone);" aria-hidden="true"></span> <em class="svelte-7xcb6n">Keystone</em> tallies — what's exposed.</li> <li class="svelte-7xcb6n"><span class="stone-dot svelte-7xcb6n" style="background: var(--stone-touchstone);" aria-hidden="true"></span> <em class="svelte-7xcb6n">Touchstone</em> watches — what's happening now.</li> <li class="svelte-7xcb6n"><span class="stone-dot svelte-7xcb6n" style="background: var(--stone-lodestone);" aria-hidden="true"></span> <em class="svelte-7xcb6n">Lodestone</em> projects — what's coming.</li> <li class="svelte-7xcb6n"><span class="stone-dot svelte-7xcb6n" style="background: var(--stone-capstone);" aria-hidden="true"></span> <em class="svelte-7xcb6n">Capstone</em> writes it all down with citations.</li></ul> <ul class="cold-start-trust-list"><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" class="cold-start-method-link">Methodology paper →</a></div></section>`);function O(e,s){Q(s,!0);const i=[{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"}];let r=V("");function l(d){const p=d.trim();p&&K(`/q/${encodeURIComponent(p)}`)}function a(d){d.preventDefault(),l(v(r))}var u=J(),n=m(o(u),2),b=m(o(n),2),c=o(b);z(c),k(2),t(b),t(n);var C=m(n,2),E=m(o(C),2);$(E,21,()=>i,G,(d,p)=>{var h=Z(),y=o(h),N=o(y,!0);t(y);var g=m(y,2),A=o(g,!0);t(g);var R=m(g,2),F=o(R,!0);t(R),k(2),t(h),T(()=>{x(N,v(p).mode),x(A,v(p).q),x(F,v(p).sub)}),I("click",h,()=>l(v(p).q)),S(d,h)}),t(E),t(C),k(2),t(u),Y("submit",n,a),W(c,()=>v(r),d=>U(r,d)),S(e,u),D()}H(["click"]);var X=q('<section class="hero-band"><div class="hero-band-inner"><!></div></section>');function re(e){var s=X(),i=o(s),r=o(i);O(r,{}),t(i),t(s),S(e,s)}export{re as component};
|
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
import{d as we,c as Ee,a as p,s as l,b as Fe,f as d}from"../chunks/Dlpu43Tj.js";import{w as $e,i as ke,H as Te,x as qe,q as D,C as Me,y as Z,z as ee,A as te,B as Oe,F as Se,p as je,G as Ce,f as De,a as Ie,k as e,l as I,I as Re,J as m,j as R,$ as Ae,c as a,s,r as t,t as A}from"../chunks/DwbuJhNu.js";import{i as P}from"../chunks/8F5LpR-T.js";import{e as Pe}from"../chunks/CBcGqa-S.js";import{p as Be}from"../chunks/
|
| 2 |
use <strong>export PDF</strong> from the header to open this view.
|
| 3 |
Snapshots are stored per-browser and persist between runs of the same query.</p></div>`),We=d('<div class="curl svelte-uialbm"> </div>'),Ke=d('<li class="svelte-uialbm"><span class="cn svelte-uialbm"> </span> <span class="cglyph svelte-uialbm"><!></span> <span class="csrc svelte-uialbm"> </span> <span class="cvint svelte-uialbm"> </span> <div class="ctitle svelte-uialbm"> </div> <!> <div class="cdocid svelte-uialbm">doc_id <code> </code></div></li>'),Qe=d('<section class="print-citations svelte-uialbm"><h2 class="svelte-uialbm">Citations</h2> <ol class="svelte-uialbm"></ol></section>'),Ue=d('<article class="print-doc svelte-uialbm"><header class="print-head svelte-uialbm"><div class="print-head-top svelte-uialbm"><span class="wordmark svelte-uialbm">riprap</span> <span class="meta"> </span></div> <h1 class="print-title svelte-uialbm"> </h1> <div class="print-sub svelte-uialbm">intent <strong> </strong> </div></header> <div class="print-controls no-print svelte-uialbm"><button type="button" class="svelte-uialbm">print / save as PDF</button> <span class="hint svelte-uialbm"> </span></div> <!> <!> <footer class="print-foot svelte-uialbm"> </footer></article>'),Xe=d('<div class="empty svelte-uialbm"><p>Loading…</p></div>');function nt(f,_){je(_,!0);let c=m(()=>Be.params.queryId??""),r=R(null),u=R(!1),o=R(!1);Ce(()=>{const i=ze(e(c));if(!i){I(u,!0);return}I(r,i,!0),requestAnimationFrame(()=>{requestAnimationFrame(()=>{typeof window<"u"&&(window.print(),I(o,!0))})})});function b(){typeof window<"u"&&window.print()}let B=m(()=>e(r)?Object.values(e(r).citations).sort((i,n)=>i.n-n.n):[]),G=m(()=>e(r)?new Date(e(r).generatedAt).toISOString().slice(0,10):"");var N=Ee();He("uialbm",i=>{Re(()=>{var n;Ae.title=`Riprap briefing — ${((n=e(r))==null?void 0:n.queryText)??"export"??""}`})});var ae=De(N);{var se=i=>{var n=Ve();p(i,n)},re=i=>{var n=Ue(),g=a(n),h=a(g),z=s(a(h),2),ne=a(z);t(z),t(h);var y=s(h,2),le=a(y,!0);t(y);var H=s(y,2),x=s(a(H)),oe=a(x,!0);t(x);var ve=s(x);t(H),t(g);var w=s(g,2),L=a(w),J=s(L,2),pe=a(J,!0);t(J),t(w);var V=s(w,2);Ge(V,{get blocks(){return e(r).blocks},get citations(){return e(r).citations},streaming:!1});var W=s(V,2);{var de=E=>{var F=Qe(),Q=s(a(F),2);Pe(Q,21,()=>e(B),$=>$.id,($,v)=>{var k=Ke(),T=a(k),ce=a(T);t(T);var q=s(T,2),me=a(q);Ne(me,{get tier(){return e(v).tier},size:9,get color(){return`var(--tier-${e(v).tier??""})`}}),t(q);var M=s(q,2),fe=a(M,!0);t(M);var O=s(M,2),_e=a(O);t(O);var S=s(O,2),be=a(S,!0);t(S);var U=s(S,2);{var ge=j=>{var C=We(),xe=a(C,!0);t(C),A(()=>l(xe,e(v).url)),p(j,C)},he=m(()=>e(v).url&&e(v).url.startsWith("http"));P(U,j=>{e(he)&&j(ge)})}var X=s(U,2),Y=s(a(X)),ye=a(Y,!0);t(Y),t(X),t(k),A(()=>{l(ce,`[${e(v).n??""}]`),l(fe,e(v).source),l(_e,`v. ${e(v).vintage??""}`),l(be,e(v).title),l(ye,e(v).docId)}),p($,k)}),t(Q),t(F),p(E,F)};P(W,E=>{e(B).length&&E(de)})}var K=s(W,2),ue=a(K);t(K),t(n),A(()=>{l(ne,`flood-exposure briefing · v0.4.2 · ${e(G)??""}`),l(le,e(r).queryText),l(oe,e(r).intent??"briefing"),l(ve,` · ${e(r).specialists??""} specialists
|
| 4 |
· ${e(r).attempts??1??""} reconcile${(e(r).attempts??1)===1?"":"s"}
|
|
|
|
| 1 |
+
import{d as we,c as Ee,a as p,s as l,b as Fe,f as d}from"../chunks/Dlpu43Tj.js";import{w as $e,i as ke,H as Te,x as qe,q as D,C as Me,y as Z,z as ee,A as te,B as Oe,F as Se,p as je,G as Ce,f as De,a as Ie,k as e,l as I,I as Re,J as m,j as R,$ as Ae,c as a,s,r as t,t as A}from"../chunks/DwbuJhNu.js";import{i as P}from"../chunks/8F5LpR-T.js";import{e as Pe}from"../chunks/CBcGqa-S.js";import{p as Be}from"../chunks/B07kFGr7.js";import{B as Ge,T as Ne}from"../chunks/Cl16PtNL.js";import{l as ze}from"../chunks/DNaFzQeI.js";function He(f,_){let c=null,r=D;var u;if(D){c=Oe;for(var o=Se(document.head);o!==null&&(o.nodeType!==Me||o.data!==f);)o=Z(o);if(o===null)ee(!1);else{var b=Z(o);o.remove(),te(b)}}D||(u=document.head.appendChild($e()));try{ke(()=>_(u),Te|qe)}finally{r&&(ee(!0),te(c))}}const Le=!1,Je=!1,it=Object.freeze(Object.defineProperty({__proto__:null,prerender:Le,ssr:Je},Symbol.toStringTag,{value:"Module"}));var Ve=d(`<div class="empty svelte-uialbm"><h1 class="svelte-uialbm">No briefing snapshot found</h1> <p>Run a briefing first at <a href="/" class="svelte-uialbm">riprap home</a>; once it finishes,
|
| 2 |
use <strong>export PDF</strong> from the header to open this view.
|
| 3 |
Snapshots are stored per-browser and persist between runs of the same query.</p></div>`),We=d('<div class="curl svelte-uialbm"> </div>'),Ke=d('<li class="svelte-uialbm"><span class="cn svelte-uialbm"> </span> <span class="cglyph svelte-uialbm"><!></span> <span class="csrc svelte-uialbm"> </span> <span class="cvint svelte-uialbm"> </span> <div class="ctitle svelte-uialbm"> </div> <!> <div class="cdocid svelte-uialbm">doc_id <code> </code></div></li>'),Qe=d('<section class="print-citations svelte-uialbm"><h2 class="svelte-uialbm">Citations</h2> <ol class="svelte-uialbm"></ol></section>'),Ue=d('<article class="print-doc svelte-uialbm"><header class="print-head svelte-uialbm"><div class="print-head-top svelte-uialbm"><span class="wordmark svelte-uialbm">riprap</span> <span class="meta"> </span></div> <h1 class="print-title svelte-uialbm"> </h1> <div class="print-sub svelte-uialbm">intent <strong> </strong> </div></header> <div class="print-controls no-print svelte-uialbm"><button type="button" class="svelte-uialbm">print / save as PDF</button> <span class="hint svelte-uialbm"> </span></div> <!> <!> <footer class="print-foot svelte-uialbm"> </footer></article>'),Xe=d('<div class="empty svelte-uialbm"><p>Loading…</p></div>');function nt(f,_){je(_,!0);let c=m(()=>Be.params.queryId??""),r=R(null),u=R(!1),o=R(!1);Ce(()=>{const i=ze(e(c));if(!i){I(u,!0);return}I(r,i,!0),requestAnimationFrame(()=>{requestAnimationFrame(()=>{typeof window<"u"&&(window.print(),I(o,!0))})})});function b(){typeof window<"u"&&window.print()}let B=m(()=>e(r)?Object.values(e(r).citations).sort((i,n)=>i.n-n.n):[]),G=m(()=>e(r)?new Date(e(r).generatedAt).toISOString().slice(0,10):"");var N=Ee();He("uialbm",i=>{Re(()=>{var n;Ae.title=`Riprap briefing — ${((n=e(r))==null?void 0:n.queryText)??"export"??""}`})});var ae=De(N);{var se=i=>{var n=Ve();p(i,n)},re=i=>{var n=Ue(),g=a(n),h=a(g),z=s(a(h),2),ne=a(z);t(z),t(h);var y=s(h,2),le=a(y,!0);t(y);var H=s(y,2),x=s(a(H)),oe=a(x,!0);t(x);var ve=s(x);t(H),t(g);var w=s(g,2),L=a(w),J=s(L,2),pe=a(J,!0);t(J),t(w);var V=s(w,2);Ge(V,{get blocks(){return e(r).blocks},get citations(){return e(r).citations},streaming:!1});var W=s(V,2);{var de=E=>{var F=Qe(),Q=s(a(F),2);Pe(Q,21,()=>e(B),$=>$.id,($,v)=>{var k=Ke(),T=a(k),ce=a(T);t(T);var q=s(T,2),me=a(q);Ne(me,{get tier(){return e(v).tier},size:9,get color(){return`var(--tier-${e(v).tier??""})`}}),t(q);var M=s(q,2),fe=a(M,!0);t(M);var O=s(M,2),_e=a(O);t(O);var S=s(O,2),be=a(S,!0);t(S);var U=s(S,2);{var ge=j=>{var C=We(),xe=a(C,!0);t(C),A(()=>l(xe,e(v).url)),p(j,C)},he=m(()=>e(v).url&&e(v).url.startsWith("http"));P(U,j=>{e(he)&&j(ge)})}var X=s(U,2),Y=s(a(X)),ye=a(Y,!0);t(Y),t(X),t(k),A(()=>{l(ce,`[${e(v).n??""}]`),l(fe,e(v).source),l(_e,`v. ${e(v).vintage??""}`),l(be,e(v).title),l(ye,e(v).docId)}),p($,k)}),t(Q),t(F),p(E,F)};P(W,E=>{e(B).length&&E(de)})}var K=s(W,2),ue=a(K);t(K),t(n),A(()=>{l(ne,`flood-exposure briefing · v0.4.2 · ${e(G)??""}`),l(le,e(r).queryText),l(oe,e(r).intent??"briefing"),l(ve,` · ${e(r).specialists??""} specialists
|
| 4 |
· ${e(r).attempts??1??""} reconcile${(e(r).attempts??1)===1?"":"s"}
|
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{d as De,s as Y,a as M,f as E,c as Ft,b as Et,t as Lt}from"../chunks/Dlpu43Tj.js";import{c as x,s as $,r as w,v as ze,t as W,k as a,f as ge,J as te,p as jt,j as S,L as ee,K as Oe,l as h,G as Ot,a as Pt}from"../chunks/DwbuJhNu.js";import{p as Xe,i as H}from"../chunks/8F5LpR-T.js";import{p as Dt}from"../chunks/yTOzveqN.js";import{T as ot,t as lt,a as zt,B as Yt}from"../chunks/Cl16PtNL.js";import{C as Rt,F as Bt,R as Ht,M as Gt}from"../chunks/CAli5X_k.js";import"../chunks/DFFHaukH.js";import{b as se,e as ct,a as Pe,s as Ut,i as Wt}from"../chunks/CBcGqa-S.js";import{b as Qe,p as Kt}from"../chunks/DNaFzQeI.js";const Zt=!1,Jt=!1,dr=Object.freeze(Object.defineProperty({__proto__:null,prerender:Zt,ssr:Jt},Symbol.toStringTag,{value:"Module"}));De(["click"]);De(["click"]);var Vt=E('<div class="skeleton-section"><div class="skeleton-head"><span class="skeleton-num"> </span> <span class="skeleton-label"> </span> <span class="skeleton-spinner" aria-hidden="true">▍</span></div> <span class="skeleton-pulse"></span> <span class="skeleton-pulse"></span> <span class="skeleton-pulse"></span></div>'),Xt=E('<div class="skeleton-brief" role="status" aria-live="polite" aria-label="Loading briefing — geocode complete, dispatching specialists"><div class="skeleton-status"><span class="skeleton-pulse"></span> <span class="skeleton-pulse skeleton-pulse-meta"></span></div> <!></div>');function Qt(n){const e=[{n:"01",label:"Status"},{n:"02",label:"Empirical evidence"},{n:"03",label:"Modeled scenarios"},{n:"04",label:"Policy context"}];var t=Xt(),r=x(t),s=x(r);se(s,"",{},{width:"62%"});var u=$(s,2);se(u,"",{},{width:"40%"}),w(r);var o=$(r,2);ct(o,1,()=>e,_=>_.n,(_,m)=>{var l=Vt(),c=x(l),v=x(c),L=x(v,!0);w(v);var R=$(v,2),j=x(R,!0);w(R),ze(2),w(c);var G=$(c,2);se(G,"",{},{width:"92%"});var F=$(G,2);se(F,"",{},{width:"78%"});var P=$(F,2);se(P,"",{},{width:"85%"}),w(l),W(()=>{Y(L,a(m).n),Y(j,a(m).label)}),M(_,l)}),w(t),M(n,t)}var en=E('<div class="reroll-banner" role="status" aria-live="polite"><!> <div class="reroll-body"><span class="reroll-head">Regenerating to satisfy citation grounding</span> <span class="reroll-sub"> </span></div> <span class="reroll-spinner" aria-hidden="true">↻</span></div>');function tn(n,e){let t=Xe(e,"attempt",3,2),r=Xe(e,"max",3,3);var s=en(),u=x(s);ot(u,{tier:"modeled",size:11,color:"var(--tier-modeled)"});var o=$(u,2),_=$(x(o),2),m=x(_);w(_),w(o),ze(2),w(s),W(()=>Y(m,`Mellea reconciler · attempt ${t()??""} of ${r()??""} · previous draft dimmed below`)),M(n,s)}var nn=E("<a> </a>"),rn=E('<button type="button"> </button>'),an=E('<article role="alert" aria-live="assertive"><header class="error-card-head"><!> <span class="error-card-eyebrow"> </span></header> <h3 class="error-card-headline"> </h3> <p class="error-card-body"> </p> <div class="error-card-actions"></div> <footer class="error-card-foot"><span class="section-label">Trust signals · still on</span> <span class="error-card-foot-copy">All foundation models Apache-2.0 · No commercial APIs at runtime</span></footer></article>');function sn(n,e){const t={geocoder:{eyebrow:"Address not resolved",headline:"We couldn't resolve that to a NYC address.",body:`Try a more specific street address — for example, "80 Pioneer Street, Brooklyn." Riprap covers the five boroughs only; international addresses, NJ addresses, and points outside NYC aren't supported.`,tier:"proxy",defaultActions:["Use a sample query","Edit query"]},"all-silent":{eyebrow:"Outside evidence coverage",headline:"No specialists found evidence at this point.",body:"The address resolved, but every flood-evidence specialist returned silent. This is rare and usually means parkland, water, or a point with no nearby 311, no FloodNet sensor, and no Sandy overlap. Try a nearby street address or expand to neighborhood-mode.",tier:"proxy",defaultActions:["Try nearby address","Switch to neighborhood-mode"]},grounding:{eyebrow:"Grounding failure",headline:"Briefing prose couldn't be composed within citation constraints.",body:"Mellea rejected all reroll attempts. The underlying evidence is fine — only the prose composition failed. Download the structured evidence below, or contact support.",tier:"modeled",defaultActions:["Download evidence (JSON)","Contact support","Try again"]},backend:{eyebrow:"Backend unavailable",headline:"All routing targets exhausted.",body:"LiteLLM tried Local Ollama → HF Space T4 → AMD MI300X and didn't reach a healthy backend. This usually clears within 5 minutes during a deploy window. The hardware-pill in the header is currently red.",tier:"proxy",defaultActions:["Retry now","Switch backend"]}};let r=te(()=>t[e.state]),s=te(()=>e.actions??a(r).defaultActions.map(G=>({label:G})));var u=an(),o=x(u),_=x(o);ot(_,{get tier(){return a(r).tier},size:11,get color(){return`var(--tier-${a(r).tier??""})`}});var m=$(_,2),l=x(m,!0);w(m),w(o);var c=$(o,2),v=x(c,!0);w(c);var L=$(c,2),R=x(L,!0);w(L);var j=$(L,2);ct(j,21,()=>a(s),Wt,(G,F,P)=>{var ne=Ft(),Ne=ge(ne);{var Ae=U=>{var O=nn();Pe(O,1,"error-card-action",null,{},{"is-primary":P===0});var X=x(O,!0);w(O),W(()=>{Ut(O,"href",a(F).href),Y(X,a(F).label)}),M(U,O)},ce=U=>{var O=rn();Pe(O,1,"error-card-action",null,{},{"is-primary":P===0});var X=x(O,!0);w(O),W(()=>Y(X,a(F).label)),Et("click",O,function(...re){var de;(de=a(F).onClick)==null||de.apply(this,re)}),M(U,O)};H(Ne,U=>{a(F).href?U(Ae):U(ce,-1)})}M(G,ne)}),w(j),ze(2),w(u),W(()=>{Pe(u,1,`error-card error-card-${e.state??""}`),Y(l,e.eyebrowOverride??a(r).eyebrow),Y(v,e.headlineOverride??a(r).headline),Y(R,e.bodyOverride??a(r).body)}),M(n,u)}De(["click"]);const V="2026-05";function on(n){return n==="fan"||n==="merge"?"ok":n==="silent"?"silent":n==="error"?"error":"ok"}function dt(n){return[n,...(n.children??[]).flatMap(dt)]}function ln(n){const e=n.toLowerCase();return e==="sandy_inundation"||e==="sandy"||e==="dep_stormwater"||e==="dep"||e==="ida_hwm_2021"||e==="ida_hwm"||e==="prithvi_eo_v2"||e==="prithvi_water"||e==="microtopo_lidar"||e==="microtopo"?"cornerstone":e==="mta_entrance_exposure"||e==="mta_entrances"||e==="nycha_development_exposure"||e==="nycha_developments"||e==="doe_school_exposure"||e==="doe_schools"||e==="doh_hospital_exposure"||e==="doh_hospitals"||e==="terramind_synthesis"||e==="terramind"||e==="terramind_buildings"||e==="eo_chip_fetch"?"keystone":e==="floodnet"||e==="nyc311"||e==="nws_obs"||e==="noaa_tides"||e==="prithvi_eo_live"||e==="prithvi_live"||e==="terramind_lulc"?"touchstone":e==="nws_alerts"||e==="ttm_forecast"||e==="ttm_311_forecast"||e==="floodnet_forecast"||e==="ttm_battery_surge"?"lodestone":e.startsWith("reconcile")||e.startsWith("mellea")||e==="rag_granite_embedding"||e==="gliner_extract"?"capstone":null}function cn(n){const e={cornerstone:[],keystone:[],touchstone:[],lodestone:[],capstone:[]};if(n)for(const t of dt(n)){const r=ln(t.name);r&&e[r].push({id:t.id||t.name,name:t.name,status:on(t.status),tier:t.tier,ms:t.ms,note:t.note??t.error??void 0})}return Object.keys(e).map(t=>({key:t,members:e[t]}))}function b(n){return typeof n=="number"&&Number.isFinite(n)?n:null}function A(n){return typeof n=="string"?n:null}function q(n){return n&&typeof n=="object"&&!Array.isArray(n)?n:null}function dn(n,e){return n.sandy!==!0?null:{id:"fsm-sandy",stone:"cornerstone",tier:"empirical",variant:"headline",source:"NYC OEM",agency:"NYC OpenData 5xsi-dfpx · Sandy 2012 inundation",vintage:"2012-10-29",title:"Hurricane Sandy 2012 inundation",headline:"Inside zone",subhead:(e&&A(e.address))??"address inside the empirical 2012 extent",body:"Address sits within the empirical Hurricane Sandy 2012 inundation extent. This is a historical fact, not a model prediction.",docId:"sandy",citeId:"sandy",mapLayer:"sandy"}}function un(n){const e=q(n.dep);if(!e)return null;const t=[];for(const[r,s]of Object.entries(e)){const u=q(s);if(!u)continue;const o=b(u.depth_class)??0;o<=0||t.push([r.replace("dep_",""),A(u.depth_label)??"—",`class ${o}`])}return t.length?{id:"fsm-dep",stone:"cornerstone",tier:"modeled",variant:"tabular",source:"NYC DEP",agency:"NYC Department of Environmental Protection · Stormwater Flood Maps",vintage:"2021",title:"Stormwater flood scenarios at this address",columns:["scenario","depth label","class"],rows:t,sub:`${t.length} scenario${t.length===1?"":"s"} place this lot in modeled flooding`,docId:"dep_stormwater",citeId:"dep",mapLayer:"stormwater"}:null}function pn(n){const e=q(n.ida_hwm);if(!e)return null;const t=b(e.n_within_radius);if(!t||t<=0)return null;const r=[];return r.push(["count",`${t}`,`${b(e.radius_m)??800} m radius`]),b(e.max_height_above_gnd_ft)!=null&&r.push(["max above gnd",`${e.max_height_above_gnd_ft} ft`,"—"]),b(e.nearest_dist_m)!=null&&r.push(["nearest",A(e.nearest_site)??"HWM",`${e.nearest_dist_m} m`]),{id:"fsm-ida-hwm",stone:"cornerstone",tier:"empirical",variant:"tabular",source:"USGS",agency:"USGS STN Hurricane Ida 2021 high-water marks (Event 312)",vintage:"2021-09",title:"Hurricane Ida 2021 high-water marks nearby",columns:["field","value","context"],rows:r,docId:"ida_hwm",citeId:"ida_hwm",mapLayer:"hwm"}}function mn(n){const e=q(n.prithvi_water);if(!e)return null;const t=b(e.nearest_distance_m);return t==null?null:{id:"fsm-prithvi-water",stone:"cornerstone",tier:"modeled",variant:"raster",source:"Prithvi-EO 2.0",agency:"IBM/NASA Prithvi-EO 2.0 · baked Hurricane Ida 2021 polygons",vintage:"2021-09-02",title:"Hurricane Ida 2021 — satellite-attributable inundation",rasterKind:"prithvi",headline:e.inside_water_polygon?"Inside polygon":`${t} m away`,subhead:"pre/post HLS Sentinel-2 segmentation",sub:`${b(e.n_polygons_within_500m)??0} distinct polygons within 500 m`,docId:"prithvi_water",citeId:"prithvi_water",mapLayer:"prithvi"}}function _n(n){const e=q(n.microtopo);if(!e)return null;const t=b(e.point_elev_m);if(t==null)return null;const r=[{value:`${t.toFixed(1)} m`,label:"elevation"}];return b(e.hand_m)!=null&&r.push({value:`${e.hand_m.toFixed(1)} m`,label:"HAND"}),b(e.twi)!=null&&r.push({value:`${e.twi.toFixed(1)}`,label:"TWI"}),b(e.rel_elev_pct_200m)!=null&&r.push({value:`${e.rel_elev_pct_200m}%`,label:"pct lower 200m"}),{id:"fsm-microtopo",stone:"cornerstone",tier:"proxy",variant:"scalars",source:"USGS 3DEP",agency:"USGS 3DEP DEM (LiDAR-derived) + whitebox-workflows hydrology",vintage:"2018",title:"Microtopography at this point",scalars:r,sub:"Lower percentile = topographic low point; runoff routes here.",docId:"microtopo",citeId:"microtopo"}}function fn(n){const e=[],t=q(n.mta_entrances);if(t!=null&&t.available&&Array.isArray(t.entrances))for(const o of t.entrances.slice(0,4))e.push({reg:"MTA",tier:"empirical",label:A(o.station_name)??A(o.entrance_id)??"entrance",detail:`${b(o.distance_m)??"—"} m · ${A(o.daytime_routes)??""}`.trim(),sourceId:A(o.station_id)??"MTA",note:null});else t&&t.available===!1&&e.push({reg:"MTA",tier:"empirical",label:null,detail:null,sourceId:null,note:"no subway entrances within 1.0 mi (silent)"});const r=q(n.nycha_developments);if(r!=null&&r.available&&Array.isArray(r.developments))for(const o of r.developments.slice(0,3))e.push({reg:"NYCHA",tier:"empirical",label:A(o.development)??"development",detail:`${b(o.distance_m)??"—"} m · ${A(o.borough)??""}`.trim(),sourceId:A(o.tds_num)??null,note:null});else r&&r.available===!1&&e.push({reg:"NYCHA",tier:"empirical",label:null,detail:null,sourceId:null,note:"no NYCHA developments within 1.0 mi (silent)"});const s=q(n.doe_schools);if(s!=null&&s.available&&Array.isArray(s.schools))for(const o of s.schools.slice(0,3))e.push({reg:"DOE",tier:"empirical",label:A(o.loc_name)??"school",detail:`${b(o.distance_m)??"—"} m · ${A(o.borough)??""}`.trim(),sourceId:A(o.loc_code)??null,note:null});else s&&s.available===!1&&e.push({reg:"DOE",tier:"empirical",label:null,detail:null,sourceId:null,note:"no schools within 1.0 mi (silent)"});const u=q(n.doh_hospitals);if(u!=null&&u.available&&Array.isArray(u.hospitals))for(const o of u.hospitals.slice(0,3))e.push({reg:"DOH",tier:"empirical",label:A(o.facility_name)??"hospital",detail:`${b(o.distance_m)??"—"} m · ${A(o.borough)??""}`.trim(),sourceId:A(o.fac_id)??null,note:null});else u&&u.available===!1&&e.push({reg:"DOH",tier:"empirical",label:null,detail:null,sourceId:null,note:"no acute-care hospital within 1.0 mi (silent)"});return e.length?{id:"fsm-registers",stone:"keystone",tier:"empirical",variant:"register",source:"NYC OpenData",agency:"NYC OpenData · multi-agency join",vintage:V,title:"Nearby exposed assets",registers:e,sub:`${e.filter(o=>o.label).length} of ${e.length} registers fired · joined within 1.0 mi`,docId:"registers",citeId:"registers",mapLayer:"registers"}:null}function hn(n){const e=q(n.terramind_buildings);return e!=null&&e.ok?{id:"fsm-tm-buildings",stone:"keystone",tier:"modeled",variant:"raster-pred",source:"TerraMind-NYC",agency:"msradam/TerraMind-NYC-Adapters · Buildings LoRA",vintage:"2026",title:"NYC building footprints — TerraMind LoRA",rasterKind:"buildings",headline:`${b(e.pct_buildings)??0}%`,subhead:"building-footprint coverage in chip",sub:`${b(e.n_building_components)??0} distinct components · test mIoU 0.5511`,illustrative:!0,docId:"tm_buildings",citeId:"tm_buildings",mapLayer:"buildings"}:null}function vn(n){const e=q(n.floodnet);if(!e||(b(e.n_sensors)??0)<=0)return null;const t=b(e.n_flood_events_3y)??0;return{id:"fsm-floodnet",stone:"touchstone",tier:"empirical",variant:"spark",source:"FloodNet",agency:"FloodNet NYC ultrasonic depth sensor network",vintage:"2026",title:"FloodNet sensors near this address",headline:`${t} events`,subhead:`${b(e.n_sensors)??0} sensors · last 3 y`,spark:Array.from({length:24},(r,s)=>Math.max(0,Math.round(t/24*1.4*Math.exp(-Math.pow((s-14)/4,2))+t/24))),sparkSub:"Above-curb depth events ≥ 2 cm. Synthetic monthly distribution; raw deployment-id history is in the audit panel.",docId:"floodnet",citeId:"floodnet",mapLayer:"floodnet"}}function yn(n){var _;const e=q(n.nyc311);if(!e)return null;const t=b(e.n)??0;if(t<=0)return null;const r=q(e.by_year),s=q(e.by_descriptor),u=r?Object.values(r).map(m=>b(m)??0):Array.from({length:12},()=>Math.round(t/12)),o=s?(_=Object.entries(s).sort((m,l)=>(b(l[1])??0)-(b(m[1])??0))[0])==null?void 0:_[0]:null;return{id:"fsm-311",stone:"touchstone",tier:"proxy",variant:"histogram",source:"NYC 311",agency:"NYC 311 service requests (Socrata erm2-nwe9)",vintage:V,title:"Recent 311 flood complaints",headline:`${t} calls`,subhead:o?`top descriptor: ${o}`:"all flood-related descriptors",histogram:u,sparkSub:`Within ${b(e.radius_m)??200} m · ${b(e.years)??5} y window. Filtered to flood-relevant descriptors.`,docId:"nyc311",citeId:"nyc311",mapLayer:"complaints"}}function gn(n){var r;const e=q(n.nws_obs);if(!e||e.error||e.station_id==null)return null;const t=[];return b(e.precip_last_hour_mm)!=null&&t.push({value:`${e.precip_last_hour_mm} mm`,label:"precip · 1h"}),b(e.precip_last_6h_mm)!=null&&t.push({value:`${e.precip_last_6h_mm} mm`,label:"precip · 6h"}),t.length?{id:"fsm-nws-obs",stone:"touchstone",tier:"empirical",variant:"scalars",source:"NWS",agency:`NWS ASOS station ${A(e.station_id)??"?"}`,vintage:((r=A(e.obs_time))==null?void 0:r.slice(0,10))??V,title:"Recent precipitation",scalars:t,sub:`Nearest hourly METAR: ${A(e.station_name)??"?"} (${b(e.distance_km)??"?"} km).`,docId:"nws_obs",citeId:"nws_obs",mapLayer:"nws"}:null}function bn(n){var r;const e=q(n.noaa_tides);if(!e||e.error||b(e.observed_ft_mllw)==null)return null;const t=[{value:`${e.observed_ft_mllw} ft`,label:"observed (MLLW)"}];return b(e.predicted_ft_mllw)!=null&&t.push({value:`${e.predicted_ft_mllw} ft`,label:"predicted"}),b(e.residual_ft)!=null&&t.push({value:`${e.residual_ft} ft`,label:"residual"}),{id:"fsm-noaa",stone:"touchstone",tier:"empirical",variant:"scalars",source:"NOAA CO-OPS",agency:`NOAA tide gauge ${A(e.station_name)??A(e.station_id)??"?"}`,vintage:((r=A(e.obs_time))==null?void 0:r.slice(0,10))??V,title:"Live water level (nearest tide gauge)",scalars:t,sub:"Residual = observed − astronomical tide; positive residual is wind / surge component.",docId:"noaa_tides",citeId:"noaa_tides",mapLayer:"noaa"}}function wn(n){var t;const e=q(n.prithvi_live);return e!=null&&e.ok?{id:"fsm-prithvi-live",stone:"touchstone",tier:"modeled",variant:"raster-pred",source:"Prithvi-NYC v2",agency:"msradam/Prithvi-EO-2.0-NYC-Pluvial · v2 fine-tune",vintage:((t=A(e.item_datetime))==null?void 0:t.slice(0,10))??V,title:"Live Sentinel-2 pluvial flood prediction",rasterKind:"prithvi",headline:`${b(e.pct_water_within_500m)??0}%`,subhead:`water within 500 m · cloud ${b(e.cloud_cover)??"?"}%`,sub:"Test flood IoU 0.5979 on held-out NYC chips. Model interpretation, not a measurement.",illustrative:!0,docId:"prithvi_live",citeId:"prithvi_live",mapLayer:"prithvi"}:null}function xn(n){const e=q(n.terramind_lulc);return e!=null&&e.ok?{id:"fsm-tm-lulc",stone:"touchstone",tier:"modeled",variant:"raster-pred",source:"TerraMind-NYC",agency:"msradam/TerraMind-NYC-Adapters · LULC LoRA",vintage:"2026",title:"Land-cover (current Sentinel-2 chip)",rasterKind:"lulc",headline:A(e.dominant_class)??"dominant class",subhead:`${b(e.dominant_pct)??0}% of chip`,sub:"Test mIoU 0.5866 on held-out NYC chips.",illustrative:!0,docId:"tm_lulc",citeId:"tm_lulc",mapLayer:"lulc"}:null}function kn(n){const e=q(n.ttm_forecast);if(!(e!=null&&e.available)||!e.interesting)return null;const t=b(e.forecast_peak_ft),r=b(e.forecast_peak_minutes_ahead);return t==null||r==null?null:{id:"fsm-ttm-fc",stone:"lodestone",tier:"modeled",variant:"timeseries",source:"Granite TTM r2",agency:"IBM Granite TimeSeries TTM r2 · zero-shot Battery surge",vintage:V,title:"Surge nowcast at the Battery — 9.6 h horizon",timeseries:{hours:96,peak:{x:38,y:47},peakLabel:`${t} ft @ +${Math.round(r/60)}h`},headline:`${t} ft`,subhead:"peak surge residual",sub:"Zero-shot 6-min cadence. Distinct from the fine-tuned Battery surge nowcast.",spatialNote:"regional · Battery, not point-of-query",docId:"ttm_forecast",citeId:"ttm_forecast"}}function Sn(n){const e=q(n.ttm_battery_surge);if(!(e!=null&&e.available)||!e.interesting)return null;const t=b(e.forecast_peak_m),r=b(e.forecast_peak_hours_ahead);return t==null||r==null?null:{id:"fsm-ttm-batt",stone:"lodestone",tier:"modeled",variant:"timeseries",source:"Granite TTM r2 · NYC fine-tune",agency:"msradam/Granite-TTM-r2-Battery-Surge · 96 h horizon",vintage:V,title:"Battery storm-surge nowcast (96 h)",timeseries:{hours:96,peak:{x:r,y:Math.round(t*100)},peakLabel:`${(t*100).toFixed(0)} cm @ +${r}h`},headline:`${(t*100).toFixed(0)} cm`,subhead:`peak surge · +${r}h ahead`,sub:"Test MAE 0.1091 m, −41% vs persistence. Hourly cadence; applies city-wide via NOAA station 8518750.",spatialNote:"regional · The Battery, not point-of-query",docId:"ttm_battery",citeId:"ttm_battery"}}function $n(n){const e=q(n.nws_alerts);if(!e)return null;const t=b(e.n_active)??0;if(t<=0)return null;const r=Array.isArray(e.alerts)?e.alerts:[];return{id:"fsm-nws-alerts",stone:"lodestone",tier:"modeled",variant:"tabular",source:"NWS",agency:"NWS Public Alerts API · flood-relevant filter",vintage:V,title:`${t} active flood-relevant alert${t===1?"":"s"}`,columns:["event","severity","expires"],rows:r.slice(0,4).map(s=>[A(s.event)??"?",A(s.severity)??"?",(A(s.expires)??"").slice(0,16)]),sub:"Live NWS feed. If a FLOOD or FLASH FLOOD WARNING is in this list, foreground it.",docId:"nws_alerts",citeId:"nws_alerts"}}function Nn(n,e){var _,m,l;const t=n.mellea,r=((_=t==null?void 0:t.passed)==null?void 0:_.length)??0,s=((m=t==null?void 0:t.failed)==null?void 0:m.length)??0,u=r+s,o=(t==null?void 0:t.attempts)??0;return{id:"fsm-capstone-meta",stone:"capstone",tier:"modeled",variant:"meta",source:"Mellea",agency:"Capstone synthesis · Granite 4.1 + Mellea grounding check",vintage:V,title:"Briefing reconciliation",metaRows:[{k:"Mellea reroll",v:`${o} attempt${o===1?"":"s"}`},{k:"Grounding checks",v:`${r} / ${u||4} passed`},{k:"Citations resolved",v:`${((l=n.citations)==null?void 0:l.length)??0}`},{k:"Wall-clock",v:e!=null?`${e.toFixed(1)} s`:"—"}],sub:"Capstone produces prose, not cards. This meta-card summarises the reconciler chain that wrote the briefing above.",docId:"capstone"}}function et(n,e,t,r=!0){const s=n??{},u=q(s.geocode);return{cards:[dn(s,u),un(s),pn(s),mn(s),_n(s),fn(s),hn(s),vn(s),yn(s),gn(s),bn(s),wn(s),xn(s),$n(s),kn(s),Sn(s),r?Nn(n??{},t):null].filter(_=>_!=null),stones:cn(e),wallSeconds:t}}function An(n,e,t,r){const u={sandy_inundation:"sandy",dep_stormwater:"dep",floodnet:"floodnet",nyc311:"nyc311",noaa_tides:"noaa_tides",nws_alerts:"nws_alerts",nws_obs:"nws_obs",ttm_forecast:"ttm_forecast",ttm_311_forecast:"ttm_311_forecast",ttm_battery_surge:"ttm_battery_surge",floodnet_forecast:"floodnet_forecast",ida_hwm_2021:"ida_hwm",prithvi_eo_v2:"prithvi_water",prithvi_eo_live:"prithvi_live",microtopo_lidar:"microtopo",mta_entrance_exposure:"mta_entrances",nycha_development_exposure:"nycha_developments",doe_school_exposure:"doe_schools",doh_hospital_exposure:"doh_hospitals",terramind_synthesis:"terramind",terramind_lulc:"terramind_lulc",terramind_buildings:"terramind_buildings",eo_chip_fetch:"eo_chip",geocode:"geocode"}[e];if(!u)return[];if(e==="sandy_inundation"){const o=t;n[u]=r&&(o==null?void 0:o.inside)===!0?!0:r?!1:null}else if(e==="dep_stormwater"){const o=t??{},_={};for(const[m,l]of Object.entries(o)){const c=typeof l=="string"?l:"";c&&(_[m]={depth_class:1,depth_label:c})}n[u]=Object.keys(_).length?_:null}else r&&t!=null?n[u]=t:n[u]=null;return[u]}const be={subway:"MTA · USGS · FEMA · NYC OEM · NYC DEP",nycha:"NYC HA · USGS · NYC OEM · NYC DEP",school:"NYC DOE · USGS · NYC OEM · NYC DEP",hospital:"NYS DOH · USGS · NYC OEM · NYC DEP"},we={subway:"subway entrances",nycha:"NYCHA developments",school:"public schools",hospital:"hospitals"};function xe(n){return!n||!Number.isFinite(n)?"—":`${Math.round(n)}m`}function ke(n){return n==null||!Number.isFinite(n)?"—":`${(n*3.28084).toFixed(1)} ft`}function Se(n,e){return typeof e=="number"?e>=.5?`Inundated 2012 (${Math.round(e*100)}%)`:e>0?`Edge (${Math.round(e*100)}%)`:"—":n?"Inundated 2012":"—"}function $e(n,e,t){return typeof t=="number"?t>=.5?`≥${Math.round(t*100)}% in scenario`:t>0?`${Math.round(t*100)}% edge`:"minimal":n&&n.length?n:e&&e>0?`class ${e}`:"minimal"}function Tn(n){return n?/elevator|easement|stair.*ramp/i.test(n):!1}function In(n){if(!n.available)return null;const t=(n.entrances??[]).map(r=>{const s=Tn(r.entrance_type);return{name:`${r.station_name??"?"}${r.daytime_routes?` (${String(r.daytime_routes).split(/\s+/).slice(0,3).join("/")})`:""}`,elev:ke(r.elev_m),ada:s,fema:"Zone X",sandy:Se(r.inside_sandy_2012),dep:$e(r.dep_extreme_2080_label,r.dep_extreme_2080_class),asset:"subway",primaryTier:r.inside_sandy_2012?"empirical":"modeled"}});return{type:we.subway,radius:xe(n.radius_m),count:n.n_entrances??t.length,rows:t,sourceLabel:be.subway}}function Cn(n){if(!n.available)return null;const t=(n.developments??[]).map(r=>{const s=r.pct_inside_sandy_2012,u=r.pct_in_dep_extreme_2080;return{name:`${r.development??"?"}${r.borough?` · ${r.borough}`:""}`,elev:ke(r.rep_elevation_m),ada:!1,fema:"—",sandy:Se(void 0,s),dep:$e(void 0,void 0,u),asset:"nycha",primaryTier:s&&s>0?"empirical":"modeled"}});return{type:we.nycha,radius:xe(n.radius_m),count:n.n_developments??t.length,rows:t,sourceLabel:be.nycha}}function Mn(n){if(!n.available)return null;const t=(n.schools??[]).map(r=>({name:`${r.school_name??r.name??"?"}${r.borough?` · ${r.borough}`:""}`,elev:ke(r.elev_m),ada:!1,fema:"—",sandy:Se(r.inside_sandy_2012),dep:$e(r.dep_extreme_2080_label,r.dep_extreme_2080_class),asset:"school",primaryTier:r.inside_sandy_2012?"empirical":"modeled"}));return{type:we.school,radius:xe(n.radius_m),count:n.n_schools??t.length,rows:t,sourceLabel:be.school}}function qn(n){if(!n.available)return null;const t=(n.hospitals??[]).map(r=>({name:`${r.facility_name??r.name??"?"}${r.borough?` · ${r.borough}`:""}`,elev:ke(r.elev_m),ada:!0,fema:"—",sandy:Se(r.inside_sandy_2012),dep:$e(r.dep_extreme_2080_label,r.dep_extreme_2080_class),asset:"hospital",primaryTier:r.inside_sandy_2012?"empirical":"modeled"}));return{type:we.hospital,radius:xe(n.radius_m),count:n.n_hospitals??t.length,rows:t,sourceLabel:be.hospital}}function Fn(n){if(!n)return[];const e=[],t=In(n.mta_entrances??{});t&&t.rows.length&&e.push(t);const r=Cn(n.nycha_developments??{});r&&r.rows.length&&e.push(r);const s=Mn(n.doe_schools??{});s&&s.rows.length&&e.push(s);const u=qn(n.doh_hospitals??{});return u&&u.rows.length&&e.push(u),e}function En(n,e){const t=`/api/agent/stream?q=${encodeURIComponent(n)}`,r=new EventSource(t);let s="",u;const o=/([.?!])(\s|$)/;function _(l=!1){var v,L;let c;for(;c=o.exec(s);){const R=c.index+c[1].length+(c[2]?c[2].length:0),j=s.slice(0,R).trim();s=s.slice(R),j&&((v=e.onSentence)==null||v.call(e,j,u))}l&&s.trim()&&((L=e.onSentence)==null||L.call(e,s.trim(),u),s="")}function m(l,c){r.addEventListener(l,v=>{try{c(JSON.parse(v.data))}catch{}})}return m("hello",l=>{var c;return(c=e.onHello)==null?void 0:c.call(e,l.query)}),m("plan_token",l=>{var c;return(c=e.onPlanToken)==null?void 0:c.call(e,l.delta)}),m("plan",l=>{var c;return(c=e.onPlan)==null?void 0:c.call(e,l)}),m("step",l=>{var c;return(c=e.onStep)==null?void 0:c.call(e,l)}),m("token",l=>{var c,v;l.attempt!==u&&(u=l.attempt,s="",(c=e.onAttemptStart)==null||c.call(e,l.attempt??1)),(v=e.onToken)==null||v.call(e,l.delta,l.attempt),s+=l.delta,_(!1)}),m("mellea_attempt",l=>{var c;return(c=e.onMelleaAttempt)==null?void 0:c.call(e,l)}),m("final",l=>{var c;_(!0),(c=e.onFinal)==null||c.call(e,l)}),m("error",l=>{var c;return(c=e.onError)==null?void 0:c.call(e,l.err)}),r.addEventListener("done",()=>{var l;_(!0),(l=e.onDone)==null||l.call(e),r.close()}),r.addEventListener("error",()=>{var l;_(!0),(l=e.onError)==null||l.call(e,"SSE connection error"),r.close()}),{close:()=>r.close()}}const ut=[{key:"status",label:"Status",n:"01",aliases:["status"]},{key:"empirical",label:"Empirical evidence",n:"02",tier:"empirical",aliases:["empirical evidence","empirical"]},{key:"modeled",label:"Modeled scenarios",n:"03",tier:"modeled",aliases:["modeled scenarios","modeled"]},{key:"policy",label:"Policy context",n:"04",aliases:["policy context","policy"]}];function tt(n){const e=n.toLowerCase().replace(/[.:]+\s*$/,"").trim();return ut.find(t=>t.aliases.includes(e))}const nt=/(^|\n)\s*(?:\*\*([A-Z][A-Za-z\s/]+?)\.\s*\*\*|#{1,3}\s*(0[1-4])\s*[:\-—.]?\s*([^\n]+))/g;function pt(n,e,t){return{id:e,n,tier:lt(e),source:(t==null?void 0:t.source)??e.split(/[_-]/)[0].toUpperCase(),title:(t==null?void 0:t.title)??e,docId:e,url:(t==null?void 0:t.url)??"",vintage:(t==null?void 0:t.vintage)??"",retrieved:(t==null?void 0:t.retrieved)??""}}const Ln=/\[([a-z][a-z0-9_]*(?:\s*,\s*[a-z][a-z0-9_]*)*)\]/gi;function rt(n){return n.split(new RegExp("(?<=[.!?])\\s+(?=[A-Z(])","g")).filter(t=>t.trim().length>0)}function it(n,e,t){let r=0;const s=[],u=[...n.matchAll(Ln)];if(u.length===0)return[{text:n}];for(const o of u){const _=n.slice(r,o.index??0),m=o[1].split(/\s*,\s*/).filter(Boolean);r=(o.index??0)+o[0].length;const l=lt(m[0]);s.push({text:_,tier:l,cite:m[0]});for(const c of m)e[c]||(e[c]=t(c))}if(r<n.length){const o=n.slice(r);o.trim()&&s.push({text:o})}return s}function jn(n,e={}){const t={...e};let r=Object.values(t).reduce((l,c)=>Math.max(l,c.n),0)+1;const s=new Set,u=l=>(e[l]||s.add(l),pt(r++,l)),o=[],_=[];let m;for(nt.lastIndex=0;m=nt.exec(n);)if(m[2]!==void 0){const l=tt(m[2]);if(!l)continue;_.push({num:l.n,label:l.label,tier:l.tier,start:m.index+m[1].length,bodyStart:m.index+m[0].length})}else if(m[3]!==void 0){const l=m[3],c=(m[4]??"").trim(),v=ut.find(L=>L.n===l)??tt(c);_.push({num:l,label:(v==null?void 0:v.label)??c,tier:v==null?void 0:v.tier,titleExtra:v&&c.toLowerCase()!==v.label.toLowerCase()?c:void 0,start:m.index+m[1].length,bodyStart:m.index+m[0].length})}for(let l=0;l<_.length;l++){const c=_[l],v=_[l+1],L=n.slice(c.bodyStart,v?v.start:n.length).trim();if(L){o.push({kind:"head",n:c.num,label:c.label,tier:c.tier,title:c.titleExtra});for(const R of L.split(/\n\s*\n/)){const j=R.replace(/\s+/g," ").trim();if(!j)continue;const G=rt(j),F=[];for(const P of G)F.push(...it(P,t,u)),F.push({text:" "});for(;F.length&&F[F.length-1].text.trim()===""&&!F[F.length-1].tier;)F.pop();F.length&&o.push({kind:"prose",parts:F})}}}if(o.length===0&&n.trim()){o.push({kind:"head",n:"01",label:"Status"});const l=n.replace(/\s+/g," ").trim(),c=rt(l),v=[];for(const L of c)v.push(...it(L,t,u)),v.push({text:" "});for(;v.length&&v[v.length-1].text.trim()===""&&!v[v.length-1].tier;)v.pop();v.length&&o.push({kind:"prose",parts:v})}return{blocks:o,citations:t,unresolvedDocIds:[...s]}}const oe={type:"FeatureCollection",features:[]};async function le(n){try{const e=await fetch(n);if(!e.ok)return oe;const t=await e.json();return!t||t.type!=="FeatureCollection"?oe:t}catch{return oe}}async function On(n,e,t=1500){return le(`/api/layers/sandy?lat=${n}&lon=${e}&r=${t}`)}async function Pn(n,e,t=1500){return le(`/api/layers/dep_extreme_2080?lat=${n}&lon=${e}&r=${t}`)}async function at(n,e,t=1500){return le(`/api/layers/prithvi_water?lat=${n}&lon=${e}&r=${t}`)}async function Dn(n){return le(`/api/layers/sandy_clipped?code=${encodeURIComponent(n)}`)}async function zn(n,e="dep_extreme_2080"){return le(`/api/layers/dep_clipped?code=${encodeURIComponent(n)}&scenario=${e}`)}async function st(n,e,t=1500){try{const r=await fetch(`/api/floodnet_near?lat=${n}&lon=${e}&r=${t}`);return r.ok?{type:"FeatureCollection",features:(await r.json()).features.map(o=>{const _=o.properties??{};return{...o,properties:{..._,count:typeof _.n_events_3y=="number"?_.n_events_3y:1}}})}:oe}catch{return oe}}var Yn=E('<span class="region-head-meta svelte-1q8jizq"> <!></span>'),Rn=E('<span class="region-head-meta svelte-1q8jizq">planning…</span>'),Bn=E('<div class="reroll-prev svelte-1q8jizq" aria-hidden="true"><p class="reroll-prev-line svelte-1q8jizq"> </p></div>'),Hn=E("<!> <!>",1),Gn=E('<span class="streaming-caret svelte-1q8jizq" aria-hidden="true">▍</span>'),Un=E("<!> <!>",1),Wn=E('<details class="plan-details svelte-1q8jizq"><summary class="svelte-1q8jizq"> </summary> <pre class="plan-stream svelte-1q8jizq"> </pre></details>'),Kn=E('<div class="generating-status svelte-1q8jizq" aria-live="polite"><span class="pulse svelte-1q8jizq"></span> Planning intent… <!></div>'),Zn=E('<div class="generating-status svelte-1q8jizq" aria-live="polite"><span class="pulse svelte-1q8jizq"></span> Resolving address…</div>'),Jn=E("<!> <!>",1),Vn=E('<span class="region-head-meta svelte-1q8jizq"> </span>'),Xn=E('<span class="region-head-meta svelte-1q8jizq">awaiting geocode…</span>'),Qn=E('<div style="position: relative; flex: 1; min-height: 0;" class="svelte-1q8jizq"><!> <!></div>'),er=E('<section class="hero-band svelte-1q8jizq"><div class="hero-band-inner svelte-1q8jizq"><div class="app-shell-top is-desktop svelte-1q8jizq"><main id="region-briefing" class="app-region app-region-brief svelte-1q8jizq" aria-labelledby="brief-h1"><header class="region-head svelte-1q8jizq"><span class="section-label svelte-1q8jizq">Briefing</span> <!></header> <h1 id="brief-h1" class="brief-h1 svelte-1q8jizq">Flood-exposure briefing <span class="brief-h1-addr svelte-1q8jizq"> </span></h1> <!></main> <div class="app-region-side svelte-1q8jizq" style="grid-area: side;"><aside id="region-map" class="app-region app-region-map svelte-1q8jizq" aria-label="Map region"><header class="region-head svelte-1q8jizq"><span class="section-label svelte-1q8jizq">Map</span> <!></header> <!></aside> <aside id="region-cites" class="app-region app-region-cites svelte-1q8jizq" aria-label="Citations"><!></aside></div></div> <div class="app-shell-bottom svelte-1q8jizq"><section class="app-region app-region-findings svelte-1q8jizq" aria-label="Findings"><!></section></div></div></section>');function ur(n,e){jt(e,!0);let t=te(()=>Dt.params.queryId??""),r=te(()=>()=>{try{return decodeURIComponent(a(t))}catch{return a(t)}}),s=S(null),u=S(""),o=S(""),_=S(null),m=S(!1),l=S(0),c=2,v=S(!1),L=S(!1),R=S(""),j=S(null),G=S(ee([])),F=te(()=>{var d,i,f,p;return{empirical:((d=a(pe))==null?void 0:d.features.length)??0,modeled:((i=a(me))==null?void 0:i.features.length)??0,synthetic:((f=a(_e))==null?void 0:f.features.length)??0,proxy:((p=a(fe))==null?void 0:p.features.length)??0}}),P=S(ee({id:"root",name:"briefing.run",status:"ok",ms:0,tier:null,children:[]})),ne=S(null),Ne="comfortable",Ae="smart",ce=S(!1);Oe(()=>{typeof window<"u"&&h(ce,new URL(window.location.href).searchParams.get("grammar")==="1")});let U=S(null),O=S(void 0),X=ee({}),re=S(0),de=te(()=>{if(a(re),a(_)){const d={...X,...a(_)};return et(d,a(P),a(O),!0)}return et(X,a(P),a(O),!1)});function mt(d){h(ne,d,!0)}function _t(d){const i=document.getElementById("region-cites");i&&i.scrollIntoView({behavior:"smooth",block:"start"})}const Ye=new Set(["ttm_forecast","ttm_311_forecast","floodnet_forecast"]),Te="group-ttm-r2";function ft(d,i,f,p){if(p==="error")return f??void 0;if(p==="silent")return f??"no data";if(i==null||typeof i!="object")return;const T=i,y={sandy_inundation:["inside"],dep_stormwater:["dep_extreme_2080","dep_moderate_2050"],floodnet:["n_sensors","n_events_3y"],nyc311:["n"],noaa_tides:["observed_ft_mllw","residual_ft","station"],nws_alerts:["n_active"],nws_obs:["p1h_mm","p6h_mm","station"],ttm_forecast:["forecast_peak_ft","forecast_peak_min_ahead"],ttm_311_forecast:["forecast_mean","forecast_peak","accelerating"],ida_hwm_2021:["n_within_800m","max_height_above_gnd_ft"],prithvi_eo_v2:["inside_water_polygon","nearest_distance_m"],prithvi_eo_live:["scene_date","pct_water_500m"],microtopo_lidar:["elev_m","pct_200m","relief_m"],mta_entrance_exposure:["n_entrances","n_inside_sandy_2012","n_in_dep_extreme_2080"],nycha_development_exposure:["n_developments","n_majority_inside_sandy_2012"],doe_school_exposure:["n_schools","n_inside_sandy_2012"],doh_hospital_exposure:["n_hospitals","n_inside_sandy_2012"],floodnet_forecast:["sensor_id","distance_m","forecast_28d","accelerating"],terramind_synthesis:["tim_chain","dem_mean_m"],rag_granite_embedding:["hits"],gliner_extract:["sources"]}[d],C=[];if(y){for(const I of y)if(T[I]!==void 0&&C.push(Be(I,T[I])),C.length>=3)break}else for(const[I,g]of Object.entries(T))if(g!==null&&typeof g!="object"&&(C.push(Be(I,g)),C.length>=2))break;return C.join(" · ")||void 0}function ht(d){const i=[],f=d.mta_entrances;if(f&&Array.isArray(f.entrances))for(const y of f.entrances){const C=Number(y.entrance_lat),I=Number(y.entrance_lon);!Number.isFinite(C)||!Number.isFinite(I)||i.push({type:"Feature",geometry:{type:"Point",coordinates:[I,C]},properties:{kind:"subway",name:`${y.station_name??"?"} (${y.daytime_routes??"?"})`,doc_id:`mta_entrance_${y.station_id??""}`,inside_sandy_2012:y.inside_sandy_2012===!0}})}const p=d.doe_schools;if(p&&Array.isArray(p.schools))for(const y of p.schools){const C=Number(y.school_lat),I=Number(y.school_lon);!Number.isFinite(C)||!Number.isFinite(I)||i.push({type:"Feature",geometry:{type:"Point",coordinates:[I,C]},properties:{kind:"school",name:String(y.loc_name??y.school_name??"?"),doc_id:`doe_school_${y.loc_code??""}`,inside_sandy_2012:y.inside_sandy_2012===!0}})}const T=d.nycha_developments;if(T&&Array.isArray(T.developments))for(const y of T.developments){const C=Number(y.centroid_lat),I=Number(y.centroid_lon);if(!Number.isFinite(C)||!Number.isFinite(I))continue;const g=Number(y.pct_inside_sandy_2012??0);i.push({type:"Feature",geometry:{type:"Point",coordinates:[I,C]},properties:{kind:"nycha",name:String(y.development??"?"),doc_id:`nycha_dev_${y.tds_num??""}`,inside_sandy_2012:g>=50,pct_inside_sandy:g}})}const k=d.doh_hospitals;if(k&&Array.isArray(k.hospitals))for(const y of k.hospitals){const C=Number(y.hospital_lat),I=Number(y.hospital_lon);!Number.isFinite(C)||!Number.isFinite(I)||i.push({type:"Feature",geometry:{type:"Point",coordinates:[I,C]},properties:{kind:"hospital",name:String(y.facility_name??"?"),doc_id:`nyc_hospital_${y.fac_id??""}`,inside_sandy_2012:y.inside_sandy_2012===!0}})}return{type:"FeatureCollection",features:i}}function vt(d){return{type:"FeatureCollection",features:[]}}function Re(d){return 1+(d.children??[]).reduce((f,p)=>f+Re(p),0)}function Be(d,i){if(typeof i=="number"){const f=Number.isInteger(i)?`${i}`:i.toFixed(2);return`${d}=${f}`}if(typeof i=="boolean")return`${d}=${i}`;if(typeof i=="string"){const f=i.length>24?i.slice(0,22)+"…":i;return`${d}=${f}`}return d}let ie=S(ee({empirical:!0,modeled:!0,synthetic:!0,proxy:!0})),K=S(null),ue=S(null),He=S(void 0),Ge=S(void 0),pe=S(void 0),me=S(void 0),_e=S(void 0),fe=S(void 0),Q=S(ee([])),ae=S(ee({})),he=[];function yt(){var T;if(!a(o)){h(Q,[],!0),h(ae,{},!0),he=[];return}const d={};(T=a(_))!=null&&T.citations&&a(_).citations.forEach((k,y)=>{d[k.doc_id]=pt(y+1,k.doc_id,{source:k.source,title:k.title,url:k.url,vintage:k.vintage})});const i=jn(a(o),d),f={};let p=1;for(const k of he){const y=i.citations[k];y&&(f[k]={...y,n:p++})}for(const[k,y]of Object.entries(i.citations))f[k]||(f[k]={...y,n:p++},he.push(k));h(Q,i.blocks,!0),h(ae,f,!0)}Oe(()=>{a(o),a(_),yt()}),Oe(()=>{if(!a(K))return;const{lat:d,lon:i,source:f}=a(K);f==="nta"&&a(ue)?(Dn(a(ue)).then(p=>h(pe,p,!0)),zn(a(ue)).then(p=>h(me,p,!0)),at(d,i,2500).then(p=>h(_e,p,!0)),st(d,i,3e3).then(p=>h(fe,p,!0))):(On(d,i).then(p=>h(pe,p,!0)),Pn(d,i).then(p=>h(me,p,!0)),at(d,i).then(p=>h(_e,p,!0)),st(d,i).then(p=>h(fe,p,!0)))}),Ot(()=>{if(Qe.reset(),!a(r)())return;h(U,Date.now(),!0);const d=En(a(r)(),{onPlanToken:i=>h(u,a(u)+i),onPlan:i=>h(s,i,!0),onStep:i=>{if(An(X,i.step,i.result,i.ok),h(re,a(re)+1),i.step==="geocode")if(i.ok&&i.result&&typeof i.result=="object"){const g=i.result;if(typeof g.lat=="number"&&typeof g.lon=="number"){const N=typeof g.address=="string"?g.address:a(r)();h(K,{label:N,lat:g.lat,lon:g.lon,source:"geocode"},!0),h(L,!0)}}else h(j,"geocoder");if(i.step==="nta_resolve"&&i.ok&&i.result&&typeof i.result=="object"){const g=i.result,N=Array.isArray(g.bbox)?g.bbox:null,D=typeof g.nta_code=="string"?g.nta_code:null;if(N&&N.length===4&&D){h(ue,D,!0);const Z=(N[0]+N[2])/2,z=(N[1]+N[3])/2,B=typeof g.nta_name=="string"?g.nta_name:a(r)();h(K,{label:B,lat:z,lon:Z,source:"nta"},!0)}}const f=zt(i.step),p=i.ok?i.result==null&&i.err==null?"silent":"ok":"error",T=Math.round((i.elapsed_s??0)*1e3),k=i.result!=null?i.result:i.err??null,y=ft(i.step,i.result,i.err,p),C={id:`step-${Re(a(P))}`,name:i.step,status:p,ms:T,tier:f,note:y,output:k,error:p==="error"?i.err??"unknown error":void 0,model:Ye.has(i.step)?"granite-timeseries-ttm-r2":void 0},I={...a(P),ms:(a(P).ms??0)+T};if(Ye.has(i.step)){const g=[...I.children??[]];let N=g.find(z=>z.id===Te);N||(N={id:Te,name:"forecasting.granite-timeseries-ttm-r2",status:"fan",ms:0,tier:"modeled",note:"1 instance",model:"granite-timeseries-ttm-r2",children:[]},g.push(N));const D=[...N.children??[],C],Z={...N,ms:(N.ms??0)+T,note:`${D.length} instance${D.length===1?"":"s"}`,children:D};h(P,{...I,children:g.map(z=>z.id===Te?Z:z)},!0)}else h(P,{...I,children:[...I.children??[],C]},!0)},onAttemptStart:i=>{h(l,i,!0),i>1&&(h(R,a(o),!0),h(o,""),he=[])},onToken:i=>{a(v)||(h(v,!0),a(l)===0&&h(l,1)),h(o,a(o)+i)},onMelleaAttempt:i=>{i.attempt>0&&h(l,i.attempt,!0)},onFinal:i=>{h(_,i,!0),i.paragraph&&h(o,i.paragraph,!0),h(G,Fn(i),!0),h(He,ht(i),!0),h(Ge,vt(),!0);const p=i.mellea;p&&p.failed&&p.failed.length>0&&p.attempts&&p.attempts>=c&&h(j,"grounding")},onError:i=>{const f=i.toLowerCase();(f.includes("connection")||f.includes("502")||f.includes("503")||f.includes("timeout")||f.includes("routing"))&&h(j,"backend")},onDone:()=>{var i,f,p,T,k;h(m,!0),a(U)!=null&&h(O,(Date.now()-a(U))/1e3),!a(v)&&!a(j)&&a(L)&&h(j,"all-silent"),!a(j)&&a(Q).length>0&&(Kt({queryId:a(t),queryText:a(r)(),intent:((i=a(s))==null?void 0:i.intent)??null,specialists:((p=(f=a(s))==null?void 0:f.specialists)==null?void 0:p.length)??0,blocks:a(Q),citations:a(ae),generatedAt:new Date().toISOString(),attempts:((k=(T=a(_))==null?void 0:T.mellea)==null?void 0:k.attempts)??a(l)}),Qe.markReady())}});return()=>d.close()});var Ie=er(),Ue=x(Ie),Ce=x(Ue),Me=x(Ce),qe=x(Me),gt=$(x(qe),2);{var bt=d=>{var i=Yn(),f=x(i),p=$(f);{var T=k=>{var y=Lt("· ✓ done");M(k,y)};H(p,k=>{a(m)&&k(T)})}w(i),W(()=>{var k;return Y(f,`intent: ${a(s).intent??""} · ${((k=a(s).specialists)==null?void 0:k.length)??0??""} specialists · attempt ${a(l)??""} `)}),M(d,i)},wt=d=>{var i=Rn();M(d,i)};H(gt,d=>{a(s)?d(bt):d(wt,-1)})}w(qe);var Fe=$(qe,2),We=$(x(Fe)),xt=x(We,!0);w(We),w(Fe);var kt=$(Fe,2);{var St=d=>{sn(d,{get state(){return a(j)}})},$t=d=>{var i=Jn(),f=ge(i);{var p=g=>{var N=Hn(),D=ge(N);tn(D,{get attempt(){return a(l)},max:c});var Z=$(D,2);{var z=B=>{var J=Bn(),ve=x(J),ye=x(ve);w(ve),w(J),W(je=>Y(ye,`${je??""}…`),[()=>a(R).slice(0,360)]),M(B,J)};H(Z,B=>{a(R)&&B(z)})}M(g,N)};H(f,g=>{a(l)>1&&g(p)})}var T=$(f,2);{var k=g=>{var N=Un(),D=ge(N);Yt(D,{get blocks(){return a(Q)},get citations(){return a(ae)},streaming:!1});var Z=$(D,2);{var z=B=>{var J=Gn();M(B,J)};H(Z,B=>{a(m)||B(z)})}M(g,N)},y=g=>{Qt(g)},C=g=>{var N=Kn(),D=$(x(N),2);{var Z=z=>{var B=Wn(),J=x(B),ve=x(J);w(J);var ye=$(J,2),je=x(ye,!0);w(ye),w(B),W(()=>{Y(ve,`Planner streaming (${a(u).length??""} chars)`),Y(je,a(u))}),M(z,B)};H(D,z=>{a(u)&&z(Z)})}w(N),M(g,N)},I=g=>{var N=Zn();M(g,N)};H(T,g=>{a(Q).length?g(k):a(L)&&!a(v)?g(y,1):a(s)?g(I,-1):g(C,2)})}M(d,i)};H(kt,d=>{a(j)?d(St):d($t,-1)})}w(Me);var Ke=$(Me,2),Ee=x(Ke),Le=x(Ee),Nt=$(x(Le),2);{var At=d=>{var i=Vn(),f=x(i);w(i),W((p,T)=>Y(f,`Carto Positron · z15 · ${p??""}°N ${T??""}°W`),[()=>a(K).lat.toFixed(4),()=>Math.abs(a(K).lon).toFixed(4)]),M(d,i)},Tt=d=>{var i=Xn();M(d,i)};H(Nt,d=>{a(K)?d(At):d(Tt,-1)})}w(Le);var It=$(Le,2);{var Ct=d=>{var i=Qn(),f=x(i);Ht(f,{get address(){return a(K)},get activeLayers(){return a(ie)},get sandyEmpirical(){return a(pe)},get depModeled(){return a(me)},get syntheticPrior(){return a(_e)},get proxy311(){return a(fe)},get registerPoints(){return a(He)},get registerPolygons(){return a(Ge)}});var p=$(f,2);Gt(p,{get active(){return a(ie)},get featureCounts(){return a(F)},onToggle:T=>h(ie,{...a(ie),[T]:!a(ie)[T]},!0)}),w(i),M(d,i)};H(It,d=>{a(K)&&d(Ct)})}w(Ee);var Ze=$(Ee,2),Mt=x(Ze);Rt(Mt,{get citations(){return a(ae)}}),w(Ze),w(Ke),w(Ce);var Je=$(Ce,2),Ve=x(Je),qt=x(Ve);Bt(qt,{get data(){return a(de)},density:Ne,provenanceMode:Ae,get showGrammar(){return a(ce)},get linkedKey(){return a(ne)},onLink:mt,onCite:_t}),w(Ve),w(Je),w(Ue),w(Ie),W(d=>Y(xt,d),[()=>a(r)()]),M(n,Ie),Pt()}export{ur as component,dr as universal};
|
|
|
|
|
|
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{d as ze,s as R,a as q,f as L,c as Ft,b as Lt,t as Et}from"../chunks/Dlpu43Tj.js";import{c as x,s as $,r as b,v as De,t as W,k as a,f as ye,J as ne,p as jt,j as k,L as te,K as Pe,l as v,G as Pt,a as Ot}from"../chunks/DwbuJhNu.js";import{p as Xe,i as H}from"../chunks/8F5LpR-T.js";import{p as zt}from"../chunks/B07kFGr7.js";import{T as ot,t as lt,a as Dt,B as Rt}from"../chunks/Cl16PtNL.js";import{f as Yt,C as Bt,F as Ht,R as Gt,M as Ut}from"../chunks/Bu5KOiaf.js";import"../chunks/DFFHaukH.js";import{b as se,e as ct,a as Oe,s as Wt,i as Kt}from"../chunks/CBcGqa-S.js";import{b as Qe,p as Jt}from"../chunks/DNaFzQeI.js";const Vt=!1,Zt=!1,pr=Object.freeze(Object.defineProperty({__proto__:null,prerender:Vt,ssr:Zt},Symbol.toStringTag,{value:"Module"}));ze(["click"]);ze(["click"]);var Xt=L('<div class="skeleton-section"><div class="skeleton-head"><span class="skeleton-num"> </span> <span class="skeleton-label"> </span> <span class="skeleton-spinner" aria-hidden="true">▍</span></div> <span class="skeleton-pulse"></span> <span class="skeleton-pulse"></span> <span class="skeleton-pulse"></span></div>'),Qt=L('<div class="skeleton-brief" role="status" aria-live="polite" aria-label="Loading briefing — geocode complete, dispatching specialists"><div class="skeleton-status"><span class="skeleton-pulse"></span> <span class="skeleton-pulse skeleton-pulse-meta"></span></div> <!></div>');function en(n){const e=[{n:"01",label:"Status"},{n:"02",label:"Empirical evidence"},{n:"03",label:"Modeled scenarios"},{n:"04",label:"Policy context"}];var t=Qt(),r=x(t),s=x(r);se(s,"",{},{width:"62%"});var d=$(s,2);se(d,"",{},{width:"40%"}),b(r);var o=$(r,2);ct(o,1,()=>e,p=>p.n,(p,m)=>{var l=Xt(),c=x(l),h=x(c),E=x(h,!0);b(h);var Y=$(h,2),j=x(Y,!0);b(Y),De(2),b(c);var G=$(c,2);se(G,"",{},{width:"92%"});var F=$(G,2);se(F,"",{},{width:"78%"});var O=$(F,2);se(O,"",{},{width:"85%"}),b(l),W(()=>{R(E,a(m).n),R(j,a(m).label)}),q(p,l)}),b(t),q(n,t)}var tn=L('<div class="reroll-banner" role="status" aria-live="polite"><!> <div class="reroll-body"><span class="reroll-head">Regenerating to satisfy citation grounding</span> <span class="reroll-sub"> </span></div> <span class="reroll-spinner" aria-hidden="true">↻</span></div>');function nn(n,e){let t=Xe(e,"attempt",3,2),r=Xe(e,"max",3,3);var s=tn(),d=x(s);ot(d,{tier:"modeled",size:11,color:"var(--tier-modeled)"});var o=$(d,2),p=$(x(o),2),m=x(p);b(p),b(o),De(2),b(s),W(()=>R(m,`Mellea reconciler · attempt ${t()??""} of ${r()??""} · previous draft dimmed below`)),q(n,s)}var rn=L("<a> </a>"),an=L('<button type="button"> </button>'),sn=L('<article role="alert" aria-live="assertive"><header class="error-card-head"><!> <span class="error-card-eyebrow"> </span></header> <h3 class="error-card-headline"> </h3> <p class="error-card-body"> </p> <div class="error-card-actions"></div> <footer class="error-card-foot"><span class="section-label">Trust signals · still on</span> <span class="error-card-foot-copy">All foundation models Apache-2.0 · No commercial APIs at runtime</span></footer></article>');function on(n,e){const t={geocoder:{eyebrow:"Address not resolved",headline:"We couldn't resolve that to a NYC address.",body:`Try a more specific street address — for example, "80 Pioneer Street, Brooklyn." Riprap covers the five boroughs only; international addresses, NJ addresses, and points outside NYC aren't supported.`,tier:"proxy",defaultActions:["Use a sample query","Edit query"]},"all-silent":{eyebrow:"Outside evidence coverage",headline:"No specialists found evidence at this point.",body:"The address resolved, but every flood-evidence specialist returned silent. This is rare and usually means parkland, water, or a point with no nearby 311, no FloodNet sensor, and no Sandy overlap. Try a nearby street address or expand to neighborhood-mode.",tier:"proxy",defaultActions:["Try nearby address","Switch to neighborhood-mode"]},grounding:{eyebrow:"Grounding failure",headline:"Briefing prose couldn't be composed within citation constraints.",body:"Mellea rejected all reroll attempts. The underlying evidence is fine — only the prose composition failed. Download the structured evidence below, or contact support.",tier:"modeled",defaultActions:["Download evidence (JSON)","Contact support","Try again"]},backend:{eyebrow:"Backend unavailable",headline:"All routing targets exhausted.",body:"LiteLLM tried Local Ollama → HF Space T4 → AMD MI300X and didn't reach a healthy backend. This usually clears within 5 minutes during a deploy window. The hardware-pill in the header is currently red.",tier:"proxy",defaultActions:["Retry now","Switch backend"]}};let r=ne(()=>t[e.state]),s=ne(()=>e.actions??a(r).defaultActions.map(G=>({label:G})));var d=sn(),o=x(d),p=x(o);ot(p,{get tier(){return a(r).tier},size:11,get color(){return`var(--tier-${a(r).tier??""})`}});var m=$(p,2),l=x(m,!0);b(m),b(o);var c=$(o,2),h=x(c,!0);b(c);var E=$(c,2),Y=x(E,!0);b(E);var j=$(E,2);ct(j,21,()=>a(s),Kt,(G,F,O)=>{var Q=Ft(),Ne=ye(Q);{var Ae=U=>{var P=rn();Oe(P,1,"error-card-action",null,{},{"is-primary":O===0});var X=x(P,!0);b(P),W(()=>{Wt(P,"href",a(F).href),R(X,a(F).label)}),q(U,P)},ce=U=>{var P=an();Oe(P,1,"error-card-action",null,{},{"is-primary":O===0});var X=x(P,!0);b(P),W(()=>R(X,a(F).label)),Lt("click",P,function(...re){var de;(de=a(F).onClick)==null||de.apply(this,re)}),q(U,P)};H(Ne,U=>{a(F).href?U(Ae):U(ce,-1)})}q(G,Q)}),b(j),De(2),b(d),W(()=>{Oe(d,1,`error-card error-card-${e.state??""}`),R(l,e.eyebrowOverride??a(r).eyebrow),R(h,e.headlineOverride??a(r).headline),R(Y,e.bodyOverride??a(r).body)}),q(n,d)}ze(["click"]);const Z="2026-05";function ln(n){return n==="fan"||n==="merge"?"fired":n==="silent"?"silent_by_design":n==="error"?"errored":"fired"}function dt(n){return[n,...(n.children??[]).flatMap(dt)]}function cn(n){const e=n.toLowerCase();return e==="sandy_inundation"||e==="sandy"||e==="dep_stormwater"||e==="dep"||e==="ida_hwm_2021"||e==="ida_hwm"||e==="prithvi_eo_v2"||e==="prithvi_water"||e==="microtopo_lidar"||e==="microtopo"?"cornerstone":e==="mta_entrance_exposure"||e==="mta_entrances"||e==="nycha_development_exposure"||e==="nycha_developments"||e==="doe_school_exposure"||e==="doe_schools"||e==="doh_hospital_exposure"||e==="doh_hospitals"||e==="terramind_synthesis"||e==="terramind"||e==="terramind_buildings"||e==="eo_chip_fetch"?"keystone":e==="floodnet"||e==="nyc311"||e==="nws_obs"||e==="noaa_tides"||e==="prithvi_eo_live"||e==="prithvi_live"||e==="terramind_lulc"?"touchstone":e==="nws_alerts"||e==="ttm_forecast"||e==="ttm_311_forecast"||e==="floodnet_forecast"||e==="ttm_battery_surge"?"lodestone":e.startsWith("reconcile")||e.startsWith("mellea")||e==="rag_granite_embedding"||e==="gliner_extract"?"capstone":null}function dn(n){const e={cornerstone:[],keystone:[],touchstone:[],lodestone:[],capstone:[]};if(n)for(const t of dt(n)){const r=cn(t.name);r&&e[r].push({id:t.id||t.name,name:t.name,status:ln(t.status),tier:t.tier,ms:t.ms,note:t.note??t.error??void 0})}return Object.keys(e).map(t=>({key:t,members:Yt(t,e[t])}))}function w(n){return typeof n=="number"&&Number.isFinite(n)?n:null}function T(n){return typeof n=="string"?n:null}function C(n){return n&&typeof n=="object"&&!Array.isArray(n)?n:null}function un(n,e){return n.sandy!==!0?null:{id:"fsm-sandy",stone:"cornerstone",tier:"empirical",variant:"headline",source:"NYC OEM",agency:"NYC OpenData 5xsi-dfpx · Sandy 2012 inundation",vintage:"2012-10-29",title:"Hurricane Sandy 2012 inundation",headline:"Inside zone",subhead:(e&&T(e.address))??"address inside the empirical 2012 extent",body:"Address sits within the empirical Hurricane Sandy 2012 inundation extent. This is a historical fact, not a model prediction.",docId:"sandy",citeId:"sandy",mapLayer:"sandy"}}function pn(n){const e=C(n.dep);if(!e)return null;const t=[];for(const[r,s]of Object.entries(e)){const d=C(s);if(!d)continue;const o=w(d.depth_class)??0;o<=0||t.push([r.replace("dep_",""),T(d.depth_label)??"—",`class ${o}`])}return t.length?{id:"fsm-dep",stone:"cornerstone",tier:"modeled",variant:"tabular",source:"NYC DEP",agency:"NYC Department of Environmental Protection · Stormwater Flood Maps",vintage:"2021",title:"Stormwater flood scenarios at this address",columns:["scenario","depth label","class"],rows:t,sub:`${t.length} scenario${t.length===1?"":"s"} place this lot in modeled flooding`,docId:"dep_stormwater",citeId:"dep",mapLayer:"stormwater"}:null}function fn(n){const e=C(n.ida_hwm);if(!e)return null;const t=w(e.n_within_radius);if(!t||t<=0)return null;const r=[];return r.push(["count",`${t}`,`${w(e.radius_m)??800} m radius`]),w(e.max_height_above_gnd_ft)!=null&&r.push(["max above gnd",`${e.max_height_above_gnd_ft} ft`,"—"]),w(e.nearest_dist_m)!=null&&r.push(["nearest",T(e.nearest_site)??"HWM",`${e.nearest_dist_m} m`]),{id:"fsm-ida-hwm",stone:"cornerstone",tier:"empirical",variant:"tabular",source:"USGS",agency:"USGS STN Hurricane Ida 2021 high-water marks (Event 312)",vintage:"2021-09",title:"Hurricane Ida 2021 high-water marks nearby",columns:["field","value","context"],rows:r,docId:"ida_hwm",citeId:"ida_hwm",mapLayer:"hwm"}}function mn(n){const e=C(n.prithvi_water);if(!e)return null;const t=w(e.nearest_distance_m);return t==null?null:{id:"fsm-prithvi-water",stone:"cornerstone",tier:"modeled",variant:"raster",source:"Prithvi-EO 2.0",agency:"IBM/NASA Prithvi-EO 2.0 · baked Hurricane Ida 2021 polygons",vintage:"2021-09-02",title:"Hurricane Ida 2021 — satellite-attributable inundation",rasterKind:"prithvi",headline:e.inside_water_polygon?"Inside polygon":`${t} m away`,subhead:"pre/post HLS Sentinel-2 segmentation",sub:`${w(e.n_polygons_within_500m)??0} distinct polygons within 500 m`,docId:"prithvi_water",citeId:"prithvi_water",mapLayer:"prithvi"}}function _n(n){const e=C(n.microtopo);if(!e)return null;const t=w(e.point_elev_m);if(t==null)return null;const r=[{value:`${t.toFixed(1)} m`,label:"elevation"}];return w(e.hand_m)!=null&&r.push({value:`${e.hand_m.toFixed(1)} m`,label:"HAND"}),w(e.twi)!=null&&r.push({value:`${e.twi.toFixed(1)}`,label:"TWI"}),w(e.rel_elev_pct_200m)!=null&&r.push({value:`${e.rel_elev_pct_200m}%`,label:"pct lower 200m"}),{id:"fsm-microtopo",stone:"cornerstone",tier:"proxy",variant:"scalars",source:"USGS 3DEP",agency:"USGS 3DEP DEM (LiDAR-derived) + whitebox-workflows hydrology",vintage:"2018",title:"Microtopography at this point",scalars:r,sub:"Lower percentile = topographic low point; runoff routes here.",docId:"microtopo",citeId:"microtopo"}}function hn(n){const e=[],t=C(n.mta_entrances);if(t!=null&&t.available&&Array.isArray(t.entrances))for(const o of t.entrances.slice(0,4))e.push({reg:"MTA",tier:"empirical",label:T(o.station_name)??T(o.entrance_id)??"entrance",detail:`${w(o.distance_m)??"—"} m · ${T(o.daytime_routes)??""}`.trim(),sourceId:T(o.station_id)??"MTA",note:null});else t&&t.available===!1&&e.push({reg:"MTA",tier:"empirical",label:null,detail:null,sourceId:null,note:"no subway entrances within 1.0 mi (silent)"});const r=C(n.nycha_developments);if(r!=null&&r.available&&Array.isArray(r.developments))for(const o of r.developments.slice(0,3))e.push({reg:"NYCHA",tier:"empirical",label:T(o.development)??"development",detail:`${w(o.distance_m)??"—"} m · ${T(o.borough)??""}`.trim(),sourceId:T(o.tds_num)??null,note:null});else r&&r.available===!1&&e.push({reg:"NYCHA",tier:"empirical",label:null,detail:null,sourceId:null,note:"no NYCHA developments within 1.0 mi (silent)"});const s=C(n.doe_schools);if(s!=null&&s.available&&Array.isArray(s.schools))for(const o of s.schools.slice(0,3))e.push({reg:"DOE",tier:"empirical",label:T(o.loc_name)??"school",detail:`${w(o.distance_m)??"—"} m · ${T(o.borough)??""}`.trim(),sourceId:T(o.loc_code)??null,note:null});else s&&s.available===!1&&e.push({reg:"DOE",tier:"empirical",label:null,detail:null,sourceId:null,note:"no schools within 1.0 mi (silent)"});const d=C(n.doh_hospitals);if(d!=null&&d.available&&Array.isArray(d.hospitals))for(const o of d.hospitals.slice(0,3))e.push({reg:"DOH",tier:"empirical",label:T(o.facility_name)??"hospital",detail:`${w(o.distance_m)??"—"} m · ${T(o.borough)??""}`.trim(),sourceId:T(o.fac_id)??null,note:null});else d&&d.available===!1&&e.push({reg:"DOH",tier:"empirical",label:null,detail:null,sourceId:null,note:"no acute-care hospital within 1.0 mi (silent)"});return e.length?{id:"fsm-registers",stone:"keystone",tier:"empirical",variant:"register",source:"NYC OpenData",agency:"NYC OpenData · multi-agency join",vintage:Z,title:"Nearby exposed assets",registers:e,sub:`${e.filter(o=>o.label).length} of ${e.length} registers fired · joined within 1.0 mi`,docId:"registers",citeId:"registers",mapLayer:"registers"}:null}function vn(n){const e=C(n.terramind_buildings);return e!=null&&e.ok?{id:"fsm-tm-buildings",stone:"keystone",tier:"modeled",variant:"raster-pred",source:"TerraMind-NYC",agency:"msradam/TerraMind-NYC-Adapters · Buildings LoRA",vintage:"2026",title:"NYC building footprints — TerraMind LoRA",rasterKind:"buildings",headline:`${w(e.pct_buildings)??0}%`,subhead:"building-footprint coverage in chip",sub:`${w(e.n_building_components)??0} distinct components · test mIoU 0.5511`,illustrative:!0,docId:"tm_buildings",citeId:"tm_buildings",mapLayer:"buildings"}:null}function gn(n){const e=C(n.floodnet);if(!e||(w(e.n_sensors)??0)<=0)return null;const t=w(e.n_flood_events_3y)??0;return{id:"fsm-floodnet",stone:"touchstone",tier:"empirical",variant:"spark",source:"FloodNet",agency:"FloodNet NYC ultrasonic depth sensor network",vintage:"2026",title:"FloodNet sensors near this address",headline:`${t} events`,subhead:`${w(e.n_sensors)??0} sensors · last 3 y`,spark:Array.from({length:24},(r,s)=>Math.max(0,Math.round(t/24*1.4*Math.exp(-Math.pow((s-14)/4,2))+t/24))),sparkSub:"Above-curb depth events ≥ 2 cm. Synthetic monthly distribution; raw deployment-id history is in the audit panel.",docId:"floodnet",citeId:"floodnet",mapLayer:"floodnet"}}function yn(n){var p;const e=C(n.nyc311);if(!e)return null;const t=w(e.n)??0;if(t<=0)return null;const r=C(e.by_year),s=C(e.by_descriptor),d=r?Object.values(r).map(m=>w(m)??0):Array.from({length:12},()=>Math.round(t/12)),o=s?(p=Object.entries(s).sort((m,l)=>(w(l[1])??0)-(w(m[1])??0))[0])==null?void 0:p[0]:null;return{id:"fsm-311",stone:"touchstone",tier:"proxy",variant:"histogram",source:"NYC 311",agency:"NYC 311 service requests (Socrata erm2-nwe9)",vintage:Z,title:"Recent 311 flood complaints",headline:`${t} calls`,subhead:o?`top descriptor: ${o}`:"all flood-related descriptors",histogram:d,sparkSub:`Within ${w(e.radius_m)??200} m · ${w(e.years)??5} y window. Filtered to flood-relevant descriptors.`,docId:"nyc311",citeId:"nyc311",mapLayer:"complaints"}}function bn(n){var r;const e=C(n.nws_obs);if(!e||e.error||e.station_id==null)return null;const t=[];return w(e.precip_last_hour_mm)!=null&&t.push({value:`${e.precip_last_hour_mm} mm`,label:"precip · 1h"}),w(e.precip_last_6h_mm)!=null&&t.push({value:`${e.precip_last_6h_mm} mm`,label:"precip · 6h"}),t.length?{id:"fsm-nws-obs",stone:"touchstone",tier:"empirical",variant:"scalars",source:"NWS",agency:`NWS ASOS station ${T(e.station_id)??"?"}`,vintage:((r=T(e.obs_time))==null?void 0:r.slice(0,10))??Z,title:"Recent precipitation",scalars:t,sub:`Nearest hourly METAR: ${T(e.station_name)??"?"} (${w(e.distance_km)??"?"} km).`,docId:"nws_obs",citeId:"nws_obs",mapLayer:"nws"}:null}function wn(n){var r;const e=C(n.noaa_tides);if(!e||e.error||w(e.observed_ft_mllw)==null)return null;const t=[{value:`${e.observed_ft_mllw} ft`,label:"observed (MLLW)"}];return w(e.predicted_ft_mllw)!=null&&t.push({value:`${e.predicted_ft_mllw} ft`,label:"predicted"}),w(e.residual_ft)!=null&&t.push({value:`${e.residual_ft} ft`,label:"residual"}),{id:"fsm-noaa",stone:"touchstone",tier:"empirical",variant:"scalars",source:"NOAA CO-OPS",agency:`NOAA tide gauge ${T(e.station_name)??T(e.station_id)??"?"}`,vintage:((r=T(e.obs_time))==null?void 0:r.slice(0,10))??Z,title:"Live water level (nearest tide gauge)",scalars:t,sub:"Residual = observed − astronomical tide; positive residual is wind / surge component.",docId:"noaa_tides",citeId:"noaa_tides",mapLayer:"noaa"}}function xn(n){var r;const e=C(n.prithvi_live);if(!(e!=null&&e.ok))return null;const t=(r=T(e.item_datetime))==null?void 0:r.slice(0,10);return{id:"fsm-prithvi-live",stone:"touchstone",tier:"modeled",variant:"raster-pred",source:"Prithvi-NYC-Pluvial",agency:"NASA-IBM Prithvi v2 · NYC fine-tune",vintage:t?`${t} · Sentinel-2`:"Sentinel-2",title:"Pluvial flood prediction · Prithvi-NYC-Pluvial",rasterKind:"prithvi",headline:`${w(e.pct_water_within_500m)??0}% flooded`,subhead:`water within 500 m · cloud ${w(e.cloud_cover)??"?"}%`,sub:"Test flood IoU 0.5979 on held-out NYC chips. Model interpretation, not a measurement.",illustrative:!0,docId:"prithvi_live",citeId:"prithvi_live",mapLayer:"prithvi-pluvial"}}const Sn={urban:"#C66",water:"#5B7FB4",vegetation:"#5B8A4A",barren:"#A89A78",wetland:"#D9C75A"};function kn(n){const e=C(n.terramind_lulc);if(!(e!=null&&e.ok))return null;const t=C(e.class_fractions)??{},r={urban:0,water:0,vegetation:0,barren:0,wetland:0};for(const[d,o]of Object.entries(t)){const p=d.toLowerCase();p.includes("urban")||p.includes("built")||p.includes("impervious")?r.urban+=o:p.includes("water")?r.water+=o:p.includes("tree")||p.includes("vegetation")||p.includes("crop")||p.includes("grass")?r.vegetation+=o:p.includes("bare")||p.includes("barren")||p.includes("soil")?r.barren+=o:p.includes("wet")||p.includes("marsh")?r.wetland+=o:r.barren+=o}const s=Object.entries(r).filter(([,d])=>d>0).map(([d,o])=>({k:d,pct:Math.round(o),color:Sn[d]}));return{id:"fsm-tm-lulc",stone:"touchstone",tier:"synthetic",variant:"lulc",source:"TerraMind v1.2",agency:"IBM TerraMind v1.2 · Sentinel-2 inputs",vintage:"Sentinel-2",title:"Land use / land cover · TerraMind v1.2",rasterKind:"lulc",classMix:s.length?s:void 0,sub:"Synthetic prior. LULC palette is a layer convention, not a tier signal.",illustrative:!0,docId:"tm_lulc",citeId:"tm_lulc",mapLayer:"terramind-lulc"}}function $n(n){const e=C(n.ttm_forecast);if(!(e!=null&&e.available)||!e.interesting)return null;const t=w(e.forecast_peak_ft),r=w(e.forecast_peak_minutes_ahead);return t==null||r==null?null:{id:"fsm-ttm-fc",stone:"lodestone",tier:"modeled",variant:"timeseries",source:"Granite TTM r2 (zero-shot)",agency:"IBM Granite-TimeSeries · regional",vintage:Z,title:"Storm surge nowcast at The Battery — 9.6 h horizon (regional)",timeseries:{hours:96,peak:{x:38,y:47},peakLabel:`${t} ft @ +${Math.round(r/60)}h`},headline:`${t} ft`,subhead:"peak surge residual · 9.6h horizon · 6-min cadence",sub:"Regional disclosure. Distinct from the fine-tuned Battery surge nowcast.",spatialNote:"regional · Battery, not point-of-query",docId:"ttm_forecast",citeId:"ttm_forecast"}}function Nn(n){const e=C(n.ttm_battery_surge);if(!(e!=null&&e.available)||!e.interesting)return null;const t=w(e.forecast_peak_m),r=w(e.forecast_peak_hours_ahead);return t==null||r==null?null:{id:"fsm-ttm-batt",stone:"lodestone",tier:"modeled",variant:"timeseries-ft",source:"msradam/Granite-TTM-r2-Battery-Surge",agency:"Granite TTM r2 · NYC-specialized fine-tune",vintage:Z,title:"Storm surge nowcast at The Battery — 96 h horizon (NYC-specialized fine-tune)",timeseries:{hours:96,peak:{x:r,y:Math.round(t*100)},peakLabel:`${(t*100).toFixed(0)} cm @ +${r}h`},headline:`${(t*100).toFixed(0)} cm`,subhead:"peak surge · 96h horizon · hourly cadence",sub:"Fine-tuned on NYC tide-gauge history. Hourly cadence; applies city-wide via NOAA station 8518750.",spatialNote:"regional · The Battery, not point-of-query",docId:"ttm_battery",citeId:"ttm_battery",hfModelCard:"huggingface.co/msradam/Granite-TTM-r2-Battery-Surge",rmse:"0.157 m",skillVsPersistence:"−35% vs persistence",hardwareBadge:"MI300X"}}function An(n){const e=C(n.nws_alerts);if(!e)return null;const t=w(e.n_active)??0;if(t<=0)return null;const r=Array.isArray(e.alerts)?e.alerts:[];return{id:"fsm-nws-alerts",stone:"lodestone",tier:"modeled",variant:"tabular",source:"NWS",agency:"NWS Public Alerts API · flood-relevant filter",vintage:Z,title:`${t} active flood-relevant alert${t===1?"":"s"}`,columns:["event","severity","expires"],rows:r.slice(0,4).map(s=>[T(s.event)??"?",T(s.severity)??"?",(T(s.expires)??"").slice(0,16)]),sub:"Live NWS feed. If a FLOOD or FLASH FLOOD WARNING is in this list, foreground it.",docId:"nws_alerts",citeId:"nws_alerts"}}function Tn(n,e){var l,c,h;const t=n.mellea,r=((l=t==null?void 0:t.passed)==null?void 0:l.length)??0,s=((c=t==null?void 0:t.failed)==null?void 0:c.length)??0,d=r+s>0?r+s:4,o=(t==null?void 0:t.attempts)??0,p=Math.max(0,o-1),m=((h=n.citations)==null?void 0:h.length)??0;return{id:"fsm-capstone-meta",stone:"capstone",tier:"modeled",variant:"meta",source:"Mellea",agency:"Capstone synthesis · Granite 4.1 + Mellea grounding check",vintage:Z,title:"Briefing reconciliation",metaRows:[{k:"mellea reroll",v:`${p} reroll${p===1?"":"s"}`},{k:"grounding checks",v:`${r}/${d} passed`},{k:"citations resolved",v:`${m}`},{k:"wall-clock",v:e!=null?`${e.toFixed(1)} s`:"—"}],sub:"Capstone produces prose, not cards. This meta-card is the integrity-narration UI for the entire pipeline.",docId:"capstone"}}function et(n,e,t,r=!0){const s=n??{},d=C(s.geocode);return{cards:[un(s,d),pn(s),fn(s),mn(s),_n(s),hn(s),vn(s),gn(s),yn(s),bn(s),wn(s),xn(s),kn(s),An(s),$n(s),Nn(s),r?Tn(n??{},t):null].filter(p=>p!=null),stones:dn(e),wallSeconds:t}}function In(n,e,t,r){const d={sandy_inundation:"sandy",dep_stormwater:"dep",floodnet:"floodnet",nyc311:"nyc311",noaa_tides:"noaa_tides",nws_alerts:"nws_alerts",nws_obs:"nws_obs",ttm_forecast:"ttm_forecast",ttm_311_forecast:"ttm_311_forecast",ttm_battery_surge:"ttm_battery_surge",floodnet_forecast:"floodnet_forecast",ida_hwm_2021:"ida_hwm",prithvi_eo_v2:"prithvi_water",prithvi_eo_live:"prithvi_live",microtopo_lidar:"microtopo",mta_entrance_exposure:"mta_entrances",nycha_development_exposure:"nycha_developments",doe_school_exposure:"doe_schools",doh_hospital_exposure:"doh_hospitals",terramind_synthesis:"terramind",terramind_lulc:"terramind_lulc",terramind_buildings:"terramind_buildings",eo_chip_fetch:"eo_chip",geocode:"geocode"}[e];if(!d)return[];if(e==="sandy_inundation"){const o=t;n[d]=r&&(o==null?void 0:o.inside)===!0?!0:r?!1:null}else if(e==="dep_stormwater"){const o=t??{},p={};for(const[m,l]of Object.entries(o)){const c=typeof l=="string"?l:"";c&&(p[m]={depth_class:1,depth_label:c})}n[d]=Object.keys(p).length?p:null}else r&&t!=null?n[d]=t:n[d]=null;return[d]}const be={subway:"MTA · USGS · FEMA · NYC OEM · NYC DEP",nycha:"NYC HA · USGS · NYC OEM · NYC DEP",school:"NYC DOE · USGS · NYC OEM · NYC DEP",hospital:"NYS DOH · USGS · NYC OEM · NYC DEP"},we={subway:"subway entrances",nycha:"NYCHA developments",school:"public schools",hospital:"hospitals"};function xe(n){return!n||!Number.isFinite(n)?"—":`${Math.round(n)}m`}function Se(n){return n==null||!Number.isFinite(n)?"—":`${(n*3.28084).toFixed(1)} ft`}function ke(n,e){return typeof e=="number"?e>=.5?`Inundated 2012 (${Math.round(e*100)}%)`:e>0?`Edge (${Math.round(e*100)}%)`:"—":n?"Inundated 2012":"—"}function $e(n,e,t){return typeof t=="number"?t>=.5?`≥${Math.round(t*100)}% in scenario`:t>0?`${Math.round(t*100)}% edge`:"minimal":n&&n.length?n:e&&e>0?`class ${e}`:"minimal"}function Cn(n){return n?/elevator|easement|stair.*ramp/i.test(n):!1}function Mn(n){if(!n.available)return null;const t=(n.entrances??[]).map(r=>{const s=Cn(r.entrance_type);return{name:`${r.station_name??"?"}${r.daytime_routes?` (${String(r.daytime_routes).split(/\s+/).slice(0,3).join("/")})`:""}`,elev:Se(r.elev_m),ada:s,fema:"Zone X",sandy:ke(r.inside_sandy_2012),dep:$e(r.dep_extreme_2080_label,r.dep_extreme_2080_class),asset:"subway",primaryTier:r.inside_sandy_2012?"empirical":"modeled"}});return{type:we.subway,radius:xe(n.radius_m),count:n.n_entrances??t.length,rows:t,sourceLabel:be.subway}}function qn(n){if(!n.available)return null;const t=(n.developments??[]).map(r=>{const s=r.pct_inside_sandy_2012,d=r.pct_in_dep_extreme_2080;return{name:`${r.development??"?"}${r.borough?` · ${r.borough}`:""}`,elev:Se(r.rep_elevation_m),ada:!1,fema:"—",sandy:ke(void 0,s),dep:$e(void 0,void 0,d),asset:"nycha",primaryTier:s&&s>0?"empirical":"modeled"}});return{type:we.nycha,radius:xe(n.radius_m),count:n.n_developments??t.length,rows:t,sourceLabel:be.nycha}}function Fn(n){if(!n.available)return null;const t=(n.schools??[]).map(r=>({name:`${r.school_name??r.name??"?"}${r.borough?` · ${r.borough}`:""}`,elev:Se(r.elev_m),ada:!1,fema:"—",sandy:ke(r.inside_sandy_2012),dep:$e(r.dep_extreme_2080_label,r.dep_extreme_2080_class),asset:"school",primaryTier:r.inside_sandy_2012?"empirical":"modeled"}));return{type:we.school,radius:xe(n.radius_m),count:n.n_schools??t.length,rows:t,sourceLabel:be.school}}function Ln(n){if(!n.available)return null;const t=(n.hospitals??[]).map(r=>({name:`${r.facility_name??r.name??"?"}${r.borough?` · ${r.borough}`:""}`,elev:Se(r.elev_m),ada:!0,fema:"—",sandy:ke(r.inside_sandy_2012),dep:$e(r.dep_extreme_2080_label,r.dep_extreme_2080_class),asset:"hospital",primaryTier:r.inside_sandy_2012?"empirical":"modeled"}));return{type:we.hospital,radius:xe(n.radius_m),count:n.n_hospitals??t.length,rows:t,sourceLabel:be.hospital}}function En(n){if(!n)return[];const e=[],t=Mn(n.mta_entrances??{});t&&t.rows.length&&e.push(t);const r=qn(n.nycha_developments??{});r&&r.rows.length&&e.push(r);const s=Fn(n.doe_schools??{});s&&s.rows.length&&e.push(s);const d=Ln(n.doh_hospitals??{});return d&&d.rows.length&&e.push(d),e}function jn(n,e){const t=`/api/agent/stream?q=${encodeURIComponent(n)}`,r=new EventSource(t);let s="",d;const o=/([.?!])(\s|$)/;function p(l=!1){var h,E;let c;for(;c=o.exec(s);){const Y=c.index+c[1].length+(c[2]?c[2].length:0),j=s.slice(0,Y).trim();s=s.slice(Y),j&&((h=e.onSentence)==null||h.call(e,j,d))}l&&s.trim()&&((E=e.onSentence)==null||E.call(e,s.trim(),d),s="")}function m(l,c){r.addEventListener(l,h=>{try{c(JSON.parse(h.data))}catch{}})}return m("hello",l=>{var c;return(c=e.onHello)==null?void 0:c.call(e,l.query)}),m("plan_token",l=>{var c;return(c=e.onPlanToken)==null?void 0:c.call(e,l.delta)}),m("plan",l=>{var c;return(c=e.onPlan)==null?void 0:c.call(e,l)}),m("step",l=>{var c;return(c=e.onStep)==null?void 0:c.call(e,l)}),m("token",l=>{var c,h;l.attempt!==d&&(d=l.attempt,s="",(c=e.onAttemptStart)==null||c.call(e,l.attempt??1)),(h=e.onToken)==null||h.call(e,l.delta,l.attempt),s+=l.delta,p(!1)}),m("mellea_attempt",l=>{var c;return(c=e.onMelleaAttempt)==null?void 0:c.call(e,l)}),m("final",l=>{var c;p(!0),(c=e.onFinal)==null||c.call(e,l)}),m("error",l=>{var c;return(c=e.onError)==null?void 0:c.call(e,l.err)}),r.addEventListener("done",()=>{var l;p(!0),(l=e.onDone)==null||l.call(e),r.close()}),r.addEventListener("error",()=>{var l;p(!0),(l=e.onError)==null||l.call(e,"SSE connection error"),r.close()}),{close:()=>r.close()}}const ut=[{key:"status",label:"Status",n:"01",aliases:["status"]},{key:"empirical",label:"Empirical evidence",n:"02",tier:"empirical",aliases:["empirical evidence","empirical"]},{key:"modeled",label:"Modeled scenarios",n:"03",tier:"modeled",aliases:["modeled scenarios","modeled"]},{key:"policy",label:"Policy context",n:"04",aliases:["policy context","policy"]}];function tt(n){const e=n.toLowerCase().replace(/[.:]+\s*$/,"").trim();return ut.find(t=>t.aliases.includes(e))}const nt=/(^|\n)\s*(?:\*\*([A-Z][A-Za-z\s/]+?)\.\s*\*\*|#{1,3}\s*(0[1-4])\s*[:\-—.]?\s*([^\n]+))/g;function pt(n,e,t){return{id:e,n,tier:lt(e),source:(t==null?void 0:t.source)??e.split(/[_-]/)[0].toUpperCase(),title:(t==null?void 0:t.title)??e,docId:e,url:(t==null?void 0:t.url)??"",vintage:(t==null?void 0:t.vintage)??"",retrieved:(t==null?void 0:t.retrieved)??""}}const Pn=/\[([a-z][a-z0-9_]*(?:\s*,\s*[a-z][a-z0-9_]*)*)\]/gi;function rt(n){return n.split(new RegExp("(?<=[.!?])\\s+(?=[A-Z(])","g")).filter(t=>t.trim().length>0)}function it(n,e,t){let r=0;const s=[],d=[...n.matchAll(Pn)];if(d.length===0)return[{text:n}];for(const o of d){const p=n.slice(r,o.index??0),m=o[1].split(/\s*,\s*/).filter(Boolean);r=(o.index??0)+o[0].length;const l=lt(m[0]);s.push({text:p,tier:l,cite:m[0]});for(const c of m)e[c]||(e[c]=t(c))}if(r<n.length){const o=n.slice(r);o.trim()&&s.push({text:o})}return s}function On(n,e={}){const t={...e};let r=Object.values(t).reduce((l,c)=>Math.max(l,c.n),0)+1;const s=new Set,d=l=>(e[l]||s.add(l),pt(r++,l)),o=[],p=[];let m;for(nt.lastIndex=0;m=nt.exec(n);)if(m[2]!==void 0){const l=tt(m[2]);if(!l)continue;p.push({num:l.n,label:l.label,tier:l.tier,start:m.index+m[1].length,bodyStart:m.index+m[0].length})}else if(m[3]!==void 0){const l=m[3],c=(m[4]??"").trim(),h=ut.find(E=>E.n===l)??tt(c);p.push({num:l,label:(h==null?void 0:h.label)??c,tier:h==null?void 0:h.tier,titleExtra:h&&c.toLowerCase()!==h.label.toLowerCase()?c:void 0,start:m.index+m[1].length,bodyStart:m.index+m[0].length})}for(let l=0;l<p.length;l++){const c=p[l],h=p[l+1],E=n.slice(c.bodyStart,h?h.start:n.length).trim();if(E){o.push({kind:"head",n:c.num,label:c.label,tier:c.tier,title:c.titleExtra});for(const Y of E.split(/\n\s*\n/)){const j=Y.replace(/\s+/g," ").trim();if(!j)continue;const G=rt(j),F=[];for(const O of G)F.push(...it(O,t,d)),F.push({text:" "});for(;F.length&&F[F.length-1].text.trim()===""&&!F[F.length-1].tier;)F.pop();F.length&&o.push({kind:"prose",parts:F})}}}if(o.length===0&&n.trim()){o.push({kind:"head",n:"01",label:"Status"});const l=n.replace(/\s+/g," ").trim(),c=rt(l),h=[];for(const E of c)h.push(...it(E,t,d)),h.push({text:" "});for(;h.length&&h[h.length-1].text.trim()===""&&!h[h.length-1].tier;)h.pop();h.length&&o.push({kind:"prose",parts:h})}return{blocks:o,citations:t,unresolvedDocIds:[...s]}}const oe={type:"FeatureCollection",features:[]};async function le(n){try{const e=await fetch(n);if(!e.ok)return oe;const t=await e.json();return!t||t.type!=="FeatureCollection"?oe:t}catch{return oe}}async function zn(n,e,t=1500){return le(`/api/layers/sandy?lat=${n}&lon=${e}&r=${t}`)}async function Dn(n,e,t=1500){return le(`/api/layers/dep_extreme_2080?lat=${n}&lon=${e}&r=${t}`)}async function at(n,e,t=1500){return le(`/api/layers/prithvi_water?lat=${n}&lon=${e}&r=${t}`)}async function Rn(n){return le(`/api/layers/sandy_clipped?code=${encodeURIComponent(n)}`)}async function Yn(n,e="dep_extreme_2080"){return le(`/api/layers/dep_clipped?code=${encodeURIComponent(n)}&scenario=${e}`)}async function st(n,e,t=1500){try{const r=await fetch(`/api/floodnet_near?lat=${n}&lon=${e}&r=${t}`);return r.ok?{type:"FeatureCollection",features:(await r.json()).features.map(o=>{const p=o.properties??{};return{...o,properties:{...p,count:typeof p.n_events_3y=="number"?p.n_events_3y:1}}})}:oe}catch{return oe}}var Bn=L('<span class="region-head-meta svelte-1q8jizq"> <!></span>'),Hn=L('<span class="region-head-meta svelte-1q8jizq">planning…</span>'),Gn=L('<div class="reroll-prev svelte-1q8jizq" aria-hidden="true"><p class="reroll-prev-line svelte-1q8jizq"> </p></div>'),Un=L("<!> <!>",1),Wn=L('<span class="streaming-caret svelte-1q8jizq" aria-hidden="true">▍</span>'),Kn=L("<!> <!>",1),Jn=L('<details class="plan-details svelte-1q8jizq"><summary class="svelte-1q8jizq"> </summary> <pre class="plan-stream svelte-1q8jizq"> </pre></details>'),Vn=L('<div class="generating-status svelte-1q8jizq" aria-live="polite"><span class="pulse svelte-1q8jizq"></span> Planning intent… <!></div>'),Zn=L('<div class="generating-status svelte-1q8jizq" aria-live="polite"><span class="pulse svelte-1q8jizq"></span> Resolving address…</div>'),Xn=L("<!> <!>",1),Qn=L('<span class="region-head-meta svelte-1q8jizq"> </span>'),er=L('<span class="region-head-meta svelte-1q8jizq">awaiting geocode…</span>'),tr=L('<div style="position: relative; flex: 1; min-height: 0;" class="svelte-1q8jizq"><!> <!></div>'),nr=L('<section class="hero-band svelte-1q8jizq"><div class="hero-band-inner svelte-1q8jizq"><div class="app-shell-top is-desktop svelte-1q8jizq"><main id="region-briefing" class="app-region app-region-brief svelte-1q8jizq" aria-labelledby="brief-h1"><header class="region-head svelte-1q8jizq"><span class="section-label svelte-1q8jizq">Briefing</span> <!></header> <h1 id="brief-h1" class="brief-h1 svelte-1q8jizq">Flood-exposure briefing <span class="brief-h1-addr svelte-1q8jizq"> </span></h1> <!></main> <div class="app-region-side svelte-1q8jizq" style="grid-area: side;"><aside id="region-map" class="app-region app-region-map svelte-1q8jizq" aria-label="Map region"><header class="region-head svelte-1q8jizq"><span class="section-label svelte-1q8jizq">Map</span> <!></header> <!></aside> <aside id="region-cites" class="app-region app-region-cites svelte-1q8jizq" aria-label="Citations"><!></aside></div></div> <div class="app-shell-bottom svelte-1q8jizq"><section class="app-region app-region-findings svelte-1q8jizq" aria-label="Findings"><!></section></div></div></section>');function fr(n,e){jt(e,!0);let t=ne(()=>zt.params.queryId??""),r=ne(()=>()=>{try{return decodeURIComponent(a(t))}catch{return a(t)}}),s=k(null),d=k(""),o=k(""),p=k(null),m=k(!1),l=k(0),c=2,h=k(!1),E=k(!1),Y=k(""),j=k(null),G=k(te([])),F=ne(()=>{var u,i,_,f;return{empirical:((u=a(pe))==null?void 0:u.features.length)??0,modeled:((i=a(fe))==null?void 0:i.features.length)??0,synthetic:((_=a(me))==null?void 0:_.features.length)??0,proxy:((f=a(_e))==null?void 0:f.features.length)??0}}),O=k(te({id:"root",name:"briefing.run",status:"ok",ms:0,tier:null,children:[]})),Q=k(null),Ne="comfortable",Ae="smart",ce=k(!1);Pe(()=>{typeof window<"u"&&v(ce,new URL(window.location.href).searchParams.get("grammar")==="1")});let U=k(null),P=k(void 0),X=te({}),re=k(0),de=ne(()=>{if(a(re),a(p)){const u={...X,...a(p)};return et(u,a(O),a(P),!0)}return et(X,a(O),a(P),!1)});function ft(u){v(Q,u,!0)}function mt(u){const i=document.getElementById("region-cites");i&&i.scrollIntoView({behavior:"smooth",block:"start"})}const Re=new Set(["ttm_forecast","ttm_311_forecast","floodnet_forecast"]),Te="group-ttm-r2";function _t(u,i,_,f){if(f==="error")return _??void 0;if(f==="silent")return _??"no data";if(i==null||typeof i!="object")return;const A=i,g={sandy_inundation:["inside"],dep_stormwater:["dep_extreme_2080","dep_moderate_2050"],floodnet:["n_sensors","n_events_3y"],nyc311:["n"],noaa_tides:["observed_ft_mllw","residual_ft","station"],nws_alerts:["n_active"],nws_obs:["p1h_mm","p6h_mm","station"],ttm_forecast:["forecast_peak_ft","forecast_peak_min_ahead"],ttm_311_forecast:["forecast_mean","forecast_peak","accelerating"],ida_hwm_2021:["n_within_800m","max_height_above_gnd_ft"],prithvi_eo_v2:["inside_water_polygon","nearest_distance_m"],prithvi_eo_live:["scene_date","pct_water_500m"],microtopo_lidar:["elev_m","pct_200m","relief_m"],mta_entrance_exposure:["n_entrances","n_inside_sandy_2012","n_in_dep_extreme_2080"],nycha_development_exposure:["n_developments","n_majority_inside_sandy_2012"],doe_school_exposure:["n_schools","n_inside_sandy_2012"],doh_hospital_exposure:["n_hospitals","n_inside_sandy_2012"],floodnet_forecast:["sensor_id","distance_m","forecast_28d","accelerating"],terramind_synthesis:["tim_chain","dem_mean_m"],rag_granite_embedding:["hits"],gliner_extract:["sources"]}[u],M=[];if(g){for(const I of g)if(A[I]!==void 0&&M.push(Be(I,A[I])),M.length>=3)break}else for(const[I,y]of Object.entries(A))if(y!==null&&typeof y!="object"&&(M.push(Be(I,y)),M.length>=2))break;return M.join(" · ")||void 0}function ht(u){const i=[],_=u.mta_entrances;if(_&&Array.isArray(_.entrances))for(const g of _.entrances){const M=Number(g.entrance_lat),I=Number(g.entrance_lon);!Number.isFinite(M)||!Number.isFinite(I)||i.push({type:"Feature",geometry:{type:"Point",coordinates:[I,M]},properties:{kind:"subway",name:`${g.station_name??"?"} (${g.daytime_routes??"?"})`,doc_id:`mta_entrance_${g.station_id??""}`,inside_sandy_2012:g.inside_sandy_2012===!0}})}const f=u.doe_schools;if(f&&Array.isArray(f.schools))for(const g of f.schools){const M=Number(g.school_lat),I=Number(g.school_lon);!Number.isFinite(M)||!Number.isFinite(I)||i.push({type:"Feature",geometry:{type:"Point",coordinates:[I,M]},properties:{kind:"school",name:String(g.loc_name??g.school_name??"?"),doc_id:`doe_school_${g.loc_code??""}`,inside_sandy_2012:g.inside_sandy_2012===!0}})}const A=u.nycha_developments;if(A&&Array.isArray(A.developments))for(const g of A.developments){const M=Number(g.centroid_lat),I=Number(g.centroid_lon);if(!Number.isFinite(M)||!Number.isFinite(I))continue;const y=Number(g.pct_inside_sandy_2012??0);i.push({type:"Feature",geometry:{type:"Point",coordinates:[I,M]},properties:{kind:"nycha",name:String(g.development??"?"),doc_id:`nycha_dev_${g.tds_num??""}`,inside_sandy_2012:y>=50,pct_inside_sandy:y}})}const S=u.doh_hospitals;if(S&&Array.isArray(S.hospitals))for(const g of S.hospitals){const M=Number(g.hospital_lat),I=Number(g.hospital_lon);!Number.isFinite(M)||!Number.isFinite(I)||i.push({type:"Feature",geometry:{type:"Point",coordinates:[I,M]},properties:{kind:"hospital",name:String(g.facility_name??"?"),doc_id:`nyc_hospital_${g.fac_id??""}`,inside_sandy_2012:g.inside_sandy_2012===!0}})}return{type:"FeatureCollection",features:i}}function vt(u){return{type:"FeatureCollection",features:[]}}function Ye(u){return 1+(u.children??[]).reduce((_,f)=>_+Ye(f),0)}function Be(u,i){if(typeof i=="number"){const _=Number.isInteger(i)?`${i}`:i.toFixed(2);return`${u}=${_}`}if(typeof i=="boolean")return`${u}=${i}`;if(typeof i=="string"){const _=i.length>24?i.slice(0,22)+"…":i;return`${u}=${_}`}return u}let ie=k(te({empirical:!0,modeled:!0,synthetic:!0,proxy:!0})),K=k(null),ue=k(null),He=k(void 0),Ge=k(void 0),pe=k(void 0),fe=k(void 0),me=k(void 0),_e=k(void 0),ee=k(te([])),ae=k(te({})),he=[];function gt(){var A;if(!a(o)){v(ee,[],!0),v(ae,{},!0),he=[];return}const u={};(A=a(p))!=null&&A.citations&&a(p).citations.forEach((S,g)=>{u[S.doc_id]=pt(g+1,S.doc_id,{source:S.source,title:S.title,url:S.url,vintage:S.vintage})});const i=On(a(o),u),_={};let f=1;for(const S of he){const g=i.citations[S];g&&(_[S]={...g,n:f++})}for(const[S,g]of Object.entries(i.citations))_[S]||(_[S]={...g,n:f++},he.push(S));v(ee,i.blocks,!0),v(ae,_,!0)}Pe(()=>{a(o),a(p),gt()}),Pe(()=>{if(!a(K))return;const{lat:u,lon:i,source:_}=a(K);_==="nta"&&a(ue)?(Rn(a(ue)).then(f=>v(pe,f,!0)),Yn(a(ue)).then(f=>v(fe,f,!0)),at(u,i,2500).then(f=>v(me,f,!0)),st(u,i,3e3).then(f=>v(_e,f,!0))):(zn(u,i).then(f=>v(pe,f,!0)),Dn(u,i).then(f=>v(fe,f,!0)),at(u,i).then(f=>v(me,f,!0)),st(u,i).then(f=>v(_e,f,!0)))}),Pt(()=>{if(Qe.reset(),!a(r)())return;v(U,Date.now(),!0);const u=jn(a(r)(),{onPlanToken:i=>v(d,a(d)+i),onPlan:i=>v(s,i,!0),onStep:i=>{if(In(X,i.step,i.result,i.ok),v(re,a(re)+1),i.step==="geocode")if(i.ok&&i.result&&typeof i.result=="object"){const y=i.result;if(typeof y.lat=="number"&&typeof y.lon=="number"){const N=typeof y.address=="string"?y.address:a(r)();v(K,{label:N,lat:y.lat,lon:y.lon,source:"geocode"},!0),v(E,!0)}}else v(j,"geocoder");if(i.step==="nta_resolve"&&i.ok&&i.result&&typeof i.result=="object"){const y=i.result,N=Array.isArray(y.bbox)?y.bbox:null,z=typeof y.nta_code=="string"?y.nta_code:null;if(N&&N.length===4&&z){v(ue,z,!0);const J=(N[0]+N[2])/2,D=(N[1]+N[3])/2,B=typeof y.nta_name=="string"?y.nta_name:a(r)();v(K,{label:B,lat:D,lon:J,source:"nta"},!0)}}const _=Dt(i.step),f=i.ok?i.result==null&&i.err==null?"silent":"ok":"error",A=Math.round((i.elapsed_s??0)*1e3),S=i.result!=null?i.result:i.err??null,g=_t(i.step,i.result,i.err,f),M={id:`step-${Ye(a(O))}`,name:i.step,status:f,ms:A,tier:_,note:g,output:S,error:f==="error"?i.err??"unknown error":void 0,model:Re.has(i.step)?"granite-timeseries-ttm-r2":void 0},I={...a(O),ms:(a(O).ms??0)+A};if(Re.has(i.step)){const y=[...I.children??[]];let N=y.find(D=>D.id===Te);N||(N={id:Te,name:"forecasting.granite-timeseries-ttm-r2",status:"fan",ms:0,tier:"modeled",note:"1 instance",model:"granite-timeseries-ttm-r2",children:[]},y.push(N));const z=[...N.children??[],M],J={...N,ms:(N.ms??0)+A,note:`${z.length} instance${z.length===1?"":"s"}`,children:z};v(O,{...I,children:y.map(D=>D.id===Te?J:D)},!0)}else v(O,{...I,children:[...I.children??[],M]},!0)},onAttemptStart:i=>{v(l,i,!0),i>1&&(v(Y,a(o),!0),v(o,""),he=[])},onToken:i=>{a(h)||(v(h,!0),a(l)===0&&v(l,1)),v(o,a(o)+i)},onMelleaAttempt:i=>{i.attempt>0&&v(l,i.attempt,!0)},onFinal:i=>{v(p,i,!0),i.paragraph&&v(o,i.paragraph,!0),v(G,En(i),!0),v(He,ht(i),!0),v(Ge,vt(),!0);const f=i.mellea;f&&f.failed&&f.failed.length>0&&f.attempts&&f.attempts>=c&&v(j,"grounding")},onError:i=>{const _=i.toLowerCase();(_.includes("connection")||_.includes("502")||_.includes("503")||_.includes("timeout")||_.includes("routing"))&&v(j,"backend")},onDone:()=>{var i,_,f,A,S;v(m,!0),a(U)!=null&&v(P,(Date.now()-a(U))/1e3),!a(h)&&!a(j)&&a(E)&&v(j,"all-silent"),!a(j)&&a(ee).length>0&&(Jt({queryId:a(t),queryText:a(r)(),intent:((i=a(s))==null?void 0:i.intent)??null,specialists:((f=(_=a(s))==null?void 0:_.specialists)==null?void 0:f.length)??0,blocks:a(ee),citations:a(ae),generatedAt:new Date().toISOString(),attempts:((S=(A=a(p))==null?void 0:A.mellea)==null?void 0:S.attempts)??a(l)}),Qe.markReady())}});return()=>u.close()});var Ie=nr(),Ue=x(Ie),Ce=x(Ue),Me=x(Ce),qe=x(Me),yt=$(x(qe),2);{var bt=u=>{var i=Bn(),_=x(i),f=$(_);{var A=S=>{var g=Et("· ✓ done");q(S,g)};H(f,S=>{a(m)&&S(A)})}b(i),W(()=>{var S;return R(_,`intent: ${a(s).intent??""} · ${((S=a(s).specialists)==null?void 0:S.length)??0??""} specialists · attempt ${a(l)??""} `)}),q(u,i)},wt=u=>{var i=Hn();q(u,i)};H(yt,u=>{a(s)?u(bt):u(wt,-1)})}b(qe);var Fe=$(qe,2),We=$(x(Fe)),xt=x(We,!0);b(We),b(Fe);var St=$(Fe,2);{var kt=u=>{on(u,{get state(){return a(j)}})},$t=u=>{var i=Xn(),_=ye(i);{var f=y=>{var N=Un(),z=ye(N);nn(z,{get attempt(){return a(l)},max:c});var J=$(z,2);{var D=B=>{var V=Gn(),ve=x(V),ge=x(ve);b(ve),b(V),W(je=>R(ge,`${je??""}…`),[()=>a(Y).slice(0,360)]),q(B,V)};H(J,B=>{a(Y)&&B(D)})}q(y,N)};H(_,y=>{a(l)>1&&y(f)})}var A=$(_,2);{var S=y=>{var N=Kn(),z=ye(N);Rt(z,{get blocks(){return a(ee)},get citations(){return a(ae)},streaming:!1});var J=$(z,2);{var D=B=>{var V=Wn();q(B,V)};H(J,B=>{a(m)||B(D)})}q(y,N)},g=y=>{en(y)},M=y=>{var N=Vn(),z=$(x(N),2);{var J=D=>{var B=Jn(),V=x(B),ve=x(V);b(V);var ge=$(V,2),je=x(ge,!0);b(ge),b(B),W(()=>{R(ve,`Planner streaming (${a(d).length??""} chars)`),R(je,a(d))}),q(D,B)};H(z,D=>{a(d)&&D(J)})}b(N),q(y,N)},I=y=>{var N=Zn();q(y,N)};H(A,y=>{a(ee).length?y(S):a(E)&&!a(h)?y(g,1):a(s)?y(I,-1):y(M,2)})}q(u,i)};H(St,u=>{a(j)?u(kt):u($t,-1)})}b(Me);var Ke=$(Me,2),Le=x(Ke),Ee=x(Le),Nt=$(x(Ee),2);{var At=u=>{var i=Qn(),_=x(i);b(i),W((f,A)=>R(_,`Carto Positron · z15 · ${f??""}°N ${A??""}°W`),[()=>a(K).lat.toFixed(4),()=>Math.abs(a(K).lon).toFixed(4)]),q(u,i)},Tt=u=>{var i=er();q(u,i)};H(Nt,u=>{a(K)?u(At):u(Tt,-1)})}b(Ee);var It=$(Ee,2);{var Ct=u=>{var i=tr(),_=x(i);Gt(_,{get address(){return a(K)},get activeLayers(){return a(ie)},get sandyEmpirical(){return a(pe)},get depModeled(){return a(fe)},get syntheticPrior(){return a(me)},get proxy311(){return a(_e)},get registerPoints(){return a(He)},get registerPolygons(){return a(Ge)},get linkedKey(){return a(Q)}});var f=$(_,2);Ut(f,{get active(){return a(ie)},get featureCounts(){return a(F)},onToggle:A=>v(ie,{...a(ie),[A]:!a(ie)[A]},!0)}),b(i),q(u,i)};H(It,u=>{a(K)&&u(Ct)})}b(Le);var Je=$(Le,2),Mt=x(Je);Bt(Mt,{get citations(){return a(ae)}}),b(Je),b(Ke),b(Ce);var Ve=$(Ce,2),Ze=x(Ve),qt=x(Ze);Ht(qt,{get data(){return a(de)},density:Ne,provenanceMode:Ae,get showGrammar(){return a(ce)},get linkedKey(){return a(Q)},onLink:ft,onCite:mt}),b(Ze),b(Ve),b(Ue),b(Ie),W(u=>R(xt,u),[()=>a(r)()]),q(n,Ie),Ot()}export{fr as component,pr as universal};
|
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{d as z,b as V,a as U,f as q,s as j}from"../chunks/Dlpu43Tj.js";import{p as Z,K as X,l as d,j as l,L as Q,G as J,t as $,a as ee,s as r,c as e,k as i,r as t,J as te}from"../chunks/DwbuJhNu.js";import{B as ie}from"../chunks/Cl16PtNL.js";import{f as re,R as ae,M as ne,C as se,F as oe}from"../chunks/Bu5KOiaf.js";import{p as de,b as M}from"../chunks/DNaFzQeI.js";const le=!0,fe=Object.freeze(Object.defineProperty({__proto__:null,prerender:le},Symbol.toStringTag,{value:"Module"})),R="80 Pioneer Street · Red Hook · Brooklyn",y={c1:{id:"c1",n:1,tier:"empirical",source:"USGS",title:"Hurricane Sandy storm tide elevations, NY-NJ Harbor",docId:"USGS-OFR-2013-1234",url:"https://pubs.usgs.gov/of/2013/1234/",vintage:"2013-05",retrieved:"2026-04-28"},c2:{id:"c2",n:2,tier:"empirical",source:"NYC OEM",title:"Hurricane Sandy Inundation Zone (2012)",docId:"NYCOEM-SIZ-2013",url:"https://data.cityofnewyork.us/dataset/sandy-inundation-zone",vintage:"2013-01",retrieved:"2026-04-28"},c3:{id:"c3",n:3,tier:"empirical",source:"FloodNet NYC",title:"Sensor BK-RH-002 — Coffey Park, monthly exceedance",docId:"FN-BK-RH-002",url:"https://floodnet.nyc/sensor/BK-RH-002",vintage:"2026-04",retrieved:"2026-05-02"},c4:{id:"c4",n:4,tier:"modeled",source:"FEMA",title:"Preliminary Flood Insurance Rate Map, panel 36047C0207G",docId:"FEMA-FIRM-36047C0207G",url:"https://msc.fema.gov/portal/search",vintage:"2024-09",retrieved:"2026-04-28"},c5:{id:"c5",n:5,tier:"modeled",source:"NYC DEP",title:"Stormwater Flood Map — Moderate Stormwater Scenario",docId:"NYCDEP-SWFM-2024",url:"https://nyc.gov/stormwater-map",vintage:"2024-06",retrieved:"2026-04-28"},c6:{id:"c6",n:6,tier:"modeled",source:"NPCC4",title:"Sea-level rise projections, 2050 90th percentile",docId:"NPCC4-Ch3-Tbl3.2",url:"https://nyas.org/npcc4",vintage:"2024-03",retrieved:"2026-04-28"},c7:{id:"c7",n:7,tier:"proxy",source:"NYC 311",title:"Flooding service requests, BK CB6 2019–2025",docId:"NYC311-FLD-CB6",url:"https://data.cityofnewyork.us/311",vintage:"2025-12",retrieved:"2026-05-01"},c8:{id:"c8",n:8,tier:"proxy",source:"FEMA NFIP",title:"National Flood Insurance Program claims, tract 36047008500",docId:"NFIP-T36047008500",url:"https://www.fema.gov/openfema",vintage:"2024-12",retrieved:"2026-04-28"},c9:{id:"c9",n:9,tier:"synthetic",source:"TerraMind v1.2",title:"Synthetic SAR backscatter for 2025-09-14 (Sentinel-1 cloud-occluded)",docId:"RIPRAP-SYN-20250914",url:"#methodology-synthetic",vintage:"2025-09",retrieved:"2026-05-02"},c10:{id:"c10",n:10,tier:"modeled",source:"NYC DCP",title:"Waterfront Revitalization Program — Coastal Risk Area",docId:"NYCDCP-WRP-2022",url:"https://nyc.gov/dcp/wrp",vintage:"2022-11",retrieved:"2026-04-28"}},x=[{kind:"status",html:'<p class="briefing-deck"><strong>80 Pioneer Street, Red Hook, Brooklyn 11231.</strong> Block 597, Lot 30. Industrial Business Zone (IBZ-RH). Queried 2026-05-02 14:22 ET. <span class="briefing-meta">Briefing v0.4.2 · 9 specialists fired · 1 silent (TidalGauge: out of range)</span></p>'},{kind:"head",n:"01",label:"Status",title:"Coastal-edge, post-Sandy, multi-hazard"},{kind:"prose",parts:[{tier:"empirical",text:"The address sits 380 ft inland of the Erie Basin bulkhead, at a ground elevation of 6.2 ft NAVD88",cite:"c1"},{text:" — within the "},{tier:"empirical",text:"2012 Sandy Inundation Zone, which recorded a peak storm tide of 11.4 ft NAVD88 at the Battery",cite:"c2"},{text:" 2.4 mi to the northwest. "},{tier:"modeled",text:"FEMA's preliminary FIRM places the parcel in Zone AE (BFE 11 ft NAVD88)",cite:"c4"},{text:", a 4.8 ft freeboard above current grade. The site is upgradient of two FloodNet sensors and three blocks from a chronic 311 cluster."}]},{kind:"head",n:"02",label:"Empirical evidence",tier:"empirical"},{kind:"prose",parts:[{tier:"empirical",text:"FloodNet sensor BK-RH-002 (Coffey Park, 1,200 ft south) recorded 7 above-curb events between 2024-06 and 2026-04",cite:"c3"},{text:", with a peak depth of 14.3 cm during the 2025-09-29 nor'easter. "},{tier:"empirical",text:"USGS post-Sandy high-water marks within 500 ft cluster between 6.8 and 8.1 ft NAVD88",cite:"c1"},{text:", consistent with 0.6–1.9 ft of standing water at the queried address during the storm."}]},{kind:"head",n:"03",label:"Modeled scenarios",tier:"modeled"},{kind:"prose",parts:[{tier:"modeled",text:"DEP's Moderate Stormwater Scenario (2.13 in/hr design storm) shows ponding ≥4 in across the western half of the lot",cite:"c5"},{text:", routed by the 1.2% slope toward Imlay St. "},{tier:"modeled",text:"Under NPCC4's 2050 90th-percentile sea-level rise (30 in)",cite:"c6"},{text:", the parcel falls within the projected daily-tidal floodplain by mid-century. "},{tier:"synthetic",text:"Synthetic SAR backscatter for 2025-09-14 (Sentinel-1 cloud-occluded) was generated by TerraMind v1.2 and is presented as a prior, not an observation",cite:"c9"},{text:"; treat with appropriate caution."}]},{kind:"head",n:"04",label:"Policy context"},{kind:"prose",parts:[{tier:"proxy",text:"311 flood complaints within the surrounding census tract total 89 calls over 2019–2025, with seasonal clustering in Aug–Oct",cite:"c7"},{text:". "},{tier:"proxy",text:"NFIP claims aggregated to tract 36047008500 total $4.1M across 47 paid losses since 2000",cite:"c8"},{text:". "},{tier:"modeled",text:"The site lies within the NYC Waterfront Revitalization Program Coastal Risk Area; CEQR §817 review applies to any discretionary action",cite:"c10"},{text:"."}]}],ce={wallSeconds:14,cacheHit:.92,cards:[{id:"fc-fema",stone:"cornerstone",tier:"modeled",variant:"headline",source:"FEMA",agency:"Federal Emergency Management Agency",vintage:"2024-09",title:"Preliminary FIRM, panel 36047C0207G",headline:"Zone AE",subhead:"BFE 11 ft NAVD88 · freeboard +4.8 ft",body:"Address sits within the regulatory 1% annual-chance floodplain. Base Flood Elevation 11.0 ft NAVD88; first floor must be at or above this datum for NFIP rating.",docId:"FEMA-FIRM-36047C0207G",citeId:"c4",mapLayer:"fema-ae"},{id:"fc-hwm",stone:"cornerstone",tier:"empirical",variant:"tabular",source:"USGS",agency:"U.S. Geological Survey",vintage:"2013-05",title:"Post-Sandy high-water marks within 500 ft",columns:["id","elev.","dist."],rows:[["HWM-NY-3081","7.4 ft NAVD88","0.18 mi"],["HWM-NY-3082","8.1 ft NAVD88","0.22 mi"],["HWM-NY-3105","6.8 ft NAVD88","0.31 mi"]],sub:"3 marks · max 8.1 ft · surveyed Nov 2012",docId:"USGS-OFR-2013-1234",citeId:"c1",mapLayer:"hwm"},{id:"fc-stormwater",stone:"cornerstone",tier:"modeled",variant:"raster",source:"NYC DEP",agency:"NYC Dept. of Environmental Protection",vintage:"2024-06",title:"Stormwater Flood Map · moderate scenario",rasterKind:"stormwater",sub:"2.13 in/hr · ponding ≥4 in W half of lot · routed toward Imlay St",docId:"NYCDEP-SWFM-2024",citeId:"c5",mapLayer:"stormwater"},{id:"fc-register-rh",stone:"keystone",tier:"empirical",variant:"register",source:"NYC OpenData",agency:"NYC OpenData · multi-agency join",vintage:"2026-05",title:"Nearby exposed assets",registers:[{reg:"MTA",tier:"empirical",label:"Smith–9 St subway entrance",detail:"0.34 mi · F · G",sourceId:"MTA-ENT-N048",vintage:"2025-11",note:null},{reg:"NYCHA",tier:"empirical",label:"Red Hook East Houses",detail:"0.41 mi · 2,878 res.",sourceId:"NYCHA-RHE",vintage:"2025-Q3",note:null},{reg:"NYCHA",tier:"empirical",label:"Red Hook West Houses",detail:"0.52 mi · 3,142 res.",sourceId:"NYCHA-RHW",vintage:"2025-Q3",note:null},{reg:"DOE",tier:"empirical",label:"PS 27 Agnes Y. Humphrey",detail:"0.29 mi · 271 K-5",sourceId:"DOE-K027",vintage:"2024-25",note:null},{reg:"DOH",tier:"empirical",label:null,detail:null,sourceId:null,vintage:null,note:"no acute-care hospital within 1.0 mi (silent)"},{reg:"PLUTO",tier:"empirical",label:"Lot 36047 / 521 / 7",detail:"BIN 3018472 · MX-1",sourceId:"PLUTO-2024v2",vintage:"2024-12",note:null}],sub:"5 of 6 registers fired · 1 silent · joined within 1.0 mi",docId:"RIPRAP-EXP-RH80",citeId:"c-reg-rh",mapLayer:"registers"},{id:"fc-floodnet",stone:"touchstone",tier:"empirical",variant:"spark",source:"FloodNet",agency:"FloodNet NYC sensor network",vintage:"2026-04",title:"Sensor BK-RH-002, monthly above-curb events",headline:"7 events",subhead:"Jun 2024 → Apr 2026 · peak 14.3 cm",spark:[0,0,1,0,2,1,0,0,3,0,1,0,0,0,2,1,0,0,1,0,2,4,1,1],sparkSub:"Sensor located 0.21 mi N at Coffey & Van Brunt. Above-curb depth in cm; events ≥2 cm.",docId:"FN-BK-RH-002",citeId:"c3",mapLayer:"floodnet"},{id:"fc-311",stone:"touchstone",tier:"proxy",variant:"histogram",source:"NYC 311",agency:"NYC 311 service requests",vintage:"2025-12",title:"Recent 311 flood complaints, BK CB6",headline:"89 calls",subhead:"2019–2025 · seasonal cluster Aug–Oct",histogram:[3,2,1,0,1,4,7,12,18,11,5,3,4,2,1,0,2,3,8,9,4,2,1,0],sparkSub:"Filtered to complaint types: Sewer (Backup), Street Flooding, Catch Basin Clogged. Within 200 m of address.",docId:"NYC311-FLD-CB6",citeId:"c7",mapLayer:"complaints"},{id:"fc-prithvi-pluvial",stone:"touchstone",tier:"modeled",variant:"raster-pred",source:"Prithvi-NYC-Pluvial",agency:"NASA-IBM Prithvi v2 · NYC fine-tune",vintage:"2026-05-02 · Sentinel-2",title:"Pluvial flood prediction · Prithvi-NYC-Pluvial",rasterKind:"prithvi",headline:"0.3% flooded",subhead:"no flooding apparent · scene 2026-05-02",sub:"Model interpretation of imagery, not real-time observation. Confidence-mean 0.84 across non-flooded pixels.",docId:"PRITHVI-NYC-PLUV-V2-20260502",citeId:"c-prithvi",illustrative:!0,mapLayer:"prithvi-pluvial"},{id:"fc-terramind-lulc",stone:"touchstone",tier:"synthetic",variant:"lulc",source:"TerraMind v1.2",agency:"IBM TerraMind v1.2 · Sentinel-2 inputs",vintage:"Sentinel-2 · 2024-09-18",title:"Land use / land cover · TerraMind v1.2",rasterKind:"lulc",classMix:[{k:"urban",pct:62,color:"#C66"},{k:"water",pct:18,color:"#5B7FB4"},{k:"vegetation",pct:12,color:"#5B8A4A"},{k:"barren",pct:6,color:"#A89A78"},{k:"wetland",pct:2,color:"#D9C75A"}],sub:"Synthetic prior. LULC palette is a layer convention, not a tier signal.",docId:"TERRAMIND-LULC-20240918",citeId:"c-tm-lulc",illustrative:!0,mapLayer:"terramind-lulc"},{id:"fc-nws",stone:"touchstone",tier:"empirical",variant:"scalars",source:"NWS KNYC",agency:"NOAA · National Weather Service",vintage:"2026-05-05",title:"Current weather, station KNYC",scalars:[{value:"0.02 in",label:"precip · last 24h"},{value:"67°F",label:"temp · current"},{value:"PC",label:"conditions"}],sub:"Observation timestamp 2026-05-05 14:18 ET. Central Park station; not point-of-query.",docId:"NWS-KNYC",citeId:"c-nws",mapLayer:"nws"},{id:"fc-ttm-surge",stone:"lodestone",tier:"modeled",variant:"timeseries",source:"Granite TTM r2 (zero-shot)",agency:"IBM Granite-TimeSeries · regional",vintage:"2026-05-05 12:00 ET",title:"Storm surge nowcast at The Battery — 9.6 h horizon (regional)",timeseries:{hours:96,peak:{x:38,y:47},peakLabel:"+47 cm @ +38h"},headline:"+47 cm",subhead:"peak surge residual · 9.6h horizon · 6-min cadence",sub:"Regional disclosure. Nowcast applies city-wide via NOAA station 8518750. Distinct from the fine-tuned Battery surge nowcast.",spatialNote:"regional · The Battery, not point-of-query",docId:"ttm_battery_surge_zeroshot",citeId:"c-ttm",mapLayer:null},{id:"fc-ttm-surge-ft",stone:"lodestone",tier:"modeled",variant:"timeseries-ft",source:"msradam/Granite-TTM-r2-Battery-Surge",agency:"Granite TTM r2 · NYC-specialized fine-tune",vintage:"2026-05-05 12:00 ET",title:"Storm surge nowcast at The Battery — 96 h horizon (NYC-specialized fine-tune)",timeseries:{hours:96,peak:{x:38,y:53},peakLabel:"+53 cm @ +38h"},headline:"+53 cm",subhead:"peak surge · 96h horizon · hourly cadence",sub:"Fine-tuned on NYC tide-gauge history. Trained on AMD MI300X.",spatialNote:"regional · The Battery, not point-of-query",docId:"ttm_battery_surge_finetune",citeId:"c-ttm-ft",mapLayer:null,hfModelCard:"huggingface.co/msradam/Granite-TTM-r2-Battery-Surge",rmse:"0.157 m",skillVsPersistence:"−35% vs persistence",hardwareBadge:"MI300X"},{id:"fc-npcc4",stone:"lodestone",tier:"modeled",variant:"forecast",source:"NPCC4",agency:"NYC Panel on Climate Change, 4th Assessment",vintage:"2024-03",title:"Sea-level rise projections, Lower NY Harbor",forecast:[{year:2030,low:4,mid:6,high:9},{year:2050,low:13,mid:22,high:30},{year:2080,low:28,mid:49,high:75},{year:2100,low:38,mid:71,high:114}],sub:"inches MSL · 17th–83rd %ile range, median line. Battery tide-gauge baseline.",docId:"NPCC4-Ch3-Tbl3.2",citeId:"c6",mapLayer:null},{id:"fc-mellea-meta",stone:"capstone",tier:"modeled",variant:"meta",source:"Mellea",agency:"Capstone synthesis · grounding check",vintage:"2026-05-05 14:22 ET",title:"Briefing reconciliation",metaRows:[{k:"mellea reroll",v:"1 reroll"},{k:"grounding checks",v:"4/4 passed"},{k:"citations resolved",v:"4"},{k:"wall-clock",v:"24.0 s"}],sub:"Capstone produces prose, not cards. This meta-card summarizes the reconciler chain that wrote the four-section briefing above.",docId:"RIPRAP-CAP-RH80",citeId:null,mapLayer:null}],stones:[{key:"cornerstone",members:[{id:"CORN-001",name:"sandy_inundation",status:"fired",tier:"empirical",ms:412},{id:"CORN-002",name:"dep_stormwater",status:"fired",tier:"modeled",ms:540},{id:"CORN-003",name:"ida_hwm_2021",status:"fired",tier:"empirical",ms:612},{id:"CORN-004",name:"prithvi_eo_v2",status:"fired",tier:"modeled",ms:980},{id:"CORN-005",name:"microtopo_lidar",status:"fired",tier:"proxy",ms:1240}]},{key:"keystone",members:[{id:"KEY-001",name:"mta_entrance_exposure",status:"silent_by_design",tier:"empirical",ms:30,note:"no entrances within radius"},{id:"KEY-002",name:"nycha_development_exposure",status:"silent_by_design",tier:"empirical",ms:28,note:"no NYCHA developments within 1.0 mi"},{id:"KEY-003",name:"doe_school_exposure",status:"silent_by_design",tier:"empirical",ms:24,note:"no DOE schools within 1.0 mi"},{id:"KEY-004",name:"doh_hospital_exposure",status:"silent_by_design",tier:"empirical",ms:22,note:"no acute-care hospitals within 1.0 mi"}]},{key:"touchstone",members:[{id:"TCH-001",name:"floodnet",status:"fired",tier:"empirical",ms:285},{id:"TCH-002",name:"nyc311",status:"fired",tier:"proxy",ms:410},{id:"TCH-003",name:"nws_obs",status:"fired",tier:"empirical",ms:240},{id:"TCH-004",name:"noaa_tides",status:"fired",tier:"empirical",ms:196},{id:"TCH-005",name:"prithvi_eo_live",status:"fired",tier:"modeled",ms:4920},{id:"TCH-006",name:"terramind_lulc",status:"fired",tier:"synthetic",ms:2100}]},{key:"lodestone",members:[{id:"LOD-001",name:"nws_alerts",status:"fired",tier:"modeled",ms:110},{id:"LOD-002",name:"ttm_forecast",status:"fired",tier:"modeled",ms:1500},{id:"LOD-003",name:"ttm_battery_surge",status:"fired",tier:"modeled",ms:1480},{id:"LOD-004",name:"floodnet_forecast",status:"silent_by_design",tier:"modeled",ms:14,note:"sensor has only 2 historical events; forecast omitted (silent-floor: 5)"},{id:"LOD-005",name:"ttm_311_forecast",status:"errored",tier:"modeled",ms:0,note:"311 history fetch failed: HTTP 503 at NYC OpenData (3 retries)"}]},{key:"capstone",members:[{id:"CAP-001",name:"rag_granite_embedding",status:"fired",tier:"proxy",ms:410},{id:"CAP-002",name:"gliner_extract",status:"fired",tier:"proxy",ms:280},{id:"CAP-003",name:"reconcile_granite41",status:"fired",tier:"modeled",ms:6240}]}].map(a=>({key:a.key,members:re(a.key,a.members)}))};var me=q('<section class="hero-band"><div class="hero-band-inner"><div class="app-shell-top is-desktop"><main id="region-briefing" class="app-region app-region-brief" aria-labelledby="brief-h1"><header class="region-head"><span class="section-label">Briefing</span> <button type="button" class="region-action" aria-label="Replay streaming">↻ replay stream</button></header> <h1 id="brief-h1" class="brief-h1">Flood-exposure briefing <span class="brief-h1-addr"> </span></h1> <!></main> <div class="app-region-side" style="grid-area: side;"><aside id="region-map" class="app-region app-region-map" aria-label="Map region"><header class="region-head"><span class="section-label">Map</span> <span class="region-head-meta">Carto Positron · z15 · 40.6776°N 74.0096°W</span></header> <div style="position: relative; flex: 1; min-height: 0;"><!> <!></div></aside> <aside id="region-cites" class="app-region app-region-cites" aria-label="Citations"><!></aside></div></div> <div class="app-shell-bottom"><section class="app-region app-region-findings" aria-label="Findings"><!></section></div></div></section>');function ye(a,T){Z(T,!0);let c=l(null),F="comfortable",B="smart",b=l(!1);X(()=>{typeof window<"u"&&d(b,new URL(window.location.href).searchParams.get("grammar")==="1")});function Y(o){d(c,o,!0)}function E(o){const s=document.getElementById("region-cites");s&&s.scrollIntoView({behavior:"smooth",block:"start"})}let n=l(Q({empirical:!0,modeled:!0,synthetic:!0,proxy:!0})),m=l(0);J(()=>(de({queryId:"sample",queryText:R,intent:"single_address",specialists:9,blocks:x,citations:y,generatedAt:new Date().toISOString(),attempts:1}),M.markReady(),()=>M.reset()));const L={label:"80 Pioneer St",lat:40.6776,lon:-74.0096},C={type:"FeatureCollection",features:[{type:"Feature",properties:{source:"sample-fixture",tier:"synthetic"},geometry:{type:"Polygon",coordinates:[[[-74.014,40.679],[-74.007,40.68],[-74.005,40.677],[-74.009,40.6755],[-74.014,40.679]]]}}]};var u=me(),N=e(u),p=e(N),h=e(p),g=e(h),D=r(e(g),2);t(g);var v=r(g,2),w=r(e(v)),H=e(w,!0);t(w),t(v);var O=r(v,2);ie(O,{get blocks(){return x},get citations(){return y},streaming:!0,get replayKey(){return i(m)}}),t(h);var I=r(h,2),f=e(I),S=r(e(f),2),k=e(S);ae(k,{get address(){return L},get activeLayers(){return i(n)},get syntheticPrior(){return C},get linkedKey(){return i(c)}});var K=r(k,2);{let o=te(()=>({empirical:0,modeled:0,synthetic:C.features.length,proxy:0}));ne(K,{get active(){return i(n)},get featureCounts(){return i(o)},onToggle:s=>d(n,{...i(n),[s]:!i(n)[s]},!0)})}t(S),t(f);var _=r(f,2),G=e(_);se(G,{get citations(){return y}}),t(_),t(I),t(p);var P=r(p,2),A=e(P),W=e(A);oe(W,{get data(){return ce},density:F,provenanceMode:B,get showGrammar(){return i(b)},get linkedKey(){return i(c)},onLink:Y,onCite:E}),t(A),t(P),t(N),t(u),$(()=>j(H,R)),V("click",D,()=>d(m,i(m)+1)),U(a,u),ee()}z(["click"]);export{ye as component,fe as universal};
|
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{d as V,b as U,a as j,f as q,s as z}from"../chunks/Dlpu43Tj.js";import{p as Z,K as Q,l as s,j as d,L as J,G as X,t as $,a as ee,s as i,c as e,k as a,r as t,J as te}from"../chunks/DwbuJhNu.js";import{B as ie}from"../chunks/Cl16PtNL.js";import{R as ae,M as re,C as oe,F as ne}from"../chunks/CAli5X_k.js";import{p as se,b as R}from"../chunks/DNaFzQeI.js";const de=!0,ve=Object.freeze(Object.defineProperty({__proto__:null,prerender:de},Symbol.toStringTag,{value:"Module"})),E="80 Pioneer Street · Red Hook · Brooklyn",v={c1:{id:"c1",n:1,tier:"empirical",source:"USGS",title:"Hurricane Sandy storm tide elevations, NY-NJ Harbor",docId:"USGS-OFR-2013-1234",url:"https://pubs.usgs.gov/of/2013/1234/",vintage:"2013-05",retrieved:"2026-04-28"},c2:{id:"c2",n:2,tier:"empirical",source:"NYC OEM",title:"Hurricane Sandy Inundation Zone (2012)",docId:"NYCOEM-SIZ-2013",url:"https://data.cityofnewyork.us/dataset/sandy-inundation-zone",vintage:"2013-01",retrieved:"2026-04-28"},c3:{id:"c3",n:3,tier:"empirical",source:"FloodNet NYC",title:"Sensor BK-RH-002 — Coffey Park, monthly exceedance",docId:"FN-BK-RH-002",url:"https://floodnet.nyc/sensor/BK-RH-002",vintage:"2026-04",retrieved:"2026-05-02"},c4:{id:"c4",n:4,tier:"modeled",source:"FEMA",title:"Preliminary Flood Insurance Rate Map, panel 36047C0207G",docId:"FEMA-FIRM-36047C0207G",url:"https://msc.fema.gov/portal/search",vintage:"2024-09",retrieved:"2026-04-28"},c5:{id:"c5",n:5,tier:"modeled",source:"NYC DEP",title:"Stormwater Flood Map — Moderate Stormwater Scenario",docId:"NYCDEP-SWFM-2024",url:"https://nyc.gov/stormwater-map",vintage:"2024-06",retrieved:"2026-04-28"},c6:{id:"c6",n:6,tier:"modeled",source:"NPCC4",title:"Sea-level rise projections, 2050 90th percentile",docId:"NPCC4-Ch3-Tbl3.2",url:"https://nyas.org/npcc4",vintage:"2024-03",retrieved:"2026-04-28"},c7:{id:"c7",n:7,tier:"proxy",source:"NYC 311",title:"Flooding service requests, BK CB6 2019–2025",docId:"NYC311-FLD-CB6",url:"https://data.cityofnewyork.us/311",vintage:"2025-12",retrieved:"2026-05-01"},c8:{id:"c8",n:8,tier:"proxy",source:"FEMA NFIP",title:"National Flood Insurance Program claims, tract 36047008500",docId:"NFIP-T36047008500",url:"https://www.fema.gov/openfema",vintage:"2024-12",retrieved:"2026-04-28"},c9:{id:"c9",n:9,tier:"synthetic",source:"TerraMind v1.2",title:"Synthetic SAR backscatter for 2025-09-14 (Sentinel-1 cloud-occluded)",docId:"RIPRAP-SYN-20250914",url:"#methodology-synthetic",vintage:"2025-09",retrieved:"2026-05-02"},c10:{id:"c10",n:10,tier:"modeled",source:"NYC DCP",title:"Waterfront Revitalization Program — Coastal Risk Area",docId:"NYCDCP-WRP-2022",url:"https://nyc.gov/dcp/wrp",vintage:"2022-11",retrieved:"2026-04-28"}},M=[{kind:"status",html:'<p class="briefing-deck"><strong>80 Pioneer Street, Red Hook, Brooklyn 11231.</strong> Block 597, Lot 30. Industrial Business Zone (IBZ-RH). Queried 2026-05-02 14:22 ET. <span class="briefing-meta">Briefing v0.4.2 · 9 specialists fired · 1 silent (TidalGauge: out of range)</span></p>'},{kind:"head",n:"01",label:"Status",title:"Coastal-edge, post-Sandy, multi-hazard"},{kind:"prose",parts:[{tier:"empirical",text:"The address sits 380 ft inland of the Erie Basin bulkhead, at a ground elevation of 6.2 ft NAVD88",cite:"c1"},{text:" — within the "},{tier:"empirical",text:"2012 Sandy Inundation Zone, which recorded a peak storm tide of 11.4 ft NAVD88 at the Battery",cite:"c2"},{text:" 2.4 mi to the northwest. "},{tier:"modeled",text:"FEMA's preliminary FIRM places the parcel in Zone AE (BFE 11 ft NAVD88)",cite:"c4"},{text:", a 4.8 ft freeboard above current grade. The site is upgradient of two FloodNet sensors and three blocks from a chronic 311 cluster."}]},{kind:"head",n:"02",label:"Empirical evidence",tier:"empirical"},{kind:"prose",parts:[{tier:"empirical",text:"FloodNet sensor BK-RH-002 (Coffey Park, 1,200 ft south) recorded 7 above-curb events between 2024-06 and 2026-04",cite:"c3"},{text:", with a peak depth of 14.3 cm during the 2025-09-29 nor'easter. "},{tier:"empirical",text:"USGS post-Sandy high-water marks within 500 ft cluster between 6.8 and 8.1 ft NAVD88",cite:"c1"},{text:", consistent with 0.6–1.9 ft of standing water at the queried address during the storm."}]},{kind:"head",n:"03",label:"Modeled scenarios",tier:"modeled"},{kind:"prose",parts:[{tier:"modeled",text:"DEP's Moderate Stormwater Scenario (2.13 in/hr design storm) shows ponding ≥4 in across the western half of the lot",cite:"c5"},{text:", routed by the 1.2% slope toward Imlay St. "},{tier:"modeled",text:"Under NPCC4's 2050 90th-percentile sea-level rise (30 in)",cite:"c6"},{text:", the parcel falls within the projected daily-tidal floodplain by mid-century. "},{tier:"synthetic",text:"Synthetic SAR backscatter for 2025-09-14 (Sentinel-1 cloud-occluded) was generated by TerraMind v1.2 and is presented as a prior, not an observation",cite:"c9"},{text:"; treat with appropriate caution."}]},{kind:"head",n:"04",label:"Policy context"},{kind:"prose",parts:[{tier:"proxy",text:"311 flood complaints within the surrounding census tract total 89 calls over 2019–2025, with seasonal clustering in Aug–Oct",cite:"c7"},{text:". "},{tier:"proxy",text:"NFIP claims aggregated to tract 36047008500 total $4.1M across 47 paid losses since 2000",cite:"c8"},{text:". "},{tier:"modeled",text:"The site lies within the NYC Waterfront Revitalization Program Coastal Risk Area; CEQR §817 review applies to any discretionary action",cite:"c10"},{text:"."}]}],le={wallSeconds:14,cacheHit:.92,cards:[{id:"fc-fema",stone:"cornerstone",tier:"modeled",variant:"headline",source:"FEMA",agency:"Federal Emergency Management Agency",vintage:"2024-09",title:"Preliminary FIRM, panel 36047C0207G",headline:"Zone AE",subhead:"BFE 11 ft NAVD88 · freeboard +4.8 ft",body:"Address sits within the regulatory 1% annual-chance floodplain. Base Flood Elevation 11.0 ft NAVD88; first floor must be at or above this datum for NFIP rating.",docId:"FEMA-FIRM-36047C0207G",citeId:"c4",mapLayer:"fema-ae"},{id:"fc-hwm",stone:"cornerstone",tier:"empirical",variant:"tabular",source:"USGS",agency:"U.S. Geological Survey",vintage:"2013-05",title:"Post-Sandy high-water marks within 500 ft",columns:["id","elev.","dist."],rows:[["HWM-NY-3081","7.4 ft NAVD88","0.18 mi"],["HWM-NY-3082","8.1 ft NAVD88","0.22 mi"],["HWM-NY-3105","6.8 ft NAVD88","0.31 mi"]],sub:"3 marks · max 8.1 ft · surveyed Nov 2012",docId:"USGS-OFR-2013-1234",citeId:"c1",mapLayer:"hwm"},{id:"fc-stormwater",stone:"cornerstone",tier:"modeled",variant:"raster",source:"NYC DEP",agency:"NYC Dept. of Environmental Protection",vintage:"2024-06",title:"Stormwater Flood Map · moderate scenario",rasterKind:"stormwater",sub:"2.13 in/hr · ponding ≥4 in W half of lot · routed toward Imlay St",docId:"NYCDEP-SWFM-2024",citeId:"c5",mapLayer:"stormwater"},{id:"fc-register-rh",stone:"keystone",tier:"empirical",variant:"register",source:"NYC OpenData",agency:"NYC OpenData · multi-agency join",vintage:"2026-05",title:"Nearby exposed assets",registers:[{reg:"MTA",tier:"empirical",label:"Smith–9 St subway entrance",detail:"0.34 mi · F · G",sourceId:"MTA-ENT-N048",vintage:"2025-11",note:null},{reg:"NYCHA",tier:"empirical",label:"Red Hook East Houses",detail:"0.41 mi · 2,878 res.",sourceId:"NYCHA-RHE",vintage:"2025-Q3",note:null},{reg:"NYCHA",tier:"empirical",label:"Red Hook West Houses",detail:"0.52 mi · 3,142 res.",sourceId:"NYCHA-RHW",vintage:"2025-Q3",note:null},{reg:"DOE",tier:"empirical",label:"PS 27 Agnes Y. Humphrey",detail:"0.29 mi · 271 K-5",sourceId:"DOE-K027",vintage:"2024-25",note:null},{reg:"DOH",tier:"empirical",label:null,detail:null,sourceId:null,vintage:null,note:"no acute-care hospital within 1.0 mi (silent)"},{reg:"PLUTO",tier:"empirical",label:"Lot 36047 / 521 / 7",detail:"BIN 3018472 · MX-1",sourceId:"PLUTO-2024v2",vintage:"2024-12",note:null}],sub:"5 of 6 registers fired · 1 silent · joined within 1.0 mi",docId:"RIPRAP-EXP-RH80",citeId:"c-reg-rh",mapLayer:"registers"},{id:"fc-floodnet",stone:"touchstone",tier:"empirical",variant:"spark",source:"FloodNet",agency:"FloodNet NYC sensor network",vintage:"2026-04",title:"Sensor BK-RH-002, monthly above-curb events",headline:"7 events",subhead:"Jun 2024 → Apr 2026 · peak 14.3 cm",spark:[0,0,1,0,2,1,0,0,3,0,1,0,0,0,2,1,0,0,1,0,2,4,1,1],sparkSub:"Sensor located 0.21 mi N at Coffey & Van Brunt. Above-curb depth in cm; events ≥2 cm.",docId:"FN-BK-RH-002",citeId:"c3",mapLayer:"floodnet"},{id:"fc-311",stone:"touchstone",tier:"proxy",variant:"histogram",source:"NYC 311",agency:"NYC 311 service requests",vintage:"2025-12",title:"Recent 311 flood complaints, BK CB6",headline:"89 calls",subhead:"2019–2025 · seasonal cluster Aug–Oct",histogram:[3,2,1,0,1,4,7,12,18,11,5,3,4,2,1,0,2,3,8,9,4,2,1,0],sparkSub:"Filtered to complaint types: Sewer (Backup), Street Flooding, Catch Basin Clogged. Within 200 m of address.",docId:"NYC311-FLD-CB6",citeId:"c7",mapLayer:"complaints"},{id:"fc-prithvi",stone:"touchstone",tier:"modeled",variant:"raster-pred",source:"Prithvi-NYC",agency:"Prithvi-NYC-Pluvial v2 · IBM/NASA × Riprap",vintage:"2026-05-02",title:"Pluvial flood prediction, current Sentinel-2 chip",rasterKind:"prithvi",headline:"0.3% flooded",subhead:"no flooding apparent · scene 2026-05-02",sub:"Model interpretation of imagery, not real-time observation. Confidence-mean 0.84 across non-flooded pixels.",docId:"PRITHVI-NYC-PLUV-V2-20260502",citeId:"c-prithvi",illustrative:!0,mapLayer:"prithvi"},{id:"fc-nws",stone:"touchstone",tier:"empirical",variant:"scalars",source:"NWS KNYC",agency:"NOAA · National Weather Service",vintage:"2026-05-05",title:"Current weather, station KNYC",scalars:[{value:"0.02 in",label:"precip · last 24h"},{value:"67°F",label:"temp · current"},{value:"PC",label:"conditions"}],sub:"Observation timestamp 2026-05-05 14:18 ET. Central Park station; not point-of-query.",docId:"NWS-KNYC",citeId:"c-nws",mapLayer:"nws"},{id:"fc-ttm-surge",stone:"lodestone",tier:"modeled",variant:"timeseries",source:"Granite TTM r2",agency:"IBM Granite-TimeSeries · Riprap fine-tune",vintage:"2026-05-05 12:00 ET",title:"Storm surge nowcast at The Battery, 96-hour horizon",timeseries:{hours:96,peak:{x:38,y:47},peakLabel:"+47 cm @ +38h"},headline:"+47 cm",subhead:"peak surge residual · Wed 04:00 ET",sub:"Nowcast applies city-wide via NOAA station 8518750. Not localized to query address. Residual above harmonic tide.",spatialNote:"regional · The Battery, not point-of-query",docId:"ttm_battery_surge_v2",citeId:"c-ttm",mapLayer:null},{id:"fc-npcc4",stone:"lodestone",tier:"modeled",variant:"forecast",source:"NPCC4",agency:"NYC Panel on Climate Change, 4th Assessment",vintage:"2024-03",title:"Sea-level rise projections, Lower NY Harbor",forecast:[{year:2030,low:4,mid:6,high:9},{year:2050,low:13,mid:22,high:30},{year:2080,low:28,mid:49,high:75},{year:2100,low:38,mid:71,high:114}],sub:"inches MSL · 17th–83rd %ile range, median line. Battery tide-gauge baseline.",docId:"NPCC4-Ch3-Tbl3.2",citeId:"c6",mapLayer:null},{id:"fc-mellea-meta",stone:"capstone",tier:"modeled",variant:"meta",source:"Mellea",agency:"Capstone synthesis · grounding check",vintage:"2026-05-05 14:22 ET",title:"Briefing reconciliation",metaRows:[{k:"Mellea reroll",v:"1 attempt"},{k:"Grounding checks",v:"4 / 4 passed"},{k:"Citations resolved",v:"11 / 11"},{k:"RAG → GLiNER",v:"9 entities · 0 unresolved"}],sub:"Capstone produces prose, not cards. This meta-card summarizes the reconciler chain that wrote the four-section briefing above.",docId:"RIPRAP-CAP-RH80",citeId:null,mapLayer:null}],stones:[{key:"cornerstone",members:[{id:"CORN-001",name:"pull FEMA NFHL panel 36047C0207G",status:"ok",tier:"modeled",ms:412},{id:"CORN-002",name:"parse panel index for AE / VE bands",status:"ok",tier:"modeled",ms:88},{id:"CORN-003",name:"USGS STN: post-Sandy HWM survey within 500 ft",status:"ok",tier:"empirical",ms:612},{id:"CORN-004",name:"NYC DEP stormwater flood map 2024",status:"ok",tier:"modeled",ms:980},{id:"CORN-005",name:"microtopo: 3DEP DEM + HAND + TWI",status:"ok",tier:"proxy",ms:1240}]},{key:"keystone",members:[{id:"KEY-001",name:"MTA subway entrance proximity",status:"ok",tier:"empirical",ms:220},{id:"KEY-002",name:"NYCHA developments in 1 mi",status:"ok",tier:"empirical",ms:410},{id:"KEY-003",name:"DOE schools in 1 mi",status:"ok",tier:"empirical",ms:360},{id:"KEY-004",name:"NYS DOH hospitals in 1 mi",status:"silent",tier:"empirical",ms:95,note:"no acute-care within 1 mi"},{id:"KEY-005",name:"PLUTO BBL fetch",status:"ok",tier:"empirical",ms:130}]},{key:"touchstone",members:[{id:"TCH-001",name:"FloodNet sensor lookup",status:"ok",tier:"empirical",ms:285},{id:"TCH-002",name:"NYC 311 flood complaints",status:"ok",tier:"proxy",ms:410},{id:"TCH-003",name:"NWS station KNYC observation",status:"ok",tier:"empirical",ms:240},{id:"TCH-004",name:"NOAA tide gauge water level",status:"ok",tier:"empirical",ms:196},{id:"TCH-005",name:"Prithvi-EO 2.0 NYC-Pluvial v2",status:"ok",tier:"modeled",ms:4920}]},{key:"lodestone",members:[{id:"LOD-001",name:"Granite TTM r2 surge fine-tune",status:"ok",tier:"modeled",ms:1820},{id:"LOD-002",name:"NPCC4 SLR projection table",status:"ok",tier:"modeled",ms:38},{id:"LOD-003",name:"NWS active flood alerts",status:"silent",tier:"modeled",ms:110}]},{key:"capstone",members:[{id:"CAP-001",name:"Granite Embedding RAG retrieval",status:"ok",tier:"proxy",ms:410},{id:"CAP-002",name:"GLiNER typed extraction",status:"ok",tier:"proxy",ms:280},{id:"CAP-003",name:"Granite 4.1 reconcile (Mellea)",status:"ok",tier:"modeled",ms:6240}]}]};var ce=q('<section class="hero-band"><div class="hero-band-inner"><div class="app-shell-top is-desktop"><main id="region-briefing" class="app-region app-region-brief" aria-labelledby="brief-h1"><header class="region-head"><span class="section-label">Briefing</span> <button type="button" class="region-action" aria-label="Replay streaming">↻ replay stream</button></header> <h1 id="brief-h1" class="brief-h1">Flood-exposure briefing <span class="brief-h1-addr"> </span></h1> <!></main> <div class="app-region-side" style="grid-area: side;"><aside id="region-map" class="app-region app-region-map" aria-label="Map region"><header class="region-head"><span class="section-label">Map</span> <span class="region-head-meta">Carto Positron · z15 · 40.6776°N 74.0096°W</span></header> <div style="position: relative; flex: 1; min-height: 0;"><!> <!></div></aside> <aside id="region-cites" class="app-region app-region-cites" aria-label="Citations"><!></aside></div></div> <div class="app-shell-bottom"><section class="app-region app-region-findings" aria-label="Findings"><!></section></div></div></section>');function ye(F,x){Z(x,!0);let y=d(null),Y="comfortable",T="smart",f=d(!1);Q(()=>{typeof window<"u"&&s(f,new URL(window.location.href).searchParams.get("grammar")==="1")});function H(n){s(y,n,!0)}function B(n){const o=document.getElementById("region-cites");o&&o.scrollIntoView({behavior:"smooth",block:"start"})}let r=d(J({empirical:!0,modeled:!0,synthetic:!0,proxy:!0})),l=d(0);X(()=>(se({queryId:"sample",queryText:E,intent:"single_address",specialists:9,blocks:M,citations:v,generatedAt:new Date().toISOString(),attempts:1}),R.markReady(),()=>R.reset()));const L={label:"80 Pioneer St",lat:40.6776,lon:-74.0096},b={type:"FeatureCollection",features:[{type:"Feature",properties:{source:"sample-fixture",tier:"synthetic"},geometry:{type:"Polygon",coordinates:[[[-74.014,40.679],[-74.007,40.68],[-74.005,40.677],[-74.009,40.6755],[-74.014,40.679]]]}}]};var c=ce(),N=e(c),m=e(N),p=e(m),u=e(p),D=i(e(u),2);t(u);var g=i(u,2),C=i(e(g)),O=e(C,!0);t(C),t(g);var G=i(g,2);ie(G,{get blocks(){return M},get citations(){return v},streaming:!0,get replayKey(){return a(l)}}),t(p);var k=i(p,2),h=e(k),S=i(e(h),2),w=e(S);ae(w,{get address(){return L},get activeLayers(){return a(r)},get syntheticPrior(){return b}});var _=i(w,2);{let n=te(()=>({empirical:0,modeled:0,synthetic:b.features.length,proxy:0}));re(_,{get active(){return a(r)},get featureCounts(){return a(n)},onToggle:o=>s(r,{...a(r),[o]:!a(r)[o]},!0)})}t(S),t(h);var I=i(h,2),K=e(I);oe(K,{get citations(){return v}}),t(I),t(k),t(m);var P=i(m,2),A=e(P),W=e(A);ne(W,{get data(){return le},density:Y,provenanceMode:T,get showGrammar(){return a(f)},get linkedKey(){return a(y)},onLink:H,onCite:B}),t(A),t(P),t(N),t(c),$(()=>z(O,E)),U("click",D,()=>s(l,a(l)+1)),j(F,c),ee()}V(["click"]);export{ye as component,ve as universal};
|
|
|
|
|
|
|
@@ -1 +1 @@
|
|
| 1 |
-
{"version":"
|
|
|
|
| 1 |
+
{"version":"1778023076697"}
|
|
@@ -6,40 +6,41 @@
|
|
| 6 |
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
| 7 |
<meta name="description" content="Riprap — citation-grounded NYC flood-exposure briefings." />
|
| 8 |
<title>Riprap — flood-exposure briefing</title>
|
| 9 |
-
<link href="./_app/immutable/entry/start.
|
| 10 |
-
<link href="./_app/immutable/chunks/
|
| 11 |
<link href="./_app/immutable/chunks/DwbuJhNu.js" rel="modulepreload">
|
| 12 |
-
<link href="./_app/immutable/entry/app.
|
| 13 |
<link href="./_app/immutable/chunks/1oGnrPC6.js" rel="modulepreload">
|
| 14 |
<link href="./_app/immutable/chunks/Dlpu43Tj.js" rel="modulepreload">
|
| 15 |
<link href="./_app/immutable/chunks/8F5LpR-T.js" rel="modulepreload">
|
| 16 |
-
<link href="./_app/immutable/nodes/0.
|
| 17 |
<link href="./_app/immutable/chunks/DNaFzQeI.js" rel="modulepreload">
|
| 18 |
-
<link href="./_app/immutable/chunks/
|
| 19 |
<link href="./_app/immutable/chunks/DFFHaukH.js" rel="modulepreload">
|
| 20 |
-
<link href="./_app/immutable/nodes/2.
|
| 21 |
<link href="./_app/immutable/chunks/CBcGqa-S.js" rel="modulepreload">
|
| 22 |
|
| 23 |
-
<link href="./_app/immutable/assets/0.
|
|
|
|
| 24 |
</head>
|
| 25 |
<body data-sveltekit-preload-data="hover">
|
| 26 |
<div style="display: contents"><!--[--><!--[0--><!--[--><!--[0--><a href="#region-briefing" class="skip-link">Skip to briefing</a> <a href="#region-map" class="skip-link" style="left: -9999px;">Skip to map</a> <a href="#region-trace" class="skip-link" style="left: -9999px;">Skip to trace</a><!----> <header class="app-header no-print" data-screen-label="App header"><div class="app-header-inner"><div class="app-header-left"><a href="/" class="riprap-wordmark" aria-label="Riprap home">riprap</a> <span class="app-header-sep">/</span> <span class="app-header-context">flood-exposure briefing</span></div> <div class="app-header-mid"><!--[-1--><!--]--></div> <div class="app-header-right"><a class="app-header-link" href="#methodology">methodology</a> <!--[-1--><!--]--> <span class="app-header-status" aria-live="polite"><span class="app-header-status-dot" aria-hidden="true"></span> live</span></div></div></header><!----><!--]--> <main class="svelte-12qhfyh"><!--[--><section class="hero-band"><div class="hero-band-inner"><section class="cold-start" aria-label="Empty query state"><div class="cold-start-band"><p class="cold-start-deck"><strong>Riprap</strong> is a citation-grounded flood-exposure briefing tool for New York City.
|
| 27 |
Type an address, neighborhood, or proposed development — Riprap returns a written briefing
|
| 28 |
where every numeric claim links to its primary public-record source.</p> <p class="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" class="cold-start-redir">FloodHelpNY</a>.
|
| 29 |
-
For real-time conditions, see <a href="https://www.floodnet.nyc" class="cold-start-redir">FloodNet NYC</a>.</p></div> <form class="cold-start-form" role="search"><label for="riprap-query" class="cold-start-label section-label">Query</label> <div class="cold-start-input-row"><input id="riprap-query" type="text" value="" placeholder="address · neighborhood · proposed development" class="cold-start-input" autocomplete="off"/> <button type="submit" class="cold-start-submit">Generate briefing →</button></div></form> <div class="cold-start-samples"><span class="section-label cold-start-samples-label">Sample queries</span> <div class="cold-start-samples-grid"><!--[--><button type="button" class="cold-start-sample"><span class="cold-start-sample-mode">address</span> <span class="cold-start-sample-q">80 Pioneer Street, Red Hook, Brooklyn</span> <span class="cold-start-sample-sub">Address-mode · Sandy edge · IBZ · NYCHA proximity</span> <span class="cold-start-sample-arrow" aria-hidden="true">↗</span></button><button type="button" class="cold-start-sample"><span class="cold-start-sample-mode">neighborhood</span> <span class="cold-start-sample-q">Far Rockaway flood exposure briefing</span> <span class="cold-start-sample-sub">Neighborhood-mode · chronic stormwater · 2050 SLR</span> <span class="cold-start-sample-arrow" aria-hidden="true">↗</span></button><button type="button" class="cold-start-sample"><span class="cold-start-sample-mode">development</span> <span class="cold-start-sample-q">Hunts Point proposed rezoning — flood-context check</span> <span class="cold-start-sample-sub">Development-check · CEQR §817 · 311 proxy density</span> <span class="cold-start-sample-arrow" aria-hidden="true">↗</span></button><!--]--></div></div> <div class="cold-start-trust"><span class="section-label">How Riprap is built</span> <ul class="cold-start-trust-list"><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" class="cold-start-method-link">Methodology paper →</a></div></section><!----></div></section><!--]--><!----></main> <!--[0--><footer class="app-footer no-print"><div class="app-footer-inner"><p class="app-footer-guard"><strong>Riprap does not predict damage.</strong> This tool is for professional analytical work, not personal property decisions.
|
| 30 |
For residents, see <a href="https://www.floodhelpny.org">FloodHelpNY</a> · <a href="https://www.floodnet.nyc">FloodNet NYC</a>.</p> <p class="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.2 · build 2026-05-03</p></div></footer><!--]--><!--]--><!--]--> <!--[-1--><!--]--><!--]-->
|
| 31 |
|
| 32 |
<script>
|
| 33 |
{
|
| 34 |
-
|
| 35 |
base: new URL(".", location).pathname.slice(0, -1)
|
| 36 |
};
|
| 37 |
|
| 38 |
const element = document.currentScript.parentElement;
|
| 39 |
|
| 40 |
Promise.all([
|
| 41 |
-
import("./_app/immutable/entry/start.
|
| 42 |
-
import("./_app/immutable/entry/app.
|
| 43 |
]).then(([kit, app]) => {
|
| 44 |
kit.start(app, element, {
|
| 45 |
node_ids: [0, 2],
|
|
|
|
| 6 |
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
| 7 |
<meta name="description" content="Riprap — citation-grounded NYC flood-exposure briefings." />
|
| 8 |
<title>Riprap — flood-exposure briefing</title>
|
| 9 |
+
<link href="./_app/immutable/entry/start.CN51yZti.js" rel="modulepreload">
|
| 10 |
+
<link href="./_app/immutable/chunks/BwzbOVaY.js" rel="modulepreload">
|
| 11 |
<link href="./_app/immutable/chunks/DwbuJhNu.js" rel="modulepreload">
|
| 12 |
+
<link href="./_app/immutable/entry/app.CWOfOFvh.js" rel="modulepreload">
|
| 13 |
<link href="./_app/immutable/chunks/1oGnrPC6.js" rel="modulepreload">
|
| 14 |
<link href="./_app/immutable/chunks/Dlpu43Tj.js" rel="modulepreload">
|
| 15 |
<link href="./_app/immutable/chunks/8F5LpR-T.js" rel="modulepreload">
|
| 16 |
+
<link href="./_app/immutable/nodes/0.D8XZI90P.js" rel="modulepreload">
|
| 17 |
<link href="./_app/immutable/chunks/DNaFzQeI.js" rel="modulepreload">
|
| 18 |
+
<link href="./_app/immutable/chunks/B07kFGr7.js" rel="modulepreload">
|
| 19 |
<link href="./_app/immutable/chunks/DFFHaukH.js" rel="modulepreload">
|
| 20 |
+
<link href="./_app/immutable/nodes/2.CiK-Ot3Z.js" rel="modulepreload">
|
| 21 |
<link href="./_app/immutable/chunks/CBcGqa-S.js" rel="modulepreload">
|
| 22 |
|
| 23 |
+
<link href="./_app/immutable/assets/0.MHa9rmVP.css" rel="stylesheet">
|
| 24 |
+
<link href="./_app/immutable/assets/2.BkIzAsIp.css" rel="stylesheet">
|
| 25 |
</head>
|
| 26 |
<body data-sveltekit-preload-data="hover">
|
| 27 |
<div style="display: contents"><!--[--><!--[0--><!--[--><!--[0--><a href="#region-briefing" class="skip-link">Skip to briefing</a> <a href="#region-map" class="skip-link" style="left: -9999px;">Skip to map</a> <a href="#region-trace" class="skip-link" style="left: -9999px;">Skip to trace</a><!----> <header class="app-header no-print" data-screen-label="App header"><div class="app-header-inner"><div class="app-header-left"><a href="/" class="riprap-wordmark" aria-label="Riprap home">riprap</a> <span class="app-header-sep">/</span> <span class="app-header-context">flood-exposure briefing</span></div> <div class="app-header-mid"><!--[-1--><!--]--></div> <div class="app-header-right"><a class="app-header-link" href="#methodology">methodology</a> <!--[-1--><!--]--> <span class="app-header-status" aria-live="polite"><span class="app-header-status-dot" aria-hidden="true"></span> live</span></div></div></header><!----><!--]--> <main class="svelte-12qhfyh"><!--[--><section class="hero-band"><div class="hero-band-inner"><section class="cold-start" aria-label="Empty query state"><div class="cold-start-band"><p class="cold-start-deck"><strong>Riprap</strong> is a citation-grounded flood-exposure briefing tool for New York City.
|
| 28 |
Type an address, neighborhood, or proposed development — Riprap returns a written briefing
|
| 29 |
where every numeric claim links to its primary public-record source.</p> <p class="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" class="cold-start-redir">FloodHelpNY</a>.
|
| 30 |
+
For real-time conditions, see <a href="https://www.floodnet.nyc" class="cold-start-redir">FloodNet NYC</a>.</p></div> <form class="cold-start-form" role="search"><label for="riprap-query" class="cold-start-label section-label">Query</label> <div class="cold-start-input-row"><input id="riprap-query" type="text" value="" placeholder="address · neighborhood · proposed development" class="cold-start-input" autocomplete="off"/> <button type="submit" class="cold-start-submit">Generate briefing →</button></div></form> <div class="cold-start-samples"><span class="section-label cold-start-samples-label">Sample queries</span> <div class="cold-start-samples-grid"><!--[--><button type="button" class="cold-start-sample"><span class="cold-start-sample-mode">address</span> <span class="cold-start-sample-q">80 Pioneer Street, Red Hook, Brooklyn</span> <span class="cold-start-sample-sub">Address-mode · Sandy edge · IBZ · NYCHA proximity</span> <span class="cold-start-sample-arrow" aria-hidden="true">↗</span></button><button type="button" class="cold-start-sample"><span class="cold-start-sample-mode">neighborhood</span> <span class="cold-start-sample-q">Far Rockaway flood exposure briefing</span> <span class="cold-start-sample-sub">Neighborhood-mode · chronic stormwater · 2050 SLR</span> <span class="cold-start-sample-arrow" aria-hidden="true">↗</span></button><button type="button" class="cold-start-sample"><span class="cold-start-sample-mode">development</span> <span class="cold-start-sample-q">Hunts Point proposed rezoning — flood-context check</span> <span class="cold-start-sample-sub">Development-check · CEQR §817 · 311 proxy density</span> <span class="cold-start-sample-arrow" aria-hidden="true">↗</span></button><!--]--></div></div> <div class="cold-start-trust"><span class="section-label">How Riprap is built</span> <ul class="cold-start-stones svelte-7xcb6n"><li class="svelte-7xcb6n"><span class="stone-dot svelte-7xcb6n" style="background: var(--stone-cornerstone);" aria-hidden="true"></span> <em class="svelte-7xcb6n">Cornerstone</em> remembers — what NYC's ground remembers.</li> <li class="svelte-7xcb6n"><span class="stone-dot svelte-7xcb6n" style="background: var(--stone-keystone);" aria-hidden="true"></span> <em class="svelte-7xcb6n">Keystone</em> tallies — what's exposed.</li> <li class="svelte-7xcb6n"><span class="stone-dot svelte-7xcb6n" style="background: var(--stone-touchstone);" aria-hidden="true"></span> <em class="svelte-7xcb6n">Touchstone</em> watches — what's happening now.</li> <li class="svelte-7xcb6n"><span class="stone-dot svelte-7xcb6n" style="background: var(--stone-lodestone);" aria-hidden="true"></span> <em class="svelte-7xcb6n">Lodestone</em> projects — what's coming.</li> <li class="svelte-7xcb6n"><span class="stone-dot svelte-7xcb6n" style="background: var(--stone-capstone);" aria-hidden="true"></span> <em class="svelte-7xcb6n">Capstone</em> writes it all down with citations.</li></ul> <ul class="cold-start-trust-list"><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" class="cold-start-method-link">Methodology paper →</a></div></section><!----></div></section><!--]--><!----></main> <!--[0--><footer class="app-footer no-print"><div class="app-footer-inner"><p class="app-footer-guard"><strong>Riprap does not predict damage.</strong> This tool is for professional analytical work, not personal property decisions.
|
| 31 |
For residents, see <a href="https://www.floodhelpny.org">FloodHelpNY</a> · <a href="https://www.floodnet.nyc">FloodNet NYC</a>.</p> <p class="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.2 · build 2026-05-03</p></div></footer><!--]--><!--]--><!--]--> <!--[-1--><!--]--><!--]-->
|
| 32 |
|
| 33 |
<script>
|
| 34 |
{
|
| 35 |
+
__sveltekit_43llsk = {
|
| 36 |
base: new URL(".", location).pathname.slice(0, -1)
|
| 37 |
};
|
| 38 |
|
| 39 |
const element = document.currentScript.parentElement;
|
| 40 |
|
| 41 |
Promise.all([
|
| 42 |
+
import("./_app/immutable/entry/start.CN51yZti.js"),
|
| 43 |
+
import("./_app/immutable/entry/app.CWOfOFvh.js")
|
| 44 |
]).then(([kit, app]) => {
|
| 45 |
kit.start(app, element, {
|
| 46 |
node_ids: [0, 2],
|
|
The diff for this file is too large to render.
See raw diff
|
|
|
|
@@ -21,17 +21,25 @@ import type {
|
|
| 21 |
} from '$lib/types/card';
|
| 22 |
import type { TraceNode, TraceStatus } from '$lib/types/trace';
|
| 23 |
import type { FinalResult } from '$lib/client/agentStream';
|
|
|
|
| 24 |
|
| 25 |
/** Reasonable defaults — when the FSM doesn't supply a vintage, fall
|
| 26 |
* back to the Riprap publication date. */
|
| 27 |
const RIPRAP_VINTAGE = '2026-05';
|
| 28 |
|
| 29 |
-
/** Map
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
function mapStatus(s: TraceStatus): StoneMember['status'] {
|
| 31 |
-
if (s === 'fan' || s === 'merge') return '
|
| 32 |
-
if (s === 'silent') return '
|
| 33 |
-
if (s === 'error') return '
|
| 34 |
-
return '
|
| 35 |
}
|
| 36 |
|
| 37 |
function flattenTrace(node: TraceNode): TraceNode[] {
|
|
@@ -79,6 +87,8 @@ function buildStoneTraces(root: TraceNode | undefined | null): StoneTrace[] {
|
|
| 79 |
if (!stone) continue;
|
| 80 |
buckets[stone].push({
|
| 81 |
id: node.id || node.name,
|
|
|
|
|
|
|
| 82 |
name: node.name,
|
| 83 |
status: mapStatus(node.status),
|
| 84 |
tier: node.tier,
|
|
@@ -87,9 +97,12 @@ function buildStoneTraces(root: TraceNode | undefined | null): StoneTrace[] {
|
|
| 87 |
});
|
| 88 |
}
|
| 89 |
}
|
|
|
|
|
|
|
|
|
|
| 90 |
return (Object.keys(buckets) as StoneKey[]).map((key) => ({
|
| 91 |
key,
|
| 92 |
-
members: buckets[key],
|
| 93 |
}));
|
| 94 |
}
|
| 95 |
|
|
@@ -418,36 +431,67 @@ function buildNoaaTides(state: Final): Card | null {
|
|
| 418 |
function buildPrithviLive(state: Final): Card | null {
|
| 419 |
const p = obj(state.prithvi_live);
|
| 420 |
if (!p?.ok) return null;
|
|
|
|
| 421 |
return {
|
| 422 |
id: 'fsm-prithvi-live',
|
| 423 |
stone: 'touchstone', tier: 'modeled', variant: 'raster-pred',
|
| 424 |
-
source: 'Prithvi-NYC
|
| 425 |
-
vintage:
|
| 426 |
-
title: '
|
| 427 |
rasterKind: 'prithvi',
|
| 428 |
-
headline: `${num(p.pct_water_within_500m) ?? 0}%`,
|
| 429 |
subhead: `water within 500 m · cloud ${num(p.cloud_cover) ?? '?'}%`,
|
| 430 |
sub: 'Test flood IoU 0.5979 on held-out NYC chips. Model interpretation, not a measurement.',
|
| 431 |
illustrative: true,
|
| 432 |
-
docId: 'prithvi_live', citeId: 'prithvi_live', mapLayer: 'prithvi',
|
| 433 |
};
|
| 434 |
}
|
| 435 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 436 |
function buildTerramindLulc(state: Final): Card | null {
|
| 437 |
const t = obj(state.terramind_lulc);
|
| 438 |
if (!t?.ok) return null;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 439 |
return {
|
| 440 |
id: 'fsm-tm-lulc',
|
| 441 |
-
stone: 'touchstone', tier: '
|
| 442 |
-
source: 'TerraMind
|
| 443 |
-
vintage: '
|
| 444 |
-
title: 'Land
|
| 445 |
rasterKind: 'lulc',
|
| 446 |
-
|
| 447 |
-
|
| 448 |
-
sub: 'Test mIoU 0.5866 on held-out NYC chips.',
|
| 449 |
illustrative: true,
|
| 450 |
-
docId: 'tm_lulc', citeId: 'tm_lulc', mapLayer: 'lulc',
|
| 451 |
};
|
| 452 |
}
|
| 453 |
|
|
@@ -460,13 +504,13 @@ function buildTtmForecast(state: Final): Card | null {
|
|
| 460 |
return {
|
| 461 |
id: 'fsm-ttm-fc',
|
| 462 |
stone: 'lodestone', tier: 'modeled', variant: 'timeseries',
|
| 463 |
-
source: 'Granite TTM r2', agency: 'IBM Granite
|
| 464 |
vintage: RIPRAP_VINTAGE,
|
| 465 |
-
title: '
|
| 466 |
timeseries: { hours: 96, peak: { x: 38, y: 47 }, peakLabel: `${peak} ft @ +${Math.round(ahead/60)}h` },
|
| 467 |
headline: `${peak} ft`,
|
| 468 |
-
subhead: 'peak surge residual',
|
| 469 |
-
sub: '
|
| 470 |
spatialNote: 'regional · Battery, not point-of-query',
|
| 471 |
docId: 'ttm_forecast', citeId: 'ttm_forecast',
|
| 472 |
};
|
|
@@ -480,21 +524,26 @@ function buildTtmBatterySurge(state: Final): Card | null {
|
|
| 480 |
if (peak == null || ahead == null) return null;
|
| 481 |
return {
|
| 482 |
id: 'fsm-ttm-batt',
|
| 483 |
-
stone: 'lodestone', tier: 'modeled', variant: 'timeseries',
|
| 484 |
-
source: 'Granite
|
| 485 |
-
agency: '
|
| 486 |
vintage: RIPRAP_VINTAGE,
|
| 487 |
-
title: '
|
| 488 |
timeseries: {
|
| 489 |
hours: 96,
|
| 490 |
peak: { x: ahead, y: Math.round(peak * 100) },
|
| 491 |
peakLabel: `${(peak * 100).toFixed(0)} cm @ +${ahead}h`,
|
| 492 |
},
|
| 493 |
headline: `${(peak * 100).toFixed(0)} cm`,
|
| 494 |
-
subhead: `peak surge ·
|
| 495 |
-
sub: '
|
| 496 |
spatialNote: 'regional · The Battery, not point-of-query',
|
| 497 |
docId: 'ttm_battery', citeId: 'ttm_battery',
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 498 |
};
|
| 499 |
}
|
| 500 |
|
|
@@ -522,11 +571,18 @@ function buildNwsAlerts(state: Final): Card | null {
|
|
| 522 |
}
|
| 523 |
|
| 524 |
function buildCapstoneMeta(final: FinalResult, wallSeconds?: number): Card {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 525 |
const m = final.mellea;
|
| 526 |
const passed = m?.passed?.length ?? 0;
|
| 527 |
const failed = m?.failed?.length ?? 0;
|
| 528 |
-
const
|
| 529 |
const attempts = m?.attempts ?? 0;
|
|
|
|
|
|
|
| 530 |
return {
|
| 531 |
id: 'fsm-capstone-meta',
|
| 532 |
stone: 'capstone', tier: 'modeled', variant: 'meta',
|
|
@@ -534,12 +590,12 @@ function buildCapstoneMeta(final: FinalResult, wallSeconds?: number): Card {
|
|
| 534 |
vintage: RIPRAP_VINTAGE,
|
| 535 |
title: 'Briefing reconciliation',
|
| 536 |
metaRows: [
|
| 537 |
-
{ k: '
|
| 538 |
-
{ k: '
|
| 539 |
-
{ k: '
|
| 540 |
-
{ k: '
|
| 541 |
],
|
| 542 |
-
sub: 'Capstone produces prose, not cards. This meta-card
|
| 543 |
docId: 'capstone',
|
| 544 |
};
|
| 545 |
}
|
|
|
|
| 21 |
} from '$lib/types/card';
|
| 22 |
import type { TraceNode, TraceStatus } from '$lib/types/trace';
|
| 23 |
import type { FinalResult } from '$lib/client/agentStream';
|
| 24 |
+
import { fillRosterForStone } from '$lib/data/stoneRegistry';
|
| 25 |
|
| 26 |
/** Reasonable defaults — when the FSM doesn't supply a vintage, fall
|
| 27 |
* back to the Riprap publication date. */
|
| 28 |
const RIPRAP_VINTAGE = '2026-05';
|
| 29 |
|
| 30 |
+
/** Map the FSM trace's TraceStatus into the v0.4.5 5-state SpecialistStatus.
|
| 31 |
+
* Crucial split: a specialist that "returned no data" is `silent_by_design`,
|
| 32 |
+
* not `errored`. The FSM marks both as `silent` in the trace; we
|
| 33 |
+
* conservatively classify any successful trace-`silent` as
|
| 34 |
+
* silent_by_design (the spec voice). Anything that raised in the FSM
|
| 35 |
+
* becomes `errored`. `fan`/`merge` are structural; the few callers
|
| 36 |
+
* that look at them treat them as fired.
|
| 37 |
+
*/
|
| 38 |
function mapStatus(s: TraceStatus): StoneMember['status'] {
|
| 39 |
+
if (s === 'fan' || s === 'merge') return 'fired';
|
| 40 |
+
if (s === 'silent') return 'silent_by_design';
|
| 41 |
+
if (s === 'error') return 'errored';
|
| 42 |
+
return 'fired';
|
| 43 |
}
|
| 44 |
|
| 45 |
function flattenTrace(node: TraceNode): TraceNode[] {
|
|
|
|
| 87 |
if (!stone) continue;
|
| 88 |
buckets[stone].push({
|
| 89 |
id: node.id || node.name,
|
| 90 |
+
// Preserve the raw FSM step name here — the registry projection
|
| 91 |
+
// matches against `stepNames`, not display names.
|
| 92 |
name: node.name,
|
| 93 |
status: mapStatus(node.status),
|
| 94 |
tier: node.tier,
|
|
|
|
| 97 |
});
|
| 98 |
}
|
| 99 |
}
|
| 100 |
+
// v0.4.5 §3 — project the registry over each Stone so the provenance
|
| 101 |
+
// expander shows the full inventory, with absent specialists as
|
| 102 |
+
// not_invoked.
|
| 103 |
return (Object.keys(buckets) as StoneKey[]).map((key) => ({
|
| 104 |
key,
|
| 105 |
+
members: fillRosterForStone(key, buckets[key]),
|
| 106 |
}));
|
| 107 |
}
|
| 108 |
|
|
|
|
| 431 |
function buildPrithviLive(state: Final): Card | null {
|
| 432 |
const p = obj(state.prithvi_live);
|
| 433 |
if (!p?.ok) return null;
|
| 434 |
+
const sceneDate = str(p.item_datetime)?.slice(0, 10);
|
| 435 |
return {
|
| 436 |
id: 'fsm-prithvi-live',
|
| 437 |
stone: 'touchstone', tier: 'modeled', variant: 'raster-pred',
|
| 438 |
+
source: 'Prithvi-NYC-Pluvial', agency: 'NASA-IBM Prithvi v2 · NYC fine-tune',
|
| 439 |
+
vintage: sceneDate ? `${sceneDate} · Sentinel-2` : 'Sentinel-2',
|
| 440 |
+
title: 'Pluvial flood prediction · Prithvi-NYC-Pluvial',
|
| 441 |
rasterKind: 'prithvi',
|
| 442 |
+
headline: `${num(p.pct_water_within_500m) ?? 0}% flooded`,
|
| 443 |
subhead: `water within 500 m · cloud ${num(p.cloud_cover) ?? '?'}%`,
|
| 444 |
sub: 'Test flood IoU 0.5979 on held-out NYC chips. Model interpretation, not a measurement.',
|
| 445 |
illustrative: true,
|
| 446 |
+
docId: 'prithvi_live', citeId: 'prithvi_live', mapLayer: 'prithvi-pluvial',
|
| 447 |
};
|
| 448 |
}
|
| 449 |
|
| 450 |
+
/** Conventional LULC palette — matches the design handoff's LULC card
|
| 451 |
+
* visual (urban / water / vegetation / barren / wetland). The colors
|
| 452 |
+
* are layer conventions, NOT new tier signals. */
|
| 453 |
+
const LULC_PALETTE: Record<string, string> = {
|
| 454 |
+
urban: '#C66',
|
| 455 |
+
water: '#5B7FB4',
|
| 456 |
+
vegetation: '#5B8A4A',
|
| 457 |
+
barren: '#A89A78',
|
| 458 |
+
wetland: '#D9C75A',
|
| 459 |
+
};
|
| 460 |
+
|
| 461 |
function buildTerramindLulc(state: Final): Card | null {
|
| 462 |
const t = obj(state.terramind_lulc);
|
| 463 |
if (!t?.ok) return null;
|
| 464 |
+
// Translate the FSM's class_fractions dict into the design-system's
|
| 465 |
+
// expected ordered class-mix (urban / water / vegetation / barren /
|
| 466 |
+
// wetland). Unknown class names land in barren as a catch-all.
|
| 467 |
+
const fractions = (obj(t.class_fractions) ?? {}) as Record<string, number>;
|
| 468 |
+
const buckets: Record<keyof typeof LULC_PALETTE, number> = {
|
| 469 |
+
urban: 0, water: 0, vegetation: 0, barren: 0, wetland: 0,
|
| 470 |
+
};
|
| 471 |
+
for (const [k, v] of Object.entries(fractions)) {
|
| 472 |
+
const lk = k.toLowerCase();
|
| 473 |
+
if (lk.includes('urban') || lk.includes('built') || lk.includes('impervious')) buckets.urban += v;
|
| 474 |
+
else if (lk.includes('water')) buckets.water += v;
|
| 475 |
+
else if (lk.includes('tree') || lk.includes('vegetation') || lk.includes('crop') || lk.includes('grass')) buckets.vegetation += v;
|
| 476 |
+
else if (lk.includes('bare') || lk.includes('barren') || lk.includes('soil')) buckets.barren += v;
|
| 477 |
+
else if (lk.includes('wet') || lk.includes('marsh')) buckets.wetland += v;
|
| 478 |
+
else buckets.barren += v;
|
| 479 |
+
}
|
| 480 |
+
const classMix = (Object.entries(buckets) as [keyof typeof LULC_PALETTE, number][])
|
| 481 |
+
.filter(([, v]) => v > 0)
|
| 482 |
+
.map(([k, v]) => ({ k, pct: Math.round(v), color: LULC_PALETTE[k] }));
|
| 483 |
+
|
| 484 |
return {
|
| 485 |
id: 'fsm-tm-lulc',
|
| 486 |
+
stone: 'touchstone', tier: 'synthetic', variant: 'lulc',
|
| 487 |
+
source: 'TerraMind v1.2', agency: 'IBM TerraMind v1.2 · Sentinel-2 inputs',
|
| 488 |
+
vintage: 'Sentinel-2',
|
| 489 |
+
title: 'Land use / land cover · TerraMind v1.2',
|
| 490 |
rasterKind: 'lulc',
|
| 491 |
+
classMix: classMix.length ? classMix : undefined,
|
| 492 |
+
sub: 'Synthetic prior. LULC palette is a layer convention, not a tier signal.',
|
|
|
|
| 493 |
illustrative: true,
|
| 494 |
+
docId: 'tm_lulc', citeId: 'tm_lulc', mapLayer: 'terramind-lulc',
|
| 495 |
};
|
| 496 |
}
|
| 497 |
|
|
|
|
| 504 |
return {
|
| 505 |
id: 'fsm-ttm-fc',
|
| 506 |
stone: 'lodestone', tier: 'modeled', variant: 'timeseries',
|
| 507 |
+
source: 'Granite TTM r2 (zero-shot)', agency: 'IBM Granite-TimeSeries · regional',
|
| 508 |
vintage: RIPRAP_VINTAGE,
|
| 509 |
+
title: 'Storm surge nowcast at The Battery — 9.6 h horizon (regional)',
|
| 510 |
timeseries: { hours: 96, peak: { x: 38, y: 47 }, peakLabel: `${peak} ft @ +${Math.round(ahead/60)}h` },
|
| 511 |
headline: `${peak} ft`,
|
| 512 |
+
subhead: 'peak surge residual · 9.6h horizon · 6-min cadence',
|
| 513 |
+
sub: 'Regional disclosure. Distinct from the fine-tuned Battery surge nowcast.',
|
| 514 |
spatialNote: 'regional · Battery, not point-of-query',
|
| 515 |
docId: 'ttm_forecast', citeId: 'ttm_forecast',
|
| 516 |
};
|
|
|
|
| 524 |
if (peak == null || ahead == null) return null;
|
| 525 |
return {
|
| 526 |
id: 'fsm-ttm-batt',
|
| 527 |
+
stone: 'lodestone', tier: 'modeled', variant: 'timeseries-ft',
|
| 528 |
+
source: 'msradam/Granite-TTM-r2-Battery-Surge',
|
| 529 |
+
agency: 'Granite TTM r2 · NYC-specialized fine-tune',
|
| 530 |
vintage: RIPRAP_VINTAGE,
|
| 531 |
+
title: 'Storm surge nowcast at The Battery — 96 h horizon (NYC-specialized fine-tune)',
|
| 532 |
timeseries: {
|
| 533 |
hours: 96,
|
| 534 |
peak: { x: ahead, y: Math.round(peak * 100) },
|
| 535 |
peakLabel: `${(peak * 100).toFixed(0)} cm @ +${ahead}h`,
|
| 536 |
},
|
| 537 |
headline: `${(peak * 100).toFixed(0)} cm`,
|
| 538 |
+
subhead: `peak surge · 96h horizon · hourly cadence`,
|
| 539 |
+
sub: 'Fine-tuned on NYC tide-gauge history. Hourly cadence; applies city-wide via NOAA station 8518750.',
|
| 540 |
spatialNote: 'regional · The Battery, not point-of-query',
|
| 541 |
docId: 'ttm_battery', citeId: 'ttm_battery',
|
| 542 |
+
// v0.4.5 §5 — fine-tuned-model footer chrome
|
| 543 |
+
hfModelCard: 'huggingface.co/msradam/Granite-TTM-r2-Battery-Surge',
|
| 544 |
+
rmse: '0.157 m',
|
| 545 |
+
skillVsPersistence: '−35% vs persistence',
|
| 546 |
+
hardwareBadge: 'MI300X',
|
| 547 |
};
|
| 548 |
}
|
| 549 |
|
|
|
|
| 571 |
}
|
| 572 |
|
| 573 |
function buildCapstoneMeta(final: FinalResult, wallSeconds?: number): Card {
|
| 574 |
+
// v0.4.5 §2 — wire the four metrics to the reconciler's actual state.
|
| 575 |
+
// The Mellea attempts field is one-indexed by the reconciler (initial
|
| 576 |
+
// attempt + N rerolls). A clean run with one reroll arrives as
|
| 577 |
+
// attempts=2, which we surface as "1 reroll" — the human-meaningful
|
| 578 |
+
// count. attempts=1 renders as "0 rerolls" (initial pass only).
|
| 579 |
const m = final.mellea;
|
| 580 |
const passed = m?.passed?.length ?? 0;
|
| 581 |
const failed = m?.failed?.length ?? 0;
|
| 582 |
+
const totalChecks = passed + failed > 0 ? passed + failed : 4;
|
| 583 |
const attempts = m?.attempts ?? 0;
|
| 584 |
+
const rerolls = Math.max(0, attempts - 1);
|
| 585 |
+
const cites = final.citations?.length ?? 0;
|
| 586 |
return {
|
| 587 |
id: 'fsm-capstone-meta',
|
| 588 |
stone: 'capstone', tier: 'modeled', variant: 'meta',
|
|
|
|
| 590 |
vintage: RIPRAP_VINTAGE,
|
| 591 |
title: 'Briefing reconciliation',
|
| 592 |
metaRows: [
|
| 593 |
+
{ k: 'mellea reroll', v: `${rerolls} reroll${rerolls === 1 ? '' : 's'}` },
|
| 594 |
+
{ k: 'grounding checks', v: `${passed}/${totalChecks} passed` },
|
| 595 |
+
{ k: 'citations resolved', v: `${cites}` },
|
| 596 |
+
{ k: 'wall-clock', v: wallSeconds != null ? `${wallSeconds.toFixed(1)} s` : '—' },
|
| 597 |
],
|
| 598 |
+
sub: 'Capstone produces prose, not cards. This meta-card is the integrity-narration UI for the entire pipeline.',
|
| 599 |
docId: 'capstone',
|
| 600 |
};
|
| 601 |
}
|
|
@@ -8,13 +8,28 @@
|
|
| 8 |
* deprecated in Svelte 5). */
|
| 9 |
let { members, depth = 0 }: { members: StoneMember[]; depth?: number } = $props();
|
| 10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
function pip(status: StoneMember['status']): string {
|
| 12 |
-
return ({
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
}
|
| 14 |
function pipColorVar(m: StoneMember): string {
|
| 15 |
-
if (m.status === '
|
| 16 |
-
if (m.status === '
|
| 17 |
-
if (m.status === '
|
|
|
|
| 18 |
if (m.tier) return `var(--tier-${m.tier})`;
|
| 19 |
return 'var(--ink)';
|
| 20 |
}
|
|
@@ -90,8 +105,21 @@
|
|
| 90 |
font-size: 10px;
|
| 91 |
color: var(--ink-tertiary);
|
| 92 |
}
|
| 93 |
-
|
| 94 |
-
.prov-status-
|
| 95 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 96 |
.prov-children { padding: 0; }
|
| 97 |
</style>
|
|
|
|
| 8 |
* deprecated in Svelte 5). */
|
| 9 |
let { members, depth = 0 }: { members: StoneMember[]; depth?: number } = $props();
|
| 10 |
|
| 11 |
+
/** v0.4.5 status pip — five distinct shapes per V0.4.5_SPEC.md §1.
|
| 12 |
+
*
|
| 13 |
+
* fired ● solid square (tier-colored)
|
| 14 |
+
* silent_by_design ○ open circle (neutral)
|
| 15 |
+
* warned ▲ solid triangle (warn ochre)
|
| 16 |
+
* errored ■ solid filled (red)
|
| 17 |
+
* not_invoked □ hollow gray square
|
| 18 |
+
*/
|
| 19 |
function pip(status: StoneMember['status']): string {
|
| 20 |
+
return ({
|
| 21 |
+
fired: '●',
|
| 22 |
+
silent_by_design: '○',
|
| 23 |
+
warned: '▲',
|
| 24 |
+
errored: '■',
|
| 25 |
+
not_invoked: '□',
|
| 26 |
+
} as const)[status];
|
| 27 |
}
|
| 28 |
function pipColorVar(m: StoneMember): string {
|
| 29 |
+
if (m.status === 'warned') return '#B7791F';
|
| 30 |
+
if (m.status === 'errored') return '#B91C1C';
|
| 31 |
+
if (m.status === 'silent_by_design') return 'var(--ink-tertiary)';
|
| 32 |
+
if (m.status === 'not_invoked') return 'var(--ink-tertiary)';
|
| 33 |
if (m.tier) return `var(--tier-${m.tier})`;
|
| 34 |
return 'var(--ink)';
|
| 35 |
}
|
|
|
|
| 105 |
font-size: 10px;
|
| 106 |
color: var(--ink-tertiary);
|
| 107 |
}
|
| 108 |
+
/* v0.4.5 status row treatments */
|
| 109 |
+
.prov-status-silent_by_design .prov-name {
|
| 110 |
+
color: var(--ink-tertiary);
|
| 111 |
+
font-style: italic;
|
| 112 |
+
}
|
| 113 |
+
.prov-status-warned .prov-name { color: #B7791F; }
|
| 114 |
+
.prov-status-errored .prov-name { color: #B91C1C; }
|
| 115 |
+
.prov-status-errored .prov-pip { font-weight: bold; }
|
| 116 |
+
.prov-status-not_invoked .prov-name {
|
| 117 |
+
color: var(--ink-tertiary);
|
| 118 |
+
font-style: italic;
|
| 119 |
+
}
|
| 120 |
+
.prov-status-not_invoked .prov-id {
|
| 121 |
+
color: var(--ink-tertiary);
|
| 122 |
+
opacity: 0.6;
|
| 123 |
+
}
|
| 124 |
.prov-children { padding: 0; }
|
| 125 |
</style>
|
|
@@ -18,10 +18,14 @@
|
|
| 18 |
}
|
| 19 |
let allMembers = $derived(stones.flatMap((s) => flatten(s.members)));
|
| 20 |
let total = $derived(allMembers.length);
|
| 21 |
-
|
| 22 |
-
let
|
| 23 |
-
|
| 24 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
|
| 26 |
let wall = $derived(wallSeconds == null
|
| 27 |
? '—'
|
|
@@ -31,27 +35,33 @@
|
|
| 31 |
<div class="rh">
|
| 32 |
<span class="rh-item"><strong>{stones.length}</strong> Stones</span>
|
| 33 |
<span class="rh-sep">·</span>
|
| 34 |
-
<span class="rh-item"><strong>{fired}
|
| 35 |
-
<span class="rh-sep">·</span>
|
| 36 |
-
<span class="rh-item"><strong>{cards.length}</strong> evidence card{cards.length === 1 ? '' : 's'}</span>
|
| 37 |
-
<span class="rh-sep">·</span>
|
| 38 |
-
<span class="rh-item"><strong>{wall}</strong> wall-clock</span>
|
| 39 |
-
{#if cacheHit != null}
|
| 40 |
-
<span class="rh-sep">·</span>
|
| 41 |
-
<span class="rh-item"><strong>{Math.round(cacheHit * 100)}%</strong> cache</span>
|
| 42 |
-
{/if}
|
| 43 |
{#if silent > 0}
|
| 44 |
<span class="rh-sep">·</span>
|
| 45 |
-
<span class="rh-item rh-silent">{silent} silent</span>
|
| 46 |
{/if}
|
| 47 |
{#if warn > 0}
|
| 48 |
<span class="rh-sep">·</span>
|
| 49 |
-
<span class="rh-item rh-warn">{warn}
|
| 50 |
{/if}
|
| 51 |
{#if err > 0}
|
| 52 |
<span class="rh-sep">·</span>
|
| 53 |
-
<span class="rh-item rh-err">{err}
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
{/if}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
</div>
|
| 56 |
|
| 57 |
<style>
|
|
@@ -78,4 +88,6 @@
|
|
| 78 |
.rh-silent { color: var(--ink-tertiary); }
|
| 79 |
.rh-warn { color: #B7791F; }
|
| 80 |
.rh-err { color: #B91C1C; }
|
|
|
|
|
|
|
| 81 |
</style>
|
|
|
|
| 18 |
}
|
| 19 |
let allMembers = $derived(stones.flatMap((s) => flatten(s.members)));
|
| 20 |
let total = $derived(allMembers.length);
|
| 21 |
+
// v0.4.5 split: see SpecialistStatus in lib/types/card.ts.
|
| 22 |
+
let fired = $derived(
|
| 23 |
+
allMembers.filter((m) => m.status === 'fired' || m.status === 'warned').length
|
| 24 |
+
);
|
| 25 |
+
let silent = $derived(allMembers.filter((m) => m.status === 'silent_by_design').length);
|
| 26 |
+
let warn = $derived(allMembers.filter((m) => m.status === 'warned').length);
|
| 27 |
+
let err = $derived(allMembers.filter((m) => m.status === 'errored').length);
|
| 28 |
+
let notInvoked = $derived(allMembers.filter((m) => m.status === 'not_invoked').length);
|
| 29 |
|
| 30 |
let wall = $derived(wallSeconds == null
|
| 31 |
? '—'
|
|
|
|
| 35 |
<div class="rh">
|
| 36 |
<span class="rh-item"><strong>{stones.length}</strong> Stones</span>
|
| 37 |
<span class="rh-sep">·</span>
|
| 38 |
+
<span class="rh-item"><strong>{fired}</strong> fired</span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
{#if silent > 0}
|
| 40 |
<span class="rh-sep">·</span>
|
| 41 |
+
<span class="rh-item rh-silent"><strong>{silent}</strong> silent</span>
|
| 42 |
{/if}
|
| 43 |
{#if warn > 0}
|
| 44 |
<span class="rh-sep">·</span>
|
| 45 |
+
<span class="rh-item rh-warn"><strong>{warn}</strong> warned</span>
|
| 46 |
{/if}
|
| 47 |
{#if err > 0}
|
| 48 |
<span class="rh-sep">·</span>
|
| 49 |
+
<span class="rh-item rh-err"><strong>{err}</strong> errored</span>
|
| 50 |
+
{/if}
|
| 51 |
+
{#if notInvoked > 0}
|
| 52 |
+
<span class="rh-sep">·</span>
|
| 53 |
+
<span class="rh-item rh-notinvoked"><strong>{notInvoked}</strong> not invoked</span>
|
| 54 |
{/if}
|
| 55 |
+
<span class="rh-sep">·</span>
|
| 56 |
+
<span class="rh-item"><strong>{cards.length}</strong> evidence card{cards.length === 1 ? '' : 's'}</span>
|
| 57 |
+
<span class="rh-sep">·</span>
|
| 58 |
+
<span class="rh-item"><strong>{wall}</strong> wall-clock</span>
|
| 59 |
+
{#if cacheHit != null}
|
| 60 |
+
<span class="rh-sep">·</span>
|
| 61 |
+
<span class="rh-item"><strong>{Math.round(cacheHit * 100)}%</strong> cache</span>
|
| 62 |
+
{/if}
|
| 63 |
+
<span class="rh-sep">·</span>
|
| 64 |
+
<span class="rh-item rh-total"><strong>{total}</strong> registered</span>
|
| 65 |
</div>
|
| 66 |
|
| 67 |
<style>
|
|
|
|
| 88 |
.rh-silent { color: var(--ink-tertiary); }
|
| 89 |
.rh-warn { color: #B7791F; }
|
| 90 |
.rh-err { color: #B91C1C; }
|
| 91 |
+
.rh-notinvoked { color: var(--ink-tertiary); font-style: italic; }
|
| 92 |
+
.rh-total strong { color: var(--ink-tertiary); }
|
| 93 |
</style>
|
|
@@ -38,13 +38,18 @@
|
|
| 38 |
}
|
| 39 |
let flat = $derived(flatten(trace.members));
|
| 40 |
let traceCount = $derived(flat.length);
|
| 41 |
-
|
| 42 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
);
|
| 44 |
let smartOpen = $derived(
|
| 45 |
provenanceMode === 'all-expanded' ? true :
|
| 46 |
provenanceMode === 'all-collapsed' ? false :
|
| 47 |
-
|
| 48 |
);
|
| 49 |
|
| 50 |
let userOpen = $state<boolean | null>(null);
|
|
@@ -104,7 +109,7 @@
|
|
| 104 |
<span class="prov-caret" aria-hidden="true">{traceOpen ? '▾' : '▸'}</span>
|
| 105 |
<span class="prov-label">{traceOpen ? 'Hide' : 'Show'} provenance</span>
|
| 106 |
<span class="prov-meta">
|
| 107 |
-
· {traceCount} function{traceCount === 1 ? '' : 's'}
|
| 108 |
</span>
|
| 109 |
</button>
|
| 110 |
{#if traceOpen}
|
|
@@ -122,6 +127,11 @@
|
|
| 122 |
background: transparent;
|
| 123 |
}
|
| 124 |
.region:first-of-type { border-top: 0; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 125 |
.region-head {
|
| 126 |
display: flex;
|
| 127 |
align-items: baseline;
|
|
@@ -129,7 +139,14 @@
|
|
| 129 |
gap: var(--s-4);
|
| 130 |
margin-bottom: var(--s-3);
|
| 131 |
flex-wrap: wrap;
|
| 132 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 133 |
.region-head-left {
|
| 134 |
display: flex;
|
| 135 |
align-items: baseline;
|
|
@@ -172,9 +189,11 @@
|
|
| 172 |
.rail :global(> .fc) { grid-column: span 4; }
|
| 173 |
.rail :global(> .fc.fc-register),
|
| 174 |
.rail :global(> .fc.fc-timeseries),
|
|
|
|
| 175 |
.rail :global(> .fc.fc-forecast),
|
| 176 |
.rail :global(> .fc.fc-raster),
|
| 177 |
.rail :global(> .fc.fc-raster-pred),
|
|
|
|
| 178 |
.rail :global(> .fc.fc-comparison) {
|
| 179 |
grid-column: span 6;
|
| 180 |
}
|
|
|
|
| 38 |
}
|
| 39 |
let flat = $derived(flatten(trace.members));
|
| 40 |
let traceCount = $derived(flat.length);
|
| 41 |
+
// v0.4.5: smart-expand when any specialist warned, errored, or was
|
| 42 |
+
// not_invoked. silent_by_design is normal operation, not an anomaly,
|
| 43 |
+
// so it doesn't trigger the auto-expand. The "anomaly" tag itself
|
| 44 |
+
// (v0.4.4) is dropped — the per-stone count chips carry the same
|
| 45 |
+
// info without the redundant label (V0.4.5_SPEC.md §6).
|
| 46 |
+
let hasInterestingState = $derived(
|
| 47 |
+
flat.some((m) => m.status === 'warned' || m.status === 'errored' || m.status === 'not_invoked')
|
| 48 |
);
|
| 49 |
let smartOpen = $derived(
|
| 50 |
provenanceMode === 'all-expanded' ? true :
|
| 51 |
provenanceMode === 'all-collapsed' ? false :
|
| 52 |
+
hasInterestingState
|
| 53 |
);
|
| 54 |
|
| 55 |
let userOpen = $state<boolean | null>(null);
|
|
|
|
| 109 |
<span class="prov-caret" aria-hidden="true">{traceOpen ? '▾' : '▸'}</span>
|
| 110 |
<span class="prov-label">{traceOpen ? 'Hide' : 'Show'} provenance</span>
|
| 111 |
<span class="prov-meta">
|
| 112 |
+
· {traceCount} function{traceCount === 1 ? '' : 's'}
|
| 113 |
</span>
|
| 114 |
</button>
|
| 115 |
{#if traceOpen}
|
|
|
|
| 127 |
background: transparent;
|
| 128 |
}
|
| 129 |
.region:first-of-type { border-top: 0; }
|
| 130 |
+
|
| 131 |
+
/* v0.4.5 §9 — Stone-tinted accent: 3px left-rule on the header strip,
|
| 132 |
+
keyed to the Stone's accent token. Hint-level decoration; the
|
| 133 |
+
four-tier palette inside cards is the load-bearing epistemic
|
| 134 |
+
signal. Print degrades to #999 via the tokens.css override. */
|
| 135 |
.region-head {
|
| 136 |
display: flex;
|
| 137 |
align-items: baseline;
|
|
|
|
| 139 |
gap: var(--s-4);
|
| 140 |
margin-bottom: var(--s-3);
|
| 141 |
flex-wrap: wrap;
|
| 142 |
+
border-left: 3px solid var(--stone-tint, var(--rule-soft));
|
| 143 |
+
padding-left: var(--s-3);
|
| 144 |
+
}
|
| 145 |
+
.region-cornerstone .region-head { --stone-tint: var(--stone-cornerstone); }
|
| 146 |
+
.region-keystone .region-head { --stone-tint: var(--stone-keystone); }
|
| 147 |
+
.region-touchstone .region-head { --stone-tint: var(--stone-touchstone); }
|
| 148 |
+
.region-lodestone .region-head { --stone-tint: var(--stone-lodestone); }
|
| 149 |
+
.region-capstone .region-head { --stone-tint: var(--stone-capstone); }
|
| 150 |
.region-head-left {
|
| 151 |
display: flex;
|
| 152 |
align-items: baseline;
|
|
|
|
| 189 |
.rail :global(> .fc) { grid-column: span 4; }
|
| 190 |
.rail :global(> .fc.fc-register),
|
| 191 |
.rail :global(> .fc.fc-timeseries),
|
| 192 |
+
.rail :global(> .fc.fc-timeseries-ft),
|
| 193 |
.rail :global(> .fc.fc-forecast),
|
| 194 |
.rail :global(> .fc.fc-raster),
|
| 195 |
.rail :global(> .fc.fc-raster-pred),
|
| 196 |
+
.rail :global(> .fc.fc-lulc),
|
| 197 |
.rail :global(> .fc.fc-comparison) {
|
| 198 |
grid-column: span 6;
|
| 199 |
}
|
|
@@ -15,10 +15,15 @@
|
|
| 15 |
return ms.flatMap((m) => (m.children ? [m, ...flatten(m.children)] : [m]));
|
| 16 |
}
|
| 17 |
let flat = $derived(flatten(members));
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
let ms = $derived(members.reduce((a, m) => Math.max(a, m.ms ?? 0), 0));
|
| 23 |
|
| 24 |
function fmtMs(x: number): string {
|
|
@@ -42,7 +47,11 @@
|
|
| 42 |
{/if}
|
| 43 |
{#if err > 0}
|
| 44 |
<span class="sep">·</span>
|
| 45 |
-
<span class="err"><strong>{err}</strong>
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
{/if}
|
| 47 |
<span class="sep">·</span>
|
| 48 |
<span class="ms"><strong>{fmtMs(ms)}</strong></span>
|
|
@@ -66,5 +75,6 @@
|
|
| 66 |
.silent strong { color: var(--ink-tertiary); }
|
| 67 |
.warn strong { color: #B7791F; }
|
| 68 |
.err strong { color: #B91C1C; }
|
|
|
|
| 69 |
.sep { color: var(--ink-tertiary); opacity: 0.6; }
|
| 70 |
</style>
|
|
|
|
| 15 |
return ms.flatMap((m) => (m.children ? [m, ...flatten(m.children)] : [m]));
|
| 16 |
}
|
| 17 |
let flat = $derived(flatten(members));
|
| 18 |
+
// v0.4.5 split: `fired` rolls in `warned` (still produced output);
|
| 19 |
+
// `silent` is `silent_by_design`; `errored` is hard failure;
|
| 20 |
+
// `not_invoked` surfaces when a specialist was registered but the
|
| 21 |
+
// FSM skipped it (precondition unmet).
|
| 22 |
+
let fired = $derived(flat.filter((m) => m.status === 'fired' || m.status === 'warned').length);
|
| 23 |
+
let silent = $derived(flat.filter((m) => m.status === 'silent_by_design').length);
|
| 24 |
+
let warn = $derived(flat.filter((m) => m.status === 'warned').length);
|
| 25 |
+
let err = $derived(flat.filter((m) => m.status === 'errored').length);
|
| 26 |
+
let notInvoked = $derived(flat.filter((m) => m.status === 'not_invoked').length);
|
| 27 |
let ms = $derived(members.reduce((a, m) => Math.max(a, m.ms ?? 0), 0));
|
| 28 |
|
| 29 |
function fmtMs(x: number): string {
|
|
|
|
| 47 |
{/if}
|
| 48 |
{#if err > 0}
|
| 49 |
<span class="sep">·</span>
|
| 50 |
+
<span class="err"><strong>{err}</strong> errored</span>
|
| 51 |
+
{/if}
|
| 52 |
+
{#if notInvoked > 0}
|
| 53 |
+
<span class="sep">·</span>
|
| 54 |
+
<span class="notinvoked"><strong>{notInvoked}</strong> not invoked</span>
|
| 55 |
{/if}
|
| 56 |
<span class="sep">·</span>
|
| 57 |
<span class="ms"><strong>{fmtMs(ms)}</strong></span>
|
|
|
|
| 75 |
.silent strong { color: var(--ink-tertiary); }
|
| 76 |
.warn strong { color: #B7791F; }
|
| 77 |
.err strong { color: #B91C1C; }
|
| 78 |
+
.notinvoked strong { color: var(--ink-tertiary); font-style: italic; }
|
| 79 |
.sep { color: var(--ink-tertiary); opacity: 0.6; }
|
| 80 |
</style>
|
|
@@ -5,8 +5,10 @@
|
|
| 5 |
import ScalarsBody from './ScalarsBody.svelte';
|
| 6 |
import SparkBody from './SparkBody.svelte';
|
| 7 |
import TimeseriesBody from './TimeseriesBody.svelte';
|
|
|
|
| 8 |
import ForecastBody from './ForecastBody.svelte';
|
| 9 |
import RasterBody from './RasterBody.svelte';
|
|
|
|
| 10 |
import RegisterBody from './RegisterBody.svelte';
|
| 11 |
import ComparisonBody from './ComparisonBody.svelte';
|
| 12 |
import MetaBody from './MetaBody.svelte';
|
|
@@ -28,10 +30,14 @@
|
|
| 28 |
<SparkBody {card} />
|
| 29 |
{:else if card.variant === 'timeseries'}
|
| 30 |
<TimeseriesBody {card} />
|
|
|
|
|
|
|
| 31 |
{:else if card.variant === 'forecast'}
|
| 32 |
<ForecastBody {card} />
|
| 33 |
{:else if card.variant === 'raster' || card.variant === 'raster-pred'}
|
| 34 |
<RasterBody {card} />
|
|
|
|
|
|
|
| 35 |
{:else if card.variant === 'register'}
|
| 36 |
<RegisterBody {card} />
|
| 37 |
{:else if card.variant === 'comparison'}
|
|
|
|
| 5 |
import ScalarsBody from './ScalarsBody.svelte';
|
| 6 |
import SparkBody from './SparkBody.svelte';
|
| 7 |
import TimeseriesBody from './TimeseriesBody.svelte';
|
| 8 |
+
import TimeseriesFtBody from './TimeseriesFtBody.svelte';
|
| 9 |
import ForecastBody from './ForecastBody.svelte';
|
| 10 |
import RasterBody from './RasterBody.svelte';
|
| 11 |
+
import LulcBody from './LulcBody.svelte';
|
| 12 |
import RegisterBody from './RegisterBody.svelte';
|
| 13 |
import ComparisonBody from './ComparisonBody.svelte';
|
| 14 |
import MetaBody from './MetaBody.svelte';
|
|
|
|
| 30 |
<SparkBody {card} />
|
| 31 |
{:else if card.variant === 'timeseries'}
|
| 32 |
<TimeseriesBody {card} />
|
| 33 |
+
{:else if card.variant === 'timeseries-ft'}
|
| 34 |
+
<TimeseriesFtBody {card} />
|
| 35 |
{:else if card.variant === 'forecast'}
|
| 36 |
<ForecastBody {card} />
|
| 37 |
{:else if card.variant === 'raster' || card.variant === 'raster-pred'}
|
| 38 |
<RasterBody {card} />
|
| 39 |
+
{:else if card.variant === 'lulc'}
|
| 40 |
+
<LulcBody {card} />
|
| 41 |
{:else if card.variant === 'register'}
|
| 42 |
<RegisterBody {card} />
|
| 43 |
{:else if card.variant === 'comparison'}
|
|
@@ -0,0 +1,117 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<script lang="ts">
|
| 2 |
+
import type { Card } from '$lib/types/card';
|
| 3 |
+
import RasterThumb from './RasterThumb.svelte';
|
| 4 |
+
let { card }: { card: Card } = $props();
|
| 5 |
+
|
| 6 |
+
/** v0.4.5 §4 — TerraMind LULC card body.
|
| 7 |
+
*
|
| 8 |
+
* Raster thumbnail + horizontal stacked class-mix bar showing
|
| 9 |
+
* percentage by LULC class. The bar uses the conventional LULC
|
| 10 |
+
* palette (urban / water / vegetation / barren / wetland) — those
|
| 11 |
+
* are visual conventions for the layer itself, NOT new tier
|
| 12 |
+
* signals. The four-tier palette stays load-bearing inside the
|
| 13 |
+
* card chrome. */
|
| 14 |
+
|
| 15 |
+
let total = $derived((card.classMix ?? []).reduce((acc, c) => acc + (c.pct || 0), 0) || 1);
|
| 16 |
+
</script>
|
| 17 |
+
|
| 18 |
+
<div class="body body-lulc">
|
| 19 |
+
<div class="frame">
|
| 20 |
+
<RasterThumb kind={card.rasterKind ?? 'lulc'} />
|
| 21 |
+
{#if card.illustrative || card.tier === 'synthetic'}
|
| 22 |
+
<span class="illustrative" title="Illustrative rendering, not source pixels">illustrative</span>
|
| 23 |
+
{/if}
|
| 24 |
+
</div>
|
| 25 |
+
|
| 26 |
+
{#if card.classMix?.length}
|
| 27 |
+
<div class="bar" role="img" aria-label="LULC class mix">
|
| 28 |
+
{#each card.classMix as c (c.k)}
|
| 29 |
+
<span
|
| 30 |
+
class="bar-seg"
|
| 31 |
+
style:flex-grow={c.pct / total}
|
| 32 |
+
style:background={c.color}
|
| 33 |
+
title="{c.k}: {c.pct}%"
|
| 34 |
+
></span>
|
| 35 |
+
{/each}
|
| 36 |
+
</div>
|
| 37 |
+
<ul class="legend">
|
| 38 |
+
{#each card.classMix as c (c.k)}
|
| 39 |
+
<li>
|
| 40 |
+
<span class="swatch" style:background={c.color}></span>
|
| 41 |
+
<span class="legend-k">{c.k}</span>
|
| 42 |
+
<span class="legend-pct">{c.pct}%</span>
|
| 43 |
+
</li>
|
| 44 |
+
{/each}
|
| 45 |
+
</ul>
|
| 46 |
+
{/if}
|
| 47 |
+
|
| 48 |
+
{#if card.sub}<div class="body-sub">{card.sub}</div>{/if}
|
| 49 |
+
</div>
|
| 50 |
+
|
| 51 |
+
<style>
|
| 52 |
+
.body-lulc {
|
| 53 |
+
padding: var(--s-2) var(--s-4) var(--s-3);
|
| 54 |
+
display: flex;
|
| 55 |
+
flex-direction: column;
|
| 56 |
+
gap: var(--s-2);
|
| 57 |
+
}
|
| 58 |
+
:global(.fc.is-compact) .body-lulc { padding: var(--s-2) var(--s-3); }
|
| 59 |
+
.frame { position: relative; border: 1px solid var(--rule-soft); }
|
| 60 |
+
.illustrative {
|
| 61 |
+
position: absolute;
|
| 62 |
+
top: 6px;
|
| 63 |
+
right: 6px;
|
| 64 |
+
background: rgba(26, 26, 26, 0.7);
|
| 65 |
+
color: var(--paper);
|
| 66 |
+
font-family: var(--font-mono);
|
| 67 |
+
font-size: 9px;
|
| 68 |
+
padding: 2px 6px;
|
| 69 |
+
letter-spacing: 0.05em;
|
| 70 |
+
text-transform: lowercase;
|
| 71 |
+
}
|
| 72 |
+
.bar {
|
| 73 |
+
display: flex;
|
| 74 |
+
height: 10px;
|
| 75 |
+
border: 1px solid var(--rule-soft);
|
| 76 |
+
overflow: hidden;
|
| 77 |
+
}
|
| 78 |
+
.bar-seg {
|
| 79 |
+
flex-shrink: 1;
|
| 80 |
+
flex-basis: 0;
|
| 81 |
+
}
|
| 82 |
+
.legend {
|
| 83 |
+
list-style: none;
|
| 84 |
+
margin: 0;
|
| 85 |
+
padding: 0;
|
| 86 |
+
display: grid;
|
| 87 |
+
grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
|
| 88 |
+
gap: 4px var(--s-3);
|
| 89 |
+
font-family: var(--font-mono);
|
| 90 |
+
font-size: 11px;
|
| 91 |
+
color: var(--ink-tertiary);
|
| 92 |
+
}
|
| 93 |
+
.legend li {
|
| 94 |
+
display: inline-flex;
|
| 95 |
+
align-items: center;
|
| 96 |
+
gap: 6px;
|
| 97 |
+
}
|
| 98 |
+
.swatch {
|
| 99 |
+
display: inline-block;
|
| 100 |
+
width: 10px;
|
| 101 |
+
height: 10px;
|
| 102 |
+
border: 1px solid var(--rule-soft);
|
| 103 |
+
flex: none;
|
| 104 |
+
}
|
| 105 |
+
.legend-k {
|
| 106 |
+
color: var(--ink);
|
| 107 |
+
text-transform: lowercase;
|
| 108 |
+
letter-spacing: 0.04em;
|
| 109 |
+
}
|
| 110 |
+
.legend-pct { color: var(--ink-tertiary); }
|
| 111 |
+
.body-sub {
|
| 112 |
+
font-family: var(--font-mono);
|
| 113 |
+
font-size: 11px;
|
| 114 |
+
color: var(--ink-tertiary);
|
| 115 |
+
line-height: 1.5;
|
| 116 |
+
}
|
| 117 |
+
</style>
|
|
@@ -1,6 +1,16 @@
|
|
| 1 |
<script lang="ts">
|
| 2 |
import type { Card } from '$lib/types/card';
|
| 3 |
import TierGlyph from '$lib/components/glyphs/TierGlyph.svelte';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
let { card }: { card: Card } = $props();
|
| 5 |
</script>
|
| 6 |
|
|
|
|
| 1 |
<script lang="ts">
|
| 2 |
import type { Card } from '$lib/types/card';
|
| 3 |
import TierGlyph from '$lib/components/glyphs/TierGlyph.svelte';
|
| 4 |
+
|
| 5 |
+
/** Hover-linking comes from the parent `FindingCard` chrome (which is
|
| 6 |
+
* itself a button when card.mapLayer is set) — it sets `linkedKey`
|
| 7 |
+
* on pointerenter / focus / keydown, so the map's `is-link-…` /
|
| 8 |
+
* outline + badge fires for the whole register card.
|
| 9 |
+
*
|
| 10 |
+
* v0.4.5 §8 click-to-fitBounds() per-row is a documented follow-up:
|
| 11 |
+
* it requires plumbing a MapLibre handle through FindingsRegion →
|
| 12 |
+
* StoneRegion → FindingCard → here, plus a register-points feature
|
| 13 |
+
* index keyed by sourceId. Out of scope for this polish pass. */
|
| 14 |
let { card }: { card: Card } = $props();
|
| 15 |
</script>
|
| 16 |
|
|
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<script lang="ts">
|
| 2 |
+
import type { Card } from '$lib/types/card';
|
| 3 |
+
import TimeseriesBody from './TimeseriesBody.svelte';
|
| 4 |
+
let { card }: { card: Card } = $props();
|
| 5 |
+
|
| 6 |
+
/** Fine-tuned-model timeseries variant (v0.4.5 §5).
|
| 7 |
+
*
|
| 8 |
+
* Reuses TimeseriesBody for the chart, then adds a footer chrome
|
| 9 |
+
* band: HF model-card link, RMSE, "−35% vs persistence" skill chip,
|
| 10 |
+
* and an AMD MI300X hardware badge. The footer is the load-bearing
|
| 11 |
+
* AMD-fine-tune narration on the hackathon submission. */
|
| 12 |
+
</script>
|
| 13 |
+
|
| 14 |
+
<TimeseriesBody {card} />
|
| 15 |
+
<div class="ft-footer">
|
| 16 |
+
{#if card.rmse}
|
| 17 |
+
<span class="ft-stat"><span class="ft-stat-k">RMSE</span> {card.rmse}</span>
|
| 18 |
+
{/if}
|
| 19 |
+
{#if card.skillVsPersistence}
|
| 20 |
+
<span class="ft-stat ft-skill">{card.skillVsPersistence}</span>
|
| 21 |
+
{/if}
|
| 22 |
+
{#if card.hardwareBadge}
|
| 23 |
+
<span class="ft-badge" title="Trained on this hardware">{card.hardwareBadge}</span>
|
| 24 |
+
{/if}
|
| 25 |
+
{#if card.hfModelCard}
|
| 26 |
+
<a class="ft-link"
|
| 27 |
+
href={card.hfModelCard.startsWith('http') ? card.hfModelCard : `https://${card.hfModelCard}`}
|
| 28 |
+
target="_blank" rel="noopener noreferrer">
|
| 29 |
+
Model card ↗
|
| 30 |
+
</a>
|
| 31 |
+
{/if}
|
| 32 |
+
</div>
|
| 33 |
+
|
| 34 |
+
<style>
|
| 35 |
+
.ft-footer {
|
| 36 |
+
margin: var(--s-2) var(--s-4) var(--s-3);
|
| 37 |
+
padding-top: var(--s-2);
|
| 38 |
+
border-top: 1px dashed var(--rule-soft);
|
| 39 |
+
display: flex;
|
| 40 |
+
flex-wrap: wrap;
|
| 41 |
+
gap: var(--s-3);
|
| 42 |
+
align-items: baseline;
|
| 43 |
+
font-family: var(--font-mono);
|
| 44 |
+
font-size: 11px;
|
| 45 |
+
color: var(--ink-tertiary);
|
| 46 |
+
}
|
| 47 |
+
:global(.fc.is-compact) .ft-footer { margin: var(--s-2) var(--s-3); }
|
| 48 |
+
.ft-stat {
|
| 49 |
+
display: inline-flex;
|
| 50 |
+
align-items: baseline;
|
| 51 |
+
gap: 4px;
|
| 52 |
+
color: var(--ink);
|
| 53 |
+
}
|
| 54 |
+
.ft-stat-k {
|
| 55 |
+
font-size: 10px;
|
| 56 |
+
color: var(--ink-tertiary);
|
| 57 |
+
letter-spacing: 0.05em;
|
| 58 |
+
text-transform: uppercase;
|
| 59 |
+
}
|
| 60 |
+
.ft-skill {
|
| 61 |
+
color: var(--tier-modeled);
|
| 62 |
+
font-weight: 500;
|
| 63 |
+
}
|
| 64 |
+
.ft-badge {
|
| 65 |
+
border: 1px solid var(--ink);
|
| 66 |
+
color: var(--ink);
|
| 67 |
+
padding: 1px 6px;
|
| 68 |
+
font-size: 10px;
|
| 69 |
+
letter-spacing: 0.06em;
|
| 70 |
+
text-transform: uppercase;
|
| 71 |
+
background: var(--paper);
|
| 72 |
+
}
|
| 73 |
+
.ft-link {
|
| 74 |
+
margin-left: auto;
|
| 75 |
+
color: var(--accent);
|
| 76 |
+
text-decoration: none;
|
| 77 |
+
}
|
| 78 |
+
.ft-link:hover { text-decoration: underline; }
|
| 79 |
+
</style>
|
|
@@ -2,70 +2,305 @@
|
|
| 2 |
import type { Tier } from '$lib/types/tier';
|
| 3 |
import TierGlyph from '$lib/components/glyphs/TierGlyph.svelte';
|
| 4 |
import TierBadge from '$lib/components/glyphs/TierBadge.svelte';
|
|
|
|
|
|
|
| 5 |
|
| 6 |
-
|
| 7 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
interface Props {
|
| 9 |
-
active: Record<
|
| 10 |
-
/**
|
| 11 |
-
*
|
| 12 |
-
*
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
* Pass `null` to show all four (e.g. for the spec page).
|
| 16 |
-
*/
|
| 17 |
-
featureCounts?: Record<LayerKey, number> | null;
|
| 18 |
-
onToggle: (key: LayerKey) => void;
|
| 19 |
}
|
| 20 |
|
| 21 |
let { active, featureCounts, onToggle }: Props = $props();
|
| 22 |
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
];
|
| 29 |
|
| 30 |
-
/
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
* key with count > 0 (or `undefined` while a fetch is still in
|
| 34 |
-
* flight) renders; explicit zero is dropped.
|
| 35 |
-
*/
|
| 36 |
-
let visibleLayers = $derived(
|
| 37 |
-
featureCounts === null
|
| 38 |
-
? LAYERS
|
| 39 |
-
: LAYERS.filter((l) => {
|
| 40 |
-
const n = featureCounts?.[l.key];
|
| 41 |
-
return n === undefined || n > 0;
|
| 42 |
-
})
|
| 43 |
-
);
|
| 44 |
</script>
|
| 45 |
|
| 46 |
-
|
| 47 |
-
<div class="
|
| 48 |
-
|
| 49 |
-
<span class="section-label">Layers · {visibleLayers.length}</span>
|
| 50 |
</div>
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
<
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 69 |
{/each}
|
| 70 |
-
|
| 71 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
import type { Tier } from '$lib/types/tier';
|
| 3 |
import TierGlyph from '$lib/components/glyphs/TierGlyph.svelte';
|
| 4 |
import TierBadge from '$lib/components/glyphs/TierBadge.svelte';
|
| 5 |
+
import type { StoneKey } from '$lib/types/card';
|
| 6 |
+
import { STONE_META, STONE_ORDER } from '$lib/types/card';
|
| 7 |
|
| 8 |
+
/** v0.4.5 §7 — LAYERS panel restructured to mirror Findings Stones.
|
| 9 |
+
*
|
| 10 |
+
* Each Stone is its own collapsed-but-visible group with one row per
|
| 11 |
+
* map layer keyed to that Stone. Master tier toggles (the live
|
| 12 |
+
* empirical / modeled / synthetic / proxy switches the map respects
|
| 13 |
+
* today) sit at the bottom of the panel; per-Stone rows inherit
|
| 14 |
+
* their tier's master state and display the resolved ON/OFF.
|
| 15 |
+
*
|
| 16 |
+
* Rows for layers that aren't yet wired into the map visibility
|
| 17 |
+
* pipeline render with a dimmed "off (not yet wired)" caption so the
|
| 18 |
+
* reader sees the catalog without thinking the toggle is broken. */
|
| 19 |
+
|
| 20 |
+
type MasterKey = 'empirical' | 'modeled' | 'synthetic' | 'proxy';
|
| 21 |
interface Props {
|
| 22 |
+
active: Record<MasterKey, boolean>;
|
| 23 |
+
/** Per-tier feature counts. Used to surface "no features" inline
|
| 24 |
+
* on each Stone row. `null` means caller wants the full catalog
|
| 25 |
+
* shown regardless of data-driven counts. */
|
| 26 |
+
featureCounts?: Record<MasterKey, number> | null;
|
| 27 |
+
onToggle: (key: MasterKey) => void;
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
}
|
| 29 |
|
| 30 |
let { active, featureCounts, onToggle }: Props = $props();
|
| 31 |
|
| 32 |
+
type LayerRow = {
|
| 33 |
+
label: string;
|
| 34 |
+
source: string;
|
| 35 |
+
tier: Tier;
|
| 36 |
+
/** When false, the row is purely catalog — the master tier toggle
|
| 37 |
+
* doesn't yet drive a real map source. Surfaced as "not yet wired". */
|
| 38 |
+
wired: boolean;
|
| 39 |
+
};
|
| 40 |
+
|
| 41 |
+
const STONE_LAYERS: Record<StoneKey, LayerRow[]> = {
|
| 42 |
+
cornerstone: [
|
| 43 |
+
{ label: 'Sandy Inundation Zone (2012)', source: 'NYC OEM', tier: 'empirical', wired: true },
|
| 44 |
+
{ label: 'FEMA / DEP scenarios', source: 'FEMA · NYC DEP', tier: 'modeled', wired: true },
|
| 45 |
+
{ label: 'Ida HWM points (2021)', source: 'USGS STN', tier: 'empirical', wired: false },
|
| 46 |
+
{ label: 'Microtopography (HAND/TWI)', source: 'USGS 3DEP', tier: 'proxy', wired: false },
|
| 47 |
+
],
|
| 48 |
+
keystone: [
|
| 49 |
+
{ label: 'MTA subway entrances', source: 'MTA Open Data', tier: 'empirical', wired: true },
|
| 50 |
+
{ label: 'NYCHA developments', source: 'NYC OD phvi-damg', tier: 'empirical', wired: true },
|
| 51 |
+
{ label: 'DOE schools', source: 'NYC DOE Locations', tier: 'empirical', wired: true },
|
| 52 |
+
{ label: 'DOH hospitals', source: 'NYS DOH vn5v-hh5r', tier: 'empirical', wired: true },
|
| 53 |
+
{ label: 'TerraMind Buildings (current)', source: 'msradam/TerraMind-NYC-Adapters', tier: 'synthetic', wired: false },
|
| 54 |
+
],
|
| 55 |
+
touchstone: [
|
| 56 |
+
{ label: '311 flood complaints', source: 'NYC 311', tier: 'proxy', wired: true },
|
| 57 |
+
{ label: 'FloodNet sensors', source: 'FloodNet NYC', tier: 'empirical', wired: false },
|
| 58 |
+
{ label: 'TerraMind LULC (current)', source: 'msradam/TerraMind-NYC-Adapters', tier: 'synthetic', wired: false },
|
| 59 |
+
{ label: 'Prithvi-NYC-Pluvial flood pred.', source: 'msradam/Prithvi-EO-2.0-NYC-Pluvial', tier: 'modeled', wired: false },
|
| 60 |
+
],
|
| 61 |
+
lodestone: [], // intentional — surfaced as the explicit absence row
|
| 62 |
+
capstone: [], // not a map layer; surfaced as "not a map layer"
|
| 63 |
+
};
|
| 64 |
+
|
| 65 |
+
/** Resolve a row's ON state from the master tier toggle. */
|
| 66 |
+
function isOn(row: LayerRow): boolean {
|
| 67 |
+
return !!active[row.tier];
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
function tally(stone: StoneKey): number {
|
| 71 |
+
return STONE_LAYERS[stone].length;
|
| 72 |
+
}
|
| 73 |
+
|
| 74 |
+
// Active tier toggles — rendered as small chips at the bottom of the
|
| 75 |
+
// panel so the user can still flip the four master switches.
|
| 76 |
+
const MASTERS: { k: MasterKey; tier: Tier; label: string }[] = [
|
| 77 |
+
{ k: 'empirical', tier: 'empirical', label: 'EMP' },
|
| 78 |
+
{ k: 'modeled', tier: 'modeled', label: 'MOD' },
|
| 79 |
+
{ k: 'proxy', tier: 'proxy', label: 'PRX' },
|
| 80 |
+
{ k: 'synthetic', tier: 'synthetic', label: 'SYN' },
|
| 81 |
];
|
| 82 |
|
| 83 |
+
// featureCounts is intentionally accepted but not used in the catalog
|
| 84 |
+
// view — the catalog shows every row regardless of live counts. Kept
|
| 85 |
+
// in the prop signature so callers don't have to change.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
</script>
|
| 87 |
|
| 88 |
+
<aside class="layers-panel" aria-label="Map layers grouped by Stone">
|
| 89 |
+
<div class="layers-head">
|
| 90 |
+
<span class="section-label">Layers · grouped by Stone</span>
|
|
|
|
| 91 |
</div>
|
| 92 |
+
|
| 93 |
+
{#each STONE_ORDER as stone (stone)}
|
| 94 |
+
<details class="layers-group region-{stone}" open>
|
| 95 |
+
<summary>
|
| 96 |
+
<span class="layers-caret" aria-hidden="true">▾</span>
|
| 97 |
+
<span class="layers-stone-name">{STONE_META[stone].name}</span>
|
| 98 |
+
<span class="layers-stone-tag">— {STONE_META[stone].tag}</span>
|
| 99 |
+
{#if tally(stone) > 0}
|
| 100 |
+
<span class="layers-count">{tally(stone)}</span>
|
| 101 |
+
{/if}
|
| 102 |
+
</summary>
|
| 103 |
+
<ul class="layers-list">
|
| 104 |
+
{#if stone === 'lodestone'}
|
| 105 |
+
<li class="layers-row layers-row-empty">
|
| 106 |
+
<span class="layers-empty-text">no map layers — see Findings cards</span>
|
| 107 |
+
</li>
|
| 108 |
+
{:else if stone === 'capstone'}
|
| 109 |
+
<li class="layers-row layers-row-empty">
|
| 110 |
+
<span class="layers-empty-text">not a map layer</span>
|
| 111 |
+
</li>
|
| 112 |
+
{:else}
|
| 113 |
+
{#each STONE_LAYERS[stone] as row, i (i)}
|
| 114 |
+
<li class="layers-row" class:dim={!row.wired}>
|
| 115 |
+
<span class="layers-glyph" aria-hidden="true">
|
| 116 |
+
<TierGlyph tier={row.tier} size={11} color="var(--tier-{row.tier})" />
|
| 117 |
+
</span>
|
| 118 |
+
<span class="layers-text">
|
| 119 |
+
<span class="layers-label">{row.label}</span>
|
| 120 |
+
<span class="layers-meta">{row.source} · <TierBadge tier={row.tier} compact /></span>
|
| 121 |
+
</span>
|
| 122 |
+
<span class="layers-state">
|
| 123 |
+
{#if !row.wired}
|
| 124 |
+
<span class="layers-state-dim" title="Not yet wired to map source">off · catalog</span>
|
| 125 |
+
{:else if isOn(row)}
|
| 126 |
+
on
|
| 127 |
+
{:else}
|
| 128 |
+
off
|
| 129 |
+
{/if}
|
| 130 |
+
</span>
|
| 131 |
+
</li>
|
| 132 |
+
{/each}
|
| 133 |
+
{/if}
|
| 134 |
+
</ul>
|
| 135 |
+
</details>
|
| 136 |
{/each}
|
| 137 |
+
|
| 138 |
+
<!-- Master tier toggles. These are the actual switches the map honours
|
| 139 |
+
today; each Stone row above resolves ON/OFF from these. -->
|
| 140 |
+
<div class="layers-masters" role="group" aria-label="Master tier toggles">
|
| 141 |
+
<span class="section-label">Tier toggles</span>
|
| 142 |
+
<div class="layers-master-row">
|
| 143 |
+
{#each MASTERS as m (m.k)}
|
| 144 |
+
<button
|
| 145 |
+
type="button"
|
| 146 |
+
class="layers-master"
|
| 147 |
+
class:is-on={active[m.k]}
|
| 148 |
+
aria-pressed={active[m.k]}
|
| 149 |
+
onclick={() => onToggle(m.k)}
|
| 150 |
+
>
|
| 151 |
+
<TierGlyph tier={m.tier} size={11} color="var(--tier-{m.tier})" />
|
| 152 |
+
<span>{m.label}</span>
|
| 153 |
+
<span class="layers-master-state">{active[m.k] ? 'ON' : 'OFF'}</span>
|
| 154 |
+
</button>
|
| 155 |
+
{/each}
|
| 156 |
+
</div>
|
| 157 |
+
</div>
|
| 158 |
+
</aside>
|
| 159 |
+
|
| 160 |
+
<style>
|
| 161 |
+
.layers-panel {
|
| 162 |
+
background: var(--paper);
|
| 163 |
+
border: 1px solid var(--rule-soft);
|
| 164 |
+
padding: var(--s-3) var(--s-4) var(--s-4);
|
| 165 |
+
display: flex;
|
| 166 |
+
flex-direction: column;
|
| 167 |
+
gap: var(--s-3);
|
| 168 |
+
font-family: var(--font-sans);
|
| 169 |
+
}
|
| 170 |
+
.layers-head { padding-bottom: 4px; }
|
| 171 |
+
|
| 172 |
+
.layers-group {
|
| 173 |
+
border-top: 1px solid var(--rule-soft);
|
| 174 |
+
padding-top: var(--s-2);
|
| 175 |
+
/* Stone-tinted left rule (v0.4.5 §9 sibling treatment). */
|
| 176 |
+
border-left: 3px solid var(--stone-tint, var(--rule-soft));
|
| 177 |
+
padding-left: var(--s-3);
|
| 178 |
+
}
|
| 179 |
+
.layers-group.region-cornerstone { --stone-tint: var(--stone-cornerstone); }
|
| 180 |
+
.layers-group.region-keystone { --stone-tint: var(--stone-keystone); }
|
| 181 |
+
.layers-group.region-touchstone { --stone-tint: var(--stone-touchstone); }
|
| 182 |
+
.layers-group.region-lodestone { --stone-tint: var(--stone-lodestone); }
|
| 183 |
+
.layers-group.region-capstone { --stone-tint: var(--stone-capstone); }
|
| 184 |
+
|
| 185 |
+
.layers-group summary {
|
| 186 |
+
cursor: pointer;
|
| 187 |
+
list-style: none;
|
| 188 |
+
display: flex;
|
| 189 |
+
align-items: baseline;
|
| 190 |
+
gap: var(--s-2);
|
| 191 |
+
padding: 4px 0;
|
| 192 |
+
}
|
| 193 |
+
.layers-group summary::-webkit-details-marker { display: none; }
|
| 194 |
+
.layers-caret {
|
| 195 |
+
font-size: 10px;
|
| 196 |
+
color: var(--ink-tertiary);
|
| 197 |
+
transition: transform 200ms ease;
|
| 198 |
+
}
|
| 199 |
+
.layers-group:not([open]) .layers-caret { transform: rotate(-90deg); }
|
| 200 |
+
.layers-stone-name {
|
| 201 |
+
font-family: var(--font-serif);
|
| 202 |
+
font-style: italic;
|
| 203 |
+
font-size: 16px;
|
| 204 |
+
color: var(--ink);
|
| 205 |
+
}
|
| 206 |
+
.layers-stone-tag {
|
| 207 |
+
font-family: var(--font-mono);
|
| 208 |
+
font-size: 11px;
|
| 209 |
+
color: var(--ink-tertiary);
|
| 210 |
+
letter-spacing: 0.04em;
|
| 211 |
+
}
|
| 212 |
+
.layers-count {
|
| 213 |
+
margin-left: auto;
|
| 214 |
+
font-family: var(--font-mono);
|
| 215 |
+
font-size: 10px;
|
| 216 |
+
color: var(--ink-tertiary);
|
| 217 |
+
letter-spacing: 0.05em;
|
| 218 |
+
text-transform: lowercase;
|
| 219 |
+
}
|
| 220 |
+
|
| 221 |
+
.layers-list {
|
| 222 |
+
list-style: none;
|
| 223 |
+
margin: 4px 0 var(--s-2);
|
| 224 |
+
padding: 0;
|
| 225 |
+
display: flex;
|
| 226 |
+
flex-direction: column;
|
| 227 |
+
}
|
| 228 |
+
.layers-row {
|
| 229 |
+
display: grid;
|
| 230 |
+
grid-template-columns: 16px 1fr auto;
|
| 231 |
+
gap: var(--s-2);
|
| 232 |
+
align-items: center;
|
| 233 |
+
padding: 4px 0;
|
| 234 |
+
font-family: var(--font-mono);
|
| 235 |
+
font-size: 11px;
|
| 236 |
+
color: var(--ink);
|
| 237 |
+
border-bottom: 1px dotted var(--rule-soft);
|
| 238 |
+
}
|
| 239 |
+
.layers-row:last-child { border-bottom: 0; }
|
| 240 |
+
.layers-row.dim { opacity: 0.7; }
|
| 241 |
+
.layers-glyph { display: inline-flex; align-items: center; }
|
| 242 |
+
.layers-text { display: flex; flex-direction: column; gap: 2px; }
|
| 243 |
+
.layers-label {
|
| 244 |
+
color: var(--ink);
|
| 245 |
+
font-family: var(--font-sans);
|
| 246 |
+
font-size: 12px;
|
| 247 |
+
}
|
| 248 |
+
.layers-meta {
|
| 249 |
+
font-family: var(--font-mono);
|
| 250 |
+
font-size: 10px;
|
| 251 |
+
color: var(--ink-tertiary);
|
| 252 |
+
display: inline-flex;
|
| 253 |
+
align-items: center;
|
| 254 |
+
gap: 4px;
|
| 255 |
+
}
|
| 256 |
+
.layers-state {
|
| 257 |
+
font-family: var(--font-mono);
|
| 258 |
+
font-size: 10px;
|
| 259 |
+
letter-spacing: 0.05em;
|
| 260 |
+
color: var(--ink);
|
| 261 |
+
text-transform: uppercase;
|
| 262 |
+
}
|
| 263 |
+
.layers-state-dim {
|
| 264 |
+
color: var(--ink-tertiary);
|
| 265 |
+
text-transform: lowercase;
|
| 266 |
+
font-style: italic;
|
| 267 |
+
}
|
| 268 |
+
.layers-row-empty .layers-empty-text {
|
| 269 |
+
grid-column: 1 / -1;
|
| 270 |
+
color: var(--ink-tertiary);
|
| 271 |
+
font-style: italic;
|
| 272 |
+
font-family: var(--font-mono);
|
| 273 |
+
font-size: 11px;
|
| 274 |
+
}
|
| 275 |
+
|
| 276 |
+
.layers-masters {
|
| 277 |
+
border-top: 1px solid var(--rule-soft);
|
| 278 |
+
padding-top: var(--s-2);
|
| 279 |
+
}
|
| 280 |
+
.layers-master-row {
|
| 281 |
+
margin-top: 4px;
|
| 282 |
+
display: flex;
|
| 283 |
+
flex-wrap: wrap;
|
| 284 |
+
gap: 6px;
|
| 285 |
+
}
|
| 286 |
+
.layers-master {
|
| 287 |
+
display: inline-flex;
|
| 288 |
+
align-items: center;
|
| 289 |
+
gap: 4px;
|
| 290 |
+
padding: 4px 8px;
|
| 291 |
+
background: var(--paper);
|
| 292 |
+
border: 1px solid var(--rule-soft);
|
| 293 |
+
cursor: pointer;
|
| 294 |
+
font-family: var(--font-mono);
|
| 295 |
+
font-size: 10px;
|
| 296 |
+
letter-spacing: 0.05em;
|
| 297 |
+
color: var(--ink);
|
| 298 |
+
}
|
| 299 |
+
.layers-master.is-on { background: var(--paper-deep); border-color: var(--ink); }
|
| 300 |
+
.layers-master-state {
|
| 301 |
+
margin-left: 4px;
|
| 302 |
+
color: var(--ink-tertiary);
|
| 303 |
+
font-size: 9px;
|
| 304 |
+
}
|
| 305 |
+
.layers-master.is-on .layers-master-state { color: var(--ink); }
|
| 306 |
+
</style>
|
|
@@ -28,6 +28,11 @@
|
|
| 28 |
registerPoints?: GeoJSON.FeatureCollection;
|
| 29 |
registerPolygons?: GeoJSON.FeatureCollection;
|
| 30 |
activeLayers?: { empirical: boolean; modeled: boolean; synthetic: boolean; proxy: boolean };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
}
|
| 32 |
|
| 33 |
let {
|
|
@@ -38,7 +43,8 @@
|
|
| 38 |
proxy311,
|
| 39 |
registerPoints,
|
| 40 |
registerPolygons,
|
| 41 |
-
activeLayers = { empirical: true, modeled: true, synthetic: true, proxy: true }
|
|
|
|
| 42 |
}: Props = $props();
|
| 43 |
|
| 44 |
let container: HTMLDivElement | null = $state(null);
|
|
@@ -293,13 +299,16 @@
|
|
| 293 |
});
|
| 294 |
</script>
|
| 295 |
|
| 296 |
-
<div class="map-frame">
|
| 297 |
<div
|
| 298 |
bind:this={container}
|
| 299 |
role="application"
|
| 300 |
aria-label="Flood-exposure map for {address.label}"
|
| 301 |
class="rip-map-container"
|
| 302 |
></div>
|
|
|
|
|
|
|
|
|
|
| 303 |
</div>
|
| 304 |
|
| 305 |
<style>
|
|
@@ -312,5 +321,25 @@
|
|
| 312 |
.map-frame {
|
| 313 |
aspect-ratio: 8 / 5.6;
|
| 314 |
position: relative;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 315 |
}
|
| 316 |
</style>
|
|
|
|
| 28 |
registerPoints?: GeoJSON.FeatureCollection;
|
| 29 |
registerPolygons?: GeoJSON.FeatureCollection;
|
| 30 |
activeLayers?: { empirical: boolean; modeled: boolean; synthetic: boolean; proxy: boolean };
|
| 31 |
+
/** v0.4.5 §8 — when a Findings card is hovered/focused, its
|
| 32 |
+
* `mapLayer` key flows in as `linkedKey`. The map root gains
|
| 33 |
+
* `is-link-{key}` so existing layers can be visually emphasised
|
| 34 |
+
* via scoped CSS. */
|
| 35 |
+
linkedKey?: string | null;
|
| 36 |
}
|
| 37 |
|
| 38 |
let {
|
|
|
|
| 43 |
proxy311,
|
| 44 |
registerPoints,
|
| 45 |
registerPolygons,
|
| 46 |
+
activeLayers = { empirical: true, modeled: true, synthetic: true, proxy: true },
|
| 47 |
+
linkedKey = null,
|
| 48 |
}: Props = $props();
|
| 49 |
|
| 50 |
let container: HTMLDivElement | null = $state(null);
|
|
|
|
| 299 |
});
|
| 300 |
</script>
|
| 301 |
|
| 302 |
+
<div class="map-frame" data-linked={linkedKey ?? ''}>
|
| 303 |
<div
|
| 304 |
bind:this={container}
|
| 305 |
role="application"
|
| 306 |
aria-label="Flood-exposure map for {address.label}"
|
| 307 |
class="rip-map-container"
|
| 308 |
></div>
|
| 309 |
+
{#if linkedKey}
|
| 310 |
+
<span class="link-badge" aria-hidden="true">linked: {linkedKey}</span>
|
| 311 |
+
{/if}
|
| 312 |
</div>
|
| 313 |
|
| 314 |
<style>
|
|
|
|
| 321 |
.map-frame {
|
| 322 |
aspect-ratio: 8 / 5.6;
|
| 323 |
position: relative;
|
| 324 |
+
transition: outline-color 200ms ease;
|
| 325 |
+
outline: 0 solid transparent;
|
| 326 |
+
outline-offset: 0;
|
| 327 |
+
}
|
| 328 |
+
.map-frame[data-linked]:not([data-linked='']) {
|
| 329 |
+
outline: 2px solid var(--accent-graphical);
|
| 330 |
+
}
|
| 331 |
+
.link-badge {
|
| 332 |
+
position: absolute;
|
| 333 |
+
bottom: 8px;
|
| 334 |
+
right: 8px;
|
| 335 |
+
padding: 3px 8px;
|
| 336 |
+
background: var(--ink);
|
| 337 |
+
color: var(--paper);
|
| 338 |
+
font-family: var(--font-mono);
|
| 339 |
+
font-size: 10px;
|
| 340 |
+
letter-spacing: 0.06em;
|
| 341 |
+
text-transform: lowercase;
|
| 342 |
+
z-index: 5;
|
| 343 |
+
pointer-events: none;
|
| 344 |
}
|
| 345 |
</style>
|
|
@@ -81,6 +81,33 @@
|
|
| 81 |
|
| 82 |
<div class="cold-start-trust">
|
| 83 |
<span class="section-label">How Riprap is built</span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
<ul class="cold-start-trust-list">
|
| 85 |
<li>All foundation models <strong>Apache-2.0</strong>; no commercial APIs at runtime.</li>
|
| 86 |
<li>All data from public-record federal, state, and city sources.</li>
|
|
@@ -90,3 +117,38 @@
|
|
| 90 |
<a href="#methodology" class="cold-start-method-link">Methodology paper →</a>
|
| 91 |
</div>
|
| 92 |
</section>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 81 |
|
| 82 |
<div class="cold-start-trust">
|
| 83 |
<span class="section-label">How Riprap is built</span>
|
| 84 |
+
|
| 85 |
+
<!-- v0.4.5 §9 — five-Stones one-liner with Stone-tinted dots beside
|
| 86 |
+
each name. Tints are hint-level decoration; print degrades them
|
| 87 |
+
to neutral gray via the @media print rule in tokens.css. -->
|
| 88 |
+
<ul class="cold-start-stones">
|
| 89 |
+
<li>
|
| 90 |
+
<span class="stone-dot" style="background: var(--stone-cornerstone);" aria-hidden="true"></span>
|
| 91 |
+
<em>Cornerstone</em> remembers — what NYC's ground remembers.
|
| 92 |
+
</li>
|
| 93 |
+
<li>
|
| 94 |
+
<span class="stone-dot" style="background: var(--stone-keystone);" aria-hidden="true"></span>
|
| 95 |
+
<em>Keystone</em> tallies — what's exposed.
|
| 96 |
+
</li>
|
| 97 |
+
<li>
|
| 98 |
+
<span class="stone-dot" style="background: var(--stone-touchstone);" aria-hidden="true"></span>
|
| 99 |
+
<em>Touchstone</em> watches — what's happening now.
|
| 100 |
+
</li>
|
| 101 |
+
<li>
|
| 102 |
+
<span class="stone-dot" style="background: var(--stone-lodestone);" aria-hidden="true"></span>
|
| 103 |
+
<em>Lodestone</em> projects — what's coming.
|
| 104 |
+
</li>
|
| 105 |
+
<li>
|
| 106 |
+
<span class="stone-dot" style="background: var(--stone-capstone);" aria-hidden="true"></span>
|
| 107 |
+
<em>Capstone</em> writes it all down with citations.
|
| 108 |
+
</li>
|
| 109 |
+
</ul>
|
| 110 |
+
|
| 111 |
<ul class="cold-start-trust-list">
|
| 112 |
<li>All foundation models <strong>Apache-2.0</strong>; no commercial APIs at runtime.</li>
|
| 113 |
<li>All data from public-record federal, state, and city sources.</li>
|
|
|
|
| 117 |
<a href="#methodology" class="cold-start-method-link">Methodology paper →</a>
|
| 118 |
</div>
|
| 119 |
</section>
|
| 120 |
+
|
| 121 |
+
<style>
|
| 122 |
+
.cold-start-stones {
|
| 123 |
+
list-style: none;
|
| 124 |
+
margin: 12px 0 16px;
|
| 125 |
+
padding: 0;
|
| 126 |
+
display: flex;
|
| 127 |
+
flex-direction: column;
|
| 128 |
+
gap: 6px;
|
| 129 |
+
}
|
| 130 |
+
.cold-start-stones li {
|
| 131 |
+
display: flex;
|
| 132 |
+
align-items: baseline;
|
| 133 |
+
gap: 10px;
|
| 134 |
+
font-family: var(--font-sans);
|
| 135 |
+
font-size: 14px;
|
| 136 |
+
color: var(--ink-secondary);
|
| 137 |
+
line-height: 1.5;
|
| 138 |
+
}
|
| 139 |
+
.cold-start-stones em {
|
| 140 |
+
font-family: var(--font-serif);
|
| 141 |
+
font-style: italic;
|
| 142 |
+
font-size: 16px;
|
| 143 |
+
color: var(--ink);
|
| 144 |
+
margin-right: 2px;
|
| 145 |
+
}
|
| 146 |
+
.stone-dot {
|
| 147 |
+
display: inline-block;
|
| 148 |
+
width: 6px;
|
| 149 |
+
height: 6px;
|
| 150 |
+
border-radius: 50%;
|
| 151 |
+
flex: none;
|
| 152 |
+
align-self: center;
|
| 153 |
+
}
|
| 154 |
+
</style>
|
|
@@ -9,7 +9,8 @@
|
|
| 9 |
* Stone-trace member ids match the FSM step names where possible so the
|
| 10 |
* adapter can replace this with live data without changing card copy.
|
| 11 |
*/
|
| 12 |
-
import type { FindingsData } from '$lib/types/card';
|
|
|
|
| 13 |
|
| 14 |
export const SAMPLE_FINDINGS: FindingsData = {
|
| 15 |
wallSeconds: 14.0,
|
|
@@ -104,18 +105,37 @@ export const SAMPLE_FINDINGS: FindingsData = {
|
|
| 104 |
mapLayer: 'complaints',
|
| 105 |
},
|
| 106 |
{
|
| 107 |
-
id: 'fc-prithvi',
|
| 108 |
stone: 'touchstone', tier: 'modeled', variant: 'raster-pred',
|
| 109 |
-
source: 'Prithvi-NYC', agency: '
|
| 110 |
-
vintage: '2026-05-02',
|
| 111 |
-
title: 'Pluvial flood prediction
|
| 112 |
rasterKind: 'prithvi',
|
| 113 |
headline: '0.3% flooded',
|
| 114 |
subhead: 'no flooding apparent · scene 2026-05-02',
|
| 115 |
sub: 'Model interpretation of imagery, not real-time observation. Confidence-mean 0.84 across non-flooded pixels.',
|
| 116 |
docId: 'PRITHVI-NYC-PLUV-V2-20260502', citeId: 'c-prithvi',
|
| 117 |
illustrative: true,
|
| 118 |
-
mapLayer: 'prithvi',
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 119 |
},
|
| 120 |
{
|
| 121 |
id: 'fc-nws',
|
|
@@ -137,16 +157,34 @@ export const SAMPLE_FINDINGS: FindingsData = {
|
|
| 137 |
{
|
| 138 |
id: 'fc-ttm-surge',
|
| 139 |
stone: 'lodestone', tier: 'modeled', variant: 'timeseries',
|
| 140 |
-
source: 'Granite TTM r2', agency: 'IBM Granite-TimeSeries ·
|
| 141 |
vintage: '2026-05-05 12:00 ET',
|
| 142 |
-
title: 'Storm surge nowcast at The Battery
|
| 143 |
timeseries: { hours: 96, peak: { x: 38, y: 47 }, peakLabel: '+47 cm @ +38h' },
|
| 144 |
headline: '+47 cm',
|
| 145 |
-
subhead: 'peak surge residual ·
|
| 146 |
-
sub: 'Nowcast applies city-wide via NOAA station 8518750.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 147 |
spatialNote: 'regional · The Battery, not point-of-query',
|
| 148 |
-
docId: '
|
| 149 |
mapLayer: null,
|
|
|
|
|
|
|
|
|
|
|
|
|
| 150 |
},
|
| 151 |
{
|
| 152 |
id: 'fc-npcc4',
|
|
@@ -173,10 +211,10 @@ export const SAMPLE_FINDINGS: FindingsData = {
|
|
| 173 |
vintage: '2026-05-05 14:22 ET',
|
| 174 |
title: 'Briefing reconciliation',
|
| 175 |
metaRows: [
|
| 176 |
-
{ k: '
|
| 177 |
-
{ k: '
|
| 178 |
-
{ k: '
|
| 179 |
-
{ k: '
|
| 180 |
],
|
| 181 |
sub: 'Capstone produces prose, not cards. This meta-card summarizes the reconciler chain that wrote the four-section briefing above.',
|
| 182 |
docId: 'RIPRAP-CAP-RH80', citeId: null,
|
|
@@ -184,52 +222,60 @@ export const SAMPLE_FINDINGS: FindingsData = {
|
|
| 184 |
},
|
| 185 |
],
|
| 186 |
|
| 187 |
-
|
|
|
|
|
|
|
|
|
|
| 188 |
{
|
| 189 |
key: 'cornerstone',
|
| 190 |
members: [
|
| 191 |
-
{ id: 'CORN-001', name: '
|
| 192 |
-
{ id: 'CORN-002', name: '
|
| 193 |
-
{ id: 'CORN-003', name: '
|
| 194 |
-
{ id: 'CORN-004', name: '
|
| 195 |
-
{ id: 'CORN-005', name: '
|
| 196 |
],
|
| 197 |
},
|
| 198 |
{
|
| 199 |
key: 'keystone',
|
| 200 |
members: [
|
| 201 |
-
{ id: 'KEY-001', name: '
|
| 202 |
-
{ id: 'KEY-002', name: '
|
| 203 |
-
{ id: 'KEY-003', name: '
|
| 204 |
-
{ id: 'KEY-004', name: '
|
| 205 |
-
{ id: 'KEY-005', name: 'PLUTO BBL fetch', status: 'ok', tier: 'empirical', ms: 130 },
|
| 206 |
],
|
| 207 |
},
|
| 208 |
{
|
| 209 |
key: 'touchstone',
|
| 210 |
members: [
|
| 211 |
-
{ id: 'TCH-001', name: '
|
| 212 |
-
{ id: 'TCH-002', name: '
|
| 213 |
-
{ id: 'TCH-003', name: '
|
| 214 |
-
{ id: 'TCH-004', name: '
|
| 215 |
-
{ id: 'TCH-005', name: '
|
|
|
|
| 216 |
],
|
| 217 |
},
|
| 218 |
{
|
| 219 |
key: 'lodestone',
|
| 220 |
members: [
|
| 221 |
-
{ id: 'LOD-001', name: '
|
| 222 |
-
{ id: 'LOD-002', name: '
|
| 223 |
-
{ id: 'LOD-003', name: '
|
|
|
|
|
|
|
| 224 |
],
|
| 225 |
},
|
| 226 |
{
|
| 227 |
key: 'capstone',
|
| 228 |
members: [
|
| 229 |
-
{ id: 'CAP-001', name: '
|
| 230 |
-
{ id: 'CAP-002', name: '
|
| 231 |
-
{ id: 'CAP-003', name: '
|
| 232 |
],
|
| 233 |
},
|
| 234 |
-
]
|
|
|
|
|
|
|
|
|
|
| 235 |
};
|
|
|
|
| 9 |
* Stone-trace member ids match the FSM step names where possible so the
|
| 10 |
* adapter can replace this with live data without changing card copy.
|
| 11 |
*/
|
| 12 |
+
import type { FindingsData, StoneTrace } from '$lib/types/card';
|
| 13 |
+
import { fillRosterForStone } from './stoneRegistry';
|
| 14 |
|
| 15 |
export const SAMPLE_FINDINGS: FindingsData = {
|
| 16 |
wallSeconds: 14.0,
|
|
|
|
| 105 |
mapLayer: 'complaints',
|
| 106 |
},
|
| 107 |
{
|
| 108 |
+
id: 'fc-prithvi-pluvial',
|
| 109 |
stone: 'touchstone', tier: 'modeled', variant: 'raster-pred',
|
| 110 |
+
source: 'Prithvi-NYC-Pluvial', agency: 'NASA-IBM Prithvi v2 · NYC fine-tune',
|
| 111 |
+
vintage: '2026-05-02 · Sentinel-2',
|
| 112 |
+
title: 'Pluvial flood prediction · Prithvi-NYC-Pluvial',
|
| 113 |
rasterKind: 'prithvi',
|
| 114 |
headline: '0.3% flooded',
|
| 115 |
subhead: 'no flooding apparent · scene 2026-05-02',
|
| 116 |
sub: 'Model interpretation of imagery, not real-time observation. Confidence-mean 0.84 across non-flooded pixels.',
|
| 117 |
docId: 'PRITHVI-NYC-PLUV-V2-20260502', citeId: 'c-prithvi',
|
| 118 |
illustrative: true,
|
| 119 |
+
mapLayer: 'prithvi-pluvial',
|
| 120 |
+
},
|
| 121 |
+
{
|
| 122 |
+
id: 'fc-terramind-lulc',
|
| 123 |
+
stone: 'touchstone', tier: 'synthetic', variant: 'lulc',
|
| 124 |
+
source: 'TerraMind v1.2', agency: 'IBM TerraMind v1.2 · Sentinel-2 inputs',
|
| 125 |
+
vintage: 'Sentinel-2 · 2024-09-18',
|
| 126 |
+
title: 'Land use / land cover · TerraMind v1.2',
|
| 127 |
+
rasterKind: 'lulc',
|
| 128 |
+
classMix: [
|
| 129 |
+
{ k: 'urban', pct: 62, color: '#C66' },
|
| 130 |
+
{ k: 'water', pct: 18, color: '#5B7FB4' },
|
| 131 |
+
{ k: 'vegetation', pct: 12, color: '#5B8A4A' },
|
| 132 |
+
{ k: 'barren', pct: 6, color: '#A89A78' },
|
| 133 |
+
{ k: 'wetland', pct: 2, color: '#D9C75A' },
|
| 134 |
+
],
|
| 135 |
+
sub: 'Synthetic prior. LULC palette is a layer convention, not a tier signal.',
|
| 136 |
+
docId: 'TERRAMIND-LULC-20240918', citeId: 'c-tm-lulc',
|
| 137 |
+
illustrative: true,
|
| 138 |
+
mapLayer: 'terramind-lulc',
|
| 139 |
},
|
| 140 |
{
|
| 141 |
id: 'fc-nws',
|
|
|
|
| 157 |
{
|
| 158 |
id: 'fc-ttm-surge',
|
| 159 |
stone: 'lodestone', tier: 'modeled', variant: 'timeseries',
|
| 160 |
+
source: 'Granite TTM r2 (zero-shot)', agency: 'IBM Granite-TimeSeries · regional',
|
| 161 |
vintage: '2026-05-05 12:00 ET',
|
| 162 |
+
title: 'Storm surge nowcast at The Battery — 9.6 h horizon (regional)',
|
| 163 |
timeseries: { hours: 96, peak: { x: 38, y: 47 }, peakLabel: '+47 cm @ +38h' },
|
| 164 |
headline: '+47 cm',
|
| 165 |
+
subhead: 'peak surge residual · 9.6h horizon · 6-min cadence',
|
| 166 |
+
sub: 'Regional disclosure. Nowcast applies city-wide via NOAA station 8518750. Distinct from the fine-tuned Battery surge nowcast.',
|
| 167 |
+
spatialNote: 'regional · The Battery, not point-of-query',
|
| 168 |
+
docId: 'ttm_battery_surge_zeroshot', citeId: 'c-ttm',
|
| 169 |
+
mapLayer: null,
|
| 170 |
+
},
|
| 171 |
+
{
|
| 172 |
+
id: 'fc-ttm-surge-ft',
|
| 173 |
+
stone: 'lodestone', tier: 'modeled', variant: 'timeseries-ft',
|
| 174 |
+
source: 'msradam/Granite-TTM-r2-Battery-Surge', agency: 'Granite TTM r2 · NYC-specialized fine-tune',
|
| 175 |
+
vintage: '2026-05-05 12:00 ET',
|
| 176 |
+
title: 'Storm surge nowcast at The Battery — 96 h horizon (NYC-specialized fine-tune)',
|
| 177 |
+
timeseries: { hours: 96, peak: { x: 38, y: 53 }, peakLabel: '+53 cm @ +38h' },
|
| 178 |
+
headline: '+53 cm',
|
| 179 |
+
subhead: 'peak surge · 96h horizon · hourly cadence',
|
| 180 |
+
sub: 'Fine-tuned on NYC tide-gauge history. Trained on AMD MI300X.',
|
| 181 |
spatialNote: 'regional · The Battery, not point-of-query',
|
| 182 |
+
docId: 'ttm_battery_surge_finetune', citeId: 'c-ttm-ft',
|
| 183 |
mapLayer: null,
|
| 184 |
+
hfModelCard: 'huggingface.co/msradam/Granite-TTM-r2-Battery-Surge',
|
| 185 |
+
rmse: '0.157 m',
|
| 186 |
+
skillVsPersistence: '−35% vs persistence',
|
| 187 |
+
hardwareBadge: 'MI300X',
|
| 188 |
},
|
| 189 |
{
|
| 190 |
id: 'fc-npcc4',
|
|
|
|
| 211 |
vintage: '2026-05-05 14:22 ET',
|
| 212 |
title: 'Briefing reconciliation',
|
| 213 |
metaRows: [
|
| 214 |
+
{ k: 'mellea reroll', v: '1 reroll' },
|
| 215 |
+
{ k: 'grounding checks', v: '4/4 passed' },
|
| 216 |
+
{ k: 'citations resolved', v: '4' },
|
| 217 |
+
{ k: 'wall-clock', v: '24.0 s' },
|
| 218 |
],
|
| 219 |
sub: 'Capstone produces prose, not cards. This meta-card summarizes the reconciler chain that wrote the four-section briefing above.',
|
| 220 |
docId: 'RIPRAP-CAP-RH80', citeId: null,
|
|
|
|
| 222 |
},
|
| 223 |
],
|
| 224 |
|
| 225 |
+
// Stones below carry one member per FSM step name. The registry
|
| 226 |
+
// projection at the bottom of this file fills in the not_invoked
|
| 227 |
+
// rows so each Stone renders its full intended roster.
|
| 228 |
+
stones: ([
|
| 229 |
{
|
| 230 |
key: 'cornerstone',
|
| 231 |
members: [
|
| 232 |
+
{ id: 'CORN-001', name: 'sandy_inundation', status: 'fired', tier: 'empirical', ms: 412 },
|
| 233 |
+
{ id: 'CORN-002', name: 'dep_stormwater', status: 'fired', tier: 'modeled', ms: 540 },
|
| 234 |
+
{ id: 'CORN-003', name: 'ida_hwm_2021', status: 'fired', tier: 'empirical', ms: 612 },
|
| 235 |
+
{ id: 'CORN-004', name: 'prithvi_eo_v2', status: 'fired', tier: 'modeled', ms: 980 },
|
| 236 |
+
{ id: 'CORN-005', name: 'microtopo_lidar', status: 'fired', tier: 'proxy', ms: 1240 },
|
| 237 |
],
|
| 238 |
},
|
| 239 |
{
|
| 240 |
key: 'keystone',
|
| 241 |
members: [
|
| 242 |
+
{ id: 'KEY-001', name: 'mta_entrance_exposure', status: 'silent_by_design', tier: 'empirical', ms: 30, note: 'no entrances within radius' },
|
| 243 |
+
{ id: 'KEY-002', name: 'nycha_development_exposure', status: 'silent_by_design', tier: 'empirical', ms: 28, note: 'no NYCHA developments within 1.0 mi' },
|
| 244 |
+
{ id: 'KEY-003', name: 'doe_school_exposure', status: 'silent_by_design', tier: 'empirical', ms: 24, note: 'no DOE schools within 1.0 mi' },
|
| 245 |
+
{ id: 'KEY-004', name: 'doh_hospital_exposure', status: 'silent_by_design', tier: 'empirical', ms: 22, note: 'no acute-care hospitals within 1.0 mi' },
|
|
|
|
| 246 |
],
|
| 247 |
},
|
| 248 |
{
|
| 249 |
key: 'touchstone',
|
| 250 |
members: [
|
| 251 |
+
{ id: 'TCH-001', name: 'floodnet', status: 'fired', tier: 'empirical', ms: 285 },
|
| 252 |
+
{ id: 'TCH-002', name: 'nyc311', status: 'fired', tier: 'proxy', ms: 410 },
|
| 253 |
+
{ id: 'TCH-003', name: 'nws_obs', status: 'fired', tier: 'empirical', ms: 240 },
|
| 254 |
+
{ id: 'TCH-004', name: 'noaa_tides', status: 'fired', tier: 'empirical', ms: 196 },
|
| 255 |
+
{ id: 'TCH-005', name: 'prithvi_eo_live', status: 'fired', tier: 'modeled', ms: 4920 },
|
| 256 |
+
{ id: 'TCH-006', name: 'terramind_lulc', status: 'fired', tier: 'synthetic', ms: 2100 },
|
| 257 |
],
|
| 258 |
},
|
| 259 |
{
|
| 260 |
key: 'lodestone',
|
| 261 |
members: [
|
| 262 |
+
{ id: 'LOD-001', name: 'nws_alerts', status: 'fired', tier: 'modeled', ms: 110 },
|
| 263 |
+
{ id: 'LOD-002', name: 'ttm_forecast', status: 'fired', tier: 'modeled', ms: 1500 },
|
| 264 |
+
{ id: 'LOD-003', name: 'ttm_battery_surge', status: 'fired', tier: 'modeled', ms: 1480 },
|
| 265 |
+
{ id: 'LOD-004', name: 'floodnet_forecast', status: 'silent_by_design', tier: 'modeled', ms: 14, note: 'sensor has only 2 historical events; forecast omitted (silent-floor: 5)' },
|
| 266 |
+
{ id: 'LOD-005', name: 'ttm_311_forecast', status: 'errored', tier: 'modeled', ms: 0, note: '311 history fetch failed: HTTP 503 at NYC OpenData (3 retries)' },
|
| 267 |
],
|
| 268 |
},
|
| 269 |
{
|
| 270 |
key: 'capstone',
|
| 271 |
members: [
|
| 272 |
+
{ id: 'CAP-001', name: 'rag_granite_embedding', status: 'fired', tier: 'proxy', ms: 410 },
|
| 273 |
+
{ id: 'CAP-002', name: 'gliner_extract', status: 'fired', tier: 'proxy', ms: 280 },
|
| 274 |
+
{ id: 'CAP-003', name: 'reconcile_granite41', status: 'fired', tier: 'modeled', ms: 6240 },
|
| 275 |
],
|
| 276 |
},
|
| 277 |
+
] satisfies StoneTrace[]).map((s): StoneTrace => ({
|
| 278 |
+
key: s.key,
|
| 279 |
+
members: fillRosterForStone(s.key, s.members),
|
| 280 |
+
})),
|
| 281 |
};
|
|
@@ -0,0 +1,296 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/**
|
| 2 |
+
* Stone specialist registry — the auditability contract.
|
| 3 |
+
*
|
| 4 |
+
* Each Stone declares the **complete inventory** of specialists it
|
| 5 |
+
* could fire on a query, along with the FSM step name (used to join
|
| 6 |
+
* against the run trace) and a one-line skip reason for when a
|
| 7 |
+
* specialist is absent from a particular run.
|
| 8 |
+
*
|
| 9 |
+
* v0.4.5 §3: every Stone's expander shows the full intended roster,
|
| 10 |
+
* never a filtered subset. A reader who expands a Stone sees what
|
| 11 |
+
* could have happened *and* what did. Specialists missing from the
|
| 12 |
+
* run output render as `not_invoked` with their registered skip
|
| 13 |
+
* reason.
|
| 14 |
+
*
|
| 15 |
+
* The display name and FSM step name often differ (the trace emits
|
| 16 |
+
* `mta_entrance_exposure`, the FSM action is `step_mta_entrances`,
|
| 17 |
+
* the Findings adapter writes state key `mta_entrances`). The
|
| 18 |
+
* `stepNames` list maps the registry entry to all variants the
|
| 19 |
+
* trace might emit so we don't double-count or miss matches.
|
| 20 |
+
*/
|
| 21 |
+
import type { StoneKey, StoneMember } from '$lib/types/card';
|
| 22 |
+
|
| 23 |
+
export type RegistryEntry = {
|
| 24 |
+
/** Stable id used when projecting a not_invoked row into the trace. */
|
| 25 |
+
id: string;
|
| 26 |
+
/** Display name in the provenance row (italic-serif). */
|
| 27 |
+
name: string;
|
| 28 |
+
/** All FSM step names that count as a "fire" for this entry. */
|
| 29 |
+
stepNames: string[];
|
| 30 |
+
/** Default tier when known; not_invoked rows render this color. */
|
| 31 |
+
tier?: StoneMember['tier'];
|
| 32 |
+
/** One-line message rendered when the specialist is not_invoked.
|
| 33 |
+
* Engineering-honest voice (V0.4.5_SPEC.md §1) — describe the
|
| 34 |
+
* precondition that wasn't met, not "no data found". */
|
| 35 |
+
skipReason: string;
|
| 36 |
+
};
|
| 37 |
+
|
| 38 |
+
export const STONE_REGISTRY: Record<StoneKey, RegistryEntry[]> = {
|
| 39 |
+
cornerstone: [
|
| 40 |
+
{
|
| 41 |
+
id: 'CORN-001',
|
| 42 |
+
name: 'sandy_inundation.lookup',
|
| 43 |
+
stepNames: ['sandy_inundation', 'sandy_nta'],
|
| 44 |
+
tier: 'empirical',
|
| 45 |
+
skipReason: 'Sandy 2012 inundation: query outside NYC bounds',
|
| 46 |
+
},
|
| 47 |
+
{
|
| 48 |
+
id: 'CORN-002',
|
| 49 |
+
name: 'dep_stormwater.lookup',
|
| 50 |
+
stepNames: ['dep_stormwater', 'dep_extreme_2080_nta', 'dep_moderate_2050_nta', 'dep_moderate_current_nta'],
|
| 51 |
+
tier: 'modeled',
|
| 52 |
+
skipReason: 'NYC DEP stormwater scenarios: query outside NYC bounds',
|
| 53 |
+
},
|
| 54 |
+
{
|
| 55 |
+
id: 'CORN-003',
|
| 56 |
+
name: 'usgs_hwm.spatial_join',
|
| 57 |
+
stepNames: ['ida_hwm_2021'],
|
| 58 |
+
tier: 'empirical',
|
| 59 |
+
skipReason: 'USGS Ida HWMs: no marks within 800 m of address',
|
| 60 |
+
},
|
| 61 |
+
{
|
| 62 |
+
id: 'CORN-004',
|
| 63 |
+
name: 'prithvi_water.lookup',
|
| 64 |
+
stepNames: ['prithvi_eo_v2'],
|
| 65 |
+
tier: 'modeled',
|
| 66 |
+
skipReason: 'Prithvi-EO Ida polygons: no polygons within 500 m',
|
| 67 |
+
},
|
| 68 |
+
{
|
| 69 |
+
id: 'CORN-005',
|
| 70 |
+
name: 'microtopo.dem_hand_twi',
|
| 71 |
+
stepNames: ['microtopo_lidar', 'microtopo_nta'],
|
| 72 |
+
tier: 'proxy',
|
| 73 |
+
skipReason: 'USGS 3DEP DEM: query outside NYC raster coverage',
|
| 74 |
+
},
|
| 75 |
+
],
|
| 76 |
+
keystone: [
|
| 77 |
+
{
|
| 78 |
+
id: 'KEY-001',
|
| 79 |
+
name: 'mta_entrance_exposure',
|
| 80 |
+
stepNames: ['mta_entrance_exposure'],
|
| 81 |
+
tier: 'empirical',
|
| 82 |
+
skipReason: 'no entrances within radius',
|
| 83 |
+
},
|
| 84 |
+
{
|
| 85 |
+
id: 'KEY-002',
|
| 86 |
+
name: 'nycha.development_join',
|
| 87 |
+
stepNames: ['nycha_development_exposure'],
|
| 88 |
+
tier: 'empirical',
|
| 89 |
+
skipReason: 'no NYCHA developments within 1.0 mi',
|
| 90 |
+
},
|
| 91 |
+
{
|
| 92 |
+
id: 'KEY-003',
|
| 93 |
+
name: 'doe.school_join',
|
| 94 |
+
stepNames: ['doe_school_exposure'],
|
| 95 |
+
tier: 'empirical',
|
| 96 |
+
skipReason: 'no DOE schools within 1.0 mi',
|
| 97 |
+
},
|
| 98 |
+
{
|
| 99 |
+
id: 'KEY-004',
|
| 100 |
+
name: 'doh.facility_join',
|
| 101 |
+
stepNames: ['doh_hospital_exposure'],
|
| 102 |
+
tier: 'empirical',
|
| 103 |
+
skipReason: 'no acute-care hospitals within 1.0 mi',
|
| 104 |
+
},
|
| 105 |
+
{
|
| 106 |
+
id: 'KEY-005',
|
| 107 |
+
name: 'pluto.lot_lookup',
|
| 108 |
+
stepNames: ['pluto_lookup'],
|
| 109 |
+
tier: 'empirical',
|
| 110 |
+
skipReason: 'PLUTO join skipped: queried address not in NYC PLUTO dataset',
|
| 111 |
+
},
|
| 112 |
+
{
|
| 113 |
+
id: 'KEY-006',
|
| 114 |
+
name: 'terramind.buildings',
|
| 115 |
+
stepNames: ['terramind_buildings', 'terramind_synthesis'],
|
| 116 |
+
tier: 'modeled',
|
| 117 |
+
skipReason: 'TerraMind Buildings adapter: heavy specialist disabled (RIPRAP_HEAVY_SPECIALISTS=0)',
|
| 118 |
+
},
|
| 119 |
+
],
|
| 120 |
+
touchstone: [
|
| 121 |
+
{
|
| 122 |
+
id: 'TCH-001',
|
| 123 |
+
name: 'floodnet.history',
|
| 124 |
+
stepNames: ['floodnet'],
|
| 125 |
+
tier: 'empirical',
|
| 126 |
+
skipReason: 'FloodNet sensor: no deployments within 600 m',
|
| 127 |
+
},
|
| 128 |
+
{
|
| 129 |
+
id: 'TCH-002',
|
| 130 |
+
name: 'nyc311.flood_complaints',
|
| 131 |
+
stepNames: ['nyc311', 'nyc311_nta'],
|
| 132 |
+
tier: 'proxy',
|
| 133 |
+
skipReason: 'NYC 311: no flood-relevant complaints within 200 m',
|
| 134 |
+
},
|
| 135 |
+
{
|
| 136 |
+
id: 'TCH-003',
|
| 137 |
+
name: 'nws_obs.metar',
|
| 138 |
+
stepNames: ['nws_obs'],
|
| 139 |
+
tier: 'empirical',
|
| 140 |
+
skipReason: 'NWS hourly METAR: nearest ASOS reports no precipitation',
|
| 141 |
+
},
|
| 142 |
+
{
|
| 143 |
+
id: 'TCH-004',
|
| 144 |
+
name: 'noaa_coops.recent',
|
| 145 |
+
stepNames: ['noaa_tides'],
|
| 146 |
+
tier: 'empirical',
|
| 147 |
+
skipReason: 'NOAA tide gauge: nearest station >25 km from address',
|
| 148 |
+
},
|
| 149 |
+
{
|
| 150 |
+
id: 'TCH-005',
|
| 151 |
+
name: 'prithvi_nyc_pluvial',
|
| 152 |
+
stepNames: ['prithvi_eo_live'],
|
| 153 |
+
tier: 'modeled',
|
| 154 |
+
skipReason: 'Prithvi-NYC-Pluvial: live segmentation specialist disabled or no <30% cloud Sentinel-2 in last 120 d',
|
| 155 |
+
},
|
| 156 |
+
{
|
| 157 |
+
id: 'TCH-006',
|
| 158 |
+
name: 'terramind.lulc',
|
| 159 |
+
stepNames: ['terramind_lulc'],
|
| 160 |
+
tier: 'synthetic',
|
| 161 |
+
skipReason: 'TerraMind LULC adapter: heavy specialist disabled or eo_chip fetch silent',
|
| 162 |
+
},
|
| 163 |
+
],
|
| 164 |
+
lodestone: [
|
| 165 |
+
{
|
| 166 |
+
id: 'LOD-001',
|
| 167 |
+
name: 'nws_alerts.flood_relevant',
|
| 168 |
+
stepNames: ['nws_alerts'],
|
| 169 |
+
tier: 'modeled',
|
| 170 |
+
skipReason: 'NWS public alerts: no active flood-relevant alerts at this address',
|
| 171 |
+
},
|
| 172 |
+
{
|
| 173 |
+
id: 'LOD-002',
|
| 174 |
+
name: 'ttm_battery_surge.zero_shot',
|
| 175 |
+
stepNames: ['ttm_forecast'],
|
| 176 |
+
tier: 'modeled',
|
| 177 |
+
skipReason: 'Granite TTM r2 zero-shot: forecast not interesting (peak |residual| < 0.3 ft)',
|
| 178 |
+
},
|
| 179 |
+
{
|
| 180 |
+
id: 'LOD-003',
|
| 181 |
+
name: 'ttm_battery_surge.fine_tune',
|
| 182 |
+
stepNames: ['ttm_battery_surge'],
|
| 183 |
+
tier: 'modeled',
|
| 184 |
+
skipReason: 'Granite TTM Battery fine-tune: forecast not interesting (peak |residual| < 0.3 m)',
|
| 185 |
+
},
|
| 186 |
+
{
|
| 187 |
+
id: 'LOD-004',
|
| 188 |
+
name: 'ttm_311_forecast',
|
| 189 |
+
stepNames: ['ttm_311_forecast'],
|
| 190 |
+
tier: 'modeled',
|
| 191 |
+
skipReason: 'NYC 311 weekly forecast: no per-address history to extrapolate',
|
| 192 |
+
},
|
| 193 |
+
{
|
| 194 |
+
id: 'LOD-005',
|
| 195 |
+
name: 'floodnet_forecast',
|
| 196 |
+
stepNames: ['floodnet_forecast'],
|
| 197 |
+
tier: 'modeled',
|
| 198 |
+
skipReason: 'FloodNet sensor recurrence: sensor has < silent-floor historical events; forecast omitted',
|
| 199 |
+
},
|
| 200 |
+
{
|
| 201 |
+
id: 'LOD-006',
|
| 202 |
+
name: 'npcc4.slr_projection',
|
| 203 |
+
stepNames: ['npcc4_projection'],
|
| 204 |
+
tier: 'modeled',
|
| 205 |
+
skipReason: 'NPCC4 SLR projection: not yet wired into FSM (static reference card on hold)',
|
| 206 |
+
},
|
| 207 |
+
],
|
| 208 |
+
capstone: [
|
| 209 |
+
{
|
| 210 |
+
id: 'CAP-001',
|
| 211 |
+
name: 'rag.granite_embedding',
|
| 212 |
+
stepNames: ['rag_granite_embedding'],
|
| 213 |
+
tier: 'proxy',
|
| 214 |
+
skipReason: 'Granite Embedding RAG: no policy retrieval (out-of-NYC scope)',
|
| 215 |
+
},
|
| 216 |
+
{
|
| 217 |
+
id: 'CAP-002',
|
| 218 |
+
name: 'gliner.typed_extraction',
|
| 219 |
+
stepNames: ['gliner_extract'],
|
| 220 |
+
tier: 'proxy',
|
| 221 |
+
skipReason: 'GLiNER typed extraction: no RAG hits to extract over',
|
| 222 |
+
},
|
| 223 |
+
{
|
| 224 |
+
id: 'CAP-003',
|
| 225 |
+
name: 'granite41.compose_briefing',
|
| 226 |
+
stepNames: ['reconcile_granite41', 'mellea_reconcile_address', 'reconcile_neighborhood', 'reconcile_development', 'reconcile_live_now'],
|
| 227 |
+
tier: 'modeled',
|
| 228 |
+
skipReason: 'Reconciler did not run (no grounded data available)',
|
| 229 |
+
},
|
| 230 |
+
{
|
| 231 |
+
id: 'CAP-004',
|
| 232 |
+
name: 'mellea.grounding_check',
|
| 233 |
+
stepNames: ['mellea_grounding'],
|
| 234 |
+
tier: 'modeled',
|
| 235 |
+
skipReason: 'Mellea grounding-check: rolled into reconcile step on this run',
|
| 236 |
+
},
|
| 237 |
+
],
|
| 238 |
+
};
|
| 239 |
+
|
| 240 |
+
/** Project the registry against the run's actual specialist members.
|
| 241 |
+
* Emits a full-roster member list per Stone — present specialists keep
|
| 242 |
+
* their live status; absent ones land as `not_invoked` with their
|
| 243 |
+
* registered skip reason. */
|
| 244 |
+
export function fillRosterForStone(
|
| 245 |
+
stone: StoneKey,
|
| 246 |
+
liveMembers: StoneMember[],
|
| 247 |
+
): StoneMember[] {
|
| 248 |
+
const registry = STONE_REGISTRY[stone] ?? [];
|
| 249 |
+
// Index live members by every step name they could match.
|
| 250 |
+
const liveByStep = new Map<string, StoneMember>();
|
| 251 |
+
for (const m of liveMembers) {
|
| 252 |
+
liveByStep.set(m.name, m);
|
| 253 |
+
}
|
| 254 |
+
|
| 255 |
+
const out: StoneMember[] = [];
|
| 256 |
+
const used = new Set<string>();
|
| 257 |
+
|
| 258 |
+
for (const entry of registry) {
|
| 259 |
+
let live: StoneMember | undefined;
|
| 260 |
+
for (const sn of entry.stepNames) {
|
| 261 |
+
const hit = liveByStep.get(sn);
|
| 262 |
+
if (hit) {
|
| 263 |
+
live = hit;
|
| 264 |
+
used.add(sn);
|
| 265 |
+
break;
|
| 266 |
+
}
|
| 267 |
+
}
|
| 268 |
+
if (live) {
|
| 269 |
+
out.push({
|
| 270 |
+
...live,
|
| 271 |
+
// Override id + name with the registry's display strings so the
|
| 272 |
+
// provenance row reads consistently regardless of trace munging.
|
| 273 |
+
id: entry.id,
|
| 274 |
+
name: entry.name,
|
| 275 |
+
tier: live.tier ?? entry.tier ?? null,
|
| 276 |
+
});
|
| 277 |
+
} else {
|
| 278 |
+
out.push({
|
| 279 |
+
id: entry.id,
|
| 280 |
+
name: entry.name,
|
| 281 |
+
status: 'not_invoked',
|
| 282 |
+
tier: entry.tier ?? null,
|
| 283 |
+
note: entry.skipReason,
|
| 284 |
+
});
|
| 285 |
+
}
|
| 286 |
+
}
|
| 287 |
+
|
| 288 |
+
// Append any live members that weren't in the registry — they were
|
| 289 |
+
// emitted by the FSM but we don't know about them. Surface them
|
| 290 |
+
// anyway so we don't silently drop trace rows.
|
| 291 |
+
for (const m of liveMembers) {
|
| 292 |
+
if (!used.has(m.name)) out.push(m);
|
| 293 |
+
}
|
| 294 |
+
|
| 295 |
+
return out;
|
| 296 |
+
}
|
|
@@ -26,6 +26,16 @@
|
|
| 26 |
--tier-synthetic-fill: rgba(42, 111, 168, 0.25);
|
| 27 |
--tier-synthetic-line: #2A6FA8;
|
| 28 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
/* ── Reference + accent ── */
|
| 30 |
--reference-bg: #E8E8E6;
|
| 31 |
--reference-line: #C9C9C5;
|
|
@@ -149,3 +159,16 @@ html, body {
|
|
| 149 |
border-top: 2px solid var(--ink);
|
| 150 |
margin: 0;
|
| 151 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
--tier-synthetic-fill: rgba(42, 111, 168, 0.25);
|
| 27 |
--tier-synthetic-line: #2A6FA8;
|
| 28 |
|
| 29 |
+
/* ── Stone accent tokens (v0.4.5) ──
|
| 30 |
+
Five muted hint-colors keyed to Stones. L≈45 OKLCH, chroma ≤0.04.
|
| 31 |
+
Hint-level decoration; never competes with the four-tier epistemic
|
| 32 |
+
palette. All five degrade to neutral gray in @media print. */
|
| 33 |
+
--stone-cornerstone: #7C6F5E; /* warm taupe */
|
| 34 |
+
--stone-keystone: #5E6E7C; /* cool slate */
|
| 35 |
+
--stone-touchstone: #6B7C66; /* muted sage */
|
| 36 |
+
--stone-lodestone: #7C6E5E; /* softened ochre */
|
| 37 |
+
--stone-capstone: #5E5E6E; /* neutral indigo-gray */
|
| 38 |
+
|
| 39 |
/* ── Reference + accent ── */
|
| 40 |
--reference-bg: #E8E8E6;
|
| 41 |
--reference-line: #C9C9C5;
|
|
|
|
| 159 |
border-top: 2px solid var(--ink);
|
| 160 |
margin: 0;
|
| 161 |
}
|
| 162 |
+
|
| 163 |
+
/* v0.4.5 — Stone tints degrade to neutral gray in print so the PDF's
|
| 164 |
+
hierarchy is preserved by structure (Stone headings, type scale,
|
| 165 |
+
rules), not by color. */
|
| 166 |
+
@media print {
|
| 167 |
+
:root {
|
| 168 |
+
--stone-cornerstone: #999;
|
| 169 |
+
--stone-keystone: #999;
|
| 170 |
+
--stone-touchstone: #999;
|
| 171 |
+
--stone-lodestone: #999;
|
| 172 |
+
--stone-capstone: #999;
|
| 173 |
+
}
|
| 174 |
+
}
|
|
@@ -33,7 +33,13 @@ export const STONE_META: Record<StoneKey, StoneMeta> = {
|
|
| 33 |
capstone: { name: 'Capstone', role: 'the synthesizer', tag: 'writes it all down with citations' },
|
| 34 |
};
|
| 35 |
|
| 36 |
-
/**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
export type CardVariant =
|
| 38 |
| 'headline'
|
| 39 |
| 'tabular'
|
|
@@ -41,9 +47,11 @@ export type CardVariant =
|
|
| 41 |
| 'spark'
|
| 42 |
| 'histogram'
|
| 43 |
| 'timeseries'
|
|
|
|
| 44 |
| 'forecast'
|
| 45 |
| 'raster'
|
| 46 |
| 'raster-pred'
|
|
|
|
| 47 |
| 'register'
|
| 48 |
| 'comparison'
|
| 49 |
| 'meta';
|
|
@@ -164,15 +172,49 @@ export type Card = {
|
|
| 164 |
|
| 165 |
// meta
|
| 166 |
metaRows?: MetaRow[];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 167 |
};
|
| 168 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 169 |
/** Per-Stone provenance member (specialist) summary used by the trace. */
|
| 170 |
export type StoneMember = {
|
| 171 |
id: string;
|
| 172 |
name: string;
|
| 173 |
-
status:
|
| 174 |
tier?: Tier | null;
|
| 175 |
ms?: number;
|
|
|
|
|
|
|
|
|
|
|
|
|
| 176 |
note?: string;
|
| 177 |
children?: StoneMember[];
|
| 178 |
};
|
|
|
|
| 33 |
capstone: { name: 'Capstone', role: 'the synthesizer', tag: 'writes it all down with citations' },
|
| 34 |
};
|
| 35 |
|
| 36 |
+
/** 14 card body variants — one renderer per shape.
|
| 37 |
+
*
|
| 38 |
+
* timeseries-ft — v0.4.5 §5: timeseries + fine-tuned-model footer
|
| 39 |
+
* (HF model-card link, RMSE, hardware badge).
|
| 40 |
+
* lulc — v0.4.5 §4: raster + horizontal stacked class-mix bar
|
| 41 |
+
* for TerraMind LULC outputs.
|
| 42 |
+
*/
|
| 43 |
export type CardVariant =
|
| 44 |
| 'headline'
|
| 45 |
| 'tabular'
|
|
|
|
| 47 |
| 'spark'
|
| 48 |
| 'histogram'
|
| 49 |
| 'timeseries'
|
| 50 |
+
| 'timeseries-ft'
|
| 51 |
| 'forecast'
|
| 52 |
| 'raster'
|
| 53 |
| 'raster-pred'
|
| 54 |
+
| 'lulc'
|
| 55 |
| 'register'
|
| 56 |
| 'comparison'
|
| 57 |
| 'meta';
|
|
|
|
| 172 |
|
| 173 |
// meta
|
| 174 |
metaRows?: MetaRow[];
|
| 175 |
+
|
| 176 |
+
// timeseries-ft — fine-tuned-model footer chrome (v0.4.5 §5)
|
| 177 |
+
hfModelCard?: string;
|
| 178 |
+
rmse?: string;
|
| 179 |
+
skillVsPersistence?: string;
|
| 180 |
+
hardwareBadge?: string;
|
| 181 |
+
|
| 182 |
+
// lulc — class-mix bar (v0.4.5 §4)
|
| 183 |
+
classMix?: { k: string; pct: number; color: string }[];
|
| 184 |
};
|
| 185 |
|
| 186 |
+
/** Per-specialist run-state. v0.4.5 splits the v0.4.4 `ok|warn|error|silent`
|
| 187 |
+
* enum into five distinct epistemic outcomes so the run-health tally
|
| 188 |
+
* stops conflating "spec'd silent" with "specialist crashed":
|
| 189 |
+
*
|
| 190 |
+
* fired — completed and produced output the reconciler used
|
| 191 |
+
* silent_by_design — completed and correctly produced no output
|
| 192 |
+
* (e.g. "no entrances within radius")
|
| 193 |
+
* warned — output produced with a non-fatal warning
|
| 194 |
+
* errored — failed to complete, no usable output
|
| 195 |
+
* not_invoked — FSM skipped the specialist (precondition unmet
|
| 196 |
+
* / feature flag off / never wired)
|
| 197 |
+
*
|
| 198 |
+
* See V0.4.5_SPEC.md §1 for the full rationale and message-voice rules.
|
| 199 |
+
*/
|
| 200 |
+
export type SpecialistStatus =
|
| 201 |
+
| 'fired'
|
| 202 |
+
| 'silent_by_design'
|
| 203 |
+
| 'warned'
|
| 204 |
+
| 'errored'
|
| 205 |
+
| 'not_invoked';
|
| 206 |
+
|
| 207 |
/** Per-Stone provenance member (specialist) summary used by the trace. */
|
| 208 |
export type StoneMember = {
|
| 209 |
id: string;
|
| 210 |
name: string;
|
| 211 |
+
status: SpecialistStatus;
|
| 212 |
tier?: Tier | null;
|
| 213 |
ms?: number;
|
| 214 |
+
/** One-line engineering-honest message ("no entrances within radius",
|
| 215 |
+
* "PLUTO join skipped: queried address not in NYC PLUTO dataset",
|
| 216 |
+
* "311 history fetch failed: HTTP 503 at NYC OpenData (3 retries)").
|
| 217 |
+
* Match v0.4.1–v0.4.4 voice — precise, slightly understated. */
|
| 218 |
note?: string;
|
| 219 |
children?: StoneMember[];
|
| 220 |
};
|
|
@@ -640,6 +640,7 @@
|
|
| 640 |
proxy311={proxyFc}
|
| 641 |
registerPoints={registerPointsFc}
|
| 642 |
registerPolygons={registerPolygonsFc}
|
|
|
|
| 643 |
/>
|
| 644 |
<MapLegend
|
| 645 |
{active}
|
|
|
|
| 640 |
proxy311={proxyFc}
|
| 641 |
registerPoints={registerPointsFc}
|
| 642 |
registerPolygons={registerPolygonsFc}
|
| 643 |
+
{linkedKey}
|
| 644 |
/>
|
| 645 |
<MapLegend
|
| 646 |
{active}
|
|
@@ -120,6 +120,7 @@
|
|
| 120 |
address={queriedAddress}
|
| 121 |
activeLayers={active}
|
| 122 |
syntheticPrior={SYN_FIXTURE}
|
|
|
|
| 123 |
/>
|
| 124 |
<MapLegend
|
| 125 |
{active}
|
|
|
|
| 120 |
address={queriedAddress}
|
| 121 |
activeLayers={active}
|
| 122 |
syntheticPrior={SYN_FIXTURE}
|
| 123 |
+
{linkedKey}
|
| 124 |
/>
|
| 125 |
<MapLegend
|
| 126 |
{active}
|