seriffic Claude Opus 4.7 (1M context) commited on
Commit
e84d03c
Β·
1 Parent(s): 17dd76d

Re-theme: Civic Hydrology palette (USWDS federal blue, cool slate)

Browse files

Color-only palette swap; UI shape and information architecture
unchanged. Replaces the warm newsprint + burnt orange that read as
editorial / Anthropic-adjacent with a cool register grounded in
actual flood / civic-tech reference points (USWDS, NWS, FloodHelpNY).

Tokens (web/sveltekit/src/lib/tokens.css):
- accent: #D17C00 burnt orange β†’ #005EA2 USWDS federal blue
- paper: #FAFAF7 warm cream β†’ #F4F6F9 cool off-white
- ink: #1A1A1A warm-black β†’ #0F172A slate-950
- ink-2: #4A4A4A β†’ #334155 slate-700
- ink-3: #6B6B6B β†’ #64748B slate-500
- rule-soft: #C9C9C5 β†’ #CBD5E1 slate-300
- tier-empirical: #0B5394 β†’ #005EA2 USWDS blue-60v
- tier-modeled: #2A6FA8 β†’ #1A4480 USWDS blue-warm-70v
- stones re-themed by meaning: cornerstone slate, keystone navy,
touchstone cyan-700 (live water), lodestone amber-800 (hazard
register), capstone deepest navy
- new vars: --accent-warn (#92400E amber-800, hazard pills only)
and --accent-alert (#B91C1C red-700, active flood alerts only)

Same swaps applied to in-component hardcoded hex (RipMap, AssetPin,
ThumbStripe, RasterThumb, StatusGlyph, LandMiniMap, styles.css,
print.css). Wordmark β–Œ block now federal blue everywhere.

Marp deck (slides/):
- riprap.css mirrors the new tokens
- deck.md reshaped from editorial register to dashboard register:
eyebrow labels with a small β–Œ accent, sans-led hierarchy (drops
IBM Plex Serif for headlines β€” that was the editorial tell),
framed boxes everywhere (.box / .box.dark / .box.tinted / .box-grid),
three-stat card row on the receipts slide, track-row component
for the "3 of 4 hackathon tracks" slide with check / name /
detail / badge columns, dark inverted CTA at the close
- Dark-box body styling moved into theme so inline style="" is no
longer required (fixes the missing-body-text rendering bug)

Re-rendered build artefacts (deck.pdf 224k, deck.html 93k,
deck.pptx 1.1M; SvelteKit build/_app refreshed with new CSS hash).

Reference points used to ground the palette:
- USWDS theme tokens (designsystem.digital.gov)
- NWS hazards map color scheme (weather.gov/help-map)
- FloodHelpNY / NYC Mayor's Office EJ register
- Slate-leaning neutral chosen instead of true gray to keep
legibility at small mono sizes for citation chips

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Files changed (29) hide show
  1. slides/deck.md +115 -67
  2. slides/riprap.css +364 -233
  3. web/sveltekit/build/200.html +9 -9
  4. web/sveltekit/build/_app/immutable/assets/0.mgbkK27i.css +0 -0
  5. web/sveltekit/build/_app/immutable/assets/0.xlIi8G7J.css +0 -0
  6. web/sveltekit/build/_app/immutable/chunks/{a5rSUn-N.js β†’ BXi3zWkM.js} +0 -0
  7. web/sveltekit/build/_app/immutable/chunks/{D9Zf6nF7.js β†’ CTVfprh3.js} +1 -1
  8. web/sveltekit/build/_app/immutable/chunks/{DP_9AkkW.js β†’ DJge0v95.js} +1 -1
  9. web/sveltekit/build/_app/immutable/entry/{app.qmZS3WSP.js β†’ app.D_vNpH02.js} +2 -2
  10. web/sveltekit/build/_app/immutable/entry/start.DcfT94lp.js +0 -1
  11. web/sveltekit/build/_app/immutable/entry/start.Du3-6zpX.js +1 -0
  12. web/sveltekit/build/_app/immutable/nodes/{0.IL53jLg5.js β†’ 0.CyFUYGHQ.js} +1 -1
  13. web/sveltekit/build/_app/immutable/nodes/{1.4zkFLEZX.js β†’ 1.DUUr7c49.js} +1 -1
  14. web/sveltekit/build/_app/immutable/nodes/{2.C4OcOHhN.js β†’ 2._BOZ29qB.js} +2 -2
  15. web/sveltekit/build/_app/immutable/nodes/{3.D22Sj2nj.js β†’ 3.liHvJPpw.js} +1 -1
  16. web/sveltekit/build/_app/immutable/nodes/{4.BFj07o33.js β†’ 4.DoFuD2WD.js} +1 -1
  17. web/sveltekit/build/_app/immutable/nodes/{5.Bw01bLNz.js β†’ 5.BqecXchk.js} +1 -1
  18. web/sveltekit/build/_app/version.json +1 -1
  19. web/sveltekit/build/index.html +10 -10
  20. web/sveltekit/build/q/sample.html +0 -0
  21. web/sveltekit/src/lib/components/evidence/viz/ThumbStripe.svelte +3 -3
  22. web/sveltekit/src/lib/components/findings/cards/RasterThumb.svelte +11 -11
  23. web/sveltekit/src/lib/components/glyphs/AssetPin.svelte +1 -1
  24. web/sveltekit/src/lib/components/landing/LandMiniMap.svelte +2 -2
  25. web/sveltekit/src/lib/components/map/RipMap.svelte +8 -8
  26. web/sveltekit/src/lib/components/trace/StatusGlyph.svelte +1 -1
  27. web/sveltekit/src/lib/print.css +2 -2
  28. web/sveltekit/src/lib/styles.css +2 -2
  29. web/sveltekit/src/lib/tokens.css +57 -45
slides/deck.md CHANGED
@@ -10,90 +10,111 @@ description: AMD x lablab.ai Developer Hackathon, May 4–10 2026
10
  <!-- _class: lead -->
11
  <!-- _paginate: false -->
12
 
 
 
 
 
13
  # Riprap
14
 
15
  ## Citation-grounded NYC flood-exposure briefings, on AMD MI300X.
16
 
17
  <div class="meta">
18
- AMD &times; lablab.ai Developer Hackathon &nbsp;Β·&nbsp; <strong>May 4&ndash;10, 2026</strong>
 
 
 
 
 
 
 
 
 
 
 
 
19
  </div>
20
 
21
  ---
22
 
23
- ## the problem
24
 
25
  # Climate risk data is a black box.
26
 
27
- <div class="two-col">
28
- <div>
29
-
30
- **First Street.** Score 1–10.
31
- **ClimateCheck.** Score 1–100.
32
- **Jupiter.** Enterprise SaaS.
33
-
34
- A number. A bar chart. A black box.
35
 
 
 
 
 
 
 
 
 
 
36
  </div>
37
- <div>
38
-
39
- > *"Zillow removed flood-risk data from listings in December 2025 after pressure from the real-estate industry."*
40
-
41
- β€” CNN, Dec 2 2025
42
 
 
 
 
 
 
43
  </div>
 
44
  </div>
45
 
46
- When a number meets resistance, **the only defense is the audit trail**.
47
 
48
  ---
49
 
50
- ## what riprap is
51
 
52
  # Every number cites its source. Or it doesn't appear.
53
 
54
- Type a NYC address &rarr; **17 specialists fan out** &rarr; one paragraph back, with **`[doc_id]` citations** on every numeric claim. If the model can't cite it, it's silent.
55
 
56
  <div class="codeblock"><span class="label">Status.</span> 442 East Houston Street, Manhattan, is exposed to flood risk: flooded by Hurricane Sandy in 2012, with recurrent localized flooding evidenced by 19 311 complaints and multiple FloodNet sensor events <span class="cite">[sandy], [nyc311], [floodnet]</span>.
57
 
58
  <span class="label">Empirical evidence.</span> Sandy flooded this address Oct 29-30, 2012 <span class="cite">[sandy]</span>. 19 flood-related 311 service requests within 200 m over five years <span class="cite">[nyc311]</span>. Three of five FloodNet sensors within 600 m documented events in the past three years <span class="cite">[floodnet]</span>.</div>
59
 
60
- <span class="smallcaps">Mellea rejection sampling &middot; 4 grounding checks &middot; 4/4 pass = ship</span>
61
 
62
  ---
63
 
64
- ## the stack
65
 
66
  # Three of four hackathon tracks. One project.
67
 
68
- <div class="stack">
69
- <div class="stack-row gpu">
70
- <div class="lbl">MI300X &middot; vLLM</div>
71
- <div class="body"><strong>IBM Granite 4.1 8B</strong> &mdash; planner + reconciler. ROCm 7. AMD-served.</div>
72
- </div>
73
- <div class="stack-row gpu">
74
- <div class="lbl">MI300X &middot; ROCm</div>
75
- <div class="body"><strong>Three Apache-2.0 NYC fine-tunes</strong> trained on AMD Developer Cloud:
76
- <code>Prithvi-EO-2.0-NYC-Pluvial</code>,
77
- <code>TerraMind-NYC-Adapters</code>,
78
- <code>Granite-TTM-r2-Battery-Surge</code>.</div>
79
- </div>
80
- <div class="stack-row gpu">
81
- <div class="lbl">MI300X &middot; ROCm</div>
82
- <div class="body"><strong>Multimodal specialists.</strong> Sentinel-2 chip &rarr; Prithvi pluvial seg &middot; TerraMind LULC + Buildings adapters &middot; Granite Embedding 278M &middot; GLiNER typed extraction.</div>
83
- </div>
84
- <div class="stack-row app">
85
- <div class="lbl">FastAPI</div>
86
- <div class="body"><strong>Burr FSM agent.</strong> 17 specialists fuse FEMA, NYC DEP, NYC 311, FloodNet, NOAA, NWS, USGS HWMs, Sentinel-2. Streamed via SSE.</div>
87
- </div>
88
  </div>
89
 
90
- <div style="margin-top: 18px;">
91
- <span class="pill accent">Agents</span><span class="pill accent">Fine-tuning</span><span class="pill accent">Vision/Multimodal</span><span class="pill">Build-in-public</span>
 
 
 
 
 
 
 
 
 
 
92
  </div>
93
 
94
  ---
95
 
96
- ## the receipts
97
 
98
  # 5 of 5 NYC addresses. Mellea 4/4 every run.
99
 
@@ -110,61 +131,88 @@ Type a NYC address &rarr; **17 specialists fan out** &rarr; one paragraph back,
110
  </tbody>
111
  </table>
112
 
113
- <span class="smallcaps">scripts/probe_addresses.py &middot; vLLM on MI300X &middot; <strong style="color: var(--accent-text);">5.8&ndash;13.1 s end-to-end</strong></span>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
 
115
  ---
116
 
117
- ## why it matters
118
 
119
  # The civic-tech case.
120
 
121
- <div class="two-col">
122
- <div>
123
-
124
- **NY Property Disclosure Law &middot; March 2024.** Sellers must disclose flood history. Riprap is the citable narrative.
125
-
126
- **NYC DEP Stormwater Plan &middot; 2024.** $30B priority list, 86 sites. Riprap is the per-NTA evidence layer.
127
-
128
- **EJNYC Flood Vulnerability Index &middot; 2024.** 35% of state climate spend goes to "disadvantaged communities." Riprap stays open-source so advocacy can audit.
129
 
 
 
 
130
  </div>
131
- <div>
132
 
133
- <p style="font-family: var(--font-serif); font-style: italic; font-size: 24px; color: var(--ink); line-height: 1.4;">No commercial APIs. No closed models. No black-box scores.</p>
 
 
 
134
 
135
- <p style="font-size: 18px; color: var(--ink-2); margin-top: 16px;">Every dataset is public-record federal, state, or city. Every foundation model is Apache-2.0. Every claim cites its source.</p>
 
 
 
136
 
 
 
 
137
  </div>
 
138
  </div>
139
 
140
  ---
141
 
142
- ## now
143
 
144
  # Live demo.
145
 
146
- <div style="margin-top: 24px; font-family: var(--font-mono); font-size: 18px; line-height: 1.6;">
147
-
148
- <span style="color: var(--accent-text);">β–Ά</span> &nbsp; <code>https://lablab-ai-amd-developer-hackathon-riprap-nyc.hf.space</code>
149
-
150
- <span style="color: var(--accent-text);">β–Ά</span> &nbsp; query: <em style="font-family: var(--font-serif); font-style: italic; color: var(--ink); border: none; padding: 0;">442 East Houston Street, Manhattan</em>
151
-
152
  </div>
153
 
154
- <div style="margin-top: 36px;">
155
- <blockquote>17 specialists, ~10 seconds, audit-grade prose. Watch the Stones light up.</blockquote>
 
156
  </div>
157
 
 
 
158
  ---
159
 
160
  <!-- _class: cta -->
161
 
162
- # riprap
 
 
163
 
164
  ## github.com/msradam/riprap-nyc
165
 
 
 
 
166
  Apache-2.0 &middot; public data &middot; AMD MI300X &middot; IBM Granite 4.1 &middot; Mellea grounding
 
167
 
168
- <p style="margin-top: 32px; font-family: var(--font-mono); font-size: 14px; letter-spacing: 0.1em; text-transform: uppercase; color: rgba(250,250,247,0.6);">
169
  AMD &times; lablab.ai &middot; May 4&ndash;10 2026
170
  </p>
 
10
  <!-- _class: lead -->
11
  <!-- _paginate: false -->
12
 
13
+ <div class="eyebrow">
14
+ AMD &times; lablab.ai &nbsp;Β·&nbsp; Developer Hackathon
15
+ </div>
16
+
17
  # Riprap
18
 
19
  ## Citation-grounded NYC flood-exposure briefings, on AMD MI300X.
20
 
21
  <div class="meta">
22
+ <div>
23
+ <div class="meta-label">Engine</div>
24
+ <div class="meta-value">vLLM &middot; Granite 4.1 8B</div>
25
+ </div>
26
+ <div class="meta-divider"></div>
27
+ <div>
28
+ <div class="meta-label">Hardware</div>
29
+ <div class="meta-value">AMD MI300X</div>
30
+ </div>
31
+ <div>
32
+ <div class="meta-label">Date</div>
33
+ <div class="meta-value">May 4&ndash;10 2026</div>
34
+ </div>
35
  </div>
36
 
37
  ---
38
 
39
+ <div class="eyebrow">01 &middot; The problem</div>
40
 
41
  # Climate risk data is a black box.
42
 
43
+ <div class="box-grid cols-2">
 
 
 
 
 
 
 
44
 
45
+ <div class="box">
46
+ <div class="lbl">The market</div>
47
+ <div class="body">
48
+ <strong>First Street.</strong> Score 1&ndash;10.<br>
49
+ <strong>ClimateCheck.</strong> Score 1&ndash;100.<br>
50
+ <strong>Jupiter.</strong> Enterprise SaaS.<br>
51
+ <br>
52
+ A number. A bar chart. A black box.
53
+ </div>
54
  </div>
 
 
 
 
 
55
 
56
+ <div class="box tinted">
57
+ <div class="lbl">Dec 2&middot;2025 &middot; CNN</div>
58
+ <div class="body" style="font-size: 19px; line-height: 1.4;">
59
+ "Zillow removed flood-risk data from listings in December 2025 after pressure from the real-estate industry."
60
+ </div>
61
  </div>
62
+
63
  </div>
64
 
65
+ <p style="margin-top: 24px; font-size: 22px;">When a number meets resistance, <strong>the only defense is the audit trail.</strong></p>
66
 
67
  ---
68
 
69
+ <div class="eyebrow">02 &middot; What riprap is</div>
70
 
71
  # Every number cites its source. Or it doesn't appear.
72
 
73
+ <p style="margin-bottom: 12px;">Type a NYC address &rarr; <strong>17 specialists fan out</strong> &rarr; one paragraph back, with <code>[doc_id]</code> citations on every numeric claim.</p>
74
 
75
  <div class="codeblock"><span class="label">Status.</span> 442 East Houston Street, Manhattan, is exposed to flood risk: flooded by Hurricane Sandy in 2012, with recurrent localized flooding evidenced by 19 311 complaints and multiple FloodNet sensor events <span class="cite">[sandy], [nyc311], [floodnet]</span>.
76
 
77
  <span class="label">Empirical evidence.</span> Sandy flooded this address Oct 29-30, 2012 <span class="cite">[sandy]</span>. 19 flood-related 311 service requests within 200 m over five years <span class="cite">[nyc311]</span>. Three of five FloodNet sensors within 600 m documented events in the past three years <span class="cite">[floodnet]</span>.</div>
78
 
79
+ <p style="margin-top: 8px; font-family: var(--font-mono); font-size: 12px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-3);">Mellea rejection sampling &middot; 4 grounding checks &middot; 4/4 pass = ship</p>
80
 
81
  ---
82
 
83
+ <div class="eyebrow">03 &middot; The stack</div>
84
 
85
  # Three of four hackathon tracks. One project.
86
 
87
+ <div class="track-row engaged">
88
+ <div class="check">β–Έ</div>
89
+ <div class="name">Agents &amp; Agentic Workflows</div>
90
+ <div class="detail">Burr FSM &middot; 17 specialists fanned across 5 Stones &middot; Mellea rejection sampling on every reconcile</div>
91
+ <div class="badge">Engaged</div>
92
+ </div>
93
+
94
+ <div class="track-row engaged">
95
+ <div class="check">β–Έ</div>
96
+ <div class="name">Fine-Tuning</div>
97
+ <div class="detail">3 Apache-2.0 NYC fine-tunes trained on AMD MI300X: Prithvi-EO-2.0-NYC-Pluvial &middot; TerraMind-NYC-Adapters &middot; Granite-TTM-r2-Battery-Surge</div>
98
+ <div class="badge">Engaged</div>
 
 
 
 
 
 
 
 
99
  </div>
100
 
101
+ <div class="track-row engaged">
102
+ <div class="check">β–Έ</div>
103
+ <div class="name">Vision &amp; Multimodal</div>
104
+ <div class="detail">Sentinel-2 chip &rarr; Prithvi pluvial seg &middot; TerraMind LULC + Buildings adapters &middot; Granite Embedding 278M &middot; GLiNER typed extraction</div>
105
+ <div class="badge">Engaged</div>
106
+ </div>
107
+
108
+ <div class="track-row unengaged">
109
+ <div class="check">Β·</div>
110
+ <div class="name">Build in Public</div>
111
+ <div class="detail">Documentation track &middot; not the focus this round</div>
112
+ <div class="badge">Skipped</div>
113
  </div>
114
 
115
  ---
116
 
117
+ <div class="eyebrow">04 &middot; The receipts</div>
118
 
119
  # 5 of 5 NYC addresses. Mellea 4/4 every run.
120
 
 
131
  </tbody>
132
  </table>
133
 
134
+ <div class="box-grid cols-3" style="margin-top: 16px;">
135
+ <div class="box">
136
+ <div class="lbl">Wall-clock</div>
137
+ <div class="stat-value">5.8&ndash;13.1<span style="font-size: 22px; color: var(--ink-3); font-weight: 400; letter-spacing: 0;"> s</span></div>
138
+ <div class="stat-label">vLLM on MI300X</div>
139
+ </div>
140
+ <div class="box">
141
+ <div class="lbl">Specialists</div>
142
+ <div class="stat-value">17</div>
143
+ <div class="stat-label">fused per address-intent</div>
144
+ </div>
145
+ <div class="box">
146
+ <div class="lbl">Grounding</div>
147
+ <div class="stat-value">4 / 4</div>
148
+ <div class="stat-label">Mellea checks every run</div>
149
+ </div>
150
+ </div>
151
 
152
  ---
153
 
154
+ <div class="eyebrow">05 &middot; Why it matters</div>
155
 
156
  # The civic-tech case.
157
 
158
+ <div class="box-grid cols-2">
 
 
 
 
 
 
 
159
 
160
+ <div class="box">
161
+ <div class="lbl">NY Property Disclosure Law</div>
162
+ <div class="body">March 2024. Sellers must disclose flood history. <strong>Riprap is the citable narrative.</strong></div>
163
  </div>
 
164
 
165
+ <div class="box">
166
+ <div class="lbl">NYC DEP Stormwater Plan</div>
167
+ <div class="body">2024. $30B priority list, 86 sites. <strong>Riprap is the per-NTA evidence layer.</strong></div>
168
+ </div>
169
 
170
+ <div class="box">
171
+ <div class="lbl">EJNYC Flood Vulnerability Index</div>
172
+ <div class="body">2024. 35% of state climate spend goes to "disadvantaged communities." <strong>Riprap stays open-source so advocacy can audit.</strong></div>
173
+ </div>
174
 
175
+ <div class="box dark">
176
+ <div class="lbl">No commercial APIs</div>
177
+ <div class="body">Every dataset is public-record federal, state, or city. Every foundation model is Apache-2.0. <strong>Every claim cites its source.</strong></div>
178
  </div>
179
+
180
  </div>
181
 
182
  ---
183
 
184
+ <div class="eyebrow">06 &middot; Now</div>
185
 
186
  # Live demo.
187
 
188
+ <div class="box tinted" style="margin-top: 16px;">
189
+ <div class="lbl">Endpoint</div>
190
+ <div class="body" style="font-family: var(--font-mono); font-size: 16px; color: var(--accent-text);">https://lablab-ai-amd-developer-hackathon-riprap-nyc.hf.space</div>
 
 
 
191
  </div>
192
 
193
+ <div class="box" style="margin-top: 12px;">
194
+ <div class="lbl">Query</div>
195
+ <div class="body" style="font-size: 28px; color: var(--ink); font-weight: 500;">442 East Houston Street, Manhattan</div>
196
  </div>
197
 
198
+ <blockquote style="margin-top: 32px;">17 specialists, ~10 seconds, audit-grade prose. Watch the Stones light up.</blockquote>
199
+
200
  ---
201
 
202
  <!-- _class: cta -->
203
 
204
+ <div class="eyebrow" style="margin-top: 80px; color: var(--accent); border: 0; padding: 0;">Riprap &middot; flood briefings on AMD</div>
205
+
206
+ # riprap.nyc
207
 
208
  ## github.com/msradam/riprap-nyc
209
 
210
+ <hr>
211
+
212
+ <p style="font-family: var(--font-mono); font-size: 13px; letter-spacing: 0.1em; text-transform: uppercase;">
213
  Apache-2.0 &middot; public data &middot; AMD MI300X &middot; IBM Granite 4.1 &middot; Mellea grounding
214
+ </p>
215
 
216
+ <p style="font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: rgba(244,246,249,0.55); margin-top: 16px;">
217
  AMD &times; lablab.ai &middot; May 4&ndash;10 2026
218
  </p>
slides/riprap.css CHANGED
@@ -1,40 +1,50 @@
1
  /* @theme riprap
2
  *
3
  * Marp theme that mirrors the SvelteKit UI's design tokens 1:1.
4
- * IBM Plex (Sans / Mono / Serif), paper register, Stone palette,
5
- * the orange accent block from the wordmark. The same CSS variables
6
- * defined in web/sveltekit/src/lib/tokens.css live here so a print
7
- * of a slide and a screenshot of the app feel like one document.
 
 
8
  */
9
 
10
- @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@300;400;500;600;700&family=IBM+Plex+Serif:wght@400;600;700&display=swap');
11
 
12
  :root {
13
- /* Tier (epistemic) β€” verified WCAG AA against paper. */
14
- --tier-empirical: #0B5394;
15
- --tier-modeled: #2A6FA8;
16
- --tier-proxy: #6B6B6B;
17
- --tier-synthetic: #2A6FA8;
18
-
19
- /* Stone accents β€” five muted hint-colors keyed to the FSM stones. */
20
- --stone-cornerstone: #7C6F5E;
21
- --stone-keystone: #5E6E7C;
22
- --stone-touchstone: #6B7C66;
23
- --stone-lodestone: #7C6E5E;
24
- --stone-capstone: #5E5E6E;
25
-
26
- /* Neutrals β€” paper register from the SvelteKit UI. */
27
- --paper: #FAFAF7;
28
- --paper-deep: #F2F2EE;
29
- --ink: #1A1A1A;
30
- --ink-2: #4A4A4A;
31
- --ink-3: #6B6B6B;
32
- --rule: #1A1A1A;
33
- --rule-soft: #C9C9C5;
34
-
35
- /* Accent block (the riprap wordmark glyph). */
36
- --accent: #D17C00;
37
- --accent-text: #B8620A;
 
 
 
 
 
 
 
 
38
 
39
  --font-sans: "IBM Plex Sans", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
40
  --font-mono: "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, monospace;
@@ -46,59 +56,53 @@
46
  section {
47
  width: 1280px;
48
  height: 720px;
49
- padding: 56px 72px;
50
  background: var(--paper);
51
  color: var(--ink);
52
  font-family: var(--font-sans);
53
- font-size: 24px;
54
  line-height: 1.45;
55
  letter-spacing: 0;
56
  position: relative;
57
  display: flex;
58
  flex-direction: column;
59
- justify-content: flex-start;
60
  }
61
 
62
- /* Persistent wordmark on every slide except title β€” bottom-left, mono. */
63
  section::before {
64
- content: "β–Œ riprap";
65
  position: absolute;
66
- left: 72px;
67
- bottom: 32px;
68
  font-family: var(--font-mono);
69
- font-size: 13px;
70
  font-weight: 600;
71
  letter-spacing: 0.06em;
72
  text-transform: lowercase;
73
  color: var(--ink);
74
  }
75
- section::before {
76
- /* the leading block β–Œ inherits the accent color via this trick β€” split
77
- into two pseudo elements isn't supported in Marp; instead we rely on
78
- the orange β–Œ glyph being colored at render via overprint. */
79
- }
80
 
81
- /* Slide number β€” bottom-right, mono. */
82
  section::after {
83
  content: attr(data-marpit-pagination) " / " attr(data-marpit-pagination-total);
84
  position: absolute;
85
- right: 72px;
86
- bottom: 32px;
87
  font-family: var(--font-mono);
88
- font-size: 12px;
89
  font-weight: 500;
90
- letter-spacing: 0.08em;
91
  color: var(--ink-3);
92
  }
93
 
94
- /* ── Headings ─────────────────────────────────────────────────────────── */
95
 
96
  h1 {
97
- font-family: var(--font-serif);
98
- font-weight: 600;
99
- font-size: 64px;
100
  line-height: 1.05;
101
- letter-spacing: -0.02em;
102
  margin: 0 0 16px;
103
  color: var(--ink);
104
  }
@@ -106,26 +110,29 @@ h1 {
106
  h2 {
107
  font-family: var(--font-mono);
108
  font-weight: 500;
109
- font-size: 13px;
110
  letter-spacing: 0.18em;
111
  text-transform: uppercase;
112
- color: var(--ink-3);
113
- margin: 0 0 24px;
 
 
 
114
  }
115
 
116
  h3 {
117
  font-family: var(--font-sans);
118
  font-weight: 600;
119
- font-size: 32px;
120
- line-height: 1.2;
121
- margin: 0 0 12px;
122
  color: var(--ink);
123
  }
124
 
125
  /* ── Body ─────────────────────────────────────────────────────────────── */
126
 
127
  p {
128
- margin: 0 0 16px;
129
  max-width: 60ch;
130
  }
131
 
@@ -136,21 +143,21 @@ strong {
136
 
137
  em {
138
  font-style: normal;
139
- border-bottom: 2px solid var(--accent);
140
- padding-bottom: 1px;
141
  }
142
 
143
  ul, ol {
144
- margin: 0 0 16px;
145
  padding-left: 0;
146
  list-style: none;
147
  }
148
 
149
  ul li, ol li {
150
  position: relative;
151
- padding-left: 28px;
152
- margin: 0 0 14px;
153
- font-size: 22px;
154
  line-height: 1.4;
155
  max-width: 60ch;
156
  }
@@ -160,24 +167,20 @@ ul li::before {
160
  position: absolute;
161
  left: 0;
162
  top: 0.65em;
163
- width: 14px;
164
  height: 2px;
165
- background: var(--ink);
166
  }
167
 
168
- ol {
169
- counter-reset: ol-num;
170
- }
171
- ol li {
172
- counter-increment: ol-num;
173
- }
174
  ol li::before {
175
  content: counter(ol-num, decimal-leading-zero);
176
  position: absolute;
177
  left: 0;
178
  top: 0;
179
  font-family: var(--font-mono);
180
- font-size: 13px;
181
  font-weight: 600;
182
  letter-spacing: 0.04em;
183
  color: var(--accent-text);
@@ -190,42 +193,40 @@ ol li::before {
190
 
191
  code {
192
  font-family: var(--font-mono);
193
- font-size: 0.9em;
194
  background: var(--paper-deep);
195
  padding: 1px 6px;
196
  border-radius: 2px;
197
  color: var(--ink);
 
198
  }
199
 
200
  pre {
201
  font-family: var(--font-mono);
202
- font-size: 16px;
203
  line-height: 1.5;
204
  background: var(--paper-deep);
 
205
  border-left: 3px solid var(--accent);
206
- padding: 18px 22px;
207
- margin: 12px 0;
208
  color: var(--ink);
209
- border-radius: 2px;
210
  }
211
 
212
- pre code {
213
- background: transparent;
214
- padding: 0;
215
- font-size: inherit;
216
- }
217
 
218
- /* ── Quote / aside / strapline ────────────────────────────────────────── */
219
 
220
  blockquote {
221
- font-family: var(--font-serif);
222
- font-style: italic;
223
- font-size: 28px;
224
- line-height: 1.35;
 
225
  color: var(--ink-2);
226
- border-left: 3px solid var(--rule);
227
- padding: 4px 0 4px 24px;
228
- margin: 24px 0;
229
  max-width: 56ch;
230
  }
231
 
@@ -234,260 +235,350 @@ blockquote {
234
  hr {
235
  border: 0;
236
  border-top: 1px solid var(--rule-soft);
237
- margin: 24px 0;
238
  }
239
 
240
- /* ── Table ────────────────────────────────────────────────────────────── */
241
 
242
  table {
243
  border-collapse: collapse;
244
  font-family: var(--font-sans);
245
- font-size: 18px;
246
- margin: 12px 0;
247
  width: 100%;
 
248
  }
249
  th {
250
  text-align: left;
251
  font-family: var(--font-mono);
252
- font-size: 12px;
253
  font-weight: 500;
254
  letter-spacing: 0.1em;
255
  text-transform: uppercase;
256
  color: var(--ink-3);
257
- padding: 10px 12px;
 
258
  border-bottom: 1px solid var(--rule);
259
  }
260
  td {
261
- padding: 12px;
262
  border-bottom: 1px solid var(--rule-soft);
263
  vertical-align: top;
264
  }
 
265
 
266
- /* ── Title slide variant (lead) ───────────────────────────────────────── */
267
 
268
  section.lead {
269
  display: flex;
270
  flex-direction: column;
271
  justify-content: center;
272
  background: var(--paper);
273
- padding-left: 96px;
 
274
  }
 
275
  section.lead::before {
276
  content: "β–Œ";
277
  position: absolute;
278
- left: 96px;
279
- top: 80px;
280
  bottom: auto;
281
  font-family: var(--font-mono);
282
- font-size: 64px;
283
  font-weight: 600;
284
  color: var(--accent);
285
  line-height: 1;
286
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
287
  section.lead h1 {
288
- font-size: 96px;
289
- line-height: 0.95;
290
- letter-spacing: -0.025em;
291
- margin: 0 0 8px;
 
 
292
  }
 
293
  section.lead h2 {
294
- font-family: var(--font-serif);
295
- font-style: italic;
296
  font-weight: 400;
297
- font-size: 32px;
298
- letter-spacing: 0;
299
  text-transform: none;
300
  color: var(--ink-2);
301
  margin: 0 0 32px;
302
- max-width: 28ch;
 
 
 
303
  }
 
304
  section.lead .meta {
 
 
 
 
 
 
 
 
 
 
 
 
 
305
  font-family: var(--font-mono);
306
- font-size: 13px;
307
  font-weight: 500;
308
- letter-spacing: 0.12em;
309
  text-transform: uppercase;
310
  color: var(--ink-3);
311
- margin-top: 32px;
312
  }
313
- section.lead .meta strong {
314
- color: var(--ink);
 
315
  font-weight: 600;
 
 
 
316
  }
317
 
318
- /* ── Closing slide variant ────────────────────────────────────────────── */
319
 
320
  section.cta {
321
- background: var(--ink);
322
  color: var(--paper);
323
- display: flex;
324
- flex-direction: column;
325
  justify-content: center;
326
- padding-left: 96px;
327
  }
328
  section.cta::before {
329
  content: "β–Œ";
330
  color: var(--accent);
331
- font-size: 64px;
332
  position: absolute;
333
- left: 96px;
334
- top: 80px;
335
  bottom: auto;
336
  }
337
- section.cta::after { color: rgba(250, 250, 247, 0.5); }
338
  section.cta h1 {
339
- font-size: 80px;
 
 
 
 
340
  color: var(--paper);
341
- margin: 0 0 16px;
342
  }
343
  section.cta h2 {
344
- color: rgba(250, 250, 247, 0.7);
 
 
 
 
 
 
 
 
 
345
  }
346
  section.cta p {
347
- font-size: 22px;
348
- color: rgba(250, 250, 247, 0.85);
 
349
  }
350
- section.cta a, section.cta code {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
351
  color: var(--accent);
352
- background: transparent;
353
- padding: 0;
 
354
  }
355
 
356
- /* ── Two-column variant ───────────────────────────────────────────────── */
357
 
358
- section.split {
359
- padding-top: 64px;
 
 
 
360
  }
361
- section.split .columns {
362
- display: grid;
363
- grid-template-columns: 1fr 1fr;
364
- gap: 56px;
365
- margin-top: 12px;
366
  }
367
- section.split .columns > div h3 {
368
- font-size: 22px;
369
- margin-bottom: 8px;
 
370
  }
371
- section.split .columns > div p,
372
- section.split .columns > div li {
373
- font-size: 18px;
374
- line-height: 1.45;
375
  }
376
-
377
- /* ── Stone-tinted heading rules (subtle) ──────────────────────────────── */
378
-
379
- section[data-stone="cornerstone"] h1 { border-bottom: 4px solid var(--stone-cornerstone); padding-bottom: 8px; display: inline-block; }
380
- section[data-stone="keystone"] h1 { border-bottom: 4px solid var(--stone-keystone); padding-bottom: 8px; display: inline-block; }
381
- section[data-stone="touchstone"] h1 { border-bottom: 4px solid var(--stone-touchstone); padding-bottom: 8px; display: inline-block; }
382
- section[data-stone="lodestone"] h1 { border-bottom: 4px solid var(--stone-lodestone); padding-bottom: 8px; display: inline-block; }
383
- section[data-stone="capstone"] h1 { border-bottom: 4px solid var(--stone-capstone); padding-bottom: 8px; display: inline-block; }
384
-
385
- /* ── Big-stat panel ───────────────────────────────────────────────────── */
386
-
387
- .stat {
388
- display: flex;
389
- flex-direction: column;
390
- gap: 4px;
391
  }
392
- .stat-value {
393
- font-family: var(--font-serif);
394
- font-weight: 600;
395
- font-size: 56px;
396
- line-height: 1;
397
- color: var(--ink);
398
- letter-spacing: -0.02em;
399
  }
400
- .stat-label {
 
 
 
 
 
 
 
 
 
 
 
 
 
401
  font-family: var(--font-mono);
402
  font-size: 11px;
403
  font-weight: 500;
404
- letter-spacing: 0.14em;
405
  text-transform: uppercase;
406
  color: var(--ink-3);
 
407
  }
 
 
 
 
 
 
408
 
409
- /* ── Stack diagram (slide 4 visual) ───────────────────────────────────── */
410
 
411
- .stack {
412
  display: grid;
413
- grid-template-columns: 1fr;
414
- gap: 8px;
415
- margin-top: 8px;
416
- }
417
- .stack-row {
418
- background: var(--paper-deep);
419
- border-left: 3px solid var(--rule);
420
  padding: 14px 18px;
421
- font-size: 18px;
422
- display: grid;
423
- grid-template-columns: 180px 1fr;
424
- gap: 24px;
425
- align-items: baseline;
 
 
 
 
 
 
426
  }
427
- .stack-row .lbl {
428
  font-family: var(--font-mono);
429
- font-size: 12px;
430
- font-weight: 500;
431
- letter-spacing: 0.08em;
432
- text-transform: uppercase;
433
- color: var(--ink-3);
434
  }
435
- .stack-row .body {
 
436
  font-family: var(--font-sans);
 
 
437
  color: var(--ink);
438
  }
439
- .stack-row.gpu { border-left-color: var(--accent); }
440
- .stack-row.gpu .lbl { color: var(--accent-text); }
441
- .stack-row.app { border-left-color: var(--tier-empirical); }
442
-
443
- /* ── Small caps utility ───────────────────────────────────────────────── */
444
-
445
- .smallcaps {
446
  font-family: var(--font-mono);
447
- font-size: 13px;
448
  font-weight: 500;
449
- letter-spacing: 0.12em;
450
  text-transform: uppercase;
451
  color: var(--ink-3);
 
452
  }
453
 
454
- /* ── Two-column layout (used on slides 2, 6) ─────────────────────────── */
455
 
456
- .two-col {
457
- display: grid;
458
- grid-template-columns: 1fr 1fr;
459
- gap: 56px;
460
- margin-top: 16px;
461
  }
462
- .two-col > div p,
463
- .two-col > div li {
464
- font-size: 20px;
465
- line-height: 1.45;
466
- max-width: none;
 
 
467
  }
468
- .two-col > div p:last-child,
469
- .two-col > div li:last-child {
470
- margin-bottom: 0;
 
 
 
 
 
471
  }
472
 
473
- /* ── Pseudo-codeblock (HTML-rendered, so inline spans keep color) ─────── */
474
 
475
  .codeblock {
476
  font-family: var(--font-mono);
477
- font-size: 15px;
478
  line-height: 1.55;
479
  background: var(--paper-deep);
 
480
  border-left: 3px solid var(--accent);
481
- padding: 18px 22px;
482
- margin: 12px 0;
483
  color: var(--ink);
484
- border-radius: 2px;
485
- }
486
- .codeblock p {
487
- margin: 0 0 12px;
488
- }
489
- .codeblock p:last-child {
490
- margin-bottom: 0;
491
  }
492
  .codeblock .cite {
493
  color: var(--accent-text);
@@ -495,21 +586,21 @@ section[data-stone="capstone"] h1 { border-bottom: 4px solid var(--stone-caps
495
  }
496
  .codeblock .label {
497
  font-weight: 700;
 
498
  }
499
 
500
- /* ── Highlight pill ───────────────────────────────────────────────────── */
501
 
502
  .pill {
503
  display: inline-block;
504
  font-family: var(--font-mono);
505
- font-size: 12px;
506
  font-weight: 500;
507
  letter-spacing: 0.1em;
508
  text-transform: uppercase;
509
  background: var(--paper-deep);
510
  border: 1px solid var(--rule-soft);
511
  padding: 4px 10px;
512
- border-radius: 100px;
513
  color: var(--ink-2);
514
  margin-right: 6px;
515
  }
@@ -518,3 +609,43 @@ section[data-stone="capstone"] h1 { border-bottom: 4px solid var(--stone-caps
518
  color: var(--paper);
519
  border-color: var(--accent);
520
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  /* @theme riprap
2
  *
3
  * Marp theme that mirrors the SvelteKit UI's design tokens 1:1.
4
+ * Civic Hydrology palette (v0.4.6, 2026-05-06): USWDS federal blue,
5
+ * cool slate register, deep navy synthesis. Replaces the warm-paper +
6
+ * burnt-orange register that read as editorial / Anthropic-adjacent.
7
+ * IBM Plex Sans drives display + body; serif retained only for the
8
+ * single hero quote-mark on slide 7. Layouts are box/grid framed β€”
9
+ * the deck reads like a dashboard, not an essay.
10
  */
11
 
12
+ @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@300;400;500;600;700&family=IBM+Plex+Serif:wght@400;600&display=swap');
13
 
14
  :root {
15
+ /* USWDS-aligned tier palette. */
16
+ --tier-empirical: #005EA2;
17
+ --tier-modeled: #1A4480;
18
+ --tier-proxy: #475569;
19
+ --tier-synthetic: #1A4480;
20
+
21
+ /* Stones (water-themed). */
22
+ --stone-cornerstone: #475569; /* slate (hazard ground) */
23
+ --stone-keystone: #1A4480; /* federal navy (assets) */
24
+ --stone-touchstone: #0E7490; /* cyan (live water) */
25
+ --stone-lodestone: #92400E; /* amber (forecast / hazard) */
26
+ --stone-capstone: #162E51; /* deepest navy (synthesis) */
27
+
28
+ /* Cool register. */
29
+ --paper: #F4F6F9;
30
+ --paper-deep: #E8ECF2;
31
+ --paper-cool: #DCE3EC;
32
+ --ink: #0F172A;
33
+ --ink-2: #334155;
34
+ --ink-3: #64748B;
35
+ --rule: #0F172A;
36
+ --rule-soft: #CBD5E1;
37
+
38
+ /* Accent β€” federal blue is the action. Amber + red used only for
39
+ warning / alert pills. */
40
+ --accent: #005EA2;
41
+ --accent-text: #005EA2;
42
+ --accent-warn: #92400E;
43
+ --accent-alert: #B91C1C;
44
+
45
+ /* Inverted (dark slides). */
46
+ --paper-dark: #0F172A;
47
+ --paper-darker: #0A0F1F;
48
 
49
  --font-sans: "IBM Plex Sans", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
50
  --font-mono: "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, monospace;
 
56
  section {
57
  width: 1280px;
58
  height: 720px;
59
+ padding: 48px 64px;
60
  background: var(--paper);
61
  color: var(--ink);
62
  font-family: var(--font-sans);
63
+ font-size: 22px;
64
  line-height: 1.45;
65
  letter-spacing: 0;
66
  position: relative;
67
  display: flex;
68
  flex-direction: column;
 
69
  }
70
 
71
+ /* Bottom-left wordmark on every slide except lead/cta. */
72
  section::before {
73
+ content: "β–Œ riprap.nyc";
74
  position: absolute;
75
+ left: 64px;
76
+ bottom: 28px;
77
  font-family: var(--font-mono);
78
+ font-size: 12px;
79
  font-weight: 600;
80
  letter-spacing: 0.06em;
81
  text-transform: lowercase;
82
  color: var(--ink);
83
  }
 
 
 
 
 
84
 
85
+ /* Bottom-right slide counter. */
86
  section::after {
87
  content: attr(data-marpit-pagination) " / " attr(data-marpit-pagination-total);
88
  position: absolute;
89
+ right: 64px;
90
+ bottom: 28px;
91
  font-family: var(--font-mono);
92
+ font-size: 11px;
93
  font-weight: 500;
94
+ letter-spacing: 0.1em;
95
  color: var(--ink-3);
96
  }
97
 
98
+ /* ── Headings β€” sans-led civic-tech hierarchy ─────────────────────────── */
99
 
100
  h1 {
101
+ font-family: var(--font-sans);
102
+ font-weight: 700;
103
+ font-size: 56px;
104
  line-height: 1.05;
105
+ letter-spacing: -0.025em;
106
  margin: 0 0 16px;
107
  color: var(--ink);
108
  }
 
110
  h2 {
111
  font-family: var(--font-mono);
112
  font-weight: 500;
113
+ font-size: 12px;
114
  letter-spacing: 0.18em;
115
  text-transform: uppercase;
116
+ color: var(--accent-text);
117
+ margin: 0 0 16px;
118
+ display: inline-block;
119
+ padding-bottom: 4px;
120
+ border-bottom: 2px solid var(--accent);
121
  }
122
 
123
  h3 {
124
  font-family: var(--font-sans);
125
  font-weight: 600;
126
+ font-size: 24px;
127
+ line-height: 1.25;
128
+ margin: 0 0 8px;
129
  color: var(--ink);
130
  }
131
 
132
  /* ── Body ─────────────────────────────────────────────────────────────── */
133
 
134
  p {
135
+ margin: 0 0 14px;
136
  max-width: 60ch;
137
  }
138
 
 
143
 
144
  em {
145
  font-style: normal;
146
+ color: var(--accent-text);
147
+ font-weight: 600;
148
  }
149
 
150
  ul, ol {
151
+ margin: 0 0 14px;
152
  padding-left: 0;
153
  list-style: none;
154
  }
155
 
156
  ul li, ol li {
157
  position: relative;
158
+ padding-left: 24px;
159
+ margin: 0 0 12px;
160
+ font-size: 20px;
161
  line-height: 1.4;
162
  max-width: 60ch;
163
  }
 
167
  position: absolute;
168
  left: 0;
169
  top: 0.65em;
170
+ width: 12px;
171
  height: 2px;
172
+ background: var(--accent);
173
  }
174
 
175
+ ol { counter-reset: ol-num; }
176
+ ol li { counter-increment: ol-num; }
 
 
 
 
177
  ol li::before {
178
  content: counter(ol-num, decimal-leading-zero);
179
  position: absolute;
180
  left: 0;
181
  top: 0;
182
  font-family: var(--font-mono);
183
+ font-size: 12px;
184
  font-weight: 600;
185
  letter-spacing: 0.04em;
186
  color: var(--accent-text);
 
193
 
194
  code {
195
  font-family: var(--font-mono);
196
+ font-size: 0.92em;
197
  background: var(--paper-deep);
198
  padding: 1px 6px;
199
  border-radius: 2px;
200
  color: var(--ink);
201
+ border: 1px solid var(--rule-soft);
202
  }
203
 
204
  pre {
205
  font-family: var(--font-mono);
206
+ font-size: 14px;
207
  line-height: 1.5;
208
  background: var(--paper-deep);
209
+ border: 1px solid var(--rule-soft);
210
  border-left: 3px solid var(--accent);
211
+ padding: 14px 18px;
212
+ margin: 8px 0;
213
  color: var(--ink);
 
214
  }
215
 
216
+ pre code { background: transparent; padding: 0; border: 0; }
 
 
 
 
217
 
218
+ /* ── Quote ────────────────────────────────────────────────────────────── */
219
 
220
  blockquote {
221
+ font-family: var(--font-sans);
222
+ font-style: normal;
223
+ font-size: 24px;
224
+ font-weight: 500;
225
+ line-height: 1.3;
226
  color: var(--ink-2);
227
+ border-left: 3px solid var(--accent-warn);
228
+ padding: 4px 0 4px 18px;
229
+ margin: 16px 0;
230
  max-width: 56ch;
231
  }
232
 
 
235
  hr {
236
  border: 0;
237
  border-top: 1px solid var(--rule-soft);
238
+ margin: 16px 0;
239
  }
240
 
241
+ /* ── Tables ───────────────────────────────────────────────────────────── */
242
 
243
  table {
244
  border-collapse: collapse;
245
  font-family: var(--font-sans);
246
+ font-size: 17px;
247
+ margin: 8px 0;
248
  width: 100%;
249
+ border: 1px solid var(--rule-soft);
250
  }
251
  th {
252
  text-align: left;
253
  font-family: var(--font-mono);
254
+ font-size: 11px;
255
  font-weight: 500;
256
  letter-spacing: 0.1em;
257
  text-transform: uppercase;
258
  color: var(--ink-3);
259
+ padding: 10px 14px;
260
+ background: var(--paper-deep);
261
  border-bottom: 1px solid var(--rule);
262
  }
263
  td {
264
+ padding: 12px 14px;
265
  border-bottom: 1px solid var(--rule-soft);
266
  vertical-align: top;
267
  }
268
+ tr:last-child td { border-bottom: 0; }
269
 
270
+ /* ── Title slide β€” bold sans display, dashboard frame ─────────────────── */
271
 
272
  section.lead {
273
  display: flex;
274
  flex-direction: column;
275
  justify-content: center;
276
  background: var(--paper);
277
+ padding-left: 88px;
278
+ padding-right: 88px;
279
  }
280
+
281
  section.lead::before {
282
  content: "β–Œ";
283
  position: absolute;
284
+ left: 88px;
285
+ top: 64px;
286
  bottom: auto;
287
  font-family: var(--font-mono);
288
+ font-size: 56px;
289
  font-weight: 600;
290
  color: var(--accent);
291
  line-height: 1;
292
  }
293
+
294
+ section.lead .eyebrow {
295
+ font-family: var(--font-mono);
296
+ font-size: 12px;
297
+ font-weight: 500;
298
+ letter-spacing: 0.16em;
299
+ text-transform: uppercase;
300
+ color: var(--accent-text);
301
+ margin-bottom: 24px;
302
+ margin-top: 0;
303
+ padding-top: 80px;
304
+ display: flex;
305
+ align-items: center;
306
+ gap: 12px;
307
+ }
308
+ section.lead .eyebrow::after {
309
+ content: "";
310
+ flex: 1;
311
+ height: 1px;
312
+ background: var(--rule-soft);
313
+ max-width: 280px;
314
+ }
315
+
316
  section.lead h1 {
317
+ font-family: var(--font-sans);
318
+ font-weight: 700;
319
+ font-size: 104px;
320
+ line-height: 0.92;
321
+ letter-spacing: -0.035em;
322
+ margin: 0 0 16px;
323
  }
324
+
325
  section.lead h2 {
326
+ font-family: var(--font-sans);
 
327
  font-weight: 400;
328
+ font-size: 26px;
329
+ letter-spacing: -0.005em;
330
  text-transform: none;
331
  color: var(--ink-2);
332
  margin: 0 0 32px;
333
+ max-width: 30ch;
334
+ border: 0;
335
+ padding: 0;
336
+ display: block;
337
  }
338
+
339
  section.lead .meta {
340
+ margin-top: 24px;
341
+ display: grid;
342
+ grid-template-columns: auto 1px auto auto;
343
+ gap: 16px;
344
+ align-items: center;
345
+ width: fit-content;
346
+ }
347
+ section.lead .meta-divider {
348
+ width: 1px;
349
+ height: 14px;
350
+ background: var(--rule-soft);
351
+ }
352
+ section.lead .meta-label {
353
  font-family: var(--font-mono);
354
+ font-size: 11px;
355
  font-weight: 500;
356
+ letter-spacing: 0.14em;
357
  text-transform: uppercase;
358
  color: var(--ink-3);
 
359
  }
360
+ section.lead .meta-value {
361
+ font-family: var(--font-mono);
362
+ font-size: 11px;
363
  font-weight: 600;
364
+ letter-spacing: 0.14em;
365
+ text-transform: uppercase;
366
+ color: var(--ink);
367
  }
368
 
369
+ /* ── CTA / closing slide β€” dark inverted ─────────────────────────────── */
370
 
371
  section.cta {
372
+ background: var(--paper-dark);
373
  color: var(--paper);
374
+ padding-left: 88px;
375
+ padding-right: 88px;
376
  justify-content: center;
 
377
  }
378
  section.cta::before {
379
  content: "β–Œ";
380
  color: var(--accent);
381
+ font-size: 56px;
382
  position: absolute;
383
+ left: 88px;
384
+ top: 64px;
385
  bottom: auto;
386
  }
387
+ section.cta::after { color: rgba(244, 246, 249, 0.42); }
388
  section.cta h1 {
389
+ font-family: var(--font-sans);
390
+ font-weight: 700;
391
+ font-size: 96px;
392
+ line-height: 0.95;
393
+ letter-spacing: -0.03em;
394
  color: var(--paper);
395
+ margin: 80px 0 16px;
396
  }
397
  section.cta h2 {
398
+ font-family: var(--font-mono);
399
+ font-weight: 500;
400
+ font-size: 13px;
401
+ letter-spacing: 0.16em;
402
+ text-transform: uppercase;
403
+ color: var(--accent);
404
+ margin: 0 0 32px;
405
+ border: 0;
406
+ padding: 0;
407
+ display: block;
408
  }
409
  section.cta p {
410
+ font-size: 20px;
411
+ color: rgba(244, 246, 249, 0.85);
412
+ max-width: 70ch;
413
  }
414
+ section.cta hr { border-top-color: rgba(203, 213, 225, 0.2); margin: 24px 0; }
415
+ section.cta .pill { background: rgba(244, 246, 249, 0.08); color: rgba(244, 246, 249, 0.85); border-color: rgba(203, 213, 225, 0.2); }
416
+
417
+ /* ── Slide chrome: eyebrow + heading frame ───────────────────────────── */
418
+
419
+ .eyebrow {
420
+ font-family: var(--font-mono);
421
+ font-size: 12px;
422
+ font-weight: 500;
423
+ letter-spacing: 0.18em;
424
+ text-transform: uppercase;
425
+ color: var(--accent-text);
426
+ margin: 0 0 8px;
427
+ display: flex;
428
+ align-items: center;
429
+ gap: 10px;
430
+ }
431
+ .eyebrow::before {
432
+ content: "β–Œ";
433
  color: var(--accent);
434
+ font-family: var(--font-mono);
435
+ font-weight: 600;
436
+ font-size: 14px;
437
  }
438
 
439
+ /* ── Box / card primitives β€” the dashboard shape ─────────────────────── */
440
 
441
+ .box {
442
+ border: 1px solid var(--rule-soft);
443
+ background: var(--paper);
444
+ padding: 18px 22px;
445
+ position: relative;
446
  }
447
+ .box.tinted {
448
+ background: var(--paper-deep);
 
 
 
449
  }
450
+ .box.dark {
451
+ background: var(--paper-dark);
452
+ color: var(--paper);
453
+ border: 0;
454
  }
455
+ .box.dark .lbl,
456
+ .box.dark .smallcaps {
457
+ color: rgba(244, 246, 249, 0.6);
 
458
  }
459
+ .box.dark .stat-value {
460
+ color: var(--paper);
 
 
 
 
 
 
 
 
 
 
 
 
 
461
  }
462
+ .box.dark .body {
463
+ color: var(--paper);
464
+ font-size: 17px;
465
+ line-height: 1.4;
 
 
 
466
  }
467
+ .box.dark .body strong {
468
+ color: var(--paper);
469
+ }
470
+
471
+ .box-grid {
472
+ display: grid;
473
+ gap: 12px;
474
+ margin-top: 12px;
475
+ }
476
+ .box-grid.cols-2 { grid-template-columns: 1fr 1fr; }
477
+ .box-grid.cols-3 { grid-template-columns: 1fr 1fr 1fr; }
478
+ .box-grid.cols-4 { grid-template-columns: repeat(4, 1fr); }
479
+
480
+ .box .lbl {
481
  font-family: var(--font-mono);
482
  font-size: 11px;
483
  font-weight: 500;
484
+ letter-spacing: 0.12em;
485
  text-transform: uppercase;
486
  color: var(--ink-3);
487
+ margin-bottom: 6px;
488
  }
489
+ .box .body {
490
+ font-size: 18px;
491
+ line-height: 1.4;
492
+ color: var(--ink);
493
+ }
494
+ .box .body strong { color: var(--ink); }
495
 
496
+ /* ── Track-flag stack (slide 4) ──────────────────────────────────────── */
497
 
498
+ .track-row {
499
  display: grid;
500
+ grid-template-columns: 28px 200px 1fr 90px;
501
+ gap: 16px;
502
+ align-items: center;
 
 
 
 
503
  padding: 14px 18px;
504
+ border: 1px solid var(--rule-soft);
505
+ background: var(--paper);
506
+ margin-bottom: 8px;
507
+ }
508
+ .track-row.engaged {
509
+ background: var(--paper);
510
+ border-left: 3px solid var(--accent);
511
+ }
512
+ .track-row.unengaged {
513
+ opacity: 0.55;
514
+ border-left: 3px solid transparent;
515
  }
516
+ .track-row .check {
517
  font-family: var(--font-mono);
518
+ font-weight: 700;
519
+ font-size: 16px;
520
+ text-align: center;
521
+ color: var(--accent);
 
522
  }
523
+ .track-row.unengaged .check { color: var(--ink-3); }
524
+ .track-row .name {
525
  font-family: var(--font-sans);
526
+ font-weight: 600;
527
+ font-size: 17px;
528
  color: var(--ink);
529
  }
530
+ .track-row .detail {
531
+ font-size: 16px;
532
+ color: var(--ink-2);
533
+ line-height: 1.35;
534
+ }
535
+ .track-row .badge {
 
536
  font-family: var(--font-mono);
537
+ font-size: 10px;
538
  font-weight: 500;
539
+ letter-spacing: 0.1em;
540
  text-transform: uppercase;
541
  color: var(--ink-3);
542
+ text-align: right;
543
  }
544
 
545
+ /* ── Big stat / number card ──────────────────────────────────────────── */
546
 
547
+ .stat {
548
+ display: flex;
549
+ flex-direction: column;
550
+ gap: 4px;
 
551
  }
552
+ .stat-value {
553
+ font-family: var(--font-sans);
554
+ font-weight: 700;
555
+ font-size: 56px;
556
+ line-height: 1;
557
+ color: var(--ink);
558
+ letter-spacing: -0.025em;
559
  }
560
+ .stat-label {
561
+ font-family: var(--font-mono);
562
+ font-size: 10px;
563
+ font-weight: 500;
564
+ letter-spacing: 0.14em;
565
+ text-transform: uppercase;
566
+ color: var(--ink-3);
567
+ margin-top: 6px;
568
  }
569
 
570
+ /* ── Codeblock (HTML-rendered, so inline spans keep color) ───────────── */
571
 
572
  .codeblock {
573
  font-family: var(--font-mono);
574
+ font-size: 14px;
575
  line-height: 1.55;
576
  background: var(--paper-deep);
577
+ border: 1px solid var(--rule-soft);
578
  border-left: 3px solid var(--accent);
579
+ padding: 16px 20px;
580
+ margin: 8px 0;
581
  color: var(--ink);
 
 
 
 
 
 
 
582
  }
583
  .codeblock .cite {
584
  color: var(--accent-text);
 
586
  }
587
  .codeblock .label {
588
  font-weight: 700;
589
+ color: var(--ink);
590
  }
591
 
592
+ /* ── Pill ─────────────────────────────────────────────────────────────── */
593
 
594
  .pill {
595
  display: inline-block;
596
  font-family: var(--font-mono);
597
+ font-size: 11px;
598
  font-weight: 500;
599
  letter-spacing: 0.1em;
600
  text-transform: uppercase;
601
  background: var(--paper-deep);
602
  border: 1px solid var(--rule-soft);
603
  padding: 4px 10px;
 
604
  color: var(--ink-2);
605
  margin-right: 6px;
606
  }
 
609
  color: var(--paper);
610
  border-color: var(--accent);
611
  }
612
+ .pill.warn {
613
+ background: var(--accent-warn);
614
+ color: var(--paper);
615
+ border-color: var(--accent-warn);
616
+ }
617
+ .pill.dim {
618
+ opacity: 0.55;
619
+ }
620
+
621
+ /* ── Small caps utility ──────────────────────────────────────────────── */
622
+
623
+ .smallcaps {
624
+ font-family: var(--font-mono);
625
+ font-size: 11px;
626
+ font-weight: 500;
627
+ letter-spacing: 0.12em;
628
+ text-transform: uppercase;
629
+ color: var(--ink-3);
630
+ }
631
+
632
+ /* ── Two-column layout (slides 2, 6) ─────────────────────────────────── */
633
+
634
+ .two-col {
635
+ display: grid;
636
+ grid-template-columns: 1fr 1fr;
637
+ gap: 36px;
638
+ margin-top: 8px;
639
+ }
640
+ .two-col > div p,
641
+ .two-col > div li { font-size: 18px; line-height: 1.45; max-width: none; }
642
+ .two-col > div p:last-child,
643
+ .two-col > div li:last-child { margin-bottom: 0; }
644
+
645
+ /* ── Stone-tinted heading rules ──────────────────────────────────────── */
646
+
647
+ section[data-stone="cornerstone"] h2 { color: var(--stone-cornerstone); border-bottom-color: var(--stone-cornerstone); }
648
+ section[data-stone="keystone"] h2 { color: var(--stone-keystone); border-bottom-color: var(--stone-keystone); }
649
+ section[data-stone="touchstone"] h2 { color: var(--stone-touchstone); border-bottom-color: var(--stone-touchstone); }
650
+ section[data-stone="lodestone"] h2 { color: var(--stone-lodestone); border-bottom-color: var(--stone-lodestone); }
651
+ section[data-stone="capstone"] h2 { color: var(--stone-capstone); border-bottom-color: var(--stone-capstone); }
web/sveltekit/build/200.html CHANGED
@@ -6,34 +6,34 @@
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.DcfT94lp.js" rel="modulepreload">
10
- <link href="/_app/immutable/chunks/D9Zf6nF7.js" rel="modulepreload">
11
  <link href="/_app/immutable/chunks/R1l3q-hJ.js" rel="modulepreload">
12
- <link href="/_app/immutable/entry/app.qmZS3WSP.js" rel="modulepreload">
13
  <link href="/_app/immutable/chunks/DZRTzx66.js" rel="modulepreload">
14
  <link href="/_app/immutable/chunks/CzfSRAFS.js" rel="modulepreload">
15
  <link href="/_app/immutable/chunks/C6-4B-da.js" rel="modulepreload">
16
- <link href="/_app/immutable/nodes/0.IL53jLg5.js" rel="modulepreload">
17
  <link href="/_app/immutable/chunks/Bu_bEyoS.js" rel="modulepreload">
18
- <link href="/_app/immutable/chunks/DP_9AkkW.js" rel="modulepreload">
19
  <link href="/_app/immutable/chunks/a4L4UsYq.js" rel="modulepreload">
20
  <link href="/_app/immutable/chunks/B_9mIQpm.js" rel="modulepreload">
21
 
22
- <link href="/_app/immutable/assets/0.mgbkK27i.css" rel="stylesheet">
23
  </head>
24
  <body data-sveltekit-preload-data="hover">
25
  <div style="display: contents">
26
  <script>
27
  {
28
- __sveltekit_186n2ot = {
29
  base: ""
30
  };
31
 
32
  const element = document.currentScript.parentElement;
33
 
34
  Promise.all([
35
- import("/_app/immutable/entry/start.DcfT94lp.js"),
36
- import("/_app/immutable/entry/app.qmZS3WSP.js")
37
  ]).then(([kit, app]) => {
38
  kit.start(app, element);
39
  });
 
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.Du3-6zpX.js" rel="modulepreload">
10
+ <link href="/_app/immutable/chunks/CTVfprh3.js" rel="modulepreload">
11
  <link href="/_app/immutable/chunks/R1l3q-hJ.js" rel="modulepreload">
12
+ <link href="/_app/immutable/entry/app.D_vNpH02.js" rel="modulepreload">
13
  <link href="/_app/immutable/chunks/DZRTzx66.js" rel="modulepreload">
14
  <link href="/_app/immutable/chunks/CzfSRAFS.js" rel="modulepreload">
15
  <link href="/_app/immutable/chunks/C6-4B-da.js" rel="modulepreload">
16
+ <link href="/_app/immutable/nodes/0.CyFUYGHQ.js" rel="modulepreload">
17
  <link href="/_app/immutable/chunks/Bu_bEyoS.js" rel="modulepreload">
18
+ <link href="/_app/immutable/chunks/DJge0v95.js" rel="modulepreload">
19
  <link href="/_app/immutable/chunks/a4L4UsYq.js" rel="modulepreload">
20
  <link href="/_app/immutable/chunks/B_9mIQpm.js" rel="modulepreload">
21
 
22
+ <link href="/_app/immutable/assets/0.xlIi8G7J.css" rel="stylesheet">
23
  </head>
24
  <body data-sveltekit-preload-data="hover">
25
  <div style="display: contents">
26
  <script>
27
  {
28
+ __sveltekit_1v6cc0u = {
29
  base: ""
30
  };
31
 
32
  const element = document.currentScript.parentElement;
33
 
34
  Promise.all([
35
+ import("/_app/immutable/entry/start.Du3-6zpX.js"),
36
+ import("/_app/immutable/entry/app.D_vNpH02.js")
37
  ]).then(([kit, app]) => {
38
  kit.start(app, element);
39
  });
web/sveltekit/build/_app/immutable/assets/0.mgbkK27i.css DELETED
The diff for this file is too large to render. See raw diff
 
web/sveltekit/build/_app/immutable/assets/0.xlIi8G7J.css ADDED
The diff for this file is too large to render. See raw diff
 
web/sveltekit/build/_app/immutable/chunks/{a5rSUn-N.js β†’ BXi3zWkM.js} RENAMED
The diff for this file is too large to render. See raw diff
 
web/sveltekit/build/_app/immutable/chunks/{D9Zf6nF7.js β†’ CTVfprh3.js} RENAMED
@@ -1 +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{bf as Pe,bg as Vt,a6 as at,a4 as T,o as I,a5 as O,ar as we,bh as Bt}from"./R1l3q-hJ.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 ze{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 Fe 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 zt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function $e({href:e}){return e.split("#")[0]}function C(){}function Ft(...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 Gt(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(Ge(e)),Ht(e,t));const X=new Map;function Wt(e,t){const n=Ge(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=Gt(r)),Promise.resolve(new Response(r,i))}return window.fetch(e,t)}function Jt(e,t,n){if(X.size>0){const a=Ge(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 Ge(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="${Ft(...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 Ce(String.fromCharCode(parseInt(l.slice(2),16)));if(l.startsWith("u+"))return Ce(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 Ce(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 Ce(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_186n2ot)==null?void 0:ht.base)??"";var pt;const nn=((pt=globalThis.__sveltekit_186n2ot)==null?void 0:pt.assets)??U??"",rn="1778031470202",vt="sveltekit:snapshot",yt="sveltekit:scroll",bt="sveltekit:states",an="sveltekit:pageurl",F="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 z(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=z(o,"preload-code")),r===null&&(r=z(o,"preload-data")),t===null&&(t=z(o,"keepfocus")),n===null&&(n=z(o,"noscroll")),i===null&&(i=z(o,"reload")),s===null&&(s=z(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:C};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 Fe?e.status:500}function cn(e){return e instanceof Fe?e.text:"Internal Error"}let R,ee,je;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},je={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),je=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=()=>je.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)??{},j={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(C)}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_186n2ot&&(globalThis.__sveltekit_186n2ot.query,globalThis.__sveltekit_186n2ot.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[F],L=(l=history.state)==null?void 0:l[Z],k||(k=L=Date.now(),history.replaceState({...history.state,[F]: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 G({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 G({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:Ct({...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:j,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 Ct({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(C)),c.forEach(h=>h==null?void 0:h[1]().catch(C));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(C);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 ze)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 j.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 ze)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:zt(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 jt({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 G({type:e,url:t,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s={},redirect_count:o=0,nav_token:l={},accept:c=C,block:d=C,event:u}){var K;const w=V;V=l;const p=await Te(t,!1),f=e==="enter"?tt(_,p,t,e):jt({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"&&j.navigating.set(ee.current=f.navigation);let g=p&&await Ct(p);if(!g){if(Ae(t,U,S.hash))return await ne(t,i);g=await Nt(t,{id:null},await ae(new Fe(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 G({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 j.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={[F]: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)),j.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)){jt({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 G({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(),G({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[F]){const r=n.state[F];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 G({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,[F]:++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&&j.navigating.set(ee.current=null)});function e(n){_.url=R.url=n,j.page.set(nt(R)),j.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 ze){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(C),{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,j as s};
 
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{bf as Pe,bg as Vt,a6 as at,a4 as T,o as I,a5 as O,ar as we,bh as Bt}from"./R1l3q-hJ.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 c=!M.length;for(const l of a)l[1](),M.push(l,e);if(c){for(let l=0;l<M.length;l+=2)M[l][0](M[l+1]);M.length=0}}}function i(o){r(o(e))}function s(o,c=Pe){const l=[o,c];return a.add(l),a.size===1&&(n=t(r,i)||Pe),o(e),()=>{a.delete(l),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 ze{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 Fe 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 zt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function $e({href:e}){return e.split("#")[0]}function C(){}function Ft(...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 Gt(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(Ge(e)),Ht(e,t));const X=new Map;function Wt(e,t){const n=Ge(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=Gt(r)),Promise.resolve(new Response(r,i))}return window.fetch(e,t)}function Jt(e,t,n){if(X.size>0){const a=Ge(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 Ge(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="${Ft(...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((c,l)=>{if(l%2){if(c.startsWith("x+"))return Ce(String.fromCharCode(parseInt(c.slice(2),16)));if(c.startsWith("u+"))return Ce(String.fromCharCode(...c.slice(2).split("-").map(m=>parseInt(m,16))));const d=Yt.exec(c),[,u,w,p,f]=d;return t.push({name:p,matcher:f,optional:!!u,rest:!!w,chained:w?l===1&&s[0]==="":!1}),w?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return Ce(c)}).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 c=t[o];let l=r[o-s];if(c.chained&&c.rest&&s&&(l=r.slice(o-s,o+1).filter(d=>d).join("/"),s=0),l===void 0)if(c.rest)l="";else continue;if(!c.matcher||n[c.matcher](l)){a[c.name]=l;const d=t[o+1],u=r[o+1];d&&!d.rest&&d.optional&&u&&c.chained&&(s=0),!d&&!u&&Object.keys(a).length===i.length&&(s=0);continue}if(c.optional&&c.chained){s++;continue}return}if(!s)return a}function Ce(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,[c,l,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,...l||[]].map(s),leaf:i(c)};return p.errors.length=p.layouts.length=Math.max(p.errors.length,p.layouts.length),p});function i(o){const c=o<0;return c&&(o=~o),[c,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_1v6cc0u)==null?void 0:ht.base)??"";var pt;const nn=((pt=globalThis.__sveltekit_1v6cc0u)==null?void 0:pt.assets)??U??"",rn="1778042322025",vt="sveltekit:snapshot",yt="sveltekit:scroll",bt="sveltekit:states",an="sveltekit:pageurl",F="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 z(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=z(o,"preload-code")),r===null&&(r=z(o,"preload-data")),t===null&&(t=z(o,"keepfocus")),n===null&&(n=z(o,"noscroll")),i===null&&(i=z(o,"reload")),s===null&&(s=z(o,"replacestate")),o=kt(o);function c(l){switch(l){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:c(t),noscroll:c(n),reload:c(i),replace_state:c(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(c=>{(o===void 0||n&&c!==o)&&s(o=c)})}return{notify:a,set:r,subscribe:i}}const Et={v:C};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 cn(e){return e.filter(t=>t!=null)}function me(e,t){return e+"/"+t}function We(e){return e instanceof Me||e instanceof Fe?e.status:500}function ln(e){return e instanceof Fe?e.text:"Internal Error"}let R,ee,je;const fn=at.toString().includes("$$")||/function \w+\(\) \{\}/.test(at.toString()),ct="a:";var oe,se,ie,ce,le,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(ct)},ee={current:null},je={current:!1}):(R=new(gt=class{constructor(){A(this,oe,T({}));A(this,se,T(null));A(this,ie,T(null));A(this,ce,T({}));A(this,le,T({id:null}));A(this,fe,T({}));A(this,ue,T(-1));A(this,de,T(new URL(ct)))}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,ce))}set params(t){O(y(this,ce),t)}get route(){return I(y(this,le))}set route(t){O(y(this,le),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,ce=new WeakMap,le=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),je=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=()=>je.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)??{},j={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(C)}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,lt=!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,c;globalThis.__sveltekit_1v6cc0u&&(globalThis.__sveltekit_1v6cc0u.query,globalThis.__sveltekit_1v6cc0u.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[F],L=(c=history.state)==null?void 0:c[Z],k||(k=L=Date.now(),history.replaceState({...history.state,[F]: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 G({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 G({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 c of o.keys())r.add(me(s,c));i=new Set;for(const[s,o]of ut)for(const c of o.keys())i.add(me(s,c))}t.invalidate&&t.invalidate.forEach(Rn)}}),t.invalidateAll&&we().then(we).then(()=>{for(const[s,o]of ft)for(const[c,{resource:l}]of o)r!=null&&r.has(me(s,c))&&l.refresh();for(const[s,o]of ut)for(const[c,{resource:l}]of o)i!=null&&i.has(me(s,c))&&l.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:Ct({...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:j,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 c="never";if(U&&(e.pathname===U||e.pathname===U+"/"))c="always";else for(const f of n)(f==null?void 0:f.slash)!==void 0&&(c=f.slash);e.pathname=Kt(e.pathname,c),e.search=e.search;const l={type:"loaded",state:{url:e,params:t,branch:n,error:i,route:s},props:{constructors:cn(n).map(f=>f.node.component),page:nt(R)}};o!==void 0&&(l.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&&(l.props[`data_${w}`]=d),w+=1)}return(!_.url||e.href!==_.url.href||_.error!==i||o!==void 0&&o!==R.form||u)&&(l.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}),l}async function Qe({loader:e,parent:t,url:n,params:a,route:r,server_data_node:i}){var l,d;let s=null;const o={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},c=await e();return{node:c,loader:e,server:i,universal:(l=c.universal)!=null&&l.load?{type:"data",data:s,uses:o}:null,data:s??(i==null?void 0:i.data)??null,slash:((d=c.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 Ct({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:c}=r,l=[...o,c];s.forEach(h=>h==null?void 0:h().catch(C)),l.forEach(h=>h==null?void 0:h[1]().catch(C));const d=_.url?e!==Le(_.url):!1,u=_.route?r.id!==_.route.id:!1,w=vn(_.url,n);let p=!1;const f=l.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(C);const m=[];for(let h=0;h<l.length;h+=1)if(l[h])try{m.push(await f[h])}catch(g){if(g instanceof ze)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 j.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 ze)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:zt(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 jt({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 c={...o.navigation,cancel:()=>{s=!0,o.reject(new Error("navigation cancelled"))}};return re||Lt.forEach(l=>l(c)),s?null:o}async function G({type:e,url:t,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s={},redirect_count:o=0,nav_token:c={},accept:l=C,block:d=C,event:u}){var K;const w=V;V=c;const p=await Te(t,!1),f=e==="enter"?tt(_,p,t,e):jt({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===c&&(V=w);return}const m=k,h=L;l(),re=!0,Ee&&f.navigation.type!=="enter"&&j.navigating.set(ee.current=f.navigation);let g=p&&await Ct(p);if(!g){if(Ae(t,U,S.hash))return await ne(t,i);g=await Nt(t,{id:null},await ae(new Fe(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!==c)return f.reject(new Error("navigation aborted")),!1;if(g.type==="redirect"){if(o<20){await G({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:c}),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 j.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={[F]: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(lt){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),lt=!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)),j.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 c=o.target;clearTimeout(e),e=setTimeout(()=>{i(c,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 c of o)c.isIntersecting&&(Ne(new URL(c.target.href)),r.unobserve(c.target))},{threshold:0});async function i(o,c){const l=St(o,P),d=l===t.element&&(l==null?void 0:l.href)===t.href&&c>=n;if(!l||d)return;const{url:u,external:w,download:p}=qe(l,U,S.hash);if(w||p)return;const f=ve(l),m=u&&Le(_.url)===Le(u);if(!(f.reload||m))if(c<=f.preload_data){t={element:l,href:l.href},n=D.tap;const h=await Te(u,!1);if(!h)return;mn(h)}else c<=f.preload_code&&(t={element:l,href:l.href},n=c,Ne(u))}function s(){r.disconnect();for(const o of P.querySelectorAll("a")){const{url:c,external:l,download:d}=qe(o,U,S.hash);if(l||d)continue;const u=ve(o);u.reload||(u.preload_code===D.viewport&&r.observe(o),u.preload_code===D.eager&&Ne(c))}}Q.add(s),s()}function ae(e,t){if(e instanceof Me)return e.body;const n=We(e),a=ln(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 c=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||c.reload&&(!w||!u)){jt({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),!c.replace_state)return;Y=!1}n.preventDefault(),await new Promise(p=>{requestAnimationFrame(()=>{setTimeout(p,0)}),setTimeout(p,100)}),await G({type:"link",url:r,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.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 c=n.target,l=ve(c);if(l.reload)return;n.preventDefault(),n.stopPropagation();const d=new FormData(c,r);o.search=new URLSearchParams(d).toString(),G({type:"form",url:o,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??o.href===location.href,event:n})}),addEventListener("popstate",async n=>{var a;if(!Be){if((a=n.state)!=null&&a[F]){const r=n.state[F];if(V={},r===k)return;const i=N[r],s=n.state[bt]??{},o=new URL(n.state[an]??location.href),c=n.state[Z],l=_.url?$e(location)===$e(_.url):!1;if(c===L&&(At||l)){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 G({type:"popstate",url:o,popped:{state:s,scroll:i,delta:u},accept:()=>{k=r,L=c},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,[F]:++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&&j.navigating.set(ee.current=null)});function e(n){_.url=R.url=n,j.page.set(nt(R)),j.page.notify()}}async function Ln(e,{status:t=200,error:n,node_ids:a,params:r,route:i,server_route:s,data:o,form:c}){Ut=!0;const l=new URL(location.href);let d;({params:r={},route:i={id:null}}=await Te(l,!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:l,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:l,params:r,branch:f,status:t,error:n,errors:d==null?void 0:d.errors,form:c,route:d??null})}catch(p){if(p instanceof ze){await ne(new URL(p.location,location.href));return}u=await et({status:We(p),error:await ae(p,{url:l,params:r,route:i}),url:l,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],c=r.getRangeAt(s);if(o.commonAncestorContainer!==c.commonAncestorContainer||o.startContainer!==c.startContainer||o.endContainer!==c.endContainer||o.startOffset!==c.startOffset||o.endOffset!==c.endOffset)return}r.removeAllRanges()}})}}}function tt(e,t,n,a,r=null){var l,d;let i,s;const o=new Promise((u,w)=>{i=u,s=w});return o.catch(C),{navigation:{from:{params:e.params,route:{id:((l=e.route)==null?void 0:l.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,j as s};
web/sveltekit/build/_app/immutable/chunks/{DP_9AkkW.js β†’ DJge0v95.js} RENAMED
@@ -1 +1 @@
1
- import{s as e,p as r}from"./D9Zf6nF7.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
+ import{s as e,p as r}from"./CTVfprh3.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};
web/sveltekit/build/_app/immutable/entry/{app.qmZS3WSP.js β†’ app.D_vNpH02.js} RENAMED
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.IL53jLg5.js","../chunks/CzfSRAFS.js","../chunks/R1l3q-hJ.js","../chunks/Bu_bEyoS.js","../chunks/C6-4B-da.js","../chunks/DP_9AkkW.js","../chunks/D9Zf6nF7.js","../chunks/a4L4UsYq.js","../chunks/B_9mIQpm.js","../assets/0.mgbkK27i.css","../nodes/1.4zkFLEZX.js","../nodes/2.C4OcOHhN.js","../chunks/L2xkwLPH.js","../chunks/CGe8VjDs.js","../chunks/DZRTzx66.js","../chunks/D907np-5.js","../assets/2.BD53GLFY.css","../nodes/3.D22Sj2nj.js","../chunks/DmCsJHgl.js","../assets/Briefing.Dmn9LgiV.css","../assets/3.BZfqQRM0.css","../nodes/4.BFj07o33.js","../chunks/a5rSUn-N.js","../assets/stoneRegistry.bHiraU77.css","../assets/4.BIuIAgmk.css","../nodes/5.Bw01bLNz.js"])))=>i.map(i=>d[i]);
2
- var S=e=>{throw TypeError(e)};var M=(e,t,r)=>t.has(e)||S("Cannot "+r);var c=(e,t,r)=>(M(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),p=(e,t,r,n)=>(M(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r);import{b as L,_ as b}from"../chunks/DZRTzx66.js";import{h as N,n as W,d as X,a3 as Z,q as $,v as tt,i as et,e as B,an as rt,j as at,a5 as A,am as st,o as l,ao as nt,ap as ot,L as it,p as ct,aq as ut,aa as dt,a6 as mt,ar as _t,f as x,s as lt,a as ft,a4 as j,c as ht,r as vt,t as gt,a9 as k}from"../chunks/R1l3q-hJ.js";import{h as yt,m as Et,u as bt,a as R,c as w,f as F,t as Rt,s as Pt}from"../chunks/CzfSRAFS.js";import{B as Ot,p as D,i as q}from"../chunks/C6-4B-da.js";function V(e,t,r){var n;N&&(n=at,W());var o=new Ot(e);X(()=>{var i=t()??null;if(N){var a=$(n),s=a===rt,_=i!==null;if(s!==_){var P=tt();et(P),o.anchor=P,B(!1),o.ensure(i,i&&(y=>r(y,i))),B(!0);return}}o.ensure(i,i&&(y=>r(y,i)))},Z)}function Tt(e){return class extends xt{constructor(t){super({component:e,...t})}}}var f,d;class xt{constructor(t){I(this,f);I(this,d);var i;var r=new Map,n=(a,s)=>{var _=it(s,!1,!1);return r.set(a,_),_};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,_){return A(r.get(s)??n(s,_),_),Reflect.set(a,s,_)}});p(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(),p(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 At=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 pt(e,t){ct(t,!0);let r=D(t,"components",23,()=>[]),n=D(t,"data_0",3,null),o=D(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=j(!1),a=j(!1),s=j(null);mt(()=>{const u=t.stores.page.subscribe(()=>{l(i)&&(A(a,!0),_t().then(()=>{A(s,document.title||"untitled page",!0)}))});return A(i,!0),u});const _=k(()=>t.constructors[1]);var P=It(),y=x(P);{var G=u=>{const h=k(()=>t.constructors[0]);var v=w(),O=x(v);V(O,()=>l(h),(g,E)=>{L(E(g,{get data(){return n()},get form(){return t.form},get params(){return t.page.params},children:(m,jt)=>{var C=w(),K=x(C);V(K,()=>l(_),(Q,U)=>{L(U(Q,{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(m,C)},$$slots:{default:!0}}),m=>r()[0]=m,()=>{var m;return(m=r())==null?void 0:m[0]})}),R(u,v)},H=u=>{const h=k(()=>t.constructors[0]);var v=w(),O=x(v);V(O,()=>l(h),(g,E)=>{L(E(g,{get data(){return n()},get form(){return t.form},get params(){return t.page.params}}),m=>r()[0]=m,()=>{var m;return(m=r())==null?void 0:m[0]})}),R(u,v)};q(y,u=>{t.constructors[1]?u(G):u(H,-1)})}var z=lt(y,2);{var J=u=>{var h=At(),v=ht(h);{var O=g=>{var E=Rt();gt(()=>Pt(E,l(s))),R(g,E)};q(v,g=>{l(a)&&g(O)})}vt(h),R(u,h)};q(z,u=>{l(i)&&u(J)})}R(e,P),ft()}const St=Tt(pt),Mt=[()=>b(()=>import("../nodes/0.IL53jLg5.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]),import.meta.url),()=>b(()=>import("../nodes/1.4zkFLEZX.js"),__vite__mapDeps([10,1,2,5,6]),import.meta.url),()=>b(()=>import("../nodes/2.C4OcOHhN.js"),__vite__mapDeps([11,1,2,8,12,13,7,6,14,15,16]),import.meta.url),()=>b(()=>import("../nodes/3.D22Sj2nj.js"),__vite__mapDeps([17,1,2,4,13,12,5,6,18,3,7,19,20]),import.meta.url),()=>b(()=>import("../nodes/4.BFj07o33.js"),__vite__mapDeps([21,1,2,4,5,6,18,13,3,7,19,22,14,15,23,8,24]),import.meta.url),()=>b(()=>import("../nodes/5.Bw01bLNz.js"),__vite__mapDeps([25,1,2,18,4,13,3,7,19,22,14,15,23]),import.meta.url)],Nt=[],Bt={"/":[2],"/print/[queryId]":[3],"/q/sample":[5],"/q/[queryId]":[4]},Y={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},Lt=Object.fromEntries(Object.entries(Y.transport).map(([e,t])=>[e,t.decode])),Ft=Object.fromEntries(Object.entries(Y.transport).map(([e,t])=>[e,t.encode])),Yt=!1,Gt=(e,t)=>Lt[e](t);export{Gt as decode,Lt as decoders,Bt as dictionary,Ft as encoders,Yt as hash,Y as hooks,Ct as matchers,Mt as nodes,St as root,Nt as server_loads};
 
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.CyFUYGHQ.js","../chunks/CzfSRAFS.js","../chunks/R1l3q-hJ.js","../chunks/Bu_bEyoS.js","../chunks/C6-4B-da.js","../chunks/DJge0v95.js","../chunks/CTVfprh3.js","../chunks/a4L4UsYq.js","../chunks/B_9mIQpm.js","../assets/0.xlIi8G7J.css","../nodes/1.DUUr7c49.js","../nodes/2._BOZ29qB.js","../chunks/L2xkwLPH.js","../chunks/CGe8VjDs.js","../chunks/DZRTzx66.js","../chunks/D907np-5.js","../assets/2.BD53GLFY.css","../nodes/3.liHvJPpw.js","../chunks/DmCsJHgl.js","../assets/Briefing.Dmn9LgiV.css","../assets/3.BZfqQRM0.css","../nodes/4.DoFuD2WD.js","../chunks/BXi3zWkM.js","../assets/stoneRegistry.bHiraU77.css","../assets/4.BIuIAgmk.css","../nodes/5.BqecXchk.js"])))=>i.map(i=>d[i]);
2
+ var S=e=>{throw TypeError(e)};var M=(e,t,r)=>t.has(e)||S("Cannot "+r);var c=(e,t,r)=>(M(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),p=(e,t,r,n)=>(M(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r);import{b as L,_ as b}from"../chunks/DZRTzx66.js";import{h as N,n as W,d as X,a3 as Z,q as $,v as tt,i as et,e as B,an as rt,j as at,a5 as A,am as st,o as l,ao as nt,ap as ot,L as it,p as ct,aq as ut,aa as dt,a6 as mt,ar as _t,f as x,s as lt,a as ft,a4 as j,c as ht,r as vt,t as gt,a9 as k}from"../chunks/R1l3q-hJ.js";import{h as yt,m as Et,u as bt,a as R,c as w,f as F,t as Rt,s as Pt}from"../chunks/CzfSRAFS.js";import{B as Ot,p as D,i as q}from"../chunks/C6-4B-da.js";function V(e,t,r){var n;N&&(n=at,W());var o=new Ot(e);X(()=>{var i=t()??null;if(N){var a=$(n),s=a===rt,_=i!==null;if(s!==_){var P=tt();et(P),o.anchor=P,B(!1),o.ensure(i,i&&(y=>r(y,i))),B(!0);return}}o.ensure(i,i&&(y=>r(y,i)))},Z)}function Tt(e){return class extends xt{constructor(t){super({component:e,...t})}}}var f,d;class xt{constructor(t){I(this,f);I(this,d);var i;var r=new Map,n=(a,s)=>{var _=it(s,!1,!1);return r.set(a,_),_};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,_){return A(r.get(s)??n(s,_),_),Reflect.set(a,s,_)}});p(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(),p(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 At=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 pt(e,t){ct(t,!0);let r=D(t,"components",23,()=>[]),n=D(t,"data_0",3,null),o=D(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=j(!1),a=j(!1),s=j(null);mt(()=>{const u=t.stores.page.subscribe(()=>{l(i)&&(A(a,!0),_t().then(()=>{A(s,document.title||"untitled page",!0)}))});return A(i,!0),u});const _=k(()=>t.constructors[1]);var P=It(),y=x(P);{var G=u=>{const h=k(()=>t.constructors[0]);var v=w(),O=x(v);V(O,()=>l(h),(g,E)=>{L(E(g,{get data(){return n()},get form(){return t.form},get params(){return t.page.params},children:(m,jt)=>{var C=w(),K=x(C);V(K,()=>l(_),(Q,U)=>{L(U(Q,{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(m,C)},$$slots:{default:!0}}),m=>r()[0]=m,()=>{var m;return(m=r())==null?void 0:m[0]})}),R(u,v)},H=u=>{const h=k(()=>t.constructors[0]);var v=w(),O=x(v);V(O,()=>l(h),(g,E)=>{L(E(g,{get data(){return n()},get form(){return t.form},get params(){return t.page.params}}),m=>r()[0]=m,()=>{var m;return(m=r())==null?void 0:m[0]})}),R(u,v)};q(y,u=>{t.constructors[1]?u(G):u(H,-1)})}var z=lt(y,2);{var J=u=>{var h=At(),v=ht(h);{var O=g=>{var E=Rt();gt(()=>Pt(E,l(s))),R(g,E)};q(v,g=>{l(a)&&g(O)})}vt(h),R(u,h)};q(z,u=>{l(i)&&u(J)})}R(e,P),ft()}const St=Tt(pt),Mt=[()=>b(()=>import("../nodes/0.CyFUYGHQ.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]),import.meta.url),()=>b(()=>import("../nodes/1.DUUr7c49.js"),__vite__mapDeps([10,1,2,5,6]),import.meta.url),()=>b(()=>import("../nodes/2._BOZ29qB.js"),__vite__mapDeps([11,1,2,8,12,13,7,6,14,15,16]),import.meta.url),()=>b(()=>import("../nodes/3.liHvJPpw.js"),__vite__mapDeps([17,1,2,4,13,12,5,6,18,3,7,19,20]),import.meta.url),()=>b(()=>import("../nodes/4.DoFuD2WD.js"),__vite__mapDeps([21,1,2,4,5,6,18,13,3,7,19,22,14,15,23,8,24]),import.meta.url),()=>b(()=>import("../nodes/5.BqecXchk.js"),__vite__mapDeps([25,1,2,18,4,13,3,7,19,22,14,15,23]),import.meta.url)],Nt=[],Bt={"/":[2],"/print/[queryId]":[3],"/q/sample":[5],"/q/[queryId]":[4]},Y={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},Lt=Object.fromEntries(Object.entries(Y.transport).map(([e,t])=>[e,t.decode])),Ft=Object.fromEntries(Object.entries(Y.transport).map(([e,t])=>[e,t.encode])),Yt=!1,Gt=(e,t)=>Lt[e](t);export{Gt as decode,Lt as decoders,Bt as dictionary,Ft as encoders,Yt as hash,Y as hooks,Ct as matchers,Mt as nodes,St as root,Nt as server_loads};
web/sveltekit/build/_app/immutable/entry/start.DcfT94lp.js DELETED
@@ -1 +0,0 @@
1
- import{l as o,a as r}from"../chunks/D9Zf6nF7.js";export{o as load_css,r as start};
 
 
web/sveltekit/build/_app/immutable/entry/start.Du3-6zpX.js ADDED
@@ -0,0 +1 @@
 
 
1
+ import{l as o,a as r}from"../chunks/CTVfprh3.js";export{o as load_css,r as start};
web/sveltekit/build/_app/immutable/nodes/{0.IL53jLg5.js β†’ 0.CyFUYGHQ.js} RENAMED
@@ -1,2 +1,2 @@
1
- import{c as E,a as l,s as C,f as u,d as W,b as O}from"../chunks/CzfSRAFS.js";import{p as D,f as q,o as s,a as I,a9 as v,s as t,c as i,r as p,t as P,aR as Y}from"../chunks/R1l3q-hJ.js";import{b as r,s as U}from"../chunks/Bu_bEyoS.js";import{i as x,p as z}from"../chunks/C6-4B-da.js";import{p as F}from"../chunks/DP_9AkkW.js";import{s as B}from"../chunks/a4L4UsYq.js";import"../chunks/B_9mIQpm.js";const G=!0,V=!0,J="never",ge=Object.freeze(Object.defineProperty({__proto__:null,prerender:G,ssr:V,trailingSlash:J},Symbol.toStringTag,{value:"Module"}));var K=u('<span class="status-sep svelte-1bjixce">Β·</span> <span class="status-step svelte-1bjixce"> </span>',1),Q=u('<span class="status-sep svelte-1bjixce">Β·</span> <span class="status-progress svelte-1bjixce"> </span>',1),X=u('<span class="status-sep svelte-1bjixce">Β·</span> <span class="status-err svelte-1bjixce"> </span>',1),Z=u('<span class="status svelte-1bjixce" aria-live="polite" aria-atomic="true"><span class="status-dot svelte-1bjixce" aria-hidden="true"></span> <span class="status-phase svelte-1bjixce"> </span> <!> <!> <!></span>');function ee(f,n){D(n,!0);const w={geocode:"geocoding",nta_resolve:"resolving NTA",sandy_inundation:"Sandy 2012",dep_stormwater:"DEP scenarios",floodnet:"FloodNet sensors",nyc311:"NYC 311 history",noaa_tides:"NOAA tides",nws_alerts:"NWS alerts",nws_obs:"NWS hourly obs",ttm_forecast:"TTM r2 surge (zero-shot)",ttm_311_forecast:"TTM r2 weekly 311",ttm_battery_surge:"TTM Battery (NYC fine-tune)",floodnet_forecast:"FloodNet recurrence forecast",ida_hwm_2021:"Ida 2021 HWMs",prithvi_eo_v2:"Ida 2021 polygons (baked lookup)",prithvi_eo_live:"Prithvi-NYC-Pluvial v2 segmentation",microtopo_lidar:"LiDAR microtopo",mta_entrance_exposure:"MTA entrances",nycha_development_exposure:"NYCHA developments",doe_school_exposure:"DOE schools",doh_hospital_exposure:"NYS DOH hospitals",terramind_synthesis:"TerraMind v1 synthesis",terramind_lulc:"TerraMind LULC",terramind_buildings:"TerraMind Buildings",eo_chip_fetch:"fetching S2/S1/DEM chip",rag_granite_embedding:"RAG retrieval",gliner_extract:"GLiNER typed extraction"};let M=v(()=>r.phase!=="idle"&&r.phase!=="done"),k=v(()=>{switch(r.phase){case"planning":return"planning intent";case"specialists":return"gathering evidence";case"reconciling":return"reconciling";case"streaming":return r.attempt>1?`writing (reroll ${r.attempt-1})`:"writing briefing";case"error":return"error";default:return""}}),_=v(()=>{const a=r.activeStep;return a?w[a]??a:null}),h=v(()=>{if(r.phase!=="specialists"&&r.phase!=="reconciling")return null;const a=r.firedCount,d=r.totalSpecialists;return d?`${a}/${d}`:a>0?`${a}`:null}),S=v(()=>r.phase==="error"?"err":"live");var N=E(),m=q(N);{var A=a=>{var d=Z(),e=t(i(d),2),o=i(e,!0);p(e);var g=t(e,2);{var R=c=>{var b=K(),y=t(q(b),2),j=i(y,!0);p(y),P(()=>C(j,s(_))),l(c,b)};x(g,c=>{s(_)&&c(R)})}var T=t(g,2);{var L=c=>{var b=Q(),y=t(q(b),2),j=i(y,!0);p(y),P(()=>C(j,s(h))),l(c,b)};x(T,c=>{s(h)&&c(L)})}var $=t(T,2);{var H=c=>{var b=X(),y=t(q(b),2),j=i(y,!0);p(y),P(()=>C(j,r.errorMessage)),l(c,b)};x($,c=>{r.phase==="error"&&r.errorMessage&&c(H)})}p(d),P(()=>{B(d,"data-kind",s(S)),C(o,s(k))}),l(a,d)};x(m,a=>{s(M)&&a(A)})}l(f,N),I()}var ae=u('<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>'),re=u('<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>'),te=u('<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> <!> <!></div></div></header>');function se(f,n){D(n,!0);let w=z(n,"query",3,null);function M(){if(typeof window>"u")return;const e=F.params.queryId??(F.url.pathname==="/q/sample"?"sample":"");e&&window.open(`/print/${encodeURIComponent(e)}`,"_blank","noopener")}var k=te(),_=i(k),h=t(i(_),2),S=i(h);{var N=e=>{var o=ae(),g=t(i(o),2),R=i(g,!0);p(g),Y(2),p(o),P(()=>C(R,w())),O("click",o,function(...T){var L;(L=n.onResetCold)==null||L.apply(this,T)}),l(e,o)};x(S,e=>{w()&&e(N)})}p(h);var m=t(h,2),A=t(i(m),2);{var a=e=>{var o=re();O("click",o,M),l(e,o)};x(A,e=>{r.ready&&e(a)})}var d=t(A,2);ee(d,{}),p(m),p(_),p(k),l(f,k),I()}W(["click"]);var ne=u(`<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.5 οΏ½οΏ½ build 2026-05-05</p></div></footer>`);function oe(f){var n=ne();l(f,n)}var ie=u('<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 pe(f){var n=ie();Y(4),l(f,n)}var le=u("<!> <!>",1),de=u('<!> <main class="svelte-12qhfyh"><!></main> <!>',1);function be(f,n){D(n,!0);let w=v(()=>()=>{const e=F.params.queryId;if(!e)return null;try{return decodeURIComponent(e)}catch{return e}}),M=v(()=>F.url.pathname.startsWith("/print/")),k=v(()=>F.url.pathname==="/"),_=v(()=>s(M)||s(k));var h=de(),S=q(h);{var N=e=>{var o=le(),g=q(o);pe(g);var R=t(g,2);{let T=v(()=>s(w)());se(R,{get query(){return s(T)},onResetCold:()=>window.location.href="/"})}l(e,o)};x(S,e=>{s(_)||e(N)})}var m=t(S,2),A=i(m);U(A,()=>n.children),p(m);var a=t(m,2);{var d=e=>{oe(e)};x(a,e=>{s(_)||e(d)})}l(f,h),I()}export{be as component,ge as universal};
 
1
+ import{c as E,a as l,s as C,f as u,d as W,b as O}from"../chunks/CzfSRAFS.js";import{p as D,f as q,o as s,a as I,a9 as v,s as t,c as i,r as p,t as P,aR as Y}from"../chunks/R1l3q-hJ.js";import{b as r,s as U}from"../chunks/Bu_bEyoS.js";import{i as x,p as z}from"../chunks/C6-4B-da.js";import{p as F}from"../chunks/DJge0v95.js";import{s as B}from"../chunks/a4L4UsYq.js";import"../chunks/B_9mIQpm.js";const G=!0,V=!0,J="never",ge=Object.freeze(Object.defineProperty({__proto__:null,prerender:G,ssr:V,trailingSlash:J},Symbol.toStringTag,{value:"Module"}));var K=u('<span class="status-sep svelte-1bjixce">Β·</span> <span class="status-step svelte-1bjixce"> </span>',1),Q=u('<span class="status-sep svelte-1bjixce">Β·</span> <span class="status-progress svelte-1bjixce"> </span>',1),X=u('<span class="status-sep svelte-1bjixce">Β·</span> <span class="status-err svelte-1bjixce"> </span>',1),Z=u('<span class="status svelte-1bjixce" aria-live="polite" aria-atomic="true"><span class="status-dot svelte-1bjixce" aria-hidden="true"></span> <span class="status-phase svelte-1bjixce"> </span> <!> <!> <!></span>');function ee(f,n){D(n,!0);const w={geocode:"geocoding",nta_resolve:"resolving NTA",sandy_inundation:"Sandy 2012",dep_stormwater:"DEP scenarios",floodnet:"FloodNet sensors",nyc311:"NYC 311 history",noaa_tides:"NOAA tides",nws_alerts:"NWS alerts",nws_obs:"NWS hourly obs",ttm_forecast:"TTM r2 surge (zero-shot)",ttm_311_forecast:"TTM r2 weekly 311",ttm_battery_surge:"TTM Battery (NYC fine-tune)",floodnet_forecast:"FloodNet recurrence forecast",ida_hwm_2021:"Ida 2021 HWMs",prithvi_eo_v2:"Ida 2021 polygons (baked lookup)",prithvi_eo_live:"Prithvi-NYC-Pluvial v2 segmentation",microtopo_lidar:"LiDAR microtopo",mta_entrance_exposure:"MTA entrances",nycha_development_exposure:"NYCHA developments",doe_school_exposure:"DOE schools",doh_hospital_exposure:"NYS DOH hospitals",terramind_synthesis:"TerraMind v1 synthesis",terramind_lulc:"TerraMind LULC",terramind_buildings:"TerraMind Buildings",eo_chip_fetch:"fetching S2/S1/DEM chip",rag_granite_embedding:"RAG retrieval",gliner_extract:"GLiNER typed extraction"};let M=v(()=>r.phase!=="idle"&&r.phase!=="done"),k=v(()=>{switch(r.phase){case"planning":return"planning intent";case"specialists":return"gathering evidence";case"reconciling":return"reconciling";case"streaming":return r.attempt>1?`writing (reroll ${r.attempt-1})`:"writing briefing";case"error":return"error";default:return""}}),_=v(()=>{const a=r.activeStep;return a?w[a]??a:null}),h=v(()=>{if(r.phase!=="specialists"&&r.phase!=="reconciling")return null;const a=r.firedCount,d=r.totalSpecialists;return d?`${a}/${d}`:a>0?`${a}`:null}),S=v(()=>r.phase==="error"?"err":"live");var N=E(),m=q(N);{var A=a=>{var d=Z(),e=t(i(d),2),o=i(e,!0);p(e);var g=t(e,2);{var R=c=>{var b=K(),y=t(q(b),2),j=i(y,!0);p(y),P(()=>C(j,s(_))),l(c,b)};x(g,c=>{s(_)&&c(R)})}var T=t(g,2);{var L=c=>{var b=Q(),y=t(q(b),2),j=i(y,!0);p(y),P(()=>C(j,s(h))),l(c,b)};x(T,c=>{s(h)&&c(L)})}var $=t(T,2);{var H=c=>{var b=X(),y=t(q(b),2),j=i(y,!0);p(y),P(()=>C(j,r.errorMessage)),l(c,b)};x($,c=>{r.phase==="error"&&r.errorMessage&&c(H)})}p(d),P(()=>{B(d,"data-kind",s(S)),C(o,s(k))}),l(a,d)};x(m,a=>{s(M)&&a(A)})}l(f,N),I()}var ae=u('<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>'),re=u('<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>'),te=u('<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> <!> <!></div></div></header>');function se(f,n){D(n,!0);let w=z(n,"query",3,null);function M(){if(typeof window>"u")return;const e=F.params.queryId??(F.url.pathname==="/q/sample"?"sample":"");e&&window.open(`/print/${encodeURIComponent(e)}`,"_blank","noopener")}var k=te(),_=i(k),h=t(i(_),2),S=i(h);{var N=e=>{var o=ae(),g=t(i(o),2),R=i(g,!0);p(g),Y(2),p(o),P(()=>C(R,w())),O("click",o,function(...T){var L;(L=n.onResetCold)==null||L.apply(this,T)}),l(e,o)};x(S,e=>{w()&&e(N)})}p(h);var m=t(h,2),A=t(i(m),2);{var a=e=>{var o=re();O("click",o,M),l(e,o)};x(A,e=>{r.ready&&e(a)})}var d=t(A,2);ee(d,{}),p(m),p(_),p(k),l(f,k),I()}W(["click"]);var ne=u(`<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.5 οΏ½οΏ½ build 2026-05-05</p></div></footer>`);function oe(f){var n=ne();l(f,n)}var ie=u('<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 pe(f){var n=ie();Y(4),l(f,n)}var le=u("<!> <!>",1),de=u('<!> <main class="svelte-12qhfyh"><!></main> <!>',1);function be(f,n){D(n,!0);let w=v(()=>()=>{const e=F.params.queryId;if(!e)return null;try{return decodeURIComponent(e)}catch{return e}}),M=v(()=>F.url.pathname.startsWith("/print/")),k=v(()=>F.url.pathname==="/"),_=v(()=>s(M)||s(k));var h=de(),S=q(h);{var N=e=>{var o=le(),g=q(o);pe(g);var R=t(g,2);{let T=v(()=>s(w)());se(R,{get query(){return s(T)},onResetCold:()=>window.location.href="/"})}l(e,o)};x(S,e=>{s(_)||e(N)})}var m=t(S,2),A=i(m);U(A,()=>n.children),p(m);var a=t(m,2);{var d=e=>{oe(e)};x(a,e=>{s(_)||e(d)})}l(f,h),I()}export{be as component,ge as universal};
web/sveltekit/build/_app/immutable/nodes/{1.4zkFLEZX.js β†’ 1.DUUr7c49.js} RENAMED
@@ -1 +1 @@
1
- import{a as c,f as u,s as e}from"../chunks/CzfSRAFS.js";import{p as v,f as l,t as _,a as g,c as p,r as o,s as x}from"../chunks/R1l3q-hJ.js";import{p as m}from"../chunks/DP_9AkkW.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
+ import{a as c,f as u,s as e}from"../chunks/CzfSRAFS.js";import{p as v,f as l,t as _,a as g,c as p,r as o,s as x}from"../chunks/R1l3q-hJ.js";import{p as m}from"../chunks/DJge0v95.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};
web/sveltekit/build/_app/immutable/nodes/{2.C4OcOHhN.js β†’ 2._BOZ29qB.js} RENAMED
@@ -1,4 +1,4 @@
1
- import{a as m,f as w,d as Y,l as D,b as G,s as g}from"../chunks/CzfSRAFS.js";import"../chunks/B_9mIQpm.js";import{b9 as U,y as S,ar as K,$ as R,_ as V,h as Q,Y as Z,aq as J,aa as A,ba as z,bb as X,o as d,bc as ee,ak as ae,p as C,a5 as E,a as P,a4 as N,s as f,c,aR as M,r as o,t as T,a6 as se,Z as te,a8 as re}from"../chunks/R1l3q-hJ.js";import{h as ne}from"../chunks/L2xkwLPH.js";import{e as $}from"../chunks/CGe8VjDs.js";import{r as le,a as ie,s as oe,b as de}from"../chunks/a4L4UsYq.js";import{g as B}from"../chunks/D9Zf6nF7.js";import{b as ce,_ as ve}from"../chunks/DZRTzx66.js";import{P as pe}from"../chunks/D907np-5.js";function fe(e,s,r=s){var t=new WeakSet;U(e,"input",async a=>{var n=a?e.defaultValue:e.value;if(n=x(e)?L(n):n,r(n),S!==null&&t.add(S),await K(),n!==(n=s())){var u=e.selectionStart,l=e.selectionEnd,v=e.value.length;if(e.value=n??"",l!==null){var i=e.value.length;u===l&&l===v&&i>v?(e.selectionStart=i,e.selectionEnd=i):(e.selectionStart=u,e.selectionEnd=Math.min(l,i))}}}),(Q&&e.defaultValue!==e.value||R(s)==null&&e.value)&&(r(x(e)?L(e.value):e.value),S!==null&&t.add(S)),V(()=>{var a=s();if(e===document.activeElement){var n=S;if(t.has(n))return}x(e)&&a===L(e.value)||e.type==="date"&&!a&&!e.value||a!==e.value&&(e.value=a??"")})}function x(e){var s=e.type;return s==="number"||s==="range"}function L(e){return e===""?null:+e}function ue(e=!1){const s=Z,r=s.l.u;if(!r)return;let t=()=>ee(s.s);if(e){let a=0,n={};const u=ae(()=>{let l=!1;const v=s.s;for(const i in v)v[i]!==n[i]&&(n[i]=v[i],l=!0);return l&&a++,a});t=()=>d(u)}r.b.length&&J(()=>{H(s,t),z(r.b)}),A(()=>{const a=R(()=>r.m.map(X));return()=>{for(const n of a)typeof n=="function"&&n()}}),r.a.length&&A(()=>{H(s,t),z(r.a)})}function H(e,s){if(e.l.s)for(const r of e.l.s)d(r);s()}var me=w('<header class="land-header svelte-1ct2rgk"><span class="riprap-wordmark">riprap</span> <span class="land-header-sep svelte-1ct2rgk">/</span> <span class="land-header-context svelte-1ct2rgk">Flood Exposure Briefing Β· NYC</span> <nav class="land-header-nav svelte-1ct2rgk"><a href="#methodology" class="svelte-1ct2rgk">Methodology</a> <a href="#sources" class="svelte-1ct2rgk">Sources</a></nav></header>');function we(e){var s=me();m(e,s)}var he=w("<span> </span>"),ye=w('<main class="land-hero svelte-drzq4r"><h1 class="land-hero-h1 svelte-drzq4r"><span class="land-hero-headline svelte-drzq4r">A flood exposure briefing<br/> for <em class="svelte-drzq4r">any place</em> in New York City.</span> <span class="land-hero-deck svelte-drzq4r">Type an address. Get a written briefing where every numeric claim links to its primary public-record source.</span></h1> <form class="land-query svelte-drzq4r" role="search"><span class="land-query-prompt svelte-drzq4r" aria-hidden="true">β€Ί</span> <input type="text" placeholder="Address, neighborhood, or BBL. e.g. 80 Pioneer Street, Red Hook" class="land-query-input svelte-drzq4r" aria-label="Query an address, neighborhood, or BBL"/> <button type="submit" class="land-query-submit svelte-drzq4r">Brief this place β†’</button></form> <div class="land-cycling svelte-drzq4r" aria-live="polite"><span class="land-cycling-label svelte-drzq4r">Try:</span> <button type="button" class="land-cycling-rail svelte-drzq4r" title="Run this example"></button></div></main>');function ge(e,s){C(s,!0);const r=["80 Pioneer Street, Red Hook","Coney Island Hospital","PS 188, Lower East Side","Hammels Houses, Rockaway","Bowling Green station","555 W 57th Street"];let t=N(""),a=N(0);A(()=>{if(typeof window>"u")return;const p=setInterval(()=>{E(a,(d(a)+1)%r.length)},2200);return()=>clearInterval(p)});function n(){const p=d(t).trim();p&&B(`/q/${encodeURIComponent(p)}`)}function u(){const p=r[d(a)];B(`/q/${encodeURIComponent(p)}`)}var l=ye(),v=f(c(l),2),i=f(c(v),2);le(i),M(2),o(v);var j=f(v,2),y=f(c(j),2);$(y,22,()=>r,p=>p,(p,b,k)=>{var h=he();let F;var _=c(h,!0);o(h),T(()=>{F=ie(h,1,"land-cycling-item svelte-drzq4r",null,F,{"is-active":d(k)===d(a)}),oe(h,"aria-hidden",d(k)!==d(a)),g(_,b)}),m(p,h)}),o(y),o(j),o(l),D("submit",v,p=>{p.preventDefault(),n()}),fe(i,()=>d(t),p=>E(t,p)),G("click",y,u),m(e,l),P()}Y(["click"]);var je=w('<div class="land-mapmini svelte-1g1r73s" role="img" aria-label="Live mini-map preview of Red Hook flood exposure layers"><div class="land-mapmini-canvas svelte-1g1r73s"></div> <div class="land-mapmini-legend svelte-1g1r73s"><span class="svelte-1g1r73s"><span class="lm-sw lm-sw-emp svelte-1g1r73s"></span>empirical</span> <span class="svelte-1g1r73s"><span class="lm-sw lm-sw-mod svelte-1g1r73s"></span>modeled</span> <span class="svelte-1g1r73s"><span class="lm-sw lm-sw-prx svelte-1g1r73s"></span>proxy</span></div></div>');function be(e,s){C(s,!0);const r=[-74.0096,40.6776];let t=N(null),a=null;se(()=>{let l=!1;return(async()=>{if(!d(t)||l)return;const v=await ve(()=>import("../chunks/D4L2lGt1.js").then(i=>i.m),[],import.meta.url);l||!d(t)||(a=new v.Map({container:d(t),style:pe,center:r,zoom:14.5,interactive:!1,attributionControl:!1}),a.on("load",()=>{a&&(a.addSource("fema-ae",{type:"geojson",data:{type:"FeatureCollection",features:[{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.014,40.679],[-74.007,40.68],[-74.005,40.677],[-74.009,40.6755],[-74.014,40.679]]]}}]}}),a.addLayer({id:"fema-ae-fill",type:"fill",source:"fema-ae",paint:{"fill-color":"#2A6FA8","fill-opacity":.22}}),a.addLayer({id:"fema-ae-line",type:"line",source:"fema-ae",paint:{"line-color":"#2A6FA8","line-width":1,"line-dasharray":[3,2]}}),a.addSource("hwm-contour",{type:"geojson",data:{type:"Feature",properties:{},geometry:{type:"LineString",coordinates:[[-74.0125,40.679],[-74.0105,40.6792],[-74.008,40.679],[-74.006,40.6786]]}}}),a.addLayer({id:"hwm-contour-line",type:"line",source:"hwm-contour",paint:{"line-color":"#0B5394","line-width":1.4}}),a.addSource("proxy-311",{type:"geojson",data:{type:"FeatureCollection",features:[[-74.0118,40.677],[-74.0114,40.6767],[-74.0121,40.6772]].map(i=>({type:"Feature",properties:{},geometry:{type:"Point",coordinates:i}}))}}),a.addLayer({id:"proxy-311-circle",type:"circle",source:"proxy-311",paint:{"circle-radius":3,"circle-color":"transparent","circle-stroke-color":"#6B6B6B","circle-stroke-width":1}}),a.addSource("floodnet",{type:"geojson",data:{type:"Feature",properties:{},geometry:{type:"Point",coordinates:[-74.0103,40.6788]}}}),a.addLayer({id:"floodnet-pin",type:"circle",source:"floodnet",paint:{"circle-radius":4,"circle-color":"#0B5394","circle-stroke-color":"#FFFFFF","circle-stroke-width":1}}),a.addSource("addr",{type:"geojson",data:{type:"Feature",properties:{},geometry:{type:"Point",coordinates:r}}}),a.addLayer({id:"addr-ring",type:"circle",source:"addr",paint:{"circle-radius":9,"circle-color":"transparent","circle-stroke-color":"#1A1A1A","circle-stroke-width":1.4}}),a.addLayer({id:"addr-dot",type:"circle",source:"addr",paint:{"circle-radius":3,"circle-color":"#1A1A1A"}}))}))})(),()=>{l=!0,a&&(a.remove(),a=null)}});var n=je(),u=c(n);ce(u,l=>E(t,l),()=>d(t)),M(2),o(n),m(e,n),P()}var _e=w(`<section class="land-section svelte-1anw2jf"><div class="land-section-head svelte-1anw2jf"><span class="section-label">What you'll get back</span> <span class="land-section-meta svelte-1anw2jf">A grounded paragraph with citations, not a chatbot answer.</span></div> <div class="land-preview-grid svelte-1anw2jf"><div class="land-preview-pane land-preview-pane-excerpt svelte-1anw2jf"><div class="land-preview-eyebrow svelte-1anw2jf">Briefing excerpt</div> <p class="land-preview-body svelte-1anw2jf">The lot sits inside the FEMA <span class="land-preview-cite svelte-1anw2jf">1% AE flood zone <sup class="svelte-1anw2jf">[c3]</sup></span>,
2
  with Sandy high-water marks recorded <span class="land-preview-cite svelte-1anw2jf">4.7 ft above grade <sup class="svelte-1anw2jf">[c1]</sup></span>.
3
  FloodNet FN-BK-018 has logged <span class="land-preview-cite svelte-1anw2jf">14 nuisance floods since 2023 <sup class="svelte-1anw2jf">[c2]</sup></span>.</p> <div class="land-preview-cites svelte-1anw2jf"><div class="land-preview-cite-row svelte-1anw2jf"><span class="land-preview-cite-pin svelte-1anw2jf">[c1]</span> <span class="land-preview-cite-src svelte-1anw2jf">USGS HWM Β· Sandy 2012</span> <span class="land-preview-cite-tier svelte-1anw2jf">empirical</span></div> <div class="land-preview-cite-row svelte-1anw2jf"><span class="land-preview-cite-pin svelte-1anw2jf">[c2]</span> <span class="land-preview-cite-src svelte-1anw2jf">FloodNet FN-BK-018</span> <span class="land-preview-cite-tier svelte-1anw2jf">empirical</span></div> <div class="land-preview-cite-row svelte-1anw2jf"><span class="land-preview-cite-pin svelte-1anw2jf">[c3]</span> <span class="land-preview-cite-src svelte-1anw2jf">FEMA NFHL Β· 36047C0207</span> <span class="land-preview-cite-tier svelte-1anw2jf">modeled</span></div></div></div> <div class="land-preview-pane land-preview-pane-cards svelte-1anw2jf"><div class="land-preview-eyebrow svelte-1anw2jf">Evidence cards</div> <div class="land-evcard-grid svelte-1anw2jf"><article class="land-evcard land-evcard-empirical svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">empirical</span> <span class="land-evcard-id svelte-1anw2jf">e1</span></header> <div class="land-evcard-claim svelte-1anw2jf">4.7 ft Sandy storm-surge HWM at address</div> <div class="land-evcard-source svelte-1anw2jf">USGS High-Water Mark database Β· 2012</div></article> <article class="land-evcard land-evcard-empirical svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">empirical</span> <span class="land-evcard-id svelte-1anw2jf">e2</span></header> <div class="land-evcard-claim svelte-1anw2jf">14 nuisance-flood events, 2023–2026</div> <div class="land-evcard-source svelte-1anw2jf">FloodNet FN-BK-018 Β· 2 blocks north</div></article> <article class="land-evcard land-evcard-modeled svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">modeled</span> <span class="land-evcard-id svelte-1anw2jf">e3</span></header> <div class="land-evcard-claim svelte-1anw2jf">FEMA 1% annual-chance (AE) flood zone</div> <div class="land-evcard-source svelte-1anw2jf">FEMA NFHL Β· panel 36047C0207</div></article> <article class="land-evcard land-evcard-modeled svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">modeled</span> <span class="land-evcard-id svelte-1anw2jf">e5</span></header> <div class="land-evcard-claim svelte-1anw2jf">+30 in MSL by 2070 (NPCC4 high)</div> <div class="land-evcard-source svelte-1anw2jf">NPCC4 SLR projection Β· 2024</div></article></div></div> <div class="land-preview-pane land-preview-pane-map svelte-1anw2jf"><div class="land-preview-eyebrow svelte-1anw2jf">Map</div> <!> <div class="land-preview-mapmeta svelte-1anw2jf">80 Pioneer St, Red Hook Β· z14.5 Β· Carto Positron</div></div></div></section>`);function Se(e){var s=_e(),r=f(c(s),2),t=f(c(r),4),a=f(c(t),2);be(a,{}),M(2),o(t),o(r),o(s),m(e,s)}var ke=w('<article class="land-stones-detail-cell svelte-1v6nt1t"><div class="land-stones-detail-num svelte-1v6nt1t"> </div> <h3 class="land-stones-detail-name svelte-1v6nt1t"> </h3> <div class="land-stones-detail-role svelte-1v6nt1t"> </div> <p class="land-stones-detail-tag svelte-1v6nt1t"> </p> <div class="land-stones-detail-sources svelte-1v6nt1t"> </div></article>'),Fe=w(`<section class="land-section-stones-detail svelte-1v6nt1t" id="methodology"><div class="land-page svelte-1v6nt1t"><div class="land-section-head svelte-1v6nt1t"><span class="section-label">How Riprap reads a place</span> <span class="land-section-meta svelte-1v6nt1t">Five Stones Β· one taxonomy Β· every briefing</span></div> <p class="land-stones-deck svelte-1v6nt1t">Each briefing routes through a fixed taxonomy of public-record specialists. Each Stone is a class of evidence.
4
- Together they form the briefing, and every claim in the output traces back to the Stone that produced it.</p> <div class="land-stones-detail svelte-1v6nt1t"></div></div></section>`);function xe(e,s){C(s,!1);const r=[{name:"Cornerstone",role:"the hazard reader",tag:"what NYC's ground remembers",sources:"USGS HWMs Β· FEMA NFHL Β· DEP stormwater Β· Prithvi historical",tint:"var(--stone-cornerstone)"},{name:"Keystone",role:"the asset register",tag:"what's exposed",sources:"MTA Β· NYCHA Β· DOE Β· DOH Β· PLUTO",tint:"var(--stone-keystone)"},{name:"Touchstone",role:"the live observer",tag:"what's happening now",sources:"FloodNet sensors Β· 311 complaints Β· NWS Β· NOAA tide gauges",tint:"var(--stone-touchstone)"},{name:"Lodestone",role:"the projector",tag:"what's coming",sources:"NPCC4 Β· Granite TTM (zero-shot + NYC fine-tune) Β· NWS alerts",tint:"var(--stone-lodestone)"},{name:"Capstone",role:"the synthesizer",tag:"writes it all down",sources:"Granite 4.1 composer Β· Mellea grounding-check Β· WeasyPrint",tint:"var(--stone-capstone)"}];ue();var t=Fe(),a=c(t),n=f(c(a),4);$(n,7,()=>r,u=>u.name,(u,l,v)=>{var i=ke();let j;var y=c(i),p=c(y,!0);o(y);var b=f(y,2),k=c(b,!0);o(b);var h=f(b,2),F=c(h,!0);o(h);var _=f(h,2),O=c(_,!0);o(_);var q=f(_,2),W=c(q,!0);o(q),o(i),T(I=>{j=de(i,"",j,{"--stone-tint":d(l).tint}),g(p,I),g(k,d(l).name),g(F,d(l).role),g(O,d(l).tag),g(W,d(l).sources)},[()=>String(d(v)+1).padStart(2,"0")]),m(u,i)}),o(n),o(a),o(t),m(e,t),P()}var Le=w('<footer class="land-footer svelte-1dcj612"><span class="land-footer-tiers svelte-1dcj612"><span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-emp svelte-1dcj612"></span>empirical</span> <span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-mod svelte-1dcj612"></span>modeled</span> <span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-prx svelte-1dcj612"></span>proxy</span> <span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-syn svelte-1dcj612"></span>synthetic</span></span> <span class="land-footer-build">Riprap v0.4.5 Β· NYC OpenData Β· FEMA NFHL Β· USGS Β· NPCC4</span></footer>');function Ae(e){var s=Le();m(e,s)}var Ee=w('<meta name="description" content="A citation-grounded flood-exposure briefing tool for any address, neighborhood, or BBL in New York City."/>'),Ne=w('<div class="land svelte-1uha8ag"><!> <div class="land-page svelte-1uha8ag"><!> <!></div> <!> <!></div>');function $e(e){var s=Ne();ne("1uha8ag",v=>{var i=Ee();te(()=>{re.title="Riprap β€” Flood Exposure Briefing for NYC"}),m(v,i)});var r=c(s);we(r);var t=f(r,2),a=c(t);ge(a,{});var n=f(a,2);Se(n),o(t);var u=f(t,2);xe(u,{});var l=f(u,2);Ae(l),o(s),m(e,s)}export{$e as component};
 
1
+ import{a as m,f as w,d as Y,l as D,b as G,s as g}from"../chunks/CzfSRAFS.js";import"../chunks/B_9mIQpm.js";import{b9 as U,y as S,ar as K,$ as R,_ as V,h as Q,Y as Z,aq as J,aa as E,ba as z,bb as X,o as d,bc as ee,ak as ae,p as A,a5 as N,a as P,a4 as C,s as f,c,aR as M,r as o,t as T,a6 as se,Z as te,a8 as re}from"../chunks/R1l3q-hJ.js";import{h as ne}from"../chunks/L2xkwLPH.js";import{e as $}from"../chunks/CGe8VjDs.js";import{r as le,a as ie,s as oe,b as de}from"../chunks/a4L4UsYq.js";import{g as B}from"../chunks/CTVfprh3.js";import{b as ce,_ as ve}from"../chunks/DZRTzx66.js";import{P as pe}from"../chunks/D907np-5.js";function fe(e,s,r=s){var t=new WeakSet;U(e,"input",async a=>{var n=a?e.defaultValue:e.value;if(n=x(e)?L(n):n,r(n),S!==null&&t.add(S),await K(),n!==(n=s())){var u=e.selectionStart,l=e.selectionEnd,v=e.value.length;if(e.value=n??"",l!==null){var i=e.value.length;u===l&&l===v&&i>v?(e.selectionStart=i,e.selectionEnd=i):(e.selectionStart=u,e.selectionEnd=Math.min(l,i))}}}),(Q&&e.defaultValue!==e.value||R(s)==null&&e.value)&&(r(x(e)?L(e.value):e.value),S!==null&&t.add(S)),V(()=>{var a=s();if(e===document.activeElement){var n=S;if(t.has(n))return}x(e)&&a===L(e.value)||e.type==="date"&&!a&&!e.value||a!==e.value&&(e.value=a??"")})}function x(e){var s=e.type;return s==="number"||s==="range"}function L(e){return e===""?null:+e}function ue(e=!1){const s=Z,r=s.l.u;if(!r)return;let t=()=>ee(s.s);if(e){let a=0,n={};const u=ae(()=>{let l=!1;const v=s.s;for(const i in v)v[i]!==n[i]&&(n[i]=v[i],l=!0);return l&&a++,a});t=()=>d(u)}r.b.length&&J(()=>{H(s,t),z(r.b)}),E(()=>{const a=R(()=>r.m.map(X));return()=>{for(const n of a)typeof n=="function"&&n()}}),r.a.length&&E(()=>{H(s,t),z(r.a)})}function H(e,s){if(e.l.s)for(const r of e.l.s)d(r);s()}var me=w('<header class="land-header svelte-1ct2rgk"><span class="riprap-wordmark">riprap</span> <span class="land-header-sep svelte-1ct2rgk">/</span> <span class="land-header-context svelte-1ct2rgk">Flood Exposure Briefing Β· NYC</span> <nav class="land-header-nav svelte-1ct2rgk"><a href="#methodology" class="svelte-1ct2rgk">Methodology</a> <a href="#sources" class="svelte-1ct2rgk">Sources</a></nav></header>');function we(e){var s=me();m(e,s)}var he=w("<span> </span>"),ye=w('<main class="land-hero svelte-drzq4r"><h1 class="land-hero-h1 svelte-drzq4r"><span class="land-hero-headline svelte-drzq4r">A flood exposure briefing<br/> for <em class="svelte-drzq4r">any place</em> in New York City.</span> <span class="land-hero-deck svelte-drzq4r">Type an address. Get a written briefing where every numeric claim links to its primary public-record source.</span></h1> <form class="land-query svelte-drzq4r" role="search"><span class="land-query-prompt svelte-drzq4r" aria-hidden="true">β€Ί</span> <input type="text" placeholder="Address, neighborhood, or BBL. e.g. 80 Pioneer Street, Red Hook" class="land-query-input svelte-drzq4r" aria-label="Query an address, neighborhood, or BBL"/> <button type="submit" class="land-query-submit svelte-drzq4r">Brief this place β†’</button></form> <div class="land-cycling svelte-drzq4r" aria-live="polite"><span class="land-cycling-label svelte-drzq4r">Try:</span> <button type="button" class="land-cycling-rail svelte-drzq4r" title="Run this example"></button></div></main>');function ge(e,s){A(s,!0);const r=["80 Pioneer Street, Red Hook","Coney Island Hospital","PS 188, Lower East Side","Hammels Houses, Rockaway","Bowling Green station","555 W 57th Street"];let t=C(""),a=C(0);E(()=>{if(typeof window>"u")return;const p=setInterval(()=>{N(a,(d(a)+1)%r.length)},2200);return()=>clearInterval(p)});function n(){const p=d(t).trim();p&&B(`/q/${encodeURIComponent(p)}`)}function u(){const p=r[d(a)];B(`/q/${encodeURIComponent(p)}`)}var l=ye(),v=f(c(l),2),i=f(c(v),2);le(i),M(2),o(v);var j=f(v,2),y=f(c(j),2);$(y,22,()=>r,p=>p,(p,b,k)=>{var h=he();let F;var _=c(h,!0);o(h),T(()=>{F=ie(h,1,"land-cycling-item svelte-drzq4r",null,F,{"is-active":d(k)===d(a)}),oe(h,"aria-hidden",d(k)!==d(a)),g(_,b)}),m(p,h)}),o(y),o(j),o(l),D("submit",v,p=>{p.preventDefault(),n()}),fe(i,()=>d(t),p=>N(t,p)),G("click",y,u),m(e,l),P()}Y(["click"]);var je=w('<div class="land-mapmini svelte-1g1r73s" role="img" aria-label="Live mini-map preview of Red Hook flood exposure layers"><div class="land-mapmini-canvas svelte-1g1r73s"></div> <div class="land-mapmini-legend svelte-1g1r73s"><span class="svelte-1g1r73s"><span class="lm-sw lm-sw-emp svelte-1g1r73s"></span>empirical</span> <span class="svelte-1g1r73s"><span class="lm-sw lm-sw-mod svelte-1g1r73s"></span>modeled</span> <span class="svelte-1g1r73s"><span class="lm-sw lm-sw-prx svelte-1g1r73s"></span>proxy</span></div></div>');function be(e,s){A(s,!0);const r=[-74.0096,40.6776];let t=C(null),a=null;se(()=>{let l=!1;return(async()=>{if(!d(t)||l)return;const v=await ve(()=>import("../chunks/D4L2lGt1.js").then(i=>i.m),[],import.meta.url);l||!d(t)||(a=new v.Map({container:d(t),style:pe,center:r,zoom:14.5,interactive:!1,attributionControl:!1}),a.on("load",()=>{a&&(a.addSource("fema-ae",{type:"geojson",data:{type:"FeatureCollection",features:[{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.014,40.679],[-74.007,40.68],[-74.005,40.677],[-74.009,40.6755],[-74.014,40.679]]]}}]}}),a.addLayer({id:"fema-ae-fill",type:"fill",source:"fema-ae",paint:{"fill-color":"#2A6FA8","fill-opacity":.22}}),a.addLayer({id:"fema-ae-line",type:"line",source:"fema-ae",paint:{"line-color":"#2A6FA8","line-width":1,"line-dasharray":[3,2]}}),a.addSource("hwm-contour",{type:"geojson",data:{type:"Feature",properties:{},geometry:{type:"LineString",coordinates:[[-74.0125,40.679],[-74.0105,40.6792],[-74.008,40.679],[-74.006,40.6786]]}}}),a.addLayer({id:"hwm-contour-line",type:"line",source:"hwm-contour",paint:{"line-color":"#0B5394","line-width":1.4}}),a.addSource("proxy-311",{type:"geojson",data:{type:"FeatureCollection",features:[[-74.0118,40.677],[-74.0114,40.6767],[-74.0121,40.6772]].map(i=>({type:"Feature",properties:{},geometry:{type:"Point",coordinates:i}}))}}),a.addLayer({id:"proxy-311-circle",type:"circle",source:"proxy-311",paint:{"circle-radius":3,"circle-color":"transparent","circle-stroke-color":"#6B6B6B","circle-stroke-width":1}}),a.addSource("floodnet",{type:"geojson",data:{type:"Feature",properties:{},geometry:{type:"Point",coordinates:[-74.0103,40.6788]}}}),a.addLayer({id:"floodnet-pin",type:"circle",source:"floodnet",paint:{"circle-radius":4,"circle-color":"#0B5394","circle-stroke-color":"#FFFFFF","circle-stroke-width":1}}),a.addSource("addr",{type:"geojson",data:{type:"Feature",properties:{},geometry:{type:"Point",coordinates:r}}}),a.addLayer({id:"addr-ring",type:"circle",source:"addr",paint:{"circle-radius":9,"circle-color":"transparent","circle-stroke-color":"#0F172A","circle-stroke-width":1.4}}),a.addLayer({id:"addr-dot",type:"circle",source:"addr",paint:{"circle-radius":3,"circle-color":"#0F172A"}}))}))})(),()=>{l=!0,a&&(a.remove(),a=null)}});var n=je(),u=c(n);ce(u,l=>N(t,l),()=>d(t)),M(2),o(n),m(e,n),P()}var _e=w(`<section class="land-section svelte-1anw2jf"><div class="land-section-head svelte-1anw2jf"><span class="section-label">What you'll get back</span> <span class="land-section-meta svelte-1anw2jf">A grounded paragraph with citations, not a chatbot answer.</span></div> <div class="land-preview-grid svelte-1anw2jf"><div class="land-preview-pane land-preview-pane-excerpt svelte-1anw2jf"><div class="land-preview-eyebrow svelte-1anw2jf">Briefing excerpt</div> <p class="land-preview-body svelte-1anw2jf">The lot sits inside the FEMA <span class="land-preview-cite svelte-1anw2jf">1% AE flood zone <sup class="svelte-1anw2jf">[c3]</sup></span>,
2
  with Sandy high-water marks recorded <span class="land-preview-cite svelte-1anw2jf">4.7 ft above grade <sup class="svelte-1anw2jf">[c1]</sup></span>.
3
  FloodNet FN-BK-018 has logged <span class="land-preview-cite svelte-1anw2jf">14 nuisance floods since 2023 <sup class="svelte-1anw2jf">[c2]</sup></span>.</p> <div class="land-preview-cites svelte-1anw2jf"><div class="land-preview-cite-row svelte-1anw2jf"><span class="land-preview-cite-pin svelte-1anw2jf">[c1]</span> <span class="land-preview-cite-src svelte-1anw2jf">USGS HWM Β· Sandy 2012</span> <span class="land-preview-cite-tier svelte-1anw2jf">empirical</span></div> <div class="land-preview-cite-row svelte-1anw2jf"><span class="land-preview-cite-pin svelte-1anw2jf">[c2]</span> <span class="land-preview-cite-src svelte-1anw2jf">FloodNet FN-BK-018</span> <span class="land-preview-cite-tier svelte-1anw2jf">empirical</span></div> <div class="land-preview-cite-row svelte-1anw2jf"><span class="land-preview-cite-pin svelte-1anw2jf">[c3]</span> <span class="land-preview-cite-src svelte-1anw2jf">FEMA NFHL Β· 36047C0207</span> <span class="land-preview-cite-tier svelte-1anw2jf">modeled</span></div></div></div> <div class="land-preview-pane land-preview-pane-cards svelte-1anw2jf"><div class="land-preview-eyebrow svelte-1anw2jf">Evidence cards</div> <div class="land-evcard-grid svelte-1anw2jf"><article class="land-evcard land-evcard-empirical svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">empirical</span> <span class="land-evcard-id svelte-1anw2jf">e1</span></header> <div class="land-evcard-claim svelte-1anw2jf">4.7 ft Sandy storm-surge HWM at address</div> <div class="land-evcard-source svelte-1anw2jf">USGS High-Water Mark database Β· 2012</div></article> <article class="land-evcard land-evcard-empirical svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">empirical</span> <span class="land-evcard-id svelte-1anw2jf">e2</span></header> <div class="land-evcard-claim svelte-1anw2jf">14 nuisance-flood events, 2023–2026</div> <div class="land-evcard-source svelte-1anw2jf">FloodNet FN-BK-018 Β· 2 blocks north</div></article> <article class="land-evcard land-evcard-modeled svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">modeled</span> <span class="land-evcard-id svelte-1anw2jf">e3</span></header> <div class="land-evcard-claim svelte-1anw2jf">FEMA 1% annual-chance (AE) flood zone</div> <div class="land-evcard-source svelte-1anw2jf">FEMA NFHL Β· panel 36047C0207</div></article> <article class="land-evcard land-evcard-modeled svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">modeled</span> <span class="land-evcard-id svelte-1anw2jf">e5</span></header> <div class="land-evcard-claim svelte-1anw2jf">+30 in MSL by 2070 (NPCC4 high)</div> <div class="land-evcard-source svelte-1anw2jf">NPCC4 SLR projection Β· 2024</div></article></div></div> <div class="land-preview-pane land-preview-pane-map svelte-1anw2jf"><div class="land-preview-eyebrow svelte-1anw2jf">Map</div> <!> <div class="land-preview-mapmeta svelte-1anw2jf">80 Pioneer St, Red Hook Β· z14.5 Β· Carto Positron</div></div></div></section>`);function Se(e){var s=_e(),r=f(c(s),2),t=f(c(r),4),a=f(c(t),2);be(a,{}),M(2),o(t),o(r),o(s),m(e,s)}var ke=w('<article class="land-stones-detail-cell svelte-1v6nt1t"><div class="land-stones-detail-num svelte-1v6nt1t"> </div> <h3 class="land-stones-detail-name svelte-1v6nt1t"> </h3> <div class="land-stones-detail-role svelte-1v6nt1t"> </div> <p class="land-stones-detail-tag svelte-1v6nt1t"> </p> <div class="land-stones-detail-sources svelte-1v6nt1t"> </div></article>'),Fe=w(`<section class="land-section-stones-detail svelte-1v6nt1t" id="methodology"><div class="land-page svelte-1v6nt1t"><div class="land-section-head svelte-1v6nt1t"><span class="section-label">How Riprap reads a place</span> <span class="land-section-meta svelte-1v6nt1t">Five Stones Β· one taxonomy Β· every briefing</span></div> <p class="land-stones-deck svelte-1v6nt1t">Each briefing routes through a fixed taxonomy of public-record specialists. Each Stone is a class of evidence.
4
+ Together they form the briefing, and every claim in the output traces back to the Stone that produced it.</p> <div class="land-stones-detail svelte-1v6nt1t"></div></div></section>`);function xe(e,s){A(s,!1);const r=[{name:"Cornerstone",role:"the hazard reader",tag:"what NYC's ground remembers",sources:"USGS HWMs Β· FEMA NFHL Β· DEP stormwater Β· Prithvi historical",tint:"var(--stone-cornerstone)"},{name:"Keystone",role:"the asset register",tag:"what's exposed",sources:"MTA Β· NYCHA Β· DOE Β· DOH Β· PLUTO",tint:"var(--stone-keystone)"},{name:"Touchstone",role:"the live observer",tag:"what's happening now",sources:"FloodNet sensors Β· 311 complaints Β· NWS Β· NOAA tide gauges",tint:"var(--stone-touchstone)"},{name:"Lodestone",role:"the projector",tag:"what's coming",sources:"NPCC4 Β· Granite TTM (zero-shot + NYC fine-tune) Β· NWS alerts",tint:"var(--stone-lodestone)"},{name:"Capstone",role:"the synthesizer",tag:"writes it all down",sources:"Granite 4.1 composer Β· Mellea grounding-check Β· WeasyPrint",tint:"var(--stone-capstone)"}];ue();var t=Fe(),a=c(t),n=f(c(a),4);$(n,7,()=>r,u=>u.name,(u,l,v)=>{var i=ke();let j;var y=c(i),p=c(y,!0);o(y);var b=f(y,2),k=c(b,!0);o(b);var h=f(b,2),F=c(h,!0);o(h);var _=f(h,2),O=c(_,!0);o(_);var q=f(_,2),W=c(q,!0);o(q),o(i),T(I=>{j=de(i,"",j,{"--stone-tint":d(l).tint}),g(p,I),g(k,d(l).name),g(F,d(l).role),g(O,d(l).tag),g(W,d(l).sources)},[()=>String(d(v)+1).padStart(2,"0")]),m(u,i)}),o(n),o(a),o(t),m(e,t),P()}var Le=w('<footer class="land-footer svelte-1dcj612"><span class="land-footer-tiers svelte-1dcj612"><span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-emp svelte-1dcj612"></span>empirical</span> <span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-mod svelte-1dcj612"></span>modeled</span> <span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-prx svelte-1dcj612"></span>proxy</span> <span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-syn svelte-1dcj612"></span>synthetic</span></span> <span class="land-footer-build">Riprap v0.4.5 Β· NYC OpenData Β· FEMA NFHL Β· USGS Β· NPCC4</span></footer>');function Ee(e){var s=Le();m(e,s)}var Ne=w('<meta name="description" content="A citation-grounded flood-exposure briefing tool for any address, neighborhood, or BBL in New York City."/>'),Ce=w('<div class="land svelte-1uha8ag"><!> <div class="land-page svelte-1uha8ag"><!> <!></div> <!> <!></div>');function $e(e){var s=Ce();ne("1uha8ag",v=>{var i=Ne();te(()=>{re.title="Riprap β€” Flood Exposure Briefing for NYC"}),m(v,i)});var r=c(s);we(r);var t=f(r,2),a=c(t);ge(a,{});var n=f(a,2);Se(n),o(t);var u=f(t,2);xe(u,{});var l=f(u,2);Ee(l),o(s),m(e,s)}export{$e as component};
web/sveltekit/build/_app/immutable/nodes/{3.D22Sj2nj.js β†’ 3.liHvJPpw.js} RENAMED
@@ -1,4 +1,4 @@
1
- import{d as ge,c as he,a as v,s as l,b as xe,f as p}from"../chunks/CzfSRAFS.js";import{p as ye,a6 as we,f as $e,a as ke,a7 as qe,o as e,a5 as F,a8 as Se,a9 as d,a4 as I,c as a,s,r as t,t as M}from"../chunks/R1l3q-hJ.js";import{i as O}from"../chunks/C6-4B-da.js";import{e as je}from"../chunks/CGe8VjDs.js";import{h as Fe}from"../chunks/L2xkwLPH.js";import{p as Ie}from"../chunks/DP_9AkkW.js";import{B as Me,T as Oe}from"../chunks/DmCsJHgl.js";import{l as Te}from"../chunks/Bu_bEyoS.js";const Pe=!1,Re=!1,Ue=Object.freeze(Object.defineProperty({__proto__:null,prerender:Pe,ssr:Re},Symbol.toStringTag,{value:"Module"}));var Ae=p(`<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>`),Be=p('<div class="curl svelte-uialbm"> </div>'),De=p('<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>'),Ge=p('<section class="print-citations svelte-uialbm"><h2 class="svelte-uialbm">Citations</h2> <ol class="svelte-uialbm"></ol></section>'),ze=p('<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>'),Le=p('<div class="empty svelte-uialbm"><p>Loading…</p></div>');function Ve(Q,U){ye(U,!0);let V=d(()=>Ie.params.queryId??""),i=I(null),T=I(!1),P=I(!1);we(()=>{const r=Te(e(V));if(!r){F(T,!0);return}F(i,r,!0),requestAnimationFrame(()=>{requestAnimationFrame(()=>{typeof window<"u"&&(window.print(),F(P,!0))})})});function X(){typeof window<"u"&&window.print()}let R=d(()=>e(i)?Object.values(e(i).citations).sort((r,n)=>r.n-n.n):[]),A=d(()=>e(i)?new Date(e(i).generatedAt).toISOString().slice(0,10):"");var B=he();Fe("uialbm",r=>{qe(()=>{var n;Se.title=`Riprap briefing β€” ${((n=e(i))==null?void 0:n.queryText)??"export"??""}`})});var Y=$e(B);{var Z=r=>{var n=Ae();v(r,n)},ee=r=>{var n=ze(),c=a(n),u=a(c),D=s(a(u),2),ae=a(D);t(D),t(u);var m=s(u,2),se=a(m,!0);t(m);var G=s(m,2),f=s(a(G)),re=a(f,!0);t(f);var ie=s(f);t(G),t(c);var b=s(c,2),z=a(b),L=s(z,2),ne=a(L,!0);t(L),t(b);var N=s(b,2);Me(N,{get blocks(){return e(i).blocks},get citations(){return e(i).citations},streaming:!1});var C=s(N,2);{var le=_=>{var g=Ge(),W=s(a(g),2);je(W,21,()=>e(R),h=>h.id,(h,o)=>{var x=De(),y=a(x),ve=a(y);t(y);var w=s(y,2),pe=a(w);Oe(pe,{get tier(){return e(o).tier},size:9,get color(){return`var(--tier-${e(o).tier??""})`}}),t(w);var $=s(w,2),de=a($,!0);t($);var k=s($,2),ce=a(k);t(k);var q=s(k,2),ue=a(q,!0);t(q);var H=s(q,2);{var me=S=>{var j=Be(),_e=a(j,!0);t(j),M(()=>l(_e,e(o).url)),v(S,j)},fe=d(()=>e(o).url&&e(o).url.startsWith("http"));O(H,S=>{e(fe)&&S(me)})}var J=s(H,2),K=s(a(J)),be=a(K,!0);t(K),t(J),t(x),M(()=>{l(ve,`[${e(o).n??""}]`),l(de,e(o).source),l(ce,`v. ${e(o).vintage??""}`),l(ue,e(o).title),l(be,e(o).docId)}),v(h,x)}),t(W),t(g),v(_,g)};O(C,_=>{e(R).length&&_(le)})}var E=s(C,2),oe=a(E);t(E),t(n),M(()=>{l(ae,`flood-exposure briefing Β· v0.4.2 Β· ${e(A)??""}`),l(se,e(i).queryText),l(re,e(i).intent??"briefing"),l(ie,` Β· ${e(i).specialists??""} specialists
4
  Β· ${e(i).attempts??1??""} reconcile${(e(i).attempts??1)===1?"":"s"}
 
1
+ import{d as ge,c as he,a as v,s as l,b as xe,f as p}from"../chunks/CzfSRAFS.js";import{p as ye,a6 as we,f as $e,a as ke,a7 as qe,o as e,a5 as F,a8 as Se,a9 as d,a4 as I,c as a,s,r as t,t as M}from"../chunks/R1l3q-hJ.js";import{i as O}from"../chunks/C6-4B-da.js";import{e as je}from"../chunks/CGe8VjDs.js";import{h as Fe}from"../chunks/L2xkwLPH.js";import{p as Ie}from"../chunks/DJge0v95.js";import{B as Me,T as Oe}from"../chunks/DmCsJHgl.js";import{l as Te}from"../chunks/Bu_bEyoS.js";const Pe=!1,Re=!1,Ue=Object.freeze(Object.defineProperty({__proto__:null,prerender:Pe,ssr:Re},Symbol.toStringTag,{value:"Module"}));var Ae=p(`<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>`),Be=p('<div class="curl svelte-uialbm"> </div>'),De=p('<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>'),Ge=p('<section class="print-citations svelte-uialbm"><h2 class="svelte-uialbm">Citations</h2> <ol class="svelte-uialbm"></ol></section>'),ze=p('<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>'),Le=p('<div class="empty svelte-uialbm"><p>Loading…</p></div>');function Ve(Q,U){ye(U,!0);let V=d(()=>Ie.params.queryId??""),i=I(null),T=I(!1),P=I(!1);we(()=>{const r=Te(e(V));if(!r){F(T,!0);return}F(i,r,!0),requestAnimationFrame(()=>{requestAnimationFrame(()=>{typeof window<"u"&&(window.print(),F(P,!0))})})});function X(){typeof window<"u"&&window.print()}let R=d(()=>e(i)?Object.values(e(i).citations).sort((r,n)=>r.n-n.n):[]),A=d(()=>e(i)?new Date(e(i).generatedAt).toISOString().slice(0,10):"");var B=he();Fe("uialbm",r=>{qe(()=>{var n;Se.title=`Riprap briefing β€” ${((n=e(i))==null?void 0:n.queryText)??"export"??""}`})});var Y=$e(B);{var Z=r=>{var n=Ae();v(r,n)},ee=r=>{var n=ze(),c=a(n),u=a(c),D=s(a(u),2),ae=a(D);t(D),t(u);var m=s(u,2),se=a(m,!0);t(m);var G=s(m,2),f=s(a(G)),re=a(f,!0);t(f);var ie=s(f);t(G),t(c);var b=s(c,2),z=a(b),L=s(z,2),ne=a(L,!0);t(L),t(b);var N=s(b,2);Me(N,{get blocks(){return e(i).blocks},get citations(){return e(i).citations},streaming:!1});var C=s(N,2);{var le=_=>{var g=Ge(),W=s(a(g),2);je(W,21,()=>e(R),h=>h.id,(h,o)=>{var x=De(),y=a(x),ve=a(y);t(y);var w=s(y,2),pe=a(w);Oe(pe,{get tier(){return e(o).tier},size:9,get color(){return`var(--tier-${e(o).tier??""})`}}),t(w);var $=s(w,2),de=a($,!0);t($);var k=s($,2),ce=a(k);t(k);var q=s(k,2),ue=a(q,!0);t(q);var H=s(q,2);{var me=S=>{var j=Be(),_e=a(j,!0);t(j),M(()=>l(_e,e(o).url)),v(S,j)},fe=d(()=>e(o).url&&e(o).url.startsWith("http"));O(H,S=>{e(fe)&&S(me)})}var J=s(H,2),K=s(a(J)),be=a(K,!0);t(K),t(J),t(x),M(()=>{l(ve,`[${e(o).n??""}]`),l(de,e(o).source),l(ce,`v. ${e(o).vintage??""}`),l(ue,e(o).title),l(be,e(o).docId)}),v(h,x)}),t(W),t(g),v(_,g)};O(C,_=>{e(R).length&&_(le)})}var E=s(C,2),oe=a(E);t(E),t(n),M(()=>{l(ae,`flood-exposure briefing Β· v0.4.2 Β· ${e(A)??""}`),l(se,e(i).queryText),l(re,e(i).intent??"briefing"),l(ie,` Β· ${e(i).specialists??""} specialists
4
  Β· ${e(i).attempts??1??""} reconcile${(e(i).attempts??1)===1?"":"s"}
web/sveltekit/build/_app/immutable/nodes/{4.BFj07o33.js β†’ 4.DoFuD2WD.js} RENAMED
@@ -1 +1 @@
1
- import{d as De,s as Y,a as F,f as P,c as Ft,b as Et,t as Lt}from"../chunks/CzfSRAFS.js";import{c as w,s as N,r as y,aR as Re,t as Z,o as a,f as be,a9 as re,p as Pt,a4 as A,ab as ne,aa as Oe,a5 as v,a6 as jt,a as Ot}from"../chunks/R1l3q-hJ.js";import{p as Qe,i as W}from"../chunks/C6-4B-da.js";import{p as zt}from"../chunks/DP_9AkkW.js";import{T as ot,t as lt,a as Dt,B as Rt}from"../chunks/DmCsJHgl.js";import{f as Yt,C as Bt,F as Ht,R as Ut,M as Gt}from"../chunks/a5rSUn-N.js";import"../chunks/B_9mIQpm.js";import{e as ct,i as Wt}from"../chunks/CGe8VjDs.js";import{b as oe,a as ze,s as Kt}from"../chunks/a4L4UsYq.js";import{b as z,p as Vt}from"../chunks/Bu_bEyoS.js";const Zt=!1,Jt=!1,mr=Object.freeze(Object.defineProperty({__proto__:null,prerender:Zt,ssr:Jt},Symbol.toStringTag,{value:"Module"}));De(["click"]);De(["click"]);var Xt=P('<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=P('<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=w(t),s=w(r);oe(s,"",{},{width:"62%"});var d=N(s,2);oe(d,"",{},{width:"40%"}),y(r);var o=N(r,2);ct(o,1,()=>e,p=>p.n,(p,f)=>{var l=Xt(),c=w(l),h=w(c),M=w(h,!0);y(h);var B=N(h,2),j=w(B,!0);y(B),Re(2),y(c);var K=N(c,2);oe(K,"",{},{width:"92%"});var E=N(K,2);oe(E,"",{},{width:"78%"});var R=N(E,2);oe(R,"",{},{width:"85%"}),y(l),Z(()=>{Y(M,a(f).n),Y(j,a(f).label)}),F(p,l)}),y(t),F(n,t)}var tn=P('<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=Qe(e,"attempt",3,2),r=Qe(e,"max",3,3);var s=tn(),d=w(s);ot(d,{tier:"modeled",size:11,color:"var(--tier-modeled)"});var o=N(d,2),p=N(w(o),2),f=w(p);y(p),y(o),Re(2),y(s),Z(()=>Y(f,`Mellea reconciler Β· attempt ${t()??""} of ${r()??""} Β· previous draft dimmed below`)),F(n,s)}var rn=P("<a> </a>"),an=P('<button type="button"> </button>'),sn=P('<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=re(()=>t[e.state]),s=re(()=>e.actions??a(r).defaultActions.map(K=>({label:K})));var d=sn(),o=w(d),p=w(o);ot(p,{get tier(){return a(r).tier},size:11,get color(){return`var(--tier-${a(r).tier??""})`}});var f=N(p,2),l=w(f,!0);y(f),y(o);var c=N(o,2),h=w(c,!0);y(c);var M=N(c,2),B=w(M,!0);y(M);var j=N(M,2);ct(j,21,()=>a(s),Wt,(K,E,R)=>{var ee=Ft(),$e=be(ee);{var Te=V=>{var D=rn();ze(D,1,"error-card-action",null,{},{"is-primary":R===0});var Q=w(D,!0);y(D),Z(()=>{Kt(D,"href",a(E).href),Y(Q,a(E).label)}),F(V,D)},de=V=>{var D=an();ze(D,1,"error-card-action",null,{},{"is-primary":R===0});var Q=w(D,!0);y(D),Z(()=>Y(Q,a(E).label)),Et("click",D,function(...ie){var ue;(ue=a(E).onClick)==null||ue.apply(this,ie)}),F(V,D)};W($e,V=>{a(E).href?V(Te):V(de,-1)})}F(K,ee)}),y(j),Re(2),y(d),Z(()=>{ze(d,1,`error-card error-card-${e.state??""}`),Y(l,e.eyebrowOverride??a(r).eyebrow),Y(h,e.headlineOverride??a(r).headline),Y(B,e.bodyOverride??a(r).body)}),F(n,d)}De(["click"]);const X="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 b(n){return typeof n=="number"&&Number.isFinite(n)?n:null}function T(n){return typeof n=="string"?n:null}function I(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=I(n.dep);if(!e)return null;const t=[];for(const[r,s]of Object.entries(e)){const d=I(s);if(!d)continue;const o=b(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 mn(n){const e=I(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",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 fn(n){const e=I(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=I(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 hn(n){const e=[],t=I(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:`${b(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=I(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:`${b(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=I(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:`${b(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=I(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:`${b(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:X,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=I(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 gn(n){const e=I(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 p;const e=I(n.nyc311);if(!e)return null;const t=b(e.n)??0;if(t<=0)return null;const r=I(e.by_year),s=I(e.by_descriptor),d=r?Object.values(r).map(f=>b(f)??0):Array.from({length:12},()=>Math.round(t/12)),o=s?(p=Object.entries(s).sort((f,l)=>(b(l[1])??0)-(b(f[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:X,title:"Recent 311 flood complaints",headline:`${t} calls`,subhead:o?`top descriptor: ${o}`:"all flood-related descriptors",histogram:d,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 bn(n){var r;const e=I(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 ${T(e.station_id)??"?"}`,vintage:((r=T(e.obs_time))==null?void 0:r.slice(0,10))??X,title:"Recent precipitation",scalars:t,sub:`Nearest hourly METAR: ${T(e.station_name)??"?"} (${b(e.distance_km)??"?"} km).`,docId:"nws_obs",citeId:"nws_obs",mapLayer:"nws"}:null}function wn(n){var r;const e=I(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 ${T(e.station_name)??T(e.station_id)??"?"}`,vintage:((r=T(e.obs_time))==null?void 0:r.slice(0,10))??X,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 Sn(n){var r;const e=I(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:`${b(e.pct_water_within_500m)??0}% flooded`,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-pluvial"}}const xn={urban:"#C66",water:"#5B7FB4",vegetation:"#5B8A4A",barren:"#A89A78",wetland:"#D9C75A"};function kn(n){const e=I(n.terramind_lulc);if(!(e!=null&&e.ok))return null;const t=I(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:xn[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 An(n){const e=I(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 (zero-shot)",agency:"IBM Granite-TimeSeries Β· regional",vintage:X,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=I(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-ft",source:"msradam/Granite-TTM-r2-Battery-Surge",agency:"Granite TTM r2 Β· NYC-specialized fine-tune",vintage:X,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 $n(n){const e=I(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:X,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 M;const t=n.mellea??{},r=Array.isArray(t.requirements_passed)?t.requirements_passed:Array.isArray(t.passed)?t.passed:[],s=Array.isArray(t.requirements_failed)?t.requirements_failed:Array.isArray(t.failed)?t.failed:[],d=r.length,o=s.length,p=(typeof t.requirements_total=="number"?t.requirements_total:d+o)||4,f=typeof t.n_attempts=="number"?t.n_attempts:typeof t.attempts=="number"?t.attempts:0,c=(typeof t.rerolls=="number"?t.rerolls:null)??Math.max(0,f-1),h=((M=n.citations)==null?void 0:M.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:X,title:"Briefing reconciliation",metaRows:[{k:"mellea reroll",v:`${c} reroll${c===1?"":"s"}`},{k:"grounding checks",v:`${d}/${p} passed`},{k:"citations resolved",v:`${h}`},{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=I(s.geocode);return{cards:[un(s,d),pn(s),mn(s),fn(s),_n(s),hn(s),vn(s),gn(s),yn(s),bn(s),wn(s),Sn(s),kn(s),$n(s),An(s),Nn(s),r?Tn(n??{},t):null].filter(p=>p!=null),stones:dn(e),wallSeconds:t}}function Cn(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[f,l]of Object.entries(o)){const c=typeof l=="string"?l:"";c&&(p[f]={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 we={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"},Se={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 Ae(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 Ne(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 In(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=In(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:Ae(r.inside_sandy_2012),dep:Ne(r.dep_extreme_2080_label,r.dep_extreme_2080_class),asset:"subway",primaryTier:r.inside_sandy_2012?"empirical":"modeled"}});return{type:Se.subway,radius:xe(n.radius_m),count:n.n_entrances??t.length,rows:t,sourceLabel:we.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:ke(r.rep_elevation_m),ada:!1,fema:"β€”",sandy:Ae(void 0,s),dep:Ne(void 0,void 0,d),asset:"nycha",primaryTier:s&&s>0?"empirical":"modeled"}});return{type:Se.nycha,radius:xe(n.radius_m),count:n.n_developments??t.length,rows:t,sourceLabel:we.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:ke(r.elev_m),ada:!1,fema:"β€”",sandy:Ae(r.inside_sandy_2012),dep:Ne(r.dep_extreme_2080_label,r.dep_extreme_2080_class),asset:"school",primaryTier:r.inside_sandy_2012?"empirical":"modeled"}));return{type:Se.school,radius:xe(n.radius_m),count:n.n_schools??t.length,rows:t,sourceLabel:we.school}}function En(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:Ae(r.inside_sandy_2012),dep:Ne(r.dep_extreme_2080_label,r.dep_extreme_2080_class),asset:"hospital",primaryTier:r.inside_sandy_2012?"empirical":"modeled"}));return{type:Se.hospital,radius:xe(n.radius_m),count:n.n_hospitals??t.length,rows:t,sourceLabel:we.hospital}}function Ln(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=En(n.doh_hospitals??{});return d&&d.rows.length&&e.push(d),e}function Pn(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,M;let c;for(;c=o.exec(s);){const B=c.index+c[1].length+(c[2]?c[2].length:0),j=s.slice(0,B).trim();s=s.slice(B),j&&((h=e.onSentence)==null||h.call(e,j,d))}l&&s.trim()&&((M=e.onSentence)==null||M.call(e,s.trim(),d),s="")}function f(l,c){r.addEventListener(l,h=>{try{c(JSON.parse(h.data))}catch{}})}return f("hello",l=>{var c;return(c=e.onHello)==null?void 0:c.call(e,l.query)}),f("plan_token",l=>{var c;return(c=e.onPlanToken)==null?void 0:c.call(e,l.delta)}),f("plan",l=>{var c;return(c=e.onPlan)==null?void 0:c.call(e,l)}),f("step",l=>{var c;return(c=e.onStep)==null?void 0:c.call(e,l)}),f("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)}),f("mellea_attempt",l=>{var c;return(c=e.onMelleaAttempt)==null?void 0:c.call(e,l)}),f("final",l=>{var c;p(!0),(c=e.onFinal)==null||c.call(e,l)}),f("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 jn=/\[([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(jn)];if(d.length===0)return[{text:n}];for(const o of d){const p=n.slice(r,o.index??0),f=o[1].split(/\s*,\s*/).filter(Boolean);r=(o.index??0)+o[0].length;const l=lt(f[0]);s.push({text:p,tier:l,cite:f[0]});for(const c of f)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 f;for(nt.lastIndex=0;f=nt.exec(n);)if(f[2]!==void 0){const l=tt(f[2]);if(!l)continue;p.push({num:l.n,label:l.label,tier:l.tier,start:f.index+f[1].length,bodyStart:f.index+f[0].length})}else if(f[3]!==void 0){const l=f[3],c=(f[4]??"").trim(),h=ut.find(M=>M.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:f.index+f[1].length,bodyStart:f.index+f[0].length})}for(let l=0;l<p.length;l++){const c=p[l],h=p[l+1],M=n.slice(c.bodyStart,h?h.start:n.length).trim();if(M){o.push({kind:"head",n:c.num,label:c.label,tier:c.tier,title:c.titleExtra});for(const B of M.split(/\n\s*\n/)){const j=B.replace(/\s+/g," ").trim();if(!j)continue;const K=rt(j),E=[];for(const R of K)E.push(...it(R,t,d)),E.push({text:" "});for(;E.length&&E[E.length-1].text.trim()===""&&!E[E.length-1].tier;)E.pop();E.length&&o.push({kind:"prose",parts:E})}}}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 M of c)h.push(...it(M,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 le={type:"FeatureCollection",features:[]};async function ce(n){try{const e=await fetch(n);if(!e.ok)return le;const t=await e.json();return!t||t.type!=="FeatureCollection"?le:t}catch{return le}}async function zn(n,e,t=1500){return ce(`/api/layers/sandy?lat=${n}&lon=${e}&r=${t}`)}async function Dn(n,e,t=1500){return ce(`/api/layers/dep_extreme_2080?lat=${n}&lon=${e}&r=${t}`)}async function at(n,e,t=1500){return ce(`/api/layers/prithvi_water?lat=${n}&lon=${e}&r=${t}`)}async function Rn(n){return ce(`/api/layers/sandy_clipped?code=${encodeURIComponent(n)}`)}async function Yn(n,e="dep_extreme_2080"){return ce(`/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}}})}:le}catch{return le}}var Bn=P('<span class="region-head-meta svelte-1q8jizq"> <!></span>'),Hn=P('<span class="region-head-meta svelte-1q8jizq">planning…</span>'),Un=P('<div class="reroll-prev svelte-1q8jizq" aria-hidden="true"><p class="reroll-prev-line svelte-1q8jizq"> </p></div>'),Gn=P("<!> <!>",1),Wn=P('<span class="streaming-caret svelte-1q8jizq" aria-hidden="true">▍</span>'),Kn=P("<!> <!>",1),Vn=P('<details class="plan-details svelte-1q8jizq"><summary class="svelte-1q8jizq"> </summary> <pre class="plan-stream svelte-1q8jizq"> </pre></details>'),Zn=P('<div class="generating-status svelte-1q8jizq" aria-live="polite"><span class="pulse svelte-1q8jizq"></span> Planning intent… <!></div>'),Jn=P('<div class="generating-status svelte-1q8jizq" aria-live="polite"><span class="pulse svelte-1q8jizq"></span> Resolving address…</div>'),Xn=P("<!> <!>",1),Qn=P('<span class="region-head-meta svelte-1q8jizq"> </span>'),er=P('<span class="region-head-meta svelte-1q8jizq">awaiting geocode…</span>'),tr=P('<div style="position: relative; flex: 1; min-height: 0;" class="svelte-1q8jizq"><!> <!></div>'),nr=P('<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){Pt(e,!0);let t=re(()=>zt.params.queryId??""),r=re(()=>()=>{try{return decodeURIComponent(a(t))}catch{return a(t)}}),s=A(null),d=A(""),o=A(""),p=A(null),f=A(!1),l=A(0),c=2,h=A(!1),M=A(!1),B=A(""),j=A(null),K=A(ne([])),E=re(()=>{var u,i,_,m;return{empirical:((u=a(me))==null?void 0:u.features.length)??0,modeled:((i=a(fe))==null?void 0:i.features.length)??0,synthetic:((_=a(_e))==null?void 0:_.features.length)??0,proxy:((m=a(he))==null?void 0:m.features.length)??0}}),R=A(ne({id:"root",name:"briefing.run",status:"ok",ms:0,tier:null,children:[]})),ee=A(null),$e="comfortable",Te="smart",de=A(!1);Oe(()=>{typeof window<"u"&&v(de,new URL(window.location.href).searchParams.get("grammar")==="1")});let V=A(null),D=A(void 0),Q=ne({}),ie=A(0),ue=re(()=>{if(a(ie),a(p)){const u={...Q,...a(p)};return et(u,a(R),a(D),!0)}return et(Q,a(R),a(D),!1)});function mt(u){v(ee,u,!0)}function ft(u){const i=document.getElementById("region-cites");i&&i.scrollIntoView({behavior:"smooth",block:"start"})}const Ye=new Set(["ttm_forecast","ttm_311_forecast","floodnet_forecast"]),Ce="group-ttm-r2";function _t(u,i,_,m){if(m==="error")return _??void 0;if(m==="silent")return _??"no data";if(i==null||typeof i!="object")return;const $=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],L=[];if(g){for(const q of g)if($[q]!==void 0&&L.push(He(q,$[q])),L.length>=3)break}else for(const[q,k]of Object.entries($))if(k!==null&&typeof k!="object"&&(L.push(He(q,k)),L.length>=2))break;return L.join(" Β· ")||void 0}function ht(u){const i=[],_=u.mta_entrances;if(_&&Array.isArray(_.entrances))for(const g of _.entrances){const L=Number(g.entrance_lat),q=Number(g.entrance_lon);!Number.isFinite(L)||!Number.isFinite(q)||i.push({type:"Feature",geometry:{type:"Point",coordinates:[q,L]},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 m=u.doe_schools;if(m&&Array.isArray(m.schools))for(const g of m.schools){const L=Number(g.school_lat),q=Number(g.school_lon);!Number.isFinite(L)||!Number.isFinite(q)||i.push({type:"Feature",geometry:{type:"Point",coordinates:[q,L]},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 $=u.nycha_developments;if($&&Array.isArray($.developments))for(const g of $.developments){const L=Number(g.centroid_lat),q=Number(g.centroid_lon);if(!Number.isFinite(L)||!Number.isFinite(q))continue;const k=Number(g.pct_inside_sandy_2012??0);i.push({type:"Feature",geometry:{type:"Point",coordinates:[q,L]},properties:{kind:"nycha",name:String(g.development??"?"),doc_id:`nycha_dev_${g.tds_num??""}`,inside_sandy_2012:k>=50,pct_inside_sandy:k}})}const S=u.doh_hospitals;if(S&&Array.isArray(S.hospitals))for(const g of S.hospitals){const L=Number(g.hospital_lat),q=Number(g.hospital_lon);!Number.isFinite(L)||!Number.isFinite(q)||i.push({type:"Feature",geometry:{type:"Point",coordinates:[q,L]},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 Be(u){return 1+(u.children??[]).reduce((_,m)=>_+Be(m),0)}function He(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 ae=A(ne({empirical:!0,modeled:!0,synthetic:!0,proxy:!0})),J=A(null),pe=A(null),Ue=A(void 0),Ge=A(void 0),me=A(void 0),fe=A(void 0),_e=A(void 0),he=A(void 0),te=A(ne([])),se=A(ne({})),ve=[];function gt(){var $;if(!a(o)){v(te,[],!0),v(se,{},!0),ve=[];return}const u={};($=a(p))!=null&&$.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 m=1;for(const S of ve){const g=i.citations[S];g&&(_[S]={...g,n:m++})}for(const[S,g]of Object.entries(i.citations))_[S]||(_[S]={...g,n:m++},ve.push(S));v(te,i.blocks,!0),v(se,_,!0)}Oe(()=>{a(o),a(p),gt()}),Oe(()=>{if(!a(J))return;const{lat:u,lon:i,source:_}=a(J);_==="nta"&&a(pe)?(Rn(a(pe)).then(m=>v(me,m,!0)),Yn(a(pe)).then(m=>v(fe,m,!0)),at(u,i,2500).then(m=>v(_e,m,!0)),st(u,i,3e3).then(m=>v(he,m,!0))):(zn(u,i).then(m=>v(me,m,!0)),Dn(u,i).then(m=>v(fe,m,!0)),at(u,i).then(m=>v(_e,m,!0)),st(u,i).then(m=>v(he,m,!0)))}),jt(()=>{if(z.reset(),!a(r)())return;v(V,Date.now(),!0),z.phase="planning";const u=Pn(a(r)(),{onPlanToken:i=>v(d,a(d)+i),onPlan:i=>{var _;v(s,i,!0),z.phase="specialists",z.totalSpecialists=((_=i.specialists)==null?void 0:_.length)??0},onStep:i=>{if(new Set(["reconcile_granite41","mellea_reconcile_address","reconcile_neighborhood","reconcile_development","reconcile_live_now"]).has(i.step)||(z.activeStep=i.step,i.ok&&(z.firedCount=z.firedCount+1)),Cn(Q,i.step,i.result,i.ok),v(ie,a(ie)+1),i.step==="geocode")if(i.ok&&i.result&&typeof i.result=="object"){const x=i.result;if(typeof x.lat=="number"&&typeof x.lon=="number"){const C=typeof x.address=="string"?x.address:a(r)();v(J,{label:C,lat:x.lat,lon:x.lon,source:"geocode"},!0),v(M,!0)}}else v(j,"geocoder");if(i.step==="nta_resolve"&&i.ok&&i.result&&typeof i.result=="object"){const x=i.result,C=Array.isArray(x.bbox)?x.bbox:null,H=typeof x.nta_code=="string"?x.nta_code:null;if(C&&C.length===4&&H){v(pe,H,!0);const U=(C[0]+C[2])/2,O=(C[1]+C[3])/2,G=typeof x.nta_name=="string"?x.nta_name:a(r)();v(J,{label:G,lat:O,lon:U,source:"nta"},!0)}}const m=Dt(i.step),$=i.ok?i.result==null&&i.err==null?"silent":"ok":"error",S=Math.round((i.elapsed_s??0)*1e3),g=i.result!=null?i.result:i.err??null,L=_t(i.step,i.result,i.err,$),q={id:`step-${Be(a(R))}`,name:i.step,status:$,ms:S,tier:m,note:L,output:g,error:$==="error"?i.err??"unknown error":void 0,model:Ye.has(i.step)?"granite-timeseries-ttm-r2":void 0},k={...a(R),ms:(a(R).ms??0)+S};if(Ye.has(i.step)){const x=[...k.children??[]];let C=x.find(O=>O.id===Ce);C||(C={id:Ce,name:"forecasting.granite-timeseries-ttm-r2",status:"fan",ms:0,tier:"modeled",note:"1 instance",model:"granite-timeseries-ttm-r2",children:[]},x.push(C));const H=[...C.children??[],q],U={...C,ms:(C.ms??0)+S,note:`${H.length} instance${H.length===1?"":"s"}`,children:H};v(R,{...k,children:x.map(O=>O.id===Ce?U:O)},!0)}else v(R,{...k,children:[...k.children??[],q]},!0)},onAttemptStart:i=>{v(l,i,!0),z.phase="reconciling",z.attempt=i,z.activeStep="granite4.1 + mellea",i>1&&(v(B,a(o),!0),v(o,""),ve=[])},onToken:i=>{a(h)||(v(h,!0),a(l)===0&&v(l,1),z.phase="streaming",z.attempt=Math.max(1,z.attempt)),v(o,a(o)+i)},onMelleaAttempt:i=>{i.attempt>0&&(v(l,i.attempt,!0),z.attempt=i.attempt)},onFinal:i=>{v(p,i,!0),i.paragraph&&v(o,i.paragraph,!0),v(K,Ln(i),!0),v(Ue,ht(i),!0),v(Ge,vt(),!0);const m=i.mellea;m&&m.failed&&m.failed.length>0&&m.attempts&&m.attempts>=c&&v(j,"grounding")},onError:i=>{const _=i.toLowerCase();(_.includes("connection")||_.includes("502")||_.includes("503")||_.includes("timeout")||_.includes("routing"))&&v(j,"backend"),z.markError(i)},onDone:()=>{var i,_,m,$,S;v(f,!0),a(V)!=null&&v(D,(Date.now()-a(V))/1e3),!a(h)&&!a(j)&&a(M)&&v(j,"all-silent"),!a(j)&&a(te).length>0&&(Vt({queryId:a(t),queryText:a(r)(),intent:((i=a(s))==null?void 0:i.intent)??null,specialists:((m=(_=a(s))==null?void 0:_.specialists)==null?void 0:m.length)??0,blocks:a(te),citations:a(se),generatedAt:new Date().toISOString(),attempts:((S=($=a(p))==null?void 0:$.mellea)==null?void 0:S.attempts)??a(l)}),z.markReady())}});return()=>u.close()});var Ie=nr(),We=w(Ie),Me=w(We),qe=w(Me),Fe=w(qe),yt=N(w(Fe),2);{var bt=u=>{var i=Bn(),_=w(i),m=N(_);{var $=S=>{var g=Lt("Β· βœ“ done");F(S,g)};W(m,S=>{a(f)&&S($)})}y(i),Z(()=>{var S;return Y(_,`intent: ${a(s).intent??""} Β· ${((S=a(s).specialists)==null?void 0:S.length)??0??""} specialists Β· attempt ${a(l)??""} `)}),F(u,i)},wt=u=>{var i=Hn();F(u,i)};W(yt,u=>{a(s)?u(bt):u(wt,-1)})}y(Fe);var Ee=N(Fe,2),Ke=N(w(Ee)),St=w(Ke,!0);y(Ke),y(Ee);var xt=N(Ee,2);{var kt=u=>{on(u,{get state(){return a(j)}})},At=u=>{var i=Xn(),_=be(i);{var m=k=>{var x=Gn(),C=be(x);nn(C,{get attempt(){return a(l)},max:c});var H=N(C,2);{var U=O=>{var G=Un(),ge=w(G),ye=w(ge);y(ge),y(G),Z(je=>Y(ye,`${je??""}…`),[()=>a(B).slice(0,360)]),F(O,G)};W(H,O=>{a(B)&&O(U)})}F(k,x)};W(_,k=>{a(l)>1&&k(m)})}var $=N(_,2);{var S=k=>{var x=Kn(),C=be(x);Rt(C,{get blocks(){return a(te)},get citations(){return a(se)},streaming:!1});var H=N(C,2);{var U=O=>{var G=Wn();F(O,G)};W(H,O=>{a(f)||O(U)})}F(k,x)},g=k=>{en(k)},L=k=>{var x=Zn(),C=N(w(x),2);{var H=U=>{var O=Vn(),G=w(O),ge=w(G);y(G);var ye=N(G,2),je=w(ye,!0);y(ye),y(O),Z(()=>{Y(ge,`Planner streaming (${a(d).length??""} chars)`),Y(je,a(d))}),F(U,O)};W(C,U=>{a(d)&&U(H)})}y(x),F(k,x)},q=k=>{var x=Jn();F(k,x)};W($,k=>{a(te).length?k(S):a(M)&&!a(h)?k(g,1):a(s)?k(q,-1):k(L,2)})}F(u,i)};W(xt,u=>{a(j)?u(kt):u(At,-1)})}y(qe);var Ve=N(qe,2),Le=w(Ve),Pe=w(Le),Nt=N(w(Pe),2);{var $t=u=>{var i=Qn(),_=w(i);y(i),Z((m,$)=>Y(_,`Carto Positron Β· z15 Β· ${m??""}Β°N ${$??""}Β°W`),[()=>a(J).lat.toFixed(4),()=>Math.abs(a(J).lon).toFixed(4)]),F(u,i)},Tt=u=>{var i=er();F(u,i)};W(Nt,u=>{a(J)?u($t):u(Tt,-1)})}y(Pe);var Ct=N(Pe,2);{var It=u=>{var i=tr(),_=w(i);Ut(_,{get address(){return a(J)},get activeLayers(){return a(ae)},get sandyEmpirical(){return a(me)},get depModeled(){return a(fe)},get syntheticPrior(){return a(_e)},get proxy311(){return a(he)},get registerPoints(){return a(Ue)},get registerPolygons(){return a(Ge)},get linkedKey(){return a(ee)}});var m=N(_,2);Gt(m,{get active(){return a(ae)},get featureCounts(){return a(E)},onToggle:$=>v(ae,{...a(ae),[$]:!a(ae)[$]},!0)}),y(i),F(u,i)};W(Ct,u=>{a(J)&&u(It)})}y(Le);var Ze=N(Le,2),Mt=w(Ze);Bt(Mt,{get citations(){return a(se)}}),y(Ze),y(Ve),y(Me);var Je=N(Me,2),Xe=w(Je),qt=w(Xe);Ht(qt,{get data(){return a(ue)},density:$e,provenanceMode:Te,get showGrammar(){return a(de)},get linkedKey(){return a(ee)},onLink:mt,onCite:ft}),y(Xe),y(Je),y(We),y(Ie),Z(u=>Y(St,u),[()=>a(r)()]),F(n,Ie),Ot()}export{fr as component,mr as universal};
 
1
+ import{d as De,s as Y,a as F,f as P,c as Ft,b as Et,t as Lt}from"../chunks/CzfSRAFS.js";import{c as w,s as N,r as y,aR as Re,t as Z,o as a,f as be,a9 as re,p as Pt,a4 as A,ab as ne,aa as Oe,a5 as v,a6 as jt,a as Ot}from"../chunks/R1l3q-hJ.js";import{p as Qe,i as W}from"../chunks/C6-4B-da.js";import{p as zt}from"../chunks/DJge0v95.js";import{T as ot,t as lt,a as Dt,B as Rt}from"../chunks/DmCsJHgl.js";import{f as Yt,C as Bt,F as Ht,R as Ut,M as Gt}from"../chunks/BXi3zWkM.js";import"../chunks/B_9mIQpm.js";import{e as ct,i as Wt}from"../chunks/CGe8VjDs.js";import{b as oe,a as ze,s as Kt}from"../chunks/a4L4UsYq.js";import{b as z,p as Vt}from"../chunks/Bu_bEyoS.js";const Zt=!1,Jt=!1,mr=Object.freeze(Object.defineProperty({__proto__:null,prerender:Zt,ssr:Jt},Symbol.toStringTag,{value:"Module"}));De(["click"]);De(["click"]);var Xt=P('<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=P('<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=w(t),s=w(r);oe(s,"",{},{width:"62%"});var d=N(s,2);oe(d,"",{},{width:"40%"}),y(r);var o=N(r,2);ct(o,1,()=>e,p=>p.n,(p,f)=>{var l=Xt(),c=w(l),h=w(c),M=w(h,!0);y(h);var B=N(h,2),j=w(B,!0);y(B),Re(2),y(c);var K=N(c,2);oe(K,"",{},{width:"92%"});var E=N(K,2);oe(E,"",{},{width:"78%"});var R=N(E,2);oe(R,"",{},{width:"85%"}),y(l),Z(()=>{Y(M,a(f).n),Y(j,a(f).label)}),F(p,l)}),y(t),F(n,t)}var tn=P('<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=Qe(e,"attempt",3,2),r=Qe(e,"max",3,3);var s=tn(),d=w(s);ot(d,{tier:"modeled",size:11,color:"var(--tier-modeled)"});var o=N(d,2),p=N(w(o),2),f=w(p);y(p),y(o),Re(2),y(s),Z(()=>Y(f,`Mellea reconciler Β· attempt ${t()??""} of ${r()??""} Β· previous draft dimmed below`)),F(n,s)}var rn=P("<a> </a>"),an=P('<button type="button"> </button>'),sn=P('<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=re(()=>t[e.state]),s=re(()=>e.actions??a(r).defaultActions.map(K=>({label:K})));var d=sn(),o=w(d),p=w(o);ot(p,{get tier(){return a(r).tier},size:11,get color(){return`var(--tier-${a(r).tier??""})`}});var f=N(p,2),l=w(f,!0);y(f),y(o);var c=N(o,2),h=w(c,!0);y(c);var M=N(c,2),B=w(M,!0);y(M);var j=N(M,2);ct(j,21,()=>a(s),Wt,(K,E,R)=>{var ee=Ft(),$e=be(ee);{var Te=V=>{var D=rn();ze(D,1,"error-card-action",null,{},{"is-primary":R===0});var Q=w(D,!0);y(D),Z(()=>{Kt(D,"href",a(E).href),Y(Q,a(E).label)}),F(V,D)},de=V=>{var D=an();ze(D,1,"error-card-action",null,{},{"is-primary":R===0});var Q=w(D,!0);y(D),Z(()=>Y(Q,a(E).label)),Et("click",D,function(...ie){var ue;(ue=a(E).onClick)==null||ue.apply(this,ie)}),F(V,D)};W($e,V=>{a(E).href?V(Te):V(de,-1)})}F(K,ee)}),y(j),Re(2),y(d),Z(()=>{ze(d,1,`error-card error-card-${e.state??""}`),Y(l,e.eyebrowOverride??a(r).eyebrow),Y(h,e.headlineOverride??a(r).headline),Y(B,e.bodyOverride??a(r).body)}),F(n,d)}De(["click"]);const X="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 b(n){return typeof n=="number"&&Number.isFinite(n)?n:null}function T(n){return typeof n=="string"?n:null}function I(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=I(n.dep);if(!e)return null;const t=[];for(const[r,s]of Object.entries(e)){const d=I(s);if(!d)continue;const o=b(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 mn(n){const e=I(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",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 fn(n){const e=I(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=I(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 hn(n){const e=[],t=I(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:`${b(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=I(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:`${b(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=I(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:`${b(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=I(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:`${b(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:X,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=I(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 gn(n){const e=I(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 p;const e=I(n.nyc311);if(!e)return null;const t=b(e.n)??0;if(t<=0)return null;const r=I(e.by_year),s=I(e.by_descriptor),d=r?Object.values(r).map(f=>b(f)??0):Array.from({length:12},()=>Math.round(t/12)),o=s?(p=Object.entries(s).sort((f,l)=>(b(l[1])??0)-(b(f[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:X,title:"Recent 311 flood complaints",headline:`${t} calls`,subhead:o?`top descriptor: ${o}`:"all flood-related descriptors",histogram:d,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 bn(n){var r;const e=I(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 ${T(e.station_id)??"?"}`,vintage:((r=T(e.obs_time))==null?void 0:r.slice(0,10))??X,title:"Recent precipitation",scalars:t,sub:`Nearest hourly METAR: ${T(e.station_name)??"?"} (${b(e.distance_km)??"?"} km).`,docId:"nws_obs",citeId:"nws_obs",mapLayer:"nws"}:null}function wn(n){var r;const e=I(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 ${T(e.station_name)??T(e.station_id)??"?"}`,vintage:((r=T(e.obs_time))==null?void 0:r.slice(0,10))??X,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 Sn(n){var r;const e=I(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:`${b(e.pct_water_within_500m)??0}% flooded`,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-pluvial"}}const xn={urban:"#C66",water:"#5B7FB4",vegetation:"#5B8A4A",barren:"#A89A78",wetland:"#D9C75A"};function kn(n){const e=I(n.terramind_lulc);if(!(e!=null&&e.ok))return null;const t=I(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:xn[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 An(n){const e=I(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 (zero-shot)",agency:"IBM Granite-TimeSeries Β· regional",vintage:X,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=I(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-ft",source:"msradam/Granite-TTM-r2-Battery-Surge",agency:"Granite TTM r2 Β· NYC-specialized fine-tune",vintage:X,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 $n(n){const e=I(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:X,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 M;const t=n.mellea??{},r=Array.isArray(t.requirements_passed)?t.requirements_passed:Array.isArray(t.passed)?t.passed:[],s=Array.isArray(t.requirements_failed)?t.requirements_failed:Array.isArray(t.failed)?t.failed:[],d=r.length,o=s.length,p=(typeof t.requirements_total=="number"?t.requirements_total:d+o)||4,f=typeof t.n_attempts=="number"?t.n_attempts:typeof t.attempts=="number"?t.attempts:0,c=(typeof t.rerolls=="number"?t.rerolls:null)??Math.max(0,f-1),h=((M=n.citations)==null?void 0:M.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:X,title:"Briefing reconciliation",metaRows:[{k:"mellea reroll",v:`${c} reroll${c===1?"":"s"}`},{k:"grounding checks",v:`${d}/${p} passed`},{k:"citations resolved",v:`${h}`},{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=I(s.geocode);return{cards:[un(s,d),pn(s),mn(s),fn(s),_n(s),hn(s),vn(s),gn(s),yn(s),bn(s),wn(s),Sn(s),kn(s),$n(s),An(s),Nn(s),r?Tn(n??{},t):null].filter(p=>p!=null),stones:dn(e),wallSeconds:t}}function Cn(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[f,l]of Object.entries(o)){const c=typeof l=="string"?l:"";c&&(p[f]={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 we={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"},Se={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 Ae(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 Ne(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 In(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=In(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:Ae(r.inside_sandy_2012),dep:Ne(r.dep_extreme_2080_label,r.dep_extreme_2080_class),asset:"subway",primaryTier:r.inside_sandy_2012?"empirical":"modeled"}});return{type:Se.subway,radius:xe(n.radius_m),count:n.n_entrances??t.length,rows:t,sourceLabel:we.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:ke(r.rep_elevation_m),ada:!1,fema:"β€”",sandy:Ae(void 0,s),dep:Ne(void 0,void 0,d),asset:"nycha",primaryTier:s&&s>0?"empirical":"modeled"}});return{type:Se.nycha,radius:xe(n.radius_m),count:n.n_developments??t.length,rows:t,sourceLabel:we.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:ke(r.elev_m),ada:!1,fema:"β€”",sandy:Ae(r.inside_sandy_2012),dep:Ne(r.dep_extreme_2080_label,r.dep_extreme_2080_class),asset:"school",primaryTier:r.inside_sandy_2012?"empirical":"modeled"}));return{type:Se.school,radius:xe(n.radius_m),count:n.n_schools??t.length,rows:t,sourceLabel:we.school}}function En(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:Ae(r.inside_sandy_2012),dep:Ne(r.dep_extreme_2080_label,r.dep_extreme_2080_class),asset:"hospital",primaryTier:r.inside_sandy_2012?"empirical":"modeled"}));return{type:Se.hospital,radius:xe(n.radius_m),count:n.n_hospitals??t.length,rows:t,sourceLabel:we.hospital}}function Ln(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=En(n.doh_hospitals??{});return d&&d.rows.length&&e.push(d),e}function Pn(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,M;let c;for(;c=o.exec(s);){const B=c.index+c[1].length+(c[2]?c[2].length:0),j=s.slice(0,B).trim();s=s.slice(B),j&&((h=e.onSentence)==null||h.call(e,j,d))}l&&s.trim()&&((M=e.onSentence)==null||M.call(e,s.trim(),d),s="")}function f(l,c){r.addEventListener(l,h=>{try{c(JSON.parse(h.data))}catch{}})}return f("hello",l=>{var c;return(c=e.onHello)==null?void 0:c.call(e,l.query)}),f("plan_token",l=>{var c;return(c=e.onPlanToken)==null?void 0:c.call(e,l.delta)}),f("plan",l=>{var c;return(c=e.onPlan)==null?void 0:c.call(e,l)}),f("step",l=>{var c;return(c=e.onStep)==null?void 0:c.call(e,l)}),f("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)}),f("mellea_attempt",l=>{var c;return(c=e.onMelleaAttempt)==null?void 0:c.call(e,l)}),f("final",l=>{var c;p(!0),(c=e.onFinal)==null||c.call(e,l)}),f("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 jn=/\[([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(jn)];if(d.length===0)return[{text:n}];for(const o of d){const p=n.slice(r,o.index??0),f=o[1].split(/\s*,\s*/).filter(Boolean);r=(o.index??0)+o[0].length;const l=lt(f[0]);s.push({text:p,tier:l,cite:f[0]});for(const c of f)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 f;for(nt.lastIndex=0;f=nt.exec(n);)if(f[2]!==void 0){const l=tt(f[2]);if(!l)continue;p.push({num:l.n,label:l.label,tier:l.tier,start:f.index+f[1].length,bodyStart:f.index+f[0].length})}else if(f[3]!==void 0){const l=f[3],c=(f[4]??"").trim(),h=ut.find(M=>M.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:f.index+f[1].length,bodyStart:f.index+f[0].length})}for(let l=0;l<p.length;l++){const c=p[l],h=p[l+1],M=n.slice(c.bodyStart,h?h.start:n.length).trim();if(M){o.push({kind:"head",n:c.num,label:c.label,tier:c.tier,title:c.titleExtra});for(const B of M.split(/\n\s*\n/)){const j=B.replace(/\s+/g," ").trim();if(!j)continue;const K=rt(j),E=[];for(const R of K)E.push(...it(R,t,d)),E.push({text:" "});for(;E.length&&E[E.length-1].text.trim()===""&&!E[E.length-1].tier;)E.pop();E.length&&o.push({kind:"prose",parts:E})}}}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 M of c)h.push(...it(M,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 le={type:"FeatureCollection",features:[]};async function ce(n){try{const e=await fetch(n);if(!e.ok)return le;const t=await e.json();return!t||t.type!=="FeatureCollection"?le:t}catch{return le}}async function zn(n,e,t=1500){return ce(`/api/layers/sandy?lat=${n}&lon=${e}&r=${t}`)}async function Dn(n,e,t=1500){return ce(`/api/layers/dep_extreme_2080?lat=${n}&lon=${e}&r=${t}`)}async function at(n,e,t=1500){return ce(`/api/layers/prithvi_water?lat=${n}&lon=${e}&r=${t}`)}async function Rn(n){return ce(`/api/layers/sandy_clipped?code=${encodeURIComponent(n)}`)}async function Yn(n,e="dep_extreme_2080"){return ce(`/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}}})}:le}catch{return le}}var Bn=P('<span class="region-head-meta svelte-1q8jizq"> <!></span>'),Hn=P('<span class="region-head-meta svelte-1q8jizq">planning…</span>'),Un=P('<div class="reroll-prev svelte-1q8jizq" aria-hidden="true"><p class="reroll-prev-line svelte-1q8jizq"> </p></div>'),Gn=P("<!> <!>",1),Wn=P('<span class="streaming-caret svelte-1q8jizq" aria-hidden="true">▍</span>'),Kn=P("<!> <!>",1),Vn=P('<details class="plan-details svelte-1q8jizq"><summary class="svelte-1q8jizq"> </summary> <pre class="plan-stream svelte-1q8jizq"> </pre></details>'),Zn=P('<div class="generating-status svelte-1q8jizq" aria-live="polite"><span class="pulse svelte-1q8jizq"></span> Planning intent… <!></div>'),Jn=P('<div class="generating-status svelte-1q8jizq" aria-live="polite"><span class="pulse svelte-1q8jizq"></span> Resolving address…</div>'),Xn=P("<!> <!>",1),Qn=P('<span class="region-head-meta svelte-1q8jizq"> </span>'),er=P('<span class="region-head-meta svelte-1q8jizq">awaiting geocode…</span>'),tr=P('<div style="position: relative; flex: 1; min-height: 0;" class="svelte-1q8jizq"><!> <!></div>'),nr=P('<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){Pt(e,!0);let t=re(()=>zt.params.queryId??""),r=re(()=>()=>{try{return decodeURIComponent(a(t))}catch{return a(t)}}),s=A(null),d=A(""),o=A(""),p=A(null),f=A(!1),l=A(0),c=2,h=A(!1),M=A(!1),B=A(""),j=A(null),K=A(ne([])),E=re(()=>{var u,i,_,m;return{empirical:((u=a(me))==null?void 0:u.features.length)??0,modeled:((i=a(fe))==null?void 0:i.features.length)??0,synthetic:((_=a(_e))==null?void 0:_.features.length)??0,proxy:((m=a(he))==null?void 0:m.features.length)??0}}),R=A(ne({id:"root",name:"briefing.run",status:"ok",ms:0,tier:null,children:[]})),ee=A(null),$e="comfortable",Te="smart",de=A(!1);Oe(()=>{typeof window<"u"&&v(de,new URL(window.location.href).searchParams.get("grammar")==="1")});let V=A(null),D=A(void 0),Q=ne({}),ie=A(0),ue=re(()=>{if(a(ie),a(p)){const u={...Q,...a(p)};return et(u,a(R),a(D),!0)}return et(Q,a(R),a(D),!1)});function mt(u){v(ee,u,!0)}function ft(u){const i=document.getElementById("region-cites");i&&i.scrollIntoView({behavior:"smooth",block:"start"})}const Ye=new Set(["ttm_forecast","ttm_311_forecast","floodnet_forecast"]),Ce="group-ttm-r2";function _t(u,i,_,m){if(m==="error")return _??void 0;if(m==="silent")return _??"no data";if(i==null||typeof i!="object")return;const $=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],L=[];if(g){for(const q of g)if($[q]!==void 0&&L.push(He(q,$[q])),L.length>=3)break}else for(const[q,k]of Object.entries($))if(k!==null&&typeof k!="object"&&(L.push(He(q,k)),L.length>=2))break;return L.join(" Β· ")||void 0}function ht(u){const i=[],_=u.mta_entrances;if(_&&Array.isArray(_.entrances))for(const g of _.entrances){const L=Number(g.entrance_lat),q=Number(g.entrance_lon);!Number.isFinite(L)||!Number.isFinite(q)||i.push({type:"Feature",geometry:{type:"Point",coordinates:[q,L]},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 m=u.doe_schools;if(m&&Array.isArray(m.schools))for(const g of m.schools){const L=Number(g.school_lat),q=Number(g.school_lon);!Number.isFinite(L)||!Number.isFinite(q)||i.push({type:"Feature",geometry:{type:"Point",coordinates:[q,L]},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 $=u.nycha_developments;if($&&Array.isArray($.developments))for(const g of $.developments){const L=Number(g.centroid_lat),q=Number(g.centroid_lon);if(!Number.isFinite(L)||!Number.isFinite(q))continue;const k=Number(g.pct_inside_sandy_2012??0);i.push({type:"Feature",geometry:{type:"Point",coordinates:[q,L]},properties:{kind:"nycha",name:String(g.development??"?"),doc_id:`nycha_dev_${g.tds_num??""}`,inside_sandy_2012:k>=50,pct_inside_sandy:k}})}const S=u.doh_hospitals;if(S&&Array.isArray(S.hospitals))for(const g of S.hospitals){const L=Number(g.hospital_lat),q=Number(g.hospital_lon);!Number.isFinite(L)||!Number.isFinite(q)||i.push({type:"Feature",geometry:{type:"Point",coordinates:[q,L]},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 Be(u){return 1+(u.children??[]).reduce((_,m)=>_+Be(m),0)}function He(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 ae=A(ne({empirical:!0,modeled:!0,synthetic:!0,proxy:!0})),J=A(null),pe=A(null),Ue=A(void 0),Ge=A(void 0),me=A(void 0),fe=A(void 0),_e=A(void 0),he=A(void 0),te=A(ne([])),se=A(ne({})),ve=[];function gt(){var $;if(!a(o)){v(te,[],!0),v(se,{},!0),ve=[];return}const u={};($=a(p))!=null&&$.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 m=1;for(const S of ve){const g=i.citations[S];g&&(_[S]={...g,n:m++})}for(const[S,g]of Object.entries(i.citations))_[S]||(_[S]={...g,n:m++},ve.push(S));v(te,i.blocks,!0),v(se,_,!0)}Oe(()=>{a(o),a(p),gt()}),Oe(()=>{if(!a(J))return;const{lat:u,lon:i,source:_}=a(J);_==="nta"&&a(pe)?(Rn(a(pe)).then(m=>v(me,m,!0)),Yn(a(pe)).then(m=>v(fe,m,!0)),at(u,i,2500).then(m=>v(_e,m,!0)),st(u,i,3e3).then(m=>v(he,m,!0))):(zn(u,i).then(m=>v(me,m,!0)),Dn(u,i).then(m=>v(fe,m,!0)),at(u,i).then(m=>v(_e,m,!0)),st(u,i).then(m=>v(he,m,!0)))}),jt(()=>{if(z.reset(),!a(r)())return;v(V,Date.now(),!0),z.phase="planning";const u=Pn(a(r)(),{onPlanToken:i=>v(d,a(d)+i),onPlan:i=>{var _;v(s,i,!0),z.phase="specialists",z.totalSpecialists=((_=i.specialists)==null?void 0:_.length)??0},onStep:i=>{if(new Set(["reconcile_granite41","mellea_reconcile_address","reconcile_neighborhood","reconcile_development","reconcile_live_now"]).has(i.step)||(z.activeStep=i.step,i.ok&&(z.firedCount=z.firedCount+1)),Cn(Q,i.step,i.result,i.ok),v(ie,a(ie)+1),i.step==="geocode")if(i.ok&&i.result&&typeof i.result=="object"){const x=i.result;if(typeof x.lat=="number"&&typeof x.lon=="number"){const C=typeof x.address=="string"?x.address:a(r)();v(J,{label:C,lat:x.lat,lon:x.lon,source:"geocode"},!0),v(M,!0)}}else v(j,"geocoder");if(i.step==="nta_resolve"&&i.ok&&i.result&&typeof i.result=="object"){const x=i.result,C=Array.isArray(x.bbox)?x.bbox:null,H=typeof x.nta_code=="string"?x.nta_code:null;if(C&&C.length===4&&H){v(pe,H,!0);const U=(C[0]+C[2])/2,O=(C[1]+C[3])/2,G=typeof x.nta_name=="string"?x.nta_name:a(r)();v(J,{label:G,lat:O,lon:U,source:"nta"},!0)}}const m=Dt(i.step),$=i.ok?i.result==null&&i.err==null?"silent":"ok":"error",S=Math.round((i.elapsed_s??0)*1e3),g=i.result!=null?i.result:i.err??null,L=_t(i.step,i.result,i.err,$),q={id:`step-${Be(a(R))}`,name:i.step,status:$,ms:S,tier:m,note:L,output:g,error:$==="error"?i.err??"unknown error":void 0,model:Ye.has(i.step)?"granite-timeseries-ttm-r2":void 0},k={...a(R),ms:(a(R).ms??0)+S};if(Ye.has(i.step)){const x=[...k.children??[]];let C=x.find(O=>O.id===Ce);C||(C={id:Ce,name:"forecasting.granite-timeseries-ttm-r2",status:"fan",ms:0,tier:"modeled",note:"1 instance",model:"granite-timeseries-ttm-r2",children:[]},x.push(C));const H=[...C.children??[],q],U={...C,ms:(C.ms??0)+S,note:`${H.length} instance${H.length===1?"":"s"}`,children:H};v(R,{...k,children:x.map(O=>O.id===Ce?U:O)},!0)}else v(R,{...k,children:[...k.children??[],q]},!0)},onAttemptStart:i=>{v(l,i,!0),z.phase="reconciling",z.attempt=i,z.activeStep="granite4.1 + mellea",i>1&&(v(B,a(o),!0),v(o,""),ve=[])},onToken:i=>{a(h)||(v(h,!0),a(l)===0&&v(l,1),z.phase="streaming",z.attempt=Math.max(1,z.attempt)),v(o,a(o)+i)},onMelleaAttempt:i=>{i.attempt>0&&(v(l,i.attempt,!0),z.attempt=i.attempt)},onFinal:i=>{v(p,i,!0),i.paragraph&&v(o,i.paragraph,!0),v(K,Ln(i),!0),v(Ue,ht(i),!0),v(Ge,vt(),!0);const m=i.mellea;m&&m.failed&&m.failed.length>0&&m.attempts&&m.attempts>=c&&v(j,"grounding")},onError:i=>{const _=i.toLowerCase();(_.includes("connection")||_.includes("502")||_.includes("503")||_.includes("timeout")||_.includes("routing"))&&v(j,"backend"),z.markError(i)},onDone:()=>{var i,_,m,$,S;v(f,!0),a(V)!=null&&v(D,(Date.now()-a(V))/1e3),!a(h)&&!a(j)&&a(M)&&v(j,"all-silent"),!a(j)&&a(te).length>0&&(Vt({queryId:a(t),queryText:a(r)(),intent:((i=a(s))==null?void 0:i.intent)??null,specialists:((m=(_=a(s))==null?void 0:_.specialists)==null?void 0:m.length)??0,blocks:a(te),citations:a(se),generatedAt:new Date().toISOString(),attempts:((S=($=a(p))==null?void 0:$.mellea)==null?void 0:S.attempts)??a(l)}),z.markReady())}});return()=>u.close()});var Ie=nr(),We=w(Ie),Me=w(We),qe=w(Me),Fe=w(qe),yt=N(w(Fe),2);{var bt=u=>{var i=Bn(),_=w(i),m=N(_);{var $=S=>{var g=Lt("Β· βœ“ done");F(S,g)};W(m,S=>{a(f)&&S($)})}y(i),Z(()=>{var S;return Y(_,`intent: ${a(s).intent??""} Β· ${((S=a(s).specialists)==null?void 0:S.length)??0??""} specialists Β· attempt ${a(l)??""} `)}),F(u,i)},wt=u=>{var i=Hn();F(u,i)};W(yt,u=>{a(s)?u(bt):u(wt,-1)})}y(Fe);var Ee=N(Fe,2),Ke=N(w(Ee)),St=w(Ke,!0);y(Ke),y(Ee);var xt=N(Ee,2);{var kt=u=>{on(u,{get state(){return a(j)}})},At=u=>{var i=Xn(),_=be(i);{var m=k=>{var x=Gn(),C=be(x);nn(C,{get attempt(){return a(l)},max:c});var H=N(C,2);{var U=O=>{var G=Un(),ge=w(G),ye=w(ge);y(ge),y(G),Z(je=>Y(ye,`${je??""}…`),[()=>a(B).slice(0,360)]),F(O,G)};W(H,O=>{a(B)&&O(U)})}F(k,x)};W(_,k=>{a(l)>1&&k(m)})}var $=N(_,2);{var S=k=>{var x=Kn(),C=be(x);Rt(C,{get blocks(){return a(te)},get citations(){return a(se)},streaming:!1});var H=N(C,2);{var U=O=>{var G=Wn();F(O,G)};W(H,O=>{a(f)||O(U)})}F(k,x)},g=k=>{en(k)},L=k=>{var x=Zn(),C=N(w(x),2);{var H=U=>{var O=Vn(),G=w(O),ge=w(G);y(G);var ye=N(G,2),je=w(ye,!0);y(ye),y(O),Z(()=>{Y(ge,`Planner streaming (${a(d).length??""} chars)`),Y(je,a(d))}),F(U,O)};W(C,U=>{a(d)&&U(H)})}y(x),F(k,x)},q=k=>{var x=Jn();F(k,x)};W($,k=>{a(te).length?k(S):a(M)&&!a(h)?k(g,1):a(s)?k(q,-1):k(L,2)})}F(u,i)};W(xt,u=>{a(j)?u(kt):u(At,-1)})}y(qe);var Ve=N(qe,2),Le=w(Ve),Pe=w(Le),Nt=N(w(Pe),2);{var $t=u=>{var i=Qn(),_=w(i);y(i),Z((m,$)=>Y(_,`Carto Positron Β· z15 Β· ${m??""}Β°N ${$??""}Β°W`),[()=>a(J).lat.toFixed(4),()=>Math.abs(a(J).lon).toFixed(4)]),F(u,i)},Tt=u=>{var i=er();F(u,i)};W(Nt,u=>{a(J)?u($t):u(Tt,-1)})}y(Pe);var Ct=N(Pe,2);{var It=u=>{var i=tr(),_=w(i);Ut(_,{get address(){return a(J)},get activeLayers(){return a(ae)},get sandyEmpirical(){return a(me)},get depModeled(){return a(fe)},get syntheticPrior(){return a(_e)},get proxy311(){return a(he)},get registerPoints(){return a(Ue)},get registerPolygons(){return a(Ge)},get linkedKey(){return a(ee)}});var m=N(_,2);Gt(m,{get active(){return a(ae)},get featureCounts(){return a(E)},onToggle:$=>v(ae,{...a(ae),[$]:!a(ae)[$]},!0)}),y(i),F(u,i)};W(Ct,u=>{a(J)&&u(It)})}y(Le);var Ze=N(Le,2),Mt=w(Ze);Bt(Mt,{get citations(){return a(se)}}),y(Ze),y(Ve),y(Me);var Je=N(Me,2),Xe=w(Je),qt=w(Xe);Ht(qt,{get data(){return a(ue)},density:$e,provenanceMode:Te,get showGrammar(){return a(de)},get linkedKey(){return a(ee)},onLink:mt,onCite:ft}),y(Xe),y(Je),y(We),y(Ie),Z(u=>Y(St,u),[()=>a(r)()]),F(n,Ie),Ot()}export{fr as component,mr as universal};
web/sveltekit/build/_app/immutable/nodes/{5.Bw01bLNz.js β†’ 5.BqecXchk.js} RENAMED
@@ -1 +1 @@
1
- import{d as z,b as V,a as U,f as q,s as j}from"../chunks/CzfSRAFS.js";import{p as Z,aa as X,a5 as d,a4 as l,ab as Q,a6 as $,t as J,a as ee,s as r,c as e,o as i,r as t,a9 as te}from"../chunks/R1l3q-hJ.js";import{B as ie}from"../chunks/DmCsJHgl.js";import{f as re,R as ae,M as ne,C as se,F as oe}from"../chunks/a5rSUn-N.js";import{p as de,b as M}from"../chunks/Bu_bEyoS.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);$(()=>(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(()=>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
+ import{d as z,b as V,a as U,f as q,s as j}from"../chunks/CzfSRAFS.js";import{p as Z,aa as X,a5 as d,a4 as l,ab as Q,a6 as $,t as J,a as ee,s as r,c as e,o as i,r as t,a9 as te}from"../chunks/R1l3q-hJ.js";import{B as ie}from"../chunks/DmCsJHgl.js";import{f as re,R as ae,M as ne,C as se,F as oe}from"../chunks/BXi3zWkM.js";import{p as de,b as M}from"../chunks/Bu_bEyoS.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);$(()=>(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(()=>j(H,R)),V("click",D,()=>d(m,i(m)+1)),U(a,u),ee()}z(["click"]);export{ye as component,fe as universal};
web/sveltekit/build/_app/version.json CHANGED
@@ -1 +1 @@
1
- {"version":"1778031470202"}
 
1
+ {"version":"1778042322025"}
web/sveltekit/build/index.html CHANGED
@@ -6,24 +6,24 @@
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.DcfT94lp.js" rel="modulepreload">
10
- <link href="./_app/immutable/chunks/D9Zf6nF7.js" rel="modulepreload">
11
  <link href="./_app/immutable/chunks/R1l3q-hJ.js" rel="modulepreload">
12
- <link href="./_app/immutable/entry/app.qmZS3WSP.js" rel="modulepreload">
13
  <link href="./_app/immutable/chunks/DZRTzx66.js" rel="modulepreload">
14
  <link href="./_app/immutable/chunks/CzfSRAFS.js" rel="modulepreload">
15
  <link href="./_app/immutable/chunks/C6-4B-da.js" rel="modulepreload">
16
- <link href="./_app/immutable/nodes/0.IL53jLg5.js" rel="modulepreload">
17
  <link href="./_app/immutable/chunks/Bu_bEyoS.js" rel="modulepreload">
18
- <link href="./_app/immutable/chunks/DP_9AkkW.js" rel="modulepreload">
19
  <link href="./_app/immutable/chunks/a4L4UsYq.js" rel="modulepreload">
20
  <link href="./_app/immutable/chunks/B_9mIQpm.js" rel="modulepreload">
21
- <link href="./_app/immutable/nodes/2.C4OcOHhN.js" rel="modulepreload">
22
  <link href="./_app/immutable/chunks/L2xkwLPH.js" rel="modulepreload">
23
  <link href="./_app/immutable/chunks/CGe8VjDs.js" rel="modulepreload">
24
  <link href="./_app/immutable/chunks/D907np-5.js" rel="modulepreload">
25
  <!--1uha8ag--><meta name="description" content="A citation-grounded flood-exposure briefing tool for any address, neighborhood, or BBL in New York City."/><!----><title>Riprap β€” Flood Exposure Briefing for NYC</title>
26
- <link href="./_app/immutable/assets/0.mgbkK27i.css" rel="stylesheet">
27
  <link href="./_app/immutable/assets/2.BD53GLFY.css" rel="stylesheet">
28
  </head>
29
  <body data-sveltekit-preload-data="hover">
@@ -34,15 +34,15 @@
34
 
35
  <script>
36
  {
37
- __sveltekit_186n2ot = {
38
  base: new URL(".", location).pathname.slice(0, -1)
39
  };
40
 
41
  const element = document.currentScript.parentElement;
42
 
43
  Promise.all([
44
- import("./_app/immutable/entry/start.DcfT94lp.js"),
45
- import("./_app/immutable/entry/app.qmZS3WSP.js")
46
  ]).then(([kit, app]) => {
47
  kit.start(app, element, {
48
  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.Du3-6zpX.js" rel="modulepreload">
10
+ <link href="./_app/immutable/chunks/CTVfprh3.js" rel="modulepreload">
11
  <link href="./_app/immutable/chunks/R1l3q-hJ.js" rel="modulepreload">
12
+ <link href="./_app/immutable/entry/app.D_vNpH02.js" rel="modulepreload">
13
  <link href="./_app/immutable/chunks/DZRTzx66.js" rel="modulepreload">
14
  <link href="./_app/immutable/chunks/CzfSRAFS.js" rel="modulepreload">
15
  <link href="./_app/immutable/chunks/C6-4B-da.js" rel="modulepreload">
16
+ <link href="./_app/immutable/nodes/0.CyFUYGHQ.js" rel="modulepreload">
17
  <link href="./_app/immutable/chunks/Bu_bEyoS.js" rel="modulepreload">
18
+ <link href="./_app/immutable/chunks/DJge0v95.js" rel="modulepreload">
19
  <link href="./_app/immutable/chunks/a4L4UsYq.js" rel="modulepreload">
20
  <link href="./_app/immutable/chunks/B_9mIQpm.js" rel="modulepreload">
21
+ <link href="./_app/immutable/nodes/2._BOZ29qB.js" rel="modulepreload">
22
  <link href="./_app/immutable/chunks/L2xkwLPH.js" rel="modulepreload">
23
  <link href="./_app/immutable/chunks/CGe8VjDs.js" rel="modulepreload">
24
  <link href="./_app/immutable/chunks/D907np-5.js" rel="modulepreload">
25
  <!--1uha8ag--><meta name="description" content="A citation-grounded flood-exposure briefing tool for any address, neighborhood, or BBL in New York City."/><!----><title>Riprap β€” Flood Exposure Briefing for NYC</title>
26
+ <link href="./_app/immutable/assets/0.xlIi8G7J.css" rel="stylesheet">
27
  <link href="./_app/immutable/assets/2.BD53GLFY.css" rel="stylesheet">
28
  </head>
29
  <body data-sveltekit-preload-data="hover">
 
34
 
35
  <script>
36
  {
37
+ __sveltekit_1v6cc0u = {
38
  base: new URL(".", location).pathname.slice(0, -1)
39
  };
40
 
41
  const element = document.currentScript.parentElement;
42
 
43
  Promise.all([
44
+ import("./_app/immutable/entry/start.Du3-6zpX.js"),
45
+ import("./_app/immutable/entry/app.D_vNpH02.js")
46
  ]).then(([kit, app]) => {
47
  kit.start(app, element, {
48
  node_ids: [0, 2],
web/sveltekit/build/q/sample.html CHANGED
The diff for this file is too large to render. See raw diff
 
web/sveltekit/src/lib/components/evidence/viz/ThumbStripe.svelte CHANGED
@@ -3,7 +3,7 @@
3
  let { kind }: Props = $props();
4
  </script>
5
 
6
- <svg viewBox="0 0 220 110" width="100%" height="110" aria-hidden="true" style="display: block; background: #F2F2EE;">
7
  <defs>
8
  <pattern id="thumb-{kind}" width="6" height="6" patternUnits="userSpaceOnUse" patternTransform="rotate(45)">
9
  <rect width="6" height="6" fill={kind === 'synthetic' ? 'rgba(42,111,168,0.18)' : 'rgba(42,111,168,0.30)'} />
@@ -11,10 +11,10 @@
11
  </pattern>
12
  </defs>
13
  {#if kind === 'stormwater'}
14
- <rect x="0" y="0" width="220" height="110" fill="#FAFAF7" />
15
  <path d="M0 60 L60 55 L120 70 L180 80 L220 78 L220 110 L0 110 Z" fill="rgba(42,111,168,0.30)" stroke="#2A6FA8" stroke-width="1" />
16
  <path d="M0 75 L60 72 L120 85 L180 92 L220 90 L220 110 L0 110 Z" fill="rgba(42,111,168,0.20)" stroke="#2A6FA8" stroke-width="0.8" />
17
- <circle cx="100" cy="68" r="4" fill="#D17C00" stroke="#FAFAF7" stroke-width="1.5" />
18
  {:else}
19
  <rect x="0" y="0" width="220" height="110" fill="url(#thumb-{kind})" />
20
  <text x="8" y="100" font-family="IBM Plex Mono" font-size="9" fill="#2A6FA8">SYN Β· 2025-09-14</text>
 
3
  let { kind }: Props = $props();
4
  </script>
5
 
6
+ <svg viewBox="0 0 220 110" width="100%" height="110" aria-hidden="true" style="display: block; background: #E8ECF2;">
7
  <defs>
8
  <pattern id="thumb-{kind}" width="6" height="6" patternUnits="userSpaceOnUse" patternTransform="rotate(45)">
9
  <rect width="6" height="6" fill={kind === 'synthetic' ? 'rgba(42,111,168,0.18)' : 'rgba(42,111,168,0.30)'} />
 
11
  </pattern>
12
  </defs>
13
  {#if kind === 'stormwater'}
14
+ <rect x="0" y="0" width="220" height="110" fill="#F4F6F9" />
15
  <path d="M0 60 L60 55 L120 70 L180 80 L220 78 L220 110 L0 110 Z" fill="rgba(42,111,168,0.30)" stroke="#2A6FA8" stroke-width="1" />
16
  <path d="M0 75 L60 72 L120 85 L180 92 L220 90 L220 110 L0 110 Z" fill="rgba(42,111,168,0.20)" stroke="#2A6FA8" stroke-width="0.8" />
17
+ <circle cx="100" cy="68" r="4" fill="#005EA2" stroke="#F4F6F9" stroke-width="1.5" />
18
  {:else}
19
  <rect x="0" y="0" width="220" height="110" fill="url(#thumb-{kind})" />
20
  <text x="8" y="100" font-family="IBM Plex Mono" font-size="9" fill="#2A6FA8">SYN Β· 2025-09-14</text>
web/sveltekit/src/lib/components/findings/cards/RasterThumb.svelte CHANGED
@@ -11,7 +11,7 @@
11
 
12
  {#if kind === 'stormwater'}
13
  <svg viewBox="0 0 {W} {H}" width="100%" height={H} aria-hidden="true">
14
- <rect width={W} height={H} fill="#F2F2EE" />
15
  <g stroke="#D9D6CC" stroke-width="0.6">
16
  <line x1="0" y1="40" x2={W} y2="40" />
17
  <line x1="0" y1="80" x2={W} y2="80" />
@@ -22,12 +22,12 @@
22
  fill="rgba(42,111,168,0.32)" stroke="#2A6FA8" stroke-width="0.7" />
23
  <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"
24
  fill="rgba(11,83,148,0.36)" stroke="#0B5394" stroke-width="0.6" />
25
- <circle cx="120" cy="74" r="3.2" fill="#D17C00" stroke="#FAFAF7" stroke-width="1.3" />
26
  <text x={W - 6} y={H - 5} font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#6B6B6B">2.13 in/hr Β· MOD</text>
27
  </svg>
28
  {:else if kind === 'stormwater-dry'}
29
  <svg viewBox="0 0 {W} {H}" width="100%" height={H} aria-hidden="true">
30
- <rect width={W} height={H} fill="#F2F2EE" />
31
  <g stroke="#D9D6CC" stroke-width="0.6">
32
  <line x1="0" y1="40" x2={W} y2="40" />
33
  <line x1="0" y1="80" x2={W} y2="80" />
@@ -36,7 +36,7 @@
36
  </g>
37
  <path d="M180 92 Q 200 88 215 96 Q 220 105 200 104 Q 185 102 180 96 Z"
38
  fill="rgba(42,111,168,0.18)" stroke="#2A6FA8" stroke-width="0.5" stroke-dasharray="2 2" />
39
- <circle cx="120" cy="60" r="3.2" fill="#D17C00" stroke="#FAFAF7" stroke-width="1.3" />
40
  <text x={W - 6} y={H - 5} font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#6B6B6B">no ponding Β· MOD</text>
41
  </svg>
42
  {:else if kind === 'prithvi'}
@@ -52,12 +52,12 @@
52
  <rect x="0" y="55" width={W} height="6" fill="#A8A496" />
53
  <rect x="115" y="0" width="8" height={H} fill="#A8A496" />
54
  <ellipse cx="50" cy="92" rx="6" ry="3" fill="#2A6FA8" fill-opacity="0.65" />
55
- <text x="6" y="14" font-size="9" font-family="IBM Plex Mono" fill="#FAFAF7">PRITHVI Β· 0.3%</text>
56
- <text x={W - 6} y={H - 5} font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#FAFAF7">scene 2026-05-02</text>
57
  </svg>
58
  {:else if kind === 'lulc'}
59
  <svg viewBox="0 0 {W} {H}" width="100%" height={H} aria-hidden="true">
60
- <rect width={W} height={H} fill="#F2F2EE" />
61
  <rect x="0" y="0" width="80" height="60" fill="#C66" />
62
  <rect x="80" y="0" width="60" height="60" fill="#C66" />
63
  <rect x="140" y="0" width="100" height="38" fill="#C66" />
@@ -67,8 +67,8 @@
67
  <rect x="150" y="60" width="50" height="60" fill="#D9C75A" />
68
  <rect x="200" y="60" width="40" height="60" fill="#C66" />
69
  <rect x="100" y="100" width="50" height="20" fill="#A89A78" />
70
- <text x="6" y="14" font-size="9" font-family="IBM Plex Mono" fill="#FAFAF7">LULC Β· TerraMind</text>
71
- <text x={W - 6} y={H - 5} font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#FAFAF7">scene 2026-05-02</text>
72
  </svg>
73
  {:else if kind === 'buildings'}
74
  <svg viewBox="0 0 {W} {H}" width="100%" height={H} aria-hidden="true">
@@ -83,8 +83,8 @@
83
  <rect x={r[0]} y={r[1]} width={r[2]} height={r[3]}
84
  fill="rgba(42,111,168,0.55)" stroke="#2A6FA8" stroke-width="0.4" />
85
  {/each}
86
- <text x="6" y="14" font-size="9" font-family="IBM Plex Mono" fill="#FAFAF7">BLDG Β· TerraMind</text>
87
- <text x={W - 6} y={H - 5} font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#FAFAF7">36.2% built</text>
88
  </svg>
89
  {:else}
90
  <div class="thumb-placeholder">raster preview</div>
 
11
 
12
  {#if kind === 'stormwater'}
13
  <svg viewBox="0 0 {W} {H}" width="100%" height={H} aria-hidden="true">
14
+ <rect width={W} height={H} fill="#E8ECF2" />
15
  <g stroke="#D9D6CC" stroke-width="0.6">
16
  <line x1="0" y1="40" x2={W} y2="40" />
17
  <line x1="0" y1="80" x2={W} y2="80" />
 
22
  fill="rgba(42,111,168,0.32)" stroke="#2A6FA8" stroke-width="0.7" />
23
  <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"
24
  fill="rgba(11,83,148,0.36)" stroke="#0B5394" stroke-width="0.6" />
25
+ <circle cx="120" cy="74" r="3.2" fill="#005EA2" stroke="#F4F6F9" stroke-width="1.3" />
26
  <text x={W - 6} y={H - 5} font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#6B6B6B">2.13 in/hr Β· MOD</text>
27
  </svg>
28
  {:else if kind === 'stormwater-dry'}
29
  <svg viewBox="0 0 {W} {H}" width="100%" height={H} aria-hidden="true">
30
+ <rect width={W} height={H} fill="#E8ECF2" />
31
  <g stroke="#D9D6CC" stroke-width="0.6">
32
  <line x1="0" y1="40" x2={W} y2="40" />
33
  <line x1="0" y1="80" x2={W} y2="80" />
 
36
  </g>
37
  <path d="M180 92 Q 200 88 215 96 Q 220 105 200 104 Q 185 102 180 96 Z"
38
  fill="rgba(42,111,168,0.18)" stroke="#2A6FA8" stroke-width="0.5" stroke-dasharray="2 2" />
39
+ <circle cx="120" cy="60" r="3.2" fill="#005EA2" stroke="#F4F6F9" stroke-width="1.3" />
40
  <text x={W - 6} y={H - 5} font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#6B6B6B">no ponding Β· MOD</text>
41
  </svg>
42
  {:else if kind === 'prithvi'}
 
52
  <rect x="0" y="55" width={W} height="6" fill="#A8A496" />
53
  <rect x="115" y="0" width="8" height={H} fill="#A8A496" />
54
  <ellipse cx="50" cy="92" rx="6" ry="3" fill="#2A6FA8" fill-opacity="0.65" />
55
+ <text x="6" y="14" font-size="9" font-family="IBM Plex Mono" fill="#F4F6F9">PRITHVI Β· 0.3%</text>
56
+ <text x={W - 6} y={H - 5} font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#F4F6F9">scene 2026-05-02</text>
57
  </svg>
58
  {:else if kind === 'lulc'}
59
  <svg viewBox="0 0 {W} {H}" width="100%" height={H} aria-hidden="true">
60
+ <rect width={W} height={H} fill="#E8ECF2" />
61
  <rect x="0" y="0" width="80" height="60" fill="#C66" />
62
  <rect x="80" y="0" width="60" height="60" fill="#C66" />
63
  <rect x="140" y="0" width="100" height="38" fill="#C66" />
 
67
  <rect x="150" y="60" width="50" height="60" fill="#D9C75A" />
68
  <rect x="200" y="60" width="40" height="60" fill="#C66" />
69
  <rect x="100" y="100" width="50" height="20" fill="#A89A78" />
70
+ <text x="6" y="14" font-size="9" font-family="IBM Plex Mono" fill="#F4F6F9">LULC Β· TerraMind</text>
71
+ <text x={W - 6} y={H - 5} font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#F4F6F9">scene 2026-05-02</text>
72
  </svg>
73
  {:else if kind === 'buildings'}
74
  <svg viewBox="0 0 {W} {H}" width="100%" height={H} aria-hidden="true">
 
83
  <rect x={r[0]} y={r[1]} width={r[2]} height={r[3]}
84
  fill="rgba(42,111,168,0.55)" stroke="#2A6FA8" stroke-width="0.4" />
85
  {/each}
86
+ <text x="6" y="14" font-size="9" font-family="IBM Plex Mono" fill="#F4F6F9">BLDG Β· TerraMind</text>
87
+ <text x={W - 6} y={H - 5} font-size="8" font-family="IBM Plex Mono" text-anchor="end" fill="#F4F6F9">36.2% built</text>
88
  </svg>
89
  {:else}
90
  <div class="thumb-placeholder">raster preview</div>
web/sveltekit/src/lib/components/glyphs/AssetPin.svelte CHANGED
@@ -17,7 +17,7 @@
17
  color?: string;
18
  }
19
 
20
- let { kind, size = 12, color = '#1A1A1A' }: Props = $props();
21
  let half = $derived(size / 2);
22
  </script>
23
 
 
17
  color?: string;
18
  }
19
 
20
+ let { kind, size = 12, color = '#0F172A' }: Props = $props();
21
  let half = $derived(size / 2);
22
  </script>
23
 
web/sveltekit/src/lib/components/landing/LandMiniMap.svelte CHANGED
@@ -146,13 +146,13 @@
146
  paint: {
147
  'circle-radius': 9,
148
  'circle-color': 'transparent',
149
- 'circle-stroke-color': '#1A1A1A',
150
  'circle-stroke-width': 1.4,
151
  },
152
  });
153
  map.addLayer({
154
  id: 'addr-dot', type: 'circle', source: 'addr',
155
- paint: { 'circle-radius': 3, 'circle-color': '#1A1A1A' },
156
  });
157
  });
158
  })();
 
146
  paint: {
147
  'circle-radius': 9,
148
  'circle-color': 'transparent',
149
+ 'circle-stroke-color': '#0F172A',
150
  'circle-stroke-width': 1.4,
151
  },
152
  });
153
  map.addLayer({
154
  id: 'addr-dot', type: 'circle', source: 'addr',
155
+ paint: { 'circle-radius': 3, 'circle-color': '#0F172A' },
156
  });
157
  });
158
  })();
web/sveltekit/src/lib/components/map/RipMap.svelte CHANGED
@@ -207,7 +207,7 @@
207
  ['==', ['get', 'inside_sandy_2012'], true], '#0B5394',
208
  '#6B6B6B'
209
  ],
210
- 'circle-stroke-color': '#FAFAF7',
211
  'circle-stroke-width': 1.25,
212
  'circle-radius': [
213
  'match', ['get', 'kind'],
@@ -241,14 +241,14 @@
241
  const docId = String(p.doc_id ?? '');
242
  const html = `
243
  <div style="font-family: 'IBM Plex Sans', system-ui; font-size: 12px;">
244
- <div style="font-weight: 600; color: #1A1A1A;">${name}</div>
245
  <div style="color: #6B6B6B; font-size: 11px; margin-top: 2px;">${kind}</div>
246
  <div style="margin-top: 6px;">
247
  <span style="font-family: 'IBM Plex Mono', monospace; font-size: 10.5px; color: ${inside ? '#0B5394' : '#6B6B6B'};">
248
  inside_sandy_2012=${inside}
249
  </span>
250
  </div>
251
- ${docId ? `<div style="margin-top: 4px; font-family: 'IBM Plex Mono', monospace; font-size: 10.5px; color: #B8620A;">[${docId}]</div>` : ''}
252
  </div>`;
253
  // @ts-expect-error: maplibre captured in outer onMount scope
254
  const popup = new maplibre.Popup({ closeButton: true, offset: 12 });
@@ -256,7 +256,7 @@
256
  popup.setLngLat(coords).setHTML(html).addTo(map);
257
  });
258
 
259
- // queried-address pin: warm orange halo + dot, dominant
260
  map.addLayer({
261
  id: 'queried-halo', type: 'circle', source: 'queried-address',
262
  paint: {
@@ -267,8 +267,8 @@
267
  map.addLayer({
268
  id: 'queried-pin', type: 'circle', source: 'queried-address',
269
  paint: {
270
- 'circle-color': '#D17C00',
271
- 'circle-stroke-color': '#FAFAF7',
272
  'circle-stroke-width': 2,
273
  'circle-radius': 7
274
  }
@@ -283,8 +283,8 @@
283
  'text-anchor': 'bottom'
284
  },
285
  paint: {
286
- 'text-color': '#1A1A1A',
287
- 'text-halo-color': '#FAFAF7',
288
  'text-halo-width': 1.5
289
  }
290
  });
 
207
  ['==', ['get', 'inside_sandy_2012'], true], '#0B5394',
208
  '#6B6B6B'
209
  ],
210
+ 'circle-stroke-color': '#F4F6F9',
211
  'circle-stroke-width': 1.25,
212
  'circle-radius': [
213
  'match', ['get', 'kind'],
 
241
  const docId = String(p.doc_id ?? '');
242
  const html = `
243
  <div style="font-family: 'IBM Plex Sans', system-ui; font-size: 12px;">
244
+ <div style="font-weight: 600; color: #0F172A;">${name}</div>
245
  <div style="color: #6B6B6B; font-size: 11px; margin-top: 2px;">${kind}</div>
246
  <div style="margin-top: 6px;">
247
  <span style="font-family: 'IBM Plex Mono', monospace; font-size: 10.5px; color: ${inside ? '#0B5394' : '#6B6B6B'};">
248
  inside_sandy_2012=${inside}
249
  </span>
250
  </div>
251
+ ${docId ? `<div style="margin-top: 4px; font-family: 'IBM Plex Mono', monospace; font-size: 10.5px; color: #005EA2;">[${docId}]</div>` : ''}
252
  </div>`;
253
  // @ts-expect-error: maplibre captured in outer onMount scope
254
  const popup = new maplibre.Popup({ closeButton: true, offset: 12 });
 
256
  popup.setLngLat(coords).setHTML(html).addTo(map);
257
  });
258
 
259
+ // queried-address pin: federal-blue halo + dot, dominant
260
  map.addLayer({
261
  id: 'queried-halo', type: 'circle', source: 'queried-address',
262
  paint: {
 
267
  map.addLayer({
268
  id: 'queried-pin', type: 'circle', source: 'queried-address',
269
  paint: {
270
+ 'circle-color': '#005EA2',
271
+ 'circle-stroke-color': '#F4F6F9',
272
  'circle-stroke-width': 2,
273
  'circle-radius': 7
274
  }
 
283
  'text-anchor': 'bottom'
284
  },
285
  paint: {
286
+ 'text-color': '#0F172A',
287
+ 'text-halo-color': '#F4F6F9',
288
  'text-halo-width': 1.5
289
  }
290
  });
web/sveltekit/src/lib/components/trace/StatusGlyph.svelte CHANGED
@@ -14,7 +14,7 @@
14
  </svg>
15
  {:else if status === 'error'}
16
  <svg width="9" height="9" viewBox="0 0 9 9" aria-label="error">
17
- <rect x="0.75" y="0.75" width="7.5" height="7.5" fill="#B8620A" />
18
  </svg>
19
  {:else}
20
  <svg width="9" height="9" viewBox="0 0 9 9" aria-label="ok">
 
14
  </svg>
15
  {:else if status === 'error'}
16
  <svg width="9" height="9" viewBox="0 0 9 9" aria-label="error">
17
+ <rect x="0.75" y="0.75" width="7.5" height="7.5" fill="#005EA2" />
18
  </svg>
19
  {:else}
20
  <svg width="9" height="9" viewBox="0 0 9 9" aria-label="ok">
web/sveltekit/src/lib/print.css CHANGED
@@ -101,12 +101,12 @@
101
  @top-left {
102
  content: "riprap Β· " var(--print-address, "flood-exposure briefing");
103
  font: 9pt "IBM Plex Mono";
104
- color: #4A4A4A;
105
  }
106
  @top-right {
107
  content: "Generated " var(--print-date, "today") " Β· v0.4.2";
108
  font: 9pt "IBM Plex Mono";
109
- color: #4A4A4A;
110
  }
111
  @bottom-left {
112
  content: var(--print-url, "riprap.nyc");
 
101
  @top-left {
102
  content: "riprap Β· " var(--print-address, "flood-exposure briefing");
103
  font: 9pt "IBM Plex Mono";
104
+ color: #334155;
105
  }
106
  @top-right {
107
  content: "Generated " var(--print-date, "today") " Β· v0.4.2";
108
  font: 9pt "IBM Plex Mono";
109
+ color: #334155;
110
  }
111
  @bottom-left {
112
  content: var(--print-url, "riprap.nyc");
web/sveltekit/src/lib/styles.css CHANGED
@@ -663,7 +663,7 @@
663
  .glyph-sizes, .glyph-mono { display: flex; align-items: center; gap: 10px; font-family: var(--font-mono); font-size: 11px; color: var(--ink-tertiary); border-top: 1px dashed var(--rule-soft); padding-top: 10px; }
664
  .glyph-sizes-label { min-width: 80px; }
665
  .glyph-sizes-mono { color: var(--ink-tertiary); margin-left: auto; }
666
- .glyph-mono > svg:last-of-type { background: #1A1A1A; padding: 2px; border-radius: 1px; }
667
 
668
  /* Map spec */
669
  .map-spec-grid { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); gap: 24px; align-items: stretch; }
@@ -829,7 +829,7 @@
829
  /* Β§14 syn-stripe */
830
  .stripe-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; margin-bottom: 22px; }
831
  .stripe-cell { display: flex; flex-direction: column; gap: 8px; padding: 18px; background: white; border: 1px solid var(--rule-soft); }
832
- .stripe-preview { width: 100%; height: 180px; border: 1px solid var(--rule-soft); background-color: #FAFAF7; overflow: hidden; }
833
  .stripe-preview > div { background-repeat: repeat; background-size: 12px 12px !important; }
834
  .stripe-code { font-family: var(--font-mono); font-size: 10px; line-height: 1.5; color: var(--ink-secondary); background: #FBF8EF; padding: 10px 12px; border: 1px solid var(--rule-soft); white-space: pre-wrap; overflow-x: auto; max-height: 180px; overflow-y: auto; }
835
  .stripe-code-wide { max-height: 360px; }
 
663
  .glyph-sizes, .glyph-mono { display: flex; align-items: center; gap: 10px; font-family: var(--font-mono); font-size: 11px; color: var(--ink-tertiary); border-top: 1px dashed var(--rule-soft); padding-top: 10px; }
664
  .glyph-sizes-label { min-width: 80px; }
665
  .glyph-sizes-mono { color: var(--ink-tertiary); margin-left: auto; }
666
+ .glyph-mono > svg:last-of-type { background: #0F172A; padding: 2px; border-radius: 1px; }
667
 
668
  /* Map spec */
669
  .map-spec-grid { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); gap: 24px; align-items: stretch; }
 
829
  /* Β§14 syn-stripe */
830
  .stripe-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; margin-bottom: 22px; }
831
  .stripe-cell { display: flex; flex-direction: column; gap: 8px; padding: 18px; background: white; border: 1px solid var(--rule-soft); }
832
+ .stripe-preview { width: 100%; height: 180px; border: 1px solid var(--rule-soft); background-color: #F4F6F9; overflow: hidden; }
833
  .stripe-preview > div { background-repeat: repeat; background-size: 12px 12px !important; }
834
  .stripe-code { font-family: var(--font-mono); font-size: 10px; line-height: 1.5; color: var(--ink-secondary); background: #FBF8EF; padding: 10px 12px; border: 1px solid var(--rule-soft); white-space: pre-wrap; overflow-x: auto; max-height: 180px; overflow-y: auto; }
835
  .stripe-code-wide { max-height: 360px; }
web/sveltekit/src/lib/tokens.css CHANGED
@@ -1,55 +1,66 @@
1
- /* Riprap design tokens
2
- Civic-tech-clean. SIL OFL / Apache fonts only. WCAG 2.2 AA verified.
 
 
 
 
3
  */
4
 
5
  :root {
6
  /* ── Epistemic tier colors ─────────────────────────────────────────
7
- Refined from starter palette to meet 4.5:1 against white for body
8
- text where the tier color is also used as inline citation/label color.
9
- Originals: #3D85C6 = 3.04:1 (fail body), #999999 = 2.85:1 (fail).
10
- Refined values verified via WebAIM contrast checker, deutan/protan/
11
- tritan colorblind-safe (tier is also encoded by glyph + label).
12
  */
13
- --tier-empirical: #0B5394; /* 8.59:1 vs white βœ“ AAA */
14
- --tier-empirical-fill: rgba(11, 83, 148, 0.40);
15
- --tier-empirical-line: #0B5394;
16
 
17
- --tier-modeled: #2A6FA8; /* 5.41:1 vs white βœ“ AA was #3D85C6 (3.04:1 fail) */
18
- --tier-modeled-fill: rgba(42, 111, 168, 0.25);
19
- --tier-modeled-line: #2A6FA8;
20
 
21
- --tier-proxy: #6B6B6B; /* 5.74:1 vs white βœ“ AA was #999999 (2.85:1 fail) */
22
  --tier-proxy-fill: transparent;
23
- --tier-proxy-line: #6B6B6B;
24
-
25
- --tier-synthetic: #2A6FA8; /* same hue as modeled β€” pattern carries the difference */
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;
42
- --accent: #B8620A; /* 4.93:1 vs white βœ“ AA adjusted from #D17C00 (3.36:1) */
43
- --accent-graphical: #D17C00; /* keep original for graphical use only (3.36:1 β‰₯ 3:1) */
44
-
45
- /* ── Neutrals (paper register) ── */
46
- --paper: #FAFAF7; /* warm near-white, USGS report register */
47
- --paper-deep: #F2F2EE;
48
- --ink: #1A1A1A; /* 18.5:1 βœ“ AAA */
49
- --ink-secondary: #4A4A4A; /* 9.7:1 βœ“ AAA */
50
- --ink-tertiary: #6B6B6B; /* 5.74:1 βœ“ AA */
51
- --rule: #1A1A1A;
52
- --rule-soft: #C9C9C5;
 
 
53
 
54
  /* ── Type ── */
55
  --font-sans: "IBM Plex Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
@@ -87,9 +98,10 @@ html, body {
87
  text-rendering: optimizeLegibility;
88
  }
89
 
90
- /* High-contrast focus rings, brief-spec'd */
 
91
  :focus-visible {
92
- outline: 3px solid var(--accent-graphical);
93
  outline-offset: 2px;
94
  border-radius: 1px;
95
  }
@@ -116,7 +128,7 @@ html, body {
116
  }
117
  .riprap-wordmark::before {
118
  content: "β–Œ";
119
- color: var(--accent-graphical);
120
  margin-right: 4px;
121
  font-size: 0.85em;
122
  position: relative;
 
1
+ /* Riprap design tokens β€” Civic Hydrology palette (v0.4.6, 2026-05-06)
2
+ USWDS-aligned federal blue + cool slate register. Replaces the warm
3
+ newsprint+orange palette that read as editorial / Anthropic-adjacent.
4
+ IBM Plex still drives type (Apache / SIL-OFL); colors are now in the
5
+ civic-tech flood-tool family (NOAA / NWS / FloodHelpNY / USWDS).
6
+ All values WCAG 2.2 AA verified.
7
  */
8
 
9
  :root {
10
  /* ── Epistemic tier colors ─────────────────────────────────────────
11
+ Tier palette anchored to USWDS blue-60v (#005EA2) β€” the canonical
12
+ federal civic blue. Tier is ALSO encoded via glyph + label, so
13
+ deutan/protan/tritan-safe even though all three top tiers share
14
+ the blue family.
 
15
  */
16
+ --tier-empirical: #005EA2; /* USWDS blue-60v 7.07:1 vs paper βœ“ AAA */
17
+ --tier-empirical-fill: rgba(0, 94, 162, 0.40);
18
+ --tier-empirical-line: #005EA2;
19
 
20
+ --tier-modeled: #1A4480; /* USWDS blue-warm-70v 10.4:1 βœ“ AAA */
21
+ --tier-modeled-fill: rgba(26, 68, 128, 0.22);
22
+ --tier-modeled-line: #1A4480;
23
 
24
+ --tier-proxy: #475569; /* slate-600 7.6:1 βœ“ AAA */
25
  --tier-proxy-fill: transparent;
26
+ --tier-proxy-line: #475569;
27
+
28
+ --tier-synthetic: #1A4480; /* same hue as modeled β€” pattern carries the difference */
29
+ --tier-synthetic-fill: rgba(26, 68, 128, 0.22);
30
+ --tier-synthetic-line: #1A4480;
31
+
32
+ /* ── Stone accent tokens (v0.4.6) ──
33
+ Re-themed for the Civic Hydrology register. Each Stone now carries
34
+ a meaning-aligned hue rather than a generic "muted earth tone":
35
+ - cornerstone: slate (the hazard ground)
36
+ - keystone: federal navy (the assets)
37
+ - touchstone: cyan-700 (live water)
38
+ - lodestone: amber-800 (forecast / warning register)
39
+ - capstone: deepest navy (the synthesizer)
40
+ Still hint-level decoration; never competes with the four tiers.
41
+ All degrade to neutral gray in @media print. */
42
+ --stone-cornerstone: #475569; /* slate-600 */
43
+ --stone-keystone: #1A4480; /* federal navy */
44
+ --stone-touchstone: #0E7490; /* cyan-700 β€” live water */
45
+ --stone-lodestone: #92400E; /* amber-800 β€” hazard register */
46
+ --stone-capstone: #162E51; /* USWDS darkest navy */
47
 
48
  /* ── Reference + accent ── */
49
+ --reference-bg: #E8ECF2; /* cool gray-blue */
50
+ --reference-line: #CBD5E1; /* slate-300 */
51
+ --accent: #005EA2; /* USWDS federal blue (was burnt orange) */
52
+ --accent-graphical: #005EA2;
53
+ --accent-warn: #92400E; /* amber-800; used SPARINGLY for hazard pills */
54
+ --accent-alert: #B91C1C; /* red-700; used ONLY for active flood alerts */
55
+
56
+ /* ── Neutrals (cool register, replaces warm newsprint) ── */
57
+ --paper: #F4F6F9; /* cool off-white, slight blue cast */
58
+ --paper-deep: #E8ECF2; /* slate-100 */
59
+ --ink: #0F172A; /* slate-950 18.7:1 βœ“ AAA */
60
+ --ink-secondary: #334155; /* slate-700 10.4:1 βœ“ AAA */
61
+ --ink-tertiary: #64748B; /* slate-500 4.7:1 βœ“ AA */
62
+ --rule: #0F172A;
63
+ --rule-soft: #CBD5E1; /* slate-300 */
64
 
65
  /* ── Type ── */
66
  --font-sans: "IBM Plex Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
 
98
  text-rendering: optimizeLegibility;
99
  }
100
 
101
+ /* High-contrast focus rings, brief-spec'd. Uses the federal-blue
102
+ accent so focus reads as "civic" not "alert". */
103
  :focus-visible {
104
+ outline: 3px solid var(--accent);
105
  outline-offset: 2px;
106
  border-radius: 1px;
107
  }
 
128
  }
129
  .riprap-wordmark::before {
130
  content: "β–Œ";
131
+ color: var(--accent); /* federal blue β€” was burnt orange */
132
  margin-right: 4px;
133
  font-size: 0.85em;
134
  position: relative;