Keith Yu commited on
Commit
41449f8
·
unverified ·
1 Parent(s): 9085484

Add files via upload

Browse files
Files changed (2) hide show
  1. index.html +657 -657
  2. script.js +0 -0
index.html CHANGED
@@ -1,657 +1,657 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>CLAIMS 2.0 — Redesigned</title>
7
- <!-- Optional: absolute API origin when this page is not served with a same-origin /api/* proxy. Leave empty to try same-origin first, then http://localhost:8001 on localhost. -->
8
- <meta name="claims-api-base" content="">
9
- <link rel="preconnect" href="https://fonts.googleapis.com">
10
- <link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600&family=DM+Mono:wght@400;500&display=swap" rel="stylesheet">
11
- <style>
12
- :root {
13
- --bg: #080c18;
14
- --bg-1: #0d1424;
15
- --bg-2: #111827;
16
- --border: rgba(255,255,255,0.07);
17
- --border-mid: rgba(255,255,255,0.12);
18
- --text: #f1f5f9;
19
- --text-2: #94a3b8;
20
- --text-3: #64748b;
21
-
22
- --teal: #0d9488;
23
- --teal-bg: rgba(13,148,136,0.1);
24
- --teal-border: rgba(13,148,136,0.35);
25
- --teal-text: #5eead4;
26
-
27
- --amber: #d97706;
28
- --amber-bg: rgba(217,119,6,0.1);
29
- --amber-border: rgba(217,119,6,0.35);
30
- --amber-text: #fcd34d;
31
-
32
- --green: #059669;
33
- --green-bg: rgba(5,150,105,0.12);
34
- --green-border: rgba(5,150,105,0.4);
35
- --green-text: #34d399;
36
-
37
- --red: #dc2626;
38
- --red-bg: rgba(220,38,38,0.1);
39
- --red-border: rgba(220,38,38,0.35);
40
- --red-text: #f87171;
41
-
42
- --blue: #3b82f6;
43
- --blue-bg: rgba(59,130,246,0.1);
44
- --blue-border: rgba(59,130,246,0.35);
45
- --blue-text: #93c5fd;
46
-
47
- --purple-bg: rgba(139,92,246,0.1);
48
- --purple-border:rgba(139,92,246,0.35);
49
- --purple-text: #c4b5fd;
50
-
51
- --r: 12px;
52
- --r-sm: 8px;
53
- }
54
-
55
- * { box-sizing: border-box; margin: 0; padding: 0; }
56
-
57
- body {
58
- background: var(--bg);
59
- color: var(--text);
60
- font-family: 'DM Sans', system-ui, sans-serif;
61
- font-size: 14px;
62
- line-height: 1.6;
63
- min-height: 100vh;
64
- }
65
-
66
- .shell {
67
- max-width: 1080px;
68
- margin: 0 auto;
69
- padding: 28px 20px 60px;
70
- }
71
-
72
- /* ── HEADER ── */
73
- .header {
74
- border: 1px solid var(--border-mid);
75
- border-radius: 20px;
76
- padding: 20px 24px;
77
- background: var(--bg-1);
78
- position: relative;
79
- overflow: hidden;
80
- margin-bottom: 20px;
81
- }
82
- .header::before {
83
- content: '';
84
- position: absolute;
85
- top: 0; left: 0; right: 0;
86
- height: 2px;
87
- background: linear-gradient(90deg, var(--teal), var(--blue), var(--amber));
88
- }
89
- .header-inner {
90
- display: flex;
91
- align-items: flex-start;
92
- justify-content: space-between;
93
- gap: 16px;
94
- flex-wrap: wrap;
95
- }
96
- .header-title {
97
- font-size: 20px;
98
- font-weight: 600;
99
- letter-spacing: -0.01em;
100
- }
101
- .header-sub {
102
- font-size: 13px;
103
- color: var(--text-2);
104
- margin-top: 3px;
105
- }
106
- .stats-row {
107
- display: flex;
108
- gap: 10px;
109
- flex-wrap: wrap;
110
- margin-top: 16px;
111
- }
112
- .stat-chip {
113
- display: flex;
114
- align-items: center;
115
- gap: 7px;
116
- padding: 5px 12px;
117
- border-radius: 999px;
118
- border: 1px solid var(--border);
119
- background: var(--bg-2);
120
- font-size: 12px;
121
- color: var(--text-2);
122
- }
123
- .stat-chip strong {
124
- font-weight: 600;
125
- color: var(--text);
126
- }
127
- .stat-dot {
128
- width: 6px; height: 6px;
129
- border-radius: 50%;
130
- flex-shrink: 0;
131
- }
132
-
133
- /* ── INPUT SECTION ── */
134
- .input-section {
135
- border: 1px solid var(--border);
136
- border-radius: var(--r);
137
- background: var(--bg-1);
138
- padding: 16px;
139
- margin-bottom: 20px;
140
- }
141
- .field-label {
142
- font-size: 11px;
143
- font-weight: 500;
144
- letter-spacing: 0.1em;
145
- text-transform: uppercase;
146
- color: var(--text-3);
147
- margin-bottom: 8px;
148
- display: block;
149
- }
150
- .text-input {
151
- width: 100%;
152
- min-height: 140px;
153
- background: rgba(0,0,0,0.3);
154
- border: 1px solid var(--border);
155
- border-radius: var(--r-sm);
156
- color: var(--text);
157
- font-family: 'DM Sans', sans-serif;
158
- font-size: 14px;
159
- padding: 12px 14px;
160
- resize: vertical;
161
- outline: none;
162
- transition: border-color 0.15s;
163
- }
164
- .text-input:focus {
165
- border-color: rgba(59,130,246,0.5);
166
- box-shadow: 0 0 0 3px rgba(59,130,246,0.08);
167
- }
168
- .text-input::placeholder { color: var(--text-3); }
169
- .controls { margin-top: 12px; display: flex; align-items: center; gap: 10px; }
170
- .btn-primary {
171
- background: linear-gradient(135deg, #2563eb, #4f46e5);
172
- color: #fff;
173
- border: none;
174
- border-radius: 999px;
175
- padding: 8px 20px;
176
- font-family: 'DM Sans', sans-serif;
177
- font-size: 13px;
178
- font-weight: 500;
179
- letter-spacing: 0.05em;
180
- text-transform: uppercase;
181
- cursor: pointer;
182
- transition: filter 0.15s, transform 0.15s;
183
- box-shadow: 0 4px 16px rgba(37,99,235,0.4);
184
- }
185
- .btn-primary:hover { filter: brightness(1.1); transform: translateY(-1px); }
186
- .status { font-size: 12px; color: var(--text-3); }
187
-
188
- /* ── SECTION TITLE ── */
189
- .section-title {
190
- font-size: 11px;
191
- font-weight: 600;
192
- letter-spacing: 0.12em;
193
- text-transform: uppercase;
194
- color: var(--text-3);
195
- margin: 24px 0 10px;
196
- display: flex;
197
- align-items: center;
198
- gap: 8px;
199
- }
200
- .section-title::after {
201
- content: '';
202
- flex: 1;
203
- height: 1px;
204
- background: var(--border);
205
- }
206
-
207
- /* ── PARAGRAPH RESULT CARD ── */
208
- .para-card {
209
- border: 1px solid var(--border);
210
- border-radius: var(--r);
211
- background: var(--bg-1);
212
- overflow: hidden;
213
- margin-bottom: 14px;
214
- transition: border-color 0.15s;
215
- }
216
- .para-card:hover { border-color: var(--border-mid); }
217
-
218
- .para-card-header {
219
- display: flex;
220
- align-items: center;
221
- gap: 12px;
222
- padding: 12px 16px;
223
- background: rgba(255,255,255,0.02);
224
- border-bottom: 1px solid var(--border);
225
- }
226
- .para-num {
227
- width: 30px; height: 30px;
228
- border-radius: 8px;
229
- background: var(--blue-bg);
230
- border: 1px solid var(--blue-border);
231
- display: flex;
232
- align-items: center;
233
- justify-content: center;
234
- font-family: 'DM Mono', monospace;
235
- font-size: 13px;
236
- font-weight: 500;
237
- color: var(--blue-text);
238
- flex-shrink: 0;
239
- }
240
- .para-card-title { font-size: 13px; font-weight: 500; }
241
- .para-card-sub { font-size: 11px; color: var(--text-3); margin-top: 2px; }
242
-
243
- .para-grid {
244
- display: grid;
245
- grid-template-columns: 1fr 1fr 1fr;
246
- gap: 0;
247
- }
248
- .para-col {
249
- padding: 14px 16px;
250
- border-right: 1px solid var(--border);
251
- }
252
- .para-col:last-child { border-right: none; }
253
-
254
- .col-label {
255
- font-size: 10px;
256
- font-weight: 600;
257
- letter-spacing: 0.1em;
258
- text-transform: uppercase;
259
- color: var(--text-3);
260
- margin-bottom: 10px;
261
- }
262
-
263
- /* paragraph text column */
264
- .para-text-block {
265
- font-size: 13px;
266
- line-height: 1.65;
267
- color: var(--text-2);
268
- border-left: 2px solid var(--blue-border);
269
- padding-left: 10px;
270
- }
271
-
272
- /* claim block */
273
- .claim-block {
274
- padding: 10px 12px;
275
- border-radius: var(--r-sm);
276
- border: 1px solid;
277
- margin-bottom: 8px;
278
- background: transparent;
279
- }
280
- .claim-block:last-child { margin-bottom: 0; }
281
-
282
- .claim-block--sub {
283
- border-color: var(--teal-border);
284
- background: var(--teal-bg);
285
- }
286
- .claim-block--super {
287
- border-color: var(--amber-border);
288
- background: var(--amber-bg);
289
- }
290
-
291
- .claim-type-tag {
292
- display: inline-flex;
293
- align-items: center;
294
- gap: 5px;
295
- padding: 2px 8px;
296
- border-radius: 999px;
297
- font-size: 10px;
298
- font-weight: 600;
299
- letter-spacing: 0.07em;
300
- text-transform: uppercase;
301
- margin-bottom: 6px;
302
- }
303
- .claim-type-tag--sub {
304
- background: var(--teal-bg);
305
- border: 1px solid var(--teal-border);
306
- color: var(--teal-text);
307
- }
308
- .claim-type-tag--super {
309
- background: var(--amber-bg);
310
- border: 1px solid var(--amber-border);
311
- color: var(--amber-text);
312
- }
313
- .claim-id-badge {
314
- font-family: 'DM Mono', monospace;
315
- font-size: 11px;
316
- font-weight: 500;
317
- opacity: 0.8;
318
- }
319
- .claim-text {
320
- font-size: 13px;
321
- line-height: 1.5;
322
- color: var(--text);
323
- margin-top: 4px;
324
- }
325
-
326
- /* similarity bar */
327
- .sim-row {
328
- display: flex;
329
- align-items: center;
330
- gap: 8px;
331
- margin-top: 8px;
332
- }
333
- .sim-label {
334
- font-size: 10px;
335
- color: var(--text-3);
336
- white-space: nowrap;
337
- }
338
- .sim-bar-wrap {
339
- flex: 1;
340
- height: 3px;
341
- background: rgba(255,255,255,0.08);
342
- border-radius: 99px;
343
- overflow: hidden;
344
- }
345
- .sim-bar-fill {
346
- height: 100%;
347
- border-radius: 99px;
348
- background: linear-gradient(90deg, var(--teal), #22d3ee);
349
- transition: width 0.4s;
350
- }
351
- .sim-bar-fill--amber {
352
- background: linear-gradient(90deg, var(--amber), #fbbf24);
353
- }
354
- .sim-val {
355
- font-family: 'DM Mono', monospace;
356
- font-size: 11px;
357
- font-weight: 500;
358
- color: var(--text-2);
359
- min-width: 28px;
360
- text-align: right;
361
- }
362
-
363
- .topic-chip {
364
- display: inline-flex;
365
- align-items: center;
366
- gap: 4px;
367
- padding: 2px 8px;
368
- border-radius: 999px;
369
- font-size: 10px;
370
- font-weight: 600;
371
- letter-spacing: 0.06em;
372
- text-transform: uppercase;
373
- margin-top: 6px;
374
- }
375
- .topic-chip--none {
376
- background: var(--red-bg);
377
- border: 1px solid var(--red-border);
378
- color: var(--red-text);
379
- }
380
- .topic-chip--match {
381
- background: var(--green-bg);
382
- border: 1px solid var(--green-border);
383
- color: var(--green-text);
384
- }
385
- .no-match-note {
386
- font-size: 12px;
387
- color: var(--text-3);
388
- font-style: italic;
389
- }
390
-
391
- /* ── PROPOSAL SECTION ── */
392
- .proposals-container {
393
- border: 1px solid var(--border);
394
- border-radius: var(--r);
395
- background: var(--bg-1);
396
- overflow: hidden;
397
- }
398
-
399
- .reviewer-row {
400
- display: flex;
401
- align-items: center;
402
- gap: 12px;
403
- padding: 12px 16px;
404
- border-bottom: 1px solid var(--border);
405
- background: rgba(255,255,255,0.02);
406
- }
407
- .reviewer-input {
408
- flex: 1;
409
- max-width: 280px;
410
- background: rgba(0,0,0,0.3);
411
- border: 1px solid var(--border);
412
- border-radius: var(--r-sm);
413
- color: var(--text);
414
- font-family: 'DM Sans', sans-serif;
415
- font-size: 13px;
416
- padding: 7px 12px;
417
- outline: none;
418
- transition: border-color 0.15s;
419
- }
420
- .reviewer-input:focus { border-color: rgba(59,130,246,0.5); }
421
- .reviewer-input::placeholder { color: var(--text-3); }
422
-
423
- .proposal-card {
424
- padding: 16px;
425
- border-bottom: 1px solid var(--border);
426
- transition: background 0.15s;
427
- }
428
- .proposal-card:last-child { border-bottom: none; }
429
- .proposal-card:hover { background: rgba(255,255,255,0.02); }
430
-
431
- .proposal-header {
432
- display: flex;
433
- align-items: center;
434
- gap: 10px;
435
- margin-bottom: 12px;
436
- }
437
- .proposal-icon {
438
- width: 32px; height: 32px;
439
- border-radius: 8px;
440
- background: var(--amber-bg);
441
- border: 1px solid var(--amber-border);
442
- display: flex; align-items: center; justify-content: center;
443
- font-size: 14px;
444
- flex-shrink: 0;
445
- }
446
- .proposal-type { font-size: 13px; font-weight: 600; }
447
- .proposal-id {
448
- font-family: 'DM Mono', monospace;
449
- font-size: 11px;
450
- color: var(--text-3);
451
- margin-top: 2px;
452
- }
453
-
454
- .proposal-body {
455
- font-size: 13px;
456
- line-height: 1.6;
457
- color: var(--text-2);
458
- padding: 10px 12px;
459
- background: rgba(0,0,0,0.2);
460
- border-radius: var(--r-sm);
461
- border: 1px solid var(--border);
462
- margin-bottom: 12px;
463
- }
464
-
465
- .merge-detail {
466
- display: grid;
467
- grid-template-columns: 1fr 1fr;
468
- gap: 8px;
469
- margin-bottom: 12px;
470
- }
471
- .merge-item {
472
- padding: 8px 12px;
473
- border-radius: var(--r-sm);
474
- border: 1px solid var(--border);
475
- background: rgba(0,0,0,0.15);
476
- }
477
- .merge-item-label {
478
- font-size: 10px;
479
- font-weight: 600;
480
- letter-spacing: 0.08em;
481
- text-transform: uppercase;
482
- color: var(--text-3);
483
- margin-bottom: 4px;
484
- }
485
- .merge-item-id {
486
- font-family: 'DM Mono', monospace;
487
- font-size: 11px;
488
- color: var(--text-2);
489
- margin-bottom: 3px;
490
- }
491
- .merge-item-text { font-size: 12px; color: var(--text); }
492
-
493
- .score-row {
494
- display: flex;
495
- align-items: center;
496
- gap: 10px;
497
- padding: 8px 12px;
498
- border-radius: var(--r-sm);
499
- background: var(--green-bg);
500
- border: 1px solid var(--green-border);
501
- margin-bottom: 12px;
502
- }
503
- .score-label { font-size: 12px; color: var(--text-2); }
504
- .score-val {
505
- font-family: 'DM Mono', monospace;
506
- font-size: 14px;
507
- font-weight: 500;
508
- color: var(--green-text);
509
- margin-left: auto;
510
- }
511
- .score-note { font-size: 11px; color: var(--text-3); }
512
-
513
- .proposal-actions {
514
- display: flex;
515
- gap: 8px;
516
- align-items: center;
517
- }
518
- .btn-approve {
519
- padding: 7px 16px;
520
- border-radius: 999px;
521
- border: 1px solid var(--green-border);
522
- background: var(--green-bg);
523
- color: var(--green-text);
524
- font-family: 'DM Sans', sans-serif;
525
- font-size: 12px;
526
- font-weight: 500;
527
- letter-spacing: 0.05em;
528
- text-transform: uppercase;
529
- cursor: pointer;
530
- transition: filter 0.15s, transform 0.15s;
531
- }
532
- .btn-approve:hover { filter: brightness(1.2); transform: translateY(-1px); }
533
-
534
- .btn-reject {
535
- padding: 7px 16px;
536
- border-radius: 999px;
537
- border: 1px solid var(--red-border);
538
- background: var(--red-bg);
539
- color: var(--red-text);
540
- font-family: 'DM Sans', sans-serif;
541
- font-size: 12px;
542
- font-weight: 500;
543
- letter-spacing: 0.05em;
544
- text-transform: uppercase;
545
- cursor: pointer;
546
- transition: filter 0.15s, transform 0.15s;
547
- }
548
- .btn-reject:hover { filter: brightness(1.2); transform: translateY(-1px); }
549
-
550
- .btn-apply {
551
- padding: 7px 16px;
552
- border-radius: 999px;
553
- border: 1px solid var(--blue-border);
554
- background: var(--blue-bg);
555
- color: var(--blue-text);
556
- font-family: 'DM Sans', sans-serif;
557
- font-size: 12px;
558
- font-weight: 500;
559
- letter-spacing: 0.05em;
560
- text-transform: uppercase;
561
- cursor: pointer;
562
- margin-left: auto;
563
- transition: filter 0.15s, transform 0.15s;
564
- }
565
- .btn-apply:hover { filter: brightness(1.2); transform: translateY(-1px); }
566
-
567
- .proposal-line {
568
- font-size: 12px;
569
- color: var(--text-2);
570
- margin-bottom: 4px;
571
- }
572
- .proposal-line strong { color: var(--text); }
573
- .proposal-line code {
574
- font-family: 'DM Mono', monospace;
575
- font-size: 11px;
576
- color: var(--blue-text);
577
- }
578
- .proposal-reason {
579
- color: var(--text-3);
580
- font-style: italic;
581
- }
582
-
583
- .empty-note {
584
- padding: 20px 16px;
585
- font-size: 13px;
586
- color: var(--text-3);
587
- text-align: center;
588
- }
589
-
590
- @media (max-width: 640px) {
591
- .para-grid { grid-template-columns: 1fr; }
592
- .para-col { border-right: none; border-bottom: 1px solid var(--border); }
593
- .para-col:last-child { border-bottom: none; }
594
- .merge-detail { grid-template-columns: 1fr; }
595
- }
596
- </style>
597
- </head>
598
- <body>
599
- <div class="shell">
600
-
601
- <!-- HEADER -->
602
- <div class="header">
603
- <div class="header-inner">
604
- <div>
605
- <div class="header-title">Paragraph ↔ Claim Mapping</div>
606
- <div class="header-sub">CLAIMS 2.0 · Greenwashing discourse validation · Native advertising corpus</div>
607
- </div>
608
- </div>
609
- <div class="stats-row">
610
- <div class="stat-chip">
611
- <span class="stat-dot" style="background:#3b82f6"></span>
612
- <strong id="stat-paragraphs">0</strong> paragraphs
613
- </div>
614
- <div class="stat-chip">
615
- <span class="stat-dot" style="background:var(--teal)"></span>
616
- <strong id="stat-subclaims">0</strong> subclaims
617
- </div>
618
- <div class="stat-chip">
619
- <span class="stat-dot" style="background:var(--amber)"></span>
620
- <strong id="stat-superclaims">0</strong> superclaims
621
- </div>
622
- <div class="stat-chip">
623
- <span class="stat-dot" style="background:#a855f7"></span>
624
- <strong id="stat-proposals">0</strong> pending proposals
625
- </div>
626
- </div>
627
- </div>
628
-
629
- <!-- INPUT -->
630
- <div class="input-section">
631
- <label class="field-label" for="article-input">Article Text</label>
632
- <textarea id="article-input" class="text-input" placeholder="Paste article text here… Separate paragraphs with a blank line."></textarea>
633
- <div class="controls">
634
- <button id="analyze-btn" class="btn-primary" type="button">Analyze Paragraphs</button>
635
- <span id="status" class="status"></span>
636
- </div>
637
- </div>
638
-
639
- <!-- RESULTS -->
640
- <div class="section-title">Paragraph ↔ Claim Mappings</div>
641
- <div id="results-container"></div>
642
-
643
- <!-- PROPOSALS -->
644
- <div class="section-title" style="margin-top:28px">Pending Taxonomy Proposals <span style="background:rgba(139,92,246,0.15);border:1px solid rgba(139,92,246,0.35);color:#c4b5fd;font-size:10px;padding:2px 8px;border-radius:999px;letter-spacing:0.06em;font-weight:600;margin-left:4px">Human Approval</span></div>
645
-
646
- <div class="proposals-container" id="proposals-container">
647
- <div class="reviewer-row">
648
- <label class="field-label" for="reviewer-name" style="margin:0;white-space:nowrap">Reviewer Name</label>
649
- <input id="reviewer-name" type="text" class="reviewer-input" placeholder="Your name (stored locally)" maxlength="120" autocomplete="name" />
650
- </div>
651
- <div id="proposals-list"></div>
652
- </div>
653
-
654
- </div>
655
- <script src="script.js?v=3"></script>
656
- </body>
657
- </html>
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>CLAIMS 2.0 — Redesigned</title>
7
+ <!-- Optional: absolute API origin when this page is not served with a same-origin /api/* proxy. Leave empty to try same-origin first, then http://localhost:8001 on localhost. -->
8
+ <meta name="claims-api-base" content="">
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600&family=DM+Mono:wght@400;500&display=swap" rel="stylesheet">
11
+ <style>
12
+ :root {
13
+ --bg: #080c18;
14
+ --bg-1: #0d1424;
15
+ --bg-2: #111827;
16
+ --border: rgba(255,255,255,0.07);
17
+ --border-mid: rgba(255,255,255,0.12);
18
+ --text: #f1f5f9;
19
+ --text-2: #94a3b8;
20
+ --text-3: #64748b;
21
+
22
+ --teal: #0d9488;
23
+ --teal-bg: rgba(13,148,136,0.1);
24
+ --teal-border: rgba(13,148,136,0.35);
25
+ --teal-text: #5eead4;
26
+
27
+ --amber: #d97706;
28
+ --amber-bg: rgba(217,119,6,0.1);
29
+ --amber-border: rgba(217,119,6,0.35);
30
+ --amber-text: #fcd34d;
31
+
32
+ --green: #059669;
33
+ --green-bg: rgba(5,150,105,0.12);
34
+ --green-border: rgba(5,150,105,0.4);
35
+ --green-text: #34d399;
36
+
37
+ --red: #dc2626;
38
+ --red-bg: rgba(220,38,38,0.1);
39
+ --red-border: rgba(220,38,38,0.35);
40
+ --red-text: #f87171;
41
+
42
+ --blue: #3b82f6;
43
+ --blue-bg: rgba(59,130,246,0.1);
44
+ --blue-border: rgba(59,130,246,0.35);
45
+ --blue-text: #93c5fd;
46
+
47
+ --purple-bg: rgba(139,92,246,0.1);
48
+ --purple-border:rgba(139,92,246,0.35);
49
+ --purple-text: #c4b5fd;
50
+
51
+ --r: 12px;
52
+ --r-sm: 8px;
53
+ }
54
+
55
+ * { box-sizing: border-box; margin: 0; padding: 0; }
56
+
57
+ body {
58
+ background: var(--bg);
59
+ color: var(--text);
60
+ font-family: 'DM Sans', system-ui, sans-serif;
61
+ font-size: 14px;
62
+ line-height: 1.6;
63
+ min-height: 100vh;
64
+ }
65
+
66
+ .shell {
67
+ max-width: 1080px;
68
+ margin: 0 auto;
69
+ padding: 28px 20px 60px;
70
+ }
71
+
72
+ /* ── HEADER ── */
73
+ .header {
74
+ border: 1px solid var(--border-mid);
75
+ border-radius: 20px;
76
+ padding: 20px 24px;
77
+ background: var(--bg-1);
78
+ position: relative;
79
+ overflow: hidden;
80
+ margin-bottom: 20px;
81
+ }
82
+ .header::before {
83
+ content: '';
84
+ position: absolute;
85
+ top: 0; left: 0; right: 0;
86
+ height: 2px;
87
+ background: linear-gradient(90deg, var(--teal), var(--blue), var(--amber));
88
+ }
89
+ .header-inner {
90
+ display: flex;
91
+ align-items: flex-start;
92
+ justify-content: space-between;
93
+ gap: 16px;
94
+ flex-wrap: wrap;
95
+ }
96
+ .header-title {
97
+ font-size: 20px;
98
+ font-weight: 600;
99
+ letter-spacing: -0.01em;
100
+ }
101
+ .header-sub {
102
+ font-size: 13px;
103
+ color: var(--text-2);
104
+ margin-top: 3px;
105
+ }
106
+ .stats-row {
107
+ display: flex;
108
+ gap: 10px;
109
+ flex-wrap: wrap;
110
+ margin-top: 16px;
111
+ }
112
+ .stat-chip {
113
+ display: flex;
114
+ align-items: center;
115
+ gap: 7px;
116
+ padding: 5px 12px;
117
+ border-radius: 999px;
118
+ border: 1px solid var(--border);
119
+ background: var(--bg-2);
120
+ font-size: 12px;
121
+ color: var(--text-2);
122
+ }
123
+ .stat-chip strong {
124
+ font-weight: 600;
125
+ color: var(--text);
126
+ }
127
+ .stat-dot {
128
+ width: 6px; height: 6px;
129
+ border-radius: 50%;
130
+ flex-shrink: 0;
131
+ }
132
+
133
+ /* ── INPUT SECTION ── */
134
+ .input-section {
135
+ border: 1px solid var(--border);
136
+ border-radius: var(--r);
137
+ background: var(--bg-1);
138
+ padding: 16px;
139
+ margin-bottom: 20px;
140
+ }
141
+ .field-label {
142
+ font-size: 11px;
143
+ font-weight: 500;
144
+ letter-spacing: 0.1em;
145
+ text-transform: uppercase;
146
+ color: var(--text-3);
147
+ margin-bottom: 8px;
148
+ display: block;
149
+ }
150
+ .text-input {
151
+ width: 100%;
152
+ min-height: 140px;
153
+ background: rgba(0,0,0,0.3);
154
+ border: 1px solid var(--border);
155
+ border-radius: var(--r-sm);
156
+ color: var(--text);
157
+ font-family: 'DM Sans', sans-serif;
158
+ font-size: 14px;
159
+ padding: 12px 14px;
160
+ resize: vertical;
161
+ outline: none;
162
+ transition: border-color 0.15s;
163
+ }
164
+ .text-input:focus {
165
+ border-color: rgba(59,130,246,0.5);
166
+ box-shadow: 0 0 0 3px rgba(59,130,246,0.08);
167
+ }
168
+ .text-input::placeholder { color: var(--text-3); }
169
+ .controls { margin-top: 12px; display: flex; align-items: center; gap: 10px; }
170
+ .btn-primary {
171
+ background: linear-gradient(135deg, #2563eb, #4f46e5);
172
+ color: #fff;
173
+ border: none;
174
+ border-radius: 999px;
175
+ padding: 8px 20px;
176
+ font-family: 'DM Sans', sans-serif;
177
+ font-size: 13px;
178
+ font-weight: 500;
179
+ letter-spacing: 0.05em;
180
+ text-transform: uppercase;
181
+ cursor: pointer;
182
+ transition: filter 0.15s, transform 0.15s;
183
+ box-shadow: 0 4px 16px rgba(37,99,235,0.4);
184
+ }
185
+ .btn-primary:hover { filter: brightness(1.1); transform: translateY(-1px); }
186
+ .status { font-size: 12px; color: var(--text-3); }
187
+
188
+ /* ── SECTION TITLE ── */
189
+ .section-title {
190
+ font-size: 11px;
191
+ font-weight: 600;
192
+ letter-spacing: 0.12em;
193
+ text-transform: uppercase;
194
+ color: var(--text-3);
195
+ margin: 24px 0 10px;
196
+ display: flex;
197
+ align-items: center;
198
+ gap: 8px;
199
+ }
200
+ .section-title::after {
201
+ content: '';
202
+ flex: 1;
203
+ height: 1px;
204
+ background: var(--border);
205
+ }
206
+
207
+ /* ── PARAGRAPH RESULT CARD ── */
208
+ .para-card {
209
+ border: 1px solid var(--border);
210
+ border-radius: var(--r);
211
+ background: var(--bg-1);
212
+ overflow: hidden;
213
+ margin-bottom: 14px;
214
+ transition: border-color 0.15s;
215
+ }
216
+ .para-card:hover { border-color: var(--border-mid); }
217
+
218
+ .para-card-header {
219
+ display: flex;
220
+ align-items: center;
221
+ gap: 12px;
222
+ padding: 12px 16px;
223
+ background: rgba(255,255,255,0.02);
224
+ border-bottom: 1px solid var(--border);
225
+ }
226
+ .para-num {
227
+ width: 30px; height: 30px;
228
+ border-radius: 8px;
229
+ background: var(--blue-bg);
230
+ border: 1px solid var(--blue-border);
231
+ display: flex;
232
+ align-items: center;
233
+ justify-content: center;
234
+ font-family: 'DM Mono', monospace;
235
+ font-size: 13px;
236
+ font-weight: 500;
237
+ color: var(--blue-text);
238
+ flex-shrink: 0;
239
+ }
240
+ .para-card-title { font-size: 13px; font-weight: 500; }
241
+ .para-card-sub { font-size: 11px; color: var(--text-3); margin-top: 2px; }
242
+
243
+ .para-grid {
244
+ display: grid;
245
+ grid-template-columns: 1fr 1fr 1fr;
246
+ gap: 0;
247
+ }
248
+ .para-col {
249
+ padding: 14px 16px;
250
+ border-right: 1px solid var(--border);
251
+ }
252
+ .para-col:last-child { border-right: none; }
253
+
254
+ .col-label {
255
+ font-size: 10px;
256
+ font-weight: 600;
257
+ letter-spacing: 0.1em;
258
+ text-transform: uppercase;
259
+ color: var(--text-3);
260
+ margin-bottom: 10px;
261
+ }
262
+
263
+ /* paragraph text column */
264
+ .para-text-block {
265
+ font-size: 13px;
266
+ line-height: 1.65;
267
+ color: var(--text-2);
268
+ border-left: 2px solid var(--blue-border);
269
+ padding-left: 10px;
270
+ }
271
+
272
+ /* claim block */
273
+ .claim-block {
274
+ padding: 10px 12px;
275
+ border-radius: var(--r-sm);
276
+ border: 1px solid;
277
+ margin-bottom: 8px;
278
+ background: transparent;
279
+ }
280
+ .claim-block:last-child { margin-bottom: 0; }
281
+
282
+ .claim-block--sub {
283
+ border-color: var(--teal-border);
284
+ background: var(--teal-bg);
285
+ }
286
+ .claim-block--super {
287
+ border-color: var(--amber-border);
288
+ background: var(--amber-bg);
289
+ }
290
+
291
+ .claim-type-tag {
292
+ display: inline-flex;
293
+ align-items: center;
294
+ gap: 5px;
295
+ padding: 2px 8px;
296
+ border-radius: 999px;
297
+ font-size: 10px;
298
+ font-weight: 600;
299
+ letter-spacing: 0.07em;
300
+ text-transform: uppercase;
301
+ margin-bottom: 6px;
302
+ }
303
+ .claim-type-tag--sub {
304
+ background: var(--teal-bg);
305
+ border: 1px solid var(--teal-border);
306
+ color: var(--teal-text);
307
+ }
308
+ .claim-type-tag--super {
309
+ background: var(--amber-bg);
310
+ border: 1px solid var(--amber-border);
311
+ color: var(--amber-text);
312
+ }
313
+ .claim-id-badge {
314
+ font-family: 'DM Mono', monospace;
315
+ font-size: 11px;
316
+ font-weight: 500;
317
+ opacity: 0.8;
318
+ }
319
+ .claim-text {
320
+ font-size: 13px;
321
+ line-height: 1.5;
322
+ color: var(--text);
323
+ margin-top: 4px;
324
+ }
325
+
326
+ /* similarity bar */
327
+ .sim-row {
328
+ display: flex;
329
+ align-items: center;
330
+ gap: 8px;
331
+ margin-top: 8px;
332
+ }
333
+ .sim-label {
334
+ font-size: 10px;
335
+ color: var(--text-3);
336
+ white-space: nowrap;
337
+ }
338
+ .sim-bar-wrap {
339
+ flex: 1;
340
+ height: 3px;
341
+ background: rgba(255,255,255,0.08);
342
+ border-radius: 99px;
343
+ overflow: hidden;
344
+ }
345
+ .sim-bar-fill {
346
+ height: 100%;
347
+ border-radius: 99px;
348
+ background: linear-gradient(90deg, var(--teal), #22d3ee);
349
+ transition: width 0.4s;
350
+ }
351
+ .sim-bar-fill--amber {
352
+ background: linear-gradient(90deg, var(--amber), #fbbf24);
353
+ }
354
+ .sim-val {
355
+ font-family: 'DM Mono', monospace;
356
+ font-size: 11px;
357
+ font-weight: 500;
358
+ color: var(--text-2);
359
+ min-width: 28px;
360
+ text-align: right;
361
+ }
362
+
363
+ .topic-chip {
364
+ display: inline-flex;
365
+ align-items: center;
366
+ gap: 4px;
367
+ padding: 2px 8px;
368
+ border-radius: 999px;
369
+ font-size: 10px;
370
+ font-weight: 600;
371
+ letter-spacing: 0.06em;
372
+ text-transform: uppercase;
373
+ margin-top: 6px;
374
+ }
375
+ .topic-chip--none {
376
+ background: var(--red-bg);
377
+ border: 1px solid var(--red-border);
378
+ color: var(--red-text);
379
+ }
380
+ .topic-chip--match {
381
+ background: var(--green-bg);
382
+ border: 1px solid var(--green-border);
383
+ color: var(--green-text);
384
+ }
385
+ .no-match-note {
386
+ font-size: 12px;
387
+ color: var(--text-3);
388
+ font-style: italic;
389
+ }
390
+
391
+ /* ── PROPOSAL SECTION ── */
392
+ .proposals-container {
393
+ border: 1px solid var(--border);
394
+ border-radius: var(--r);
395
+ background: var(--bg-1);
396
+ overflow: hidden;
397
+ }
398
+
399
+ .reviewer-row {
400
+ display: flex;
401
+ align-items: center;
402
+ gap: 12px;
403
+ padding: 12px 16px;
404
+ border-bottom: 1px solid var(--border);
405
+ background: rgba(255,255,255,0.02);
406
+ }
407
+ .reviewer-input {
408
+ flex: 1;
409
+ max-width: 280px;
410
+ background: rgba(0,0,0,0.3);
411
+ border: 1px solid var(--border);
412
+ border-radius: var(--r-sm);
413
+ color: var(--text);
414
+ font-family: 'DM Sans', sans-serif;
415
+ font-size: 13px;
416
+ padding: 7px 12px;
417
+ outline: none;
418
+ transition: border-color 0.15s;
419
+ }
420
+ .reviewer-input:focus { border-color: rgba(59,130,246,0.5); }
421
+ .reviewer-input::placeholder { color: var(--text-3); }
422
+
423
+ .proposal-card {
424
+ padding: 16px;
425
+ border-bottom: 1px solid var(--border);
426
+ transition: background 0.15s;
427
+ }
428
+ .proposal-card:last-child { border-bottom: none; }
429
+ .proposal-card:hover { background: rgba(255,255,255,0.02); }
430
+
431
+ .proposal-header {
432
+ display: flex;
433
+ align-items: center;
434
+ gap: 10px;
435
+ margin-bottom: 12px;
436
+ }
437
+ .proposal-icon {
438
+ width: 32px; height: 32px;
439
+ border-radius: 8px;
440
+ background: var(--amber-bg);
441
+ border: 1px solid var(--amber-border);
442
+ display: flex; align-items: center; justify-content: center;
443
+ font-size: 14px;
444
+ flex-shrink: 0;
445
+ }
446
+ .proposal-type { font-size: 13px; font-weight: 600; }
447
+ .proposal-id {
448
+ font-family: 'DM Mono', monospace;
449
+ font-size: 11px;
450
+ color: var(--text-3);
451
+ margin-top: 2px;
452
+ }
453
+
454
+ .proposal-body {
455
+ font-size: 13px;
456
+ line-height: 1.6;
457
+ color: var(--text-2);
458
+ padding: 10px 12px;
459
+ background: rgba(0,0,0,0.2);
460
+ border-radius: var(--r-sm);
461
+ border: 1px solid var(--border);
462
+ margin-bottom: 12px;
463
+ }
464
+
465
+ .merge-detail {
466
+ display: grid;
467
+ grid-template-columns: 1fr 1fr;
468
+ gap: 8px;
469
+ margin-bottom: 12px;
470
+ }
471
+ .merge-item {
472
+ padding: 8px 12px;
473
+ border-radius: var(--r-sm);
474
+ border: 1px solid var(--border);
475
+ background: rgba(0,0,0,0.15);
476
+ }
477
+ .merge-item-label {
478
+ font-size: 10px;
479
+ font-weight: 600;
480
+ letter-spacing: 0.08em;
481
+ text-transform: uppercase;
482
+ color: var(--text-3);
483
+ margin-bottom: 4px;
484
+ }
485
+ .merge-item-id {
486
+ font-family: 'DM Mono', monospace;
487
+ font-size: 11px;
488
+ color: var(--text-2);
489
+ margin-bottom: 3px;
490
+ }
491
+ .merge-item-text { font-size: 12px; color: var(--text); }
492
+
493
+ .score-row {
494
+ display: flex;
495
+ align-items: center;
496
+ gap: 10px;
497
+ padding: 8px 12px;
498
+ border-radius: var(--r-sm);
499
+ background: var(--green-bg);
500
+ border: 1px solid var(--green-border);
501
+ margin-bottom: 12px;
502
+ }
503
+ .score-label { font-size: 12px; color: var(--text-2); }
504
+ .score-val {
505
+ font-family: 'DM Mono', monospace;
506
+ font-size: 14px;
507
+ font-weight: 500;
508
+ color: var(--green-text);
509
+ margin-left: auto;
510
+ }
511
+ .score-note { font-size: 11px; color: var(--text-3); }
512
+
513
+ .proposal-actions {
514
+ display: flex;
515
+ gap: 8px;
516
+ align-items: center;
517
+ }
518
+ .btn-approve {
519
+ padding: 7px 16px;
520
+ border-radius: 999px;
521
+ border: 1px solid var(--green-border);
522
+ background: var(--green-bg);
523
+ color: var(--green-text);
524
+ font-family: 'DM Sans', sans-serif;
525
+ font-size: 12px;
526
+ font-weight: 500;
527
+ letter-spacing: 0.05em;
528
+ text-transform: uppercase;
529
+ cursor: pointer;
530
+ transition: filter 0.15s, transform 0.15s;
531
+ }
532
+ .btn-approve:hover { filter: brightness(1.2); transform: translateY(-1px); }
533
+
534
+ .btn-reject {
535
+ padding: 7px 16px;
536
+ border-radius: 999px;
537
+ border: 1px solid var(--red-border);
538
+ background: var(--red-bg);
539
+ color: var(--red-text);
540
+ font-family: 'DM Sans', sans-serif;
541
+ font-size: 12px;
542
+ font-weight: 500;
543
+ letter-spacing: 0.05em;
544
+ text-transform: uppercase;
545
+ cursor: pointer;
546
+ transition: filter 0.15s, transform 0.15s;
547
+ }
548
+ .btn-reject:hover { filter: brightness(1.2); transform: translateY(-1px); }
549
+
550
+ .btn-apply {
551
+ padding: 7px 16px;
552
+ border-radius: 999px;
553
+ border: 1px solid var(--blue-border);
554
+ background: var(--blue-bg);
555
+ color: var(--blue-text);
556
+ font-family: 'DM Sans', sans-serif;
557
+ font-size: 12px;
558
+ font-weight: 500;
559
+ letter-spacing: 0.05em;
560
+ text-transform: uppercase;
561
+ cursor: pointer;
562
+ margin-left: auto;
563
+ transition: filter 0.15s, transform 0.15s;
564
+ }
565
+ .btn-apply:hover { filter: brightness(1.2); transform: translateY(-1px); }
566
+
567
+ .proposal-line {
568
+ font-size: 12px;
569
+ color: var(--text-2);
570
+ margin-bottom: 4px;
571
+ }
572
+ .proposal-line strong { color: var(--text); }
573
+ .proposal-line code {
574
+ font-family: 'DM Mono', monospace;
575
+ font-size: 11px;
576
+ color: var(--blue-text);
577
+ }
578
+ .proposal-reason {
579
+ color: var(--text-3);
580
+ font-style: italic;
581
+ }
582
+
583
+ .empty-note {
584
+ padding: 20px 16px;
585
+ font-size: 13px;
586
+ color: var(--text-3);
587
+ text-align: center;
588
+ }
589
+
590
+ @media (max-width: 640px) {
591
+ .para-grid { grid-template-columns: 1fr; }
592
+ .para-col { border-right: none; border-bottom: 1px solid var(--border); }
593
+ .para-col:last-child { border-bottom: none; }
594
+ .merge-detail { grid-template-columns: 1fr; }
595
+ }
596
+ </style>
597
+ </head>
598
+ <body>
599
+ <div class="shell">
600
+
601
+ <!-- HEADER -->
602
+ <div class="header">
603
+ <div class="header-inner">
604
+ <div>
605
+ <div class="header-title">Paragraph ↔ Claim Mapping</div>
606
+ <div class="header-sub">CLAIMS 2.0 · Greenwashing discourse validation · Native advertising corpus</div>
607
+ </div>
608
+ </div>
609
+ <div class="stats-row">
610
+ <div class="stat-chip">
611
+ <span class="stat-dot" style="background:#3b82f6"></span>
612
+ <strong id="stat-paragraphs">0</strong> paragraphs
613
+ </div>
614
+ <div class="stat-chip">
615
+ <span class="stat-dot" style="background:var(--teal)"></span>
616
+ <strong id="stat-subclaims">0</strong> subclaims
617
+ </div>
618
+ <div class="stat-chip">
619
+ <span class="stat-dot" style="background:var(--amber)"></span>
620
+ <strong id="stat-superclaims">0</strong> superclaims
621
+ </div>
622
+ <div class="stat-chip">
623
+ <span class="stat-dot" style="background:#a855f7"></span>
624
+ <strong id="stat-proposals">0</strong> pending proposals
625
+ </div>
626
+ </div>
627
+ </div>
628
+
629
+ <!-- INPUT -->
630
+ <div class="input-section">
631
+ <label class="field-label" for="article-input">Article Text</label>
632
+ <textarea id="article-input" class="text-input" placeholder="Paste article text here… Separate paragraphs with a blank line."></textarea>
633
+ <div class="controls">
634
+ <button id="analyze-btn" class="btn-primary" type="button">Analyze Paragraphs</button>
635
+ <span id="status" class="status"></span>
636
+ </div>
637
+ </div>
638
+
639
+ <!-- RESULTS -->
640
+ <div class="section-title">Paragraph ↔ Claim Mappings</div>
641
+ <div id="results-container"></div>
642
+
643
+ <!-- PROPOSALS -->
644
+ <div class="section-title" style="margin-top:28px">Pending Taxonomy Proposals <span style="background:rgba(139,92,246,0.15);border:1px solid rgba(139,92,246,0.35);color:#c4b5fd;font-size:10px;padding:2px 8px;border-radius:999px;letter-spacing:0.06em;font-weight:600;margin-left:4px">Human Approval</span></div>
645
+
646
+ <div class="proposals-container" id="proposals-container">
647
+ <div class="reviewer-row">
648
+ <label class="field-label" for="reviewer-name" style="margin:0;white-space:nowrap">Reviewer Name</label>
649
+ <input id="reviewer-name" type="text" class="reviewer-input" placeholder="Your name (stored locally)" maxlength="120" autocomplete="name" />
650
+ </div>
651
+ <div id="proposals-list"></div>
652
+ </div>
653
+
654
+ </div>
655
+ <script src="script.js?v=4"></script>
656
+ </body>
657
+ </html>
script.js CHANGED
The diff for this file is too large to render. See raw diff