diagcalc 3.2.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 ADDED
@@ -0,0 +1,789 @@
1
+ :root {
2
+ font-family: "JetBrains Mono", monospace;
3
+ 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
+ }
38
+
39
+ body {
40
+ font-family: "JetBrains Mono", monospace;
41
+ background-color: var(--background-color);
42
+ background-image: radial-gradient(circle at top left, rgba(32, 94, 166, 0.08), transparent 30%), linear-gradient(180deg, rgba(188, 82, 21, 0.05), transparent 22%);
43
+ color: var(--text-color);
44
+ margin: 0;
45
+ padding: 0;
46
+ line-height: 1.6;
47
+ transition: background-color 0.3s ease, color 0.3s ease;
48
+ }
49
+
50
+ .container {
51
+ width: min(1380px, 94vw);
52
+ margin: 0 auto;
53
+ padding: 2.5rem 0;
54
+ }
55
+
56
+ footer {
57
+ font-size: 0.85em;
58
+ text-align: center;
59
+ padding: 1.5em;
60
+ margin-top: 3em;
61
+ background-color: transparent;
62
+ border-top: 1px solid var(--border-color);
63
+ color: var(--muted-text);
64
+ }
65
+
66
+ .intro {
67
+ background: linear-gradient(180deg, var(--surface-color), rgba(230, 228, 217, 0.4));
68
+ border-bottom: 2px solid var(--base-300);
69
+ }
70
+
71
+ .intro .container {
72
+ padding: 3.5rem 0 2.5rem;
73
+ position: relative;
74
+ }
75
+
76
+ .header-controls {
77
+ position: absolute;
78
+ top: 1rem;
79
+ right: 0;
80
+ display: flex;
81
+ gap: 0.5rem;
82
+ }
83
+
84
+ .theme-toggle {
85
+ width: auto;
86
+ padding: 0.5rem 1rem;
87
+ background: var(--base-300);
88
+ color: var(--text-color);
89
+ border: 2px solid var(--border-color);
90
+ border-radius: 4px;
91
+ cursor: pointer;
92
+ font-size: 1.2rem;
93
+ transition: background-color 0.2s;
94
+ }
95
+
96
+ .theme-toggle:hover {
97
+ background-color: var(--base-400);
98
+ }
99
+
100
+ h1 {
101
+ font-size: clamp(2rem, 5vw, 2.8rem);
102
+ margin: 0.25rem 0 0.75rem;
103
+ text-align: center;
104
+ }
105
+
106
+ h2 {
107
+ font-size: clamp(1.4rem, 2.5vw, 1.75rem);
108
+ margin-bottom: 1rem;
109
+ color: var(--text-color);
110
+ }
111
+
112
+ .tag {
113
+ display: inline-block;
114
+ padding: 0.35rem 0.75rem;
115
+ border-radius: 4px;
116
+ text-transform: uppercase;
117
+ letter-spacing: 0.08em;
118
+ font-size: 0.7rem;
119
+ background-color: var(--base-300);
120
+ color: var(--base-800);
121
+ margin: 0 auto;
122
+ }
123
+
124
+ .lead {
125
+ font-size: 1.1rem;
126
+ text-align: center;
127
+ max-width: 720px;
128
+ margin: 0 auto 2.5rem;
129
+ color: var(--muted-text);
130
+ }
131
+
132
+ .intro-highlights {
133
+ display: grid;
134
+ grid-template-columns: repeat(3, minmax(0, 1fr));
135
+ gap: 1rem;
136
+ }
137
+
138
+ .highlight {
139
+ background-color: rgba(255, 252, 240, 0.66);
140
+ border: 2px solid var(--border-color);
141
+ border-radius: 8px;
142
+ padding: 1.25rem;
143
+ box-shadow: none;
144
+ }
145
+
146
+ .highlight h2 {
147
+ margin-top: 0;
148
+ font-size: 1.15rem;
149
+ }
150
+
151
+ .highlight p {
152
+ margin-bottom: 0;
153
+ color: var(--muted-text);
154
+ }
155
+
156
+ .workspace {
157
+ display: grid;
158
+ grid-template-columns: 1fr;
159
+ gap: 1rem;
160
+ align-items: start;
161
+ }
162
+
163
+ .panel {
164
+ background-color: rgba(242, 240, 229, 0.8);
165
+ border: 2px solid var(--border-color);
166
+ border-radius: 10px;
167
+ padding: 1.35rem;
168
+ backdrop-filter: blur(10px);
169
+ }
170
+
171
+ .panel-heading {
172
+ margin-bottom: 1.25rem;
173
+ }
174
+
175
+ .panel-heading-inline {
176
+ display: flex;
177
+ justify-content: space-between;
178
+ gap: 1rem;
179
+ align-items: flex-start;
180
+ }
181
+
182
+ .panel-kicker {
183
+ margin: 0 0 0.35rem;
184
+ font-size: 0.74rem;
185
+ letter-spacing: 0.08em;
186
+ text-transform: uppercase;
187
+ color: var(--muted-text);
188
+ }
189
+
190
+ .resource-grid {
191
+ display: grid;
192
+ grid-template-columns: 1fr;
193
+ gap: 1rem;
194
+ margin-top: 1rem;
195
+ }
196
+
197
+ .section-heading {
198
+ margin-bottom: 2rem;
199
+ }
200
+
201
+ .section-heading p {
202
+ color: var(--muted-text);
203
+ max-width: 640px;
204
+ }
205
+
206
+ form {
207
+ background-color: transparent;
208
+ border-radius: 8px;
209
+ padding: 0;
210
+ box-shadow: none;
211
+ border: none;
212
+ }
213
+
214
+ .form-row {
215
+ display: grid;
216
+ gap: 0.75rem;
217
+ margin-bottom: 1.75rem;
218
+ }
219
+
220
+ .form-row label {
221
+ font-weight: 600;
222
+ }
223
+
224
+ .full {
225
+ width: 100%;
226
+ }
227
+
228
+ select {
229
+ padding: 0.85rem 1rem;
230
+ border: 2px solid var(--border-color);
231
+ border-radius: 4px;
232
+ background-color: var(--background-color);
233
+ color: var(--text-color);
234
+ font-size: 1rem;
235
+ transition: border-color 0.2s;
236
+ cursor: pointer;
237
+ }
238
+
239
+ select:focus {
240
+ border-color: var(--primary-color);
241
+ outline: none;
242
+ }
243
+
244
+ optgroup {
245
+ font-weight: 600;
246
+ color: var(--base-900);
247
+ font-style: normal;
248
+ }
249
+
250
+ option {
251
+ padding: 0.5rem;
252
+ color: var(--text-color);
253
+ }
254
+
255
+ .help-text {
256
+ margin: 0;
257
+ font-size: 0.9rem;
258
+ color: var(--muted-text);
259
+ }
260
+
261
+ .confusion-matrix {
262
+ border: 2px solid var(--base-300);
263
+ border-radius: 8px;
264
+ padding: 1.25rem;
265
+ margin: 0 0 2rem;
266
+ background-color: rgba(255, 252, 240, 0.9);
267
+ }
268
+
269
+ .confusion-matrix legend {
270
+ font-weight: 600;
271
+ padding: 0 0.75rem;
272
+ }
273
+
274
+ .grid-container {
275
+ display: grid;
276
+ grid-template-columns: 92px repeat(2, minmax(120px, 1fr));
277
+ gap: 0.75rem;
278
+ align-items: stretch;
279
+ }
280
+
281
+ .grid-header {
282
+ text-align: center;
283
+ padding: 0.75rem;
284
+ border-radius: 4px;
285
+ font-weight: 600;
286
+ color: var(--background-color);
287
+ background: linear-gradient(180deg, var(--primary-color), var(--primary-dark));
288
+ }
289
+
290
+ .grid-label {
291
+ display: flex;
292
+ justify-content: center;
293
+ align-items: center;
294
+ padding: 0.75rem;
295
+ border-radius: 4px;
296
+ font-weight: 600;
297
+ color: var(--background-color);
298
+ background: linear-gradient(180deg, var(--secondary-color), var(--cyan));
299
+ text-align: center;
300
+ }
301
+
302
+ .grid-item {
303
+ text-align: center;
304
+ padding: 0.75rem;
305
+ background-color: var(--background-color);
306
+ border-radius: 4px;
307
+ border: 2px solid var(--border-color);
308
+ box-shadow: none;
309
+ transition: border-color 0.2s ease;
310
+ }
311
+
312
+ .grid-item:hover {
313
+ border-color: var(--base-600);
314
+ }
315
+
316
+ /* Input Styling */
317
+ .grid-item input,
318
+ .preTestProb {
319
+ width: 100%;
320
+ padding: 0.85rem 1rem;
321
+ margin: 0;
322
+ border: 2px solid var(--border-color);
323
+ border-radius: 4px;
324
+ box-sizing: border-box;
325
+ transition: border-color 0.2s;
326
+ font-size: 1rem;
327
+ font-family: inherit;
328
+ background-color: var(--background-color);
329
+ }
330
+
331
+ .grid-item input:focus,
332
+ .preTestProb:focus {
333
+ border-color: var(--primary-color);
334
+ outline: none;
335
+ box-shadow: none;
336
+ }
337
+
338
+ /* Button Styles */
339
+ button {
340
+ width: 100%;
341
+ background: var(--primary-color);
342
+ color: var(--background-color);
343
+ padding: 0.9rem;
344
+ border: none;
345
+ border-radius: 4px;
346
+ cursor: pointer;
347
+ font-size: 1em;
348
+ font-family: inherit;
349
+ font-weight: 600;
350
+ transition: background-color 0.2s;
351
+ }
352
+
353
+ button:hover {
354
+ background-color: var(--primary-dark);
355
+ transform: none;
356
+ box-shadow: none;
357
+ }
358
+
359
+ .secondary {
360
+ background: transparent;
361
+ color: var(--base-800);
362
+ border: 2px solid var(--border-color);
363
+ box-shadow: none;
364
+ }
365
+
366
+ .secondary:hover {
367
+ background-color: var(--base-300);
368
+ border-color: var(--base-500);
369
+ box-shadow: none;
370
+ }
371
+
372
+ .form-actions {
373
+ display: grid;
374
+ grid-template-columns: repeat(2, minmax(0, 1fr));
375
+ gap: 1rem;
376
+ margin-bottom: 1.5rem;
377
+ }
378
+
379
+ .feedback {
380
+ min-height: 1.25rem;
381
+ font-weight: 600;
382
+ }
383
+
384
+ .feedback.success {
385
+ color: var(--success-color);
386
+ }
387
+
388
+ .feedback.error {
389
+ color: var(--primary-dark);
390
+ }
391
+
392
+ .results-section {
393
+ margin-top: 0;
394
+ }
395
+
396
+ .results-actions {
397
+ display: flex;
398
+ justify-content: flex-end;
399
+ margin: 0;
400
+ }
401
+
402
+ .results-grid {
403
+ display: grid;
404
+ grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
405
+ gap: 1rem;
406
+ margin-top: 1rem;
407
+ }
408
+
409
+ .probability-chart {
410
+ background-color: rgba(255, 252, 240, 0.82);
411
+ border-radius: 8px;
412
+ padding: 1.5rem;
413
+ border: 2px solid var(--border-color);
414
+ box-shadow: none;
415
+ display: grid;
416
+ gap: 1rem;
417
+ }
418
+
419
+ .probability-chart:empty {
420
+ display: none;
421
+ }
422
+
423
+ .chart-row {
424
+ display: grid;
425
+ grid-template-columns: 120px 1fr 70px;
426
+ align-items: center;
427
+ gap: 1rem;
428
+ font-size: 0.95rem;
429
+ }
430
+
431
+ .chart-label {
432
+ font-weight: 600;
433
+ color: var(--muted-text);
434
+ }
435
+
436
+ .chart-bar {
437
+ position: relative;
438
+ height: 16px;
439
+ background-color: var(--base-300);
440
+ border-radius: 2px;
441
+ overflow: hidden;
442
+ }
443
+
444
+ .chart-fill {
445
+ position: absolute;
446
+ inset: 0;
447
+ background: var(--primary-color);
448
+ border-radius: 2px;
449
+ transform-origin: left center;
450
+ transform: scaleX(0);
451
+ transition: transform 0.4s ease-in-out;
452
+ }
453
+
454
+ .chart-fill.positive {
455
+ background: var(--accent-warm);
456
+ }
457
+
458
+ .chart-fill.negative {
459
+ background: var(--success-color);
460
+ }
461
+
462
+ .chart-value {
463
+ font-variant-numeric: tabular-nums;
464
+ font-weight: 600;
465
+ }
466
+
467
+ .result-card {
468
+ background-color: rgba(255, 252, 240, 0.82);
469
+ border-radius: 8px;
470
+ padding: 1.5rem;
471
+ border: 2px solid var(--border-color);
472
+ box-shadow: none;
473
+ display: flex;
474
+ flex-direction: column;
475
+ gap: 0.5rem;
476
+ }
477
+
478
+ .result-card h3 {
479
+ margin: 0;
480
+ font-size: 1.05rem;
481
+ color: var(--base-900);
482
+ }
483
+
484
+ .result-value {
485
+ font-size: 1.9rem;
486
+ font-weight: 700;
487
+ }
488
+
489
+ .result-ci {
490
+ font-size: 0.9rem;
491
+ color: var(--muted-text);
492
+ }
493
+
494
+ .result-note {
495
+ margin-top: auto;
496
+ font-size: 0.85rem;
497
+ color: var(--muted-text);
498
+ }
499
+
500
+ .interpretation {
501
+ margin-top: 0;
502
+ }
503
+
504
+ .interpretation details {
505
+ border: 2px solid var(--base-300);
506
+ border-radius: 4px;
507
+ padding: 1rem 1.25rem;
508
+ margin-bottom: 1rem;
509
+ background-color: var(--background-color);
510
+ }
511
+
512
+ .interpretation summary {
513
+ font-weight: 600;
514
+ cursor: pointer;
515
+ }
516
+
517
+ .interpretation p {
518
+ margin: 0.5rem 0 0;
519
+ color: var(--muted-text);
520
+ }
521
+
522
+ /* Dataset Reference */
523
+ .dataset-reference {
524
+ margin-top: 1rem;
525
+ padding: 1rem;
526
+ background-color: var(--base-300);
527
+ border-left: 4px solid var(--primary-color);
528
+ border-radius: 4px;
529
+ font-size: 0.9rem;
530
+ }
531
+
532
+ .dataset-reference h4 {
533
+ margin: 0 0 0.5rem;
534
+ font-size: 0.95rem;
535
+ color: var(--base-900);
536
+ }
537
+
538
+ .dataset-reference p {
539
+ margin: 0.25rem 0;
540
+ color: var(--base-800);
541
+ }
542
+
543
+ .dataset-reference .reference-citation {
544
+ font-style: italic;
545
+ color: var(--base-700);
546
+ margin-top: 0.5rem;
547
+ }
548
+
549
+ /* Fagan Nomogram */
550
+ .fagan-nomogram {
551
+ background-color: var(--surface-color);
552
+ border-radius: 8px;
553
+ padding: 1.5rem;
554
+ border: 2px solid var(--border-color);
555
+ margin-bottom: 1.5rem;
556
+ text-align: center;
557
+ }
558
+
559
+ .fagan-nomogram h3 {
560
+ margin: 0 0 0.5rem;
561
+ font-size: 1.2rem;
562
+ color: var(--base-900);
563
+ }
564
+
565
+ .fagan-nomogram canvas {
566
+ max-width: 100%;
567
+ width: 600px;
568
+ height: 400px;
569
+ margin-top: 1rem;
570
+ border: 1px solid var(--base-300);
571
+ border-radius: 4px;
572
+ }
573
+
574
+ /* References Section */
575
+ .references {
576
+ margin-top: 0;
577
+ }
578
+
579
+ .references details {
580
+ border: 2px solid var(--base-300);
581
+ border-radius: 4px;
582
+ padding: 1rem 1.25rem;
583
+ margin-bottom: 1rem;
584
+ background-color: var(--background-color);
585
+ }
586
+
587
+ .references summary {
588
+ font-weight: 600;
589
+ cursor: pointer;
590
+ }
591
+
592
+ .reference-list {
593
+ margin: 1rem 0 0;
594
+ padding-left: 1.5rem;
595
+ color: var(--base-800);
596
+ }
597
+
598
+ .reference-list li {
599
+ margin-bottom: 0.75rem;
600
+ line-height: 1.6;
601
+ }
602
+
603
+ .reference-list strong {
604
+ color: var(--base-900);
605
+ }
606
+
607
+ /* Tooltip */
608
+ .tooltip {
609
+ position: relative;
610
+ display: inline-block;
611
+ cursor: help;
612
+ border-bottom: 1px dotted var(--base-600);
613
+ }
614
+
615
+ .tooltip .tooltip-text {
616
+ visibility: hidden;
617
+ width: 280px;
618
+ background-color: var(--base-950);
619
+ color: var(--base-100);
620
+ text-align: left;
621
+ border-radius: 6px;
622
+ padding: 0.75rem;
623
+ position: absolute;
624
+ z-index: 1000;
625
+ bottom: 125%;
626
+ left: 50%;
627
+ margin-left: -140px;
628
+ opacity: 0;
629
+ transition: opacity 0.3s;
630
+ font-size: 0.85rem;
631
+ line-height: 1.4;
632
+ border: 2px solid var(--base-950);
633
+ }
634
+
635
+ .tooltip .tooltip-text::after {
636
+ content: "";
637
+ position: absolute;
638
+ top: 100%;
639
+ left: 50%;
640
+ margin-left: -5px;
641
+ border-width: 5px;
642
+ border-style: solid;
643
+ border-color: var(--base-950) transparent transparent transparent;
644
+ }
645
+
646
+ .tooltip:hover .tooltip-text,
647
+ .tooltip:focus .tooltip-text {
648
+ visibility: visible;
649
+ opacity: 1;
650
+ }
651
+
652
+ /* Dark Mode */
653
+ [data-theme="dark"] {
654
+ --base-100: #100F0F;
655
+ --base-200: #1C1B1A;
656
+ --base-300: #282726;
657
+ --base-400: #343331;
658
+ --base-500: #403E3C;
659
+ --base-600: #575653;
660
+ --base-700: #6F6E69;
661
+ --base-800: #B7B5AC;
662
+ --base-900: #CECDC3;
663
+ --base-950: #E6E4D9;
664
+ --base-1000: #FFFCF0;
665
+
666
+ --red: #D14D41;
667
+ --orange: #DA702C;
668
+ --yellow: #D0A215;
669
+ --green: #879A39;
670
+ --cyan: #3AA99F;
671
+ --blue: #4385BE;
672
+ --purple: #8B7EC8;
673
+ --magenta: #CE5D97;
674
+
675
+ --primary-color: var(--blue);
676
+ --primary-dark: #5a9cd6;
677
+ --secondary-color: var(--cyan);
678
+ --background-color: var(--base-100);
679
+ --surface-color: var(--base-200);
680
+ --border-color: var(--base-400);
681
+ --text-color: var(--base-1000);
682
+ --muted-text: var(--base-800);
683
+ --success-color: var(--green);
684
+ --accent-warm: var(--orange);
685
+ }
686
+
687
+ a {
688
+ color: var(--primary-color);
689
+ text-decoration: none;
690
+ border-bottom: 1px solid var(--base-400);
691
+ }
692
+
693
+ a:hover {
694
+ color: var(--primary-dark);
695
+ border-bottom-color: var(--primary-dark);
696
+ }
697
+
698
+ @media (max-width: 720px) {
699
+ .workspace,
700
+ .resource-grid {
701
+ grid-template-columns: 1fr;
702
+ }
703
+
704
+ .header-controls {
705
+ position: static;
706
+ justify-content: center;
707
+ margin-bottom: 1rem;
708
+ }
709
+
710
+ .grid-container {
711
+ grid-template-columns: repeat(2, minmax(120px, 1fr));
712
+ gap: 0.5rem;
713
+ }
714
+
715
+ .grid-header,
716
+ .grid-label {
717
+ font-size: 0.9rem;
718
+ padding: 0.6rem;
719
+ }
720
+
721
+ .grid-container .empty {
722
+ display: none;
723
+ }
724
+
725
+ .grid-container span:nth-child(2),
726
+ .grid-container span:nth-child(3) {
727
+ grid-column: span 1;
728
+ }
729
+
730
+ .grid-container label,
731
+ .grid-container .grid-item {
732
+ grid-column: span 1;
733
+ }
734
+
735
+ .form-actions {
736
+ grid-template-columns: 1fr;
737
+ }
738
+
739
+ .panel-heading-inline {
740
+ flex-direction: column;
741
+ }
742
+
743
+ .intro-highlights {
744
+ grid-template-columns: 1fr;
745
+ }
746
+
747
+ .probability-chart {
748
+ padding: 1.25rem;
749
+ }
750
+
751
+ .chart-row {
752
+ grid-template-columns: 1fr;
753
+ gap: 0.5rem;
754
+ }
755
+
756
+ .chart-value {
757
+ justify-self: flex-start;
758
+ }
759
+
760
+ .fagan-nomogram canvas {
761
+ width: 100%;
762
+ height: auto;
763
+ }
764
+
765
+ .tooltip .tooltip-text {
766
+ width: 220px;
767
+ margin-left: -110px;
768
+ font-size: 0.8rem;
769
+ }
770
+
771
+ .panel {
772
+ padding: 1rem;
773
+ }
774
+
775
+ .reference-list {
776
+ font-size: 0.9rem;
777
+ }
778
+ }
779
+
780
+ @media (prefers-reduced-motion: reduce) {
781
+ *,
782
+ *::before,
783
+ *::after {
784
+ animation-duration: 0.01ms !important;
785
+ animation-iteration-count: 1 !important;
786
+ transition-duration: 0.01ms !important;
787
+ scroll-behavior: auto !important;
788
+ }
789
+ }