deepresearch-flow 0.2.1__py3-none-any.whl → 0.4.0__py3-none-any.whl

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.
Files changed (41) hide show
  1. deepresearch_flow/cli.py +2 -0
  2. deepresearch_flow/paper/config.py +15 -0
  3. deepresearch_flow/paper/db.py +193 -0
  4. deepresearch_flow/paper/db_ops.py +1939 -0
  5. deepresearch_flow/paper/llm.py +2 -0
  6. deepresearch_flow/paper/web/app.py +46 -3320
  7. deepresearch_flow/paper/web/constants.py +23 -0
  8. deepresearch_flow/paper/web/filters.py +255 -0
  9. deepresearch_flow/paper/web/handlers/__init__.py +14 -0
  10. deepresearch_flow/paper/web/handlers/api.py +217 -0
  11. deepresearch_flow/paper/web/handlers/pages.py +334 -0
  12. deepresearch_flow/paper/web/markdown.py +549 -0
  13. deepresearch_flow/paper/web/static/css/main.css +857 -0
  14. deepresearch_flow/paper/web/static/js/detail.js +406 -0
  15. deepresearch_flow/paper/web/static/js/index.js +266 -0
  16. deepresearch_flow/paper/web/static/js/outline.js +58 -0
  17. deepresearch_flow/paper/web/static/js/stats.js +39 -0
  18. deepresearch_flow/paper/web/templates/base.html +43 -0
  19. deepresearch_flow/paper/web/templates/detail.html +332 -0
  20. deepresearch_flow/paper/web/templates/index.html +114 -0
  21. deepresearch_flow/paper/web/templates/stats.html +29 -0
  22. deepresearch_flow/paper/web/templates.py +85 -0
  23. deepresearch_flow/paper/web/text.py +68 -0
  24. deepresearch_flow/recognize/cli.py +157 -3
  25. deepresearch_flow/recognize/organize.py +58 -0
  26. deepresearch_flow/translator/__init__.py +1 -0
  27. deepresearch_flow/translator/cli.py +451 -0
  28. deepresearch_flow/translator/config.py +19 -0
  29. deepresearch_flow/translator/engine.py +959 -0
  30. deepresearch_flow/translator/fixers.py +451 -0
  31. deepresearch_flow/translator/placeholder.py +62 -0
  32. deepresearch_flow/translator/prompts.py +116 -0
  33. deepresearch_flow/translator/protector.py +291 -0
  34. deepresearch_flow/translator/segment.py +180 -0
  35. deepresearch_flow-0.4.0.dist-info/METADATA +327 -0
  36. {deepresearch_flow-0.2.1.dist-info → deepresearch_flow-0.4.0.dist-info}/RECORD +40 -13
  37. deepresearch_flow-0.2.1.dist-info/METADATA +0 -424
  38. {deepresearch_flow-0.2.1.dist-info → deepresearch_flow-0.4.0.dist-info}/WHEEL +0 -0
  39. {deepresearch_flow-0.2.1.dist-info → deepresearch_flow-0.4.0.dist-info}/entry_points.txt +0 -0
  40. {deepresearch_flow-0.2.1.dist-info → deepresearch_flow-0.4.0.dist-info}/licenses/LICENSE +0 -0
  41. {deepresearch_flow-0.2.1.dist-info → deepresearch_flow-0.4.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,857 @@
1
+ /* Base styles extracted from page_shell */
2
+ :root {
3
+ --ink-900: #0f172a;
4
+ --ink-700: #1f2937;
5
+ --ink-500: #4b5563;
6
+ --surface-0: #f8fafc;
7
+ --surface-1: #ffffff;
8
+ --surface-2: #eef2f7;
9
+ --accent: #1f6feb;
10
+ --accent-strong: #1557c0;
11
+ --border-soft: #d7dee8;
12
+ --shadow-soft: 0 12px 30px rgba(15, 23, 42, 0.08);
13
+ --content-max-width: 1360px;
14
+ --card-max-width: 1220px;
15
+ }
16
+
17
+ .font-hei {
18
+ font-family: -apple-system, "Noto Sans", "Helvetica Neue", Helvetica, "Nimbus Sans L", Arial, "Liberation Sans",
19
+ "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", "Source Han Sans SC", "Source Han Sans CN",
20
+ "Microsoft YaHei", "Wenquanyi Micro Hei", "WenQuanYi Zen Hei", "ST Heiti", SimHei,
21
+ "WenQuanYi Zen Hei Sharp", sans-serif;
22
+ }
23
+
24
+ .font-kai {
25
+ font-family: Baskerville, Georgia, "Liberation Serif", "Kaiti SC", STKaiti, "AR PL UKai CN", "AR PL UKai HK",
26
+ "AR PL UKai TW", "AR PL UKai TW MBE", "AR PL KaitiM GB", KaiTi, KaiTi_GB2312, DFKai-SB, "TW-Kai", serif;
27
+ }
28
+
29
+ .font-song {
30
+ font-family: Georgia, "Nimbus Roman No9 L", "Songti SC", "Noto Serif CJK SC", "Source Han Serif SC",
31
+ "Source Han Serif CN", STSong, "AR PL New Sung", "AR PL SungtiL GB", NSimSun, SimSun, "TW-Sung",
32
+ "WenQuanYi Bitmap Song", "AR PL UMing CN", "AR PL UMing HK", "AR PL UMing TW", "AR PL UMing TW MBE",
33
+ PMingLiU, MingLiU, serif;
34
+ }
35
+
36
+ .font-fang-song {
37
+ font-family: Baskerville, "Times New Roman", "Liberation Serif", STFangsong, FangSong, FangSong_GB2312, "CWTEX-F",
38
+ serif;
39
+ }
40
+
41
+ body {
42
+ font-family: inherit;
43
+ margin: 0;
44
+ color: var(--ink-700);
45
+ --outline-top: 96px;
46
+ --outline-left: max(12px, calc((100vw - var(--content-max-width)) / 2 - 280px));
47
+ background:
48
+ radial-gradient(900px 480px at 10% -10%, #dbeafe 0%, rgba(219, 234, 254, 0) 70%),
49
+ radial-gradient(720px 380px at 90% 0%, #cffafe 0%, rgba(207, 250, 254, 0) 65%),
50
+ linear-gradient(180deg, var(--surface-0) 0%, var(--surface-2) 100%);
51
+ min-height: 100vh;
52
+ }
53
+
54
+ /* Header styles */
55
+ header {
56
+ position: sticky;
57
+ top: 0;
58
+ background: linear-gradient(120deg, #0b1220 0%, #111c2e 55%, #12233c 100%);
59
+ color: #fff;
60
+ padding: 12px 16px;
61
+ z-index: 10;
62
+ box-shadow: 0 8px 18px rgba(12, 18, 32, 0.28);
63
+ }
64
+
65
+ header a {
66
+ color: #cfe3ff;
67
+ text-decoration: none;
68
+ margin-right: 12px;
69
+ }
70
+
71
+ .detail-header .header-row {
72
+ display: grid;
73
+ grid-template-columns: auto minmax(0, 1fr) auto;
74
+ align-items: center;
75
+ gap: 12px;
76
+ }
77
+
78
+ .detail-header .header-title {
79
+ text-align: center;
80
+ white-space: nowrap;
81
+ overflow: hidden;
82
+ text-overflow: ellipsis;
83
+ }
84
+
85
+ .detail-header .header-back {
86
+ margin-right: 0;
87
+ }
88
+
89
+ .detail-header .header-link {
90
+ margin-right: 0;
91
+ }
92
+
93
+ .header-right {
94
+ display: inline-flex;
95
+ align-items: center;
96
+ gap: 12px;
97
+ justify-self: end;
98
+ }
99
+
100
+ .header-version {
101
+ font-size: 12px;
102
+ color: #9bb7d9;
103
+ }
104
+
105
+ /* Container */
106
+ .container {
107
+ max-width: var(--content-max-width);
108
+ margin: 0 auto;
109
+ padding: 18px 20px 36px;
110
+ }
111
+
112
+ .container.embed {
113
+ max-width: 100%;
114
+ padding: 16px;
115
+ }
116
+
117
+ .container.wide {
118
+ max-width: 100%;
119
+ }
120
+
121
+ /* Filters */
122
+ .filters {
123
+ display: grid;
124
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
125
+ gap: 8px;
126
+ margin: 12px 0 16px;
127
+ }
128
+
129
+ .filters input {
130
+ width: 100%;
131
+ }
132
+
133
+ .filters select {
134
+ width: 100%;
135
+ }
136
+
137
+ .filters select:not([multiple]) {
138
+ }
139
+
140
+ .filters select[multiple] {
141
+ min-height: 72px;
142
+ }
143
+
144
+ .filters select[multiple] option {
145
+ }
146
+
147
+ .filters label {
148
+ font-size: 12px;
149
+ color: var(--ink-500);
150
+ }
151
+
152
+ .filter-group {
153
+ display: flex;
154
+ flex-direction: column;
155
+ gap: 4px;
156
+ }
157
+
158
+ /* Card */
159
+ .card {
160
+ border: 1px solid var(--border-soft);
161
+ border-radius: 14px;
162
+ padding: 16px;
163
+ margin: 14px auto;
164
+ background: var(--surface-1);
165
+ box-shadow: var(--shadow-soft);
166
+ max-width: var(--card-max-width);
167
+ position: relative;
168
+ }
169
+
170
+ .paper-card a {
171
+ font-weight: 600;
172
+ color: var(--ink-900);
173
+ }
174
+
175
+ .card-index {
176
+ position: absolute;
177
+ top: 12px;
178
+ right: 12px;
179
+ font-size: 11px;
180
+ color: var(--ink-500);
181
+ background: #f1f5f9;
182
+ border: 1px solid #e2e8f0;
183
+ border-radius: 999px;
184
+ padding: 2px 6px;
185
+ }
186
+
187
+ .summary-snippet {
188
+ margin-top: 6px;
189
+ display: flex;
190
+ gap: 8px;
191
+ align-items: flex-start;
192
+ }
193
+
194
+ .summary-text {
195
+ color: var(--ink-600);
196
+ font-size: 13px;
197
+ line-height: 1.6;
198
+ }
199
+
200
+ .summary-toggle {
201
+ border: 1px solid #e2e8f0;
202
+ background: #ffffff;
203
+ color: var(--ink-600);
204
+ border-radius: 999px;
205
+ width: 24px;
206
+ height: 24px;
207
+ font-size: 12px;
208
+ cursor: pointer;
209
+ flex: 0 0 auto;
210
+ }
211
+
212
+ .summary-snippet .summary-full {
213
+ display: none;
214
+ }
215
+
216
+ .summary-snippet.is-open .summary-full {
217
+ display: block;
218
+ }
219
+
220
+ .summary-snippet.is-open .summary-short {
221
+ display: none;
222
+ }
223
+
224
+ .markmap {
225
+ width: 100%;
226
+ height: 420px;
227
+ border: 1px solid #e2e8f0;
228
+ border-radius: 12px;
229
+ background: #ffffff;
230
+ margin: 12px 0;
231
+ }
232
+
233
+ /* Utilities */
234
+ .muted {
235
+ color: var(--ink-500);
236
+ font-size: 13px;
237
+ }
238
+
239
+ /* Markdown content typography (override Tailwind preflight resets) */
240
+ .content h1,
241
+ .content h2,
242
+ .content h3,
243
+ .content h4,
244
+ .content h5,
245
+ .content h6 {
246
+ margin: 1.2em 0 0.6em;
247
+ font-weight: 700;
248
+ color: var(--ink-900);
249
+ }
250
+
251
+ .content h1 { font-size: 28px; }
252
+ .content h2 { font-size: 22px; }
253
+ .content h3 { font-size: 18px; }
254
+ .content h4 { font-size: 16px; }
255
+
256
+ .content p {
257
+ margin: 0.7em 0;
258
+ line-height: 1.7;
259
+ }
260
+
261
+ .content ul,
262
+ .content ol {
263
+ margin: 0.6em 0 0.8em 1.4em;
264
+ padding: 0;
265
+ line-height: 1.6;
266
+ }
267
+
268
+ .content ul { list-style: disc; }
269
+ .content ol { list-style: decimal; }
270
+
271
+ .content li { margin: 0.3em 0; }
272
+
273
+ .pill {
274
+ display: inline-block;
275
+ padding: 2px 8px;
276
+ border-radius: 999px;
277
+ border: 1px solid var(--border-soft);
278
+ margin-right: 6px;
279
+ font-size: 12px;
280
+ }
281
+
282
+ .pill.template {
283
+ border-color: #8a92a5;
284
+ color: #243b53;
285
+ background: #f6f8fa;
286
+ }
287
+
288
+ .pill.pdf-only {
289
+ border-color: #c8a951;
290
+ background: #fff8dc;
291
+ color: #5b4a00;
292
+ }
293
+
294
+ .warning {
295
+ background: #fff6da;
296
+ border: 1px solid #ffd089;
297
+ padding: 12px 14px;
298
+ border-radius: 12px;
299
+ margin: 12px 0;
300
+ color: #5b4a00;
301
+ }
302
+
303
+ /* Tabs */
304
+ .tabs {
305
+ display: flex;
306
+ gap: 8px;
307
+ flex-wrap: wrap;
308
+ }
309
+
310
+ .tab {
311
+ text-decoration: none;
312
+ }
313
+
314
+ /* Detail shell */
315
+ .detail-shell {
316
+ display: flex;
317
+ flex-direction: column;
318
+ gap: 12px;
319
+ min-height: calc(100vh - 120px);
320
+ }
321
+
322
+ .detail-toolbar {
323
+ display: flex;
324
+ flex-wrap: wrap;
325
+ align-items: center;
326
+ justify-content: flex-start;
327
+ gap: 12px;
328
+ padding: 6px 8px 10px;
329
+ border-bottom: 1px solid #e5e7eb;
330
+ box-sizing: border-box;
331
+ }
332
+
333
+ .detail-toolbar select,
334
+ .detail-toolbar button {
335
+ width: auto;
336
+ }
337
+
338
+
339
+ .detail-toolbar .tabs {
340
+ margin: 0;
341
+ }
342
+
343
+ .toolbar-actions {
344
+ display: flex;
345
+ flex-wrap: wrap;
346
+ align-items: center;
347
+ gap: 10px;
348
+ margin-left: auto;
349
+ padding-right: 16px;
350
+ }
351
+
352
+ .split-controls {
353
+ display: flex;
354
+ flex-wrap: wrap;
355
+ align-items: center;
356
+ gap: 8px;
357
+ }
358
+
359
+ .split-inline {
360
+ display: flex;
361
+ flex-wrap: wrap;
362
+ align-items: center;
363
+ gap: 8px;
364
+ }
365
+
366
+ .split-search {
367
+ min-width: 160px;
368
+ }
369
+
370
+ body.split-controls-collapsed .split-inline,
371
+ body.split-controls-collapsed .split-search {
372
+ display: none !important;
373
+ }
374
+
375
+ body.detail-fullscreen.split-controls-collapsed #splitControlsToggle {
376
+ background: #0f172a;
377
+ color: #ffffff;
378
+ border-color: #0f172a;
379
+ }
380
+
381
+ body:not(.detail-fullscreen) #splitControlsToggle,
382
+ body:not(.detail-fullscreen) .split-search {
383
+ display: none;
384
+ }
385
+
386
+ /* Search row */
387
+ .search-row {
388
+ display: flex;
389
+ flex-wrap: wrap;
390
+ gap: 8px;
391
+ margin-top: 8px;
392
+ align-items: stretch;
393
+ max-width: 1080px;
394
+ }
395
+
396
+ .search-row input {
397
+ flex: 1 1 320px;
398
+ min-width: 0;
399
+ }
400
+
401
+ .search-row select {
402
+ flex: 0 1 220px;
403
+ min-width: 0;
404
+ max-width: 100%;
405
+ }
406
+
407
+ /* Filter row */
408
+ .filter-row {
409
+ display: flex;
410
+ flex-wrap: wrap;
411
+ gap: 8px;
412
+ align-items: center;
413
+ margin-top: 8px;
414
+ max-width: 1120px;
415
+ }
416
+
417
+ .filter-row input {
418
+ flex: 1 1 320px;
419
+ min-width: 0;
420
+ }
421
+
422
+ .filter-row select {
423
+ flex: 0 1 180px;
424
+ min-width: 0;
425
+ }
426
+
427
+ .filter-row .help-icon {
428
+ flex: 0 0 auto;
429
+ }
430
+
431
+ /* Advanced actions */
432
+ .adv-actions {
433
+ display: flex;
434
+ gap: 8px;
435
+ align-items: center;
436
+ margin-top: 8px;
437
+ flex-wrap: wrap;
438
+ }
439
+
440
+ /* Split layout */
441
+ .split-inline {
442
+ display: flex;
443
+ flex-wrap: wrap;
444
+ align-items: center;
445
+ gap: 6px;
446
+ }
447
+
448
+ .split-inline select {
449
+ padding: 6px 8px;
450
+ border-radius: 10px;
451
+ border: 1px solid var(--border-soft);
452
+ background: var(--surface-1);
453
+ min-width: 140px;
454
+ max-width: 200px;
455
+ width: auto;
456
+ }
457
+
458
+ .split-actions {
459
+ display: flex;
460
+ align-items: center;
461
+ justify-content: center;
462
+ gap: 8px;
463
+ }
464
+
465
+ .split-actions button {
466
+ padding: 6px 10px;
467
+ border-radius: 999px;
468
+ border: 1px solid var(--border-soft);
469
+ background: #f6f8fa;
470
+ cursor: pointer;
471
+ min-width: 36px;
472
+ }
473
+
474
+ /* Language select */
475
+ .lang-select {
476
+ display: flex;
477
+ align-items: center;
478
+ gap: 6px;
479
+ }
480
+
481
+ .lang-select label {
482
+ color: var(--ink-500);
483
+ font-size: 13px;
484
+ }
485
+
486
+ .lang-select select {
487
+ padding: 6px 8px;
488
+ border-radius: 10px;
489
+ border: 1px solid var(--border-soft);
490
+ background: var(--surface-1);
491
+ min-width: 120px;
492
+ width: auto;
493
+ }
494
+
495
+ /* Fullscreen actions */
496
+ .fullscreen-actions {
497
+ display: flex;
498
+ align-items: center;
499
+ gap: 6px;
500
+ }
501
+
502
+ .fullscreen-actions button {
503
+ padding: 6px 10px;
504
+ border-radius: 10px;
505
+ border: 1px solid var(--border-soft);
506
+ background: #f6f8fa;
507
+ cursor: pointer;
508
+ }
509
+
510
+ .fullscreen-exit {
511
+ display: none;
512
+ }
513
+
514
+ /* Fullscreen mode */
515
+ body.detail-fullscreen {
516
+ overflow: hidden;
517
+ --outline-top: 16px;
518
+ }
519
+
520
+ body.detail-fullscreen header {
521
+ display: none;
522
+ }
523
+
524
+ body.detail-fullscreen .container {
525
+ max-width: 100%;
526
+ padding: 0;
527
+ }
528
+
529
+ body.detail-fullscreen .detail-shell {
530
+ position: fixed;
531
+ inset: 0;
532
+ width: 100%;
533
+ transform: none;
534
+ padding: 12px 20px 24px;
535
+ background: #fff;
536
+ z-index: 40;
537
+ overflow: auto;
538
+ }
539
+
540
+ body.detail-fullscreen .container {
541
+ max-width: 100%;
542
+ }
543
+
544
+ body.detail-fullscreen .detail-toolbar {
545
+ position: sticky;
546
+ top: 0;
547
+ background: #fff;
548
+ z-index: 41;
549
+ }
550
+
551
+ body.detail-fullscreen .fullscreen-enter {
552
+ display: none;
553
+ }
554
+
555
+ body.detail-fullscreen .fullscreen-exit {
556
+ display: inline-flex;
557
+ }
558
+
559
+ /* Detail body */
560
+ .detail-body {
561
+ display: flex;
562
+ flex-direction: column;
563
+ gap: 8px;
564
+ flex: 1;
565
+ min-height: 0;
566
+ }
567
+
568
+ /* Help icon */
569
+ .help-icon {
570
+ display: inline-flex;
571
+ align-items: center;
572
+ justify-content: center;
573
+ width: 18px;
574
+ height: 18px;
575
+ border-radius: 50%;
576
+ border: 1px solid var(--border-soft);
577
+ color: var(--ink-500);
578
+ font-size: 12px;
579
+ cursor: default;
580
+ position: relative;
581
+ }
582
+
583
+ .help-icon::after {
584
+ content: attr(data-tip);
585
+ display: none;
586
+ position: absolute;
587
+ top: 24px;
588
+ right: 0;
589
+ background: #0b1220;
590
+ color: #e6edf3;
591
+ padding: 8px 10px;
592
+ border-radius: 8px;
593
+ font-size: 12px;
594
+ white-space: pre-line;
595
+ width: 260px;
596
+ z-index: 20;
597
+ }
598
+
599
+ .help-icon:hover::after {
600
+ display: block;
601
+ }
602
+
603
+ /* Outline */
604
+ #outline::-webkit-scrollbar { width: 6px; }
605
+ #outline::-webkit-scrollbar-track { background: transparent; }
606
+ #outline::-webkit-scrollbar-thumb { background: #c7d2e0; border-radius: 999px; }
607
+ #outlineContent a {
608
+ display: block;
609
+ padding: 4px 0;
610
+ color: var(--accent);
611
+ text-decoration: none;
612
+ line-height: 1.3;
613
+ }
614
+ #outlineContent a:hover { text-decoration: underline; }
615
+ #outlineContent .outline-h2 { padding-left: 0; }
616
+ #outlineContent .outline-h3 { padding-left: 12px; font-size: 12px; }
617
+ #outlineContent .outline-h4 { padding-left: 24px; font-size: 11px; color: #57606a; }
618
+ @media (max-width: 1500px) {
619
+ body:not(.embed-view) #outline,
620
+ body:not(.embed-view) #outlineToggleContainer {
621
+ display: none !important;
622
+ }
623
+ }
624
+
625
+ @media (min-width: 1500px) {
626
+ body.outline-open .container:not(.embed) {
627
+ padding-left: 280px;
628
+ }
629
+ }
630
+
631
+ body.embed-view {
632
+ --outline-left: 12px;
633
+ }
634
+
635
+ body.embed-view.outline-open .container.embed {
636
+ padding-left: 240px;
637
+ }
638
+
639
+ body.embed-view #outlineToggleContainer {
640
+ position: sticky !important;
641
+ top: 8px !important;
642
+ left: 0 !important;
643
+ right: auto !important;
644
+ margin-bottom: 8px;
645
+ }
646
+
647
+ body.embed-view #outline {
648
+ position: sticky !important;
649
+ top: 48px !important;
650
+ left: 0 !important;
651
+ right: auto !important;
652
+ max-width: 220px;
653
+ }
654
+
655
+ /* Back to top */
656
+ .back-to-top {
657
+ position: fixed;
658
+ left: var(--outline-left, 20px);
659
+ right: auto;
660
+ bottom: 24px;
661
+ z-index: 50;
662
+ width: 36px;
663
+ height: 36px;
664
+ padding: 0;
665
+ border-radius: 999px;
666
+ border: 1px solid var(--border-soft);
667
+ background: var(--ink-900);
668
+ color: #fff;
669
+ font-size: 16px;
670
+ cursor: pointer;
671
+ box-shadow: 0 6px 16px rgba(15, 23, 42, 0.12);
672
+ display: inline-flex;
673
+ align-items: center;
674
+ justify-content: center;
675
+ opacity: 0;
676
+ transform: translateY(8px);
677
+ pointer-events: none;
678
+ transition: opacity 0.18s ease, transform 0.18s ease;
679
+ }
680
+
681
+ .back-to-top.visible {
682
+ opacity: 1;
683
+ transform: translateY(0);
684
+ pointer-events: auto;
685
+ }
686
+
687
+ #content img {
688
+ display: block;
689
+ margin: 16px auto;
690
+ max-width: 100%;
691
+ height: auto;
692
+ }
693
+
694
+ .heti .katex,
695
+ .heti .katex * {
696
+ font-family: "KaTeX_Main", "KaTeX_Math", "KaTeX_AMS", "Times New Roman", serif !important;
697
+ }
698
+
699
+
700
+ /* KaTeX overrides (protect from global typography rules) */
701
+ .katex, .katex * {
702
+ font-family: "KaTeX_Main", "KaTeX_Math", "KaTeX_AMS", "Times New Roman", serif !important;
703
+ font-style: normal !important;
704
+ font-weight: 400 !important;
705
+ letter-spacing: normal !important;
706
+ text-spacing: normal !important;
707
+ font-variant-east-asian: normal !important;
708
+ }
709
+
710
+ /* Stats */
711
+ .stats {
712
+ margin: 12px auto 6px;
713
+ max-width: var(--card-max-width);
714
+ }
715
+
716
+ .stats-row {
717
+ display: flex;
718
+ flex-wrap: wrap;
719
+ gap: 6px;
720
+ align-items: center;
721
+ }
722
+
723
+ .stats-label {
724
+ font-weight: 600;
725
+ color: var(--ink-900);
726
+ margin-right: 4px;
727
+ }
728
+
729
+ .pill.stat {
730
+ background: #f6f8fa;
731
+ border-color: #c7d2e0;
732
+ color: #1f2a37;
733
+ }
734
+
735
+ /* Footnotes */
736
+ .footnotes {
737
+ border-top: 1px solid #e5e7eb;
738
+ margin-top: 16px;
739
+ padding-top: 12px;
740
+ color: #57606a;
741
+ }
742
+
743
+ .footnotes ol {
744
+ padding-left: 20px;
745
+ }
746
+
747
+ .footnotes li {
748
+ margin-bottom: 6px;
749
+ }
750
+
751
+ .footnote-ref {
752
+ font-size: 0.85em;
753
+ }
754
+
755
+ .footnote-tip {
756
+ position: relative;
757
+ display: inline-block;
758
+ }
759
+
760
+ .footnote-tip::after {
761
+ content: attr(data-footnote);
762
+ position: absolute;
763
+ left: 50%;
764
+ bottom: 130%;
765
+ transform: translateX(-50%);
766
+ width: min(320px, 70vw);
767
+ padding: 8px 10px;
768
+ border-radius: 8px;
769
+ background: #0b1220;
770
+ color: #e6edf3;
771
+ font-size: 12px;
772
+ line-height: 1.35;
773
+ white-space: pre-line;
774
+ box-shadow: 0 10px 24px rgba(0, 0, 0, 0.18);
775
+ opacity: 0;
776
+ pointer-events: none;
777
+ z-index: 30;
778
+ transition: opacity 0.12s ease-in-out;
779
+ }
780
+
781
+ .footnote-tip:hover::after,
782
+ .footnote-tip:focus::after {
783
+ opacity: 1;
784
+ }
785
+
786
+ /* Code blocks */
787
+ pre {
788
+ overflow: auto;
789
+ padding: 10px;
790
+ background: #0b1220;
791
+ color: #e6edf3;
792
+ border-radius: 12px;
793
+ }
794
+
795
+ code {
796
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
797
+ }
798
+
799
+ .content a {
800
+ color: var(--accent);
801
+ }
802
+
803
+ /* Responsive */
804
+ @media (max-width: 640px) {
805
+ .search-row {
806
+ flex-direction: column;
807
+ }
808
+
809
+ .search-row input,
810
+ .search-row select {
811
+ width: 100%;
812
+ }
813
+
814
+ .filter-row {
815
+ flex-direction: column;
816
+ align-items: stretch;
817
+ }
818
+
819
+ .filter-row .help-icon {
820
+ align-self: flex-end;
821
+ }
822
+
823
+ .adv-actions {
824
+ flex-direction: column;
825
+ align-items: stretch;
826
+ }
827
+
828
+ .detail-toolbar {
829
+ flex-wrap: nowrap;
830
+ overflow-x: auto;
831
+ padding-bottom: 8px;
832
+ }
833
+
834
+ .detail-toolbar::-webkit-scrollbar {
835
+ height: 6px;
836
+ }
837
+
838
+ .detail-toolbar::-webkit-scrollbar-thumb {
839
+ background: #c7d2e0;
840
+ border-radius: 999px;
841
+ }
842
+
843
+ .detail-toolbar .tabs,
844
+ .toolbar-actions {
845
+ flex: 0 0 auto;
846
+ }
847
+ }
848
+ #outlineToggleContainer .button,
849
+ #outlineToggle,
850
+ #outlineClose,
851
+ .detail-toolbar button,
852
+ .detail-toolbar select,
853
+ .split-inline select,
854
+ .fullscreen-actions button,
855
+ .split-actions button {
856
+ border-radius: 10px;
857
+ }