kalei/initial mockups/screens/modals/59-rate-limit.html

313 lines
8.8 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 — Rate Limit</title>
<link rel="stylesheet" href="../../assets/design-system.css">
<style>
.bg-content {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
filter: blur(2px);
opacity: 0.35;
}
.bg-status {
height: 54px;
padding: 14px 28px 0;
display: flex;
justify-content: space-between;
align-items: center;
}
.bg-time { font-size: 15px; font-weight: 600; color: var(--pure-light); }
.bg-header {
padding: 16px;
font-size: 22px;
font-weight: 600;
color: var(--pure-light);
}
.bg-input {
margin: 0 16px;
height: 120px;
background: var(--deep-glass);
border: 1px solid var(--twilight);
border-radius: var(--radius-xl);
}
.bg-cards {
margin: 16px;
display: flex;
flex-direction: column;
gap: 10px;
}
.bg-mini-card {
height: 60px;
background: var(--kalei-navy);
border: 1px solid var(--twilight);
border-radius: var(--radius-lg);
}
.limit-overlay {
position: absolute;
inset: 0;
background: rgba(5,5,8,0.65);
backdrop-filter: blur(8px);
display: flex;
align-items: center;
justify-content: center;
padding: 24px;
z-index: 50;
}
.limit-card {
width: 100%;
background: var(--kalei-navy);
border: 1px solid rgba(139,92,246,0.2);
border-radius: var(--radius-2xl);
padding: 24px;
box-shadow: 0 0 40px rgba(0,0,0,0.5), 0 0 60px rgba(139,92,246,0.08);
animation: modalSlideIn 0.3s ease-out forwards;
}
@keyframes modalSlideIn {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
.limit-icon {
width: 52px;
height: 52px;
border-radius: 50%;
background: rgba(139,92,246,0.12);
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto 14px;
}
.limit-title {
font-size: 18px;
font-weight: 700;
color: var(--pure-light);
text-align: center;
margin-bottom: 6px;
}
.limit-subtitle {
font-size: 13px;
color: var(--dim-light);
text-align: center;
margin-bottom: 18px;
}
.progress-section {
margin-bottom: 18px;
}
.progress-label {
display: flex;
justify-content: space-between;
margin-bottom: 8px;
}
.progress-label-text {
font-size: 12px;
color: var(--dim-light);
}
.progress-label-count {
font-size: 12px;
font-weight: 600;
color: var(--pure-light);
}
.progress-bar-bg {
height: 8px;
background: var(--twilight);
border-radius: var(--radius-full);
overflow: hidden;
}
.progress-bar-fill {
height: 100%;
border-radius: var(--radius-full);
background: linear-gradient(90deg, var(--amethyst), var(--ruby));
width: 100%;
}
.turn-dots {
display: flex;
gap: 8px;
justify-content: center;
margin-top: 10px;
}
.turn-dot {
width: 32px;
height: 32px;
border-radius: 50%;
background: rgba(139,92,246,0.3);
border: 2px solid var(--amethyst);
display: flex;
align-items: center;
justify-content: center;
}
.turn-dot.used {
background: var(--amethyst);
opacity: 0.7;
}
.upgrade-prompt {
background: rgba(139,92,246,0.06);
border: 1px solid rgba(139,92,246,0.2);
border-radius: var(--radius-lg);
padding: 12px;
margin-bottom: 16px;
text-align: center;
}
.upgrade-prompt-text {
font-size: 13px;
color: var(--soft-light);
}
.upgrade-prompt-link {
font-size: 13px;
font-weight: 600;
color: var(--amethyst-light);
}
.timer-row {
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
margin-bottom: 16px;
font-size: 13px;
color: var(--dim-light);
}
.timer-val {
font-size: 14px;
font-weight: 600;
color: var(--soft-light);
font-variant-numeric: tabular-nums;
}
.btn-prismatic {
width: 100%;
height: 48px;
border: none;
border-radius: var(--radius-lg);
background: linear-gradient(135deg, #8B5CF6, #3B82F6);
color: white;
font-size: 15px;
font-weight: 600;
font-family: var(--font-primary);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
text-decoration: none;
margin-bottom: 10px;
box-shadow: 0 0 20px rgba(139,92,246,0.25);
}
.dismiss-btn {
width: 100%;
height: 40px;
background: transparent;
border: none;
color: var(--dim-light);
font-size: 14px;
font-family: var(--font-primary);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
text-decoration: none;
}
</style>
</head>
<body>
<div class="device-frame">
<!-- Blurred Turn Home context -->
<div class="bg-content" aria-hidden="true">
<div class="bg-status">
<span class="bg-time">9:41</span>
</div>
<div class="bg-header">Good morning, Alex</div>
<div class="bg-input"></div>
<div class="bg-cards">
<div class="bg-mini-card"></div>
<div class="bg-mini-card"></div>
</div>
</div>
<!-- Rate limit overlay -->
<div class="limit-overlay">
<div class="limit-card">
<div class="limit-icon">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none">
<path d="M12 2L22 12L12 22L2 12Z" fill="#8B5CF6" opacity="0.6"/>
<path d="M12 8V12M12 16H12.01" stroke="#C4B5FD" stroke-width="1.5" stroke-linecap="round"/>
</svg>
</div>
<div class="limit-title">That's your 3 for today</div>
<div class="limit-subtitle">Good work showing up. Your next turns reset at midnight.</div>
<!-- Progress -->
<div class="progress-section">
<div class="progress-label">
<span class="progress-label-text">Daily usage</span>
<span class="progress-label-count">3 / 3</span>
</div>
<div class="progress-bar-bg">
<div class="progress-bar-fill"></div>
</div>
<div class="turn-dots">
<div class="turn-dot used">
<svg width="12" height="12" viewBox="0 0 12 12">
<path d="M6 1L11 6L6 11L1 6Z" fill="#fff" opacity="0.8"/>
</svg>
</div>
<div class="turn-dot used">
<svg width="12" height="12" viewBox="0 0 12 12">
<path d="M6 1L11 6L6 11L1 6Z" fill="#fff" opacity="0.8"/>
</svg>
</div>
<div class="turn-dot used">
<svg width="12" height="12" viewBox="0 0 12 12">
<path d="M6 1L11 6L6 11L1 6Z" fill="#fff" opacity="0.8"/>
</svg>
</div>
</div>
</div>
<!-- Upgrade prompt — calm, not pushy -->
<div class="upgrade-prompt">
<span class="upgrade-prompt-text">Plus gives you </span>
<span class="upgrade-prompt-text" style="font-weight:600; color: var(--pure-light);">10 turns per day</span>
<span class="upgrade-prompt-text"> — enough for real-time reframing</span>
</div>
<!-- Timer -->
<div class="timer-row">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none">
<circle cx="7" cy="8" r="5" stroke="#94A3B8" stroke-width="1.2"/>
<path d="M7 5V8L9 9" stroke="#94A3B8" stroke-width="1.2" stroke-linecap="round"/>
<path d="M5 1H9" stroke="#94A3B8" stroke-width="1.2" stroke-linecap="round"/>
</svg>
Resets in <span class="timer-val" id="timer">18:23:47</span>
</div>
<!-- Upgrade CTA -->
<a class="btn-prismatic" href="58-upgrade-modal.html">
See Plus — from $9.99/mo
</a>
<a class="dismiss-btn" href="../turn/10-turn-home.html">Got it, see you tomorrow</a>
</div>
</div>
</div>
<script>
// Countdown timer simulation
let seconds = 18 * 3600 + 23 * 60 + 47;
const timerEl = document.getElementById('timer');
function updateTimer() {
if (seconds <= 0) return;
seconds--;
const h = Math.floor(seconds / 3600);
const m = Math.floor((seconds % 3600) / 60);
const s = seconds % 60;
timerEl.textContent = `${String(h).padStart(2,'0')}:${String(m).padStart(2,'0')}:${String(s).padStart(2,'0')}`;
}
setInterval(updateTimer, 1000);
</script>
</body>
</html>