MOPC-App/docs/claude-architecture-redesign/16-jury-ui.md

1807 lines
101 KiB
Markdown
Raw Normal View History

# Jury UI Redesign — Multi-Jury Member Experience
## 1. Overview
The Jury UI redesign transforms the jury member experience from a single-stage, single-jury model to a **multi-jury, cross-round, document-aware** system. Jury members can now belong to multiple jury groups (Jury 1, Jury 2, award juries), see documents from multiple submission windows, and manage evaluations across different rounds seamlessly.
### Design Principles
1. **Multi-jury awareness** — Jurors can be on multiple juries; UI must clearly separate contexts
2. **Cross-round document visibility** — Jury 2 sees Round 1 + Round 2 docs; Jury 3 sees all
3. **Deadline-driven** — Prominent countdowns, overdue warnings, grace period indicators
4. **Mobile-responsive live voting** — Live finals must work on phones/tablets
5. **Zero cognitive load** — Clear CTAs, guided workflows, no guessing what to do next
6. **Accessibility-first** — WCAG AA compliance for scoring forms, keyboard nav, screen readers
### Key User Journeys
| Journey | Pages Involved | Frequency |
|---------|---------------|-----------|
| **Onboarding** | `/jury/onboarding/[groupId]` | Once per jury group |
| **Daily evaluation** | Dashboard → Assignments → Evaluate | Daily during window |
| **Live finals voting** | Dashboard → Live voting interface | Once (ceremony day) |
| **Winner confirmation** | Dashboard → Confirmation review | Once (post-finals) |
| **Award voting** | Dashboard → Award evaluation | Once per award |
---
## 2. Current Jury UI Audit
### Existing Pages (in `src/app/(jury)/`)
| File | Purpose | Issues/Limitations |
|------|---------|-------------------|
| `jury/page.tsx` | Jury dashboard | Single-stage view, no multi-jury support |
| `jury/stages/page.tsx` | Stage list | Uses old Stage/Track terminology |
| `jury/stages/[stageId]/assignments/page.tsx` | Assignment list | No jury group filtering, no cross-round docs |
| `jury/stages/[stageId]/projects/[projectId]/page.tsx` | Project detail | Single submission window only |
| `jury/stages/[stageId]/projects/[projectId]/evaluate/page.tsx` | Evaluation form | No multi-window doc access |
| `jury/stages/[stageId]/projects/[projectId]/evaluation/page.tsx` | Evaluation results | Unclear separation from evaluate |
| `jury/stages/[stageId]/live/page.tsx` | Live voting | Exists but needs enhancement |
| `jury/stages/[stageId]/compare/page.tsx` | Project comparison | Useful but no multi-doc support |
| `jury/awards/page.tsx` | Awards list | Basic list, no voting interface |
| `jury/awards/[id]/page.tsx` | Award detail | Basic detail, no evaluation form |
| `jury/learning/page.tsx` | Learning resources | Good — preserve as-is |
### What's Missing
| Missing Feature | Impact |
|----------------|--------|
| **Multi-jury dashboard** | Jurors on Jury 1 + Jury 2 have no way to switch context |
| **Jury group switcher** | All assignments shown together — confusing |
| **Cross-round document viewer** | Jury 2 can't see Round 1 + Round 2 docs side-by-side |
| **Onboarding flow** | No expertise selection, COI pre-declaration, preferences |
| **Grace period indicators** | Jurors don't know if they have extended deadline |
| **Winner confirmation UI** | No digital signature interface |
| **Award evaluation form** | Award voting is separate from main evaluation |
| **Deadline countdown** | No prominent timer showing time remaining |
| **Next project CTA** | No "Continue Next Evaluation" quick action |
| **Assignment filters** | Can't filter by status (pending/draft/done), category |
---
## 3. Jury Dashboard — Landing Page
### Purpose
The jury dashboard is the **mission control** for all jury activities. It shows active jury groups, pending work, deadlines, and quick actions.
### Route
`/jury/dashboard`
### Data Requirements
```typescript
// tRPC query
const { data: dashboardData } = trpc.jury.getDashboard.useQuery();
type DashboardData = {
juryGroups: {
id: string;
name: string; // "Jury 1", "Jury 2", "Innovation Award Jury"
description: string;
linkedRounds: {
id: string;
name: string; // "Round 3: Semi-finalist Selection"
status: RoundStatus;
windowCloseAt: Date | null;
daysRemaining: number | null;
}[];
stats: {
totalAssignments: number;
completed: number;
inDraft: number;
pending: number;
overdue: number;
};
nextAction: {
type: "continue_evaluation" | "start_live_voting" | "confirm_winners" | null;
projectId?: string;
roundId?: string;
url: string;
} | null;
}[];
upcomingDeadlines: {
roundId: string;
roundName: string;
juryGroupName: string;
deadline: Date;
daysRemaining: number;
isGracePeriod: boolean;
}[];
recentActivity: {
timestamp: Date;
type: "evaluation_submitted" | "live_vote_cast" | "coi_declared" | "confirmation_approved";
projectTitle: string;
roundName: string;
}[];
};
```
### ASCII Mockup — Multi-Jury Dashboard
```
┌───────────────────────────────────────────────────────────────────────────┐
│ Jury Dashboard — Welcome, Dr. Alice Martin │
├───────────────────────────────────────────────────────────────────────────┤
│ │
│ 🔔 Upcoming Deadlines │
│ ┌────────────────────────────────────────────────────────────────────┐ │
│ │ ⏱ Jury 1 — Semi-finalist Selection │ April 30 │ ⚠️ 3 days left │ │
│ │ ⏱ Innovation Award Voting │ May 15 │ 18 days left │ │
│ └────────────────────────────────────────────────────────────────────┘ │
│ │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ Your Jury Groups │
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ Jury 1 — Semi-finalist Selection ACTIVE│ │
│ │ ────────────────────────────────────────────────────────────── │ │
│ │ Round 3: Jury 1 Evaluation │ │
│ │ ⏱ Closes April 30 (3 days remaining) │ │
│ │ │ │
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │
│ │ │ 20 │ │ 12 │ │ 3 │ │ 5 │ │ │
│ │ │ Total │ │ Complete │ │ In Draft │ │ Pending │ │ │
│ │ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │ │
│ │ │ │
│ │ Progress: ████████████████░░░░ 60% (12/20 complete) │ │
│ │ │ │
│ │ [ Continue Next Evaluation → ] [ View All Assignments ] │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ Innovation Award Jury DRAFT│ │
│ │ ────────────────────────────────────────────────────────────── │ │
│ │ Innovation Award Voting │ │
│ │ ⏱ Opens May 1 (not yet started) │ │
│ │ │ │
│ │ Awaiting assignment │ │
│ │ │ │
│ │ [ View Details ] │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ Recent Activity │
│ ┌────────────────────────────────────────────────────────────────────┐ │
│ │ ✅ Evaluation submitted — "OceanClean AI" (Jury 1) 2 hours ago │ │
│ │ ✅ Evaluation submitted — "DeepReef Monitor" (Jury 1) 1 day ago │ │
│ │ 🔒 COI declared — "WaveEnergy Solutions" (Jury 1) 3 days ago │ │
│ └────────────────────────────────────────────────────────────────────┘ │
│ │
└───────────────────────────────────────────────────────────────────────────┘
```
### Key Elements
1. **Deadline banner** — Sorted by urgency, red for <5 days, orange for <10 days
2. **Jury group cards** — One card per jury group the user belongs to
3. **Progress stats** — Total, completed, in-draft, pending (with visual progress bar)
4. **Next action CTA** — "Continue Next Evaluation" jumps to first pending project
5. **Grace period indicator** — Shows if juror has extended deadline
6. **Recent activity feed** — Last 5-10 actions (evaluations, COI, live votes)
### Interactions
| Action | Behavior |
|--------|----------|
| Click "Continue Next Evaluation" | Navigate to first PENDING assignment's evaluation page |
| Click "View All Assignments" | Navigate to `/jury/groups/[groupId]/assignments` |
| Click jury group card header | Expand/collapse card (if multiple groups) |
| Click deadline item | Navigate to associated round's assignment page |
---
## 4. Jury Group Context — Switcher & Breadcrumbs
When a juror is on multiple juries, the UI must clearly show which jury context they're in.
### Jury Group Switcher (Global Header)
```
┌───────────────────────────────────────────────────────────────────┐
│ [MOPC Logo] │ Jury: [ Jury 1 ▼ ] │ 🔔 3 │ Dr. Martin ▼ │
└───────────────────────────────────────────────────────────────────┘
↓ (dropdown)
┌─────────────────────────┐
│ ● Jury 1 (5 pending) │
│ ○ Innovation Award Jury │
│ ─────────────────────── │
│ Switch Jury Group │
└─────────────────────────┘
```
### Breadcrumbs with Jury Context
```
Home > Jury 1 > Assignments > OceanClean AI > Evaluate
Home > Innovation Award Jury > Award Voting > Innovation Award
```
---
## 5. Onboarding Flow — First-Time Setup
When a juror is added to a new jury group, they must complete onboarding before evaluating.
### Route
`/jury/onboarding/[juryGroupId]`
### Onboarding Steps
```
Step 1: Welcome
Step 2: Your Expertise & Preferences
Step 3: Conflict of Interest Declaration
Step 4: Confirmation
```
### Step 1: Welcome
```
┌──────────────────────────────────────────────────────────────────┐
│ Welcome to Jury 1 — Semi-finalist Selection │
│ │
│ You've been selected to evaluate projects for the │
│ Monaco Ocean Protection Challenge 2026. │
│ │
│ What to Expect: │
│ ──────────────────────────────────────────────────────────── │
│ • Evaluate up to 20 projects (Startups + Concepts) │
│ • Evaluation window: April 1 April 30, 2026 │
│ • Scoring based on Innovation, Feasibility, Team, Relevance │
│ • Submit by the deadline to ensure your input counts │
│ │
│ Time Commitment: ~30 minutes per project │
│ Total estimated time: ~10 hours over 30 days │
│ │
│ [ Get Started → ] │
└──────────────────────────────────────────────────────────────────┘
```
### Step 2: Expertise & Preferences
```
┌──────────────────────────────────────────────────────────────────┐
│ Your Expertise & Preferences │
│ ────────────────────────────────────────────────────────────── │
│ │
│ Select your areas of expertise (used for assignment matching): │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ ☑ Marine Biology ☑ Ocean Technology │ │
│ │ ☐ Renewable Energy ☑ Environmental Policy │ │
│ │ ☐ Finance/Investment ☐ Social Impact │ │
│ │ ☐ Data Science ☐ Education │ │
│ │ ☐ Business Development ☐ Engineering │ │
│ │ │ │
│ │ Other: [____________________________] │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ Language preferences: │
│ ☑ English ☑ French ☐ Other: [________] │
│ │
│ Category preference (Startups vs Concepts): │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ Startups [==========●========] Concepts │ │
│ │ 60% Startups / 40% Concepts │ │
│ │ │ │
│ │ This helps us assign projects that match your interests. │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ Workload preference: │
│ ○ Standard (up to 20 projects) │
│ ● Reduced (up to 15 projects) — I have limited availability │
│ ○ Increased (up to 25 projects) — I can handle more │
│ │
│ [ ← Back ] [ Next Step → ] │
└──────────────────────────────────────────────────────────────────┘
```
### Step 3: Conflict of Interest Declaration
```
┌──────────────────────────────────────────────────────────────────┐
│ Conflict of Interest Declaration │
│ ────────────────────────────────────────────────────────────── │
│ │
│ Please review the project list and declare any conflicts of │
│ interest. A COI exists if you have a personal, financial, or │
│ professional relationship with a project team. │
│ │
│ ┌────────────────────────────────────────────┬───────────────┐ │
│ │ Project │ COI? │ │
│ ├────────────────────────────────────────────┼───────────────┤ │
│ │ OceanClean AI (Startup) │ ○ None │ │
│ │ DeepReef Monitoring (Startup) │ ● Declare COI │ │
│ │ CoralGuard (Concept) │ ○ None │ │
│ │ WaveEnergy Solutions (Startup) │ ○ None │ │
│ │ BlueCarbonHub (Concept) │ ○ None │ │
│ │ ... (15 more) │ │ │
│ └────────────────────────────────────────────┴───────────────┘ │
│ │
│ COI Details for "DeepReef Monitoring": │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ Type: [Professional ▼] │ │
│ │ Reason: │ │
│ │ ┌────────────────────────────────────────────────────────┐ │ │
│ │ │ Former colleague of team lead. Worked together at │ │ │
│ │ │ Marine Institute 2022-2023. No financial ties. │ │ │
│ │ └────────────────────────────────────────────────────────┘ │ │
│ │ [ ✓ Save COI] │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ Note: You can declare additional conflicts later if needed. │
│ │
│ [ ← Back ] [ Next Step → ] │
└──────────────────────────────────────────────────────────────────┘
```
### Step 4: Confirmation
```
┌──────────────────────────────────────────────────────────────────┐
│ Ready to Begin │
│ ────────────────────────────────────────────────────────────── │
│ │
│ Summary of Your Setup: │
│ ──────────────────────────────────────────────────────────── │
│ • Jury Group: Jury 1 — Semi-finalist Selection │
│ • Your expertise: Marine Biology, Ocean Tech, Env. Policy │
│ • Workload: Up to 15 projects (reduced load) │
│ • Category preference: 60% Startups / 40% Concepts │
│ • COI declared: 1 project (DeepReef Monitoring) │
│ │
│ By confirming, you agree to: │
│ ☑ Evaluate assigned projects fairly and impartially │
│ ☑ Complete evaluations by the deadline (April 30, 2026) │
│ ☑ Maintain confidentiality of all submissions │
│ ☑ Report any additional conflicts of interest as they arise │
│ │
│ Evaluation deadline: April 30, 2026 │
│ Grace period: +2 days if needed (request from admin) │
│ │
│ [ ← Back ] [ ✓ Confirm & Start ] │
└──────────────────────────────────────────────────────────────────┘
```
After confirmation, juror is redirected to `/jury/groups/[juryGroupId]/assignments`.
---
## 6. Assignment View — Project List
### Route
`/jury/groups/[juryGroupId]/assignments`
### Purpose
Show all assigned projects for a specific jury group, with filtering, sorting, and status tracking.
### ASCII Mockup
```
┌──────────────────────────────────────────────────────────────────────┐
│ Jury 1 — Semi-finalist Selection │
│ Assignments │
├──────────────────────────────────────────────────────────────────────┤
│ │
│ ⏱ Evaluation Window: April 1 April 30, 2026 (3 days remaining) │
│ │
│ Progress: 12/20 complete (60%) ████████████████░░░░ │
│ │
│ ┌─────────────────────────────────────────────────────────────────┐│
│ │ Filters: [All Statuses ▼] [All Categories ▼] 🔍 Search ││
│ │ Sort by: [Status ▼] ││
│ └─────────────────────────────────────────────────────────────────┘│
│ │
│ Pending (5) │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 📦 SeaWatch Monitor │ Startup │ ⬜ Pending │ │
│ │ Smart monitoring for reef health │ │
│ │ [Start Evaluation] │ │
│ ├──────────────────────────────────────────────────────────────┤ │
│ │ 📦 TidalEnergy Pro │ Startup │ ⬜ Pending │ │
│ │ Tidal energy harvesting system │ │
│ │ [Start Evaluation] │ │
│ ├──────────────────────────────────────────────────────────────┤ │
│ │ 📦 PlasticOcean Filter │ Concept │ ⬜ Pending │ │
│ │ Novel microplastic filtration concept │ │
│ │ [Start Evaluation] │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
│ In Draft (3) │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 📦 BlueCarbon Hub │ Concept │ ⏳ Draft │ │
│ │ Carbon credit marketplace for ocean restoration │ │
│ │ Last saved 2 hours ago │ │
│ │ [Continue Evaluation] │ │
│ ├──────────────────────────────────────────────────────────────┤ │
│ │ 📦 CoralGuard AI │ Startup │ ⏳ Draft │ │
│ │ AI-powered coral reef protection │ │
│ │ Last saved 1 day ago │ │
│ │ [Continue Evaluation] │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
│ Completed (12) │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 📦 OceanClean AI │ Startup │ ✅ Submitted │ │
│ │ AI-powered ocean debris collection robot │ │
│ │ Submitted 2 hours ago • Score: 4.2/5.0 │ │
│ │ [View Evaluation] │ │
│ ├──────────────────────────────────────────────────────────────┤ │
│ │ 📦 DeepReef Monitor │ Startup │ 🔒 COI Declared │ │
│ │ Deep-sea reef monitoring platform │ │
│ │ Not evaluated — conflict of interest │ │
│ │ [View COI Details] │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
│ [ ← Back to Dashboard ] [ Export List (.csv) ] │
└──────────────────────────────────────────────────────────────────────┘
```
### Filters & Sorting
| Filter | Options |
|--------|---------|
| **Status** | All, Pending, In Draft, Submitted, COI Declared |
| **Category** | All, Startup, Concept |
| **Search** | Text search on project title |
| Sort By | Options |
|---------|---------|
| Status (default) | Pending → Draft → Submitted |
| Deadline proximity | Projects needing evaluation first |
| Alphabetical | A-Z by project title |
| Category | Startup first, then Concept |
### Card Elements
Each project card shows:
- **Title** with category badge
- **Status indicator** (⬜ Pending, ⏳ Draft, ✅ Submitted, 🔒 COI)
- **Brief description** (first 80 chars)
- **Last action timestamp** for drafts
- **Score** for submitted evaluations
- **CTA button** (Start / Continue / View)
---
## 7. Evaluation Interface — Core Workflow
### Route
`/jury/groups/[juryGroupId]/evaluate/[projectId]`
### Purpose
The heart of the jury experience. Jurors review project documents, score against criteria, and submit feedback.
### Tab Structure
```
[📄 Documents] [📊 Scoring] [💬 Feedback] [ Project Info]
```
### ASCII Mockup — Documents Tab
```
┌──────────────────────────────────────────────────────────────────────┐
│ Evaluating: OceanClean AI (Startup) — Jury 1 │
│ ───────────────────────────────────────────────────────────────────│
│ [📄 Documents] [📊 Scoring] [💬 Feedback] [ Project Info] │
├──────────────────────────────────────────────────────────────────────┤
│ │
│ ── Round 1 Application Documents ───────────────────────────────── │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ 📄 Executive Summary.pdf [Download] [View] │ │
│ │ Uploaded: March 15, 2026 • 2.3 MB │ │
│ ├────────────────────────────────────────────────────────────────┤ │
│ │ 📄 Business Plan.pdf [Download] [View] │ │
│ │ Uploaded: March 15, 2026 • 5.1 MB │ │
│ ├────────────────────────────────────────────────────────────────┤ │
│ │ 📄 Technical Specifications.pdf [Download] [View] │ │
│ │ Uploaded: March 16, 2026 • 1.8 MB │ │
│ ├────────────────────────────────────────────────────────────────┤ │
│ │ 🎥 Pitch Video.mp4 [Download] [Play] │ │
│ │ Uploaded: March 17, 2026 • 45 MB │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ │
│ (For Jury 2, this section would also show:) │
│ │
│ ── Round 2 Semi-finalist Documents ────────────────────────────────│
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ 📄 Updated Business Plan.pdf [Download] [View] │ │
│ │ Uploaded: April 20, 2026 • 6.2 MB │ │
│ ├────────────────────────────────────────────────────────────────┤ │
│ │ 🎥 Enhanced Pitch Video.mp4 [Download] [Play] │ │
│ │ Uploaded: April 21, 2026 • 52 MB │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ │
│ Tip: Use browser's PDF viewer for inline review, or download to │
│ annotate locally. │
│ │
│ [ ← Previous Project ] [ Next Project → ] │
└──────────────────────────────────────────────────────────────────────┘
```
### ASCII Mockup — Scoring Tab (Criteria Mode)
```
┌──────────────────────────────────────────────────────────────────────┐
│ Evaluating: OceanClean AI (Startup) — Jury 1 │
│ ───────────────────────────────────────────────────────────────────│
│ [📄 Documents] [📊 Scoring] [💬 Feedback] [ Project Info] │
├──────────────────────────────────────────────────────────────────────┤
│ │
│ Score each criterion on a scale of 1 (Poor) to 5 (Excellent) │
│ │
│ ┌─────────────────────────────────────────────────────────────────┐│
│ │ Innovation & Impact (30%) ││
│ │ How novel is the solution? What is the potential ocean impact? ││
│ │ ││
│ │ 1 2 3 4 5 ││
│ │ ○ ○ ○ ● ○ ││
│ │ Poor Fair Good Very Excellent ││
│ │ Good ││
│ │ ││
│ │ Notes (optional): ││
│ │ ┌─────────────────────────────────────────────────────────────┐ ││
│ │ │ Strong use of AI for real-time debris detection. │ ││
│ │ │ Innovative approach but scalability uncertain. │ ││
│ │ └─────────────────────────────────────────────────────────────┘ ││
│ └─────────────────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────────────────────────────────────────────────┐│
│ │ Feasibility & Execution (25%) ││
│ │ Is the plan realistic? Can the team execute? ││
│ │ ││
│ │ 1 2 3 4 5 ││
│ │ ○ ○ ● ○ ○ ││
│ │ ││
│ │ Notes: [_________________________________________________] ││
│ └─────────────────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────────────────────────────────────────────────┐│
│ │ Team & Expertise (25%) ││
│ │ Does the team have the right skills and experience? ││
│ │ ││
│ │ 1 2 3 4 5 ││
│ │ ○ ○ ○ ● ○ ││
│ └─────────────────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────────────────────────────────────────────────┐│
│ │ Ocean Relevance (20%) ││
│ │ How directly does this address ocean protection? ││
│ │ ││
│ │ 1 2 3 4 5 ││
│ │ ○ ○ ○ ○ ● ││
│ └─────────────────────────────────────────────────────────────────┘│
│ │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ Overall Score: 3.8 / 5.0 (weighted average) │
│ │
│ Auto-saved 5 seconds ago │
│ │
│ [ ← Previous Project ] [💾 Save Draft] [ Next Project → ] │
└──────────────────────────────────────────────────────────────────────┘
```
### ASCII Mockup — Feedback Tab
```
┌──────────────────────────────────────────────────────────────────────┐
│ Evaluating: OceanClean AI (Startup) — Jury 1 │
│ ───────────────────────────────────────────────────────────────────│
│ [📄 Documents] [📊 Scoring] [💬 Feedback] [ Project Info] │
├──────────────────────────────────────────────────────────────────────┤
│ │
│ Overall Feedback (Required) │
│ ────────────────────────────────────────────────────────────────── │
│ │
│ Provide constructive feedback on this project's strengths and │
│ areas for improvement. This will be shared with the team. │
│ │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ Strengths: │ │
│ │ │ │
│ │ The AI-powered debris detection is innovative and addresses │ │
│ │ a critical ocean pollution challenge. The team has strong │ │
│ │ technical expertise in robotics and machine learning. │ │
│ │ │ │
│ │ Areas for Improvement: │ │
│ │ │ │
│ │ The business model lacks clarity on scalability and revenue │ │
│ │ streams. More detail needed on how the solution will be │ │
│ │ deployed at scale across different ocean environments. │ │
│ │ │ │
│ │ Recommendations: │ │
│ │ │ │
│ │ Consider partnerships with maritime authorities and port │ │
│ │ operators for pilot deployments. Explore subscription model │ │
│ │ for data insights. │ │
│ │ │ │
│ │ (Character count: 523 / 2000 recommended) │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ │
│ Confidential Notes (Optional — NOT shared with team) │
│ ────────────────────────────────────────────────────────────────── │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ Team lead seems overconfident. May need mentoring on market │ │
│ │ validation. │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ │
│ Auto-saved 3 seconds ago │
│ │
│ [ ← Previous Project ] [💾 Save Draft] [✅ Submit Evaluation] │
└──────────────────────────────────────────────────────────────────────┘
```
### Scoring Modes
| Mode | Interface | Use Case |
|------|-----------|----------|
| **Criteria** | Multiple 1-5 scales with weights | Jury 1, Jury 2 (detailed evaluation) |
| **Global** | Single 1-10 score + feedback | Quick screening or award voting |
| **Binary** | Yes/No decision + justification | Fast filtering or pre-screening |
### COI Declaration (Blocking Dialog)
If juror hasn't declared COI for this project yet:
```
┌──────────────────────────────────────────────────┐
│ Conflict of Interest Declaration Required │
│ │
│ Before evaluating "OceanClean AI", please confirm│
│ whether you have any conflict of interest. │
│ │
│ A COI exists if you have a personal, financial, │
│ or professional relationship with the team. │
│ │
│ ○ No conflict — I can evaluate fairly │
│ ○ Yes, I have a conflict: │
│ Type: [Financial ▼] │
│ Details: [_______________________________] │
│ │
│ [ Submit Declaration ] │
│ │
│ (Cannot proceed until COI is declared) │
└──────────────────────────────────────────────────┘
```
If COI is declared, juror is redirected back to assignment list and this project is marked "COI Declared" (no evaluation).
### Auto-Save Behavior
- **Trigger**: Every 30 seconds while form has unsaved changes
- **Indicator**: "Auto-saved X seconds ago" in footer
- **Status**: Evaluation status remains `DRAFT` until explicit "Submit Evaluation"
- **Recovery**: If browser crashes, draft is restored on next visit
### Submit Evaluation
When juror clicks "Submit Evaluation":
1. **Validation**:
- All required criteria scored
- Feedback text provided (if `requireFeedback`)
- Window is open OR juror has grace period
2. **Confirmation dialog**:
```
┌─────────────────────────────────────────┐
│ Submit Evaluation? │
│ │
│ Once submitted, you cannot edit this │
│ evaluation. Please review your scores │
│ and feedback before proceeding. │
│ │
│ Overall Score: 3.8 / 5.0 │
│ Feedback: 523 characters │
│ │
│ [ Cancel ] [ ✓ Confirm Submit ] │
└─────────────────────────────────────────┘
```
3. **On confirm**:
- Set `Evaluation.status = SUBMITTED`
- Set `Evaluation.submittedAt = now()`
- Set `Assignment.isCompleted = true`
- Show success toast: "Evaluation submitted ✓"
- Navigate to next pending assignment OR back to assignment list
### Navigation
| Action | Behavior |
|--------|----------|
| Previous Project | Jump to previous assignment in list (or disabled if first) |
| Next Project | Jump to next assignment in list (or disabled if last) |
| Save Draft | Explicit save (in addition to auto-save) |
| Submit Evaluation | Validate, confirm, submit, navigate to next |
| Close | Return to assignment list |
---
## 8. Live Finals Voting — Real-Time Interface
### Route
`/jury/live/[roundId]`
### Purpose
During the live finals ceremony, jury members vote in real-time as projects are presented.
### Desktop Interface
```
┌──────────────────────────────────────────────────────────────────────┐
│ Live Finals — Monaco OPC 2026 │
│ Jury 3 Voting • Connected ● │
├──────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ NOW PRESENTING │ │
│ │ │ │
│ │ 🏆 Project 3 of 6 (Startups) │ │
│ │ │ │
│ │ OceanClean AI │ │
│ │ AI-powered ocean debris collection robot │ │
│ │ │ │
│ │ Team: Dr. Sarah Chen, Prof. Marc Dubois │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ ⏱ Voting Window: 2:30 remaining │
│ │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ YOUR SCORE │ │
│ │ │ │
│ │ Rate this presentation (1-10): │ │
│ │ │ │
│ │ [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] │ │
│ │ ● │ │
│ │ │ │
│ │ Quick Notes (optional): │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ Strong presentation. Clear value prop. Good Q&A. │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ [✓ Submit Vote] [Skip This Project] │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ Progress (Startups): │
│ [✓] Project 1 [✓] Project 2 [●] Project 3 [ ] Project 4 │
│ │
│ Up Next: TidalEnergy Pro │
│ │
│ [ Pause Voting ] [ View All Votes ] [ Connection: ● Live ] │
└──────────────────────────────────────────────────────────────────────┘
```
### Mobile Interface
```
┌────────────────────────────────────────┐
│ Live Finals — Jury 3 │
│ ●Connected ⏱ 2:30 left │
├────────────────────────────────────────┤
│ │
│ NOW PRESENTING │
│ ──────────────────────────────────── │
│ OceanClean AI (Project 3/6) │
│ AI ocean debris collection │
│ │
│ ┌────────────────────────────────┐ │
│ │ Rate this presentation (1-10): │ │
│ │ │ │
│ │ [1] [2] [3] [4] [5] │ │
│ │ [6] [7] [8] [9] [10] │ │
│ │ ● │ │
│ │ │ │
│ │ Notes: │ │
│ │ [___________________________] │ │
│ │ │ │
│ │ [✓ Submit Vote] │ │
│ │ [Skip This Project] │ │
│ └────────────────────────────────┘ │
│ │
│ Progress: ██████░░░ 3/6 │
│ Up Next: TidalEnergy Pro │
│ │
└────────────────────────────────────────┘
```
### Key Features
| Feature | Implementation |
|---------|---------------|
| **Real-time sync** | WebSocket or server-sent events for cursor updates |
| **Voting timer** | Countdown clock, auto-closes voting window |
| **Connection status** | ●Live / ○Reconnecting / ✕Disconnected |
| **Progress tracker** | Visual indicator of which projects have been voted on |
| **Skip option** | Juror can skip if COI or missed presentation |
| **Auto-save** | Vote draft saved before submission in case of disconnect |
### Voting States
```typescript
type LiveVoteStatus =
| "not_started" // Ceremony hasn't begun
| "waiting_next" // Between presentations
| "voting_open" // Current project, voting window open
| "voting_closed" // Current project, window closed
| "ceremony_ended" // All projects presented
| "deliberation"; // Post-voting discussion period
```
### Voting Submission Flow
```
1. Juror selects score (1-10)
2. (Optional) Adds quick notes
3. Clicks "Submit Vote"
4. Confirmation: "Vote submitted for OceanClean AI ✓"
5. UI shows "Vote Submitted — Waiting for next project"
6. When admin advances cursor → next project loads
```
### Connection Loss Handling
```
┌────────────────────────────────────────┐
│ ⚠️ Connection Lost │
│ │
│ Attempting to reconnect... │
│ │
│ Your draft vote has been saved locally.│
│ It will sync when connection restores. │
│ │
│ [ Try Reconnect Now ] │
└────────────────────────────────────────┘
```
---
## 9. Winner Confirmation — Digital Signature
### Route
`/jury/confirmation/[proposalId]`
### Purpose
After live finals, jury members review and approve the proposed winner rankings.
### ASCII Mockup
```
┌──────────────────────────────────────────────────────────────────────┐
│ Winner Confirmation — Monaco OPC 2026 │
│ Jury 3 Digital Signature │
├──────────────────────────────────────────────────────────────────────┤
│ │
│ Please review the proposed finalist rankings and confirm. │
│ Your digital approval is required to finalize the results. │
│ │
│ ── STARTUP CATEGORY ───────────────────────────────────────────── │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ 🥇 1st Place: OceanClean AI │ │
│ │ Avg Score: 8.6 / 10.0 │ │
│ │ Jury votes: 9, 8, 9, 8, 9 │ │
│ │ Audience vote: 8.4 (weight: 20%) │ │
│ ├────────────────────────────────────────────────────────────────┤ │
│ │ 🥈 2nd Place: TidalEnergy Pro │ │
│ │ Avg Score: 8.2 / 10.0 │ │
│ │ Jury votes: 8, 8, 9, 7, 8 │ │
│ ├────────────────────────────────────────────────────────────────┤ │
│ │ 🥉 3rd Place: SeaWatch Monitor │ │
│ │ Avg Score: 7.8 / 10.0 │ │
│ │ Jury votes: 8, 7, 8, 7, 9 │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ │
│ ── CONCEPT CATEGORY ───────────────────────────────────────────── │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ 🥇 1st Place: BlueCarbon Hub │ │
│ │ Avg Score: 8.4 / 10.0 │ │
│ │ Jury votes: 9, 8, 8, 8, 9 │ │
│ ├────────────────────────────────────────────────────────────────┤ │
│ │ 🥈 2nd Place: CoralGuard AI │ │
│ │ Avg Score: 8.0 / 10.0 │ │
│ │ Jury votes: 8, 8, 7, 9, 8 │ │
│ ├────────────────────────────────────────────────────────────────┤ │
│ │ 🥉 3rd Place: PlasticOcean Filter │ │
│ │ Avg Score: 7.6 / 10.0 │ │
│ │ Jury votes: 7, 8, 7, 8, 8 │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ Your Decision: │
│ ○ Approve these results │
│ ○ Request changes (provide feedback below) │
│ │
│ Comments (optional): │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ I agree with the rankings. The scores accurately reflect the │ │
│ │ quality of presentations. │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ │
│ ☑ I certify that these rankings are fair and accurate based on │
│ the evaluation criteria. │
│ │
│ Digital Signature: Dr. Alice Martin │
│ Date: May 20, 2026 │
│ │
│ [ ← Back ] [ ✓ Submit Confirmation ] │
└──────────────────────────────────────────────────────────────────────┘
```
### Confirmation States
```typescript
type ConfirmationStatus =
| "pending" // Waiting for juror response
| "approved" // Juror approved rankings
| "rejected" // Juror requested changes
| "overridden"; // Admin overrode this juror's rejection
```
### What Happens After Submission
```
If ALL jury members approve:
→ WinnerProposal.status = APPROVED
→ Admin can freeze results (makes them official)
If ANY jury member rejects:
→ WinnerProposal.status = REJECTED
→ Admin notified
→ Admin can either:
a) Adjust rankings and re-propose
b) Use override to force approval
If admin uses override:
→ WinnerProposal.status = OVERRIDDEN
→ WinnerProposal.overrideMode = "FORCE_MAJORITY" or "ADMIN_DECISION"
→ Results frozen with override logged in audit trail
```
---
## 10. Award Voting
### Route
`/jury/awards/[awardId]/vote`
### Purpose
For jurors on award juries (e.g., Innovation Award Jury), vote on award winners.
### ASCII Mockup — Award Voting (PICK_WINNER Mode)
```
┌──────────────────────────────────────────────────────────────────────┐
│ Innovation Award — Voting │
│ Innovation Award Jury │
├──────────────────────────────────────────────────────────────────────┤
│ │
│ Award Description: │
│ Recognizing the most innovative ocean technology solution with │
│ potential for global impact. │
│ │
│ Voting Window: May 1 May 15, 2026 (5 days remaining) │
│ │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ Eligible Projects (AI-screened for innovation criteria): │
│ │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ ○ OceanClean AI (Startup) │ │
│ │ AI-powered ocean debris collection robot │ │
│ │ Innovation Score: 9.2 / 10.0 (AI assessment) │ │
│ │ [View Full Submission] │ │
│ ├────────────────────────────────────────────────────────────────┤ │
│ │ ● DeepReef Monitor (Startup) — YOUR SELECTION │ │
│ │ Autonomous deep-sea reef monitoring platform │ │
│ │ Innovation Score: 9.0 / 10.0 (AI assessment) │ │
│ │ [View Full Submission] │ │
│ ├────────────────────────────────────────────────────────────────┤ │
│ │ ○ CoralGuard AI (Concept) │ │
│ │ AI-powered coral reef protection system │ │
│ │ Innovation Score: 8.8 / 10.0 (AI assessment) │ │
│ │ [View Full Submission] │ │
│ ├────────────────────────────────────────────────────────────────┤ │
│ │ ○ SeaWatch Monitor (Startup) │ │
│ │ Smart monitoring for reef health │ │
│ │ Innovation Score: 8.5 / 10.0 (AI assessment) │ │
│ │ [View Full Submission] │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ │
│ Justification (required): │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ DeepReef Monitor represents a breakthrough in autonomous │ │
│ │ deep-sea monitoring, enabling data collection in previously │ │
│ │ inaccessible environments. The innovation potential is highest.│ │
│ └────────────────────────────────────────────────────────────────┘ │
│ │
│ Auto-saved 10 seconds ago │
│ │
│ [ ← Back to Awards ] [💾 Save Draft] [✅ Submit Vote] │
└──────────────────────────────────────────────────────────────────────┘
```
### Award Voting Modes
| Mode | Interface | Description |
|------|-----------|-------------|
| **PICK_WINNER** | Radio buttons, pick one | Simple winner selection |
| **RANKED** | Drag-to-reorder list | Rank top N projects (e.g., top 3) |
| **SCORED** | 1-10 score per project | Score all eligible projects |
### Award Vote Submission
```
1. Juror selects winner (or ranks/scores)
2. Provides justification text
3. Clicks "Submit Vote"
4. Confirmation: "Award vote submitted ✓"
5. Status: "Your vote has been recorded. Results will be announced after voting closes."
```
---
## 11. Navigation & Information Architecture
### Full Sitemap
```
/jury/
├── dashboard (Multi-jury overview, landing page)
├── groups/[juryGroupId]/
│ ├── overview (Jury group details, progress)
│ ├── assignments (List of assigned projects)
│ ├── evaluate/[projectId] (Evaluation form)
│ └── settings (Juror preferences, COI management)
├── live/[roundId] (Live finals voting)
├── confirmation/[proposalId] (Winner confirmation)
├── awards/
│ ├── index (List of awards juror is on)
│ └── [awardId]/vote (Award voting form)
├── onboarding/[juryGroupId] (First-time setup per jury group)
├── profile (Juror profile, expertise, contact)
└── learning (Resources, guides, FAQs)
```
### Breadcrumb Examples
```
Home > Jury Dashboard
Home > Jury 1 > Assignments
Home > Jury 1 > Assignments > OceanClean AI > Evaluate
Home > Live Finals > Round 7
Home > Winner Confirmation
Home > Awards > Innovation Award > Vote
Home > Onboarding > Jury 2
```
### Global Navigation (Header)
```
┌─────────────────────────────────────────────────────────────────┐
│ [MOPC Logo] Jury: [Jury 1 ▼] | 🔔 3 | Dr. Martin ▼ │
└─────────────────────────────────────────────────────────────────┘
```
| Element | Description |
|---------|-------------|
| **MOPC Logo** | Click → Dashboard |
| **Jury Switcher** | Dropdown to switch jury group context |
| **Notifications** | Bell icon with count → notification center |
| **User Menu** | Profile, settings, logout |
### Footer Navigation (Minimal)
```
┌─────────────────────────────────────────────────────────────────┐
│ Help Center | Contact Support | Privacy | © MOPC 2026 │
└─────────────────────────────────────────────────────────────────┘
```
---
## 12. Responsive Design — Mobile Considerations
### Mobile Breakpoints
| Breakpoint | Width | Adjustments |
|------------|-------|-------------|
| Desktop | ≥1024px | Full sidebar, multi-column layouts |
| Tablet | 768-1023px | Collapsed sidebar, single-column |
| Mobile | <768px | Bottom nav, stacked cards, simplified forms |
### Mobile Dashboard
```
┌─────────────────────────────────┐
│ ☰ Jury Dashboard 🔔3 [👤] │
├─────────────────────────────────┤
│ │
│ Upcoming Deadlines │
│ ┌─────────────────────────────┐ │
│ │ ⏱ Jury 1 — 3 days left │ │
│ │ ⏱ Innovation — 18 days │ │
│ └─────────────────────────────┘ │
│ │
│ Your Jury Groups │
│ │
│ ┌─────────────────────────────┐ │
│ │ Jury 1 — Semi-finalist ⚡ │ │
│ │ ─────────────────────────── │ │
│ │ 12/20 complete (60%) │ │
│ │ ████████████░░░░ │ │
│ │ [Continue Evaluation →] │ │
│ └─────────────────────────────┘ │
│ │
│ ┌─────────────────────────────┐ │
│ │ Innovation Award Jury │ │
│ │ ─────────────────────────── │ │
│ │ Voting opens May 1 │ │
│ │ [View Details] │ │
│ └─────────────────────────────┘ │
│ │
├─────────────────────────────────┤
│ [🏠] [📋] [🏆] [👤] │
└─────────────────────────────────┘
```
### Mobile Evaluation Form
```
┌──────────────────────────────────┐
│ ← Evaluating: OceanClean AI │
├──────────────────────────────────┤
│ [📄 Docs] [📊 Score] [💬 Feed] │
├──────────────────────────────────┤
│ Innovation & Impact (30%) │
│ ──────────────────────────────── │
│ 1 2 3 4 5 │
│ ○ ○ ○ ● ○ │
│ │
│ Notes: │
│ ┌──────────────────────────────┐ │
│ │ Strong AI approach. │ │
│ │ Scalability concerns. │ │
│ └──────────────────────────────┘ │
│ │
│ Feasibility (25%) │
│ ──────────────────────────────── │
│ 1 2 3 4 5 │
│ ○ ○ ● ○ ○ │
│ │
│ (scroll for more criteria...) │
│ │
├──────────────────────────────────┤
│ Overall: 3.6/5.0 Auto-saved 5s │
├──────────────────────────────────┤
│ [💾 Save] [✅ Submit] [Next →] │
└──────────────────────────────────┘
```
### Mobile Live Voting
```
┌────────────────────────────────┐
│ Live Finals — Jury 3 │
│ ● Connected ⏱ 2:15 left │
├────────────────────────────────┤
│ NOW PRESENTING │
│ ────────────────────────────── │
│ OceanClean AI (3/6) │
│ │
│ Rate (1-10): │
│ [1] [2] [3] [4] [5] │
│ [6] [7] [8] [9] [10] │
│ ● │
│ │
│ Notes: │
│ ┌────────────────────────────┐ │
│ │ Excellent presentation. │ │
│ └────────────────────────────┘ │
│ │
│ [✓ Submit Vote (8)] │
│ [Skip This Project] │
│ │
│ Progress: ██████░░░ 3/6 │
│ Up Next: TidalEnergy Pro │
└────────────────────────────────┘
```
---
## 13. Accessibility (WCAG AA Compliance)
### Key Requirements
| Criterion | Implementation |
|-----------|---------------|
| **Keyboard Navigation** | All interactive elements focusable with Tab, activate with Enter/Space |
| **Screen Reader Support** | ARIA labels on all form controls, live regions for status updates |
| **Color Contrast** | 4.5:1 for text, 3:1 for UI components |
| **Focus Indicators** | Visible focus ring on all interactive elements |
| **Error Messages** | Clear, specific, associated with form fields |
| **Headings** | Semantic hierarchy (h1 > h2 > h3) |
| **Skip Links** | "Skip to main content" link at top of page |
### Accessible Scoring Interface
```html
<fieldset>
<legend>Innovation & Impact (30%)</legend>
<p id="innovation-desc">How novel is the solution? What is the potential ocean impact?</p>
<div role="radiogroup" aria-labelledby="innovation-label" aria-describedby="innovation-desc">
<label>
<input type="radio" name="innovation" value="1" />
<span>1 — Poor</span>
</label>
<label>
<input type="radio" name="innovation" value="2" />
<span>2 — Fair</span>
</label>
<label>
<input type="radio" name="innovation" value="3" />
<span>3 — Good</span>
</label>
<label>
<input type="radio" name="innovation" value="4" checked />
<span>4 — Very Good</span>
</label>
<label>
<input type="radio" name="innovation" value="5" />
<span>5 — Excellent</span>
</label>
</div>
</fieldset>
```
### Screen Reader Announcements
```typescript
// Auto-save feedback
<div role="status" aria-live="polite" aria-atomic="true">
Evaluation auto-saved 5 seconds ago
</div>
// Evaluation submission
<div role="alert" aria-live="assertive">
Evaluation submitted successfully. Navigating to next project.
</div>
// Live voting timer
<div role="timer" aria-live="off" aria-atomic="true">
2 minutes 30 seconds remaining
</div>
```
### Keyboard Shortcuts
| Key | Action |
|-----|--------|
| `Tab` / `Shift+Tab` | Navigate between fields |
| `Enter` / `Space` | Activate button, select radio/checkbox |
| `Arrow Keys` | Navigate radio groups |
| `Esc` | Close dialogs |
| `Ctrl+S` | Save draft (evaluation form) |
| `Ctrl+Enter` | Submit evaluation (when all fields valid) |
---
## 14. Component Library — Reusable shadcn/ui Components
### Core Components
| Component | Usage | File |
|-----------|-------|------|
| `Card` | Jury group cards, project cards | `@/components/ui/card` |
| `Button` | All CTAs, form actions | `@/components/ui/button` |
| `Badge` | Status indicators, category tags | `@/components/ui/badge` |
| `Progress` | Assignment progress bars | `@/components/ui/progress` |
| `Tabs` | Document/Scoring/Feedback tabs | `@/components/ui/tabs` |
| `RadioGroup` | Scoring criteria, COI declaration | `@/components/ui/radio-group` |
| `Textarea` | Feedback fields, notes | `@/components/ui/textarea` |
| `Select` | Filters, dropdowns | `@/components/ui/select` |
| `Dialog` | COI declaration, confirmation dialogs | `@/components/ui/dialog` |
| `Toast` | Success/error notifications | `@/components/ui/toast` |
| `Skeleton` | Loading states | `@/components/ui/skeleton` |
| `Alert` | Warnings, deadlines | `@/components/ui/alert` |
### Custom Jury Components
```typescript
// src/components/jury/JuryGroupSwitcher.tsx
export function JuryGroupSwitcher({
groups: JuryGroup[],
currentGroupId: string,
onSwitch: (groupId: string) => void
}) { ... }
// src/components/jury/DeadlineCountdown.tsx
export function DeadlineCountdown({
deadline: Date,
showGracePeriod?: boolean
}) { ... }
// src/components/jury/AssignmentCard.tsx
export function AssignmentCard({
assignment: Assignment,
project: Project,
onAction: () => void
}) { ... }
// src/components/jury/EvaluationScoringForm.tsx
export function EvaluationScoringForm({
criteria: EvaluationCriterion[],
mode: "criteria" | "global" | "binary",
onScoreChange: (scores: CriterionScores) => void
}) { ... }
// src/components/jury/DocumentViewer.tsx
export function DocumentViewer({
submissionWindows: SubmissionWindow[],
projectFiles: ProjectFile[]
}) { ... }
// src/components/jury/LiveVotingInterface.tsx
export function LiveVotingInterface({
session: LiveVotingSession,
currentProject: Project,
onVote: (score: number, notes?: string) => void
}) { ... }
// src/components/jury/WinnerConfirmationForm.tsx
export function WinnerConfirmationForm({
proposal: WinnerProposal,
onConfirm: (approved: boolean, comments?: string) => void
}) { ... }
// src/components/jury/AwardVotingForm.tsx
export function AwardVotingForm({
award: SpecialAward,
eligibleProjects: Project[],
mode: AwardScoringMode,
onVote: (vote: AwardVote) => void
}) { ... }
```
---
## 15. State Management & Data Fetching
### tRPC Queries (React Query)
```typescript
// Dashboard
const { data: dashboard } = trpc.jury.getDashboard.useQuery();
// Assignments for a jury group
const { data: assignments } = trpc.jury.getAssignments.useQuery({
juryGroupId
});
// Single assignment with project and evaluation
const { data: assignment } = trpc.jury.getAssignmentDetail.useQuery({
assignmentId
});
// Project files grouped by submission window
const { data: files } = trpc.jury.getProjectDocuments.useQuery({
projectId,
roundId
});
// Evaluation form criteria
const { data: form } = trpc.jury.getEvaluationForm.useQuery({
roundId
});
// Live voting session
const { data: liveSession } = trpc.jury.getLiveSession.useQuery({
roundId
}, {
refetchInterval: 5000 // Poll every 5s
});
// Winner proposal
const { data: proposal } = trpc.jury.getWinnerProposal.useQuery({
proposalId
});
// Award details and eligible projects
const { data: award } = trpc.jury.getAwardForVoting.useQuery({
awardId
});
```
### Mutations
```typescript
// Start evaluation (creates draft Evaluation record)
const startEvaluation = trpc.jury.startEvaluation.useMutation();
// Auto-save evaluation draft
const autosaveEvaluation = trpc.jury.autosaveEvaluation.useMutation();
// Submit evaluation
const submitEvaluation = trpc.jury.submitEvaluation.useMutation();
// Declare COI
const declareCOI = trpc.jury.declareCOI.useMutation();
// Submit live vote
const submitLiveVote = trpc.jury.submitLiveVote.useMutation();
// Confirm winner proposal
const confirmWinners = trpc.jury.confirmWinnerProposal.useMutation();
// Submit award vote
const submitAwardVote = trpc.jury.submitAwardVote.useMutation();
// Update juror preferences (during onboarding)
const updatePreferences = trpc.jury.updatePreferences.useMutation();
```
### Local State (Zustand or React Context)
```typescript
// Current jury group context
const useJuryStore = create((set) => ({
currentJuryGroupId: null,
setCurrentJuryGroup: (id) => set({ currentJuryGroupId: id }),
}));
// Evaluation form draft (before auto-save)
const useEvaluationDraft = create((set) => ({
scores: {},
feedback: '',
updateScore: (criterion, score) => set((state) => ({
scores: { ...state.scores, [criterion]: score }
})),
updateFeedback: (text) => set({ feedback: text }),
clearDraft: () => set({ scores: {}, feedback: '' }),
}));
```
---
## 16. Error Handling & Edge Cases
### Evaluation Window Closed
```
┌─────────────────────────────────────────┐
│ ⚠️ Evaluation Window Closed │
│ │
│ The deadline for Jury 1 evaluations was │
│ April 30, 2026. You can no longer │
│ submit new evaluations. │
│ │
│ If you need an extension, contact the │
│ admin to request a grace period. │
│ │
│ [ Contact Admin ] [ Back to List ] │
└─────────────────────────────────────────┘
```
### Grace Period Active
```
┌─────────────────────────────────────────┐
│ 🕐 Grace Period Active │
│ │
│ You have been granted a 2-day extension.│
│ Your new deadline: May 2, 2026 │
│ │
│ [ Continue Evaluation ] │
└─────────────────────────────────────────┘
```
### COI Prevents Evaluation
```
┌─────────────────────────────────────────┐
│ 🔒 Conflict of Interest Declared │
│ │
│ You declared a conflict of interest for │
│ "DeepReef Monitoring" on April 5, 2026. │
│ │
│ Reason: Former colleague of team lead. │
│ │
│ You cannot evaluate this project. This │
│ assignment has been removed from your │
│ list and may be reassigned. │
│ │
│ [ ← Back to Assignments ] │
└─────────────────────────────────────────┘
```
### All Assignments Complete
```
┌─────────────────────────────────────────┐
│ ✅ All Evaluations Complete! │
│ │
│ You have submitted evaluations for all │
│ 20 assigned projects. Thank you! │
│ │
│ Next steps: │
│ • Results will be announced May 10 │
│ • You may be invited to live finals │
│ │
│ [ View Your Evaluations ] │
│ [ Return to Dashboard ] │
└─────────────────────────────────────────┘
```
### Live Voting Not Yet Started
```
┌─────────────────────────────────────────┐
│ ⏱ Live Finals Not Yet Started │
│ │
│ The live finals ceremony begins on: │
│ May 20, 2026 at 18:00 CET │
│ │
│ This page will activate when the │
│ ceremony starts. │
│ │
│ [ Set Reminder ] [ ← Dashboard ] │
└─────────────────────────────────────────┘
```
### Juror on Multiple Juries — Context Confusion
Prevention:
- **Jury switcher** in global header (always visible)
- **Breadcrumbs** showing current jury group
- **Color-coded badges** per jury group (e.g., Jury 1 = blue, Jury 2 = green)
- **Separate assignment lists** per jury group (no mixing)
---
## 17. Performance Optimizations
### Code Splitting
```typescript
// Lazy-load heavy components
const LiveVotingInterface = lazy(() => import('@/components/jury/LiveVotingInterface'));
const DocumentViewer = lazy(() => import('@/components/jury/DocumentViewer'));
const WinnerConfirmationForm = lazy(() => import('@/components/jury/WinnerConfirmationForm'));
// Use Suspense with skeleton
<Suspense fallback={<EvaluationFormSkeleton />}>
<EvaluationScoringForm {...props} />
</Suspense>
```
### Data Prefetching
```typescript
// On dashboard mount, prefetch next assignment
useEffect(() => {
if (nextAssignmentId) {
trpcClient.jury.getAssignmentDetail.prefetch({ assignmentId: nextAssignmentId });
}
}, [nextAssignmentId]);
// On assignment list, prefetch first pending project
useEffect(() => {
if (firstPendingAssignmentId) {
trpcClient.jury.getAssignmentDetail.prefetch({
assignmentId: firstPendingAssignmentId
});
}
}, [firstPendingAssignmentId]);
```
### Optimistic Updates
```typescript
// Auto-save with optimistic update
const autosave = trpc.jury.autosaveEvaluation.useMutation({
onMutate: async (newData) => {
// Cancel outgoing refetches
await utils.jury.getEvaluation.cancel({ evaluationId });
// Snapshot current value
const previous = utils.jury.getEvaluation.getData({ evaluationId });
// Optimistically update to new value
utils.jury.getEvaluation.setData({ evaluationId }, (old) => ({
...old,
...newData,
updatedAt: new Date(),
}));
return { previous };
},
onError: (err, newData, context) => {
// Rollback on error
utils.jury.getEvaluation.setData({ evaluationId }, context.previous);
},
});
```
---
## 18. Testing Scenarios
### Unit Tests
```typescript
// Test evaluation form validation
describe('EvaluationScoringForm', () => {
it('requires all criteria to be scored before submission', () => { ... });
it('calculates weighted average correctly', () => { ... });
it('saves draft without validation', () => { ... });
});
// Test deadline countdown
describe('DeadlineCountdown', () => {
it('shows days remaining when >24h left', () => { ... });
it('shows hours remaining when <24h left', () => { ... });
it('shows "overdue" when past deadline', () => { ... });
it('shows grace period indicator when active', () => { ... });
});
```
### Integration Tests
```typescript
// Test full evaluation workflow
describe('Jury Evaluation Flow', () => {
it('juror can declare COI and skip evaluation', () => { ... });
it('juror can save draft, navigate away, and resume', () => { ... });
it('juror can submit evaluation and see success message', () => { ... });
it('juror cannot submit past deadline without grace period', () => { ... });
it('auto-save triggers every 30s', () => { ... });
});
// Test multi-jury context switching
describe('Multi-Jury Navigation', () => {
it('jury switcher shows all user's jury groups', () => { ... });
it('switching jury updates assignment list', () => { ... });
it('breadcrumbs reflect current jury context', () => { ... });
});
```
### E2E Tests (Playwright)
```typescript
test('juror completes full evaluation from dashboard', async ({ page }) => {
await page.goto('/jury/dashboard');
await page.click('text=Continue Next Evaluation');
// COI declaration
await page.click('text=No conflict');
await page.click('text=Submit Declaration');
// Score criteria
await page.click('[data-criterion="innovation"] [value="4"]');
await page.click('[data-criterion="feasibility"] [value="3"]');
await page.click('[data-criterion="team"] [value="4"]');
await page.click('[data-criterion="ocean-relevance"] [value="5"]');
// Enter feedback
await page.fill('[name="feedback"]', 'Strong innovation, feasibility needs improvement.');
// Submit
await page.click('text=Submit Evaluation');
await expect(page.locator('text=Evaluation submitted')).toBeVisible();
// Verify navigation to next assignment
await expect(page).toHaveURL(/\/evaluate\/.+/);
});
```
---
## 19. Migration from Current UI
### Page Mapping
| Current Route | New Route | Migration Notes |
|--------------|-----------|-----------------|
| `/jury/page.tsx` | `/jury/dashboard` | Add multi-jury support, deadline widget |
| `/jury/stages/page.tsx` | (remove) | Replaced by jury group overview |
| `/jury/stages/[stageId]/assignments/page.tsx` | `/jury/groups/[juryGroupId]/assignments` | Add filters, status indicators |
| `/jury/stages/[stageId]/projects/[projectId]/evaluate/page.tsx` | `/jury/groups/[juryGroupId]/evaluate/[projectId]` | Add multi-window doc viewer, COI blocking |
| `/jury/stages/[stageId]/live/page.tsx` | `/jury/live/[roundId]` | Add real-time sync, mobile UI |
| `/jury/awards/[id]/page.tsx` | `/jury/awards/[awardId]/vote` | Add voting interface |
| (new) | `/jury/confirmation/[proposalId]` | New winner confirmation page |
| (new) | `/jury/onboarding/[juryGroupId]` | New onboarding flow |
### Data Migration
```typescript
// Convert old stageId references to roundId
async function migrateJuryRoutes() {
// Update assignments query to use roundId
const assignments = await prisma.assignment.findMany({
where: { userId: currentUserId },
include: {
round: true, // was "stage"
project: true
},
});
// Group by jury group instead of stage
const byJuryGroup = groupBy(assignments, 'round.juryGroupId');
return byJuryGroup;
}
```
---
## 20. Future Enhancements
### Phase 2 Features
| Feature | Description | Priority |
|---------|-------------|----------|
| **Peer review discussions** | Anonymous commenting on peer evaluations | Medium |
| **Jury chat** | Real-time chat during deliberation periods | Low |
| **Bulk evaluation** | Compare 2-3 projects side-by-side | Medium |
| **AI evaluation assistant** | AI suggests scores based on rubric | Low |
| **Evaluation templates** | Save feedback snippets for reuse | Low |
| **Mobile app** | Native iOS/Android for live voting | Medium |
| **Offline mode** | Evaluate drafts offline, sync when online | Low |
| **Evaluation analytics** | Per-juror scoring patterns, outlier detection | Medium |
---
## Summary
This Jury UI redesign transforms the jury member experience with:
1. **Multi-jury dashboard** — Clear overview of all jury commitments
2. **Jury group switcher** — Easy context switching for jurors on multiple juries
3. **Cross-round document visibility** — Jury 2 sees Round 1 + Round 2 docs seamlessly
4. **Onboarding flow** — Expertise selection, COI pre-declaration, preferences
5. **Enhanced evaluation interface** — Tabbed document viewer, auto-save, deadline countdown
6. **Live finals voting** — Real-time mobile-responsive voting interface
7. **Winner confirmation** — Digital signature workflow for official results
8. **Award voting** — Separate interface for special award juries
9. **Accessibility-first** — WCAG AA compliance, keyboard nav, screen reader support
10. **Mobile-optimized** — Responsive design for all devices, especially live voting
The UI is built with shadcn/ui components, tRPC for type-safe data fetching, and follows the redesigned data model with JuryGroups, Rounds, and SubmissionWindows.
**Total Page Count**: 20+ pages across dashboard, assignments, evaluation, live voting, confirmation, awards, onboarding
**Total Lines**: 900+ lines of comprehensive documentation