-
Notifications
You must be signed in to change notification settings - Fork 44
Expand file tree
/
Copy pathoptions.html
More file actions
940 lines (894 loc) · 50.7 KB
/
options.html
File metadata and controls
940 lines (894 loc) · 50.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>VocabMeld 设置</title>
<link rel="stylesheet" href="css/options.css">
</head>
<body>
<div class="options-container">
<!-- 侧边栏 -->
<aside class="sidebar">
<div class="sidebar-header">
<img src="icons/icon48.png" alt="VocabMeld" class="sidebar-logo">
<h1>VocabMeld</h1>
<span class="version">v1.2.0</span>
</div>
<nav class="sidebar-nav">
<a href="#api" class="nav-item active" data-section="api">
<svg viewBox="0 0 24 24" width="20" height="20">
<path fill="currentColor" d="M12,1L3,5V11C3,16.55 6.84,21.74 12,23C17.16,21.74 21,16.55 21,11V5L12,1M12,5A3,3 0 0,1 15,8A3,3 0 0,1 12,11A3,3 0 0,1 9,8A3,3 0 0,1 12,5M17.13,17C15.92,18.85 14.11,20.24 12,20.92C9.89,20.24 8.08,18.85 6.87,17C6.53,16.5 6.24,16 6,15.47C6,13.82 8.71,12.47 12,12.47C15.29,12.47 18,13.79 18,15.47C17.76,16 17.47,16.5 17.13,17Z"/>
</svg>
API 配置
</a>
<a href="#learning" class="nav-item" data-section="learning">
<svg viewBox="0 0 24 24" width="20" height="20">
<path fill="currentColor" d="M12,3L1,9L12,15L21,10.09V17H23V9M5,13.18V17.18L12,21L19,17.18V13.18L12,17L5,13.18Z"/>
</svg>
学习偏好
</a>
<a href="#behavior" class="nav-item" data-section="behavior">
<svg viewBox="0 0 24 24" width="20" height="20">
<path fill="currentColor" d="M12,15.5A3.5,3.5 0 0,1 8.5,12A3.5,3.5 0 0,1 12,8.5A3.5,3.5 0 0,1 15.5,12A3.5,3.5 0 0,1 12,15.5M19.43,12.97C19.47,12.65 19.5,12.33 19.5,12C19.5,11.67 19.47,11.34 19.43,11L21.54,9.37C21.73,9.22 21.78,8.95 21.66,8.73L19.66,5.27C19.54,5.05 19.27,4.96 19.05,5.05L16.56,6.05C16.04,5.66 15.5,5.32 14.87,5.07L14.5,2.42C14.46,2.18 14.25,2 14,2H10C9.75,2 9.54,2.18 9.5,2.42L9.13,5.07C8.5,5.32 7.96,5.66 7.44,6.05L4.95,5.05C4.73,4.96 4.46,5.05 4.34,5.27L2.34,8.73C2.21,8.95 2.27,9.22 2.46,9.37L4.57,11C4.53,11.34 4.5,11.67 4.5,12C4.5,12.33 4.53,12.65 4.57,12.97L2.46,14.63C2.27,14.78 2.21,15.05 2.34,15.27L4.34,18.73C4.46,18.95 4.73,19.03 4.95,18.95L7.44,17.94C7.96,18.34 8.5,18.68 9.13,18.93L9.5,21.58C9.54,21.82 9.75,22 10,22H14C14.25,22 14.46,21.82 14.5,21.58L14.87,18.93C15.5,18.67 16.04,18.34 16.56,17.94L19.05,18.95C19.27,19.03 19.54,18.95 19.66,18.73L21.66,15.27C21.78,15.05 21.73,14.78 21.54,14.63L19.43,12.97Z"/>
</svg>
行为设置
</a>
<a href="#style" class="nav-item" data-section="style">
<svg viewBox="0 0 24 24" width="20" height="20">
<path fill="currentColor" d="M17.5,12A1.5,1.5 0 0,1 16,10.5A1.5,1.5 0 0,1 17.5,9A1.5,1.5 0 0,1 19,10.5A1.5,1.5 0 0,1 17.5,12M14.5,8A1.5,1.5 0 0,1 13,6.5A1.5,1.5 0 0,1 14.5,5A1.5,1.5 0 0,1 16,6.5A1.5,1.5 0 0,1 14.5,8M9.5,8A1.5,1.5 0 0,1 8,6.5A1.5,1.5 0 0,1 9.5,5A1.5,1.5 0 0,1 11,6.5A1.5,1.5 0 0,1 9.5,8M6.5,12A1.5,1.5 0 0,1 5,10.5A1.5,1.5 0 0,1 6.5,9A1.5,1.5 0 0,1 8,10.5A1.5,1.5 0 0,1 6.5,12M12,3A9,9 0 0,0 3,12A9,9 0 0,0 12,21A1.5,1.5 0 0,0 13.5,19.5C13.5,19.11 13.35,18.76 13.11,18.5C12.88,18.23 12.73,17.88 12.73,17.5A1.5,1.5 0 0,1 14.23,16H16A5,5 0 0,0 21,11C21,6.58 16.97,3 12,3Z"/>
</svg>
主题样式
</a>
<a href="#sites" class="nav-item" data-section="sites">
<svg viewBox="0 0 24 24" width="20" height="20">
<path fill="currentColor" d="M16.36,14C16.44,13.34 16.5,12.68 16.5,12C16.5,11.32 16.44,10.66 16.36,10H19.74C19.9,10.64 20,11.31 20,12C20,12.69 19.9,13.36 19.74,14M14.59,19.56C15.19,18.45 15.65,17.25 15.97,16H18.92C17.96,17.65 16.43,18.93 14.59,19.56M14.34,14H9.66C9.56,13.34 9.5,12.68 9.5,12C9.5,11.32 9.56,10.65 9.66,10H14.34C14.43,10.65 14.5,11.32 14.5,12C14.5,12.68 14.43,13.34 14.34,14M12,19.96C11.17,18.76 10.5,17.43 10.09,16H13.91C13.5,17.43 12.83,18.76 12,19.96M8,8H5.08C6.03,6.34 7.57,5.06 9.4,4.44C8.8,5.55 8.35,6.75 8,8M5.08,16H8C8.35,17.25 8.8,18.45 9.4,19.56C7.57,18.93 6.03,17.65 5.08,16M4.26,14C4.1,13.36 4,12.69 4,12C4,11.31 4.1,10.64 4.26,10H7.64C7.56,10.66 7.5,11.32 7.5,12C7.5,12.68 7.56,13.34 7.64,14M12,4.03C12.83,5.23 13.5,6.57 13.91,8H10.09C10.5,6.57 11.17,5.23 12,4.03M18.92,8H15.97C15.65,6.75 15.19,5.55 14.59,4.44C16.43,5.07 17.96,6.34 18.92,8M12,2C6.47,2 2,6.5 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z"/>
</svg>
站点规则
</a>
<a href="#words" class="nav-item" data-section="words">
<svg viewBox="0 0 24 24" width="20" height="20">
<path fill="currentColor" d="M19,3H14.82C14.4,1.84 13.3,1 12,1C10.7,1 9.6,1.84 9.18,3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3M12,3A1,1 0 0,1 13,4A1,1 0 0,1 12,5A1,1 0 0,1 11,4A1,1 0 0,1 12,3M7,7H17V5H19V19H5V5H7V7M7.5,13.5L9,12L11,14L15.5,9.5L17,11L11,17L7.5,13.5Z"/>
</svg>
词汇管理
</a>
<a href="#more" class="nav-item" data-section="more">
<svg viewBox="0 0 24 24" width="20" height="20">
<path fill="currentColor" d="M12,16A2,2 0 0,1 14,18A2,2 0 0,1 12,20A2,2 0 0,1 10,18A2,2 0 0,1 12,16M12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12A2,2 0 0,1 12,10M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8A2,2 0 0,1 10,6A2,2 0 0,1 12,4Z"/>
</svg>
更多
</a>
</nav>
</aside>
<!-- 主内容区 -->
<main class="main-content">
<!-- API 配置 -->
<section id="api" class="settings-section active">
<h2>API 配置</h2>
<p class="section-desc">管理 AI 服务节点,支持多节点轮询和自动故障转移</p>
<div class="form-group">
<div class="endpoints-header">
<label>API 节点</label>
<button type="button" class="btn btn-primary btn-sm" id="addEndpointBtn">
<svg viewBox="0 0 24 24" width="16" height="16">
<path fill="currentColor" d="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z"/>
</svg>
添加节点
</button>
</div>
<p class="help-text">按从上到下的顺序轮询已启用的节点,拖拽可调整顺序</p>
<div class="endpoints-list" id="endpointsList">
<!-- 节点卡片将由 JS 动态生成 -->
</div>
</div>
</section>
<!-- 节点编辑弹窗 -->
<div class="modal" id="endpointModal">
<div class="modal-content">
<div class="modal-header">
<h3 id="endpointModalTitle">编辑节点</h3>
<button type="button" class="modal-close" id="cancelEndpointBtn">
<svg viewBox="0 0 24 24" width="20" height="20">
<path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"/>
</svg>
</button>
</div>
<form id="endpointForm" class="modal-body">
<div class="form-group">
<label for="endpointPreset">从预设选择</label>
<select id="endpointPreset">
<option value="">OpenAI API 兼容格式</option>
</select>
</div>
<div class="form-group">
<label for="endpointName">节点名称</label>
<input type="text" id="endpointName" placeholder="例如:DeepSeek">
</div>
<div class="form-group">
<label for="endpointUrl">API 地址</label>
<input type="url" id="endpointUrl" placeholder="https://api.example.com/v1/chat/completions">
</div>
<div class="form-group">
<label for="endpointApiKey">API 密钥</label>
<div class="input-with-toggle">
<input type="password" id="endpointApiKey" placeholder="sk-xxxxx">
<button type="button" class="toggle-visibility" id="toggleEndpointApiKey">
<svg viewBox="0 0 24 24" width="20" height="20">
<path fill="currentColor" d="M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9M12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17M12,4.5C7,4.5 2.73,7.61 1,12C2.73,16.39 7,19.5 12,19.5C17,19.5 21.27,16.39 23,12C21.27,7.61 17,4.5 12,4.5Z"/>
</svg>
</button>
</div>
</div>
<div class="form-group">
<label for="endpointModel">模型名称</label>
<input type="text" id="endpointModel" placeholder="gpt-4o-mini">
</div>
<div class="form-group">
<label for="endpointQpm">速率限制 (QPM)</label>
<input type="number" id="endpointQpm" placeholder="360" min="0" value="360">
<p class="help-text">每分钟请求数上限,0 表示不限制</p>
</div>
</form>
<div class="modal-footer">
<button type="button" class="btn btn-danger" id="deleteEndpointBtn" style="margin-right: auto;">
<svg viewBox="0 0 24 24" width="16" height="16">
<path fill="currentColor" d="M19,4H15.5L14.5,3H9.5L8.5,4H5V6H19M6,19A2,2 0 0,0 8,21H16A2,2 0 0,0 18,19V7H6V19Z"/>
</svg>
删除
</button>
<span class="test-result" id="testEndpointResult"></span>
<button type="button" class="btn btn-secondary" id="testEndpointBtn">
<svg viewBox="0 0 24 24" width="16" height="16">
<path fill="currentColor" d="M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M11,16.5L18,9.5L16.59,8.09L11,13.67L7.91,10.59L6.5,12L11,16.5Z"/>
</svg>
测试
</button>
<button type="button" class="btn btn-primary" id="saveEndpointBtn">
<svg viewBox="0 0 24 24" width="16" height="16">
<path fill="currentColor" d="M15,9H5V5H15M12,19A3,3 0 0,1 9,16A3,3 0 0,1 12,13A3,3 0 0,1 15,16A3,3 0 0,1 12,19M17,3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V7L17,3Z"/>
</svg>
保存
</button>
</div>
</div>
</div>
<!-- 学习偏好 -->
<section id="learning" class="settings-section">
<h2>学习偏好</h2>
<p class="section-desc">设置你的语言学习目标和难度</p>
<div class="form-row">
<div class="form-group">
<label for="nativeLanguage">母语语言</label>
<select id="nativeLanguage">
<option value="zh-CN">简体中文</option>
<option value="zh-TW">繁体中文</option>
<option value="en">English</option>
<option value="ja">日本語</option>
<option value="ko">한국어</option>
</select>
</div>
<div class="form-group">
<label for="targetLanguage">学习语言</label>
<select id="targetLanguage">
<option value="en">English</option>
<option value="zh-CN">简体中文</option>
<option value="zh-TW">繁体中文</option>
<option value="ja">日本語</option>
<option value="ko">한국어</option>
<option value="fr">Français</option>
<option value="de">Deutsch</option>
<option value="es">Español</option>
</select>
</div>
</div>
<div class="form-group">
<label>处理模式</label>
<p class="help-text">选择要处理的网页语言类型</p>
<div class="process-mode-selector">
<label class="process-mode-option">
<input type="radio" name="processMode" value="both" checked>
<span class="process-mode-card">
<span class="process-mode-icon">
<svg viewBox="0 0 24 24" width="24" height="24"><path fill="currentColor" d="M6.99,11L3,15L6.99,19V16H14V14H6.99V11M21,9L17.01,5V8H10V10H17.01V13L21,9Z"/></svg>
</span>
<span class="process-mode-name">双向处理</span>
</span>
</label>
<label class="process-mode-option">
<input type="radio" name="processMode" value="native-only">
<span class="process-mode-card">
<span class="process-mode-icon">
<svg viewBox="0 0 24 24" width="24" height="24"><path fill="currentColor" d="M9,3L5,7H8V14H10V7H13L9,3M16,17V10H14V17H11L15,21L19,17H16Z"/></svg>
</span>
<span class="process-mode-name">仅母语网页</span>
</span>
</label>
<label class="process-mode-option">
<input type="radio" name="processMode" value="target-only">
<span class="process-mode-card">
<span class="process-mode-icon">
<svg viewBox="0 0 24 24" width="24" height="24"><path fill="currentColor" d="M12,3L8,7H11V14H13V7H16L12,3M5,17V10H3V17H0L4,21L8,17H5M14,17H19V10H21V17H24L20,21L16,17H14Z"/></svg>
</span>
<span class="process-mode-name">仅学习语言</span>
</span>
</label>
</div>
</div>
<div class="form-group">
<label>难度区间 (CEFR)</label>
<div class="difficulty-selector">
<div class="difficulty-range">
<div class="difficulty-range-track">
<div class="difficulty-range-progress" id="difficultyRangeProgress"></div>
<input type="range" id="difficultyMin" min="0" max="5" value="2" step="1">
<input type="range" id="difficultyMax" min="0" max="5" value="5" step="1">
</div>
<div class="difficulty-labels">
<span>A1</span>
<span>A2</span>
<span>B1</span>
<span>B2</span>
<span>C1</span>
<span>C2</span>
</div>
</div>
<div class="difficulty-range-footer">
<p class="help-text">仅显示 <strong id="selectedDifficulty">B1 - C2</strong> 范围内的词汇,自动避开过于简单或困难的结果</p>
<div class="difficulty-presets">
<button type="button" class="difficulty-preset" data-min="0" data-max="2">
<span class="preset-title">打基础</span>
<span class="preset-range">A1-B1</span>
</button>
<button type="button" class="difficulty-preset" data-min="1" data-max="4">
<span class="preset-title">均衡输入</span>
<span class="preset-range">A2-C1</span>
</button>
<button type="button" class="difficulty-preset" data-min="3" data-max="5">
<span class="preset-title">高阶挑战</span>
<span class="preset-range">B2-C2</span>
</button>
</div>
</div>
</div>
</div>
<div class="form-group">
<label>替换强度</label>
<div class="intensity-selector">
<label class="intensity-option">
<input type="radio" name="intensity" value="low">
<span class="intensity-card">
<span class="intensity-icon">
<svg viewBox="0 0 24 24" width="24" height="24"><path fill="currentColor" d="M19,2L14,6.5V17.5L19,13V2M6.5,5C4.55,5 2.45,5.4 1,6.5V21.16C1,21.41 1.25,21.66 1.5,21.66C1.6,21.66 1.65,21.59 1.75,21.59C3.1,20.94 5.05,20.5 6.5,20.5C8.45,20.5 10.55,20.9 12,22C13.35,21.15 15.8,20.5 17.5,20.5C19.15,20.5 20.85,20.81 22.25,21.56C22.35,21.61 22.4,21.59 22.5,21.59C22.75,21.59 23,21.34 23,21.09V6.5C22.4,6.05 21.75,5.75 21,5.5V19C19.9,18.65 18.7,18.5 17.5,18.5C15.8,18.5 13.35,19.15 12,20V6.5C10.55,5.4 8.45,5 6.5,5Z"/></svg>
</span>
<span class="intensity-name">较少</span>
<span class="intensity-desc">每段 4 词</span>
</span>
</label>
<label class="intensity-option">
<input type="radio" name="intensity" value="medium" checked>
<span class="intensity-card">
<span class="intensity-icon">
<svg viewBox="0 0 24 24" width="24" height="24"><path fill="currentColor" d="M12,11.55C9.64,9.35 6.48,8 3,8V19C6.48,19 9.64,20.35 12,22.55C14.36,20.35 17.52,19 21,19V8C17.52,8 14.36,9.35 12,11.55M12,8A3,3 0 0,0 15,5A3,3 0 0,0 12,2A3,3 0 0,0 9,5A3,3 0 0,0 12,8Z"/></svg>
</span>
<span class="intensity-name">适中</span>
<span class="intensity-desc">每段 8 词</span>
</span>
</label>
<label class="intensity-option">
<input type="radio" name="intensity" value="high">
<span class="intensity-card">
<span class="intensity-icon">
<svg viewBox="0 0 24 24" width="24" height="24"><path fill="currentColor" d="M12,3L1,9L12,15L21,10.09V17H23V9M5,13.18V17.18L12,21L19,17.18V13.18L12,17L5,13.18Z"/></svg>
</span>
<span class="intensity-name">较多</span>
<span class="intensity-desc">每段 14 词</span>
</span>
</label>
</div>
</div>
<div class="form-group">
<label>发音设置</label>
<p class="help-text">配置学习语言的发音声音和语速</p>
<div class="voice-settings">
<div class="voice-setting-row">
<label for="ttsVoice">声音</label>
<div class="voice-select-wrapper">
<select id="ttsVoice">
<option value="">系统默认</option>
</select>
<button type="button" class="btn-icon" id="testVoiceBtn" title="测试发音">
<svg viewBox="0 0 24 24" width="18" height="18">
<path fill="currentColor" d="M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z"/>
</svg>
</button>
</div>
</div>
<div class="voice-setting-row">
<label for="ttsRate">语速 (<span id="ttsRateValue">1.0</span>x)</label>
<input type="range" id="ttsRate" min="0.5" max="2" step="0.1" value="1.0">
</div>
</div>
</div>
</section>
<!-- 行为设置 -->
<section id="behavior" class="settings-section">
<h2>行为设置</h2>
<p class="section-desc">控制插件的自动化行为</p>
<div class="toggle-group">
<div class="toggle-item">
<div class="toggle-info">
<span class="toggle-title">自动处理新页面</span>
<span class="toggle-desc">打开新页面时自动进行词汇替换</span>
</div>
<label class="toggle-switch">
<input type="checkbox" id="autoProcess">
<span class="toggle-slider"></span>
</label>
</div>
<div class="toggle-item">
<div class="toggle-info">
<span class="toggle-title">显示音标</span>
<span class="toggle-desc">在悬停提示中显示学习语言的音标</span>
</div>
<label class="toggle-switch">
<input type="checkbox" id="showPhonetic" checked>
<span class="toggle-slider"></span>
</label>
</div>
<div class="toggle-item">
<div class="toggle-info">
<span class="toggle-title">选中添加到记忆</span>
<span class="toggle-desc">选中文本时显示"添加到需记忆"按钮</span>
</div>
<label class="toggle-switch">
<input type="checkbox" id="showAddMemorize" checked>
<span class="toggle-slider"></span>
</label>
</div>
</div>
<div class="form-group">
<label>词典类型</label>
<div class="intensity-selector">
<label class="intensity-option">
<input type="radio" name="dictionaryType" value="zh-en" checked>
<span class="intensity-card">
<span class="intensity-icon">
<svg viewBox="0 0 24 24" width="24" height="24"><path fill="currentColor" d="M12.87,15.07L10.33,12.56L10.36,12.53C12.1,10.59 13.34,8.36 14.07,6H17V4H10V2H8V4H1V6H12.17C11.5,7.92 10.44,9.75 9,11.35C8.07,10.32 7.3,9.19 6.69,8H4.69C5.42,9.63 6.42,11.17 7.67,12.56L2.58,17.58L4,19L9,14L12.11,17.11L12.87,15.07M18.5,10H16.5L12,22H14L15.12,19H19.87L21,22H23L18.5,10M15.88,17L17.5,12.67L19.12,17H15.88Z"/></svg>
</span>
<span class="intensity-name">中英释义</span>
</span>
</label>
<label class="intensity-option">
<input type="radio" name="dictionaryType" value="en-en">
<span class="intensity-card">
<span class="intensity-icon">
<svg viewBox="0 0 24 24" width="24" height="24"><path fill="currentColor" d="M3,5A2,2 0 0,1 5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5C3.89,21 3,20.1 3,19V5M7,18H9L9.35,17H13.65L14,18H16L13,10H11L8,18H7M12,12L13.2,15.2H10.8L12,12Z"/></svg>
</span>
<span class="intensity-name">英英释义</span>
</span>
</label>
</div>
</div>
<div class="form-group">
<label>缓存上限</label>
<p class="help-text">设置词汇缓存的最大数量,更大的缓存可减少 API 调用</p>
<div class="cache-selector">
<label class="cache-option">
<input type="radio" name="cacheMaxSize" value="500">
<span class="cache-card">
<span class="cache-size">500</span>
<span class="cache-desc">约 50KB</span>
</span>
</label>
<label class="cache-option">
<input type="radio" name="cacheMaxSize" value="1000">
<span class="cache-card">
<span class="cache-size">1000</span>
<span class="cache-desc">约 100KB</span>
</span>
</label>
<label class="cache-option">
<input type="radio" name="cacheMaxSize" value="2000" checked>
<span class="cache-card">
<span class="cache-size">2000</span>
<span class="cache-desc">约 200KB · 默认</span>
</span>
</label>
<label class="cache-option">
<input type="radio" name="cacheMaxSize" value="5000">
<span class="cache-card">
<span class="cache-size">5000</span>
<span class="cache-desc">约 500KB</span>
</span>
</label>
<label class="cache-option">
<input type="radio" name="cacheMaxSize" value="10000">
<span class="cache-card">
<span class="cache-size">10000</span>
<span class="cache-desc">约 1MB</span>
</span>
</label>
</div>
</div>
<div class="form-group">
<label>翻译显示样式</label>
<p class="help-text">选择翻译词汇在页面上的显示方式</p>
<div class="style-selector">
<label class="style-option">
<input type="radio" name="translationStyle" value="translation-original" checked>
<span class="style-card">
<span class="style-preview">译文(原文)</span>
<span class="style-desc">默认样式</span>
</span>
</label>
<label class="style-option">
<input type="radio" name="translationStyle" value="translation-only">
<span class="style-card">
<span class="style-preview">译文</span>
<span class="style-desc">仅显示译文,悬停查看原文</span>
</span>
</label>
<label class="style-option">
<input type="radio" name="translationStyle" value="original-translation">
<span class="style-card">
<span class="style-preview">原文(译文)</span>
<span class="style-desc">原文在前,译文在后</span>
</span>
</label>
</div>
</div>
</section>
<!-- 主题样式 -->
<section id="style" class="settings-section">
<h2>主题样式</h2>
<p class="section-desc">自定义单词替换和卡片的视觉样式</p>
<div class="form-group">
<label>界面主题</label>
<p class="help-text">选择你喜欢的界面外观</p>
<div class="theme-selector">
<label class="theme-option">
<input type="radio" name="theme" value="dark" checked>
<span class="theme-card">
<span class="theme-preview theme-preview-dark">
<span class="theme-dot"></span>
<span class="theme-line"></span>
<span class="theme-line short"></span>
</span>
<span class="theme-name">深色</span>
</span>
</label>
<label class="theme-option">
<input type="radio" name="theme" value="light">
<span class="theme-card">
<span class="theme-preview theme-preview-light">
<span class="theme-dot"></span>
<span class="theme-line"></span>
<span class="theme-line short"></span>
</span>
<span class="theme-name">浅色</span>
</span>
</label>
</div>
</div>
<div class="theme-layout">
<div class="theme-layout-left">
<div class="form-group">
<label>配色样式</label>
<p class="help-text">选择内置主题或创建自定义主题</p>
<div class="color-theme-selector">
<label class="color-theme-option">
<input type="radio" name="colorTheme" value="default" checked>
<span class="color-theme-card">
<span class="color-theme-preview" style="--preview-underline: rgba(99,102,241,0.6); --preview-bg: rgba(99,102,241,0.15); --underline-width: 1.5px; --underline-style: solid;">
<span class="color-theme-word">单词</span><span class="color-theme-original">(word)</span>
</span>
<span class="color-theme-name">默认紫</span>
</span>
</label>
<label class="color-theme-option">
<input type="radio" name="colorTheme" value="ocean">
<span class="color-theme-card">
<span class="color-theme-preview" style="--preview-underline: rgba(14,165,233,0.7); --preview-bg: rgba(14,165,233,0.12); --underline-width: 2px; --underline-style: dashed; --word-color: #0ea5e9; --original-color: #64748b;">
<span class="color-theme-word">单词</span><span class="color-theme-original">(word)</span>
</span>
<span class="color-theme-name">海洋蓝</span>
</span>
</label>
<label class="color-theme-option">
<input type="radio" name="colorTheme" value="forest">
<span class="color-theme-card">
<span class="color-theme-preview" style="--preview-underline: rgba(16,185,129,0.6); --preview-bg: rgba(16,185,129,0.1); --underline-width: 1.5px; --underline-style: dotted; --word-color: #059669; --original-color: #6b7280;">
<span class="color-theme-word">单词</span><span class="color-theme-original">(word)</span>
</span>
<span class="color-theme-name">森林绿</span>
</span>
</label>
<label class="color-theme-option">
<input type="radio" name="colorTheme" value="sunset">
<span class="color-theme-card">
<span class="color-theme-preview" style="--preview-underline: rgba(245,158,11,0.7); --preview-bg: rgba(245,158,11,0.12); --underline-width: 2px; --underline-style: wavy; --word-color: #d97706; --original-color: #78716c;">
<span class="color-theme-word">单词</span><span class="color-theme-original">(word)</span>
</span>
<span class="color-theme-name">日落橙</span>
</span>
</label>
</div>
</div>
<div class="form-group">
<label>效果预览</label>
<div class="style-preview-container">
<div class="style-preview-section">
<div class="style-preview-tooltip" id="previewTooltip">
<div class="preview-tooltip-header">
<span class="preview-tooltip-word">word</span>
<span class="preview-tooltip-badge">A1</span>
<span class="preview-tooltip-btn preview-btn-memorize">
<svg viewBox="0 0 24 24" width="16" height="16"><path fill="currentColor" d="M12.1,18.55L12,18.65L11.89,18.55C7.14,14.24 4,11.39 4,8.5C4,6.5 5.5,5 7.5,5C9.04,5 10.54,6 11.07,7.36H12.93C13.46,6 14.96,5 16.5,5C18.5,5 20,6.5 20,8.5C20,11.39 16.86,14.24 12.1,18.55M16.5,3C14.76,3 13.09,3.81 12,5.08C10.91,3.81 9.24,3 7.5,3C4.42,3 2,5.41 2,8.5C2,12.27 5.4,15.36 10.55,20.03L12,21.35L13.45,20.03C18.6,15.36 22,12.27 22,8.5C22,5.41 19.58,3 16.5,3Z"/></svg>
</span>
</div>
<div class="preview-tooltip-phonetic">
<svg viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z"/></svg>
<span>/wɜːd/</span>
</div>
<div class="preview-tooltip-original">原文: 单词</div>
<div class="preview-tooltip-dict">
<div class="preview-dict-entry">
<span class="preview-dict-pos">n.</span>
<ul class="preview-dict-defs">
<li>单词,词语</li>
</ul>
</div>
</div>
<div class="preview-tooltip-actions">
<span class="preview-tooltip-btn preview-btn-learned">
<svg viewBox="0 0 24 24" width="16" height="16"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"/></svg>
</span>
<span class="preview-tooltip-btn preview-btn-refresh">
<svg viewBox="0 0 24 24" width="16" height="16"><path fill="currentColor" d="M17.65,6.35C16.2,4.9 14.21,4 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C15.73,20 18.84,17.45 19.73,14H17.65C16.83,16.33 14.61,18 12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6C13.66,6 15.14,6.69 16.22,7.78L13,11H20V4L17.65,6.35Z"/></svg>
</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- 站点规则 -->
<section id="sites" class="settings-section">
<h2>站点规则</h2>
<p class="section-desc">控制插件在哪些网站上运行</p>
<div class="form-group">
<label>运行模式</label>
<p class="help-text">选择插件的运行范围</p>
<div class="site-mode-selector">
<label class="site-mode-option">
<input type="radio" name="siteMode" value="all" checked>
<span class="site-mode-card">
<span class="site-mode-icon">
<svg viewBox="0 0 24 24" width="24" height="24"><path fill="currentColor" d="M17.9,17.39C17.64,16.59 16.89,16 16,16H15V13A1,1 0 0,0 14,12H8V10H10A1,1 0 0,0 11,9V7H13A2,2 0 0,0 15,5V4.59C17.93,5.77 20,8.64 20,12C20,14.08 19.2,15.97 17.9,17.39M11,19.93C7.05,19.44 4,16.08 4,12C4,11.38 4.08,10.78 4.21,10.21L9,15V16A2,2 0 0,0 11,18M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z"/></svg>
</span>
<span class="site-mode-info">
<span class="site-mode-title">所有网站</span>
<span class="site-mode-desc">在所有网站运行,可排除特定站点</span>
</span>
</span>
</label>
<label class="site-mode-option">
<input type="radio" name="siteMode" value="whitelist">
<span class="site-mode-card">
<span class="site-mode-icon">
<svg viewBox="0 0 24 24" width="24" height="24"><path fill="currentColor" d="M3,5H9V11H3V5M5,7V9H7V7H5M11,7H21V9H11V7M11,15H21V17H11V15M5,20L1.5,16.5L2.91,15.09L5,17.17L9.59,12.59L11,14L5,20Z"/></svg>
</span>
<span class="site-mode-info">
<span class="site-mode-title">仅指定网站</span>
<span class="site-mode-desc">只在指定的网站上运行</span>
</span>
</span>
</label>
</div>
</div>
<div class="form-group site-list-group" id="excludedSitesGroup">
<label for="excludedSitesInput">排除站点</label>
<p class="help-text">这些站点将不会进行任何处理,每行一个(支持部分匹配,如 "github" 匹配所有包含 github 的域名)</p>
<textarea id="excludedSitesInput" placeholder="example.com github.com"></textarea>
</div>
<div class="form-group site-list-group" id="allowedSitesGroup" style="display: none;">
<label for="allowedSitesInput">指定站点</label>
<p class="help-text">只有这些站点会进行处理,每行一个(支持部分匹配,如 "news" 匹配所有包含 news 的域名)</p>
<textarea id="allowedSitesInput" placeholder="news.example.com blog.example.com"></textarea>
</div>
</section>
<!-- 词汇管理 -->
<section id="words" class="settings-section">
<h2>词汇管理</h2>
<p class="section-desc">管理已学会和需记忆的词汇,查看学习进度</p>
<div class="stats-overview">
<div class="stat-box">
<div class="stat-number" id="statTotalWords">0</div>
<div class="stat-label">累计接触</div>
</div>
<div class="stat-box">
<div class="stat-number" id="statTodayWords">0</div>
<div class="stat-label">今日接触</div>
</div>
<div class="stat-box">
<div class="stat-number" id="statLearnedWords">0</div>
<div class="stat-label">已学会</div>
</div>
<div class="stat-box">
<div class="stat-number" id="statMemorizeWords">0</div>
<div class="stat-label">需记忆</div>
</div>
</div>
<div class="cache-overview">
<div class="cache-bar">
<div class="cache-progress" id="cacheProgress"></div>
</div>
<div class="cache-info">
<span>已缓存: <strong id="statCacheSize">0</strong></span>
<span>命中率: <strong id="statHitRate">0%</strong></span>
<button class="btn btn-text-small" id="resetTodayBtn">重置今日</button>
<button class="btn btn-text-small btn-danger-text" id="resetAllBtn">重置全部</button>
</div>
</div>
<div class="word-tabs">
<button class="word-tab active" data-tab="learned">已学会</button>
<button class="word-tab" data-tab="memorize">需记忆</button>
<button class="word-tab" data-tab="cached">已缓存</button>
</div>
<!-- 已学会页面的搜索和筛选 -->
<div class="word-filters hidden" id="learnedFilters" data-tab="learned">
<div class="search-box">
<input type="text" id="learnedSearchInput" placeholder="搜索单词或翻译..." class="search-input">
<svg viewBox="0 0 24 24" width="18" height="18" class="search-icon">
<path fill="currentColor" d="M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z"/>
</svg>
</div>
<div class="filter-box">
<label>难度筛选:</label>
<div class="difficulty-filters">
<button class="difficulty-filter-btn active" data-difficulty="all" data-tab="learned">全部</button>
<button class="difficulty-filter-btn" data-difficulty="A1" data-tab="learned">A1</button>
<button class="difficulty-filter-btn" data-difficulty="A2" data-tab="learned">A2</button>
<button class="difficulty-filter-btn" data-difficulty="B1" data-tab="learned">B1</button>
<button class="difficulty-filter-btn" data-difficulty="B2" data-tab="learned">B2</button>
<button class="difficulty-filter-btn" data-difficulty="C1" data-tab="learned">C1</button>
<button class="difficulty-filter-btn" data-difficulty="C2" data-tab="learned">C2</button>
</div>
<button class="btn btn-danger-small" id="clearLearnedBtn">清空</button>
</div>
</div>
<!-- 需记忆页面的搜索和筛选 -->
<div class="word-filters hidden" id="memorizeFilters" data-tab="memorize">
<div class="search-box">
<input type="text" id="memorizeSearchInput" placeholder="搜索单词或翻译..." class="search-input">
<svg viewBox="0 0 24 24" width="18" height="18" class="search-icon">
<path fill="currentColor" d="M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z"/>
</svg>
</div>
<div class="filter-box">
<label>难度筛选:</label>
<div class="difficulty-filters">
<button class="difficulty-filter-btn active" data-difficulty="all" data-tab="memorize">全部</button>
<button class="difficulty-filter-btn" data-difficulty="A1" data-tab="memorize">A1</button>
<button class="difficulty-filter-btn" data-difficulty="A2" data-tab="memorize">A2</button>
<button class="difficulty-filter-btn" data-difficulty="B1" data-tab="memorize">B1</button>
<button class="difficulty-filter-btn" data-difficulty="B2" data-tab="memorize">B2</button>
<button class="difficulty-filter-btn" data-difficulty="C1" data-tab="memorize">C1</button>
<button class="difficulty-filter-btn" data-difficulty="C2" data-tab="memorize">C2</button>
</div>
<button class="btn btn-danger-small" id="clearMemorizeBtn">清空</button>
</div>
</div>
<!-- 已缓存页面的搜索和筛选 -->
<div class="word-filters hidden" id="cachedFilters" data-tab="cached">
<div class="search-box">
<input type="text" id="cachedSearchInput" placeholder="搜索单词或翻译..." class="search-input">
<svg viewBox="0 0 24 24" width="18" height="18" class="search-icon">
<path fill="currentColor" d="M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z"/>
</svg>
</div>
<div class="filter-box">
<label>难度筛选:</label>
<div class="difficulty-filters">
<button class="difficulty-filter-btn active" data-difficulty="all" data-tab="cached">全部</button>
<button class="difficulty-filter-btn" data-difficulty="A1" data-tab="cached">A1</button>
<button class="difficulty-filter-btn" data-difficulty="A2" data-tab="cached">A2</button>
<button class="difficulty-filter-btn" data-difficulty="B1" data-tab="cached">B1</button>
<button class="difficulty-filter-btn" data-difficulty="B2" data-tab="cached">B2</button>
<button class="difficulty-filter-btn" data-difficulty="C1" data-tab="cached">C1</button>
<button class="difficulty-filter-btn" data-difficulty="C2" data-tab="cached">C2</button>
</div>
<button class="btn btn-danger-small" id="clearCacheBtn">清空</button>
</div>
</div>
<div class="word-list-container">
<div class="word-list" id="learnedList" data-tab="learned"></div>
<div class="word-list hidden" id="memorizeList" data-tab="memorize"></div>
<div class="word-list hidden" id="cachedList" data-tab="cached"></div>
</div>
</section>
<!-- 设置页面现在自动保存,无需手动保存按钮 -->
<!-- 更多 -->
<section id="more" class="settings-section">
<h2>更多</h2>
<p class="section-desc">关于与数据管理</p>
<!-- 关于信息 -->
<div class="about-card-full">
<div class="about-logo">
<img src="icons/icon128.png" alt="VocabMeld" width="72" height="72">
</div>
<div class="about-content">
<div class="about-info">
<h3>VocabMeld</h3>
<p class="about-tagline">智能替换网页词汇,创造沉浸式双语学习环境</p>
<p class="about-theory">基于「可理解性输入」理论,让语言学习融入日常生活</p>
</div>
<div class="about-meta">
<a href="https://github.com/lzskyline/VocabMeld" target="_blank" class="about-link-btn">
<svg viewBox="0 0 24 24" width="18" height="18">
<path fill="currentColor" d="M12,2A10,10 0 0,0 2,12C2,16.42 4.87,20.17 8.84,21.5C9.34,21.58 9.5,21.27 9.5,21C9.5,20.77 9.5,20.14 9.5,19.31C6.73,19.91 6.14,17.97 6.14,17.97C5.68,16.81 5.03,16.5 5.03,16.5C4.12,15.88 5.1,15.9 5.1,15.9C6.1,15.97 6.63,16.93 6.63,16.93C7.5,18.45 8.97,18 9.54,17.76C9.63,17.11 9.89,16.67 10.17,16.42C7.95,16.17 5.62,15.31 5.62,11.5C5.62,10.39 6,9.5 6.65,8.79C6.55,8.54 6.2,7.5 6.75,6.15C6.75,6.15 7.59,5.88 9.5,7.17C10.29,6.95 11.15,6.84 12,6.84C12.85,6.84 13.71,6.95 14.5,7.17C16.41,5.88 17.25,6.15 17.25,6.15C17.8,7.5 17.45,8.54 17.35,8.79C18,9.5 18.38,10.39 18.38,11.5C18.38,15.32 16.04,16.16 13.81,16.41C14.17,16.72 14.5,17.33 14.5,18.26C14.5,19.6 14.5,20.68 14.5,21C14.5,21.27 14.66,21.59 15.17,21.5C19.14,20.16 22,16.42 22,12A10,10 0 0,0 12,2Z"/>
</svg>
GitHub 仓库
</a>
<span class="about-author-tag">
<svg viewBox="0 0 24 24" width="14" height="14">
<path fill="currentColor" d="M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z"/>
</svg>
<a href="https://github.com/lzskyline" target="_blank">LzSkyline</a>
</span>
</div>
</div>
</div>
<!-- 导入导出 -->
<div class="form-group">
<label>数据导入导出</label>
<p class="help-text">备份或迁移你的学习数据和配置</p>
<div class="export-options">
<div class="export-group">
<h4>选择导出内容</h4>
<div class="checkbox-group">
<label class="checkbox-item">
<input type="checkbox" id="exportSettings" checked>
<span>配置设置(API、选项、站点规则)</span>
</label>
<label class="checkbox-item">
<input type="checkbox" id="exportWords" checked>
<span>词汇数据(已学会、需记忆)</span>
</label>
<label class="checkbox-item">
<input type="checkbox" id="exportStats" checked>
<span>统计数据</span>
</label>
<label class="checkbox-item">
<input type="checkbox" id="exportCache">
<span>缓存词汇(可能较大)</span>
</label>
</div>
</div>
<div class="export-actions">
<button class="btn btn-primary" id="exportDataBtn">
<svg viewBox="0 0 24 24" width="16" height="16">
<path fill="currentColor" d="M5,20H19V18H5M19,9H15V3H9V9H5L12,16L19,9Z"/>
</svg>
导出数据
</button>
<button class="btn btn-secondary" id="importDataBtn">
<svg viewBox="0 0 24 24" width="16" height="16">
<path fill="currentColor" d="M5,20H19V18H5M19,9H15V3H9V9H5L12,16L19,9Z" transform="rotate(180 12 12)"/>
</svg>
导入数据
</button>
<input type="file" id="importFileInput" accept=".json" style="display: none;">
</div>
</div>
</div>
</section>
</main>
<!-- 主题编辑器侧边栏(仅在主题样式页显示) -->
<aside class="theme-editor-sidebar" id="themeEditorSidebar" style="display: none;">
<div class="theme-editor-panel" id="themeEditorPanel">
<div class="theme-editor-header">
<span class="theme-editor-title" id="themeEditorTitle">主题编辑器</span>
<div class="theme-editor-header-actions">
<button type="button" class="btn btn-sm btn-secondary" id="importThemeBtn" title="导入主题">
<svg viewBox="0 0 24 24" width="14" height="14"><path fill="currentColor" d="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M13.5,16V19H10.5V16H8L12,12L16,16H13.5M13,9V3.5L18.5,9H13Z"/></svg>
</button>
<button type="button" class="btn btn-sm btn-secondary" id="exportThemeBtn" title="导出主题">
<svg viewBox="0 0 24 24" width="14" height="14"><path fill="currentColor" d="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M13.5,13V16H10.5V13H8L12,9L16,13H13.5M13,9V3.5L18.5,9H13Z"/></svg>
</button>
</div>
</div>
<div class="theme-editor" id="themeEditorForm">
<div class="theme-editor-row">
<label>主题名称</label>
<input type="text" id="themeNameInput" class="form-input" placeholder="我的主题">
</div>
<div class="theme-editor-row">
<label>主色调</label>
<div class="color-picker-wrapper">
<input type="color" id="primaryColor" value="#6366f1">
<span class="color-value" id="primaryColorValue">#6366f1</span>
</div>
</div>
<div class="theme-editor-row">
<label>下划线颜色</label>
<div class="color-picker-wrapper">
<input type="color" id="underlineColor" value="#6366f1">
<span class="color-value" id="underlineColorValue">#6366f1</span>
</div>
</div>
<div class="theme-editor-row">
<label>下划线宽度</label>
<select id="underlineWidth" class="form-select-sm">
<option value="1px">1px 细线</option>
<option value="2px" selected>2px 标准</option>
<option value="3px">3px 粗线</option>
</select>
</div>
<div class="theme-editor-row">
<label>下划线样式</label>
<select id="underlineStyle" class="form-select-sm">
<option value="solid" selected>实线</option>
<option value="dashed">虚线</option>
<option value="dotted">点线</option>
<option value="wavy">波浪</option>
</select>
</div>
<div class="theme-editor-row">
<label>悬停背景</label>
<div class="color-picker-wrapper">
<input type="color" id="hoverBgColor" value="#6366f1">
<span class="color-value" id="hoverBgColorValue">#6366f1</span>
</div>
</div>
<div class="theme-editor-row">
<label>译文颜色</label>
<div class="color-picker-wrapper">
<input type="checkbox" id="wordColorEnabled" class="color-toggle">
<input type="color" id="wordColor" value="#000000" disabled>
<span class="color-value" id="wordColorValue">保持原样</span>
</div>
</div>
<div class="theme-editor-row">
<label>原文颜色</label>
<div class="color-picker-wrapper">
<input type="checkbox" id="originalColorEnabled" class="color-toggle">
<input type="color" id="originalColor" value="#000000" disabled>
<span class="color-value" id="originalColorValue">保持原样</span>
</div>
</div>
<div class="theme-editor-row">
<label>卡片标题色</label>
<div class="color-picker-wrapper">
<input type="color" id="tooltipWordColor" value="#818cf8">
<span class="color-value" id="tooltipWordColorValue">#818cf8</span>
</div>
</div>
<div class="theme-editor-row">
<label>卡片底色(暗)</label>
<div class="color-picker-wrapper">
<input type="color" id="cardBgColor" value="#1e293b">
<span class="color-value" id="cardBgColorValue">#1e293b</span>
</div>
</div>
<div class="theme-editor-row">
<label>卡片底色(亮)</label>
<div class="color-picker-wrapper">
<input type="color" id="cardBgLightColor" value="#ffffff">
<span class="color-value" id="cardBgLightColorValue">#ffffff</span>
</div>
</div>
<div class="theme-editor-actions">
<button type="button" class="btn btn-primary" id="saveThemeBtn">保存</button>
</div>
</div>
</div>
</aside>
</div>
<!-- 全局提示 -->
<div class="global-toast" id="globalToast"></div>
<script src="js/options.js"></script>
</body>
</html>