clavitor/clavitor.ai/templates/onboarding-done.tmpl

540 lines
15 KiB
Cheetah

{{define "onboarding-done"}}
<div class="onboarding-container onboarding-container--centered">
<div class="onboarding-card onboarding-card--success">
<!-- Success Animation -->
<div class="success-animation">
<div class="success-circle">
<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="20 6 9 17 4 12"/></svg>
</div>
<div class="success-particles">
<span></span><span></span><span></span><span></span><span></span>
<span></span><span></span><span></span>
</div>
</div>
<!-- Header -->
<div class="success-header">
<h1>Welcome to Clavitor</h1>
<p class="success-subtitle">Your vault is ready. Your trial starts now.</p>
</div>
<!-- What's Next -->
<div class="next-steps">
<h3 class="next-steps-title">What happens next</h3>
<div class="step-list">
<div class="step-item active">
<div class="step-icon">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"/></svg>
</div>
<div class="step-content">
<div class="step-title">Account activated</div>
<div class="step-meta">Trial started · 7 days free</div>
</div>
</div>
<div class="step-item">
<div class="step-icon step-icon--pending">2</div>
<div class="step-content">
<div class="step-title">Install extension or app</div>
<div class="step-meta">Browser extension · Mobile app · CLI</div>
<div class="step-actions">
<a href="/download" class="btn btn-secondary btn-sm">Get apps</a>
</div>
</div>
</div>
<div class="step-item">
<div class="step-icon step-icon--pending">3</div>
<div class="step-content">
<div class="step-title">Create your first vault</div>
<div class="step-meta">Set up encryption · Add credentials</div>
</div>
</div>
<div class="step-item">
<div class="step-icon step-icon--pending">4</div>
<div class="step-content">
<div class="step-title">Trial reminder</div>
<div class="step-meta">Email in 5 days · No charge until day 7</div>
</div>
</div>
</div>
</div>
<!-- Quick Actions -->
<div class="quick-actions">
<a href="https://vault.clavitor.ai" class="action-card action-card--primary" onclick="handlePortalRedirect(event)">
<div class="action-icon">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
</div>
<div class="action-content">
<div class="action-title">Open your vault</div>
<div class="action-hint">vault.clavitor.ai</div>
</div>
<div class="action-arrow">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14"/><path d="M12 5l7 7-7 7"/></svg>
</div>
</a>
<div class="action-grid">
<a href="/download" class="action-card action-card--secondary">
<div class="action-icon">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
</div>
<div class="action-content">
<div class="action-title">Download apps</div>
<div class="action-hint">All platforms</div>
</div>
</a>
<a href="/docs" class="action-card action-card--secondary">
<div class="action-icon">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/></svg>
</div>
<div class="action-content">
<div class="action-title">Read docs</div>
<div class="action-hint">Getting started</div>
</div>
</a>
</div>
</div>
<!-- Trial Info -->
<div class="trial-info">
<div class="info-box info-box--subtle">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg>
<div class="info-content">
<strong>Trial ends in 7 days</strong>
<p>You'll receive a reminder email 2 days before. Cancel anytime from your account — no questions asked. After the trial: $12/year.</p>
</div>
</div>
</div>
<!-- Support -->
<div class="support-footer">
<p>Questions? <a href="mailto:support@clavitor.ai">support@clavitor.ai</a> or <a href="/help">Help Center</a></p>
</div>
</div>
</div>
<style>
.onboarding-container {
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-start;
padding: 48px 24px;
background: linear-gradient(180deg, #fafafa 0%, #f5f5f5 100%);
}
.onboarding-container::after {
content: '';
flex: 1;
min-height: 24px;
}
.onboarding-container--centered {
justify-content: center;
padding: 64px 24px;
}
.onboarding-card {
width: 100%;
max-width: 520px;
background: white;
border-radius: 16px;
padding: 48px;
box-shadow: 0 4px 24px rgba(0,0,0,0.06);
border: 1px solid var(--border);
flex-shrink: 0;
}
.onboarding-card--success {
max-width: 520px;
text-align: center;
padding: 56px;
}
/* Success Animation */
.success-animation {
position: relative;
width: 80px;
height: 80px;
margin: 0 auto 32px;
}
.success-circle {
width: 80px;
height: 80px;
border-radius: 50%;
background: linear-gradient(135deg, #22c55e 0%, #16a34a 100%);
display: flex;
align-items: center;
justify-content: center;
color: white;
position: relative;
z-index: 2;
animation: success-pop 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
opacity: 0;
transform: scale(0.5);
}
@keyframes success-pop {
to {
opacity: 1;
transform: scale(1);
}
}
.success-particles {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 120px;
height: 120px;
z-index: 1;
}
.success-particles span {
position: absolute;
width: 8px;
height: 8px;
background: var(--brand-violet);
border-radius: 50%;
opacity: 0;
}
.success-particles span:nth-child(1) { top: 0; left: 50%; transform: translateX(-50%); animation: particle-1 0.6s 0.2s ease-out forwards; }
.success-particles span:nth-child(2) { top: 14%; right: 14%; animation: particle-2 0.6s 0.25s ease-out forwards; }
.success-particles span:nth-child(3) { top: 50%; right: 0; transform: translateY(-50%); animation: particle-3 0.6s 0.3s ease-out forwards; }
.success-particles span:nth-child(4) { bottom: 14%; right: 14%; animation: particle-4 0.6s 0.35s ease-out forwards; }
.success-particles span:nth-child(5) { bottom: 0; left: 50%; transform: translateX(-50%); animation: particle-5 0.6s 0.4s ease-out forwards; }
.success-particles span:nth-child(6) { bottom: 14%; left: 14%; animation: particle-6 0.6s 0.45s ease-out forwards; }
.success-particles span:nth-child(7) { top: 50%; left: 0; transform: translateY(-50%); animation: particle-7 0.6s 0.5s ease-out forwards; }
.success-particles span:nth-child(8) { top: 14%; left: 14%; animation: particle-8 0.6s 0.55s ease-out forwards; }
@keyframes particle-1 { to { transform: translateX(-50%) translateY(-30px); opacity: 1; } }
@keyframes particle-2 { to { transform: translate(20px, -20px); opacity: 1; } }
@keyframes particle-3 { to { transform: translateY(-50%) translateX(30px); opacity: 1; } }
@keyframes particle-4 { to { transform: translate(20px, 20px); opacity: 1; } }
@keyframes particle-5 { to { transform: translateX(-50%) translateY(30px); opacity: 1; } }
@keyframes particle-6 { to { transform: translate(-20px, 20px); opacity: 1; } }
@keyframes particle-7 { to { transform: translateY(-50%) translateX(-30px); opacity: 1; } }
@keyframes particle-8 { to { transform: translate(-20px, -20px); opacity: 1; } }
/* Header */
.success-header h1 {
font-size: 28px;
font-weight: 700;
color: var(--text);
margin-bottom: 8px;
}
.success-subtitle {
font-size: 16px;
color: var(--text-secondary);
margin-bottom: 40px;
}
/* Next Steps */
.next-steps {
text-align: left;
background: var(--bg-secondary);
border-radius: 12px;
padding: 24px;
margin-bottom: 24px;
}
.next-steps-title {
font-size: 12px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--text-tertiary);
margin-bottom: 20px;
}
.step-list {
display: flex;
flex-direction: column;
gap: 16px;
}
.step-item {
display: flex;
align-items: flex-start;
gap: 16px;
}
.step-item.active .step-icon {
background: var(--success);
color: white;
}
.step-icon {
width: 32px;
height: 32px;
border-radius: 50%;
background: var(--border);
color: var(--text-tertiary);
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
font-weight: 600;
flex-shrink: 0;
}
.step-icon--pending {
background: var(--bg-secondary);
border: 2px solid var(--border);
}
.step-content {
flex: 1;
}
.step-title {
font-size: 15px;
font-weight: 600;
color: var(--text);
}
.step-meta {
font-size: 13px;
color: var(--text-tertiary);
margin-top: 2px;
}
.step-actions {
margin-top: 8px;
}
.btn-sm {
padding: 6px 14px;
font-size: 13px;
height: auto;
}
/* Quick Actions */
.quick-actions {
display: flex;
flex-direction: column;
gap: 12px;
margin-bottom: 24px;
}
.action-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
}
.action-card {
display: flex;
align-items: center;
gap: 16px;
padding: 20px;
border-radius: 12px;
border: 2px solid var(--border);
text-decoration: none;
text-align: left;
transition: all 0.15s;
}
.action-card:hover {
border-color: var(--brand-black);
background: var(--bg-secondary);
}
.action-card--primary {
background: var(--brand-black);
border-color: var(--brand-black);
color: white;
}
.action-card--primary:hover {
background: #262626;
border-color: #262626;
color: white;
}
.action-card--secondary {
background: white;
}
.action-icon {
width: 44px;
height: 44px;
border-radius: 10px;
background: rgba(255,255,255,0.1);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.action-card--secondary .action-icon {
background: var(--bg-secondary);
border: 1px solid var(--border);
}
.action-content {
flex: 1;
}
.action-title {
font-size: 15px;
font-weight: 600;
}
.action-hint {
font-size: 13px;
opacity: 0.7;
margin-top: 2px;
}
.action-arrow {
color: white;
opacity: 0.6;
}
/* Trial Info */
.trial-info {
margin-bottom: 24px;
}
.info-box--subtle {
display: flex;
align-items: flex-start;
gap: 12px;
padding: 16px;
background: transparent;
border: 1px solid var(--border);
border-radius: 10px;
font-size: 13px;
color: var(--text-secondary);
line-height: 1.5;
text-align: left;
}
.info-box--subtle svg {
flex-shrink: 0;
color: var(--text-tertiary);
}
.info-box--subtle strong {
display: block;
color: var(--text);
margin-bottom: 4px;
}
.info-box--subtle p {
margin: 0;
}
/* Support Footer */
.support-footer {
padding-top: 24px;
border-top: 1px solid var(--border);
font-size: 13px;
color: var(--text-tertiary);
}
.support-footer a {
color: var(--brand-black);
text-decoration: underline;
}
/* Loading state for redirect */
.action-card--primary.redirecting {
opacity: 0.7;
pointer-events: none;
}
.action-card--primary.redirecting .action-arrow {
animation: pulse-arrow 1s infinite;
}
@keyframes pulse-arrow {
0%, 100% { opacity: 0.6; transform: translateX(0); }
50% { opacity: 1; transform: translateX(4px); }
}
/* Mobile */
@media (max-width: 640px) {
.onboarding-card--success {
padding: 40px 24px;
border-radius: 0;
border: none;
box-shadow: none;
max-width: 100%;
}
.onboarding-container--centered {
padding: 0;
background: white;
}
.success-header h1 {
font-size: 24px;
}
.action-grid {
grid-template-columns: 1fr;
}
.next-steps {
padding: 20px;
}
}
</style>
<script>
// Auto-redirect after 5 seconds
let redirectTimer;
const REDIRECT_DELAY = 5000;
function handlePortalRedirect(e) {
// Let the click happen, but show visual feedback
const card = e.currentTarget;
card.classList.add('redirecting');
card.querySelector('.action-title').textContent = 'Opening vault...';
// Clear any existing timer
if (redirectTimer) {
clearTimeout(redirectTimer);
}
}
// Start auto-redirect timer
function startAutoRedirect() {
const primaryAction = document.querySelector('.action-card--primary');
redirectTimer = setTimeout(() => {
primaryAction.classList.add('redirecting');
primaryAction.querySelector('.action-title').textContent = 'Opening vault...';
// Actually redirect
window.location.href = primaryAction.href;
}, REDIRECT_DELAY);
}
// Start the timer when page loads
startAutoRedirect();
// Cancel auto-redirect if user interacts with anything
['click', 'touchstart', 'keydown'].forEach(event => {
document.addEventListener(event, () => {
if (redirectTimer) {
clearTimeout(redirectTimer);
redirectTimer = null;
}
}, { once: true });
});
</script>
{{end}}