Repository navigation
Expand file tree
/
Copy pathstyles.css
More file actions
404 lines (378 loc) · 25.2 KB
/
Copy pathstyles.css
File metadata and controls
404 lines (378 loc) · 25.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
:root{
--bg:#f7f6f2;
--card:#ffffff;
--ink:#26303b;
--muted:#6b7785;
--line:#e7e4dc;
--accent:#2f8f7e;
--accent-soft:#dcefe9;
--warm:#e8804b; /* current-state marker */
--warm-soft:#fbe3d6;
--blue:#3d6fb4; /* transmission / EIR */
--blue-soft:#dde7f3;
--clin:#7b5bd6; /* clinical incidence */
--clin-soft:#e7e0f7;
--danger:#d1495b; /* rebound / dip below baseline */
--danger-soft:#f6dbe0;
--shadow:0 1px 2px rgba(20,30,40,.05),0 8px 24px rgba(20,30,40,.06);
--radius:18px;
--maxw:760px;
}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
background:var(--bg);color:var(--ink);line-height:1.65;-webkit-font-smoothing:antialiased}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 22px}
.wrapwide{max-width:1080px;margin:0 auto;padding:0 22px}
header.hero{text-align:center;padding:56px 22px 24px}
.hero-logo{display:block;width:72px;height:72px;margin:0 auto 20px}
.kicker{text-transform:uppercase;letter-spacing:.14em;font-size:13px;font-weight:700;color:var(--accent);margin-bottom:14px}
h1{font-size:clamp(27px,4.6vw,40px);line-height:1.12;margin:0 0 16px;font-weight:800;letter-spacing:-.02em}
.lede{font-size:18px;color:var(--muted);max-width:620px;margin:0 auto}
section{margin:30px 0}
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
padding:28px 30px;box-shadow:var(--shadow);margin-bottom:24px}
h2{font-size:23px;margin:0 0 6px;font-weight:750;letter-spacing:-.01em;display:flex;align-items:center;gap:12px}
.num{flex:none;width:34px;height:34px;border-radius:50%;background:var(--accent-soft);color:var(--accent);
display:grid;place-items:center;font-size:16px;font-weight:800}
h2 + .sub{color:var(--muted);margin:2px 0 18px 46px;font-size:16px}
h3{font-size:15px;font-weight:750;margin:22px 0 4px;letter-spacing:.01em;text-transform:uppercase;
font-size:12.5px;letter-spacing:.08em;color:var(--accent)}
p{margin:13px 0}
.muted{color:var(--muted)}
.var{font-style:italic;font-family:Georgia,"Times New Roman",serif}
strong{font-weight:700}
canvas{width:100%;display:block}
.pill{display:inline-block;background:var(--accent-soft);color:var(--accent);
padding:1px 9px;border-radius:999px;font-size:13px;font-weight:700;white-space:nowrap}
.pill.warm{background:var(--warm-soft);color:#c45a25}
.pill.blue{background:var(--blue-soft);color:#345f9c}
/* work-in-progress status badge (landing hero): a soft-warm pill with a live dot */
.wip-badge{display:inline-flex;align-items:center;gap:7px;margin:14px auto 20px;
background:var(--warm-soft);color:#c45a25;border:1px solid #f3c9b3;
padding:5px 13px 5px 11px;border-radius:999px;font-size:13px;font-weight:700;
text-decoration:none;white-space:nowrap;transition:filter .15s}
.wip-badge:hover{filter:brightness(.97)}
.wip-badge .dot{width:8px;height:8px;border-radius:50%;background:var(--warm);flex:none;
box-shadow:0 0 0 0 rgba(232,128,75,.55);animation:wipPulse 2.4s ease-out infinite}
@keyframes wipPulse{0%{box-shadow:0 0 0 0 rgba(232,128,75,.5)}
70%{box-shadow:0 0 0 7px rgba(232,128,75,0)}100%{box-shadow:0 0 0 0 rgba(232,128,75,0)}}
@media (prefers-reduced-motion:reduce){.wip-badge .dot{animation:none}}
/* illustrative-only tag pinned to each explainer's interactive toy card */
.card.toy{position:relative}
.toy-tag{position:absolute;top:26px;right:28px;z-index:2;
display:inline-flex;align-items:center;gap:6px;
background:var(--warm-soft);color:#c45a25;border:1px solid #f3c9b3;
padding:3px 11px;border-radius:999px;font-size:11.5px;font-weight:700;
letter-spacing:.01em;white-space:nowrap}
.toy-tag::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--warm);flex:none}
.card.toy > h2{padding-right:240px}
@media(max-width:640px){
.toy-tag{position:static;margin:0 0 12px}
.card.toy > h2{padding-right:0}
}
.eqline{font-family:Georgia,"Times New Roman",serif;font-size:16px;background:#f4f2ec;border:1px solid var(--line);
border-radius:10px;padding:14px 16px;margin:16px 0;text-align:center}
.frac{display:inline-flex;flex-direction:column;align-items:center;vertical-align:middle;margin:0 5px}
.frac > span{display:block;padding:1px 10px}
.frac .den{border-top:2px solid var(--ink)}
sup{font-size:.7em}
/* ---- Ross–Macdonald formula (section 1) ---- */
.formula{background:linear-gradient(180deg,#fbfaf7,#f4f2ec);border:1px solid var(--line);border-radius:14px;
padding:26px 20px;text-align:center;margin:18px 0 8px;font-size:22px}
.eq{display:inline-flex;align-items:center;gap:8px;font-family:Georgia,"Times New Roman",serif}
.r0{display:inline-block;position:relative}
.r0 sub{font-size:.6em;font-style:normal;line-height:0;position:relative;bottom:-.28em;margin-left:1px;
font-family:-apple-system,"Segoe UI",Roboto,Arial,sans-serif}
.legend{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px 24px;margin-top:20px;
list-style:none;padding:0;font-size:15px}
.legend li{display:flex;gap:10px}
.legend .sym{font-family:Georgia,serif;font-style:italic;font-weight:700;color:var(--accent);min-width:24px}
.highlight-term{color:var(--warm);font-weight:700}
.hl-bite{color:var(--warm);font-weight:700}
.caption{font-size:13.5px;color:var(--muted);margin-top:14px}
.chartbox{float:right;width:330px;max-width:46%;margin:2px 0 10px 22px}
.chartbox .caption{margin-top:6px;font-size:12px}
@media(max-width:560px){.chartbox{float:none;width:100%;max-width:none;margin:10px 0}}
/* concept 2: text and the decay chart as two balanced columns, so a short body
doesn't leave a tall gap beside the floated chart. Stacks below 760px, where a
two-column split would leave the text column too narrow to read comfortably. */
.c2cols{display:grid;grid-template-columns:1fr 300px;gap:26px;align-items:center}
.c2cols .chartbox{float:none;width:auto;max-width:none;margin:0}
@media(max-width:760px){
.c2cols{grid-template-columns:1fr;gap:4px}
.c2cols .chartbox{max-width:420px;margin-top:8px}
}
/* ---- controls ---- */
.controls{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:4px}
@media(max-width:620px){.controls{grid-template-columns:1fr}}
.slider-block{border-radius:14px;padding:16px 20px}
.slider-block.eir{background:var(--blue-soft)}
.slider-block.cov{background:var(--accent-soft)}
.slider-top{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:8px}
.slider-top .label{font-weight:700;font-size:15px}
.slider-top .val{font-size:26px;font-weight:800}
.slider-block.eir .val{color:var(--blue)}
.slider-block.cov .val{color:var(--accent)}
.slider-sub{font-size:12.5px;margin-top:6px}
input[type=range]{-webkit-appearance:none;appearance:none;width:100%;height:8px;border-radius:999px;outline:none;margin:4px 0}
input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:24px;height:24px;border-radius:50%;
background:#fff;cursor:pointer;box-shadow:0 2px 6px rgba(0,0,0,.18)}
input[type=range]::-moz-range-thumb{width:20px;height:20px;border-radius:50%;background:#fff;cursor:pointer}
input[type=range]:focus-visible{outline:2px solid var(--ink);outline-offset:4px}
#eir0{background:linear-gradient(90deg,var(--blue) 0%,var(--blue) var(--fill,0%),#c7d6ec var(--fill,0%),#c7d6ec 100%)}
#eir0::-webkit-slider-thumb{border:3px solid var(--blue)} #eir0::-moz-range-thumb{border:3px solid var(--blue)}
#use{background:linear-gradient(90deg,var(--accent) 0%,var(--accent) var(--fill,0%),#c7e0d8 var(--fill,0%),#c7e0d8 100%)}
#use::-webkit-slider-thumb{border:3px solid var(--accent)} #use::-moz-range-thumb{border:3px solid var(--accent)}
.readouts{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin:18px 0 4px}
.readout{background:var(--bg);border:1px solid var(--line);border-radius:12px;padding:12px 14px;text-align:center}
.readout .v{font-size:23px;font-weight:800;line-height:1.1}
.readout .l{font-size:12px;color:var(--muted);margin-top:3px}
.plots{display:grid;grid-template-columns:repeat(3,1fr);gap:16px 18px;margin-top:14px;align-items:start}
@media(max-width:860px){.plots{grid-template-columns:repeat(2,1fr);gap:22px}}
@media(max-width:520px){.plots{grid-template-columns:1fr}}
/* the coverage-cascade row has only two plots; centre it under the three-wide general row */
.plots.plots2{grid-template-columns:repeat(2,minmax(0,1fr));max-width:66%;margin-inline:auto}
@media(max-width:860px){.plots.plots2{max-width:none}}
@media(max-width:520px){.plots.plots2{grid-template-columns:1fr}}
/* heading above each plot group */
.panel-group-h{font-size:14px;font-weight:750;margin:24px 0 0}
.panel-group-h .muted{font-weight:400}
.panel{min-width:0}
.panel-h{font-size:14px;font-weight:750;margin:0 0 4px;display:flex;align-items:center;gap:8px}
.panel-h .step{flex:none;width:22px;height:22px;border-radius:50%;display:grid;place-items:center;
font-size:12px;font-weight:800;color:#fff}
.pcap{font-size:12px;color:var(--muted);margin:8px 0 0;line-height:1.5}
.note{font-size:13.5px;color:var(--muted);border-left:3px solid var(--line);padding:6px 0 6px 14px;margin:18px 0;line-height:1.6}
.note p{margin:8px 0}
.note ul{margin:8px 0;padding-left:18px}
.note ol.refs{margin:8px 0 0;padding-left:22px}
.note ol.refs li{margin:0 0 7px}
.note li{margin:6px 0}
.note strong{color:var(--ink)}
footer{text-align:center;padding:24px 22px 60px;color:var(--muted);font-size:13.5px}
a{color:var(--accent)}
sup.cite{line-height:0}
sup.cite a{text-decoration:none;font-weight:700;padding:0 1px}
/* ============================================================
Hub landing page (index.html)
============================================================ */
.lessons{display:grid;grid-template-columns:repeat(2,1fr);gap:20px;margin-top:8px}
@media(max-width:720px){.lessons{grid-template-columns:1fr}}
a.lesson-card{display:flex;flex-direction:column;text-decoration:none;color:inherit;
background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
padding:24px 26px;box-shadow:var(--shadow);transition:transform .12s ease,box-shadow .12s ease}
a.lesson-card:hover{transform:translateY(-3px);box-shadow:0 2px 4px rgba(20,30,40,.06),0 14px 34px rgba(20,30,40,.10)}
.lesson-card .lc-num{width:34px;height:34px;border-radius:50%;background:var(--accent-soft);color:var(--accent);
display:grid;place-items:center;font-size:16px;font-weight:800;margin-bottom:14px}
.lesson-card h2{font-size:20px;display:block;margin:0 0 8px}
.lesson-card p{font-size:14.5px;color:var(--muted);margin:0 0 16px}
.lesson-card .go{margin-top:auto;font-weight:700;color:var(--accent);font-size:14px}
.lesson-card.soon{opacity:.7;cursor:default;box-shadow:none;border-style:dashed}
.lesson-card.soon:hover{transform:none;box-shadow:none}
.lesson-card.soon .lc-num{background:var(--line);color:var(--muted)}
.lesson-card.warm .lc-num{background:var(--warm-soft);color:#c45a25}
.lesson-card.warm .go{color:var(--warm)}
.lesson-card.blue .lc-num{background:var(--blue-soft);color:var(--blue)}
.lesson-card.blue .go{color:var(--blue)}
.lesson-card.clin .lc-num{background:var(--clin-soft);color:var(--clin)}
.lesson-card.clin .go{color:var(--clin)}
.crumb{max-width:1080px;margin:0 auto;padding:18px 22px 0}
.crumb a{font-weight:700;font-size:14px;text-decoration:none}
.lessons-h{font-size:18px;margin:6px 0 12px;color:var(--ink)}
/* Feynman-technique flow schematic */
.feynman{display:flex;align-items:stretch;gap:10px;margin-top:18px}
.fstep{flex:1 1 0;min-width:0;display:flex;gap:11px;align-items:flex-start;
background:var(--bg);border:1px solid var(--line);border-radius:12px;padding:12px 14px}
.fstep b{display:block;font-size:14px;line-height:1.25}
.fstep div span{display:block;font-size:12px;color:var(--muted);margin-top:2px;line-height:1.35}
.fstep .fnum{flex:none;width:25px;height:25px;border-radius:50%;display:grid;place-items:center;
line-height:1;font-weight:800;font-size:13px;color:#fff;margin-top:1px}
.farrow{flex:none;display:flex;align-items:center;color:var(--muted);font-size:20px;font-weight:700}
@media(max-width:760px){
.feynman{flex-direction:column;align-items:stretch}
.fstep{flex:0 0 auto}
.farrow{transform:rotate(90deg);align-self:center;margin:-2px 0}
}
/* ============================================================
Rebounds lesson (rebounds.html)
============================================================ */
/* triangle diagram */
.triangle-wrap{margin:14px 0 4px}
.triangle-wrap svg{width:100%;height:auto;display:block;max-width:680px;margin:0 auto}
.tri-corner{cursor:pointer;outline:none}
.tri-corner text{font-family:-apple-system,"Segoe UI",Roboto,Arial,sans-serif}
.tri-corner:hover .tri-lab,.tri-corner:focus-visible .tri-lab{text-decoration:underline}
.tri-lab{font-size:18px;font-weight:800}
.tri-sub{font-size:13.5px;font-weight:500;fill:var(--muted)}
/* clean fact list for the driver mechanisms */
.facts{margin:12px 0;padding-left:20px}
.facts li{margin:8px 0;line-height:1.6}
.facts li b{color:var(--ink)}
/* three-column control grid (collapses on tablet/phone) */
.controls.controls3{grid-template-columns:1fr 1fr 1fr;align-items:start}
@media(max-width:760px){.controls.controls3{grid-template-columns:1fr}}
/* rebound slider colours */
.slider-block.base{background:var(--blue-soft)}
.slider-block.ctrl{background:var(--accent-soft)}
.slider-block.loss{background:var(--warm-soft)}
.slider-block.base .val{color:var(--blue)}
.slider-block.ctrl .val{color:var(--accent)}
.slider-block.loss .val{color:#c45a25}
.subslider{margin-top:14px}
.subslider .slider-top .val{font-size:20px}
#trans{background:linear-gradient(90deg,var(--blue) 0%,var(--blue) var(--fill,0%),#c7d6ec var(--fill,0%),#c7d6ec 100%)}
#trans::-webkit-slider-thumb{border:3px solid var(--blue)} #trans::-moz-range-thumb{border:3px solid var(--blue)}
#strength,#duration{background:linear-gradient(90deg,var(--accent) 0%,var(--accent) var(--fill,0%),#c7e0d8 var(--fill,0%),#c7e0d8 100%)}
#strength::-webkit-slider-thumb,#duration::-webkit-slider-thumb{border:3px solid var(--accent)}
#strength::-moz-range-thumb,#duration::-moz-range-thumb{border:3px solid var(--accent)}
#loss{background:linear-gradient(90deg,var(--warm) 0%,var(--warm) var(--fill,0%),#f4cdb6 var(--fill,0%),#f4cdb6 100%)}
#loss::-webkit-slider-thumb{border:3px solid var(--warm)} #loss::-moz-range-thumb{border:3px solid var(--warm)}
/* rebound indicator box */
.rebound-indicator{display:flex;align-items:center;gap:14px;margin:18px 0 4px;
border:1px solid var(--line);border-radius:14px;padding:16px 20px;background:var(--bg);
transition:background .15s ease,border-color .15s ease}
@media(max-width:520px){.rebound-indicator{flex-direction:column;align-items:flex-start;gap:8px}}
.rebound-indicator.lvl-none{background:var(--accent-soft);border-color:#bfe0d8}
.rebound-indicator.lvl-mild{background:var(--warm-soft);border-color:#f1c4a8}
.rebound-indicator.lvl-strong{background:var(--danger-soft);border-color:#e9b6bf}
.rebound-indicator .rb-msg{font-size:15px;font-weight:600}
.rebound-indicator.lvl-none .rb-msg{color:var(--accent)}
.rebound-indicator.lvl-mild .rb-msg{color:#c45a25}
.rebound-indicator.lvl-strong .rb-msg{color:var(--danger)}
.rebound-chip{display:inline-block;font-size:14px;font-weight:800;padding:6px 16px;border-radius:999px;white-space:nowrap;flex:none}
.chip-none{background:#fff;color:var(--accent)}
.chip-mild{background:#fff;color:#c45a25}
.chip-strong{background:#fff;color:var(--danger)}
/* chart panel labels */
.chart-label{font-size:13px;font-weight:750;color:var(--ink);margin:20px 0 4px}
.chart-label .muted{font-weight:500}
/* side-by-side chart panels */
.chart-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px 26px;align-items:start;margin-top:6px}
@media(max-width:760px){.chart-grid{grid-template-columns:1fr}}
.chart-grid .chart-label{margin-top:6px}
/* legend swatches */
.rb-legend{display:flex;flex-wrap:wrap;gap:6px 18px;font-size:13px;margin:14px 0 0}
.rb-legend span{display:inline-flex;align-items:center;gap:7px}
.rb-legend i{width:14px;height:14px;border-radius:4px;display:inline-block}
/* ============================================================
Seasonality lesson (seasonality.html)
============================================================ */
/* three control blocks: season (blue), SMC schedule (accent), coverage (warm) */
.slider-block.season{background:var(--blue-soft)}
.slider-block.smc{background:var(--accent-soft)}
.slider-block.cover{background:var(--warm-soft)}
.slider-block.season .val{color:var(--blue)}
.slider-block.smc .val{color:var(--accent)}
.slider-block.cover .val{color:#c45a25}
/* this value is a word rather than a number ("highly seasonal" on seasonality.html, and
"high, 47%" on nmf.html): keep it at a size that sits with the label rather than dwarfing
it. The row is allowed to wrap so a longer value cannot force horizontal page scroll on a
narrow viewport; the value itself still never breaks mid-phrase. */
.slider-block.season > .slider-top{flex-wrap:wrap}
.slider-block.season > .slider-top .val{font-size:16px;white-space:nowrap}
#seasonality,#peakday{background:linear-gradient(90deg,var(--blue) 0%,var(--blue) var(--fill,0%),#c7d6ec var(--fill,0%),#c7d6ec 100%)}
#seasonality::-webkit-slider-thumb,#peakday::-webkit-slider-thumb{border:3px solid var(--blue)}
#seasonality::-moz-range-thumb,#peakday::-moz-range-thumb{border:3px solid var(--blue)}
#nrounds,#spacing,#firstround{background:linear-gradient(90deg,var(--accent) 0%,var(--accent) var(--fill,0%),#c7e0d8 var(--fill,0%),#c7e0d8 100%)}
#nrounds::-webkit-slider-thumb,#spacing::-webkit-slider-thumb,#firstround::-webkit-slider-thumb{border:3px solid var(--accent)}
#nrounds::-moz-range-thumb,#spacing::-moz-range-thumb,#firstround::-moz-range-thumb{border:3px solid var(--accent)}
#coverage{background:linear-gradient(90deg,var(--warm) 0%,var(--warm) var(--fill,0%),#f4cdb6 var(--fill,0%),#f4cdb6 100%)}
#coverage::-webkit-slider-thumb{border:3px solid var(--warm)} #coverage::-moz-range-thumb{border:3px solid var(--warm)}
/* segmented "who is reached" toggle */
/* visually hidden, still announced by screen readers (used for debounced readout updates) */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.seg-label{font-size:15px;font-weight:700;margin:16px 0 6px;color:var(--ink)}
.seg{display:flex;gap:4px;background:rgba(255,255,255,.7);border:1px solid #f0c9b3;
border-radius:10px;padding:4px}
.seg-btn{flex:1 1 0;min-width:0;border:none;background:transparent;cursor:pointer;
font-family:inherit;font-size:12.5px;font-weight:700;color:var(--muted);
padding:8px 6px;border-radius:7px;line-height:1.2;transition:background .12s ease,color .12s ease}
.seg-btn:hover{background:rgba(255,255,255,.6);color:#c45a25}
.seg-btn.active{background:#fff;color:#c45a25;box-shadow:0 1px 3px rgba(20,30,40,.14)}
.seg-btn:focus-visible{outline:2px solid var(--warm);outline-offset:2px}
/* "optimise timing" button: searches start-day + spacing for maximum cases averted */
.opt-btn{margin-top:14px;width:100%;border:none;cursor:pointer;font-family:inherit;
font-size:13px;font-weight:700;color:#fff;background:var(--accent);
padding:10px 12px;border-radius:9px;line-height:1.2;
transition:filter .12s ease,opacity .12s ease}
.opt-btn:hover{filter:brightness(.93)}
.opt-btn:disabled{opacity:.6;cursor:default}
.opt-btn:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
/* pulse the "cases averted" readout when the search settles */
@keyframes readoutFlash{0%{transform:scale(1)}40%{transform:scale(1.12)}100%{transform:scale(1)}}
.readout.flash{animation:readoutFlash .5s ease}
/* ============================================================
Age-distribution explainer (age-distribution.html)
============================================================ */
/* single transmission-intensity slider (blue). A distinct class from .eir so the word-value
sizing here does not affect the numeric .eir slider on the nonlinearities page. */
.slider-block.intensity{background:var(--blue-soft)}
.slider-block.intensity .val{color:var(--blue);font-size:16px;white-space:nowrap}
#intensity{background:linear-gradient(90deg,var(--blue) 0%,var(--blue) var(--fill,0%),#c7d6ec var(--fill,0%),#c7d6ec 100%)}
#intensity::-webkit-slider-thumb{border:3px solid var(--blue)} #intensity::-moz-range-thumb{border:3px solid var(--blue)}
/* ============================================================
Non-malaria fevers explainer (nmf.html)
============================================================ */
/* reuses the .season (blue) and .cover (warm) slider blocks. #seasonality is
already themed blue in the seasonality block above; add the transmission
intensity (blue) and the fever rate + treatment seeking (warm) ids. */
#transmission{background:linear-gradient(90deg,var(--blue) 0%,var(--blue) var(--fill,0%),#c7d6ec var(--fill,0%),#c7d6ec 100%)}
#transmission::-webkit-slider-thumb{border:3px solid var(--blue)} #transmission::-moz-range-thumb{border:3px solid var(--blue)}
#nmf,#treat{background:linear-gradient(90deg,var(--warm) 0%,var(--warm) var(--fill,0%),#f4cdb6 var(--fill,0%),#f4cdb6 100%)}
#nmf::-webkit-slider-thumb,#treat::-webkit-slider-thumb{border:3px solid var(--warm)}
#nmf::-moz-range-thumb,#treat::-moz-range-thumb{border:3px solid var(--warm)}
/* the Seasonality sub-slider carries a word value ("highly seasonal"); keep it at the primary
value size (16px) so the sub-control does not visually dominate its parent Transmission value.
Scoped to .val-word so seasonality.html's own sub-sliders are untouched. */
.subslider .slider-top .val.val-word{font-size:16px;white-space:nowrap}
/* the three readout tiles are full sentences: keep them wide enough that the leading line stays on
one row (so the big values share a baseline) until the grid collapses to a single column */
.readouts.ro-sentences{grid-template-columns:repeat(auto-fit,minmax(210px,1fr))}
/* U5 / 5-15 / 15+ case-share bar (second visualisation) */
.agebar{display:flex;height:46px;border-radius:12px;overflow:hidden;border:1px solid var(--line);margin:6px 0 0}
.agebar .seg{display:flex;align-items:center;justify-content:center;color:#fff;font-weight:800;font-size:14px;
min-width:0;overflow:hidden;white-space:nowrap;transition:width .18s ease;
text-shadow:0 1px 2px rgba(0,0,0,.35)} /* lift the white % labels clear of WCAG AA on the mid-tone bands */
.agebar .seg + .seg{border-left:1px solid #fff} /* crisp divider between adjacent bands */
.agebar .seg.u5{background:#c45a25} /* darker warm: clears white-text contrast, matches the U5 readout */
.agebar .seg.mid{background:var(--accent)}
.agebar .seg.ad{background:var(--blue)}
/* ============================================================
Attribution lesson (attribution.html)
============================================================ */
/* one themed control block: transmission (blue). The value is a word ("moderate"),
so keep it at label size like the age-distribution slider. */
.slider-block.a-base{background:var(--blue-soft)}
.slider-block.a-base .val{color:var(--blue);font-size:16px;white-space:nowrap}
#base{background:linear-gradient(90deg,var(--blue) 0%,var(--blue) var(--fill,0%),#c7d6ec var(--fill,0%),#c7d6ec 100%)}
#base::-webkit-slider-thumb{border:3px solid var(--blue)} #base::-moz-range-thumb{border:3px solid var(--blue)}
/* control panel: interactive controls (slider + drag chips) on the left, the intervention-info
table on the right, so both halves of the width are used and the table no longer hugs the left */
.toy-grid{display:grid;grid-template-columns:1fr 1fr;gap:24px;align-items:start;margin-bottom:8px}
.toy-grid > *{min-width:0} /* let the table wrapper scroll rather than force overflow */
.toy-controls{display:flex;flex-direction:column;gap:14px}
.order-panel{padding:0 20px} /* align the order label/chips with the slider block's inset */
.order-panel .seg-label{margin-top:0}
.toy-info .caption{margin-top:10px}
/* stacked (narrow): single column, and drop the order-panel inset so the three chips stay on one row.
Placed after the base rules so this override wins (media queries add no specificity). */
@media(max-width:760px){.toy-grid{grid-template-columns:1fr} .order-panel{padding:0}}
/* intervention-info table: what each control does (ticks / crosses) and its cost; fills its column */
.itable-wrap{overflow-x:auto}
.itable{border-collapse:collapse;font-size:14px;width:100%}
.itable th,.itable td{border:1px solid var(--line);padding:7px 12px;text-align:center}
.itable thead th{font-weight:700;font-size:12px;letter-spacing:.02em;color:var(--muted);background:var(--bg)}
.itable tbody th{font-weight:800;font-size:15px}
.itable .tick{color:var(--accent);font-weight:800}
.itable .cross{color:var(--muted);font-weight:700}
/* draggable order chips: reorder A / B / C to change the deployment order (pointer + keyboard) */
.order-chips{display:flex;gap:8px;flex-wrap:wrap;user-select:none;margin-bottom:4px}
.chip{display:flex;align-items:center;gap:7px;min-width:76px;justify-content:center;
padding:11px 14px;border:1px solid var(--line);border-radius:12px;background:var(--card);
box-shadow:0 1px 2px rgba(20,30,40,.06);cursor:grab;touch-action:none;
transition:box-shadow .12s ease,transform .12s ease}
.chip:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
.chip.dragging{cursor:grabbing;box-shadow:0 8px 22px rgba(20,30,40,.20);transform:scale(1.04)}
.chip-grip{color:var(--muted);font-size:13px;letter-spacing:-2px}
.chip-letter{font-size:20px;font-weight:800}