kalei/initial mockups/screens/lens/30-rehearsal-complete.html

268 lines
13 KiB
HTML
Raw Normal View History

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=390, initial-scale=1">
<title>Kalei — Rehearsal Complete</title>
<link rel="stylesheet" href="../../assets/design-system.css">
<style>
.nav-back { color: var(--emerald-light) !important; }
.complete-hero {
display: flex; flex-direction: column; align-items: center;
padding: 20px var(--space-4) 0; text-align: center;
}
.success-ring {
position: relative; width: 90px; height: 90px;
display: flex; align-items: center; justify-content: center;
margin-bottom: 16px;
}
.success-ring svg { position: absolute; }
.success-icon { position: relative; z-index: 1; }
.complete-title {
font-size: 26px; font-weight: 700; color: var(--pure-light);
font-family: var(--font-display); margin-bottom: 6px;
}
.complete-sub {
font-size: 15px; color: var(--dim-light); margin-bottom: var(--space-6);
}
.rating-section {
width: 100%; padding: 0 var(--space-4);
margin-bottom: var(--space-4);
}
.rating-label {
font-size: 15px; font-weight: 600; color: var(--soft-light);
margin-bottom: 14px; text-align: center;
}
.vividness-stars {
display: flex; gap: 12px; justify-content: center; margin-bottom: 6px;
}
.fragment-star {
cursor: pointer; transition: transform 0.15s;
opacity: 0.3;
}
.fragment-star:hover, .fragment-star.active { opacity: 1; transform: scale(1.1); }
.rating-hint {
font-size: 12px; color: var(--dim-light); text-align: center;
margin-top: 8px;
}
.slider-section {
width: 100%; padding: 0 var(--space-4);
margin-bottom: var(--space-5);
}
.slider-label {
font-size: 15px; font-weight: 600; color: var(--soft-light);
margin-bottom: 12px; text-align: center;
}
.slider-track {
position: relative; height: 6px; background: var(--twilight);
border-radius: var(--radius-full); margin-bottom: 8px;
}
.slider-fill {
position: absolute; left: 0; top: 0; bottom: 0;
width: 70%; background: var(--emerald); border-radius: var(--radius-full);
box-shadow: 0 0 8px rgba(16,185,129,0.4);
}
.slider-thumb {
position: absolute; top: 50%; right: 30%; transform: translate(50%, -50%);
width: 20px; height: 20px; border-radius: 50%;
background: var(--emerald); box-shadow: 0 0 12px rgba(16,185,129,0.5);
cursor: pointer;
}
.slider-labels {
display: flex; justify-content: space-between;
font-size: 12px; color: var(--dim-light);
}
input[type=range] {
-webkit-appearance: none; width: 100%; height: 6px;
background: var(--twilight); border-radius: 3px; outline: none;
cursor: pointer;
}
input[type=range]::-webkit-slider-thumb {
-webkit-appearance: none; width: 20px; height: 20px; border-radius: 50%;
background: var(--emerald); cursor: pointer;
box-shadow: 0 0 10px rgba(16,185,129,0.4);
}
@keyframes drawRing {
from { stroke-dashoffset: 251.3; }
to { stroke-dashoffset: 0; }
}
.evidence-notification {
margin: 0 var(--space-4) var(--space-4);
background: linear-gradient(135deg, rgba(16,185,129,0.1), rgba(59,130,246,0.1));
border: 1px solid rgba(16,185,129,0.3);
border-radius: var(--radius-xl); padding: var(--space-4);
display: flex; align-items: center; gap: var(--space-3);
}
.evidence-tile-preview {
width: 52px; height: 52px; border-radius: var(--radius-md);
background: rgba(16,185,129,0.1); border: 1.5px solid var(--emerald);
box-shadow: 0 0 12px rgba(16,185,129,0.3);
display: flex; align-items: center; justify-content: center;
flex-shrink: 0; animation: pulse 2s ease-in-out infinite;
}
.evidence-info { flex: 1; }
.evidence-title { font-size: 14px; font-weight: 600; color: var(--pure-light); margin-bottom: 3px; }
.evidence-sub { font-size: 12px; color: var(--dim-light); }
.done-btn {
height: 52px; margin: 0 var(--space-4) var(--space-6);
background: var(--emerald); color: var(--pure-light); font-size: 16px; font-weight: 600;
border-radius: var(--radius-lg); box-shadow: var(--glow-emerald);
text-decoration: none; display: flex; align-items: center; justify-content: center;
transition: background 0.2s ease-out;
}
.done-btn:hover { background: var(--emerald-light); }
.screen-content { padding: 0; }
.em-aura {
position: absolute; top: 10%; left: 50%; transform: translateX(-50%);
width: 240px; height: 240px; border-radius: 50%;
background: radial-gradient(circle, rgba(16,185,129,0.12) 0%, transparent 70%);
filter: blur(50px); animation: breathing 6s ease-in-out infinite;
pointer-events: none; z-index: 0;
}
</style>
</head>
<body>
<div class="device-frame">
<div class="status-bar">
<span class="time">9:41</span>
<div class="icons">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="1" y="7" width="2.5" height="5" rx="0.5" fill="#E2E8F0" opacity="0.4"/><rect x="4.5" y="5" width="2.5" height="7" rx="0.5" fill="#E2E8F0" opacity="0.6"/><rect x="8" y="3" width="2.5" height="9" rx="0.5" fill="#E2E8F0" opacity="0.8"/><rect x="11.5" y="1" width="2.5" height="11" rx="0.5" fill="#E2E8F0"/></svg>
<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M 2,8 C 4,4 12,4 14,8" stroke="#E2E8F0" stroke-width="1.2" fill="none" stroke-linecap="round"/><path d="M 4,10 C 6,7 10,7 12,10" stroke="#E2E8F0" stroke-width="1" fill="none" opacity="0.8" stroke-linecap="round"/><circle cx="8" cy="12" r="1.2" fill="#E2E8F0"/></svg>
<svg width="24" height="12" viewBox="0 0 24 12" fill="none"><rect x="0.5" y="0.5" width="21" height="11" rx="2.5" stroke="#E2E8F0" stroke-width="1" opacity="0.5"/><rect x="22" y="3" width="2" height="6" rx="1" fill="#E2E8F0" opacity="0.3"/><rect x="2" y="2" width="16" height="8" rx="1.5" fill="#10B981" opacity="0.9"/></svg>
</div>
</div>
<div class="nav-header">
<a class="nav-back" href="29-rehearsal-session.html">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M12 4L6 10L12 16" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
</a>
<span class="nav-title">Rehearsal Complete</span>
<span class="nav-action"></span>
</div>
<div class="screen-content" style="overflow-y: auto; position: relative;">
<div class="em-aura"></div>
<div class="complete-hero" style="position: relative; z-index: 1;">
<div class="success-ring">
<svg width="90" height="90" viewBox="0 0 90 90">
<circle cx="45" cy="45" r="40" fill="none" stroke="var(--twilight)" stroke-width="3"/>
<circle cx="45" cy="45" r="40" fill="none" stroke="var(--emerald)" stroke-width="3"
stroke-dasharray="251.3" stroke-dashoffset="251.3" stroke-linecap="round"
style="animation: drawRing 1s ease 0.3s forwards;"/>
</svg>
<div class="success-icon">
<svg width="32" height="32" viewBox="0 0 32 32" fill="none">
<path d="M6 16l7 7 13-14" stroke="var(--emerald)" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
</div>
<div class="complete-title">Rehearsal Complete</div>
<div class="complete-sub">Present with confidence · Quarterly Results Scenario · 5 min</div>
</div>
<!-- Vividness Rating -->
<div class="rating-section">
<div class="rating-label">How vivid was your visualization?</div>
<div class="vividness-stars" id="stars">
<!-- 5 emerald MD fragment diamonds — extracted from fragment-icons.svg Emerald MD -->
<!-- MD diamond: M 0,-12 L 12,0 L 0,12 L -12,0 Z, specular M 0,-12 L 12,0 L 0,0 Z opacity=0.18, glow filter glowMd stdDev=3 -->
<!-- Shared defs in first SVG only — siblings share defs from same document -->
<svg class="fragment-star" onclick="setRating(1)" width="36" height="36" viewBox="0 0 36 36">
<defs>
<linearGradient id="fr30-grEm" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#6EE7B7"/>
<stop offset="100%" stop-color="#059669"/>
</linearGradient>
<filter id="fr30-glowMd" x="-80%" y="-80%" width="260%" height="260%">
<feGaussianBlur stdDeviation="3" result="b"/>
<feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
</defs>
<g transform="translate(18,18)" filter="url(#fr30-glowMd)">
<path d="M 0,-12 L 12,0 L 0,12 L -12,0 Z" fill="url(#fr30-grEm)" opacity="0.9"/>
<path d="M 0,-12 L 12,0 L 0,0 Z" fill="#fff" opacity="0.18"/>
<line x1="0" y1="-12" x2="0" y2="12" stroke="#fff" stroke-width="0.5" opacity="0.2"/>
<circle cx="-3" cy="-3" r="1.5" fill="#fff" opacity="0.3"/>
</g>
</svg>
<svg class="fragment-star" onclick="setRating(2)" width="36" height="36" viewBox="0 0 36 36">
<g transform="translate(18,18)" filter="url(#fr30-glowMd)">
<path d="M 0,-12 L 12,0 L 0,12 L -12,0 Z" fill="url(#fr30-grEm)" opacity="0.9"/>
<path d="M 0,-12 L 12,0 L 0,0 Z" fill="#fff" opacity="0.18"/>
<line x1="0" y1="-12" x2="0" y2="12" stroke="#fff" stroke-width="0.5" opacity="0.2"/>
<circle cx="-3" cy="-3" r="1.5" fill="#fff" opacity="0.3"/>
</g>
</svg>
<svg class="fragment-star active" onclick="setRating(3)" width="36" height="36" viewBox="0 0 36 36">
<g transform="translate(18,18)" filter="url(#fr30-glowMd)">
<path d="M 0,-12 L 12,0 L 0,12 L -12,0 Z" fill="url(#fr30-grEm)" opacity="0.9"/>
<path d="M 0,-12 L 12,0 L 0,0 Z" fill="#fff" opacity="0.18"/>
<line x1="0" y1="-12" x2="0" y2="12" stroke="#fff" stroke-width="0.5" opacity="0.2"/>
<circle cx="-3" cy="-3" r="1.5" fill="#fff" opacity="0.3"/>
</g>
</svg>
<svg class="fragment-star active" onclick="setRating(4)" width="36" height="36" viewBox="0 0 36 36">
<g transform="translate(18,18)" filter="url(#fr30-glowMd)">
<path d="M 0,-12 L 12,0 L 0,12 L -12,0 Z" fill="url(#fr30-grEm)" opacity="0.9"/>
<path d="M 0,-12 L 12,0 L 0,0 Z" fill="#fff" opacity="0.18"/>
<line x1="0" y1="-12" x2="0" y2="12" stroke="#fff" stroke-width="0.5" opacity="0.2"/>
<circle cx="-3" cy="-3" r="1.5" fill="#fff" opacity="0.3"/>
</g>
</svg>
<svg class="fragment-star active" onclick="setRating(5)" width="36" height="36" viewBox="0 0 36 36">
<g transform="translate(18,18)" filter="url(#fr30-glowMd)">
<path d="M 0,-12 L 12,0 L 0,12 L -12,0 Z" fill="url(#fr30-grEm)" opacity="0.9"/>
<path d="M 0,-12 L 12,0 L 0,0 Z" fill="#fff" opacity="0.18"/>
<line x1="0" y1="-12" x2="0" y2="12" stroke="#fff" stroke-width="0.5" opacity="0.2"/>
<circle cx="-3" cy="-3" r="1.5" fill="#fff" opacity="0.3"/>
</g>
</svg>
</div>
<div class="rating-hint" id="ratingHint">Very vivid — you could almost feel it</div>
</div>
<!-- How real slider -->
<div class="slider-section">
<div class="slider-label">How real did it feel?</div>
<input type="range" min="0" max="100" value="70" id="realSlider">
<div class="slider-labels">
<span>Distant</span>
<span>Very real</span>
</div>
</div>
<!-- Evidence Wall notification -->
<div class="evidence-notification">
<div class="evidence-tile-preview">
<svg width="24" height="24" viewBox="0 0 24 24">
<defs><linearGradient id="gsEv" x1="0" y1="0" x2="0" y2="1"><stop offset="0%" stop-color="#6EE7B7"/><stop offset="100%" stop-color="#059669"/></linearGradient></defs>
<circle cx="12" cy="12" r="9" fill="url(#gsEv)" opacity="0.8"/>
<circle cx="12" cy="12" r="5" fill="none" stroke="white" stroke-width="1.2" opacity="0.6"/>
</svg>
</div>
<div class="evidence-info">
<div class="evidence-title">Evidence Wall tile earned!</div>
<div class="evidence-sub">Lens Rehearsal · Circle tile added to your mosaic</div>
</div>
</div>
<a class="done-btn" href="20-lens-dashboard.html">Done</a>
</div>
</div>
<script>
let currentRating = 3;
const hints = ['', 'Hard to focus', 'Somewhat clear', 'Pretty vivid', 'Very vivid — you could almost feel it', 'Crystal clear — fully immersive'];
function setRating(n) {
currentRating = n;
document.querySelectorAll('.fragment-star').forEach((s, i) => {
s.classList.toggle('active', i < n);
});
document.getElementById('ratingHint').textContent = hints[n];
}
</script>
</body>
</html>