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

259 lines
12 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 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>