| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| <style> |
| |
| |
| |
| |
| |
| .moderation-dashboard { |
| max-width: 100%; |
| margin: 0 auto; |
| } |
| |
| |
| .moderation-header { |
| background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%); |
| border: 2px solid #f59e0b; |
| border-radius: 8px; |
| padding: 12px 20px; |
| margin-bottom: 20px; |
| display: flex; |
| align-items: center; |
| justify-content: space-between; |
| } |
| |
| .moderation-header-left { |
| display: flex; |
| align-items: center; |
| gap: 12px; |
| } |
| |
| .warning-icon { |
| font-size: 24px; |
| color: #d97706; |
| } |
| |
| .moderation-title { |
| font-weight: 700; |
| font-size: 16px; |
| color: #92400e; |
| margin: 0; |
| } |
| |
| .content-id { |
| font-size: 13px; |
| color: #b45309; |
| font-family: monospace; |
| } |
| |
| |
| .metadata-toggle { |
| background: #fff; |
| border: 1px solid #d97706; |
| border-radius: 6px; |
| padding: 6px 12px; |
| font-size: 12px; |
| color: #92400e; |
| cursor: pointer; |
| transition: all 0.2s; |
| } |
| |
| .metadata-toggle:hover { |
| background: #fef3c7; |
| } |
| |
| |
| .moderation-section { |
| background: #f8fafc; |
| border: 1px solid #e2e8f0; |
| border-radius: 8px; |
| padding: 16px; |
| margin-bottom: 16px; |
| } |
| |
| .section-title { |
| font-size: 13px; |
| font-weight: 600; |
| color: #475569; |
| text-transform: uppercase; |
| letter-spacing: 0.05em; |
| margin-bottom: 16px; |
| padding-bottom: 8px; |
| border-bottom: 2px solid #64748b; |
| } |
| |
| |
| .violation-grid { |
| display: grid; |
| grid-template-columns: repeat(2, 1fr); |
| gap: 16px; |
| } |
| |
| @media (max-width: 768px) { |
| .violation-grid { |
| grid-template-columns: 1fr; |
| } |
| } |
| |
| |
| .violation-card { |
| background: #ffffff; |
| border: 1px solid #e2e8f0; |
| border-radius: 8px; |
| padding: 14px; |
| } |
| |
| .violation-card-title { |
| font-size: 14px; |
| font-weight: 600; |
| color: #334155; |
| margin-bottom: 12px; |
| display: flex; |
| align-items: center; |
| gap: 8px; |
| } |
| |
| .violation-icon { |
| width: 20px; |
| height: 20px; |
| display: inline-flex; |
| align-items: center; |
| justify-content: center; |
| border-radius: 4px; |
| font-size: 12px; |
| } |
| |
| .icon-violence { background: #fee2e2; color: #dc2626; } |
| .icon-adult { background: #fce7f3; color: #db2777; } |
| .icon-hate { background: #fef3c7; color: #d97706; } |
| .icon-misinfo { background: #dbeafe; color: #2563eb; } |
| |
| |
| .severity-options { |
| display: flex; |
| gap: 8px; |
| } |
| |
| .severity-option { |
| flex: 1; |
| position: relative; |
| } |
| |
| .severity-option input[type="radio"] { |
| position: absolute; |
| opacity: 0; |
| width: 0; |
| height: 0; |
| } |
| |
| .severity-label { |
| display: block; |
| text-align: center; |
| padding: 10px 8px; |
| border-radius: 6px; |
| font-size: 12px; |
| font-weight: 500; |
| cursor: pointer; |
| transition: all 0.2s; |
| border: 2px solid transparent; |
| } |
| |
| |
| .severity-none .severity-label { |
| background: #dcfce7; |
| color: #166534; |
| border-color: #bbf7d0; |
| } |
| .severity-none input:checked + .severity-label { |
| background: #22c55e; |
| color: white; |
| border-color: #16a34a; |
| box-shadow: 0 2px 4px rgba(34, 197, 94, 0.3); |
| } |
| .severity-none:hover .severity-label { |
| border-color: #22c55e; |
| } |
| |
| |
| .severity-mild .severity-label { |
| background: #fef3c7; |
| color: #92400e; |
| border-color: #fde68a; |
| } |
| .severity-mild input:checked + .severity-label { |
| background: #f59e0b; |
| color: white; |
| border-color: #d97706; |
| box-shadow: 0 2px 4px rgba(245, 158, 11, 0.3); |
| } |
| .severity-mild:hover .severity-label { |
| border-color: #f59e0b; |
| } |
| |
| |
| .severity-severe .severity-label { |
| background: #fee2e2; |
| color: #991b1b; |
| border-color: #fecaca; |
| } |
| .severity-severe input:checked + .severity-label { |
| background: #ef4444; |
| color: white; |
| border-color: #dc2626; |
| box-shadow: 0 2px 4px rgba(239, 68, 68, 0.3); |
| } |
| .severity-severe:hover .severity-label { |
| border-color: #ef4444; |
| } |
| |
| |
| .decision-section { |
| background: #f1f5f9; |
| border: 2px solid #cbd5e1; |
| } |
| |
| .decision-section .section-title { |
| border-bottom-color: #3b82f6; |
| color: #1e40af; |
| } |
| |
| .decision-options { |
| display: flex; |
| gap: 12px; |
| flex-wrap: wrap; |
| } |
| |
| .decision-option { |
| flex: 1; |
| min-width: 140px; |
| position: relative; |
| } |
| |
| .decision-option input[type="radio"] { |
| position: absolute; |
| opacity: 0; |
| width: 0; |
| height: 0; |
| } |
| |
| .decision-label { |
| display: block; |
| text-align: center; |
| padding: 14px 16px; |
| border-radius: 8px; |
| font-size: 14px; |
| font-weight: 600; |
| cursor: pointer; |
| transition: all 0.2s; |
| border: 2px solid transparent; |
| } |
| |
| |
| .decision-approve .decision-label { |
| background: #dcfce7; |
| color: #166534; |
| border-color: #bbf7d0; |
| } |
| .decision-approve input:checked + .decision-label { |
| background: #22c55e; |
| color: white; |
| border-color: #16a34a; |
| box-shadow: 0 4px 6px rgba(34, 197, 94, 0.3); |
| transform: translateY(-1px); |
| } |
| .decision-approve:hover .decision-label { |
| border-color: #22c55e; |
| } |
| |
| |
| .decision-flag .decision-label { |
| background: #fef3c7; |
| color: #92400e; |
| border-color: #fde68a; |
| } |
| .decision-flag input:checked + .decision-label { |
| background: #f59e0b; |
| color: white; |
| border-color: #d97706; |
| box-shadow: 0 4px 6px rgba(245, 158, 11, 0.3); |
| transform: translateY(-1px); |
| } |
| .decision-flag:hover .decision-label { |
| border-color: #f59e0b; |
| } |
| |
| |
| .decision-remove .decision-label { |
| background: #fee2e2; |
| color: #991b1b; |
| border-color: #fecaca; |
| } |
| .decision-remove input:checked + .decision-label { |
| background: #ef4444; |
| color: white; |
| border-color: #dc2626; |
| box-shadow: 0 4px 6px rgba(239, 68, 68, 0.3); |
| transform: translateY(-1px); |
| } |
| .decision-remove:hover .decision-label { |
| border-color: #ef4444; |
| } |
| |
| |
| .notes-section textarea { |
| width: 100%; |
| border: 1px solid #e2e8f0; |
| border-radius: 6px; |
| padding: 12px; |
| font-size: 14px; |
| resize: vertical; |
| min-height: 80px; |
| } |
| |
| .notes-section textarea:focus { |
| outline: none; |
| border-color: #3b82f6; |
| box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); |
| } |
| |
| |
| .moderation-dashboard .annotation-form { |
| margin: 0; |
| padding: 0; |
| } |
| |
| .moderation-dashboard fieldset { |
| border: none; |
| margin: 0; |
| padding: 0; |
| } |
| |
| .moderation-dashboard legend { |
| display: none; |
| } |
| </style> |
|
|
| <div class="annotation_schema moderation-dashboard"> |
|
|
| |
| <div class="moderation-header"> |
| <div class="moderation-header-left"> |
| <span class="warning-icon">⚠</span> |
| <div> |
| <h3 class="moderation-title">CONTENT REVIEW</h3> |
| <div class="content-id">Review pending content for policy compliance</div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="moderation-section"> |
| <div class="section-title">Violation Assessment</div> |
|
|
| <div class="violation-grid"> |
|
|
| |
| <div class="violation-card"> |
| <div class="violation-card-title"> |
| <span class="violation-icon icon-violence">☠</span> |
| Violence / Gore |
| </div> |
| <form id="violence" class="annotation-form radio" action="/action_page.php" data-annotation-id="0"> |
| <fieldset schema="violence"> |
| <legend>Violence severity</legend> |
| <div class="severity-options"> |
| <div class="severity-option severity-none"> |
| <input class="violence annotation-input" type="radio" |
| id="violence_none" name="violence" value="none" |
| selection_constraint="single" schema="violence" label_name="none" |
| onclick="onlyOne(this);registerAnnotation(this);"> |
| <label for="violence_none" class="severity-label">None</label> |
| </div> |
| <div class="severity-option severity-mild"> |
| <input class="violence annotation-input" type="radio" |
| id="violence_mild" name="violence" value="mild" |
| selection_constraint="single" schema="violence" label_name="mild" |
| onclick="onlyOne(this);registerAnnotation(this);"> |
| <label for="violence_mild" class="severity-label">Mild</label> |
| </div> |
| <div class="severity-option severity-severe"> |
| <input class="violence annotation-input" type="radio" |
| id="violence_severe" name="violence" value="severe" |
| selection_constraint="single" schema="violence" label_name="severe" |
| onclick="onlyOne(this);registerAnnotation(this);"> |
| <label for="violence_severe" class="severity-label">Severe</label> |
| </div> |
| </div> |
| </fieldset> |
| </form> |
| </div> |
|
|
| |
| <div class="violation-card"> |
| <div class="violation-card-title"> |
| <span class="violation-icon icon-adult">♥</span> |
| Adult Content |
| </div> |
| <form id="adult_content" class="annotation-form radio" action="/action_page.php" data-annotation-id="1"> |
| <fieldset schema="adult_content"> |
| <legend>Adult content severity</legend> |
| <div class="severity-options"> |
| <div class="severity-option severity-none"> |
| <input class="adult_content annotation-input" type="radio" |
| id="adult_content_none" name="adult_content" value="none" |
| selection_constraint="single" schema="adult_content" label_name="none" |
| onclick="onlyOne(this);registerAnnotation(this);"> |
| <label for="adult_content_none" class="severity-label">None</label> |
| </div> |
| <div class="severity-option severity-mild"> |
| <input class="adult_content annotation-input" type="radio" |
| id="adult_content_mild" name="adult_content" value="mild" |
| selection_constraint="single" schema="adult_content" label_name="mild" |
| onclick="onlyOne(this);registerAnnotation(this);"> |
| <label for="adult_content_mild" class="severity-label">Mild</label> |
| </div> |
| <div class="severity-option severity-severe"> |
| <input class="adult_content annotation-input" type="radio" |
| id="adult_content_severe" name="adult_content" value="severe" |
| selection_constraint="single" schema="adult_content" label_name="severe" |
| onclick="onlyOne(this);registerAnnotation(this);"> |
| <label for="adult_content_severe" class="severity-label">Severe</label> |
| </div> |
| </div> |
| </fieldset> |
| </form> |
| </div> |
|
|
| |
| <div class="violation-card"> |
| <div class="violation-card-title"> |
| <span class="violation-icon icon-hate">✘</span> |
| Hate Speech |
| </div> |
| <form id="hate_speech" class="annotation-form radio" action="/action_page.php" data-annotation-id="2"> |
| <fieldset schema="hate_speech"> |
| <legend>Hate speech severity</legend> |
| <div class="severity-options"> |
| <div class="severity-option severity-none"> |
| <input class="hate_speech annotation-input" type="radio" |
| id="hate_speech_none" name="hate_speech" value="none" |
| selection_constraint="single" schema="hate_speech" label_name="none" |
| onclick="onlyOne(this);registerAnnotation(this);"> |
| <label for="hate_speech_none" class="severity-label">None</label> |
| </div> |
| <div class="severity-option severity-mild"> |
| <input class="hate_speech annotation-input" type="radio" |
| id="hate_speech_mild" name="hate_speech" value="mild" |
| selection_constraint="single" schema="hate_speech" label_name="mild" |
| onclick="onlyOne(this);registerAnnotation(this);"> |
| <label for="hate_speech_mild" class="severity-label">Mild</label> |
| </div> |
| <div class="severity-option severity-severe"> |
| <input class="hate_speech annotation-input" type="radio" |
| id="hate_speech_severe" name="hate_speech" value="severe" |
| selection_constraint="single" schema="hate_speech" label_name="severe" |
| onclick="onlyOne(this);registerAnnotation(this);"> |
| <label for="hate_speech_severe" class="severity-label">Severe</label> |
| </div> |
| </div> |
| </fieldset> |
| </form> |
| </div> |
|
|
| |
| <div class="violation-card"> |
| <div class="violation-card-title"> |
| <span class="violation-icon icon-misinfo">ℹ</span> |
| Misinformation |
| </div> |
| <form id="misinformation" class="annotation-form radio" action="/action_page.php" data-annotation-id="3"> |
| <fieldset schema="misinformation"> |
| <legend>Misinformation severity</legend> |
| <div class="severity-options"> |
| <div class="severity-option severity-none"> |
| <input class="misinformation annotation-input" type="radio" |
| id="misinformation_none" name="misinformation" value="none" |
| selection_constraint="single" schema="misinformation" label_name="none" |
| onclick="onlyOne(this);registerAnnotation(this);"> |
| <label for="misinformation_none" class="severity-label">None</label> |
| </div> |
| <div class="severity-option severity-mild"> |
| <input class="misinformation annotation-input" type="radio" |
| id="misinformation_mild" name="misinformation" value="mild" |
| selection_constraint="single" schema="misinformation" label_name="mild" |
| onclick="onlyOne(this);registerAnnotation(this);"> |
| <label for="misinformation_mild" class="severity-label">Mild</label> |
| </div> |
| <div class="severity-option severity-severe"> |
| <input class="misinformation annotation-input" type="radio" |
| id="misinformation_severe" name="misinformation" value="severe" |
| selection_constraint="single" schema="misinformation" label_name="severe" |
| onclick="onlyOne(this);registerAnnotation(this);"> |
| <label for="misinformation_severe" class="severity-label">Severe</label> |
| </div> |
| </div> |
| </fieldset> |
| </form> |
| </div> |
|
|
| </div> |
| </div> |
|
|
| |
| <div class="moderation-section decision-section"> |
| <div class="section-title">Final Decision</div> |
|
|
| <form id="decision" class="annotation-form radio" action="/action_page.php" data-annotation-id="4"> |
| <fieldset schema="decision"> |
| <legend>Final moderation decision</legend> |
| <div class="decision-options"> |
| <div class="decision-option decision-approve"> |
| <input class="decision annotation-input" type="radio" |
| id="decision_approve" name="decision" value="approve" |
| selection_constraint="single" schema="decision" label_name="approve" |
| onclick="onlyOne(this);registerAnnotation(this);"> |
| <label for="decision_approve" class="decision-label">✓ Approve</label> |
| </div> |
| <div class="decision-option decision-flag"> |
| <input class="decision annotation-input" type="radio" |
| id="decision_flag_review" name="decision" value="flag_review" |
| selection_constraint="single" schema="decision" label_name="flag_review" |
| onclick="onlyOne(this);registerAnnotation(this);"> |
| <label for="decision_flag_review" class="decision-label">⚑ Flag for Review</label> |
| </div> |
| <div class="decision-option decision-remove"> |
| <input class="decision annotation-input" type="radio" |
| id="decision_remove" name="decision" value="remove" |
| selection_constraint="single" schema="decision" label_name="remove" |
| onclick="onlyOne(this);registerAnnotation(this);"> |
| <label for="decision_remove" class="decision-label">✗ Remove</label> |
| </div> |
| </div> |
| </fieldset> |
| </form> |
| </div> |
|
|
| |
| <div class="moderation-section notes-section"> |
| <div class="section-title">Moderator Notes</div> |
|
|
| <form id="moderator_notes" class="annotation-form text" action="/action_page.php" data-annotation-id="5"> |
| <fieldset schema="moderator_notes"> |
| <legend>Additional notes</legend> |
| <textarea class="moderator_notes annotation-input" |
| id="moderator_notes_textarea" |
| name="moderator_notes" |
| schema="moderator_notes" |
| label_name="notes" |
| rows="3" |
| placeholder="Document reasoning, edge cases, or additional context for the moderation log..." |
| oninput="registerTextAnnotation(this);"></textarea> |
| </fieldset> |
| </form> |
| </div> |
|
|
| </div> |
|
|