docs-i18n 0.1.0 → 0.2.1

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 (49) hide show
  1. package/dist/{assemble-IOHQYYHI.js → assemble-ZHDLGVTL.js} +3 -4
  2. package/dist/chunk-I74LIORX.js +11211 -0
  3. package/dist/{chunk-QSVWLTGQ.js → chunk-OSMPWXSQ.js} +1 -1
  4. package/dist/{chunk-AKLW2MUS.js → chunk-PHDMD6EM.js} +29 -7
  5. package/dist/cli.js +6 -7
  6. package/dist/{rescan-VB2PILB2.js → rescan-OJTVWDAP.js} +2 -3
  7. package/dist/server-HNVJP43X.js +2742 -0
  8. package/dist/{status-EWQEACVF.js → status-ZG7F3FRT.js} +1 -2
  9. package/dist/translate-2PCYIWIG.js +14531 -0
  10. package/package.json +3 -2
  11. package/src/admin/index.html +13 -0
  12. package/src/admin/server/index.ts +88 -0
  13. package/src/admin/server/routes/jobs.ts +113 -0
  14. package/src/admin/server/routes/models.ts +87 -0
  15. package/src/admin/server/routes/status.ts +57 -0
  16. package/src/admin/server/services/job-manager.ts +184 -0
  17. package/src/admin/server/services/status.ts +183 -0
  18. package/src/admin/ui/App.tsx +326 -0
  19. package/src/admin/ui/components/FileList.tsx +438 -0
  20. package/src/admin/ui/components/JobDialog.tsx +360 -0
  21. package/src/admin/ui/components/JobPanel.tsx +134 -0
  22. package/src/admin/ui/components/LangGrid.tsx +54 -0
  23. package/src/admin/ui/components/Preview.tsx +369 -0
  24. package/src/admin/ui/components/ProgressBar.tsx +21 -0
  25. package/src/admin/ui/lib/api.ts +154 -0
  26. package/src/admin/ui/lib/flags.ts +30 -0
  27. package/src/admin/ui/main.tsx +19 -0
  28. package/src/admin/ui/styles.css +1096 -0
  29. package/src/admin/vite.config.ts +7 -0
  30. package/dist/build-4EQEL4NI.js +0 -12
  31. package/dist/build2-3W5WMFHZ.js +0 -4901
  32. package/dist/chunk-3YNFMSJH.js +0 -30
  33. package/dist/chunk-55MBYBVK.js +0 -368
  34. package/dist/chunk-FYDB7MZX.js +0 -38944
  35. package/dist/chunk-O35QHRY6.js +0 -6
  36. package/dist/chunk-PTIH4GGE.js +0 -44
  37. package/dist/chunk-SUIDX6IZ.js +0 -122
  38. package/dist/chunk-VKKNQBDN.js +0 -6487
  39. package/dist/dist-6C32URTL.js +0 -19
  40. package/dist/dist-HOWMMQFV.js +0 -6677
  41. package/dist/false-JGP4AGWN.js +0 -7
  42. package/dist/main-QVE5TVA3.js +0 -2505
  43. package/dist/node-4GLCLDJ6.js +0 -875
  44. package/dist/node-NUDVMOF2.js +0 -129
  45. package/dist/postcss-3SK7VUC2.js +0 -5886
  46. package/dist/postcss-import-JD46KA2Z.js +0 -458
  47. package/dist/prompt-BYQIwEjg-TG7DLENB.js +0 -915
  48. package/dist/server-ER56DGPR.js +0 -548
  49. package/dist/translate-F3AQFN6X.js +0 -707
@@ -0,0 +1,1096 @@
1
+ *,
2
+ *::before,
3
+ *::after {
4
+ box-sizing: border-box;
5
+ margin: 0;
6
+ padding: 0;
7
+ scrollbar-width: none;
8
+ }
9
+ *::-webkit-scrollbar {
10
+ display: none;
11
+ }
12
+
13
+ :root {
14
+ --bg: #0a0a0a;
15
+ --fg: #ededed;
16
+ --fg2: #888;
17
+ --card: #141414;
18
+ --border: #282828;
19
+ --hover: #1c1c1c;
20
+ --accent: #0070f3;
21
+ --green: #00c853;
22
+ --yellow: #ffd600;
23
+ --red: #ff1744;
24
+ --btn-fg: #fff;
25
+ --code-fg: #ccc;
26
+ --font: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
27
+ --mono: "SF Mono", "Fira Code", "Cascadia Code", monospace;
28
+ }
29
+
30
+ [data-theme="light"] {
31
+ --bg: #f5f5f5;
32
+ --fg: #1a1a1a;
33
+ --fg2: #666;
34
+ --card: #ffffff;
35
+ --border: #ddd;
36
+ --hover: #eaeaea;
37
+ --accent: #0060df;
38
+ --green: #00873e;
39
+ --yellow: #b58900;
40
+ --red: #d32f2f;
41
+ --btn-fg: #fff;
42
+ --code-fg: #333;
43
+ }
44
+
45
+ body {
46
+ font-family: var(--font);
47
+ background: var(--bg);
48
+ color: var(--fg);
49
+ min-height: 100vh;
50
+ }
51
+
52
+ /* Nav */
53
+ nav {
54
+ display: flex;
55
+ align-items: center;
56
+ gap: 1rem;
57
+ padding: 1rem 2rem;
58
+ border-bottom: 1px solid var(--border);
59
+ }
60
+ nav h1 {
61
+ font-size: 1.1rem;
62
+ font-weight: 700;
63
+ }
64
+
65
+ /* Utilities */
66
+ .spacer {
67
+ flex: 1;
68
+ }
69
+ .hidden {
70
+ display: none;
71
+ }
72
+ .loading {
73
+ text-align: center;
74
+ padding: 2rem;
75
+ color: var(--fg2);
76
+ }
77
+
78
+ /* Buttons */
79
+ .btn {
80
+ background: var(--accent);
81
+ color: var(--btn-fg);
82
+ border: none;
83
+ padding: 0.5rem 1rem;
84
+ border-radius: 0.375rem;
85
+ cursor: pointer;
86
+ font-size: 0.85rem;
87
+ font-weight: 600;
88
+ }
89
+ .btn:hover {
90
+ opacity: 0.9;
91
+ }
92
+ .btn-icon {
93
+ background: transparent;
94
+ color: var(--fg);
95
+ font-size: 1.1rem;
96
+ padding: 0.35rem 0.5rem;
97
+ line-height: 1;
98
+ }
99
+ .btn-icon:hover {
100
+ background: var(--hover);
101
+ opacity: 1;
102
+ }
103
+ .btn:disabled {
104
+ opacity: 0.4;
105
+ cursor: not-allowed;
106
+ }
107
+ .btn-sm {
108
+ padding: 0.25rem 0.75rem;
109
+ font-size: 0.8rem;
110
+ }
111
+ .btn-outline {
112
+ background: transparent;
113
+ border: 1px solid var(--border);
114
+ color: var(--fg2);
115
+ }
116
+ .btn-outline:hover {
117
+ border-color: var(--accent);
118
+ color: var(--accent);
119
+ }
120
+
121
+ /* Layout */
122
+ .container {
123
+ max-width: 1400px;
124
+ margin: 0 auto;
125
+ padding: 1.5rem;
126
+ }
127
+ @media (min-width: 1600px) {
128
+ .container {
129
+ max-width: 1800px;
130
+ }
131
+ }
132
+ @media (min-width: 2000px) {
133
+ .container {
134
+ max-width: 2200px;
135
+ }
136
+ }
137
+
138
+ /* Tabs */
139
+ .tabs {
140
+ display: flex;
141
+ gap: 0.5rem;
142
+ margin-bottom: 1.5rem;
143
+ }
144
+ .tab {
145
+ padding: 0.5rem 1rem;
146
+ border-radius: 0.375rem;
147
+ border: 1px solid var(--border);
148
+ background: transparent;
149
+ color: var(--fg2);
150
+ cursor: pointer;
151
+ font-size: 0.85rem;
152
+ }
153
+ .tab.active {
154
+ background: var(--accent);
155
+ color: var(--btn-fg);
156
+ border-color: var(--accent);
157
+ }
158
+
159
+ /* Language cards */
160
+ .lang-grid {
161
+ display: grid;
162
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
163
+ gap: 0.75rem;
164
+ margin-bottom: 1.5rem;
165
+ }
166
+ .lang-card {
167
+ padding: 1rem;
168
+ border: 1px solid var(--border);
169
+ border-radius: 0.5rem;
170
+ background: var(--card);
171
+ cursor: pointer;
172
+ transition: border-color 0.15s;
173
+ }
174
+ .lang-card:hover {
175
+ border-color: var(--accent);
176
+ }
177
+ .lang-card.selected {
178
+ border-color: var(--accent);
179
+ background: #0070f310;
180
+ }
181
+ .lang-card.is-en {
182
+ border-style: dashed;
183
+ }
184
+ .lang-card .name {
185
+ font-weight: 600;
186
+ margin-bottom: 0.5rem;
187
+ font-size: 0.9rem;
188
+ }
189
+ .lang-card .stats {
190
+ font-size: 0.8rem;
191
+ color: var(--fg2);
192
+ }
193
+ .bar-bg {
194
+ height: 4px;
195
+ background: var(--border);
196
+ border-radius: 2px;
197
+ margin-top: 0.5rem;
198
+ }
199
+ .bar-fill {
200
+ height: 100%;
201
+ border-radius: 2px;
202
+ transition: width 0.3s;
203
+ }
204
+
205
+ /* Jobs */
206
+ .jobs-panel {
207
+ border: 1px solid var(--border);
208
+ border-radius: 0.5rem;
209
+ padding: 1rem;
210
+ margin-bottom: 1.5rem;
211
+ background: var(--card);
212
+ }
213
+ .jobs-panel h3 {
214
+ margin-bottom: 0.75rem;
215
+ font-size: 0.95rem;
216
+ }
217
+ .job-item {
218
+ padding: 0.75rem;
219
+ border: 1px solid var(--border);
220
+ border-radius: 0.375rem;
221
+ margin-bottom: 0.5rem;
222
+ font-size: 0.85rem;
223
+ }
224
+ .job-item .hdr {
225
+ display: flex;
226
+ align-items: center;
227
+ gap: 0.5rem;
228
+ flex-wrap: wrap;
229
+ }
230
+ .status-badge {
231
+ padding: 0.125rem 0.5rem;
232
+ border-radius: 0.25rem;
233
+ font-size: 0.75rem;
234
+ font-weight: 600;
235
+ }
236
+ .status-badge.running {
237
+ background: #0070f320;
238
+ color: var(--accent);
239
+ }
240
+ .status-badge.completed {
241
+ background: #00c85320;
242
+ color: var(--green);
243
+ }
244
+ .status-badge.failed {
245
+ background: #ff174420;
246
+ color: var(--red);
247
+ }
248
+ .status-badge.cancelled {
249
+ background: #ffd60020;
250
+ color: var(--yellow);
251
+ }
252
+ .job-meta {
253
+ color: var(--fg2);
254
+ margin-top: 0.25rem;
255
+ font-size: 0.8rem;
256
+ }
257
+ .progress-bar {
258
+ height: 3px;
259
+ background: var(--border);
260
+ border-radius: 2px;
261
+ margin-top: 0.5rem;
262
+ }
263
+ .progress-fill {
264
+ height: 100%;
265
+ background: var(--accent);
266
+ border-radius: 2px;
267
+ transition: width 0.3s;
268
+ }
269
+ .log-viewer {
270
+ background: #000;
271
+ border-radius: 0.375rem;
272
+ padding: 0.75rem;
273
+ max-height: 200px;
274
+ overflow-y: auto;
275
+ font-family: var(--mono);
276
+ font-size: 0.7rem;
277
+ line-height: 1.5;
278
+ color: #aaa;
279
+ margin-top: 0.5rem;
280
+ }
281
+ .log-viewer .err {
282
+ color: var(--red);
283
+ }
284
+
285
+ /* File panel toolbar */
286
+ .file-panel-toolbar {
287
+ display: flex;
288
+ align-items: center;
289
+ gap: 0.75rem;
290
+ margin-bottom: 0.5rem;
291
+ }
292
+ .file-panel-current {
293
+ font-size: 0.75rem;
294
+ color: var(--fg2);
295
+ overflow: hidden;
296
+ text-overflow: ellipsis;
297
+ white-space: nowrap;
298
+ }
299
+ .btn-sm {
300
+ font-size: 0.72rem;
301
+ padding: 0.25rem 0.6rem;
302
+ }
303
+
304
+ /* File panel */
305
+ .file-panel {
306
+ display: grid;
307
+ grid-template-columns: 340px 1fr;
308
+ /* Fill remaining viewport: nav + toolbar */
309
+ height: calc(100vh - 70px);
310
+ gap: 0.5rem;
311
+ margin-bottom: 0;
312
+ }
313
+ .file-panel.no-preview {
314
+ grid-template-columns: 1fr;
315
+ }
316
+ .file-panel.no-list {
317
+ grid-template-columns: 1fr;
318
+ }
319
+ .file-panel.no-list.no-preview {
320
+ display: none;
321
+ }
322
+ @media (max-width: 900px) {
323
+ .file-panel {
324
+ grid-template-columns: 1fr;
325
+ }
326
+ }
327
+
328
+ .file-list-wrap {
329
+ border: 1px solid var(--border);
330
+ border-radius: 0.5rem;
331
+ overflow: hidden;
332
+ display: flex;
333
+ flex-direction: column;
334
+ }
335
+ .file-list-hdr {
336
+ display: flex;
337
+ align-items: center;
338
+ gap: 0.5rem;
339
+ padding: 0.75rem 1rem;
340
+ background: var(--card);
341
+ border-bottom: 1px solid var(--border);
342
+ flex-wrap: wrap;
343
+ }
344
+ .file-list-hdr select {
345
+ background: var(--bg);
346
+ color: var(--fg);
347
+ border: 1px solid var(--border);
348
+ padding: 0.25rem 0.5rem;
349
+ border-radius: 0.25rem;
350
+ font-size: 0.8rem;
351
+ }
352
+ .file-list-body {
353
+ overflow-y: auto;
354
+ flex: 1;
355
+ }
356
+ .sel-bar {
357
+ display: flex;
358
+ align-items: center;
359
+ gap: 0.75rem;
360
+ padding: 0.5rem 1rem;
361
+ background: #0070f310;
362
+ border-bottom: 1px solid var(--border);
363
+ font-size: 0.85rem;
364
+ }
365
+
366
+ .file-row {
367
+ display: flex;
368
+ align-items: center;
369
+ padding: 0.375rem 0.75rem;
370
+ border-bottom: 1px solid var(--border);
371
+ font-size: 0.8rem;
372
+ cursor: pointer;
373
+ transition: background 0.1s;
374
+ }
375
+ .file-row:hover {
376
+ background: var(--hover);
377
+ }
378
+ .file-row.active {
379
+ background: #0070f315;
380
+ }
381
+ .file-row input[type="checkbox"] {
382
+ margin-right: 0.5rem;
383
+ cursor: pointer;
384
+ }
385
+ .file-row .icon {
386
+ width: 0.75rem;
387
+ font-size: 0.5rem;
388
+ flex-shrink: 0;
389
+ }
390
+ .file-row .path {
391
+ flex: 1;
392
+ overflow: hidden;
393
+ text-overflow: ellipsis;
394
+ white-space: nowrap;
395
+ }
396
+ .file-row .pct {
397
+ width: 2rem;
398
+ text-align: right;
399
+ font-size: 0.65rem;
400
+ color: var(--fg2);
401
+ font-variant-numeric: tabular-nums;
402
+ flex-shrink: 0;
403
+ }
404
+ .file-row .miss {
405
+ color: var(--fg2);
406
+ font-size: 0.6rem;
407
+ flex-shrink: 0;
408
+ margin-left: 0.25rem;
409
+ }
410
+ .file-row .mini-bar {
411
+ width: 20px;
412
+ height: 2px;
413
+ background: var(--border);
414
+ border-radius: 1px;
415
+ margin-left: 0.25rem;
416
+ flex-shrink: 0;
417
+ }
418
+ .file-row .mini-fill {
419
+ height: 100%;
420
+ border-radius: 2px;
421
+ }
422
+
423
+ /* File search */
424
+ .file-search {
425
+ position: relative;
426
+ padding: 0.35rem 0.5rem;
427
+ border-bottom: 1px solid var(--border);
428
+ }
429
+ .file-search input {
430
+ width: 100%;
431
+ padding: 0.3rem 1.5rem 0.3rem 0.5rem;
432
+ font-size: 0.75rem;
433
+ border: 1px solid var(--border);
434
+ border-radius: 0.3rem;
435
+ background: var(--bg);
436
+ color: var(--fg);
437
+ outline: none;
438
+ }
439
+ .file-search input:focus {
440
+ border-color: var(--accent);
441
+ }
442
+ .file-search input::placeholder {
443
+ color: var(--fg2);
444
+ }
445
+ .file-search-clear {
446
+ position: absolute;
447
+ right: 0.75rem;
448
+ top: 50%;
449
+ transform: translateY(-50%);
450
+ border: none;
451
+ background: none;
452
+ color: var(--fg2);
453
+ cursor: pointer;
454
+ font-size: 0.7rem;
455
+ padding: 0.2rem;
456
+ }
457
+
458
+ /* Tree view */
459
+ .tree-dir {
460
+ font-weight: 600;
461
+ color: var(--fg2);
462
+ }
463
+ .tree-dir:hover {
464
+ color: var(--fg);
465
+ }
466
+ .tree-arrow {
467
+ font-size: 0.6rem;
468
+ width: 1rem;
469
+ flex-shrink: 0;
470
+ text-align: center;
471
+ }
472
+ .btn-xs {
473
+ font-size: 0.65rem;
474
+ padding: 0.1rem 0.35rem;
475
+ border: 1px solid var(--border);
476
+ border-radius: 0.25rem;
477
+ background: var(--bg);
478
+ color: var(--fg2);
479
+ cursor: pointer;
480
+ }
481
+ .btn-xs.active {
482
+ background: var(--accent);
483
+ color: #fff;
484
+ border-color: var(--accent);
485
+ }
486
+
487
+ /* Preview */
488
+ .preview-wrap {
489
+ border: 1px solid var(--border);
490
+ border-radius: 0.5rem;
491
+ overflow: hidden;
492
+ display: grid;
493
+ grid-template-rows: auto 1fr;
494
+ height: 100%;
495
+ }
496
+ .preview-hdr {
497
+ padding: 0.75rem 1rem;
498
+ background: var(--card);
499
+ border-bottom: 1px solid var(--border);
500
+ font-weight: 600;
501
+ font-size: 0.85rem;
502
+ display: flex;
503
+ align-items: center;
504
+ gap: 0.5rem;
505
+ }
506
+ a.preview-filename {
507
+ overflow: hidden;
508
+ text-overflow: ellipsis;
509
+ white-space: nowrap;
510
+ color: var(--blue, #58a6ff);
511
+ text-decoration: none;
512
+ cursor: pointer;
513
+ }
514
+ a.preview-filename:hover {
515
+ text-decoration: underline;
516
+ }
517
+ .preview-close {
518
+ width: 24px;
519
+ height: 24px;
520
+ border: none;
521
+ background: transparent;
522
+ color: var(--fg2);
523
+ cursor: pointer;
524
+ font-size: 0.85rem;
525
+ border-radius: 0.25rem;
526
+ display: flex;
527
+ align-items: center;
528
+ justify-content: center;
529
+ flex-shrink: 0;
530
+ }
531
+ .preview-close:hover {
532
+ background: var(--hover);
533
+ color: var(--fg);
534
+ }
535
+ .preview-toggle {
536
+ display: flex;
537
+ gap: 2px;
538
+ margin-left: auto;
539
+ }
540
+ .preview-toggle button {
541
+ padding: 0.2rem 0.5rem;
542
+ border: 1px solid var(--border);
543
+ background: transparent;
544
+ color: var(--fg2);
545
+ cursor: pointer;
546
+ font-size: 0.75rem;
547
+ line-height: 1;
548
+ }
549
+ .preview-toggle button:first-child {
550
+ border-radius: 0.25rem 0 0 0.25rem;
551
+ }
552
+ .preview-toggle button:last-child {
553
+ border-radius: 0 0.25rem 0.25rem 0;
554
+ }
555
+ .preview-toggle button.active {
556
+ background: var(--accent);
557
+ color: var(--btn-fg);
558
+ border-color: var(--accent);
559
+ }
560
+ .preview-toc {
561
+ overflow-y: auto;
562
+ font-size: 0.7rem;
563
+ line-height: 1.7;
564
+ padding: 0.5rem 0;
565
+ border-left: 1px solid var(--border);
566
+ }
567
+ .preview-toc-title {
568
+ font-size: 0.65rem;
569
+ font-weight: 700;
570
+ text-transform: uppercase;
571
+ letter-spacing: 0.05em;
572
+ color: var(--fg2);
573
+ padding: 0 0.5rem 0.35rem;
574
+ border-bottom: 1px solid var(--border);
575
+ margin-bottom: 0.35rem;
576
+ }
577
+ .preview-toc a {
578
+ color: var(--fg2);
579
+ text-decoration: none;
580
+ display: block;
581
+ white-space: nowrap;
582
+ overflow: hidden;
583
+ text-overflow: ellipsis;
584
+ border-radius: 0.25rem;
585
+ padding: 0.1rem 0.5rem;
586
+ }
587
+ .preview-toc a:hover {
588
+ color: var(--accent);
589
+ background: var(--hover);
590
+ }
591
+ .preview-toc a.h2 {
592
+ padding-left: 0.5rem;
593
+ }
594
+ .preview-toc a.h3 {
595
+ padding-left: 1.25rem;
596
+ }
597
+ .preview-toc a.h4 {
598
+ padding-left: 2rem;
599
+ }
600
+
601
+ /* Nodes bottom panel */
602
+
603
+ /* Side-by-side split */
604
+ /* Block-based content area */
605
+ .preview-content-area {
606
+ display: grid;
607
+ grid-template-columns: 1fr;
608
+ min-height: 0;
609
+ overflow: hidden;
610
+ }
611
+ .preview-content-area:has(.preview-toc) {
612
+ grid-template-columns: 1fr 180px;
613
+ }
614
+ .preview-body-blocks {
615
+ overflow-y: auto;
616
+ background: var(--bg);
617
+ }
618
+ .preview-loading {
619
+ padding: 2rem;
620
+ text-align: center;
621
+ color: var(--fg2);
622
+ }
623
+ .preview-stats {
624
+ font-size: 0.7rem;
625
+ color: var(--fg2);
626
+ font-weight: 400;
627
+ margin-left: 0.5rem;
628
+ }
629
+
630
+ /* Block header row */
631
+ .block-header {
632
+ display: grid;
633
+ position: sticky;
634
+ top: 0;
635
+ z-index: 2;
636
+ background: var(--card);
637
+ border-bottom: 1px solid var(--border);
638
+ }
639
+ .col-hdr {
640
+ padding: 0.25rem 0.5rem;
641
+ font-size: 0.6rem;
642
+ font-weight: 700;
643
+ text-transform: uppercase;
644
+ letter-spacing: 0.05em;
645
+ color: var(--fg2);
646
+ }
647
+ .gutter-hdr {
648
+ text-align: right;
649
+ padding-right: 0.4rem;
650
+ border-right: 1px solid var(--border);
651
+ background: var(--bg2);
652
+ }
653
+
654
+ /* Block rows */
655
+ .block-row {
656
+ display: grid;
657
+ border-bottom: 1px dashed color-mix(in srgb, var(--border) 50%, transparent);
658
+ }
659
+ .block-row:last-child {
660
+ border-bottom: none;
661
+ }
662
+ .block-blank {
663
+ min-height: 1.2rem;
664
+ max-height: 1.2rem;
665
+ overflow: hidden;
666
+ }
667
+ .block-gap {
668
+ opacity: 0.5;
669
+ }
670
+ .block-gap .block-gutter {
671
+ opacity: 1;
672
+ }
673
+ .gutter-blank {
674
+ display: block;
675
+ height: 0.5rem;
676
+ }
677
+ .gutter-gap {
678
+ font-size: 0.45rem;
679
+ color: var(--fg2);
680
+ opacity: 0.5;
681
+ font-family: var(--mono);
682
+ }
683
+ .block-gutter {
684
+ text-align: right;
685
+ padding: 0.2rem 0.4rem 0.2rem 0;
686
+ border-right: 1px solid var(--border);
687
+ background: var(--bg2);
688
+ user-select: none;
689
+ align-self: stretch;
690
+ }
691
+ .gutter-md5 {
692
+ font-size: 0.55rem;
693
+ font-family: var(--mono);
694
+ cursor: text;
695
+ user-select: text;
696
+ }
697
+ .gutter-md5.done {
698
+ color: var(--green);
699
+ }
700
+ .gutter-md5.miss {
701
+ color: var(--red);
702
+ font-weight: 700;
703
+ }
704
+ .block-cell {
705
+ margin: 0;
706
+ padding: 0.2rem 0.5rem;
707
+ font-family: var(--mono);
708
+ font-size: 0.72rem;
709
+ line-height: 1.6;
710
+ white-space: pre-wrap;
711
+ word-break: break-word;
712
+ color: var(--code-fg);
713
+ border-right: 1px solid var(--border);
714
+ }
715
+ .block-cell:last-child {
716
+ border-right: none;
717
+ }
718
+ .block-heading {
719
+ color: var(--accent);
720
+ font-weight: 700;
721
+ }
722
+ .block-missing {
723
+ background: color-mix(in srgb, var(--bg) 95%, var(--red));
724
+ }
725
+ .block-highlight {
726
+ background: color-mix(in srgb, var(--accent) 15%, transparent);
727
+ transition: background 0.3s;
728
+ }
729
+
730
+ /* Dialog */
731
+ .dialog-overlay {
732
+ position: fixed;
733
+ inset: 0;
734
+ background: rgba(0, 0, 0, 0.6);
735
+ display: flex;
736
+ align-items: center;
737
+ justify-content: center;
738
+ z-index: 100;
739
+ }
740
+ .dialog {
741
+ background: var(--card);
742
+ border: 1px solid var(--border);
743
+ border-radius: 0.75rem;
744
+ padding: 1.5rem;
745
+ width: 420px;
746
+ max-width: 90vw;
747
+ }
748
+ .dialog.dialog-wide {
749
+ width: 620px;
750
+ }
751
+ .dialog-mode-toggle {
752
+ display: flex;
753
+ gap: 0;
754
+ margin-bottom: 0.75rem;
755
+ border: 1px solid var(--border);
756
+ border-radius: 0.375rem;
757
+ overflow: hidden;
758
+ }
759
+ .dialog-mode-toggle button {
760
+ flex: 1;
761
+ padding: 0.5rem;
762
+ border: none;
763
+ background: transparent;
764
+ color: var(--fg2);
765
+ cursor: pointer;
766
+ font-size: 0.8rem;
767
+ font-weight: 600;
768
+ }
769
+ .dialog-mode-toggle button.active {
770
+ background: var(--accent);
771
+ color: var(--btn-fg);
772
+ }
773
+ .dialog-mode-toggle.small {
774
+ margin-bottom: 0;
775
+ border: none;
776
+ gap: 2px;
777
+ }
778
+ .dialog-mode-toggle.small button {
779
+ padding: 0.2rem 0.5rem;
780
+ font-size: 0.7rem;
781
+ border: 1px solid var(--border);
782
+ border-radius: 0.25rem;
783
+ }
784
+ .dialog-mode-hint {
785
+ font-size: 0.7rem;
786
+ color: var(--fg2);
787
+ margin: -0.5rem 0 0.75rem;
788
+ }
789
+ .dialog-section-hdr {
790
+ display: flex;
791
+ align-items: center;
792
+ justify-content: space-between;
793
+ margin-bottom: 0.5rem;
794
+ font-weight: 600;
795
+ font-size: 0.85rem;
796
+ }
797
+ .dialog-error {
798
+ color: var(--red);
799
+ font-size: 0.85rem;
800
+ margin-bottom: 0.5rem;
801
+ }
802
+ .dialog-grid {
803
+ display: grid;
804
+ grid-template-columns: 1fr 1fr;
805
+ gap: 0.75rem;
806
+ margin-bottom: 0.75rem;
807
+ }
808
+
809
+ /* Model filters */
810
+ .model-filters {
811
+ display: flex;
812
+ gap: 0.35rem;
813
+ margin-bottom: 0.5rem;
814
+ flex-wrap: wrap;
815
+ align-items: center;
816
+ }
817
+ .model-filters select,
818
+ .model-search-input {
819
+ font-size: 0.7rem;
820
+ padding: 0.3rem 0.4rem;
821
+ background: var(--bg);
822
+ color: var(--fg);
823
+ border: 1px solid var(--border);
824
+ border-radius: 0.25rem;
825
+ }
826
+ .model-search-input {
827
+ flex: 1;
828
+ min-width: 100px;
829
+ }
830
+ .model-filter-check {
831
+ display: flex;
832
+ align-items: center;
833
+ gap: 0.25rem;
834
+ font-size: 0.7rem;
835
+ color: var(--fg2);
836
+ cursor: pointer;
837
+ white-space: nowrap;
838
+ }
839
+ .model-filter-check input {
840
+ margin: 0;
841
+ }
842
+
843
+ /* Model slider */
844
+ .model-slider-row {
845
+ display: flex;
846
+ align-items: center;
847
+ gap: 0.5rem;
848
+ margin-bottom: 0.5rem;
849
+ }
850
+ .model-slider-label {
851
+ font-size: 0.7rem;
852
+ color: var(--fg2);
853
+ white-space: nowrap;
854
+ min-width: 90px;
855
+ }
856
+ .model-slider {
857
+ flex: 1;
858
+ accent-color: var(--accent);
859
+ height: 4px;
860
+ }
861
+
862
+ /* Model list */
863
+ .model-list {
864
+ border: 1px solid var(--border);
865
+ border-radius: 0.375rem;
866
+ max-height: 200px;
867
+ overflow-y: auto;
868
+ background: var(--bg);
869
+ margin-bottom: 0.25rem;
870
+ }
871
+ .model-item {
872
+ display: flex;
873
+ justify-content: space-between;
874
+ align-items: center;
875
+ padding: 0.35rem 0.6rem;
876
+ cursor: pointer;
877
+ font-size: 0.72rem;
878
+ border-bottom: 1px solid var(--border);
879
+ gap: 0.5rem;
880
+ color: var(--fg);
881
+ }
882
+ .model-item:last-child {
883
+ border-bottom: none;
884
+ }
885
+ .model-item:hover {
886
+ background: var(--hover);
887
+ }
888
+ .model-item.active {
889
+ background: var(--accent);
890
+ color: var(--btn-fg);
891
+ }
892
+ .model-item.disabled {
893
+ color: var(--fg2);
894
+ cursor: default;
895
+ justify-content: center;
896
+ }
897
+ .model-check {
898
+ flex-shrink: 0;
899
+ margin: 0 0.3rem 0 0;
900
+ pointer-events: none;
901
+ }
902
+ .model-name {
903
+ overflow: hidden;
904
+ text-overflow: ellipsis;
905
+ white-space: nowrap;
906
+ flex: 1;
907
+ min-width: 0;
908
+ }
909
+ .model-meta {
910
+ color: var(--fg2);
911
+ font-size: 0.65rem;
912
+ white-space: nowrap;
913
+ flex-shrink: 0;
914
+ max-width: 40%;
915
+ overflow: hidden;
916
+ text-overflow: ellipsis;
917
+ }
918
+ .model-item.active .model-meta {
919
+ color: rgba(255, 255, 255, 0.75);
920
+ }
921
+ .model-count {
922
+ font-size: 0.65rem;
923
+ color: var(--fg2);
924
+ margin-bottom: 0.5rem;
925
+ }
926
+
927
+ /* Model info card */
928
+ .model-info {
929
+ font-size: 0.75rem;
930
+ color: var(--fg2);
931
+ padding: 0.5rem 0.6rem;
932
+ background: var(--bg);
933
+ border: 1px solid var(--border);
934
+ border-radius: 0.375rem;
935
+ margin-bottom: 0.75rem;
936
+ }
937
+ .model-info strong {
938
+ color: var(--fg);
939
+ }
940
+ .badge-free,
941
+ .badge-json {
942
+ display: inline-block;
943
+ font-size: 0.55rem;
944
+ font-weight: 700;
945
+ padding: 0.1rem 0.3rem;
946
+ border-radius: 0.2rem;
947
+ margin-left: 0.4rem;
948
+ vertical-align: middle;
949
+ }
950
+ .badge-free {
951
+ background: var(--green);
952
+ color: #fff;
953
+ }
954
+ .badge-json {
955
+ background: var(--accent);
956
+ color: #fff;
957
+ }
958
+ .dialog h3 {
959
+ margin-bottom: 1rem;
960
+ }
961
+ .dialog label {
962
+ display: block;
963
+ font-size: 0.85rem;
964
+ color: var(--fg2);
965
+ margin: 0.75rem 0 0.25rem;
966
+ }
967
+ .dialog input:not([type="checkbox"]):not([type="range"]),
968
+ .dialog select {
969
+ width: 100%;
970
+ background: var(--bg);
971
+ color: var(--fg);
972
+ border: 1px solid var(--border);
973
+ padding: 0.5rem;
974
+ border-radius: 0.375rem;
975
+ font-size: 0.85rem;
976
+ }
977
+ .dialog .actions {
978
+ display: flex;
979
+ justify-content: flex-end;
980
+ gap: 0.5rem;
981
+ margin-top: 1.5rem;
982
+ }
983
+ .dialog .file-list-preview {
984
+ margin-top: 0.75rem;
985
+ padding: 0.75rem;
986
+ background: var(--bg);
987
+ border-radius: 0.375rem;
988
+ font-size: 0.8rem;
989
+ max-height: 150px;
990
+ overflow-y: auto;
991
+ color: var(--fg2);
992
+ }
993
+
994
+ /* Toast */
995
+ .toast {
996
+ position: fixed;
997
+ bottom: 1.5rem;
998
+ left: 50%;
999
+ transform: translateX(-50%);
1000
+ background: var(--accent);
1001
+ color: #fff;
1002
+ padding: 0.6rem 1.2rem;
1003
+ border-radius: 0.5rem;
1004
+ font-size: 0.85rem;
1005
+ font-weight: 500;
1006
+ z-index: 200;
1007
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
1008
+ animation: toast-in 0.2s ease-out;
1009
+ }
1010
+ @keyframes toast-in {
1011
+ from {
1012
+ opacity: 0;
1013
+ transform: translateX(-50%) translateY(10px);
1014
+ }
1015
+ to {
1016
+ opacity: 1;
1017
+ transform: translateX(-50%) translateY(0);
1018
+ }
1019
+ }
1020
+
1021
+ /* Context menu */
1022
+ .ctx-menu {
1023
+ position: fixed;
1024
+ z-index: 300;
1025
+ background: var(--card);
1026
+ border: 1px solid var(--border);
1027
+ border-radius: 0.5rem;
1028
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
1029
+ min-width: 160px;
1030
+ padding: 0.25rem 0;
1031
+ font-size: 0.8rem;
1032
+ }
1033
+ .ctx-menu-header {
1034
+ padding: 0.35rem 0.75rem;
1035
+ border-bottom: 1px solid var(--border);
1036
+ font-size: 0.65rem;
1037
+ color: var(--fg2);
1038
+ display: flex;
1039
+ align-items: center;
1040
+ gap: 0.5rem;
1041
+ }
1042
+ .ctx-menu-header code {
1043
+ font-family: var(--mono);
1044
+ }
1045
+ .ctx-menu-type {
1046
+ background: var(--bg);
1047
+ padding: 0.05rem 0.3rem;
1048
+ border-radius: 0.2rem;
1049
+ border: 1px solid var(--border);
1050
+ font-size: 0.55rem;
1051
+ }
1052
+ .ctx-menu button {
1053
+ display: block;
1054
+ width: 100%;
1055
+ padding: 0.4rem 0.75rem;
1056
+ text-align: left;
1057
+ border: none;
1058
+ background: none;
1059
+ color: var(--fg);
1060
+ cursor: pointer;
1061
+ font-size: 0.8rem;
1062
+ }
1063
+ .ctx-menu button:hover {
1064
+ background: var(--hover);
1065
+ }
1066
+ .ctx-menu-danger {
1067
+ color: var(--red);
1068
+ }
1069
+ .ctx-menu-danger:hover {
1070
+ background: color-mix(in srgb, var(--red) 10%, transparent);
1071
+ }
1072
+
1073
+ /* Log copy button */
1074
+ .log-viewer {
1075
+ position: relative;
1076
+ }
1077
+ .log-copy {
1078
+ position: absolute;
1079
+ top: 0.25rem;
1080
+ right: 0.25rem;
1081
+ background: var(--card);
1082
+ border: 1px solid var(--border);
1083
+ border-radius: 0.25rem;
1084
+ cursor: pointer;
1085
+ font-size: 0.7rem;
1086
+ padding: 0.15rem 0.3rem;
1087
+ opacity: 0;
1088
+ transition: opacity 0.15s;
1089
+ z-index: 1;
1090
+ }
1091
+ .log-viewer:hover .log-copy {
1092
+ opacity: 1;
1093
+ }
1094
+ .log-copy:hover {
1095
+ background: var(--hover);
1096
+ }