diagcalc 3.2.4 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/styles.css CHANGED
@@ -1,67 +1,118 @@
1
1
  :root {
2
- font-family: "JetBrains Mono", monospace;
2
+ /* Neutral clinical palette. Legacy slot names also serve canvas renderers. */
3
+ --log-50: #FAFBFC;
4
+ --log-100: #F0F2F4;
5
+ --log-150: #E5E8EB;
6
+ --log-200: #CDD3D9;
7
+ --log-300: #AAB5BF;
8
+ --log-400: #8A98A5;
9
+ --log-500: #657586;
10
+ --log-600: #4F6174;
11
+ --log-700: #303D49;
12
+ --log-800: #263746;
13
+ --log-900: #1B252F;
14
+ --log-950: #121A22;
15
+
16
+ /* Semantic chart accents, kept distinct from the neutral reading surfaces. */
17
+ --crew-ahab: #A23D39; /* bacca red — error / rule-out failed */
18
+ --crew-starbuck: #245B83; /* dies blue — info / focus ring / pre-test marker */
19
+ --crew-queequeg: #245B83; /* accent blue — primary action */
20
+ --crew-pip: #845C18; /* copper — warning / threshold bands (AA text 5.0:1) */
21
+ --crew-ishmael: #55646D; /* cinis gray — muted / axis */
22
+ --crew-stubb: #B97435; /* copper — LR+ trace (mark, not text) */
23
+ --crew-tashtego: #356B45; /* folium green — LR− / success (AA text 5.0:1) */
24
+ --crew-daggoo: #8F4F16; /* deep copper — sequential second-stage */
25
+
26
+ /* Semantic tokens. */
27
+ --bg: var(--log-50);
28
+ --surface: var(--log-100);
29
+ --surface-soft: var(--bg);
30
+ --button-ink: var(--log-50);
31
+ --border: var(--log-200);
32
+ --text: var(--log-800);
33
+ --text-strong: var(--log-900);
34
+ --text-muted: var(--crew-ishmael);
35
+ --primary: var(--crew-queequeg);
36
+ --primary-strong: var(--log-800);
37
+ --secondary: var(--crew-starbuck);
38
+ --success: var(--crew-tashtego);
39
+ --warning: var(--crew-pip);
40
+ --error: var(--crew-ahab);
41
+ --accent-warm: var(--crew-stubb);
42
+ --axis: var(--log-400);
43
+
44
+ /* Spacing scale — 4-pt grid. Use in padding/margin/gap to keep rhythm. */
45
+ --space-1: 0.25rem; /* 4px */
46
+ --space-2: 0.5rem; /* 8px */
47
+ --space-3: 0.75rem; /* 12px */
48
+ --space-4: 1rem; /* 16px */
49
+ --space-5: 1.5rem; /* 24px */
50
+ --space-6: 2rem; /* 32px */
51
+ --space-7: 3rem; /* 48px */
52
+ --space-8: 4rem; /* 64px */
53
+
54
+ /* Type scale — clamp-friendly steps. */
55
+ --text-xs: 0.75rem;
56
+ --text-sm: 0.875rem;
57
+ --text-base: 1rem;
58
+ --text-lg: 1.125rem;
59
+ --text-xl: 1.375rem;
60
+ --text-2xl: 1.875rem;
61
+ --text-3xl: 2.25rem;
62
+
63
+ /* Corner radii. */
64
+ --radius-1: 4px;
65
+ --radius-2: 6px;
66
+ --radius-3: 8px;
67
+ --radius-pill: 999px;
68
+
69
+ /* Motion */
70
+ --duration-fast: 120ms;
71
+ --duration-base: 200ms;
72
+ --duration-slow: 320ms;
73
+ --ease-out: cubic-bezier(0.22, 0.61, 0.36, 1);
74
+
75
+
76
+ font-family: system-ui, -apple-system, "Segoe UI", Helvetica, Arial, sans-serif;
3
77
  font-feature-settings: normal;
4
- /* Flexoki Color Scheme */
5
- --base-100: #FFFCF0;
6
- --base-200: #F2F0E5;
7
- --base-300: #E6E4D9;
8
- --base-400: #DAD8CE;
9
- --base-500: #CECDC3;
10
- --base-600: #B7B5AC;
11
- --base-700: #878580;
12
- --base-800: #575653;
13
- --base-900: #403E3C;
14
- --base-950: #282726;
15
- --base-1000: #100F0F;
16
-
17
- --red: #AF3029;
18
- --orange: #BC5215;
19
- --yellow: #AD8301;
20
- --green: #66800B;
21
- --cyan: #24837B;
22
- --blue: #205EA6;
23
- --purple: #5E409D;
24
- --magenta: #A02F6F;
25
-
26
- /* Semantic colors */
27
- --primary-color: var(--blue);
28
- --primary-dark: #1a4a7f;
29
- --secondary-color: var(--cyan);
30
- --background-color: var(--base-100);
31
- --surface-color: var(--base-200);
32
- --border-color: var(--base-400);
33
- --text-color: var(--base-1000);
34
- --muted-text: var(--base-800);
35
- --success-color: var(--green);
36
- --accent-warm: var(--orange);
37
- --page-accent-cool: rgba(32, 94, 166, 0.08);
38
- --page-accent-warm: rgba(188, 82, 21, 0.05);
39
- --intro-gradient-end: rgba(230, 228, 217, 0.4);
40
- --panel-bg: rgba(242, 240, 229, 0.8);
41
- --panel-soft-bg: rgba(255, 252, 240, 0.82);
42
- --highlight-bg: rgba(255, 252, 240, 0.66);
43
- --matrix-bg: rgba(255, 252, 240, 0.9);
44
- --heading-strong: var(--base-900);
45
- --reference-bg: var(--base-300);
46
- --reference-text: var(--base-800);
47
- --reference-muted: var(--base-700);
48
78
  }
49
79
 
50
80
  body {
51
- font-family: "JetBrains Mono", monospace;
52
- background-color: var(--background-color);
53
- background-image: radial-gradient(circle at top left, var(--page-accent-cool), transparent 30%), linear-gradient(180deg, var(--page-accent-warm), transparent 22%);
54
- color: var(--text-color);
81
+ font-family: system-ui, -apple-system, "Segoe UI", Helvetica, Arial, sans-serif;
82
+ background-color: var(--bg);
83
+ color: var(--text);
55
84
  margin: 0;
56
85
  padding: 0;
57
86
  line-height: 1.6;
58
- transition: background-color 0.3s ease, color 0.3s ease;
87
+ transition: none;
59
88
  }
60
89
 
61
90
  .container {
62
91
  width: min(1380px, 94vw);
63
92
  margin: 0 auto;
64
- padding: 2.5rem 0;
93
+ padding: var(--space-5) 0 var(--space-6);
94
+ }
95
+
96
+ /* ── Unified keyboard focus ring ───────────────────────────────────────────
97
+ One rule for every interactive element. :focus-visible means the ring only
98
+ shows on keyboard navigation, never on mouse click — so the visual is
99
+ intentional, not noisy. Starbuck cyan, 2 px offset. */
100
+ :is(
101
+ button,
102
+ [type="text"],
103
+ [type="number"],
104
+ [type="date"],
105
+ [type="email"],
106
+ select,
107
+ summary,
108
+ a,
109
+ input[type="range"],
110
+ input[type="checkbox"],
111
+ [tabindex]
112
+ ):focus-visible {
113
+ outline: 2px solid var(--secondary);
114
+ outline-offset: 2px;
115
+ border-radius: 4px;
65
116
  }
66
117
 
67
118
  footer {
@@ -70,113 +121,221 @@ footer {
70
121
  padding: 1.5em;
71
122
  margin-top: 3em;
72
123
  background-color: transparent;
73
- border-top: 1px solid var(--border-color);
74
- color: var(--muted-text);
124
+ border-top: 1px solid var(--border);
125
+ color: var(--text-muted);
75
126
  }
76
127
 
77
- .intro {
78
- background: linear-gradient(180deg, var(--surface-color), var(--intro-gradient-end));
79
- border-bottom: 2px solid var(--base-300);
128
+ footer .privacy-note {
129
+ display: inline-block;
130
+ margin: 0.5rem auto;
131
+ padding: 0.45rem 0.9rem;
132
+ border-radius: 4px;
133
+ background-color: var(--surface-soft);
134
+ border: 1px solid var(--border);
135
+ color: var(--text);
136
+ font-size: 0.85rem;
137
+ font-weight: 500;
80
138
  }
81
139
 
82
- .intro .container {
83
- padding: 3.5rem 0 2.5rem;
84
- position: relative;
140
+ /* ── App bar (v4.0) ─────────────────────────────────────────────────────── */
141
+ .app-bar {
142
+ position: sticky;
143
+ top: 0;
144
+ z-index: 100;
145
+ background: var(--surface);
146
+ border-bottom: 1px solid var(--border);
85
147
  }
86
148
 
87
- .header-controls {
88
- position: absolute;
89
- top: 1rem;
90
- right: 0;
149
+ .app-bar-inner {
150
+ width: min(1380px, 94vw);
151
+ margin: 0 auto;
91
152
  display: flex;
92
- gap: 0.5rem;
153
+ align-items: center;
154
+ justify-content: space-between;
155
+ gap: var(--space-4);
156
+ padding: var(--space-3) 0;
157
+ min-height: 3rem;
158
+ }
159
+
160
+ .app-bar-brand {
161
+ display: flex;
162
+ align-items: baseline;
163
+ gap: var(--space-3);
164
+ min-width: 0;
165
+ }
166
+
167
+ .brand-mark {
168
+ font-weight: 800;
169
+ font-size: var(--text-lg);
170
+ letter-spacing: 0.02em;
171
+ color: var(--text-strong);
172
+ }
173
+
174
+ .app-bar-version {
175
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
176
+ font-size: var(--text-xs);
177
+ font-variant-numeric: tabular-nums;
178
+ color: var(--text-muted);
179
+ letter-spacing: 0.02em;
180
+ align-self: center;
181
+ }
182
+
183
+ .app-bar-divider {
184
+ color: var(--text-muted);
185
+ font-weight: 600;
186
+ }
187
+
188
+ .app-bar-case {
189
+ font-size: var(--text-sm);
190
+ color: var(--text-muted);
191
+ white-space: nowrap;
192
+ overflow: hidden;
193
+ text-overflow: ellipsis;
194
+ }
195
+
196
+ .app-bar-case.has-case {
197
+ color: var(--text);
198
+ font-weight: 600;
199
+ }
200
+
201
+ .app-bar-controls {
202
+ display: flex;
203
+ align-items: center;
204
+ gap: var(--space-2);
205
+ flex-shrink: 0;
93
206
  }
94
207
 
95
208
  .theme-toggle {
96
209
  width: auto;
97
- padding: 0.5rem 1rem;
98
- background: var(--base-300);
99
- color: var(--text-color);
100
- border: 2px solid var(--border-color);
101
- border-radius: 4px;
210
+ padding: var(--space-2) var(--space-3);
211
+ background: transparent;
212
+ color: var(--text);
213
+ border: 1px solid var(--border);
214
+ border-radius: var(--radius-1);
102
215
  cursor: pointer;
103
- font-size: 1.2rem;
104
- transition: background-color 0.2s;
216
+ font-size: var(--text-base);
217
+ line-height: 1;
218
+ transition: background-color var(--duration-fast) var(--ease-out);
105
219
  }
106
220
 
107
221
  .theme-toggle:hover {
108
- background-color: var(--base-400);
222
+ background-color: var(--surface-soft);
109
223
  }
110
224
 
111
- h1 {
112
- font-size: clamp(2rem, 5vw, 2.8rem);
113
- margin: 0.25rem 0 0.75rem;
114
- text-align: center;
225
+ .lang-picker {
226
+ display: inline-flex;
227
+ align-items: center;
115
228
  }
116
229
 
117
- h2 {
118
- font-size: clamp(1.4rem, 2.5vw, 1.75rem);
119
- margin-bottom: 1rem;
120
- color: var(--text-color);
230
+ .lang-picker select {
231
+ padding: var(--space-2) var(--space-3);
232
+ font-size: var(--text-sm);
233
+ width: auto;
234
+ border-radius: var(--radius-1);
235
+ border: 1px solid var(--border);
236
+ background-color: transparent;
237
+ color: var(--text);
238
+ cursor: pointer;
121
239
  }
122
240
 
123
- .tag {
124
- display: inline-block;
125
- padding: 0.35rem 0.75rem;
126
- border-radius: 4px;
127
- text-transform: uppercase;
128
- letter-spacing: 0.08em;
129
- font-size: 0.7rem;
130
- background-color: var(--base-300);
131
- color: var(--base-800);
132
- margin: 0 auto;
241
+ .visually-hidden {
242
+ position: absolute;
243
+ width: 1px;
244
+ height: 1px;
245
+ padding: 0;
246
+ margin: -1px;
247
+ overflow: hidden;
248
+ clip: rect(0, 0, 0, 0);
249
+ white-space: nowrap;
250
+ border: 0;
133
251
  }
134
252
 
135
- .lead {
136
- font-size: 1.1rem;
137
- text-align: center;
138
- max-width: 720px;
139
- margin: 0 auto 2.5rem;
140
- color: var(--muted-text);
253
+ h1 {
254
+ font-size: var(--text-2xl);
255
+ margin: 0 0 var(--space-3);
256
+ font-weight: 700;
257
+ letter-spacing: -0.01em;
141
258
  }
142
259
 
143
- .intro-highlights {
260
+ h2 {
261
+ font-size: var(--text-xl);
262
+ margin-bottom: var(--space-4);
263
+ color: var(--text-strong);
264
+ font-weight: 700;
265
+ letter-spacing: -0.01em;
266
+ }
267
+
268
+ /* ── About panel (formerly intro highlights) ───────────────────────────── */
269
+ .about-panel .about-grid {
144
270
  display: grid;
145
- grid-template-columns: repeat(3, minmax(0, 1fr));
146
- gap: 1rem;
271
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
272
+ gap: var(--space-4);
147
273
  }
148
274
 
149
- .highlight {
150
- background-color: var(--highlight-bg);
151
- border: 2px solid var(--border-color);
152
- border-radius: 8px;
153
- padding: 1.25rem;
154
- box-shadow: none;
275
+ .about-card {
276
+ background-color: var(--surface-soft);
277
+ border: 1px solid var(--border);
278
+ border-radius: var(--radius-2);
279
+ padding: var(--space-4);
155
280
  }
156
281
 
157
- .highlight h2 {
158
- margin-top: 0;
159
- font-size: 1.15rem;
282
+ .about-card h3 {
283
+ margin: 0 0 var(--space-2);
284
+ font-size: var(--text-base);
285
+ color: var(--text-strong);
286
+ font-weight: 700;
160
287
  }
161
288
 
162
- .highlight p {
163
- margin-bottom: 0;
164
- color: var(--muted-text);
289
+ .about-card p {
290
+ margin: 0;
291
+ color: var(--text-muted);
292
+ font-size: var(--text-sm);
293
+ line-height: 1.55;
165
294
  }
166
295
 
167
296
  .workspace {
168
297
  display: grid;
169
298
  grid-template-columns: 1fr;
170
- gap: 1rem;
299
+ gap: var(--space-5);
171
300
  align-items: start;
301
+ margin-top: var(--space-5);
302
+ }
303
+
304
+ @media (min-width: 960px) {
305
+ .workspace {
306
+ grid-template-columns: minmax(340px, 34%) 1fr;
307
+ }
308
+ .panel-results {
309
+ position: sticky;
310
+ top: calc(3rem + var(--space-4));
311
+ }
172
312
  }
173
313
 
174
314
  .panel {
175
- background-color: var(--panel-bg);
176
- border: 2px solid var(--border-color);
177
- border-radius: 10px;
178
- padding: 1.35rem;
179
- backdrop-filter: blur(10px);
315
+ background-color: transparent;
316
+ border-radius: 0;
317
+ padding: var(--space-4) 0;
318
+ }
319
+
320
+ .panel-form {
321
+ border-right: 1px solid var(--border);
322
+ padding-right: var(--space-5);
323
+ }
324
+
325
+ @media (max-width: 959px) {
326
+ .panel-form {
327
+ border-right: none;
328
+ border-bottom: 1px solid var(--border);
329
+ padding-right: 0;
330
+ padding-bottom: var(--space-5);
331
+ }
332
+ }
333
+
334
+ .panel-form,
335
+ .panel-results {
336
+ display: flex;
337
+ flex-direction: column;
338
+ gap: var(--space-5);
180
339
  }
181
340
 
182
341
  .panel-heading {
@@ -195,7 +354,7 @@ h2 {
195
354
  font-size: 0.74rem;
196
355
  letter-spacing: 0.08em;
197
356
  text-transform: uppercase;
198
- color: var(--muted-text);
357
+ color: var(--text-muted);
199
358
  }
200
359
 
201
360
  .resource-grid {
@@ -210,7 +369,7 @@ h2 {
210
369
  }
211
370
 
212
371
  .section-heading p {
213
- color: var(--muted-text);
372
+ color: var(--text-muted);
214
373
  max-width: 640px;
215
374
  }
216
375
 
@@ -238,43 +397,44 @@ form {
238
397
 
239
398
  select {
240
399
  padding: 0.85rem 1rem;
241
- border: 2px solid var(--border-color);
400
+ border: 2px solid var(--border);
242
401
  border-radius: 4px;
243
- background-color: var(--background-color);
244
- color: var(--text-color);
402
+ background-color: var(--bg);
403
+ color: var(--text);
245
404
  font-size: 1rem;
405
+ font-family: inherit;
246
406
  transition: border-color 0.2s;
247
407
  cursor: pointer;
248
408
  }
249
409
 
250
410
  select:focus {
251
- border-color: var(--primary-color);
411
+ border-color: var(--primary);
252
412
  outline: none;
253
413
  }
254
414
 
255
415
  optgroup {
256
416
  font-weight: 600;
257
- color: var(--heading-strong);
417
+ color: var(--text-strong);
258
418
  font-style: normal;
259
419
  }
260
420
 
261
421
  option {
262
422
  padding: 0.5rem;
263
- color: var(--text-color);
423
+ color: var(--text);
264
424
  }
265
425
 
266
426
  .help-text {
267
427
  margin: 0;
268
428
  font-size: 0.9rem;
269
- color: var(--muted-text);
429
+ color: var(--text-muted);
270
430
  }
271
431
 
272
432
  .confusion-matrix {
273
- border: 2px solid var(--base-300);
433
+ border: 2px solid var(--log-150);
274
434
  border-radius: 8px;
275
435
  padding: 1.25rem;
276
436
  margin: 0 0 2rem;
277
- background-color: var(--matrix-bg);
437
+ background-color: var(--surface-soft);
278
438
  }
279
439
 
280
440
  .confusion-matrix legend {
@@ -284,7 +444,7 @@ option {
284
444
 
285
445
  .grid-container {
286
446
  display: grid;
287
- grid-template-columns: 92px repeat(2, minmax(120px, 1fr));
447
+ grid-template-columns: 64px repeat(2, minmax(0, 1fr));
288
448
  gap: 0.75rem;
289
449
  align-items: stretch;
290
450
  }
@@ -294,8 +454,8 @@ option {
294
454
  padding: 0.75rem;
295
455
  border-radius: 4px;
296
456
  font-weight: 600;
297
- color: var(--background-color);
298
- background: linear-gradient(180deg, var(--primary-color), var(--primary-dark));
457
+ color: var(--log-50);
458
+ background-color: var(--primary);
299
459
  }
300
460
 
301
461
  .grid-label {
@@ -305,50 +465,51 @@ option {
305
465
  padding: 0.75rem;
306
466
  border-radius: 4px;
307
467
  font-weight: 600;
308
- color: var(--background-color);
309
- background: linear-gradient(180deg, var(--secondary-color), var(--cyan));
468
+ color: var(--log-50);
469
+ background-color: var(--log-700);
310
470
  text-align: center;
311
471
  }
312
472
 
313
473
  .grid-item {
314
474
  text-align: center;
315
475
  padding: 0.75rem;
316
- background-color: var(--background-color);
476
+ background-color: var(--bg);
317
477
  border-radius: 4px;
318
- border: 2px solid var(--border-color);
478
+ border: 2px solid var(--border);
319
479
  box-shadow: none;
320
480
  transition: border-color 0.2s ease;
321
481
  }
322
482
 
323
483
  .grid-item:hover {
324
- border-color: var(--base-600);
484
+ border-color: var(--log-400);
325
485
  }
326
486
 
327
- /* Input Styling */
487
+ /* Numeric inputs use tabular figures and fluid grid tracks. */
328
488
  .grid-item input,
329
489
  .preTestProb {
330
490
  width: 100%;
331
491
  padding: 0.85rem 1rem;
332
492
  margin: 0;
333
- border: 2px solid var(--border-color);
493
+ border: 2px solid var(--border);
334
494
  border-radius: 4px;
335
495
  box-sizing: border-box;
336
496
  transition: border-color 0.2s;
337
497
  font-size: 1rem;
338
- font-family: inherit;
339
- background-color: var(--background-color);
340
- color: var(--text-color);
498
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
499
+ font-variant-numeric: tabular-nums;
500
+ background-color: var(--bg);
501
+ color: var(--text);
341
502
  }
342
503
 
343
504
  .grid-item input::placeholder,
344
505
  .preTestProb::placeholder {
345
- color: var(--muted-text);
506
+ color: var(--text-muted);
346
507
  opacity: 1;
347
508
  }
348
509
 
349
510
  .grid-item input:focus,
350
511
  .preTestProb:focus {
351
- border-color: var(--primary-color);
512
+ border-color: var(--primary);
352
513
  outline: none;
353
514
  box-shadow: none;
354
515
  }
@@ -356,8 +517,8 @@ option {
356
517
  /* Button Styles */
357
518
  button {
358
519
  width: 100%;
359
- background: var(--primary-color);
360
- color: var(--background-color);
520
+ background: var(--primary);
521
+ color: var(--log-50);
361
522
  padding: 0.9rem;
362
523
  border: none;
363
524
  border-radius: 4px;
@@ -365,25 +526,25 @@ button {
365
526
  font-size: 1em;
366
527
  font-family: inherit;
367
528
  font-weight: 600;
368
- transition: background-color 0.2s;
529
+ transition: none;
369
530
  }
370
531
 
371
532
  button:hover {
372
- background-color: var(--primary-dark);
533
+ background-color: var(--primary-strong);
373
534
  transform: none;
374
535
  box-shadow: none;
375
536
  }
376
537
 
377
538
  .secondary {
378
539
  background: transparent;
379
- color: var(--muted-text);
380
- border: 2px solid var(--border-color);
540
+ color: var(--text-muted);
541
+ border: 2px solid var(--border);
381
542
  box-shadow: none;
382
543
  }
383
544
 
384
545
  .secondary:hover {
385
- background-color: var(--base-300);
386
- border-color: var(--base-500);
546
+ background-color: var(--log-150);
547
+ border-color: var(--log-300);
387
548
  box-shadow: none;
388
549
  }
389
550
 
@@ -400,11 +561,11 @@ button:hover {
400
561
  }
401
562
 
402
563
  .feedback.success {
403
- color: var(--success-color);
564
+ color: var(--success);
404
565
  }
405
566
 
406
567
  .feedback.error {
407
- color: var(--primary-dark);
568
+ color: var(--crew-ahab);
408
569
  }
409
570
 
410
571
  .results-section {
@@ -417,102 +578,322 @@ button:hover {
417
578
  margin: 0;
418
579
  }
419
580
 
420
- .results-grid {
581
+ /* ── Results hierarchy (v4.0) ───────────────────────────────────────────── */
582
+
583
+ .results-headline {
421
584
  display: grid;
422
- grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
423
- gap: 1rem;
424
- margin-top: 1rem;
585
+ grid-template-columns: repeat(2, minmax(0, 1fr));
586
+ column-gap: var(--space-5);
587
+ row-gap: var(--space-4);
425
588
  }
426
589
 
427
- .probability-chart {
428
- background-color: var(--panel-soft-bg);
429
- border-radius: 8px;
430
- padding: 1.5rem;
431
- border: 2px solid var(--border-color);
432
- box-shadow: none;
590
+ @media (min-width: 540px) {
591
+ .results-headline {
592
+ grid-template-columns: repeat(4, minmax(0, 1fr));
593
+ }
594
+ }
595
+
596
+ .results-secondary {
433
597
  display: grid;
434
- gap: 1rem;
598
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
599
+ column-gap: var(--space-5);
600
+ row-gap: var(--space-4);
601
+ padding-top: var(--space-4);
602
+ border-top: 1px solid var(--border);
603
+ }
604
+
605
+ /* Result cards: no fills, no borders — typography and the inline bar/band
606
+ carry the visual signal. Minimal. */
607
+ .result-card {
608
+ background-color: transparent;
609
+ border: none;
610
+ border-radius: 0;
611
+ padding: 0;
612
+ display: flex;
613
+ flex-direction: column;
614
+ gap: var(--space-2);
615
+ position: relative;
616
+ }
617
+
618
+ .result-card:empty { display: none; }
619
+
620
+ .result-card h3 {
621
+ margin: 0;
622
+ font-size: var(--text-sm);
623
+ font-weight: 600;
624
+ color: var(--text-muted);
625
+ line-height: 1.4;
626
+ }
627
+
628
+ /* Reserve two lines of label height in the headline strip so single-line
629
+ labels (Sensitivity, Specificity) align with two-line ones (Post-test
630
+ probability …) — values sit on a shared baseline across cards. */
631
+ .results-headline .result-card h3 {
632
+ min-height: calc(var(--text-xs) * 1.3 * 2);
633
+ }
634
+
635
+ .result-value {
636
+ font-size: var(--text-xl);
637
+ font-weight: 700;
638
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
639
+ font-variant-numeric: tabular-nums;
640
+ letter-spacing: -0.02em;
641
+ color: var(--text-strong);
642
+ margin: 0;
643
+ line-height: 1.05;
644
+ }
645
+
646
+ .result-ci {
647
+ font-size: var(--text-xs);
648
+ color: var(--text-muted);
649
+ font-variant-numeric: tabular-nums;
650
+ margin: 0;
651
+ }
652
+
653
+ .result-note {
654
+ margin: var(--space-1) 0 0;
655
+ font-size: var(--text-xs);
656
+ color: var(--text-muted);
657
+ }
658
+
659
+ .result-card--lg .result-value { font-size: var(--text-2xl); }
660
+ .result-card--sm .result-value { font-size: var(--text-lg); }
661
+
662
+ /* ── Bayesian update strip ─────────────────────────────────────────────── */
663
+ .bayesian-update {
664
+ display: flex;
665
+ flex-direction: column;
666
+ gap: var(--space-4);
667
+ padding: var(--space-4) 0;
668
+ border-top: 1px solid var(--border);
669
+ border-bottom: 1px solid var(--border);
435
670
  }
436
671
 
437
- .probability-chart:empty {
672
+ .bayesian-update:empty {
438
673
  display: none;
439
674
  }
440
675
 
441
- .chart-row {
676
+ .bayesian-row {
442
677
  display: grid;
443
- grid-template-columns: 120px 1fr 70px;
678
+ grid-template-columns: 6rem auto 1fr auto 4.5rem;
679
+ column-gap: var(--space-3);
444
680
  align-items: center;
445
- gap: 1rem;
446
- font-size: 0.95rem;
681
+ font-size: var(--text-sm);
447
682
  }
448
683
 
449
- .chart-label {
450
- font-weight: 600;
451
- color: var(--muted-text);
684
+ @media (max-width: 600px) {
685
+ .bayesian-row {
686
+ grid-template-columns: 1fr auto auto;
687
+ grid-template-areas:
688
+ "label label lr"
689
+ "from axis to";
690
+ row-gap: var(--space-1);
691
+ }
692
+ .bayesian-row-label { grid-area: label; }
693
+ .bayesian-row-lr { grid-area: lr; }
694
+ .bayesian-row-from { grid-area: from; }
695
+ .bayesian-axis { grid-area: axis; }
696
+ .bayesian-row-to { grid-area: to; }
697
+ }
698
+
699
+ /* Below the 520 px mark the 3-row template above still squeezes the axis
700
+ into a half-width column. Stack everything onto its own line so the
701
+ pre-test → axis → post-test progression reads as a top-to-bottom flow. */
702
+ @media (max-width: 520px) {
703
+ .bayesian-row {
704
+ grid-template-columns: 1fr;
705
+ grid-template-areas:
706
+ "label"
707
+ "from"
708
+ "axis"
709
+ "to"
710
+ "lr";
711
+ row-gap: var(--space-2);
712
+ text-align: left;
713
+ }
714
+ }
715
+
716
+ .bayesian-row-label {
717
+ font-weight: 700;
718
+ color: var(--text);
719
+ }
720
+
721
+ .bayesian-row-from,
722
+ .bayesian-row-to {
723
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
724
+ font-variant-numeric: tabular-nums;
725
+ font-size: var(--text-sm);
726
+ }
727
+
728
+ .bayesian-row-from {
729
+ color: var(--text-muted);
730
+ text-align: right;
731
+ }
732
+
733
+ .bayesian-row-to {
734
+ color: var(--text-strong);
735
+ font-weight: 700;
736
+ text-align: left;
452
737
  }
453
738
 
454
- .chart-bar {
739
+ .bayesian-row-lr {
740
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
741
+ font-variant-numeric: tabular-nums;
742
+ color: var(--text-muted);
743
+ text-align: right;
744
+ font-size: var(--text-xs);
745
+ white-space: nowrap;
746
+ }
747
+
748
+ .bayesian-axis {
455
749
  position: relative;
456
- height: 16px;
457
- background-color: var(--base-300);
458
- border-radius: 2px;
459
- overflow: hidden;
750
+ height: 1.5rem;
460
751
  }
461
752
 
462
- .chart-fill {
753
+ .bayesian-axis::before {
754
+ content: "";
463
755
  position: absolute;
464
- inset: 0;
465
- background: var(--primary-color);
466
- border-radius: 2px;
467
- transform-origin: left center;
468
- transform: scaleX(0);
469
- transition: transform 0.4s ease-in-out;
756
+ top: 50%;
757
+ left: 0;
758
+ right: 0;
759
+ height: 1px;
760
+ background-color: var(--border);
761
+ transform: translateY(-50%);
470
762
  }
471
763
 
472
- .chart-fill.positive {
473
- background: var(--accent-warm);
764
+ .bayesian-axis-trail {
765
+ position: absolute;
766
+ top: 50%;
767
+ height: 2px;
768
+ transform: translateY(-50%);
769
+ background-color: var(--text-muted);
474
770
  }
475
771
 
476
- .chart-fill.negative {
477
- background: var(--success-color);
772
+ .bayesian-row--warm .bayesian-axis-trail { background-color: var(--accent-warm); height: 3px; }
773
+ .bayesian-row--cool .bayesian-axis-trail { background-color: var(--success); height: 3px; }
774
+
775
+ /* Big, clearly visible arrowhead at the post end of the trail. */
776
+ .bayesian-axis-trail::after {
777
+ content: "";
778
+ position: absolute;
779
+ top: 50%;
780
+ right: -10px;
781
+ width: 0;
782
+ height: 0;
783
+ border-top: 7px solid transparent;
784
+ border-bottom: 7px solid transparent;
785
+ transform: translateY(-50%);
478
786
  }
479
787
 
480
- .chart-value {
481
- font-variant-numeric: tabular-nums;
482
- font-weight: 600;
788
+ .bayesian-row--warm .bayesian-axis-trail::after { border-left: 11px solid var(--accent-warm); }
789
+ .bayesian-row--cool .bayesian-axis-trail::after { border-left: 11px solid var(--success); }
790
+
791
+ /* RTL: arrow points left when post-test < pre-test (e.g. negative test). */
792
+ .bayesian-axis.rtl .bayesian-axis-trail::after {
793
+ right: auto;
794
+ left: -10px;
795
+ border-left: none;
796
+ border-right: 11px solid;
483
797
  }
484
798
 
485
- .result-card {
486
- background-color: var(--panel-soft-bg);
487
- border-radius: 8px;
488
- padding: 1.5rem;
489
- border: 2px solid var(--border-color);
490
- box-shadow: none;
491
- display: flex;
492
- flex-direction: column;
493
- gap: 0.5rem;
799
+ .bayesian-row--warm .bayesian-axis.rtl .bayesian-axis-trail::after { border-right-color: var(--accent-warm); }
800
+ .bayesian-row--cool .bayesian-axis.rtl .bayesian-axis-trail::after { border-right-color: var(--success); }
801
+
802
+ .bayesian-axis-pre,
803
+ .bayesian-axis-post {
804
+ position: absolute;
805
+ top: 50%;
806
+ transform: translate(-50%, -50%);
807
+ border-radius: 50%;
494
808
  }
495
809
 
496
- .result-card h3 {
497
- margin: 0;
498
- font-size: 1.05rem;
499
- color: var(--heading-strong);
810
+ .bayesian-axis-pre {
811
+ width: 10px;
812
+ height: 10px;
813
+ background: var(--bg);
814
+ border: 2px solid var(--text-muted);
815
+ z-index: 2;
500
816
  }
501
817
 
502
- .result-value {
503
- font-size: 1.9rem;
504
- font-weight: 700;
818
+ .bayesian-axis-post {
819
+ width: 12px;
820
+ height: 12px;
821
+ z-index: 3;
822
+ border: 2px solid var(--bg);
505
823
  }
506
824
 
507
- .result-ci {
508
- font-size: 0.9rem;
509
- color: var(--muted-text);
825
+ .bayesian-row--warm .bayesian-axis-post { background-color: var(--accent-warm); }
826
+ .bayesian-row--cool .bayesian-axis-post { background-color: var(--success); }
827
+
828
+ /* ── Inline fill bar on percentage result cards ────────────────────────── */
829
+ .result-bar {
830
+ position: relative;
831
+ height: 3px;
832
+ border-radius: var(--radius-pill);
833
+ background-color: var(--border);
834
+ overflow: hidden;
835
+ margin: var(--space-1) 0 0;
510
836
  }
511
837
 
512
- .result-note {
513
- margin-top: auto;
514
- font-size: 0.85rem;
515
- color: var(--muted-text);
838
+ .result-bar-fill {
839
+ display: block;
840
+ height: 100%;
841
+ border-radius: var(--radius-pill);
842
+ background-color: var(--text-muted);
843
+ transition: width var(--duration-base) var(--ease-out);
844
+ }
845
+
846
+ .result-bar--neutral .result-bar-fill { background-color: var(--secondary); }
847
+ .result-bar--warm .result-bar-fill { background-color: var(--accent-warm); }
848
+ .result-bar--cool .result-bar-fill { background-color: var(--success); }
849
+
850
+ /* ── Clinical-utility band indicators on LR / DOR cards ────────────────── */
851
+ .result-band {
852
+ position: relative;
853
+ display: flex;
854
+ height: 6px;
855
+ border-radius: var(--radius-pill);
856
+ overflow: hidden;
857
+ margin: var(--space-1) 0 0;
858
+ }
859
+
860
+ .result-band-zone {
861
+ flex: 1 1 0;
862
+ position: relative;
863
+ }
864
+
865
+ /* LR+: weak → limited → useful → rule-in */
866
+ .result-band--lr-plus .result-band-zone--0 { background-color: rgba(168, 55, 50, 0.35); }
867
+ .result-band--lr-plus .result-band-zone--1 { background-color: rgba(202, 100, 53, 0.35); }
868
+ .result-band--lr-plus .result-band-zone--2 { background-color: rgba(106, 74, 0, 0.35); }
869
+ .result-band--lr-plus .result-band-zone--3 { background-color: rgba(23, 124, 85, 0.40); }
870
+
871
+ /* LR-: rule-out → useful → limited → weak */
872
+ .result-band--lr-minus .result-band-zone--0 { background-color: rgba(23, 124, 85, 0.40); }
873
+ .result-band--lr-minus .result-band-zone--1 { background-color: rgba(106, 74, 0, 0.35); }
874
+ .result-band--lr-minus .result-band-zone--2 { background-color: rgba(202, 100, 53, 0.35); }
875
+ .result-band--lr-minus .result-band-zone--3 { background-color: rgba(168, 55, 50, 0.35); }
876
+
877
+ /* DOR: poor → limited → useful → very strong */
878
+ .result-band--dor .result-band-zone--0 { background-color: rgba(168, 55, 50, 0.35); }
879
+ .result-band--dor .result-band-zone--1 { background-color: rgba(202, 100, 53, 0.35); }
880
+ .result-band--dor .result-band-zone--2 { background-color: rgba(106, 74, 0, 0.35); }
881
+ .result-band--dor .result-band-zone--3 { background-color: rgba(23, 124, 85, 0.40); }
882
+
883
+ .result-band-marker {
884
+ position: absolute;
885
+ top: 50%;
886
+ width: 3px;
887
+ height: 12px;
888
+ transform: translate(-50%, -50%);
889
+ border-radius: 1px;
890
+ background-color: var(--text-strong);
891
+ pointer-events: none;
892
+ z-index: 1;
893
+ }
894
+
895
+ [data-theme="dark"] .result-band-marker {
896
+ background-color: var(--log-50);
516
897
  }
517
898
 
518
899
  .interpretation {
@@ -520,11 +901,11 @@ button:hover {
520
901
  }
521
902
 
522
903
  .interpretation details {
523
- border: 2px solid var(--base-300);
904
+ border: 2px solid var(--log-150);
524
905
  border-radius: 4px;
525
906
  padding: 1rem 1.25rem;
526
907
  margin-bottom: 1rem;
527
- background-color: var(--background-color);
908
+ background-color: var(--bg);
528
909
  }
529
910
 
530
911
  .interpretation summary {
@@ -534,15 +915,15 @@ button:hover {
534
915
 
535
916
  .interpretation p {
536
917
  margin: 0.5rem 0 0;
537
- color: var(--muted-text);
918
+ color: var(--text-muted);
538
919
  }
539
920
 
540
921
  /* Dataset Reference */
541
922
  .dataset-reference {
542
923
  margin-top: 1rem;
543
924
  padding: 1rem;
544
- background-color: var(--reference-bg);
545
- border-left: 4px solid var(--primary-color);
925
+ background-color: var(--surface);
926
+ border-left: 4px solid var(--primary);
546
927
  border-radius: 4px;
547
928
  font-size: 0.9rem;
548
929
  }
@@ -550,26 +931,26 @@ button:hover {
550
931
  .dataset-reference h4 {
551
932
  margin: 0 0 0.5rem;
552
933
  font-size: 0.95rem;
553
- color: var(--heading-strong);
934
+ color: var(--text-strong);
554
935
  }
555
936
 
556
937
  .dataset-reference p {
557
938
  margin: 0.25rem 0;
558
- color: var(--reference-text);
939
+ color: var(--text);
559
940
  }
560
941
 
561
942
  .dataset-reference .reference-citation {
562
943
  font-style: italic;
563
- color: var(--reference-muted);
944
+ color: var(--text-muted);
564
945
  margin-top: 0.5rem;
565
946
  }
566
947
 
567
948
  /* Fagan Nomogram */
568
949
  .fagan-nomogram {
569
- background-color: var(--surface-color);
950
+ background-color: var(--surface);
570
951
  border-radius: 8px;
571
952
  padding: 1.5rem;
572
- border: 2px solid var(--border-color);
953
+ border: 2px solid var(--border);
573
954
  margin-bottom: 1.5rem;
574
955
  text-align: center;
575
956
  }
@@ -577,7 +958,7 @@ button:hover {
577
958
  .fagan-nomogram h3 {
578
959
  margin: 0 0 0.5rem;
579
960
  font-size: 1.2rem;
580
- color: var(--heading-strong);
961
+ color: var(--text-strong);
581
962
  }
582
963
 
583
964
  .fagan-nomogram canvas {
@@ -585,57 +966,1278 @@ button:hover {
585
966
  width: 600px;
586
967
  height: 400px;
587
968
  margin-top: 1rem;
588
- border: 1px solid var(--base-300);
969
+ border: 1px solid var(--log-150);
589
970
  border-radius: 4px;
590
971
  }
591
972
 
592
- /* References Section */
593
- .references {
594
- margin-top: 0;
973
+ .fagan-summary {
974
+ display: grid;
975
+ grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
976
+ gap: 0.5rem 0.75rem;
977
+ margin: 1rem auto 0;
978
+ max-width: 600px;
979
+ padding: 0.75rem 1rem;
980
+ background-color: var(--surface-soft);
981
+ border: 1px solid var(--border);
982
+ border-radius: 6px;
983
+ text-align: left;
595
984
  }
596
985
 
597
- .references details {
598
- border: 2px solid var(--base-300);
599
- border-radius: 4px;
600
- padding: 1rem 1.25rem;
601
- margin-bottom: 1rem;
602
- background-color: var(--background-color);
986
+ .fagan-summary-item {
987
+ display: flex;
988
+ flex-direction: column;
989
+ gap: 0.1rem;
990
+ min-width: 0;
603
991
  }
604
992
 
605
- .references summary {
993
+ .fagan-summary-item dt {
994
+ font-size: 0.72rem;
606
995
  font-weight: 600;
607
- cursor: pointer;
996
+ text-transform: uppercase;
997
+ letter-spacing: 0.05em;
998
+ color: var(--text-muted);
999
+ margin: 0;
608
1000
  }
609
1001
 
610
- .reference-list {
611
- margin: 1rem 0 0;
612
- padding-left: 1.5rem;
613
- color: var(--muted-text);
1002
+ .fagan-summary-item dd {
1003
+ margin: 0;
1004
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1005
+ font-variant-numeric: tabular-nums;
1006
+ font-size: 1.05rem;
1007
+ font-weight: 700;
1008
+ color: var(--text);
1009
+ }
1010
+
1011
+ /* ── Unified disclosure marker ─────────────────────────────────────────────
1012
+ One thin outlined chevron for every collapsible panel: two 1.5 px strokes
1013
+ (border-right + border-bottom) rotated 45° so they form a right-pointing
1014
+ "›" rather than a filled triangle. Inherits text colour via currentColor.
1015
+ Rotates to point down on [open]. */
1016
+ .advanced-settings > summary::before,
1017
+ .history-panel > summary::before,
1018
+ .roc-panel > summary::before,
1019
+ .threshold-panel > summary::before,
1020
+ .sequential-test > summary::before,
1021
+ .prevalence-explorer > summary::before {
1022
+ content: "";
1023
+ display: inline-block;
1024
+ width: 6px;
1025
+ height: 6px;
1026
+ margin: 0 0.65em 2px 2px;
1027
+ border-right: 1.5px solid currentColor;
1028
+ border-bottom: 1.5px solid currentColor;
1029
+ transform: rotate(-45deg);
1030
+ vertical-align: middle;
1031
+ opacity: 0.55;
1032
+ transition: transform 0.15s ease;
1033
+ }
1034
+
1035
+ .advanced-settings[open] > summary::before,
1036
+ .history-panel[open] > summary::before,
1037
+ .roc-panel[open] > summary::before,
1038
+ .threshold-panel[open] > summary::before,
1039
+ .sequential-test[open] > summary::before,
1040
+ .prevalence-explorer[open] > summary::before {
1041
+ transform: rotate(45deg);
1042
+ margin-top: -2px;
1043
+ margin-bottom: 0;
614
1044
  }
615
1045
 
616
- .reference-list li {
617
- margin-bottom: 0.75rem;
618
- line-height: 1.6;
1046
+ @media (prefers-reduced-motion: reduce) {
1047
+ .advanced-settings > summary::before,
1048
+ .history-panel > summary::before,
1049
+ .roc-panel > summary::before,
1050
+ .threshold-panel > summary::before,
1051
+ .sequential-test > summary::before,
1052
+ .prevalence-explorer > summary::before {
1053
+ transition: none;
1054
+ }
619
1055
  }
620
1056
 
621
- .reference-list strong {
622
- color: var(--heading-strong);
1057
+ /* ── Summary tags (tool / reference) ───────────────────────────────────────
1058
+ Small badges inside disclosure summaries that mark which panels are
1059
+ interactive tools (filled, Queequeg) and which are read-only reference
1060
+ material (outlined, muted). Sit right after the chevron and before the
1061
+ summary's strong text. */
1062
+ .summary-tag {
1063
+ display: inline-block;
1064
+ margin-right: var(--space-3);
1065
+ padding: 2px var(--space-2);
1066
+ border-radius: 4px;
1067
+ font-size: 0.6875rem;
1068
+ font-weight: 600;
1069
+ text-transform: uppercase;
1070
+ letter-spacing: 0.08em;
1071
+ line-height: 1.4;
1072
+ vertical-align: 2px;
1073
+ white-space: nowrap;
623
1074
  }
624
1075
 
625
- /* Tooltip */
626
- .tooltip {
627
- position: relative;
628
- display: inline-block;
629
- cursor: help;
630
- border-bottom: 1px dotted var(--base-600);
1076
+ .summary-tag--tool {
1077
+ background-color: var(--primary);
1078
+ color: var(--log-50);
631
1079
  }
632
1080
 
633
- .tooltip .tooltip-text {
634
- visibility: hidden;
635
- width: 280px;
636
- background-color: var(--base-950);
637
- color: var(--base-100);
638
- text-align: left;
1081
+ .summary-tag--ref {
1082
+ background-color: transparent;
1083
+ border: 1px solid var(--border);
1084
+ color: var(--text-muted);
1085
+ }
1086
+
1087
+ /* Advanced settings (inside the form panel) */
1088
+ .advanced-settings {
1089
+ margin-bottom: 1.25rem;
1090
+ border: 1px dashed var(--border);
1091
+ border-radius: 6px;
1092
+ padding: 0.75rem 1rem;
1093
+ background-color: var(--bg-elevated, transparent);
1094
+ }
1095
+
1096
+ .advanced-settings > summary {
1097
+ cursor: pointer;
1098
+ font-weight: 600;
1099
+ color: var(--text-muted);
1100
+ font-size: 0.85rem;
1101
+ text-transform: uppercase;
1102
+ letter-spacing: 0.06em;
1103
+ list-style: none;
1104
+ }
1105
+
1106
+ .advanced-settings > summary::-webkit-details-marker {
1107
+ display: none;
1108
+ }
1109
+
1110
+ .advanced-settings .form-row {
1111
+ margin: 0.75rem 0 0;
1112
+ }
1113
+
1114
+ /* Calculation history panel */
1115
+ .history-panel {
1116
+ background-color: var(--surface);
1117
+ border: 2px solid var(--border);
1118
+ border-radius: 8px;
1119
+ padding: 1.25rem 1.5rem;
1120
+ margin-top: 1.5rem;
1121
+ }
1122
+
1123
+ .history-panel > summary {
1124
+ cursor: pointer;
1125
+ font-weight: 600;
1126
+ color: var(--text-strong);
1127
+ font-size: 1.05rem;
1128
+ line-height: 1.4;
1129
+ list-style: none;
1130
+ }
1131
+
1132
+ .history-panel > summary::-webkit-details-marker {
1133
+ display: none;
1134
+ }
1135
+
1136
+ .history-list {
1137
+ list-style: none;
1138
+ margin: 1rem 0 0.75rem;
1139
+ padding: 0;
1140
+ display: flex;
1141
+ flex-direction: column;
1142
+ gap: 0.5rem;
1143
+ }
1144
+
1145
+ .history-item {
1146
+ display: grid;
1147
+ grid-template-columns: auto 1fr auto;
1148
+ gap: 0.75rem;
1149
+ align-items: center;
1150
+ background-color: var(--surface-soft);
1151
+ border: 1px solid var(--border);
1152
+ border-radius: 6px;
1153
+ padding: 0.65rem 0.85rem;
1154
+ }
1155
+
1156
+ .history-item input[type="checkbox"] {
1157
+ width: 1rem;
1158
+ height: 1rem;
1159
+ accent-color: var(--primary);
1160
+ cursor: pointer;
1161
+ }
1162
+
1163
+ .history-item-label {
1164
+ display: grid;
1165
+ gap: 0.15rem;
1166
+ cursor: pointer;
1167
+ min-width: 0;
1168
+ }
1169
+
1170
+ .history-item-title {
1171
+ font-weight: 700;
1172
+ color: var(--text);
1173
+ }
1174
+
1175
+ .history-item-meta,
1176
+ .history-item-stats {
1177
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1178
+ font-variant-numeric: tabular-nums;
1179
+ font-size: 0.78rem;
1180
+ color: var(--text-muted);
1181
+ word-break: break-word;
1182
+ }
1183
+
1184
+ .history-item-date {
1185
+ font-size: 0.72rem;
1186
+ color: var(--text-muted);
1187
+ text-transform: uppercase;
1188
+ letter-spacing: 0.04em;
1189
+ }
1190
+
1191
+ .history-item-actions {
1192
+ display: flex;
1193
+ gap: 0.4rem;
1194
+ }
1195
+
1196
+ .history-item-actions button {
1197
+ width: auto;
1198
+ padding: 0.4rem 0.7rem;
1199
+ font-size: 0.85rem;
1200
+ }
1201
+
1202
+ .history-item-delete {
1203
+ padding: 0.4rem 0.6rem;
1204
+ color: var(--crew-ahab);
1205
+ border-color: var(--border);
1206
+ }
1207
+
1208
+ .history-item-delete:hover {
1209
+ background-color: var(--crew-ahab);
1210
+ color: var(--log-50);
1211
+ }
1212
+
1213
+ .history-compare-table {
1214
+ width: 100%;
1215
+ border-collapse: collapse;
1216
+ font-size: 0.88rem;
1217
+ margin: 0.5rem 0 1rem;
1218
+ }
1219
+
1220
+ .history-compare-table th,
1221
+ .history-compare-table td {
1222
+ padding: 0.45rem 0.7rem;
1223
+ text-align: left;
1224
+ border-bottom: 1px solid var(--border);
1225
+ }
1226
+
1227
+ .history-compare-table thead th {
1228
+ background-color: var(--surface-soft);
1229
+ font-size: 0.78rem;
1230
+ text-transform: uppercase;
1231
+ letter-spacing: 0.05em;
1232
+ color: var(--text-muted);
1233
+ border-bottom-width: 2px;
1234
+ }
1235
+
1236
+ .history-compare-table tbody th {
1237
+ font-weight: 600;
1238
+ color: var(--text-muted);
1239
+ font-size: 0.78rem;
1240
+ text-transform: uppercase;
1241
+ letter-spacing: 0.05em;
1242
+ }
1243
+
1244
+ .history-compare-table tbody td {
1245
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1246
+ font-variant-numeric: tabular-nums;
1247
+ color: var(--text);
1248
+ font-weight: 600;
1249
+ }
1250
+
1251
+ .history-compare:empty {
1252
+ display: none;
1253
+ }
1254
+
1255
+ @media (max-width: 720px) {
1256
+ .history-item {
1257
+ grid-template-columns: auto 1fr;
1258
+ }
1259
+ .history-item-actions {
1260
+ grid-column: 1 / -1;
1261
+ justify-content: flex-end;
1262
+ }
1263
+ }
1264
+
1265
+ /* STARD critical-appraisal panel */
1266
+ .stard-panel .panel-kicker {
1267
+ color: var(--crew-pip);
1268
+ }
1269
+
1270
+ .stard-panel details {
1271
+ border: 2px solid var(--log-150);
1272
+ border-radius: 4px;
1273
+ padding: 0.85rem 1.1rem;
1274
+ margin-bottom: 0.75rem;
1275
+ background-color: var(--bg);
1276
+ }
1277
+
1278
+ .stard-panel summary {
1279
+ font-weight: 600;
1280
+ cursor: pointer;
1281
+ color: var(--text);
1282
+ }
1283
+
1284
+ .stard-panel details p {
1285
+ margin: 0.6rem 0 0;
1286
+ color: var(--text-muted);
1287
+ font-size: 0.92rem;
1288
+ line-height: 1.55;
1289
+ }
1290
+
1291
+ .stard-panel details em {
1292
+ font-style: italic;
1293
+ color: var(--text);
1294
+ }
1295
+
1296
+ /* Cohen's kappa companion panel */
1297
+ .kappa-panel .panel-kicker {
1298
+ color: var(--crew-tashtego);
1299
+ }
1300
+
1301
+ .kappa-matrix {
1302
+ margin-top: 0.5rem;
1303
+ margin-bottom: 1rem;
1304
+ }
1305
+
1306
+ .kappa-panel .form-actions {
1307
+ grid-template-columns: auto auto;
1308
+ justify-content: flex-start;
1309
+ gap: 0.75rem;
1310
+ }
1311
+
1312
+ .kappa-panel .form-actions button {
1313
+ width: auto;
1314
+ padding: 0.55rem 1.1rem;
1315
+ }
1316
+
1317
+ .kappa-result {
1318
+ display: grid;
1319
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
1320
+ gap: 0.6rem;
1321
+ margin-top: 0.75rem;
1322
+ }
1323
+
1324
+ .kappa-result:empty {
1325
+ display: none;
1326
+ }
1327
+
1328
+ .kappa-stat {
1329
+ background-color: var(--surface-soft);
1330
+ border: 1px solid var(--border);
1331
+ border-radius: 6px;
1332
+ padding: 0.55rem 0.85rem;
1333
+ display: flex;
1334
+ flex-direction: column;
1335
+ gap: 0.2rem;
1336
+ }
1337
+
1338
+ .kappa-stat-label {
1339
+ font-size: 0.72rem;
1340
+ color: var(--text-muted);
1341
+ text-transform: uppercase;
1342
+ letter-spacing: 0.06em;
1343
+ font-weight: 600;
1344
+ }
1345
+
1346
+ .kappa-stat-value {
1347
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1348
+ font-variant-numeric: tabular-nums;
1349
+ font-size: 1rem;
1350
+ font-weight: 700;
1351
+ color: var(--text);
1352
+ }
1353
+
1354
+ .kappa-error {
1355
+ color: var(--crew-ahab);
1356
+ font-weight: 600;
1357
+ margin: 0;
1358
+ }
1359
+
1360
+ /* ROC reconstruction panel */
1361
+ .roc-panel {
1362
+ background-color: var(--surface);
1363
+ border: 2px solid var(--border);
1364
+ border-radius: 8px;
1365
+ padding: 1.25rem 1.5rem;
1366
+ margin-top: 1.5rem;
1367
+ }
1368
+
1369
+ .roc-panel > summary {
1370
+ cursor: pointer;
1371
+ font-weight: 600;
1372
+ color: var(--text-strong);
1373
+ font-size: 1.05rem;
1374
+ line-height: 1.4;
1375
+ list-style: none;
1376
+ }
1377
+
1378
+ .roc-panel > summary::-webkit-details-marker {
1379
+ display: none;
1380
+ }
1381
+
1382
+ .roc-table-wrapper {
1383
+ overflow-x: auto;
1384
+ margin: 1rem 0;
1385
+ }
1386
+
1387
+ .roc-table {
1388
+ width: 100%;
1389
+ border-collapse: collapse;
1390
+ font-size: 0.9rem;
1391
+ }
1392
+
1393
+ .roc-table th,
1394
+ .roc-table td {
1395
+ padding: 0.45rem 0.5rem;
1396
+ text-align: center;
1397
+ border-bottom: 1px solid var(--border);
1398
+ }
1399
+
1400
+ .roc-table th {
1401
+ font-size: 0.72rem;
1402
+ text-transform: uppercase;
1403
+ letter-spacing: 0.05em;
1404
+ color: var(--text-muted);
1405
+ font-weight: 700;
1406
+ border-bottom-width: 2px;
1407
+ }
1408
+
1409
+ .roc-table input[type="number"] {
1410
+ width: 100%;
1411
+ min-width: 60px;
1412
+ padding: 0.4rem 0.5rem;
1413
+ border: 1px solid var(--border);
1414
+ border-radius: 4px;
1415
+ background-color: var(--bg);
1416
+ color: var(--text);
1417
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1418
+ font-variant-numeric: tabular-nums;
1419
+ font-size: 0.9rem;
1420
+ }
1421
+
1422
+ .roc-table input[type="number"]:focus {
1423
+ border-color: var(--primary);
1424
+ outline: none;
1425
+ }
1426
+
1427
+ .roc-remove {
1428
+ width: auto;
1429
+ background: transparent;
1430
+ border: 1px solid var(--border);
1431
+ color: var(--crew-ahab);
1432
+ padding: 0.25rem 0.55rem;
1433
+ border-radius: 4px;
1434
+ font-size: 1rem;
1435
+ font-weight: 700;
1436
+ }
1437
+
1438
+ .roc-remove:hover {
1439
+ background-color: var(--crew-ahab);
1440
+ color: var(--log-50);
1441
+ }
1442
+
1443
+ .roc-panel .form-actions {
1444
+ display: flex;
1445
+ flex-wrap: wrap;
1446
+ justify-content: flex-start;
1447
+ gap: 0.75rem;
1448
+ margin: 0.5rem 0 1rem;
1449
+ }
1450
+
1451
+ /* Synthetic rows are scaffolding — fainter so the user can still tell them
1452
+ apart from rows they typed themselves. They become first-class as soon as
1453
+ the user edits any cell (the JS strips the class on input). */
1454
+ .roc-row--synthetic input[type="number"] {
1455
+ color: var(--text-muted);
1456
+ border-style: dashed;
1457
+ }
1458
+
1459
+ .roc-panel .form-actions button {
1460
+ width: auto;
1461
+ padding: 0.6rem 1rem;
1462
+ }
1463
+
1464
+ .roc-panel canvas {
1465
+ display: block;
1466
+ width: 100%;
1467
+ max-width: 480px;
1468
+ aspect-ratio: 1 / 1;
1469
+ height: auto;
1470
+ margin: 0 auto 1rem;
1471
+ border: 1px solid var(--log-150);
1472
+ border-radius: 4px;
1473
+ background: var(--bg);
1474
+ }
1475
+
1476
+ .roc-readout {
1477
+ display: grid;
1478
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
1479
+ gap: 0.6rem;
1480
+ margin-top: 0.5rem;
1481
+ }
1482
+
1483
+ .roc-flash {
1484
+ grid-column: 1 / -1;
1485
+ margin: 0;
1486
+ padding: 0.55rem 0.85rem;
1487
+ border-radius: 4px;
1488
+ background-color: var(--surface);
1489
+ border-left: 3px solid var(--secondary);
1490
+ color: var(--text);
1491
+ font-size: 0.85rem;
1492
+ line-height: 1.4;
1493
+ }
1494
+
1495
+ .roc-stat {
1496
+ background-color: var(--surface-soft);
1497
+ border: 1px solid var(--border);
1498
+ border-radius: 6px;
1499
+ padding: 0.6rem 0.85rem;
1500
+ display: flex;
1501
+ flex-direction: column;
1502
+ gap: 0.2rem;
1503
+ }
1504
+
1505
+ .roc-stat-label {
1506
+ font-size: 0.72rem;
1507
+ color: var(--text-muted);
1508
+ text-transform: uppercase;
1509
+ letter-spacing: 0.06em;
1510
+ font-weight: 600;
1511
+ }
1512
+
1513
+ .roc-stat-value {
1514
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1515
+ font-variant-numeric: tabular-nums;
1516
+ font-size: 0.95rem;
1517
+ font-weight: 700;
1518
+ color: var(--text);
1519
+ }
1520
+
1521
+ /* Bias warnings callout */
1522
+ .bias-warnings {
1523
+ display: none;
1524
+ margin: 0 0 1rem;
1525
+ padding: 0.9rem 1.1rem;
1526
+ background-color: var(--surface);
1527
+ border: 1px solid var(--border);
1528
+ border-left: 4px solid var(--crew-pip);
1529
+ border-radius: 6px;
1530
+ color: var(--text);
1531
+ font-size: 0.92rem;
1532
+ }
1533
+
1534
+ .bias-warnings.visible {
1535
+ display: block;
1536
+ }
1537
+
1538
+ .bias-warnings-heading {
1539
+ margin: 0 0 0.4rem;
1540
+ font-weight: 700;
1541
+ color: var(--crew-pip);
1542
+ text-transform: uppercase;
1543
+ letter-spacing: 0.05em;
1544
+ font-size: 0.78rem;
1545
+ }
1546
+
1547
+ .bias-warnings-list {
1548
+ margin: 0;
1549
+ padding-left: 1.2rem;
1550
+ }
1551
+
1552
+ .bias-warnings-list li {
1553
+ margin-bottom: 0.35rem;
1554
+ }
1555
+
1556
+ .bias-warnings-list li:last-child {
1557
+ margin-bottom: 0;
1558
+ }
1559
+
1560
+ /* Pauker–Kassirer decision thresholds */
1561
+ .threshold-panel {
1562
+ background-color: var(--surface);
1563
+ border: 2px solid var(--border);
1564
+ border-radius: 8px;
1565
+ padding: 1.25rem 1.5rem;
1566
+ margin-top: 1.5rem;
1567
+ }
1568
+
1569
+ .threshold-panel > summary {
1570
+ cursor: pointer;
1571
+ font-weight: 600;
1572
+ color: var(--text-strong);
1573
+ font-size: 1.05rem;
1574
+ line-height: 1.4;
1575
+ list-style: none;
1576
+ }
1577
+
1578
+ .threshold-panel > summary::-webkit-details-marker {
1579
+ display: none;
1580
+ }
1581
+
1582
+ .threshold-input {
1583
+ margin: 1rem 0 1.25rem;
1584
+ }
1585
+
1586
+ .threshold-input label {
1587
+ display: flex;
1588
+ justify-content: space-between;
1589
+ align-items: baseline;
1590
+ font-weight: 600;
1591
+ margin-bottom: 0.5rem;
1592
+ color: var(--text);
1593
+ }
1594
+
1595
+ .threshold-input output {
1596
+ font-family: ui-monospace, Consolas, monospace;
1597
+ font-variant-numeric: tabular-nums;
1598
+ color: var(--crew-pip);
1599
+ font-weight: 700;
1600
+ font-size: 1.05rem;
1601
+ }
1602
+
1603
+ .threshold-input input[type="range"] {
1604
+ width: 100%;
1605
+ height: 1.5rem;
1606
+ -webkit-appearance: none;
1607
+ appearance: none;
1608
+ background: transparent;
1609
+ cursor: pointer;
1610
+ }
1611
+
1612
+ .threshold-input input[type="range"]::-webkit-slider-runnable-track {
1613
+ height: 6px;
1614
+ background: var(--log-150);
1615
+ border-radius: 3px;
1616
+ }
1617
+
1618
+ .threshold-input input[type="range"]::-webkit-slider-thumb {
1619
+ -webkit-appearance: none;
1620
+ appearance: none;
1621
+ width: 18px;
1622
+ height: 18px;
1623
+ background: var(--crew-pip);
1624
+ border-radius: 50%;
1625
+ margin-top: -6px;
1626
+ cursor: pointer;
1627
+ transition: transform 0.1s;
1628
+ }
1629
+
1630
+ .threshold-input input[type="range"]::-webkit-slider-thumb:hover {
1631
+ transform: none;
1632
+ }
1633
+
1634
+ .threshold-input input[type="range"]::-moz-range-track {
1635
+ height: 6px;
1636
+ background: var(--log-150);
1637
+ border-radius: 3px;
1638
+ }
1639
+
1640
+ .threshold-input input[type="range"]::-moz-range-thumb {
1641
+ width: 18px;
1642
+ height: 18px;
1643
+ background: var(--crew-pip);
1644
+ border: none;
1645
+ border-radius: 50%;
1646
+ cursor: pointer;
1647
+ }
1648
+
1649
+ /* :focus ring handled globally by the :focus-visible block near the top. */
1650
+
1651
+ .threshold-gauge {
1652
+ position: relative;
1653
+ display: flex;
1654
+ height: 28px;
1655
+ border-radius: 4px;
1656
+ overflow: hidden;
1657
+ border: 1px solid var(--border);
1658
+ margin: 1rem 0 0.5rem;
1659
+ }
1660
+
1661
+ .threshold-zone {
1662
+ height: 100%;
1663
+ flex-grow: 0;
1664
+ flex-shrink: 0;
1665
+ min-width: 0;
1666
+ }
1667
+
1668
+ .threshold-zone-no { background-color: var(--crew-ahab); opacity: 0.6; }
1669
+ .threshold-zone-test { background-color: var(--crew-pip); opacity: 0.55; }
1670
+ .threshold-zone-treat { background-color: var(--crew-tashtego); opacity: 0.6; }
1671
+
1672
+ .threshold-marker {
1673
+ position: absolute;
1674
+ top: -4px;
1675
+ bottom: -4px;
1676
+ width: 2px;
1677
+ transform: translateX(-50%);
1678
+ pointer-events: none;
1679
+ }
1680
+
1681
+ .threshold-marker-pt {
1682
+ background-color: var(--log-900);
1683
+ }
1684
+
1685
+ .threshold-marker-pt::after {
1686
+ content: "Pt";
1687
+ position: absolute;
1688
+ top: -1.1rem;
1689
+ left: 50%;
1690
+ transform: translateX(-50%);
1691
+ font-size: 0.7rem;
1692
+ font-weight: 700;
1693
+ color: var(--log-900);
1694
+ font-family: ui-monospace, Consolas, monospace;
1695
+ }
1696
+
1697
+ .threshold-marker-pre {
1698
+ background-color: var(--crew-queequeg);
1699
+ width: 3px;
1700
+ }
1701
+
1702
+ .threshold-marker-pre::after {
1703
+ content: "▼";
1704
+ position: absolute;
1705
+ bottom: -0.95rem;
1706
+ left: 50%;
1707
+ transform: translateX(-50%);
1708
+ font-size: 0.7rem;
1709
+ color: var(--crew-queequeg);
1710
+ }
1711
+
1712
+ [data-theme="dark"] .threshold-marker-pt {
1713
+ background-color: var(--log-100);
1714
+ }
1715
+
1716
+ [data-theme="dark"] .threshold-marker-pt::after {
1717
+ color: var(--log-100);
1718
+ }
1719
+
1720
+ .threshold-legend {
1721
+ display: flex;
1722
+ flex-wrap: wrap;
1723
+ gap: 0.75rem 1.25rem;
1724
+ margin: 1.5rem 0 1rem;
1725
+ font-size: 0.78rem;
1726
+ color: var(--text-muted);
1727
+ }
1728
+
1729
+ .threshold-legend span {
1730
+ display: inline-flex;
1731
+ align-items: center;
1732
+ gap: 0.4rem;
1733
+ }
1734
+
1735
+ .threshold-swatch {
1736
+ display: inline-block;
1737
+ width: 12px;
1738
+ height: 12px;
1739
+ border-radius: 2px;
1740
+ }
1741
+
1742
+ .threshold-swatch.threshold-zone-no { background-color: var(--crew-ahab); opacity: 0.6; }
1743
+ .threshold-swatch.threshold-zone-test { background-color: var(--crew-pip); opacity: 0.55; }
1744
+ .threshold-swatch.threshold-zone-treat { background-color: var(--crew-tashtego); opacity: 0.6; }
1745
+ .threshold-swatch-pt { background-color: var(--log-900); }
1746
+ .threshold-swatch-pre { background-color: var(--crew-queequeg); }
1747
+
1748
+ [data-theme="dark"] .threshold-swatch-pt { background-color: var(--log-100); }
1749
+
1750
+ .threshold-readout {
1751
+ display: grid;
1752
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
1753
+ gap: 0.6rem;
1754
+ margin-top: 0.75rem;
1755
+ }
1756
+
1757
+ .threshold-stat {
1758
+ background-color: var(--surface-soft);
1759
+ border: 1px solid var(--border);
1760
+ border-radius: 6px;
1761
+ padding: 0.6rem 0.85rem;
1762
+ display: flex;
1763
+ flex-direction: column;
1764
+ gap: 0.2rem;
1765
+ }
1766
+
1767
+ .threshold-stat-label {
1768
+ font-size: 0.72rem;
1769
+ color: var(--text-muted);
1770
+ text-transform: uppercase;
1771
+ letter-spacing: 0.06em;
1772
+ font-weight: 600;
1773
+ }
1774
+
1775
+ .threshold-stat-value {
1776
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1777
+ font-variant-numeric: tabular-nums;
1778
+ font-size: 1rem;
1779
+ font-weight: 700;
1780
+ color: var(--text);
1781
+ }
1782
+
1783
+ /* Sequential / chained second test */
1784
+ .sequential-test {
1785
+ background-color: var(--surface);
1786
+ border: 2px solid var(--border);
1787
+ border-radius: 8px;
1788
+ padding: 1.25rem 1.5rem;
1789
+ margin-top: 1.5rem;
1790
+ }
1791
+
1792
+ .sequential-test > summary {
1793
+ cursor: pointer;
1794
+ font-weight: 600;
1795
+ color: var(--text-strong);
1796
+ font-size: 1.05rem;
1797
+ line-height: 1.4;
1798
+ list-style: none;
1799
+ }
1800
+
1801
+ .sequential-test > summary::-webkit-details-marker {
1802
+ display: none;
1803
+ }
1804
+
1805
+ .sequential-controls {
1806
+ margin: 1rem 0 1.25rem;
1807
+ }
1808
+
1809
+ .sequential-controls label {
1810
+ display: flex;
1811
+ flex-direction: column;
1812
+ gap: 0.5rem;
1813
+ font-weight: 600;
1814
+ color: var(--text);
1815
+ }
1816
+
1817
+ .sequential-controls select {
1818
+ margin-top: 0.25rem;
1819
+ }
1820
+
1821
+ .sequential-pretest {
1822
+ margin: 0.85rem 0 0;
1823
+ padding: 0.65rem 0.85rem;
1824
+ background-color: var(--surface-soft);
1825
+ border: 1px solid var(--border);
1826
+ border-left: 4px solid var(--crew-daggoo);
1827
+ border-radius: 4px;
1828
+ font-size: 0.9rem;
1829
+ color: var(--text);
1830
+ }
1831
+
1832
+ .sequential-pretest:empty {
1833
+ display: none;
1834
+ }
1835
+
1836
+ .confusion-matrix.sequential-matrix {
1837
+ margin-top: 0.5rem;
1838
+ margin-bottom: 1rem;
1839
+ }
1840
+
1841
+ .sequential-results:empty {
1842
+ display: none;
1843
+ }
1844
+
1845
+ /* Prevalence sensitivity explorer */
1846
+ .prevalence-explorer {
1847
+ background-color: var(--surface);
1848
+ border: 2px solid var(--border);
1849
+ border-radius: 8px;
1850
+ padding: 1.25rem 1.5rem;
1851
+ margin-top: 1.5rem;
1852
+ }
1853
+
1854
+ .prevalence-explorer > summary {
1855
+ cursor: pointer;
1856
+ font-weight: 600;
1857
+ color: var(--text-strong);
1858
+ font-size: 1.05rem;
1859
+ line-height: 1.4;
1860
+ list-style: none;
1861
+ }
1862
+
1863
+ .prevalence-explorer > summary::-webkit-details-marker {
1864
+ display: none;
1865
+ }
1866
+
1867
+ .prevalence-explorer .help-text {
1868
+ margin: 0.75rem 0 1rem;
1869
+ }
1870
+
1871
+ .prevalence-controls {
1872
+ margin: 1rem 0 1.25rem;
1873
+ }
1874
+
1875
+ .prevalence-controls label {
1876
+ display: flex;
1877
+ justify-content: space-between;
1878
+ align-items: baseline;
1879
+ font-weight: 600;
1880
+ margin-bottom: 0.6rem;
1881
+ color: var(--text);
1882
+ }
1883
+
1884
+ .prevalence-controls output {
1885
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1886
+ font-variant-numeric: tabular-nums;
1887
+ color: var(--primary);
1888
+ font-weight: 700;
1889
+ font-size: 1.05rem;
1890
+ }
1891
+
1892
+ .prevalence-controls input[type="range"] {
1893
+ width: 100%;
1894
+ height: 1.5rem;
1895
+ -webkit-appearance: none;
1896
+ appearance: none;
1897
+ background: transparent;
1898
+ cursor: pointer;
1899
+ }
1900
+
1901
+ .prevalence-controls input[type="range"]::-webkit-slider-runnable-track {
1902
+ height: 6px;
1903
+ background: var(--log-150);
1904
+ border-radius: 3px;
1905
+ }
1906
+
1907
+ .prevalence-controls input[type="range"]::-webkit-slider-thumb {
1908
+ -webkit-appearance: none;
1909
+ appearance: none;
1910
+ width: 18px;
1911
+ height: 18px;
1912
+ background: var(--primary);
1913
+ border-radius: 50%;
1914
+ margin-top: -6px;
1915
+ cursor: pointer;
1916
+ transition: background-color 0.2s, transform 0.1s;
1917
+ }
1918
+
1919
+ .prevalence-controls input[type="range"]::-webkit-slider-thumb:hover {
1920
+ background: var(--crew-starbuck);
1921
+ transform: none;
1922
+ }
1923
+
1924
+ .prevalence-controls input[type="range"]::-moz-range-track {
1925
+ height: 6px;
1926
+ background: var(--log-150);
1927
+ border-radius: 3px;
1928
+ }
1929
+
1930
+ .prevalence-controls input[type="range"]::-moz-range-thumb {
1931
+ width: 18px;
1932
+ height: 18px;
1933
+ background: var(--primary);
1934
+ border: none;
1935
+ border-radius: 50%;
1936
+ cursor: pointer;
1937
+ }
1938
+
1939
+ /* :focus ring handled globally by the :focus-visible block near the top. */
1940
+
1941
+ .prevalence-readout {
1942
+ display: grid;
1943
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
1944
+ gap: 0.75rem;
1945
+ margin: 1rem 0 1.25rem;
1946
+ }
1947
+
1948
+ .prevalence-stat {
1949
+ background-color: var(--surface-soft);
1950
+ border: 1px solid var(--border);
1951
+ border-radius: 6px;
1952
+ padding: 0.65rem 0.85rem;
1953
+ display: flex;
1954
+ flex-direction: column;
1955
+ gap: 0.2rem;
1956
+ }
1957
+
1958
+ .prevalence-stat-label {
1959
+ font-size: 0.72rem;
1960
+ color: var(--text-muted);
1961
+ text-transform: uppercase;
1962
+ letter-spacing: 0.06em;
1963
+ font-weight: 600;
1964
+ }
1965
+
1966
+ .prevalence-stat-value {
1967
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1968
+ font-variant-numeric: tabular-nums;
1969
+ font-size: 1.2rem;
1970
+ font-weight: 700;
1971
+ color: var(--text);
1972
+ }
1973
+
1974
+ .prevalence-explorer canvas {
1975
+ width: 100%;
1976
+ max-width: 600px;
1977
+ height: 320px;
1978
+ border: 1px solid var(--log-150);
1979
+ border-radius: 4px;
1980
+ background: var(--bg);
1981
+ display: block;
1982
+ margin: 0 auto;
1983
+ }
1984
+
1985
+ /* ── Threshold explorer demo ────────────────────────────────────────────── */
1986
+
1987
+ .threshold-demo {
1988
+ background-color: var(--surface);
1989
+ border: 2px solid var(--border);
1990
+ border-radius: 8px;
1991
+ padding: 1.25rem 1.5rem;
1992
+ margin-top: 1.5rem;
1993
+ }
1994
+
1995
+ .threshold-demo > summary {
1996
+ cursor: pointer;
1997
+ font-weight: 600;
1998
+ color: var(--text-strong);
1999
+ font-size: 1.05rem;
2000
+ line-height: 1.4;
2001
+ list-style: none;
2002
+ }
2003
+
2004
+ .threshold-demo > summary::-webkit-details-marker {
2005
+ display: none;
2006
+ }
2007
+
2008
+ .threshold-demo .help-text {
2009
+ margin: 0.75rem 0 1rem;
2010
+ }
2011
+
2012
+ .threshold-demo canvas {
2013
+ width: 100%;
2014
+ max-width: 600px;
2015
+ height: 200px;
2016
+ border: 1px solid var(--log-150);
2017
+ border-radius: 4px;
2018
+ background: var(--bg);
2019
+ display: block;
2020
+ margin: 0 auto;
2021
+ }
2022
+
2023
+ .threshold-demo-controls {
2024
+ margin: 1rem 0 1.25rem;
2025
+ }
2026
+
2027
+ .threshold-demo-controls label {
2028
+ display: flex;
2029
+ justify-content: space-between;
2030
+ align-items: baseline;
2031
+ font-weight: 600;
2032
+ margin-bottom: 0.6rem;
2033
+ color: var(--text);
2034
+ }
2035
+
2036
+ .threshold-demo-controls output {
2037
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
2038
+ font-variant-numeric: tabular-nums;
2039
+ color: var(--primary);
2040
+ font-weight: 700;
2041
+ font-size: 1.05rem;
2042
+ }
2043
+
2044
+ .threshold-demo-controls input[type="range"] {
2045
+ width: 100%;
2046
+ height: 1.5rem;
2047
+ -webkit-appearance: none;
2048
+ appearance: none;
2049
+ background: transparent;
2050
+ cursor: pointer;
2051
+ }
2052
+
2053
+ .threshold-demo-controls input[type="range"]::-webkit-slider-runnable-track {
2054
+ height: 6px;
2055
+ background: var(--log-150);
2056
+ border-radius: 3px;
2057
+ }
2058
+
2059
+ .threshold-demo-controls input[type="range"]::-webkit-slider-thumb {
2060
+ -webkit-appearance: none;
2061
+ appearance: none;
2062
+ width: 18px;
2063
+ height: 18px;
2064
+ background: var(--primary);
2065
+ border-radius: 50%;
2066
+ margin-top: -6px;
2067
+ cursor: pointer;
2068
+ transition: background-color 0.2s, transform 0.1s;
2069
+ }
2070
+
2071
+ .threshold-demo-controls input[type="range"]::-webkit-slider-thumb:hover {
2072
+ background: var(--crew-starbuck);
2073
+ transform: none;
2074
+ }
2075
+
2076
+ .threshold-demo-controls input[type="range"]::-moz-range-track {
2077
+ height: 6px;
2078
+ background: var(--log-150);
2079
+ border-radius: 3px;
2080
+ }
2081
+
2082
+ .threshold-demo-controls input[type="range"]::-moz-range-thumb {
2083
+ width: 18px;
2084
+ height: 18px;
2085
+ background: var(--primary);
2086
+ border: none;
2087
+ border-radius: 50%;
2088
+ cursor: pointer;
2089
+ }
2090
+
2091
+ .threshold-demo-stats {
2092
+ display: grid;
2093
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
2094
+ gap: 0.75rem;
2095
+ margin: 1rem 0 1.25rem;
2096
+ }
2097
+
2098
+ .threshold-demo-stat {
2099
+ background-color: var(--surface-soft);
2100
+ border: 1px solid var(--border);
2101
+ border-radius: 6px;
2102
+ padding: 0.65rem 0.85rem;
2103
+ display: flex;
2104
+ flex-direction: column;
2105
+ gap: 0.2rem;
2106
+ }
2107
+
2108
+ .threshold-demo-stat-label {
2109
+ font-size: 0.72rem;
2110
+ color: var(--text-muted);
2111
+ text-transform: uppercase;
2112
+ letter-spacing: 0.06em;
2113
+ font-weight: 600;
2114
+ }
2115
+
2116
+ .threshold-demo-stat-value {
2117
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
2118
+ font-variant-numeric: tabular-nums;
2119
+ font-size: 1.2rem;
2120
+ font-weight: 700;
2121
+ color: var(--text);
2122
+ }
2123
+
2124
+ .threshold-demo-stat-sub {
2125
+ font-size: 0.68rem;
2126
+ color: var(--text-muted);
2127
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
2128
+ }
2129
+
2130
+ .threshold-demo-matrix {
2131
+ display: grid;
2132
+ grid-template-columns: 80px 1fr 1fr;
2133
+ grid-template-rows: 32px 1fr 1fr;
2134
+ gap: 1px;
2135
+ background: var(--border);
2136
+ border-radius: 6px;
2137
+ overflow: hidden;
2138
+ font-size: 0.85rem;
2139
+ margin: 1rem 0;
2140
+ }
2141
+
2142
+ .threshold-demo-cell {
2143
+ background: var(--surface);
2144
+ padding: 0.75rem;
2145
+ display: flex;
2146
+ flex-direction: column;
2147
+ justify-content: center;
2148
+ align-items: center;
2149
+ gap: 0.25rem;
2150
+ }
2151
+
2152
+ .threshold-demo-cell.head {
2153
+ background: var(--surface-soft);
2154
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
2155
+ font-size: 0.68rem;
2156
+ color: var(--text-muted);
2157
+ letter-spacing: 0.04em;
2158
+ text-transform: uppercase;
2159
+ }
2160
+
2161
+ .threshold-demo-cell-n {
2162
+ font-size: 1.4rem;
2163
+ font-weight: 700;
2164
+ font-variant-numeric: tabular-nums;
2165
+ color: var(--text);
2166
+ letter-spacing: -0.01em;
2167
+ }
2168
+
2169
+ .threshold-demo-cell.tp .threshold-demo-cell-n { color: var(--success); }
2170
+ .threshold-demo-cell.tn .threshold-demo-cell-n { color: var(--success); }
2171
+ .threshold-demo-cell.fp .threshold-demo-cell-n { color: var(--error); }
2172
+ .threshold-demo-cell.fn .threshold-demo-cell-n { color: var(--error); }
2173
+
2174
+ .threshold-demo-cell-meta {
2175
+ font-size: 0.68rem;
2176
+ color: var(--text-muted);
2177
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
2178
+ }
2179
+
2180
+ .threshold-demo-note {
2181
+ font-size: 0.85rem;
2182
+ color: var(--text);
2183
+ margin-top: 0.75rem;
2184
+ min-height: 2.2rem;
2185
+ line-height: 1.5;
2186
+ }
2187
+
2188
+ @media (prefers-reduced-motion: reduce) {
2189
+ .threshold-demo-controls input[type="range"]::-webkit-slider-thumb {
2190
+ transition: none;
2191
+ }
2192
+ }
2193
+
2194
+ /* References Section */
2195
+ .references {
2196
+ margin-top: 0;
2197
+ }
2198
+
2199
+ .references details {
2200
+ border: 2px solid var(--log-150);
2201
+ border-radius: 4px;
2202
+ padding: 1rem 1.25rem;
2203
+ margin-bottom: 1rem;
2204
+ background-color: var(--bg);
2205
+ }
2206
+
2207
+ .references summary {
2208
+ font-weight: 600;
2209
+ cursor: pointer;
2210
+ }
2211
+
2212
+ .reference-list {
2213
+ margin: 1rem 0 0;
2214
+ padding-left: 1.5rem;
2215
+ color: var(--text-muted);
2216
+ }
2217
+
2218
+ .reference-list li {
2219
+ margin-bottom: 0.75rem;
2220
+ line-height: 1.6;
2221
+ }
2222
+
2223
+ .reference-list strong {
2224
+ color: var(--text-strong);
2225
+ }
2226
+
2227
+ /* Tooltip */
2228
+ .tooltip {
2229
+ position: relative;
2230
+ display: inline-block;
2231
+ cursor: help;
2232
+ border-bottom: 1px dotted var(--log-400);
2233
+ }
2234
+
2235
+ .tooltip .tooltip-text {
2236
+ visibility: hidden;
2237
+ width: 280px;
2238
+ background-color: var(--log-950);
2239
+ color: var(--log-50);
2240
+ text-align: left;
639
2241
  border-radius: 6px;
640
2242
  padding: 0.75rem;
641
2243
  position: absolute;
@@ -647,7 +2249,7 @@ button:hover {
647
2249
  transition: opacity 0.3s;
648
2250
  font-size: 0.85rem;
649
2251
  line-height: 1.4;
650
- border: 2px solid var(--base-950);
2252
+ border: 2px solid var(--log-950);
651
2253
  }
652
2254
 
653
2255
  .tooltip .tooltip-text::after {
@@ -658,7 +2260,7 @@ button:hover {
658
2260
  margin-left: -5px;
659
2261
  border-width: 5px;
660
2262
  border-style: solid;
661
- border-color: var(--base-950) transparent transparent transparent;
2263
+ border-color: var(--log-950) transparent transparent transparent;
662
2264
  }
663
2265
 
664
2266
  .tooltip:hover .tooltip-text,
@@ -667,61 +2269,46 @@ button:hover {
667
2269
  opacity: 1;
668
2270
  }
669
2271
 
670
- /* Dark Mode */
2272
+ /* Dark mode */
671
2273
  [data-theme="dark"] {
672
- --base-100: #100F0F;
673
- --base-200: #1C1B1A;
674
- --base-300: #282726;
675
- --base-400: #343331;
676
- --base-500: #403E3C;
677
- --base-600: #575653;
678
- --base-700: #6F6E69;
679
- --base-800: #B7B5AC;
680
- --base-900: #CECDC3;
681
- --base-950: #E6E4D9;
682
- --base-1000: #FFFCF0;
683
-
684
- --red: #D14D41;
685
- --orange: #DA702C;
686
- --yellow: #D0A215;
687
- --green: #879A39;
688
- --cyan: #3AA99F;
689
- --blue: #4385BE;
690
- --purple: #8B7EC8;
691
- --magenta: #CE5D97;
692
-
693
- --primary-color: var(--blue);
694
- --primary-dark: #5a9cd6;
695
- --secondary-color: var(--cyan);
696
- --background-color: var(--base-100);
697
- --surface-color: var(--base-200);
698
- --border-color: var(--base-400);
699
- --text-color: var(--base-1000);
700
- --muted-text: var(--base-800);
701
- --success-color: var(--green);
702
- --accent-warm: var(--orange);
703
- --page-accent-cool: rgba(67, 133, 190, 0.14);
704
- --page-accent-warm: rgba(218, 112, 44, 0.08);
705
- --intro-gradient-end: rgba(28, 27, 26, 0.6);
706
- --panel-bg: rgba(28, 27, 26, 0.86);
707
- --panel-soft-bg: rgba(40, 39, 38, 0.9);
708
- --highlight-bg: rgba(28, 27, 26, 0.82);
709
- --matrix-bg: rgba(16, 15, 15, 0.82);
710
- --heading-strong: var(--text-color);
711
- --reference-bg: var(--base-300);
712
- --reference-text: var(--text-color);
713
- --reference-muted: var(--muted-text);
2274
+ /* Chart accents with contrast on dark surfaces. */
2275
+ --crew-ahab: #E08C8C; /* bacca red */
2276
+ --crew-starbuck: #8FD0FF; /* dies bright — info / focus ring */
2277
+ --crew-queequeg: #3D97FF; /* accent — primary action */
2278
+ --crew-pip: #DCB36A; /* copper — warning / threshold bands */
2279
+ --crew-ishmael: #ADB6BF; /* cinis — Glauca's exact dark muted (5.4:1) */
2280
+ --crew-stubb: #E0A878; /* copper — LR+ trace */
2281
+ --crew-tashtego: #7FC95F; /* folium bright — LR− / success */
2282
+ --crew-daggoo: #D3A26E; /* copper mid — sequential second-stage */
2283
+
2284
+ /* Semantic dark tokens. */
2285
+ --bg: var(--log-950);
2286
+ --surface: var(--log-900);
2287
+ --surface-soft: var(--bg);
2288
+ --button-ink: var(--log-950);
2289
+ --border: var(--log-700);
2290
+ --text: var(--log-100);
2291
+ --text-strong: var(--log-100);
2292
+ --text-muted: var(--crew-ishmael);
2293
+ --primary: var(--crew-queequeg);
2294
+ --primary-strong: var(--log-100);
2295
+ --secondary: var(--crew-starbuck);
2296
+ --success: var(--crew-tashtego);
2297
+ --warning: var(--crew-pip);
2298
+ --error: var(--crew-ahab);
2299
+ --accent-warm: var(--crew-stubb);
2300
+ --axis: var(--log-300);
714
2301
  }
715
2302
 
716
2303
  a {
717
- color: var(--primary-color);
2304
+ color: var(--primary);
718
2305
  text-decoration: none;
719
- border-bottom: 1px solid var(--base-400);
2306
+ border-bottom: 1px solid var(--border);
720
2307
  }
721
2308
 
722
2309
  a:hover {
723
- color: var(--primary-dark);
724
- border-bottom-color: var(--primary-dark);
2310
+ color: var(--primary-strong);
2311
+ border-bottom-color: var(--primary-strong);
725
2312
  }
726
2313
 
727
2314
  @media (max-width: 720px) {
@@ -736,29 +2323,19 @@ a:hover {
736
2323
  margin-bottom: 1rem;
737
2324
  }
738
2325
 
2326
+ /* Keep the matrix as a 3-column grid on mobile (narrow label column +
2327
+ two flex input columns). Earlier rules collapsed to 2 columns and
2328
+ hid the row labels — users lost the Test +/Test − context entirely. */
739
2329
  .grid-container {
740
- grid-template-columns: repeat(2, minmax(120px, 1fr));
741
- gap: 0.5rem;
2330
+ grid-template-columns: 56px repeat(2, minmax(0, 1fr));
2331
+ gap: 0.4rem;
742
2332
  }
743
2333
 
744
2334
  .grid-header,
745
2335
  .grid-label {
746
- font-size: 0.9rem;
747
- padding: 0.6rem;
748
- }
749
-
750
- .grid-container .empty {
751
- display: none;
752
- }
753
-
754
- .grid-container span:nth-child(2),
755
- .grid-container span:nth-child(3) {
756
- grid-column: span 1;
757
- }
758
-
759
- .grid-container label,
760
- .grid-container .grid-item {
761
- grid-column: span 1;
2336
+ font-size: var(--text-xs);
2337
+ padding: 0.4rem;
2338
+ line-height: 1.2;
762
2339
  }
763
2340
 
764
2341
  .form-actions {
@@ -806,6 +2383,245 @@ a:hover {
806
2383
  }
807
2384
  }
808
2385
 
2386
+ @media print {
2387
+ /* Force a clean light theme regardless of the user's current setting */
2388
+ :root,
2389
+ [data-theme="dark"] {
2390
+ --bg: #FFFFFF;
2391
+ --surface: #FFFFFF;
2392
+ --surface-soft: #FFFFFF;
2393
+ --text: #000000;
2394
+ --text-strong: #000000;
2395
+ --text-muted: #444444;
2396
+ --border: #999999;
2397
+ }
2398
+
2399
+ @page {
2400
+ size: A4 portrait;
2401
+ margin: 14mm;
2402
+ }
2403
+
2404
+ body {
2405
+ background-image: none !important;
2406
+ color: #000;
2407
+ font-size: 10pt;
2408
+ line-height: 1.4;
2409
+ }
2410
+
2411
+ .container {
2412
+ width: 100%;
2413
+ padding: 0;
2414
+ }
2415
+
2416
+ /* Hide everything interactive or not essential for the handout */
2417
+ .theme-toggle,
2418
+ .header-controls,
2419
+ .form-actions,
2420
+ .feedback,
2421
+ .advanced-settings,
2422
+ .secondary,
2423
+ button,
2424
+ .results-actions,
2425
+ .bias-warnings,
2426
+ #prevalenceExplorer,
2427
+ #sequentialTest,
2428
+ #thresholdPanel,
2429
+ #rocPanel,
2430
+ #historyPanel,
2431
+ .kappa-panel,
2432
+ .interpretation,
2433
+ .stard-panel,
2434
+ .dataset-reference,
2435
+ #datasetSelect,
2436
+ label[for="datasetSelect"],
2437
+ #dataset-help,
2438
+ footer,
2439
+ script {
2440
+ display: none !important;
2441
+ }
2442
+
2443
+ /* Show the form values but as a printable summary, not the inputs */
2444
+ .workspace {
2445
+ display: block;
2446
+ }
2447
+
2448
+ /* Style inputs as static printable text */
2449
+ .grid-item input,
2450
+ .preTestProb,
2451
+ select {
2452
+ border: 1px solid #999 !important;
2453
+ background: #FFF !important;
2454
+ color: #000 !important;
2455
+ box-shadow: none !important;
2456
+ -webkit-appearance: none;
2457
+ appearance: none;
2458
+ padding: 0.3rem 0.5rem;
2459
+ }
2460
+
2461
+ .grid-header {
2462
+ background: #000 !important;
2463
+ color: #FFF !important;
2464
+ }
2465
+
2466
+ .grid-label {
2467
+ background: #444 !important;
2468
+ color: #FFF !important;
2469
+ }
2470
+
2471
+ /* Force collapsibles open so their content prints */
2472
+ details {
2473
+ display: block !important;
2474
+ }
2475
+
2476
+ details > *:not(summary) {
2477
+ display: revert !important;
2478
+ }
2479
+
2480
+ details summary {
2481
+ list-style: none;
2482
+ cursor: default;
2483
+ font-weight: 700;
2484
+ margin-bottom: 0.4rem;
2485
+ }
2486
+
2487
+ .panel {
2488
+ background: transparent;
2489
+ border: none;
2490
+ padding: 0;
2491
+ backdrop-filter: none;
2492
+ page-break-inside: avoid;
2493
+ }
2494
+
2495
+ .panel-results {
2496
+ margin-top: 1rem;
2497
+ }
2498
+
2499
+ .intro {
2500
+ border-bottom: 1px solid #000;
2501
+ background: transparent;
2502
+ }
2503
+
2504
+ .intro .container {
2505
+ padding: 0 0 0.5rem;
2506
+ }
2507
+
2508
+ .intro-highlights {
2509
+ display: none;
2510
+ }
2511
+
2512
+ h1 {
2513
+ font-size: 18pt;
2514
+ margin: 0 0 0.25rem;
2515
+ }
2516
+
2517
+ h2 {
2518
+ font-size: 13pt;
2519
+ margin: 1rem 0 0.5rem;
2520
+ }
2521
+
2522
+ .lead,
2523
+ .tag,
2524
+ .panel-kicker {
2525
+ display: none;
2526
+ }
2527
+
2528
+ .results-headline,
2529
+ .results-secondary {
2530
+ display: grid;
2531
+ grid-template-columns: repeat(4, 1fr);
2532
+ gap: 0.4rem;
2533
+ margin-bottom: 0.5rem;
2534
+ }
2535
+
2536
+ .results-secondary {
2537
+ grid-template-columns: repeat(3, 1fr);
2538
+ }
2539
+
2540
+ .result-card {
2541
+ background: #FFFFFF;
2542
+ border: 1px solid #BBB;
2543
+ padding: 0.4rem 0.6rem;
2544
+ page-break-inside: avoid;
2545
+ box-shadow: none;
2546
+ }
2547
+
2548
+ .result-card h3 {
2549
+ font-size: 8pt;
2550
+ color: #000;
2551
+ }
2552
+
2553
+ .result-card--lg .result-value {
2554
+ font-size: 13pt;
2555
+ }
2556
+
2557
+ .result-value {
2558
+ font-size: 11pt;
2559
+ }
2560
+
2561
+ .result-ci,
2562
+ .result-note {
2563
+ color: #333;
2564
+ font-size: 8.5pt;
2565
+ }
2566
+
2567
+ .bayesian-update {
2568
+ page-break-inside: avoid;
2569
+ background: #FFF;
2570
+ border: 1px solid #BBB;
2571
+ padding: 0.4rem 0.6rem;
2572
+ margin: 0.4rem 0;
2573
+ }
2574
+
2575
+ .bayesian-axis-trail { background: #444 !important; }
2576
+ .bayesian-axis-pre { background: #FFF; border-color: #444; }
2577
+ .bayesian-axis-post { background: #000 !important; border-color: #FFF; }
2578
+ .bayesian-axis-pre-label, .bayesian-axis-post-label { color: #000; }
2579
+
2580
+ .result-bar { background: #EEE; border-color: #CCC; }
2581
+ .result-bar-fill { background: #444 !important; }
2582
+
2583
+ .result-band { border-color: #CCC; }
2584
+ .result-band-zone { background: #EEE !important; }
2585
+ .result-band-marker { background: #000 !important; border-color: #FFF; }
2586
+
2587
+ .fagan-nomogram {
2588
+ page-break-inside: avoid;
2589
+ background: #FFF;
2590
+ border: 1px solid #BBB;
2591
+ }
2592
+
2593
+ .fagan-summary {
2594
+ background: #FFF;
2595
+ border: 1px solid #BBB;
2596
+ }
2597
+
2598
+ .references {
2599
+ page-break-before: auto;
2600
+ }
2601
+
2602
+ .references details {
2603
+ background: transparent;
2604
+ border: 1px solid #DDD;
2605
+ }
2606
+
2607
+ .references details[open] summary {
2608
+ margin-bottom: 0.5rem;
2609
+ }
2610
+
2611
+ a {
2612
+ color: #000;
2613
+ border-bottom: none;
2614
+ text-decoration: none;
2615
+ }
2616
+
2617
+ a[href^="http"]::after {
2618
+ content: " (" attr(href) ")";
2619
+ font-size: 8pt;
2620
+ color: #555;
2621
+ word-break: break-all;
2622
+ }
2623
+ }
2624
+
809
2625
  @media (prefers-reduced-motion: reduce) {
810
2626
  *,
811
2627
  *::before,
@@ -816,3 +2632,93 @@ a:hover {
816
2632
  scroll-behavior: auto !important;
817
2633
  }
818
2634
  }
2635
+
2636
+ /* Fluid dimensions apply to charts and matrix tracks at every viewport. */
2637
+ *, *::before, *::after { box-sizing: border-box; }
2638
+ .panel, details, fieldset, .grid-container, .grid-item, .roc-table-wrapper { min-width: 0; }
2639
+ input, select { max-width: 100%; }
2640
+ .fagan-nomogram canvas, .prevalence-explorer canvas {
2641
+ display: block;
2642
+ width: 100%;
2643
+ max-width: 600px;
2644
+ height: auto;
2645
+ aspect-ratio: 3 / 2;
2646
+ margin-inline: auto;
2647
+ }
2648
+ .threshold-demo canvas {
2649
+ display: block;
2650
+ width: 100%;
2651
+ height: auto;
2652
+ aspect-ratio: 3 / 1;
2653
+ }
2654
+
2655
+ /* Clinical reference layout: restrained surfaces, short headings, clear rules. */
2656
+ @media screen {
2657
+ .container { width: min(1280px, calc(100% - 48px)); }
2658
+ .workspace { grid-template-columns: minmax(0, 1fr); gap: 32px; }
2659
+ .panel-results { position: static; }
2660
+ .panel-heading { margin-bottom: 0; }
2661
+ .panel-heading h2 { margin-top: 0; line-height: 1.3; }
2662
+ .panel-kicker { color: var(--text-muted); letter-spacing: 0.04em; }
2663
+ .panel-kicker:empty { display: none; }
2664
+ .help-text { line-height: 1.6; }
2665
+ button { min-height: 44px; padding: 10px 16px; color: var(--button-ink); }
2666
+ button.secondary { color: var(--text); }
2667
+ .theme-toggle { min-height: 40px; }
2668
+ .grid-container { gap: 8px; }
2669
+ .grid-header { background: var(--surface); color: var(--text); padding: 10px 6px; font-size: 0.875rem; }
2670
+ .grid-label { background: transparent; color: var(--text); padding: 8px 4px; font-size: 0.875rem; }
2671
+ .grid-item { padding: 0; border: 0; background: transparent; }
2672
+ .grid-item input { min-width: 0; min-height: 48px; padding: 10px 8px; font-family: inherit; text-align: center; }
2673
+ .confusion-matrix { padding: 16px 12px; }
2674
+ .confusion-matrix legend { padding: 0 4px; font-size: 0.875rem; }
2675
+ .form-actions { gap: 8px; }
2676
+ .results-headline { gap: 24px 16px; grid-template-columns: repeat(2, minmax(0, 1fr)); }
2677
+ .result-value { font-family: inherit; font-weight: 650; }
2678
+ .result-card h3 { min-height: 2.8em; }
2679
+ .result-note, .result-ci { font-size: 0.8125rem; line-height: 1.5; }
2680
+ .result-card--lg .result-value { font-size: 1.875rem; }
2681
+ .fagan-nomogram { padding: 20px 16px; background: transparent; border: 1px solid var(--border); border-radius: 4px; margin: 0; }
2682
+ .fagan-summary { grid-template-columns: repeat(auto-fit, minmax(90px, 1fr)); }
2683
+ .fagan-nomogram canvas { border: 0; }
2684
+ .panel-results > details { margin: 0; padding: 16px; border: 1px solid var(--border); border-radius: 4px; background: transparent; }
2685
+ .panel-results > details > summary { font-size: 1rem; }
2686
+ .advanced-settings { border-style: solid; }
2687
+ .advanced-settings > summary { text-transform: none; letter-spacing: 0; }
2688
+ .dataset-reference { border-left-width: 2px; padding: 12px; font-size: 0.8125rem; }
2689
+ .resource-grid { grid-template-columns: minmax(0, 1fr); gap: 40px; margin-top: 48px; padding-top: 32px; border-top: 1px solid var(--border); }
2690
+ .resource-grid > section { padding: 0; }
2691
+ .resource-grid h2 { margin-top: 0; font-size: 1.375rem; line-height: 1.3; }
2692
+ .resource-grid p { max-width: 65ch; }
2693
+ .resource-grid details { padding: 12px 0; border: 0; border-top: 1px solid var(--border); border-radius: 0; background: transparent; margin: 0; }
2694
+ .resource-grid details:last-child { border-bottom: 1px solid var(--border); }
2695
+ .resource-grid summary { font-size: 1rem; font-weight: 600; line-height: 1.5; }
2696
+ .resource-grid details p { font-size: 0.9375rem; margin-top: 12px; }
2697
+ .kappa-panel .panel-kicker, .stard-panel .panel-kicker { color: var(--text-muted); }
2698
+ .kappa-matrix { margin: 0; }
2699
+ .kappa-panel .form-actions { margin-top: 12px; margin-bottom: 0; }
2700
+ .kappa-stat { background: transparent; border: 0; border-top: 1px solid var(--border); border-radius: 0; padding: 12px 0; }
2701
+ .about-panel .about-grid { grid-template-columns: minmax(0, 1fr); gap: 0; }
2702
+ .about-card { background: transparent; border: 0; border-top: 1px solid var(--border); border-radius: 0; padding: 16px 0; }
2703
+ .about-card h3 { font-size: 1rem; }
2704
+ footer { text-align: left; max-width: 1280px; margin: 48px auto 0; padding: 24px; }
2705
+ footer .privacy-note { padding: 0; border: 0; background: transparent; }
2706
+ }
2707
+ @media screen and (min-width: 960px) {
2708
+ .workspace { grid-template-columns: minmax(320px, 33%) minmax(0, 1fr); }
2709
+ .results-headline { grid-template-columns: repeat(4, minmax(0, 1fr)); }
2710
+ .resource-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 48px; }
2711
+ .kappa-panel { grid-column: 1 / -1; display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); column-gap: 48px; align-items: start; }
2712
+ .kappa-panel .panel-heading { grid-column: 1; grid-row: 1 / 3; }
2713
+ .kappa-matrix, .kappa-panel .form-actions { grid-column: 2; }
2714
+ .kappa-result { grid-column: 1 / -1; }
2715
+ }
2716
+ @media screen and (max-width: 600px) {
2717
+ .container { width: calc(100% - 32px); }
2718
+ .panel { padding: 16px 0; }
2719
+ .resource-grid { gap: 32px; }
2720
+ .app-bar-inner { gap: 8px; }
2721
+ .app-bar-case { max-width: 100%; }
2722
+ .bayesian-row { font-size: 0.8125rem; }
2723
+ .roc-table-wrapper { overflow-x: auto; }
2724
+ }