540 lines
15 KiB
Cheetah
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}}
|