kalei/initial mockups/screens/lens/29-rehearsal-session.html

259 lines
12 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=390, initial-scale=1">
<title>Kalei — Rehearsal Session</title>
<link rel="stylesheet" href="../../assets/design-system.css">
<style>
.nav-back { color: var(--emerald-light) !important; }
.nav-close-btn { color: var(--dim-light); cursor: pointer; }
.session-bg {
position: absolute; inset: 0;
background: radial-gradient(ellipse at 50% 30%, rgba(16,185,129,0.08) 0%, transparent 65%);
pointer-events: none;
}
.timer-ring-wrap {
display: flex; align-items: center; justify-content: center;
margin: 16px auto 20px; position: relative;
width: 76px; height: 76px;
}
.timer-ring-wrap svg { transform: rotate(-90deg); position: absolute; }
.timer-text {
position: relative; z-index: 1; text-align: center;
}
.timer-time { font-size: 20px; font-weight: 700; color: var(--pure-light); }
.timer-label { font-size: 10px; color: var(--emerald); text-transform: uppercase; letter-spacing: 0.06em; }
.step-indicator {
display: flex; align-items: center; justify-content: center; gap: 6px;
margin-bottom: var(--space-5);
}
.step-indicator-dot {
width: 6px; height: 6px; border-radius: 50%; background: var(--twilight);
transition: all 0.3s;
}
.step-indicator-dot.active { background: var(--emerald); width: 18px; border-radius: 3px; }
.step-indicator-dot.done { background: var(--emerald); opacity: 0.5; }
.prompt-area {
padding: var(--space-4) var(--space-5);
text-align: center;
animation: fadeIn 0.5s ease;
}
.prompt-step-tag {
font-size: 11px; font-weight: 600; text-transform: uppercase;
letter-spacing: 0.06em; color: var(--emerald); margin-bottom: 12px;
}
.prompt-main {
font-size: 20px; font-weight: 600; color: var(--pure-light);
line-height: 1.4; margin-bottom: 12px; font-family: var(--font-display);
}
.prompt-sub {
font-size: 15px; color: var(--dim-light); line-height: 1.6;
}
.breathing-guide {
display: flex; align-items: center; justify-content: center;
margin: 24px auto 20px;
}
.breathing-circle {
width: 80px; height: 80px; border-radius: 50%;
background: radial-gradient(circle, rgba(16,185,129,0.25), rgba(16,185,129,0.05));
border: 1.5px solid rgba(16,185,129,0.3);
animation: breathCycle 8s ease-in-out infinite;
display: flex; align-items: center; justify-content: center;
position: relative;
}
.breathing-circle::after {
content: '';
position: absolute; inset: 8px; border-radius: 50%;
background: rgba(16,185,129,0.1);
animation: breathCycleInner 8s ease-in-out infinite;
}
.breath-label {
font-size: 12px; color: var(--emerald); font-weight: 500;
letter-spacing: 0.05em; position: relative; z-index: 1;
animation: breathLabel 8s ease-in-out infinite;
}
@keyframes breathCycle {
0%, 100% { transform: scale(1); opacity: 0.8; }
25% { transform: scale(1.5); opacity: 1; }
50% { transform: scale(1.5); opacity: 1; }
75% { transform: scale(1); opacity: 0.8; }
}
@keyframes breathCycleInner {
0%, 100% { transform: scale(1); }
25% { transform: scale(1.3); }
50% { transform: scale(1.3); }
75% { transform: scale(1); }
}
@keyframes breathLabel {
0%, 100% { opacity: 0; }
10% { opacity: 1; }
24% { opacity: 1; }
35% { opacity: 0; }
50% { opacity: 1; }
60% { opacity: 1; }
72% { opacity: 0; }
}
.bottom-area {
padding: var(--space-4) var(--space-4) var(--space-6);
display: flex; flex-direction: column; gap: var(--space-3);
}
.btn-next-step {
display: flex; align-items: center; justify-content: center; gap: 10px;
height: 56px; width: 100%; background: var(--emerald); color: var(--pure-light);
font-size: 16px; font-weight: 600; border-radius: var(--radius-lg);
box-shadow: var(--glow-emerald); border: none; cursor: pointer;
transition: background 0.2s;
}
.btn-next-step:hover { background: var(--emerald-light); }
.skip-link {
text-align: center; font-size: 13px; color: var(--dim-light);
cursor: pointer; padding: 4px;
}
.skip-link:hover { color: var(--soft-light); }
.screen-content { padding: 0; overflow-y: hidden; display: flex; flex-direction: column; }
</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="27-lens-goal-detail.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>
<div style="display:flex; flex-direction:column; align-items:center; position:absolute; left:50%; transform:translateX(-50%);">
<span class="nav-title" style="position:static; transform:none;">Rehearsal</span>
<span style="font-size:11px; color:var(--emerald); font-weight:500;">Present with confidence</span>
</div>
<a class="nav-close-btn" href="20-lens-dashboard.html">
<svg width="22" height="22" viewBox="0 0 22 22" fill="none">
<path d="M6 6l10 10M16 6L6 16" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
</svg>
</a>
</div>
<div class="screen-content">
<div class="session-bg"></div>
<!-- Timer ring — extracted from progress-indicators.svg Timer Ring: r=30, stroke-width=3, 76px viewport -->
<!-- Full circumference = 2π×30 = 188.5; stroke-dasharray="141 188" = 75% remaining -->
<div class="timer-ring-wrap">
<svg width="76" height="76" viewBox="0 0 76 76">
<defs>
<linearGradient id="pr29-grEm" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#6EE7B7"/>
<stop offset="100%" stop-color="#059669"/>
</linearGradient>
</defs>
<circle cx="38" cy="38" r="30" fill="none" stroke="var(--twilight)" stroke-width="3"/>
<circle cx="38" cy="38" r="30" fill="none" stroke="url(#pr29-grEm)" stroke-width="3"
stroke-dasharray="141 188" stroke-dashoffset="0" stroke-linecap="round" id="timerArc"/>
</svg>
<div class="timer-text">
<div class="timer-time" id="timerDisplay">3:20</div>
<div class="timer-label">Remaining</div>
</div>
</div>
<!-- Step indicators -->
<div class="step-indicator">
<div class="step-indicator-dot done"></div>
<div class="step-indicator-dot active"></div>
<div class="step-indicator-dot"></div>
<div class="step-indicator-dot"></div>
<div class="step-indicator-dot"></div>
</div>
<!-- Breathing guide -->
<div class="breathing-guide">
<div class="breathing-circle">
<span class="breath-label">Breathe</span>
</div>
</div>
<!-- Prompt -->
<div class="prompt-area">
<div class="prompt-step-tag">Step 2 of 5 — Visualize</div>
<div class="prompt-main">Picture yourself beginning the presentation</div>
<div class="prompt-sub">Your team lead has just introduced you. You walk to the front. You look out at the room — and you feel ready. Your voice is steady. You know this material.</div>
</div>
</div>
<div class="bottom-area">
<button class="btn-next-step" onclick="nextStep()">
I can see it
<svg width="18" height="18" viewBox="0 0 18 18" fill="none"><path d="M6 4l5 5-5 5" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
</button>
<div class="skip-link">Skip this step</div>
</div>
</div>
<script>
const steps = [
{ tag: 'Step 1 of 5 — Settle', main: 'Find a comfortable position', sub: 'Sit upright and close your eyes when you\'re ready. Take three slow, deep breaths. Let your shoulders drop. You\'re safe here.' },
{ tag: 'Step 2 of 5 — Visualize', main: 'Picture yourself beginning the presentation', sub: 'Your team lead has just introduced you. You walk to the front. You look out at the room — and you feel ready. Your voice is steady. You know this material.' },
{ tag: 'Step 3 of 5 — Feel', main: 'Notice what confidence feels like in your body', sub: 'Your feet are planted. Your breathing is even. When you speak, the words come clearly. Someone nods. You make eye contact and hold it.' },
{ tag: 'Step 4 of 5 — If-Then', main: 'Your voice starts to shake — what do you do?', sub: 'You pause. You take one slow breath. You say to yourself: "I know this material." And you continue — because you do. This is the plan working.' },
{ tag: 'Step 5 of 5 — Return', main: 'Gently return to the present', sub: 'Take a deep breath and slowly open your eyes. That feeling of calm authority is real. It\'s yours. You can bring it into any room.' }
];
let currentStep = 1;
let timeLeft = 200;
function nextStep() {
if (currentStep < steps.length - 1) {
currentStep++;
updateUI();
} else {
window.location.href = '30-rehearsal-complete.html';
}
}
function updateUI() {
const step = steps[currentStep];
document.querySelector('.prompt-step-tag').textContent = step.tag;
document.querySelector('.prompt-main').textContent = step.main;
document.querySelector('.prompt-sub').textContent = step.sub;
document.querySelectorAll('.step-indicator-dot').forEach((dot, i) => {
dot.className = 'step-indicator-dot';
if (i < currentStep) dot.classList.add('done');
else if (i === currentStep) dot.classList.add('active');
});
if (currentStep === steps.length - 1) {
document.querySelector('.btn-next-step').innerHTML = 'Complete Session <svg width="18" height="18" viewBox="0 0 18 18" fill="none"><path d="M3 9l4 4 8-8" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>';
}
}
// Timer — circumference = 2π×30 = 188.5 (matches progress-indicators.svg Timer Ring r=30)
const interval = setInterval(() => {
if (timeLeft > 0) {
timeLeft--;
const m = Math.floor(timeLeft / 60);
const s = timeLeft % 60;
document.getElementById('timerDisplay').textContent = `${m}:${s.toString().padStart(2,'0')}`;
const circumference = 188.5;
const totalTime = 300;
const filled = circumference * (timeLeft / totalTime);
document.getElementById('timerArc').setAttribute('stroke-dasharray', `${filled} ${circumference}`);
} else {
clearInterval(interval);
}
}, 1000);
</script>
</body>
</html>