Initial commit: Kalei app — docs, mockups, logo, pitch deck
Complete project files including: - 73 polished HTML mockup screens (onboarding, turn, mirror, lens, gallery, you, ritual, spectrum, modals, guide) - Design system CSS with Inter font, jewel-tone palette, device frame scaling - Canonical 6-blade kaleidoscope logo (soft-elegance-final) - SVG asset library (fragments, icons, patterns, evidence wall, spectrum viz) - Product docs, brand guidelines, technical architecture, build phases - Pitch deck and cost projections - Logo mockup iterations and finalists Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
312
initial mockups/screens/modals/59-rate-limit.html
Normal file
312
initial mockups/screens/modals/59-rate-limit.html
Normal file
@@ -0,0 +1,312 @@
|
||||
<!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>
|
||||
Reference in New Issue
Block a user