feat(frontend): enhance API credentials system and build configuration

Add real API support in demo mode with credential checking, implement build-time version injection from package.json, and refactor update checking with 24-hour caching. Migrate landing page from Vue to Astro with comprehensive UI components including Hero, Features, Benefits, and Tech Stack sections. Update CI/CD workflow with expanded cache paths and security scanner version pinned.
This commit is contained in:
Tomas Dvorak
2026-02-10 16:25:57 +01:00
parent d27cf14110
commit b083dac3f0
95 changed files with 17610 additions and 2692 deletions
-37
View File
@@ -1,37 +0,0 @@
<template>
<div id="app" :class="{ 'dark': isDark }">
<Navigation />
<router-view />
<Footer />
</div>
</template>
<script setup lang="ts">
import { onMounted } from 'vue'
import Navigation from './components/Navigation.vue'
import Footer from './components/Footer.vue'
import { useTheme } from './composables/useTheme'
const { isDark } = useTheme()
onMounted(() => {
// Check for system preference
if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
document.documentElement.classList.add('dark')
} else {
document.documentElement.classList.remove('dark')
}
})
</script>
<style>
#app {
min-height: 100vh;
display: flex;
flex-direction: column;
}
.dark {
color-scheme: dark;
}
</style>
+158
View File
@@ -0,0 +1,158 @@
---
// AI Services Section Component
---
<section id="ai-services" class="py-24 lg:py-40 bg-gradient-to-br from-background via-card/30 to-background relative overflow-hidden">
<div class="absolute inset-0 bg-grid-pattern bg-grid-48 opacity-3"></div>
<!-- Minimal particle field -->
<div class="particle-field">
<div class="particle" style="left: 10%; animation-delay: 1s; animation-duration: 22s;"></div>
<div class="particle" style="left: 30%; animation-delay: 3s; animation-duration: 19s;"></div>
<div class="particle" style="left: 50%; animation-delay: 2s; animation-duration: 24s;"></div>
<div class="particle" style="left: 70%; animation-delay: 4s; animation-duration: 21s;"></div>
<div class="particle" style="left: 90%; animation-delay: 1s; animation-duration: 20s;"></div>
</div>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="text-center mb-20">
<div class="inline-flex items-center px-6 py-3 rounded-full bg-primary/10 border border-primary/20 mb-8 animate-fade-in glass-effect">
<span class="w-3 h-3 bg-primary rounded-full mr-3 animate-pulse"></span>
<span class="text-sm font-semibold text-primary">AI-Powered Intelligence</span>
</div>
<h2 class="text-5xl sm:text-6xl lg:text-7xl font-black text-foreground mb-8 leading-tight">
<span class="block">Smart Features</span>
<span class="gradient-text">Your Choice</span>
</h2>
<p class="text-2xl lg:text-3xl text-muted-foreground max-w-4xl mx-auto leading-relaxed">
Enhanced productivity with optional AI services that respect your privacy and budget
</p>
</div>
<!-- AI Services Grid -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8 mb-16">
<!-- Budget Friendly -->
<div class="feature-card group">
<div class="relative z-10">
<div class="w-16 h-16 bg-gradient-to-br from-trackeep-orange to-trackeep-orange/80 rounded-2xl flex items-center justify-center mb-6 group-hover:scale-110 transition-transform">
<img src="/images/deepseek-color.svg" alt="DeepSeek" class="w-10 h-10" />
</div>
<h3 class="text-2xl font-bold text-foreground mb-4 group-hover:text-trackeep-orange transition-colors">
Budget-Friendly AI
</h3>
<p class="text-muted-foreground leading-relaxed mb-6">
Get powerful AI features without breaking the bank. DeepSeek and LongCat offer incredible value for content analysis and recommendations.
</p>
<div class="flex flex-wrap gap-2">
<span class="px-3 py-1 bg-trackeep-orange/10 text-trackeep-orange rounded-full text-sm font-medium flex items-center">
<img src="/images/deepseek-color.svg" alt="DeepSeek" class="w-4 h-4 mr-1" />
DeepSeek
</span>
<span class="px-3 py-1 bg-trackeep-orange/10 text-trackeep-orange rounded-full text-sm font-medium flex items-center">
<img src="/images/longcat-color.svg" alt="LongCat" class="w-4 h-4 mr-1" />
LongCat AI
</span>
</div>
</div>
</div>
<!-- Privacy First -->
<div class="feature-card group">
<div class="relative z-10">
<div class="w-16 h-16 bg-gradient-to-br from-trackeep-green to-trackeep-emerald rounded-2xl flex items-center justify-center mb-6 group-hover:scale-110 transition-transform">
<img src="/images/mistral-color.svg" alt="Mistral" class="w-10 h-10" />
</div>
<h3 class="text-2xl font-bold text-foreground mb-4 group-hover:text-trackeep-green transition-colors">
Privacy-First Options
</h3>
<p class="text-muted-foreground leading-relaxed mb-6">
European GDPR-compliant AI with Mistral, or complete offline privacy with self-hosted Ollama models.
</p>
<div class="flex flex-wrap gap-2">
<span class="px-3 py-1 bg-trackeep-green/10 text-trackeep-green rounded-full text-sm font-medium flex items-center">
<img src="/images/mistral-color.svg" alt="Mistral" class="w-4 h-4 mr-1" />
Mistral AI
</span>
<span class="px-3 py-1 bg-trackeep-green/10 text-trackeep-green rounded-full text-sm font-medium flex items-center">
<img src="/images/ollama.svg" alt="Ollama" class="w-4 h-4 mr-1" />
Ollama
</span>
</div>
</div>
</div>
<!-- Complete Control -->
<div class="feature-card group">
<div class="relative z-10">
<div class="w-16 h-16 bg-gradient-to-br from-trackeep-purple to-trackeep-pink rounded-2xl flex items-center justify-center mb-6 group-hover:scale-110 transition-transform">
<img src="/images/grok.svg" alt="Grok" class="w-10 h-10" />
</div>
<h3 class="text-2xl font-bold text-foreground mb-4 group-hover:text-trackeep-purple transition-colors">
Complete Control
</h3>
<p class="text-muted-foreground leading-relaxed mb-6">
Enable only what you need. Mix and match services, use custom endpoints, or disable AI entirely.
</p>
<div class="flex flex-wrap gap-2">
<span class="px-3 py-1 bg-trackeep-purple/10 text-trackeep-purple rounded-full text-sm font-medium flex items-center">
<img src="/images/grok.svg" alt="Grok" class="w-4 h-4 mr-1" />
Grok
</span>
<span class="px-3 py-1 bg-trackeep-purple/10 text-trackeep-purple rounded-full text-sm font-medium flex items-center">
<img src="/images/openrouter.svg" alt="OpenRouter" class="w-4 h-4 mr-1" />
OpenRouter
</span>
</div>
</div>
</div>
</div>
<!-- Configuration Examples -->
<div class="glass-effect rounded-3xl p-8 border border-border/50">
<h3 class="text-2xl font-bold text-foreground mb-6 text-center">Popular AI Configurations</h3>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
<div class="text-center">
<div class="w-12 h-12 bg-trackeep-orange/20 rounded-xl flex items-center justify-center mx-auto mb-3">
<img src="/images/deepseek-color.svg" alt="DeepSeek" class="w-8 h-8" />
</div>
<h4 class="font-semibold text-foreground mb-2">Budget Setup</h4>
<p class="text-sm text-muted-foreground">DeepSeek + LongCat for maximum value</p>
</div>
<div class="text-center">
<div class="w-12 h-12 bg-trackeep-green/20 rounded-xl flex items-center justify-center mx-auto mb-3">
<img src="/images/mistral-color.svg" alt="Mistral" class="w-8 h-8" />
</div>
<h4 class="font-semibold text-foreground mb-2">Privacy Setup</h4>
<p class="text-sm text-muted-foreground">Mistral + Ollama for GDPR compliance</p>
</div>
<div class="text-center">
<div class="w-12 h-12 bg-trackeep-blue/20 rounded-xl flex items-center justify-center mx-auto mb-3">
<img src="/images/grok.svg" alt="Grok" class="w-8 h-8" />
</div>
<h4 class="font-semibold text-foreground mb-2">Performance Setup</h4>
<p class="text-sm text-muted-foreground">Mix services for optimal results</p>
</div>
<div class="text-center">
<div class="w-12 h-12 bg-trackeep-purple/20 rounded-xl flex items-center justify-center mx-auto mb-3">
<img src="/images/ollama.svg" alt="Ollama" class="w-8 h-8" />
</div>
<h4 class="font-semibold text-foreground mb-2">No AI Setup</h4>
<p class="text-sm text-muted-foreground">Complete privacy, zero AI features</p>
</div>
</div>
</div>
<!-- Transparency Note -->
<div class="mt-16 text-center">
<div class="inline-flex items-center px-6 py-4 rounded-2xl bg-muted/50 border border-border/50 backdrop-blur-sm">
<svg class="w-5 h-5 text-trackeep-blue mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg>
<p class="text-sm text-muted-foreground">
<span class="font-semibold text-foreground">Transparent by Design:</span>
All AI features are optional. You decide what data gets processed and where.
</p>
</div>
</div>
</div>
</section>
@@ -0,0 +1,131 @@
---
// Benefits section highlighting key advantages
---
<section class="py-20 lg:py-32 bg-gradient-to-b from-background via-card/20 to-background relative overflow-hidden">
<div class="absolute inset-0 bg-grid-pattern bg-grid-48 opacity-10"></div>
<div class="gradient-blob bg-primary w-[400px] h-[400px] top-20 right-10 animate-float parallax-slow"></div>
<div class="gradient-blob bg-trackeep-purple w-[350px] h-[350px] bottom-20 left-10 animate-float parallax-slow" style="animation-delay: 2s"></div>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<!-- Enhanced Section header -->
<div class="text-center mb-20">
<div class="inline-flex items-center px-6 py-3 rounded-full bg-gradient-to-r from-primary/10 to-trackeep-purple/10 border border-primary/20 mb-8 animate-fade-in glass-effect backdrop-blur-xl">
<span class="w-3 h-3 bg-gradient-to-r from-primary to-trackeep-purple rounded-full mr-3 animate-pulse"></span>
<span class="text-sm font-semibold text-primary">Why Trackeep?</span>
</div>
<h2 class="text-5xl sm:text-6xl lg:text-7xl font-black text-foreground mb-8 leading-tight">
<span class="block">The Perfect Blend of</span>
<span class="gradient-text">Privacy & Power</span>
</h2>
<p class="text-2xl lg:text-3xl text-muted-foreground max-w-4xl mx-auto leading-relaxed">
Discover why thousands of users have made the switch to Trackeep for their digital organization needs
</p>
</div>
<!-- Benefits grid -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-10">
<!-- Privacy -->
<div class="feature-card group cursor-pointer text-center hover-3d">
<div class="w-20 h-20 bg-gradient-to-br from-red-500/20 to-red-500/30 rounded-2xl flex items-center justify-center mx-auto mb-6 group-hover:scale-110 group-hover:rotate-6 transition-all duration-500 group-hover:shadow-glow border border-red-500/30">
<svg class="w-10 h-10 text-red-500 group-hover:animate-pulse" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/>
</svg>
</div>
<h3 class="text-2xl font-bold text-foreground mb-4 group-hover:text-red-500 transition-colors">Privacy First</h3>
<p class="text-muted-foreground leading-relaxed text-lg">
Your data stays yours with end-to-end encryption. No data mining, no tracking, no selling your information. Complete ownership and control.
</p>
</div>
<!-- Open Source -->
<div class="feature-card group cursor-pointer text-center hover-3d">
<div class="w-20 h-20 bg-gradient-to-br from-green-500/20 to-green-500/30 rounded-2xl flex items-center justify-center mx-auto mb-6 group-hover:scale-110 group-hover:rotate-6 transition-all duration-500 group-hover:shadow-glow-green border border-green-500/30">
<svg class="w-10 h-10 text-green-500 group-hover:animate-pulse" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/>
</svg>
</div>
<h3 class="text-2xl font-bold text-foreground mb-4 group-hover:text-green-500 transition-colors">Transparent & Open</h3>
<p class="text-muted-foreground leading-relaxed text-lg">
Fully open source with GPL v3 license. Audit the code, contribute improvements, or customize it to fit your exact needs.
</p>
</div>
<!-- All-in-One -->
<div class="feature-card group cursor-pointer text-center hover-3d">
<div class="w-20 h-20 bg-gradient-to-br from-primary/20 to-primary/30 rounded-2xl flex items-center justify-center mx-auto mb-6 group-hover:scale-110 group-hover:rotate-6 transition-all duration-500 group-hover:shadow-glow border border-primary/30">
<svg class="w-10 h-10 text-primary group-hover:animate-pulse" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"/>
</svg>
</div>
<h3 class="text-2xl font-bold text-foreground mb-4 group-hover:text-primary transition-colors">All-in-One Platform</h3>
<p class="text-muted-foreground leading-relaxed text-lg">
Bookmarks, tasks, files, notes, and learning tracking in one place. Replace multiple apps and simplify your digital workflow.
</p>
</div>
<!-- AI Optional -->
<div class="feature-card group cursor-pointer text-center hover-3d">
<div class="w-20 h-20 bg-gradient-to-br from-trackeep-purple/20 to-trackeep-purple/30 rounded-2xl flex items-center justify-center mx-auto mb-6 group-hover:scale-110 group-hover:rotate-6 transition-all duration-500 group-hover:shadow-glow-purple border border-trackeep-purple/30">
<svg class="w-10 h-10 text-trackeep-purple group-hover:animate-pulse" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/>
</svg>
</div>
<h3 class="text-2xl font-bold text-foreground mb-4 group-hover:text-trackeep-purple transition-colors">AI On Your Terms</h3>
<p class="text-muted-foreground leading-relaxed text-lg">
Powerful AI features with multiple providers. Use cloud AI, local AI with Ollama, or disable completely. You're always in control.
</p>
</div>
<!-- Self-Hosted -->
<div class="feature-card group cursor-pointer text-center hover-3d">
<div class="w-20 h-20 bg-gradient-to-br from-trackeep-orange/20 to-trackeep-orange/30 rounded-2xl flex items-center justify-center mx-auto mb-6 group-hover:scale-110 group-hover:rotate-6 transition-all duration-500 group-hover:shadow-glow border border-trackeep-orange/30">
<svg class="w-10 h-10 text-trackeep-orange group-hover:animate-pulse" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01"/>
</svg>
</div>
<h3 class="text-2xl font-bold text-foreground mb-4 group-hover:text-trackeep-orange transition-colors">No Subscriptions</h3>
<p class="text-muted-foreground leading-relaxed text-lg">
One-time setup, lifetime usage. No monthly fees, no feature gates, no vendor lock-in. Your infrastructure, your rules.
</p>
</div>
<!-- Developer Friendly -->
<div class="feature-card group cursor-pointer text-center hover-3d">
<div class="w-20 h-20 bg-gradient-to-br from-blue-500/20 to-blue-500/30 rounded-2xl flex items-center justify-center mx-auto mb-6 group-hover:scale-110 group-hover:rotate-6 transition-all duration-500 group-hover:shadow-glow border border-blue-500/30">
<svg class="w-10 h-10 text-blue-500 group-hover:animate-pulse" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"/>
</svg>
</div>
<h3 class="text-2xl font-bold text-foreground mb-4 group-hover:text-blue-500 transition-colors">Developer First</h3>
<p class="text-muted-foreground leading-relaxed text-lg">
Rich REST API, webhooks, and extensibility. Full-text search, OAuth integration, and custom workflows support.
</p>
</div>
</div>
<!-- Call to action -->
<div class="mt-16 text-center bg-muted/50 rounded-2xl p-8">
<h3 class="text-2xl font-semibold text-foreground mb-4">
Ready to take control of your digital life?
</h3>
<p class="text-muted-foreground mb-6 max-w-2xl mx-auto">
Join thousands of users who have already made the switch to a more private, productive way of organizing their digital world.
</p>
<div class="flex flex-col sm:flex-row items-center justify-center gap-4">
<a href="#quick-install" class="btn-primary shadow-glow">
Get Started Now
<svg class="w-4 h-4 ml-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/>
</svg>
</a>
<a href="https://demo.trackeep.org" target="_blank" rel="noopener" class="btn-outline">
See It In Action
<svg class="w-4 h-4 ml-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/>
</svg>
</a>
</div>
</div>
</div>
</section>
+191
View File
@@ -0,0 +1,191 @@
---
// Demo section with live preview link
---
<section id="demo" class="py-20 lg:py-32 bg-background">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<!-- Section header -->
<div class="text-center mb-16">
<h2 class="text-3xl sm:text-4xl font-bold text-foreground mb-4">
See Trackeep in Action
</h2>
<p class="text-xl text-muted-foreground max-w-3xl mx-auto leading-relaxed">
Experience the power and simplicity of Trackeep with our live demo. No registration required.
</p>
</div>
<!-- Demo preview -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
<!-- Demo screenshot/mockup -->
<div class="relative">
<div class="relative bg-card rounded-2xl shadow-2xl overflow-hidden border border-border">
<!-- Browser chrome -->
<div class="bg-muted px-4 py-3 border-b border-border flex items-center space-x-2">
<div class="w-3 h-3 bg-red-500 rounded-full"></div>
<div class="w-3 h-3 bg-yellow-500 rounded-full"></div>
<div class="w-3 h-3 bg-green-500 rounded-full"></div>
<div class="flex-1 bg-background rounded px-3 py-1 text-xs text-muted-foreground ml-4">
demo.trackeep.org
</div>
</div>
<!-- Demo content -->
<div class="p-6 bg-background min-h-[400px]">
<div class="space-y-4">
<!-- Navigation mock -->
<div class="flex items-center justify-between pb-4 border-b border-border">
<div class="flex items-center space-x-2">
<div class="w-8 h-8 bg-primary rounded-lg"></div>
<span class="font-semibold">Trackeep</span>
</div>
<div class="flex space-x-4">
<div class="w-16 h-6 bg-muted rounded"></div>
<div class="w-16 h-6 bg-muted rounded"></div>
<div class="w-16 h-6 bg-muted rounded"></div>
</div>
</div>
<!-- Dashboard mock -->
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div class="bg-card p-4 rounded-lg border border-border">
<div class="w-24 h-4 bg-muted rounded mb-3"></div>
<div class="space-y-2">
<div class="w-full h-3 bg-muted rounded"></div>
<div class="w-3/4 h-3 bg-muted rounded"></div>
<div class="w-5/6 h-3 bg-muted rounded"></div>
</div>
</div>
<div class="bg-card p-4 rounded-lg border border-border">
<div class="w-20 h-4 bg-muted rounded mb-3"></div>
<div class="space-y-2">
<div class="w-full h-3 bg-muted rounded"></div>
<div class="w-2/3 h-3 bg-muted rounded"></div>
<div class="w-4/5 h-3 bg-muted rounded"></div>
</div>
</div>
<div class="bg-card p-4 rounded-lg border border-border">
<div class="w-16 h-4 bg-muted rounded mb-3"></div>
<div class="space-y-2">
<div class="w-full h-3 bg-muted rounded"></div>
<div class="w-5/6 h-3 bg-muted rounded"></div>
<div class="w-3/4 h-3 bg-muted rounded"></div>
</div>
</div>
<div class="bg-card p-4 rounded-lg border border-border">
<div class="w-28 h-4 bg-muted rounded mb-3"></div>
<div class="space-y-2">
<div class="w-full h-3 bg-muted rounded"></div>
<div class="w-2/3 h-3 bg-muted rounded"></div>
<div class="w-4/5 h-3 bg-muted rounded"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Floating badges -->
<div class="absolute -top-4 -right-4 bg-primary text-primary-foreground px-3 py-1 rounded-full text-sm font-medium shadow-lg">
Live Demo
</div>
<div class="absolute -bottom-4 -left-4 bg-trackeep-green text-white px-3 py-1 rounded-full text-sm font-medium shadow-lg">
No Registration
</div>
</div>
<!-- Demo features -->
<div class="space-y-8">
<div>
<h3 class="text-2xl font-semibold text-foreground mb-4">
Try These Features in the Demo
</h3>
<div class="space-y-4">
<div class="flex items-start space-x-4">
<div class="w-8 h-8 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0 mt-0.5">
<svg class="w-4 h-4 text-primary" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
</svg>
</div>
<div>
<h4 class="font-semibold text-foreground mb-1">Smart Organization</h4>
<p class="text-muted-foreground">Experience AI-powered categorization and intelligent tagging</p>
</div>
</div>
<div class="flex items-start space-x-4">
<div class="w-8 h-8 bg-trackeep-green/10 rounded-lg flex items-center justify-center flex-shrink-0 mt-0.5">
<svg class="w-4 h-4 text-trackeep-green" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
</svg>
</div>
<div>
<h4 class="font-semibold text-foreground mb-1">Lightning Search</h4>
<p class="text-muted-foreground">Find anything instantly with our powerful search capabilities</p>
</div>
</div>
<div class="flex items-start space-x-4">
<div class="w-8 h-8 bg-trackeep-orange/10 rounded-lg flex items-center justify-center flex-shrink-0 mt-0.5">
<svg class="w-4 h-4 text-trackeep-orange" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
</svg>
</div>
<div>
<h4 class="font-semibold text-foreground mb-1">Mobile Responsive</h4>
<p class="text-muted-foreground">Test the responsive design on different screen sizes</p>
</div>
</div>
<div class="flex items-start space-x-4">
<div class="w-8 h-8 bg-trackeep-purple/10 rounded-lg flex items-center justify-center flex-shrink-0 mt-0.5">
<svg class="w-4 h-4 text-trackeep-purple" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
</svg>
</div>
<div>
<h4 class="font-semibold text-foreground mb-1">Dark Mode</h4>
<p class="text-muted-foreground">Toggle between light and dark themes seamlessly</p>
</div>
</div>
</div>
</div>
<!-- Demo credentials -->
<div class="bg-muted/50 rounded-xl p-6">
<h4 class="font-semibold text-foreground mb-3">Demo Access</h4>
<div class="space-y-2 text-sm">
<div class="flex items-center space-x-2">
<span class="text-muted-foreground">Email:</span>
<code class="bg-background px-2 py-1 rounded text-foreground">[email protected]</code>
</div>
<div class="flex items-center space-x-2">
<span class="text-muted-foreground">Password:</span>
<code class="bg-background px-2 py-1 rounded text-foreground">demo123</code>
</div>
</div>
<p class="text-xs text-muted-foreground mt-3">
Data resets every 24 hours. No real data is stored in the demo.
</p>
</div>
</div>
</div>
<!-- CTA -->
<div class="mt-16 text-center">
<a
href="https://demo.trackeep.org"
target="_blank"
rel="noopener"
class="btn-primary px-8 py-4 text-lg hover-lift group"
>
Launch Live Demo
<svg class="w-5 h-5 ml-2 group-hover:translate-x-1 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/>
</svg>
</a>
<p class="text-muted-foreground mt-4">
Opens in new tab • No registration required • Full feature access
</p>
</div>
</div>
</section>
-22
View File
@@ -1,22 +0,0 @@
<template>
<div class="card-papra group hover:scale-105 transition-papra duration-300 border-2 border-transparent hover:border-primary/20">
<div class="flex items-center mb-6">
<div class="bg-gradient-to-br from-primary/10 to-primary/20 text-primary p-4 rounded-2xl group-hover:from-primary/20 group-hover:to-primary/30 transition-papra">
<i :class="icon" class="text-3xl"></i>
</div>
</div>
<h3 class="text-2xl font-bold text-gray-900 dark:text-gray-100 mb-4 leading-tight">{{ title }}</h3>
<p class="text-lg text-gray-600 dark:text-gray-400 leading-relaxed text-pretty">{{ description }}</p>
</div>
</template>
<script setup lang="ts">
interface Props {
icon: string
title: string
description: string
}
defineProps<Props>()
</script>
@@ -0,0 +1,178 @@
---
// Features section with card grid
---
<section id="features" class="py-24 lg:py-40 bg-gradient-to-b from-background via-card/30 to-background relative overflow-hidden">
<!-- Enhanced Background decoration -->
<div class="absolute inset-0 bg-grid-pattern bg-grid-48 opacity-20"></div>
<div class="gradient-blob bg-primary w-[400px] h-[400px] top-20 left-10 animate-float parallax-slow"></div>
<div class="gradient-blob bg-trackeep-purple w-[350px] h-[350px] bottom-20 right-10 animate-float parallax-slow" style="animation-delay: 3s"></div>
<div class="gradient-blob bg-trackeep-blue w-[300px] h-[300px] top-1/2 right-1/4 animate-float parallax-slow" style="animation-delay: 1.5s"></div>
<div class="gradient-blob bg-trackeep-green w-[250px] h-[250px] bottom-1/3 left-1/4 animate-float parallax-slow" style="animation-delay: 2.5s"></div>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<!-- Enhanced Section header with shimmer effects -->
<div class="text-center mb-24">
<div class="inline-flex items-center px-6 py-3 rounded-full bg-gradient-to-r from-primary/10 to-trackeep-purple/10 border border-primary/20 mb-8 animate-fade-in glass-effect backdrop-blur-xl hover-lift group cursor-pointer glow-border">
<span class="w-3 h-3 bg-gradient-to-r from-primary to-trackeep-purple rounded-full mr-3 animate-pulse shadow-glow"></span>
<span class="text-sm font-semibold text-primary text-shimmer">Powerful Features</span>
<svg class="w-4 h-4 ml-2 text-primary opacity-0 group-hover:opacity-100 transition-all duration-300 group-hover:translate-x-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/>
</svg>
</div>
<h2 class="text-5xl sm:text-6xl lg:text-7xl font-black text-foreground mb-8 leading-tight animate-fade-in">
<span class="block">Everything You Need to</span>
<span class="gradient-text animate-glow text-shadow-glow text-shimmer">Stay Organized</span>
</h2>
<p class="text-2xl lg:text-3xl text-muted-foreground max-w-5xl mx-auto leading-relaxed animate-slide-up font-medium" style="animation-delay: 0.1s">
Trackeep combines powerful features with simplicity, giving you the perfect tool to manage your digital life without compromising on privacy or control.
</p>
</div>
<!-- Enhanced Features grid with 3D effects -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-10 stagger-animation">
<!-- Bookmarks & Links -->
<div class="feature-card group cursor-pointer animate-scale-in scroll-reveal hover-3d glow-border" style="animation-delay: 0.2s">
<div class="relative z-10">
<div class="w-16 h-16 bg-gradient-to-br from-primary/20 to-primary/30 rounded-2xl flex items-center justify-center mb-8 group-hover:scale-110 group-hover:rotate-6 transition-all duration-500 group-hover:shadow-glow border border-primary/30">
<svg class="w-8 h-8 text-primary group-hover:animate-pulse" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z"/>
</svg>
</div>
<h3 class="text-2xl font-bold text-foreground mb-4 group-hover:text-primary transition-colors">Smart Bookmarks</h3>
<p class="text-muted-foreground leading-relaxed mb-6 text-lg">
Save and categorize web content with intelligent tagging. Access your bookmarks from anywhere with powerful search and filtering.
</p>
<div class="flex items-center text-primary opacity-0 group-hover:opacity-100 transition-all duration-300 transform translate-y-2 group-hover:translate-y-0">
<span class="text-base font-semibold mr-2">Learn more</span>
<svg class="w-5 h-5 group-hover:translate-x-2 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/>
</svg>
</div>
</div>
</div>
<!-- Task Management -->
<div class="feature-card group cursor-pointer animate-scale-in scroll-reveal hover-3d glow-border" style="animation-delay: 0.3s">
<div class="relative z-10">
<div class="w-16 h-16 bg-gradient-to-br from-trackeep-green/20 to-trackeep-green/30 rounded-2xl flex items-center justify-center mb-8 group-hover:scale-110 group-hover:rotate-6 transition-all duration-500 group-hover:shadow-glow-green border border-trackeep-green/30">
<svg class="w-8 h-8 text-trackeep-green group-hover:animate-pulse" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"/>
</svg>
</div>
<h3 class="text-2xl font-bold text-foreground mb-4 group-hover:text-trackeep-green transition-colors">Task Management</h3>
<p class="text-muted-foreground leading-relaxed mb-6 text-lg">
Plan and track your to-dos with intuitive boards. Set priorities, deadlines, and collaborate with your team seamlessly.
</p>
<div class="flex items-center text-trackeep-green opacity-0 group-hover:opacity-100 transition-all duration-300 transform translate-y-2 group-hover:translate-y-0">
<span class="text-base font-semibold mr-2">Learn more</span>
<svg class="w-5 h-5 group-hover:translate-x-2 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/>
</svg>
</div>
</div>
</div>
<!-- File Storage -->
<div class="feature-card group cursor-pointer animate-scale-in scroll-reveal hover-3d glow-border" style="animation-delay: 0.4s">
<div class="relative z-10">
<div class="w-16 h-16 bg-gradient-to-br from-trackeep-orange/20 to-trackeep-orange/30 rounded-2xl flex items-center justify-center mb-8 group-hover:scale-110 group-hover:rotate-6 transition-all duration-500 group-hover:shadow-glow border border-trackeep-orange/30">
<svg class="w-8 h-8 text-trackeep-orange group-hover:animate-pulse" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"/>
</svg>
</div>
<h3 class="text-2xl font-bold text-foreground mb-4 group-hover:text-trackeep-orange transition-colors">File Storage</h3>
<p class="text-muted-foreground leading-relaxed mb-6 text-lg">
Upload and organize documents, images, and files. Built-in version control and automatic backup keep your data safe.
</p>
<div class="flex items-center text-trackeep-orange opacity-0 group-hover:opacity-100 transition-all duration-300 transform translate-y-2 group-hover:translate-y-0">
<span class="text-base font-semibold mr-2">Learn more</span>
<svg class="w-5 h-5 group-hover:translate-x-2 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/>
</svg>
</div>
</div>
</div>
<!-- AI-Powered -->
<div class="feature-card group cursor-pointer animate-scale-in scroll-reveal hover-3d glow-border" style="animation-delay: 0.5s">
<div class="relative z-10">
<div class="w-16 h-16 bg-gradient-to-br from-trackeep-purple/20 to-trackeep-purple/30 rounded-2xl flex items-center justify-center mb-8 group-hover:scale-110 group-hover:rotate-6 transition-all duration-500 group-hover:shadow-glow-purple border border-trackeep-purple/30">
<svg class="w-8 h-8 text-trackeep-purple group-hover:animate-pulse" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/>
</svg>
</div>
<h3 class="text-2xl font-bold text-foreground mb-4 group-hover:text-trackeep-purple transition-colors">AI-Powered Insights</h3>
<p class="text-muted-foreground leading-relaxed mb-6 text-lg">
Get smart recommendations and automated organization. AI helps you find patterns and optimize your workflow.
</p>
<div class="flex items-center text-trackeep-purple opacity-0 group-hover:opacity-100 transition-all duration-300 transform translate-y-2 group-hover:translate-y-0">
<span class="text-base font-semibold mr-2">Learn more</span>
<svg class="w-5 h-5 group-hover:translate-x-2 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/>
</svg>
</div>
</div>
</div>
<!-- Privacy First -->
<div class="feature-card group cursor-pointer animate-scale-in scroll-reveal hover-3d glow-border" style="animation-delay: 0.6s">
<div class="relative z-10">
<div class="w-16 h-16 bg-gradient-to-br from-red-500/20 to-red-500/30 rounded-2xl flex items-center justify-center mb-8 group-hover:scale-110 group-hover:rotate-6 transition-all duration-500 group-hover:shadow-glow border border-red-500/30">
<svg class="w-8 h-8 text-red-500 group-hover:animate-pulse" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/>
</svg>
</div>
<h3 class="text-2xl font-bold text-foreground mb-4 group-hover:text-red-500 transition-colors">Privacy First</h3>
<p class="text-muted-foreground leading-relaxed mb-6 text-lg">
Your data stays yours. End-to-end encryption, no tracking, and complete control over your information.
</p>
<div class="flex items-center text-red-500 opacity-0 group-hover:opacity-100 transition-all duration-300 transform translate-y-2 group-hover:translate-y-0">
<span class="text-base font-semibold mr-2">Learn more</span>
<svg class="w-5 h-5 group-hover:translate-x-2 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/>
</svg>
</div>
</div>
</div>
<!-- Mobile App -->
<div class="feature-card group cursor-pointer animate-scale-in scroll-reveal hover-3d glow-border" style="animation-delay: 0.7s">
<div class="relative z-10">
<div class="w-16 h-16 bg-gradient-to-br from-blue-500/20 to-blue-500/30 rounded-2xl flex items-center justify-center mb-8 group-hover:scale-110 group-hover:rotate-6 transition-all duration-500 group-hover:shadow-glow border border-blue-500/30">
<svg class="w-8 h-8 text-blue-500 group-hover:animate-pulse" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z"/>
</svg>
</div>
<h3 class="text-2xl font-bold text-foreground mb-4 group-hover:text-blue-500 transition-colors">Mobile Apps</h3>
<p class="text-muted-foreground leading-relaxed mb-6 text-lg">
Native iOS and Android apps. Sync seamlessly across all your devices and stay productive on the go.
</p>
<div class="flex items-center text-blue-500 opacity-0 group-hover:opacity-100 transition-all duration-300 transform translate-y-2 group-hover:translate-y-0">
<span class="text-base font-semibold mr-2">Learn more</span>
<svg class="w-5 h-5 group-hover:translate-x-2 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/>
</svg>
</div>
</div>
</div>
</div>
<!-- Additional features highlight with enhanced effects -->
<div class="mt-20 text-center animate-slide-up" style="animation-delay: 0.8s">
<div class="inline-flex items-center justify-center p-8 rounded-3xl bg-card/50 backdrop-blur-sm border border-border/50 glow-border hover-lift group">
<div class="text-center">
<p class="text-xl text-muted-foreground mb-6 font-medium">
And much more: <span class="text-shimmer">API access, webhooks, integrations, custom workflows</span>, and more
</p>
<a href="#docs" class="btn-primary px-10 py-5 text-lg shadow-glow group magnetic-button glow-border">
Explore All Features
<svg class="w-6 h-6 ml-3 group-hover:translate-x-2 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/>
</svg>
</a>
</div>
</div>
</div>
</div>
</section>
+91
View File
@@ -0,0 +1,91 @@
---
// Footer component with links
---
<footer class="bg-card border-t border-border/50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
<!-- Brand -->
<div class="lg:col-span-2">
<div class="flex items-center space-x-3 mb-4">
<div class="w-8 h-8 bg-primary rounded-lg flex items-center justify-center">
<svg class="w-5 h-5 text-primary-foreground" fill="currentColor" viewBox="0 0 20 20">
<path d="M9 2a1 1 0 000 2h2a1 1 0 100-2H9z"/>
<path fill-rule="evenodd" d="M4 5a2 2 0 012-2 1 1 0 000 2H6a2 2 0 100 4h2a2 2 0 100-4h2a1 1 0 100-2 2 2 0 00-2 2v11a2 2 0 002 2h6a2 2 0 002-2V5a2 2 0 00-2-2H6z" clip-rule="evenodd"/>
</svg>
</div>
<span class="text-xl font-bold text-foreground">Trackeep</span>
</div>
<p class="text-muted-foreground mb-4 max-w-md">
Your self-hosted productivity and knowledge hub. Take control of your digital life with privacy-first, open-source software.
</p>
<div class="flex space-x-4">
<a href="https://github.com/Dvorinka/Trackeep" target="_blank" rel="noopener" class="text-muted-foreground hover:text-primary transition-colors" aria-label="GitHub">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
</svg>
</a>
<a href="https://discord.gg/trackeep" target="_blank" rel="noopener" class="text-muted-foreground hover:text-primary transition-colors" aria-label="Discord">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z"/>
</svg>
</a>
<a href="https://x.com/trackeep" target="_blank" rel="noopener" class="text-muted-foreground hover:text-primary transition-colors" aria-label="X/Twitter">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/>
</svg>
</a>
</div>
</div>
<!-- Product -->
<div>
<h3 class="font-semibold text-foreground mb-4">Product</h3>
<ul class="space-y-3">
<li><a href="#features" class="text-muted-foreground hover:text-primary transition-colors">Features</a></li>
<li><a href="#demo" class="text-muted-foreground hover:text-primary transition-colors">Demo</a></li>
<li><a href="#pricing" class="text-muted-foreground hover:text-primary transition-colors">Pricing</a></li>
<li><a href="https://demo.trackeep.org" target="_blank" rel="noopener" class="text-muted-foreground hover:text-primary transition-colors">Live Demo</a></li>
<li><a href="https://trackeep.org/install.sh" class="text-muted-foreground hover:text-primary transition-colors">Install Script</a></li>
</ul>
</div>
<!-- Resources -->
<div>
<h3 class="font-semibold text-foreground mb-4">Resources</h3>
<ul class="space-y-3">
<li><a href="#docs" class="text-muted-foreground hover:text-primary transition-colors">Documentation</a></li>
<li><a href="https://github.com/Dvorinka/Trackeep/blob/main/docs/API.md" target="_blank" rel="noopener" class="text-muted-foreground hover:text-primary transition-colors">API Reference</a></li>
<li><a href="https://github.com/Dvorinka/Trackeep/blob/main/docs/DEVELOPMENT.md" target="_blank" rel="noopener" class="text-muted-foreground hover:text-primary transition-colors">Development</a></li>
<li><a href="https://github.com/Dvorinka/Trackeep/blob/main/docs/DEPLOYMENT.md" target="_blank" rel="noopener" class="text-muted-foreground hover:text-primary transition-colors">Deployment</a></li>
<li><a href="https://github.com/Dvorinka/Trackeep/releases" target="_blank" rel="noopener" class="text-muted-foreground hover:text-primary transition-colors">Changelog</a></li>
</ul>
</div>
<!-- Company -->
<div>
<h3 class="font-semibold text-foreground mb-4">Company</h3>
<ul class="space-y-3">
<li><a href="https://github.com/Dvorinka/Trackeep" target="_blank" rel="noopener" class="text-muted-foreground hover:text-primary transition-colors">GitHub</a></li>
<li><a href="#" class="text-muted-foreground hover:text-primary transition-colors">Privacy Policy</a></li>
<li><a href="#" class="text-muted-foreground hover:text-primary transition-colors">Terms of Service</a></li>
<li><a href="#" class="text-muted-foreground hover:text-primary transition-colors">Contact</a></li>
<li><a href="#" class="text-muted-foreground hover:text-primary transition-colors">Status</a></li>
</ul>
</div>
</div>
<!-- Bottom section -->
<div class="mt-12 pt-8 border-t border-border/50 flex flex-col md:flex-row justify-between items-center">
<div class="text-muted-foreground text-sm mb-4 md:mb-0">
© 2024 Trackeep. All rights reserved. Built with ❤️ and open source.
</div>
<div class="flex items-center space-x-6 text-sm">
<span class="text-muted-foreground">License:</span>
<a href="https://github.com/Dvorinka/Trackeep/blob/main/LICENSE" target="_blank" rel="noopener" class="text-primary hover:underline">
AGPL-3.0
</a>
</div>
</div>
</div>
</footer>
-78
View File
@@ -1,78 +0,0 @@
<template>
<footer class="bg-white dark:bg-gray-900 border-t border-gray-200 dark:border-gray-700 mt-auto">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
<div class="grid grid-cols-1 md:grid-cols-4 gap-8">
<!-- Logo and Description -->
<div class="col-span-1 md:col-span-2">
<div class="flex items-center mb-4">
<img
src="/trackeep-logo-bg.png"
alt="Trackeep"
class="h-8 w-auto mr-3"
@error="(e: Event) => { const target = e.target as HTMLImageElement; target.style.display='none'; logoError = true }"
/>
<span v-if="logoError" class="text-xl font-bold text-primary">Trackeep</span>
</div>
<p class="text-gray-600 dark:text-gray-400 max-w-md">
Your self-hosted productivity & knowledge hub. Track, save, and organize everything that matters to you - all in one place, under your control.
</p>
</div>
<!-- Product Links -->
<div>
<h3 class="font-semibold text-gray-900 dark:text-gray-100 mb-4">Product</h3>
<ul class="space-y-2">
<li><a href="#features" class="text-gray-600 dark:text-gray-400 hover:text-primary transition-colors">Features</a></li>
<li><a href="#how-it-works" class="text-gray-600 dark:text-gray-400 hover:text-primary transition-colors">How It Works</a></li>
<li><a href="https://demo.trackeep.org" target="_blank" class="text-gray-600 dark:text-gray-400 hover:text-primary transition-colors">Demo</a></li>
<li><a href="https://github.com/trackeep/trackeep/releases" target="_blank" class="text-gray-600 dark:text-gray-400 hover:text-primary transition-colors">Changelog</a></li>
</ul>
</div>
<!-- Resources Links -->
<div>
<h3 class="font-semibold text-gray-900 dark:text-gray-100 mb-4">Resources</h3>
<ul class="space-y-2">
<li><a href="https://docs.trackeep.org" target="_blank" class="text-gray-600 dark:text-gray-400 hover:text-primary transition-colors">Documentation</a></li>
<li><a href="https://github.com/trackeep/trackeep" target="_blank" class="text-gray-600 dark:text-gray-400 hover:text-primary transition-colors">GitHub</a></li>
<li><a href="https://discord.gg/trackeep" target="_blank" class="text-gray-600 dark:text-gray-400 hover:text-primary transition-colors">Discord</a></li>
<li><a href="mailto:[email protected]" class="text-gray-600 dark:text-gray-400 hover:text-primary transition-colors">Contact</a></li>
</ul>
</div>
</div>
<!-- Bottom Section -->
<div class="mt-8 pt-8 border-t border-gray-200 dark:border-gray-700">
<div class="flex flex-col md:flex-row justify-between items-center">
<div class="flex items-center space-x-6 mb-4 md:mb-0">
<a href="/privacy" class="text-gray-600 dark:text-gray-400 hover:text-primary transition-colors text-sm">Privacy Policy</a>
<a href="/terms" class="text-gray-600 dark:text-gray-400 hover:text-primary transition-colors text-sm">Terms of Service</a>
</div>
<div class="flex items-center space-x-4">
<a href="https://github.com/trackeep/trackeep" target="_blank" class="text-gray-600 dark:text-gray-400 hover:text-primary transition-colors">
<i class="ph ph-github-logo text-xl"></i>
</a>
<a href="https://discord.gg/trackeep" target="_blank" class="text-gray-600 dark:text-gray-400 hover:text-primary transition-colors">
<i class="ph ph-discord-logo text-xl"></i>
</a>
<a href="https://twitter.com/trackeep" target="_blank" class="text-gray-600 dark:text-gray-400 hover:text-primary transition-colors">
<i class="ph ph-twitter-logo text-xl"></i>
</a>
</div>
</div>
<div class="mt-4 text-center text-gray-600 dark:text-gray-400 text-sm">
© {{ currentYear }} Trackeep. All rights reserved. Built with and open source.
</div>
</div>
</div>
</footer>
</template>
<script setup lang="ts">
import { ref, computed } from 'vue'
const logoError = ref(false)
const currentYear = computed(() => new Date().getFullYear())
</script>
+98
View File
@@ -0,0 +1,98 @@
---
// Hero section with install command and CTAs
---
<section class="relative min-h-screen flex items-center justify-center bg-grid-pattern bg-grid-48 overflow-hidden">
<!-- Simple background -->
<div class="absolute inset-0 bg-gradient-to-b from-background to-background"></div>
<!-- Minimal particle field -->
<div class="particle-field">
<div class="particle" style="left: 10%; animation-delay: 0s; animation-duration: 20s;"></div>
<div class="particle" style="left: 30%; animation-delay: 2s; animation-duration: 25s;"></div>
<div class="particle" style="left: 50%; animation-delay: 1s; animation-duration: 22s;"></div>
<div class="particle" style="left: 70%; animation-delay: 3s; animation-duration: 18s;"></div>
<div class="particle" style="left: 90%; animation-delay: 2s; animation-duration: 24s;"></div>
</div>
<div class="relative z-10 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
<div class="max-w-5xl mx-auto">
<!-- Clean badge -->
<div class="inline-flex items-center px-6 py-3 rounded-full bg-primary/10 border border-primary/20 mb-8 animate-fade-in glass-effect">
<span class="w-3 h-3 bg-primary rounded-full mr-3 animate-pulse"></span>
<span class="text-sm font-bold text-primary">✨ Self-Hosted & Privacy-First</span>
</div>
<!-- Clean headline -->
<h1 class="text-5xl sm:text-6xl lg:text-7xl xl:text-8xl font-black text-foreground mb-8 leading-tight animate-fade-in">
<span class="block">Your Self-Hosted</span>
<span class="text-gradient">Productivity Hub</span>
</h1>
<!-- Clean subheading -->
<p class="text-2xl sm:text-3xl lg:text-4xl text-muted-foreground mb-12 max-w-4xl mx-auto leading-relaxed animate-fade-in">
Track, save, and organize everything that matters to you —
<span class="font-bold text-primary">all in one place</span>, under your control
</p>
<!-- Clean CTA Buttons -->
<div class="flex flex-col sm:flex-row items-center justify-center gap-6 mb-16 animate-fade-in">
<a href="https://demo.trackeep.org" target="_blank" rel="noopener" class="btn-primary">
Try Live Demo
<svg class="w-5 h-5 ml-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"></path>
</svg>
</a>
<a href="#install" class="btn-outline">
Quick Install
<svg class="w-5 h-5 ml-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"></path>
</svg>
</a>
</div>
<!-- Clean feature highlights -->
<div class="grid grid-cols-1 sm:grid-cols-3 gap-8 mb-20 animate-fade-in">
<div class="flex flex-col items-center justify-center space-y-4 text-muted-foreground">
<div class="w-12 h-12 bg-primary/10 rounded-2xl flex items-center justify-center">
<svg class="w-6 h-6 text-primary" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
</svg>
</div>
<span class="font-semibold text-lg text-primary">Privacy First</span>
<span class="text-sm text-center opacity-70">Your data stays yours</span>
</div>
<div class="flex flex-col items-center justify-center space-y-4 text-muted-foreground">
<div class="w-12 h-12 bg-primary/10 rounded-2xl flex items-center justify-center">
<svg class="w-6 h-6 text-primary" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
</svg>
</div>
<span class="font-semibold text-lg text-primary">Open Source</span>
<span class="text-sm text-center opacity-70">Transparent & customizable</span>
</div>
<div class="flex flex-col items-center justify-center space-y-4 text-muted-foreground">
<div class="w-12 h-12 bg-primary/10 rounded-2xl flex items-center justify-center">
<svg class="w-6 h-6 text-primary" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
</svg>
</div>
<span class="font-semibold text-lg text-primary">AI Powered</span>
<span class="text-sm text-center opacity-70">Smart recommendations</span>
</div>
</div>
</div>
</div>
<!-- Simple scroll indicator -->
<div class="absolute bottom-12 left-1/2 -translate-x-1/2 animate-bounce">
<a href="#install" class="text-muted-foreground hover:text-primary transition-all duration-300 flex flex-col items-center">
<span class="text-sm mb-3 font-medium">Get Started</span>
<div class="p-3 rounded-full bg-primary/10 hover:bg-primary/20 transition-colors">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 14l-7 7m0 0l-7-7m7 7V3"></path>
</svg>
</div>
</a>
</div>
</section>
+241
View File
@@ -0,0 +1,241 @@
---
// Mobile App Section Component
---
<section id="mobile-app" class="py-24 lg:py-40 bg-gradient-to-br from-background via-trackeep-purple/5 to-background relative overflow-hidden">
<div class="absolute inset-0 bg-grid-pattern bg-grid-48 opacity-5"></div>
<div class="gradient-blob bg-trackeep-purple w-[600px] h-[600px] top-20 right-20 animate-float parallax-slow"></div>
<div class="gradient-blob bg-trackeep-pink w-[400px] h-[400px] bottom-20 left-20 animate-float parallax-slow" style="animation-delay: 3s"></div>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="text-center mb-20">
<div class="inline-flex items-center px-6 py-3 rounded-full bg-gradient-to-r from-trackeep-purple/10 to-trackeep-pink/10 border border-trackeep-purple/20 mb-8 animate-fade-in glass-effect backdrop-blur-xl">
<span class="w-3 h-3 bg-gradient-to-r from-trackkeep-purple to-trackeep-pink rounded-full mr-3 animate-pulse"></span>
<span class="text-sm font-semibold text-trackeep-purple">Mobile First</span>
</div>
<h2 class="text-5xl sm:text-6xl lg:text-7xl font-black text-foreground mb-8 leading-tight">
<span class="block">Productivity</span>
<span class="gradient-text">On The Go</span>
</h2>
<p class="text-2xl lg:text-3xl text-muted-foreground max-w-4xl mx-auto leading-relaxed">
Native mobile apps for iOS and Android that sync seamlessly with your self-hosted instance
</p>
</div>
<!-- Mobile Features Grid -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center mb-16">
<!-- Features List -->
<div class="space-y-8">
<div class="group">
<div class="flex items-start space-x-4">
<div class="w-12 h-12 bg-trackkeep-purple/20 rounded-xl flex items-center justify-center flex-shrink-0 group-hover:scale-110 transition-transform">
<svg class="w-6 h-6 text-trackkeep-purple" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z"></path>
</svg>
</div>
<div>
<h3 class="text-xl font-bold text-foreground mb-2 group-hover:text-trackkeep-purple transition-colors">
Native Performance
</h3>
<p class="text-muted-foreground leading-relaxed">
Built with React Native for smooth, responsive performance on both iOS and Android devices.
</p>
</div>
</div>
</div>
<div class="group">
<div class="flex items-start space-x-4">
<div class="w-12 h-12 bg-trackkeep-pink/20 rounded-xl flex items-center justify-center flex-shrink-0 group-hover:scale-110 transition-transform">
<svg class="w-6 h-6 text-trackkeep-pink" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"></path>
</svg>
</div>
<div>
<h3 class="text-xl font-bold text-foreground mb-2 group-hover:text-trackkeep-pink transition-colors">
Real-time Sync
</h3>
<p class="text-muted-foreground leading-relaxed">
Your data stays in sync across all devices. Changes made on mobile instantly appear on web and vice versa.
</p>
</div>
</div>
</div>
<div class="group">
<div class="flex items-start space-x-4">
<div class="w-12 h-12 bg-trackkeep-blue/20 rounded-xl flex items-center justify-center flex-shrink-0 group-hover:scale-110 transition-transform">
<svg class="w-6 h-6 text-trackkeep-blue" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z"></path>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 13a3 3 0 11-6 0 3 3 0 016 0z"></path>
</svg>
</div>
<div>
<h3 class="text-xl font-bold text-foreground mb-2 group-hover:text-trackkeep-blue transition-colors">
Document Scanning
</h3>
<p class="text-muted-foreground leading-relaxed">
Capture documents, receipts, and notes with your camera. Automatic text extraction and organization.
</p>
</div>
</div>
</div>
<div class="group">
<div class="flex items-start space-x-4">
<div class="w-12 h-12 bg-trackkeep-green/20 rounded-xl flex items-center justify-center flex-shrink-0 group-hover:scale-110 transition-transform">
<svg class="w-6 h-6 text-trackkeep-green" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"></path>
</svg>
</div>
<div>
<h3 class="text-xl font-bold text-foreground mb-2 group-hover:text-trackkeep-green transition-colors">
Secure Authentication
</h3>
<p class="text-muted-foreground leading-relaxed">
Biometric authentication and secure token management keep your data safe even if your device is lost.
</p>
</div>
</div>
</div>
</div>
<!-- App Preview -->
<div class="relative">
<div class="glass-effect rounded-3xl p-8 border border-border/50">
<div class="aspect-[9/19] bg-gradient-to-br from-trackkeep-purple/10 to-trackkeep-pink/10 rounded-3xl border-2 border-border/30 relative overflow-hidden">
<!-- Phone Frame -->
<div class="absolute inset-0 flex flex-col">
<!-- Status Bar -->
<div class="bg-background/80 backdrop-blur-sm px-6 py-2 flex justify-between items-center border-b border-border/30">
<span class="text-xs font-medium">9:41</span>
<div class="flex space-x-1">
<div class="w-4 h-3 bg-foreground rounded-sm"></div>
<div class="w-4 h-3 bg-foreground rounded-sm"></div>
<div class="w-4 h-3 bg-foreground rounded-sm"></div>
</div>
</div>
<!-- App Content -->
<div class="flex-1 p-4 space-y-4">
<div class="text-center">
<div class="w-16 h-16 bg-gradient-to-br from-trackkeep-blue to-trackkeep-purple rounded-2xl mx-auto mb-2 flex items-center justify-center">
<svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14m-7-7v14"></path>
</svg>
</div>
<h3 class="font-bold text-foreground">Trackeep</h3>
<p class="text-xs text-muted-foreground">Your digital hub</p>
</div>
<!-- Mock Content -->
<div class="space-y-3">
<div class="bg-card/80 rounded-xl p-3 border border-border/30">
<div class="flex items-center space-x-3">
<div class="w-8 h-8 bg-trackkeep-blue/20 rounded-lg"></div>
<div class="flex-1">
<div class="h-3 bg-foreground/20 rounded w-3/4 mb-1"></div>
<div class="h-2 bg-foreground/10 rounded w-1/2"></div>
</div>
</div>
</div>
<div class="bg-card/80 rounded-xl p-3 border border-border/30">
<div class="flex items-center space-x-3">
<div class="w-8 h-8 bg-trackkeep-green/20 rounded-lg"></div>
<div class="flex-1">
<div class="h-3 bg-foreground/20 rounded w-2/3 mb-1"></div>
<div class="h-2 bg-foreground/10 rounded w-1/3"></div>
</div>
</div>
</div>
<div class="bg-card/80 rounded-xl p-3 border border-border/30">
<div class="flex items-center space-x-3">
<div class="w-8 h-8 bg-trackkeep-purple/20 rounded-lg"></div>
<div class="flex-1">
<div class="h-3 bg-foreground/20 rounded w-4/5 mb-1"></div>
<div class="h-2 bg-foreground/10 rounded w-2/3"></div>
</div>
</div>
</div>
</div>
<!-- Bottom Navigation -->
<div class="absolute bottom-0 left-0 right-0 bg-background/80 backdrop-blur-sm border-t border-border/30 px-4 py-2">
<div class="flex justify-around">
<div class="w-8 h-8 bg-trackkeep-blue rounded-lg"></div>
<div class="w-8 h-8 bg-muted rounded-lg"></div>
<div class="w-8 h-8 bg-muted rounded-lg"></div>
<div class="w-8 h-8 bg-muted rounded-lg"></div>
</div>
</div>
</div>
</div>
</div>
<!-- App Store Badges -->
<div class="flex justify-center space-x-4 mt-6">
<div class="bg-black/80 backdrop-blur-sm rounded-xl px-4 py-2 flex items-center space-x-2">
<svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24">
<path d="M17.05 20.28c-.98.95-2.05.88-3.08.38-1.09-.53-2.08-.48-3.24 0-1.44.62-2.2.44-3.06-.38C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z"/>
</svg>
<div class="text-white">
<div class="text-xs opacity-80">Download on the</div>
<div class="text-sm font-semibold">App Store</div>
</div>
</div>
<div class="bg-black/80 backdrop-blur-sm rounded-xl px-4 py-2 flex items-center space-x-2">
<svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24">
<path d="M3,20.5V3.5C3,2.91 3.34,2.39 3.84,2.15L13.69,12L3.84,21.85C3.34,21.61 3,21.09 3,20.5M16.81,15.12L6.05,21.34L14.54,12.85L16.81,15.12M20.16,10.81C20.5,11.08 20.75,11.5 20.75,12C20.75,12.5 20.53,12.9 20.18,13.18L17.89,14.5L15.39,12L17.89,9.5L20.16,10.81M6.05,2.66L16.81,8.88L14.54,11.15L6.05,2.66Z"/>
</svg>
<div class="text-white">
<div class="text-xs opacity-80">Get it on</div>
<div class="text-sm font-semibold">Google Play</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Tech Stack -->
<div class="glass-effect rounded-3xl p-8 border border-border/50">
<h3 class="text-2xl font-bold text-foreground mb-6 text-center">Mobile Technology Stack</h3>
<div class="grid grid-cols-2 md:grid-cols-4 gap-6">
<div class="text-center">
<div class="w-16 h-16 bg-gradient-to-br from-trackkeep-blue to-trackkeep-cyan rounded-2xl flex items-center justify-center mx-auto mb-3">
<span class="text-white font-bold text-sm">RN</span>
</div>
<h4 class="font-semibold text-foreground mb-1">React Native</h4>
<p class="text-xs text-muted-foreground">Cross-platform framework</p>
</div>
<div class="text-center">
<div class="w-16 h-16 bg-gradient-to-br from-trackkeep-purple to-trackkeep-pink rounded-2xl flex items-center justify-center mx-auto mb-3">
<svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 5l7 7-7 7M5 5l7 7-7 7"></path>
</svg>
</div>
<h4 class="font-semibold text-foreground mb-1">React Navigation</h4>
<p class="text-xs text-muted-foreground">Navigation & routing</p>
</div>
<div class="text-center">
<div class="w-16 h-16 bg-gradient-to-br from-trackkeep-green to-trackkeep-emerald rounded-2xl flex items-center justify-center mx-auto mb-3">
<svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"></path>
</svg>
</div>
<h4 class="font-semibold text-foreground mb-1">React Paper</h4>
<p class="text-xs text-muted-foreground">Material Design UI</p>
</div>
<div class="text-center">
<div class="w-16 h-16 bg-gradient-to-br from-trackkeep-orange to-trackkeep-orange/80 rounded-2xl flex items-center justify-center mx-auto mb-3">
<svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4"></path>
</svg>
</div>
<h4 class="font-semibold text-foreground mb-1">SQLite Storage</h4>
<p class="text-xs text-muted-foreground">Local data persistence</p>
</div>
</div>
</div>
</div>
</section>
+129
View File
@@ -0,0 +1,129 @@
---
// Navigation component with glassmorphism effect
---
<nav class="fixed top-0 left-0 right-0 z-50 glass-effect border-b border-border/30 shadow-xl transition-all duration-300">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex items-center justify-between h-20">
<!-- Enhanced Logo -->
<div class="flex items-center">
<a href="/" class="flex items-center space-x-4 group">
<div class="w-12 h-12 bg-gradient-to-br from-primary via-trackeep-blue to-trackeep-purple rounded-2xl flex items-center justify-center group-hover:rotate-12 group-hover:scale-110 transition-all duration-500 shadow-lg group-hover:shadow-glow border border-primary/20">
<svg class="w-7 h-7 text-primary-foreground group-hover:animate-pulse" fill="currentColor" viewBox="0 0 20 20">
<path d="M9 2a1 1 0 000 2h2a1 1 0 100-2H9z"/>
<path fill-rule="evenodd" d="M4 5a2 2 0 012-2 1 1 0 000 2H6a2 2 0 100 4h2a2 2 0 100-4h2a1 1 0 100-2 2 2 0 00-2 2v11a2 2 0 002 2h6a2 2 0 002-2V5a2 2 0 00-2-2H6z" clip-rule="evenodd"/>
</svg>
</div>
<span class="text-2xl font-black text-foreground group-hover:text-primary transition-colors gradient-text">Trackeep</span>
</a>
</div>
<!-- Enhanced Desktop Navigation -->
<div class="hidden lg:flex items-center space-x-10">
<a href="#features" class="nav-item-papra relative group font-semibold">
Features
<span class="absolute bottom-0 left-0 w-0 h-1 bg-gradient-to-r from-primary to-trackeep-purple transition-all duration-300 group-hover:w-full rounded-full"></span>
</a>
<a href="#ai-services" class="nav-item-papra relative group font-semibold">
AI Features
<span class="absolute bottom-0 left-0 w-0 h-1 bg-gradient-to-r from-primary to-trackeep-purple transition-all duration-300 group-hover:w-full rounded-full"></span>
</a>
<a href="#privacy" class="nav-item-papra relative group font-semibold">
Privacy
<span class="absolute bottom-0 left-0 w-0 h-1 bg-gradient-to-r from-primary to-trackeep-purple transition-all duration-300 group-hover:w-full rounded-full"></span>
</a>
<a href="#mobile-app" class="nav-item-papra relative group font-semibold">
Mobile
<span class="absolute bottom-0 left-0 w-0 h-1 bg-gradient-to-r from-primary to-trackeep-purple transition-all duration-300 group-hover:w-full rounded-full"></span>
</a>
<a href="#testimonials" class="nav-item-papra relative group font-semibold">
Testimonials
<span class="absolute bottom-0 left-0 w-0 h-1 bg-gradient-to-r from-primary to-trackeep-purple transition-all duration-300 group-hover:w-full rounded-full"></span>
</a>
<a href="https://demo.trackeep.org" target="_blank" rel="noopener" class="nav-item-papra relative group font-semibold">
Demo
<span class="absolute bottom-0 left-0 w-0 h-1 bg-gradient-to-r from-primary to-trackeep-purple transition-all duration-300 group-hover:w-full rounded-full"></span>
</a>
</div>
<!-- Enhanced Right side actions -->
<div class="flex items-center space-x-4">
<!-- Enhanced Social Links -->
<div class="hidden sm:flex items-center space-x-3">
<a href="https://github.com/Dvorinka/Trackeep" target="_blank" rel="noopener" class="p-3 rounded-xl text-muted-foreground hover:text-primary hover:bg-primary/10 transition-all duration-300 group hover:scale-110 hover:shadow-lg" aria-label="GitHub">
<svg class="w-6 h-6 group-hover:rotate-12 transition-transform" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
</svg>
</a>
<a href="https://discord.gg/trackeep" target="_blank" rel="noopener" class="p-3 rounded-xl text-muted-foreground hover:text-primary hover:bg-primary/10 transition-all duration-300 group hover:scale-110 hover:shadow-lg" aria-label="Discord">
<svg class="w-6 h-6 group-hover:rotate-12 transition-transform" fill="currentColor" viewBox="0 0 24 24">
<path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z"/>
</svg>
</a>
</div>
<!-- Enhanced CTA Button (hidden on mobile) -->
<a href="https://demo.trackeep.org" target="_blank" rel="noopener" class="hidden sm:flex btn-primary px-6 py-3 text-sm font-bold shadow-glow hover-lift rounded-xl bg-gradient-to-r from-primary to-trackeep-blue hover:from-trackeep-blue hover:to-primary transition-all duration-300 hover:scale-105">
Try Demo
</a>
<!-- Enhanced Mobile menu button -->
<button id="mobile-menu-button" class="lg:hidden p-3 rounded-xl bg-muted/50 hover:bg-muted/80 transition-all duration-300 hover:scale-110 hover:shadow-lg border border-border/30" aria-label="Toggle mobile menu">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path>
</svg>
</button>
</div>
</div>
<!-- Mobile Navigation -->
<div id="mobile-menu" class="hidden lg:hidden bg-background/95 backdrop-blur-xl border-t border-border/40">
<div class="px-2 pt-2 pb-3 space-y-1">
<a href="#features" class="block px-3 py-2 rounded-md text-base font-medium text-foreground hover:bg-muted hover:text-primary transition-colors">Features</a>
<a href="#ai-services" class="block px-3 py-2 rounded-md text-base font-medium text-foreground hover:bg-muted hover:text-primary transition-colors">AI Features</a>
<a href="#privacy" class="block px-3 py-2 rounded-md text-base font-medium text-foreground hover:bg-muted hover:text-primary transition-colors">Privacy</a>
<a href="#mobile-app" class="block px-3 py-2 rounded-md text-base font-medium text-foreground hover:bg-muted hover:text-primary transition-colors">Mobile</a>
<a href="#testimonials" class="block px-3 py-2 rounded-md text-base font-medium text-foreground hover:bg-muted hover:text-primary transition-colors">Testimonials</a>
<a href="https://demo.trackeep.org" target="_blank" rel="noopener" class="block px-3 py-2 rounded-md text-base font-medium text-foreground hover:bg-muted hover:text-primary transition-colors">Demo</a>
<div class="pt-2 border-t border-border/40">
<a href="https://demo.trackeep.org" target="_blank" rel="noopener" class="block mx-2 mb-2 btn-primary text-center shadow-glow">
Try Demo
</a>
<div class="flex justify-center space-x-4 px-2 py-2">
<a href="https://github.com/Dvorinka/Trackeep" target="_blank" rel="noopener" class="p-2 rounded-lg text-muted-foreground hover:text-primary hover:bg-primary/10 transition-all duration-300" aria-label="GitHub">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
</svg>
</a>
<a href="https://discord.gg/trackeep" target="_blank" rel="noopener" class="p-2 rounded-lg text-muted-foreground hover:text-primary hover:bg-primary/10 transition-all duration-300" aria-label="Discord">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z"/>
</svg>
</a>
</div>
</div>
</div>
</div>
</div>
</nav>
<script>
document.addEventListener('DOMContentLoaded', () => {
const mobileMenuButton = document.getElementById('mobile-menu-button');
const mobileMenu = document.getElementById('mobile-menu');
if (mobileMenuButton && mobileMenu) {
mobileMenuButton.addEventListener('click', () => {
mobileMenu.classList.toggle('hidden');
});
}
// Close mobile menu when clicking on links
const mobileLinks = mobileMenu?.querySelectorAll('a');
mobileLinks?.forEach(link => {
link.addEventListener('click', () => {
mobileMenu?.classList.add('hidden');
});
});
});
</script>
-93
View File
@@ -1,93 +0,0 @@
<template>
<nav class="sticky top-0 z-50 bg-white/95 dark:bg-gray-900/95 backdrop-blur-xl border-b border-gray-200/50 dark:border-gray-700/50 shadow-soft">
<div class="max-w-7xl mx-auto px-6 sm:px-8 lg:px-12">
<div class="flex justify-between items-center h-20">
<!-- Logo -->
<div class="flex items-center">
<div class="flex-shrink-0">
<img
src="/trackeep-logo-bg.png"
alt="Trackeep"
class="h-10 w-auto transition-papra hover:scale-105"
@error="(e: Event) => { const target = e.target as HTMLImageElement; target.style.display='none'; logoError = true }"
/>
<span v-if="logoError" class="text-3xl font-bold text-primary tracking-tight">Trackeep</span>
</div>
</div>
<!-- Desktop Navigation -->
<div class="hidden lg:block">
<div class="flex items-center space-x-12">
<a href="#features" @click="(e) => handleNavClick(e, 'features')" class="nav-item-papra text-lg">Features</a>
<a href="#how-it-works" @click="(e) => handleNavClick(e, 'how-it-works')" class="nav-item-papra text-lg">How It Works</a>
<a href="#tech-stack" @click="(e) => handleNavClick(e, 'tech-stack')" class="nav-item-papra text-lg">Tech Stack</a>
<a href="https://docs.trackeep.org" target="_blank" class="nav-item-papra text-lg">Docs</a>
<a href="https://github.com/trackeep/trackeep" target="_blank" class="nav-item-papra text-lg flex items-center gap-2">
<i class="ph ph-github-logo text-xl"></i>
GitHub
</a>
</div>
</div>
<!-- Theme Toggle & Mobile Menu Button -->
<div class="flex items-center space-x-4">
<button
@click="toggleTheme"
class="p-3 rounded-xl hover:bg-gray-100 dark:hover:bg-gray-800 transition-papra group"
:aria-label="isDark ? 'Switch to light mode' : 'Switch to dark mode'"
>
<i :class="isDark ? 'ph ph-sun' : 'ph ph-moon'" class="text-xl text-gray-600 dark:text-gray-400 group-hover:text-primary transition-colors"></i>
</button>
<!-- Mobile menu button -->
<button
@click="toggleMobileMenu"
class="lg:hidden p-3 rounded-xl hover:bg-gray-100 dark:hover:bg-gray-800 transition-papra"
:aria-label="isMobileMenuOpen ? 'Close menu' : 'Open menu'"
>
<i :class="isMobileMenuOpen ? 'ph ph-x' : 'ph ph-list'" class="text-xl text-gray-600 dark:text-gray-400"></i>
</button>
</div>
</div>
<!-- Mobile Navigation -->
<div v-if="isMobileMenuOpen" class="lg:hidden border-t border-gray-200 dark:border-gray-700 mt-4 pt-4">
<div class="space-y-3">
<a href="#features" @click="(e) => handleNavClick(e, 'features')" class="block px-4 py-3 text-lg nav-item-papra rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800">Features</a>
<a href="#how-it-works" @click="(e) => handleNavClick(e, 'how-it-works')" class="block px-4 py-3 text-lg nav-item-papra rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800">How It Works</a>
<a href="#tech-stack" @click="(e) => handleNavClick(e, 'tech-stack')" class="block px-4 py-3 text-lg nav-item-papra rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800">Tech Stack</a>
<a href="https://docs.trackeep.org" @click="closeMobileMenu" target="_blank" class="block px-4 py-3 text-lg nav-item-papra rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800">Docs</a>
<a href="https://github.com/trackeep/trackeep" @click="closeMobileMenu" target="_blank" class="block px-4 py-3 text-lg nav-item-papra rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 flex items-center gap-2">
<i class="ph ph-github-logo text-xl"></i>
GitHub
</a>
</div>
</div>
</div>
</nav>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { useTheme } from '../composables/useTheme'
import { useSmoothScroll } from '../composables/useSmoothScroll'
const { isDark, toggleTheme } = useTheme()
const { scrollToSection } = useSmoothScroll()
const isMobileMenuOpen = ref(false)
const logoError = ref(false)
const toggleMobileMenu = () => {
isMobileMenuOpen.value = !isMobileMenuOpen.value
}
const closeMobileMenu = () => {
isMobileMenuOpen.value = false
}
const handleNavClick = (event: Event, sectionId: string) => {
event.preventDefault()
scrollToSection(sectionId)
closeMobileMenu()
}
</script>
+221
View File
@@ -0,0 +1,221 @@
---
// Privacy & Self-Hosting Section Component
---
<section id="privacy" class="py-24 lg:py-40 bg-gradient-to-br from-background via-trackeep-green/5 to-background relative overflow-hidden">
<div class="absolute inset-0 bg-grid-pattern bg-grid-48 opacity-5"></div>
<div class="gradient-blob bg-trackeep-green w-[500px] h-[500px] top-10 left-10 animate-float parallax-slow"></div>
<div class="gradient-blob bg-trackeep-emerald w-[400px] h-[400px] bottom-10 right-10 animate-float parallax-slow" style="animation-delay: 2s"></div>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="text-center mb-20">
<div class="inline-flex items-center px-6 py-3 rounded-full bg-gradient-to-r from-trackeep-green/10 to-trackeep-emerald/10 border border-trackeep-green/20 mb-8 animate-fade-in glass-effect backdrop-blur-xl">
<span class="w-3 h-3 bg-gradient-to-r from-trackeep-green to-trackeep-emerald rounded-full mr-3 animate-pulse"></span>
<span class="text-sm font-semibold text-trackeep-green">Privacy First</span>
</div>
<h2 class="text-5xl sm:text-6xl lg:text-7xl font-black text-foreground mb-8 leading-tight">
<span class="block">Your Data</span>
<span class="gradient-text">Your Rules</span>
</h2>
<p class="text-2xl lg:text-3xl text-muted-foreground max-w-4xl mx-auto leading-relaxed">
Complete ownership and control over your digital life, with transparent open-source code you can trust
</p>
</div>
<!-- Privacy Features Grid -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 mb-16">
<!-- Self-Hosting Benefits -->
<div class="space-y-8">
<div class="group">
<div class="flex items-start space-x-4">
<div class="w-12 h-12 bg-trackeep-green/20 rounded-xl flex items-center justify-center flex-shrink-0 group-hover:scale-110 transition-transform">
<svg class="w-6 h-6 text-trackeep-green" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14m-7-7v14"></path>
</svg>
</div>
<div>
<h3 class="text-xl font-bold text-foreground mb-2 group-hover:text-trackeep-green transition-colors">
Fully Self-Hosted
</h3>
<p class="text-muted-foreground leading-relaxed">
No third-party servers required. Everything runs on your own infrastructure, giving you complete control over your data and systems.
</p>
</div>
</div>
</div>
<div class="group">
<div class="flex items-start space-x-4">
<div class="w-12 h-12 bg-trackeep-emerald/20 rounded-xl flex items-center justify-center flex-shrink-0 group-hover:scale-110 transition-transform">
<svg class="w-6 h-6 text-trackeep-emerald" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"></path>
</svg>
</div>
<div>
<h3 class="text-xl font-bold text-foreground mb-2 group-hover:text-trackeep-emerald transition-colors">
Data Ownership
</h3>
<p class="text-muted-foreground leading-relaxed">
Your data remains yours encrypted, controlled, and never leaves your systems. No data mining, no tracking, no selling your information.
</p>
</div>
</div>
</div>
<div class="group">
<div class="flex items-start space-x-4">
<div class="w-12 h-12 bg-trackeep-blue/20 rounded-xl flex items-center justify-center flex-shrink-0 group-hover:scale-110 transition-transform">
<svg class="w-6 h-6 text-trackeep-blue" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"></path>
</svg>
</div>
<div>
<h3 class="text-xl font-bold text-foreground mb-2 group-hover:text-trackeep-blue transition-colors">
Open Source
</h3>
<p class="text-muted-foreground leading-relaxed">
Transparent codebase you can audit, modify, and trust. No hidden code, no secret data collection everything is out in the open.
</p>
</div>
</div>
</div>
</div>
<!-- Technical Benefits -->
<div class="space-y-8">
<div class="group">
<div class="flex items-start space-x-4">
<div class="w-12 h-12 bg-trackeep-purple/20 rounded-xl flex items-center justify-center flex-shrink-0 group-hover:scale-110 transition-transform">
<svg class="w-6 h-6 text-trackeep-purple" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"></path>
</svg>
</div>
<div>
<h3 class="text-xl font-bold text-foreground mb-2 group-hover:text-trackeep-purple transition-colors">
API Access
</h3>
<p class="text-muted-foreground leading-relaxed">
Build custom applications on top of Trackeep with full API access. Integrate with your existing tools and workflows.
</p>
</div>
</div>
</div>
<div class="group">
<div class="flex items-start space-x-4">
<div class="w-12 h-12 bg-trackeep-orange/20 rounded-xl flex items-center justify-center flex-shrink-0 group-hover:scale-110 transition-transform">
<svg class="w-6 h-6 text-trackeep-orange" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"></path>
</svg>
</div>
<div>
<h3 class="text-xl font-bold text-foreground mb-2 group-hover:text-trackeep-orange transition-colors">
AI Control
</h3>
<p class="text-muted-foreground leading-relaxed">
Full control over which AI services (if any) you want to use. Disable all AI, use only local models, or mix and match cloud services.
</p>
</div>
</div>
</div>
<div class="group">
<div class="flex items-start space-x-4">
<div class="w-12 h-12 bg-trackeep-cyan/20 rounded-xl flex items-center justify-center flex-shrink-0 group-hover:scale-110 transition-transform">
<svg class="w-6 h-6 text-trackeep-cyan" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path>
</svg>
</div>
<div>
<h3 class="text-xl font-bold text-foreground mb-2 group-hover:text-trackeep-cyan transition-colors">
High Performance
</h3>
<p class="text-muted-foreground leading-relaxed">
Optimized for self-hosting with efficient resource usage. Runs smoothly on modest hardware while maintaining excellent performance.
</p>
</div>
</div>
</div>
</div>
</div>
<!-- Deployment Options -->
<div class="glass-effect rounded-3xl p-8 border border-border/50">
<h3 class="text-2xl font-bold text-foreground mb-6 text-center">Flexible Deployment Options</h3>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<div class="text-center p-6 rounded-2xl bg-card/50 border border-border/30">
<div class="w-16 h-16 bg-gradient-to-br from-trackeep-blue to-trackeep-cyan rounded-2xl flex items-center justify-center mx-auto mb-4">
<svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14m-7-7v14"></path>
</svg>
</div>
<h4 class="font-bold text-foreground mb-2">Quick Start</h4>
<p class="text-sm text-muted-foreground mb-4">Docker Compose setup in minutes with pre-configured services</p>
<code class="text-xs bg-muted px-2 py-1 rounded">docker compose up -d</code>
</div>
<div class="text-center p-6 rounded-2xl bg-card/50 border border-border/30">
<div class="w-16 h-16 bg-gradient-to-br from-trackeep-green to-trackeep-emerald rounded-2xl flex items-center justify-center mx-auto mb-4">
<svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"></path>
</svg>
</div>
<h4 class="font-bold text-foreground mb-2">Production Ready</h4>
<p class="text-sm text-muted-foreground mb-4">Scalable deployment with load balancing and monitoring</p>
<code class="text-xs bg-muted px-2 py-1 rounded">docker-compose.prod.yml</code>
</div>
<div class="text-center p-6 rounded-2xl bg-card/50 border border-border/30">
<div class="w-16 h-16 bg-gradient-to-br from-trackeep-purple to-trackeep-pink rounded-2xl flex items-center justify-center mx-auto mb-4">
<svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"></path>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
</svg>
</div>
<h4 class="font-bold text-foreground mb-2">Custom Setup</h4>
<p class="text-sm text-muted-foreground mb-4">Manual configuration for specific requirements and environments</p>
<code class="text-xs bg-muted px-2 py-1 rounded">Custom deployment</code>
</div>
</div>
</div>
<!-- Trust Badges -->
<div class="mt-16 grid grid-cols-2 md:grid-cols-4 gap-8">
<div class="text-center">
<div class="w-16 h-16 bg-trackeep-green/10 rounded-2xl flex items-center justify-center mx-auto mb-3">
<svg class="w-8 h-8 text-trackeep-green" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"></path>
</svg>
</div>
<h4 class="font-semibold text-foreground mb-1">GDPR Compliant</h4>
<p class="text-xs text-muted-foreground">Privacy by design</p>
</div>
<div class="text-center">
<div class="w-16 h-16 bg-trackeep-blue/10 rounded-2xl flex items-center justify-center mx-auto mb-3">
<svg class="w-8 h-8 text-trackeep-blue" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"></path>
</svg>
</div>
<h4 class="font-semibold text-foreground mb-1">End-to-End Encrypted</h4>
<p class="text-xs text-muted-foreground">Secure by default</p>
</div>
<div class="text-center">
<div class="w-16 h-16 bg-trackeep-purple/10 rounded-2xl flex items-center justify-center mx-auto mb-3">
<svg class="w-8 h-8 text-trackeep-purple" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"></path>
</svg>
</div>
<h4 class="font-semibold text-foreground mb-1">Open Source</h4>
<p class="text-xs text-muted-foreground">Fully transparent</p>
</div>
<div class="text-center">
<div class="w-16 h-16 bg-trackeep-orange/10 rounded-2xl flex items-center justify-center mx-auto mb-3">
<svg class="w-8 h-8 text-trackeep-orange" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"></path>
</svg>
</div>
<h4 class="font-semibold text-foreground mb-1">Community Driven</h4>
<p class="text-xs text-muted-foreground">Built together</p>
</div>
</div>
</div>
</section>
+160
View File
@@ -0,0 +1,160 @@
---
// Enhanced QuickInstall component with terminal styling and animations
---
<section id="quick-install" class="py-20 lg:py-32 bg-gradient-to-b from-background via-card/30 to-background relative overflow-hidden">
<!-- Background decoration -->
<div class="absolute inset-0 bg-grid-pattern bg-grid-48 opacity-20"></div>
<div class="gradient-blob bg-primary w-[400px] h-[400px] top-10 right-10 animate-float parallax-slow"></div>
<div class="gradient-blob bg-trackeep-purple w-[350px] h-[350px] bottom-10 left-10 animate-float parallax-slow" style="animation-delay: 3s"></div>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<!-- Section header -->
<div class="text-center mb-16">
<div class="inline-flex items-center px-6 py-3 rounded-full bg-gradient-to-r from-primary/10 to-trackeep-purple/10 border border-primary/20 mb-8 animate-fade-in glass-effect backdrop-blur-xl hover-lift group cursor-pointer glow-border">
<span class="w-3 h-3 bg-gradient-to-r from-primary to-trackeep-purple rounded-full mr-3 animate-pulse shadow-glow"></span>
<span class="text-sm font-semibold text-primary text-shimmer">Quick Install</span>
<svg class="w-4 h-4 ml-2 text-primary opacity-0 group-hover:opacity-100 transition-all duration-300 group-hover:translate-x-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/>
</svg>
</div>
<h2 class="text-5xl sm:text-6xl lg:text-7xl font-black text-foreground mb-8 leading-tight animate-fade-in">
<span class="block">Get Started in</span>
<span class="gradient-text animate-glow text-shadow-glow text-shimmer">Seconds</span>
</h2>
<p class="text-2xl lg:text-3xl text-muted-foreground max-w-5xl mx-auto leading-relaxed animate-slide-up font-medium" style="animation-delay: 0.1s">
One command is all it takes to deploy Trackkeep on your own infrastructure.
</p>
</div>
<!-- Enhanced terminal box -->
<div class="max-w-4xl mx-auto animate-scale-in" style="animation-delay: 0.2s">
<div class="feature-card group cursor-pointer scroll-reveal hover-3d glow-border">
<!-- Enhanced terminal header -->
<div class="flex items-center justify-between px-6 py-4 bg-gradient-to-r from-gray-900/90 to-gray-800/90 backdrop-blur-xl border-b border-gray-700/50 rounded-t-2xl">
<div class="flex items-center space-x-3">
<div class="flex space-x-2">
<div class="w-3 h-3 bg-red-500 rounded-full hover:bg-red-600 transition-colors cursor-pointer shadow-glow-red"></div>
<div class="w-3 h-3 bg-yellow-500 rounded-full hover:bg-yellow-600 transition-colors cursor-pointer shadow-glow-yellow"></div>
<div class="w-3 h-3 bg-green-500 rounded-full hover:bg-green-600 transition-colors cursor-pointer shadow-glow-green"></div>
</div>
<div class="flex items-center space-x-2 text-gray-400">
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7v8a2 2 0 002 2h6M2 8a2 2 0 012-2h6l2 2h6a2 2 0 012 2v8a2 2 0 01-2 2H4a2 2 0 01-2-2V8z"/>
</svg>
<span class="text-sm font-mono">terminal</span>
</div>
</div>
<div class="flex items-center space-x-2">
<div class="w-2 h-2 bg-green-500 rounded-full animate-pulse shadow-glow-green"></div>
<span class="text-xs text-green-400 font-mono">connected</span>
</div>
</div>
<!-- Terminal content -->
<div class="p-6 bg-gradient-to-br from-gray-900/80 to-gray-800/80 backdrop-blur-sm">
<div class="font-mono text-sm space-y-4">
<!-- Command line with enhanced styling -->
<div class="flex items-center space-x-3 group">
<span class="text-gray-400">$</span>
<code class="flex-1 text-green-400 animate-text-glow" id="install-command">
curl -sSL https://trackeep.org/install.sh | sh
</code>
<!-- Enhanced copy button with magnetic effect -->
<button
id="copy-button"
class="ml-6 px-4 py-3 bg-gradient-to-r from-gray-700/50 to-gray-600/50 hover:from-gray-600/50 hover:to-gray-500/50 text-gray-200 text-sm rounded-xl transition-all duration-300 flex items-center space-x-2 border border-gray-600/50 hover:border-gray-500/50 backdrop-blur-sm hover-lift group magnetic-button glow-border hover:shadow-glow"
aria-label="Copy command"
>
<svg id="copy-icon" class="w-5 h-5 group-hover:scale-110 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"/>
</svg>
<span id="copy-text" class="font-medium">Copy</span>
<svg id="check-icon" class="w-5 h-5 hidden" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/>
</svg>
</button>
</div>
<!-- Animated terminal output preview -->
<div class="mt-4 space-y-2 animate-slide-up" style="animation-delay: 0.5s">
<div class="text-gray-500 animate-typing">
<span class="text-blue-400">[INFO]</span> Downloading Trackkeep installer...
</div>
<div class="text-gray-500 animate-typing" style="animation-delay: 1s">
<span class="text-green-400">[SUCCESS]</span> Installation completed successfully!
</div>
<div class="text-gray-500 animate-typing" style="animation-delay: 2s">
<span class="text-yellow-400">[INFO]</span> Starting Trackkeep dashboard...
</div>
<div class="text-gray-500 animate-typing" style="animation-delay: 3s">
<span class="text-green-400">[READY]</span> Trackkeep is running at http://localhost:3000
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Enhanced social proof buttons -->
<div class="mt-12 text-center animate-slide-up" style="animation-delay: 0.8s">
<div class="inline-flex items-center justify-center p-8 rounded-2xl bg-card/50 backdrop-blur-sm border border-border/50">
<div class="text-center mb-6">
<h3 class="text-2xl font-semibold text-foreground mb-4">
Join the Community
</h3>
<p class="text-muted-foreground mb-6 max-w-md">
Get help, share ideas, and connect with other Trackkeep users.
</p>
</div>
<div class="flex flex-col sm:flex-row items-center justify-center gap-4">
<a href="https://github.com/Dvorinka/Trackeep" target="_blank" rel="noopener" class="btn-outline px-6 py-3 backdrop-blur-sm hover-lift group magnetic-button glow-border hover:shadow-glow-blue">
<svg class="w-5 h-5 mr-2 group-hover:rotate-12 transition-transform" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
</svg>
GitHub
</a>
<a href="https://discord.gg/trackeep" target="_blank" rel="noopener" class="btn-outline px-6 py-3 backdrop-blur-sm hover-lift group magnetic-button glow-border hover:shadow-glow-purple">
<svg class="w-5 h-5 mr-2 group-hover:rotate-12 transition-transform" fill="currentColor" viewBox="0 0 24 24">
<path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.268 18.268 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078.0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.13 10.2 10.2 0 0 0 1.872-.892.077.077 0 0 1 .041-.106c.36.698.772 1.363 1.225 1.993a.076.076 0 0 0 .083.028 19.9 19.9 0 0 0 6.003-3.03.077.077 0 0 0 .032-.054c.465-4.94-.838-9.462-3.548-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z"/>
</svg>
Discord
</a>
</div>
</div>
</div>
</div>
</section>
<script>
const copyButton = document.getElementById('copy-button');
const copyIcon = document.getElementById('copy-icon');
const checkIcon = document.getElementById('check-icon');
const copyText = document.getElementById('copy-text');
const command = 'curl -sSL https://trackeep.org/install.sh | sh';
copyButton?.addEventListener('click', async () => {
try {
await navigator.clipboard.writeText(command);
// Show success state
copyIcon?.classList.add('hidden');
checkIcon?.classList.remove('hidden');
if (copyText) copyText.textContent = 'Copied!';
copyButton.classList.add('bg-green-600/50', 'hover:bg-green-700/50', 'border-green-500/50');
copyButton.classList.remove('bg-gray-700/50', 'hover:bg-gray-600/50', 'border-gray-600/50');
// Reset after 2 seconds
setTimeout(() => {
copyIcon?.classList.remove('hidden');
checkIcon?.classList.add('hidden');
if (copyText) copyText.textContent = 'Copy';
copyButton.classList.remove('bg-green-600/50', 'hover:bg-green-700/50', 'border-green-500/50');
copyButton.classList.add('bg-gray-700/50', 'hover:bg-gray-600/50', 'border-gray-600/50');
}, 2000);
} catch (err) {
console.error('Failed to copy text: ', err);
}
});
</script>
-134
View File
@@ -1,134 +0,0 @@
<template>
<div class="card-papra max-w-4xl mx-auto lg:mx-0 border-2 border-primary/20">
<div class="mb-8">
<h3 class="text-2xl font-bold text-gray-900 dark:text-gray-100 mb-3 tracking-tight">Quick Install</h3>
<p class="text-lg text-gray-600 dark:text-gray-400 leading-relaxed">Get Trackeep running in seconds with one command</p>
</div>
<!-- Command Box -->
<div class="relative bg-gray-900 dark:bg-black border border-gray-700 dark:border-gray-600 rounded-2xl p-6 mb-8 shadow-strong">
<div class="flex items-center justify-between mb-3">
<div class="flex items-center space-x-2">
<div class="w-3 h-3 rounded-full bg-red-500"></div>
<div class="w-3 h-3 rounded-full bg-yellow-500"></div>
<div class="w-3 h-3 rounded-full bg-green-500"></div>
</div>
<span class="text-xs text-gray-400 font-mono">terminal</span>
</div>
<code class="text-lg font-mono text-green-400 break-leading-relaxed block">
$ curl -sSL https://trackeep.org/install.sh | sh
</code>
<!-- Copy Button -->
<button
@click="copyCommand"
class="absolute top-6 right-6 p-3 bg-gray-800 hover:bg-gray-700 rounded-xl transition-papra group"
:aria-label="copied ? 'Copied!' : 'Copy command'"
>
<i :class="copied ? 'ph ph-check text-green-400' : 'ph ph-copy text-gray-400 group-hover:text-white'" class="text-xl transition-colors"></i>
</button>
</div>
<!-- Success Message -->
<div v-if="copied" class="bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-2xl p-4 mb-8 shadow-soft">
<p class="text-green-800 dark:text-green-200 font-medium flex items-center">
<i class="ph ph-check-circle mr-2 text-xl"></i>
Command copied to clipboard! Ready to install Trackeep.
</p>
</div>
<!-- Social Proof Buttons -->
<div class="flex flex-wrap gap-4 mb-8">
<a
href="https://github.com/trackeep/trackeep"
target="_blank"
class="flex items-center gap-3 px-6 py-3 bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-xl hover:bg-gray-100 dark:hover:bg-gray-700 transition-papra group"
>
<i class="ph ph-github-logo text-xl text-gray-600 dark:text-gray-400 group-hover:text-primary transition-colors"></i>
<span class="font-medium text-gray-700 dark:text-gray-300">View Source</span>
</a>
<a
href="https://discord.gg/trackeep"
target="_blank"
class="flex items-center gap-3 px-6 py-3 bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-xl hover:bg-gray-100 dark:hover:bg-gray-700 transition-papra group"
>
<i class="ph ph-discord-logo text-xl text-gray-600 dark:text-gray-400 group-hover:text-primary transition-colors"></i>
<span class="font-medium text-gray-700 dark:text-gray-300">Join Discord</span>
</a>
<a
href="https://docs.trackeep.org"
target="_blank"
class="flex items-center gap-3 px-6 py-3 bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-xl hover:bg-gray-100 dark:hover:bg-gray-700 transition-papra group"
>
<i class="ph ph-book text-xl text-gray-600 dark:text-gray-400 group-hover:text-primary transition-colors"></i>
<span class="font-medium text-gray-700 dark:text-gray-300">Documentation</span>
</a>
</div>
<!-- Installation Info -->
<div class="bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-2xl p-6">
<div class="flex items-start gap-3">
<div class="bg-blue-100 dark:bg-blue-900/50 text-blue-600 dark:text-blue-400 p-2 rounded-lg">
<i class="ph ph-info text-xl"></i>
</div>
<div class="text-sm text-gray-700 dark:text-gray-300">
<p class="font-semibold mb-3 text-gray-900 dark:text-gray-100">The install script will:</p>
<ul class="space-y-2 ml-4">
<li class="flex items-start gap-2">
<i class="ph ph-check-circle text-green-500 mt-0.5 flex-shrink-0"></i>
<span>Check system requirements (Docker, Docker Compose)</span>
</li>
<li class="flex items-start gap-2">
<i class="ph ph-check-circle text-green-500 mt-0.5 flex-shrink-0"></i>
<span>Download the latest Trackeep release</span>
</li>
<li class="flex items-start gap-2">
<i class="ph ph-check-circle text-green-500 mt-0.5 flex-shrink-0"></i>
<span>Set up environment variables and database</span>
</li>
<li class="flex items-start gap-2">
<i class="ph ph-check-circle text-green-500 mt-0.5 flex-shrink-0"></i>
<span>Start all services and provide access URLs</span>
</li>
</ul>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const copied = ref(false)
const copyCommand = async () => {
const command = 'curl -sSL https://trackeep.org/install.sh | sh'
try {
await navigator.clipboard.writeText(command)
copied.value = true
// Reset after 3 seconds
setTimeout(() => {
copied.value = false
}, 3000)
} catch (err) {
// Fallback for older browsers
const textArea = document.createElement('textarea')
textArea.value = command
document.body.appendChild(textArea)
textArea.select()
document.execCommand('copy')
document.body.removeChild(textArea)
copied.value = true
setTimeout(() => {
copied.value = false
}, 3000)
}
}
</script>
@@ -0,0 +1,228 @@
---
// Tech Stack section with logos
---
<section class="py-20 lg:py-32 bg-gradient-to-b from-background via-card/30 to-background relative overflow-hidden">
<div class="absolute inset-0 bg-grid-pattern bg-grid-48 opacity-3"></div>
<!-- Minimal particle field -->
<div class="particle-field">
<div class="particle" style="left: 15%; animation-delay: 0s; animation-duration: 21s;"></div>
<div class="particle" style="left: 40%; animation-delay: 2s; animation-duration: 24s;"></div>
<div class="particle" style="left: 65%; animation-delay: 1s; animation-duration: 20s;"></div>
<div class="particle" style="left: 85%; animation-delay: 3s; animation-duration: 22s;"></div>
</div>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<!-- Section header -->
<div class="text-center mb-16">
<div class="inline-flex items-center px-6 py-3 rounded-full bg-primary/10 border border-primary/20 mb-8 animate-fade-in glass-effect">
<span class="w-3 h-3 bg-primary rounded-full mr-3 animate-pulse"></span>
<span class="text-sm font-semibold text-primary">Technology Stack</span>
</div>
<h2 class="text-4xl sm:text-5xl lg:text-6xl font-black text-foreground mb-8 leading-tight">
Built with <span class="gradient-text">Modern Tech</span>
</h2>
<p class="text-xl lg:text-2xl text-muted-foreground max-w-4xl mx-auto leading-relaxed">
Trackeep is built on a foundation of proven, scalable technologies that ensure reliability, performance, and security.
</p>
</div>
<!-- Tech stack categories -->
<div class="space-y-16">
<!-- Frontend Stack -->
<div class="glass-effect rounded-3xl p-8 border border-border/50">
<h3 class="text-2xl font-bold text-foreground mb-8 text-center flex items-center justify-center">
<svg class="w-8 h-8 mr-3 text-trackkeep-blue" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>
</svg>
Frontend
</h3>
<div class="grid grid-cols-2 md:grid-cols-4 gap-6">
<div class="text-center group">
<div class="w-16 h-16 bg-gradient-to-br from-blue-500 to-cyan-600 rounded-2xl flex items-center justify-center mx-auto mb-3 group-hover:scale-110 transition-transform shadow-lg">
<span class="text-xl font-bold text-white">SJS</span>
</div>
<h4 class="font-semibold text-foreground mb-1">SolidJS</h4>
<p class="text-xs text-muted-foreground">Reactive UI framework</p>
</div>
<div class="text-center group">
<div class="w-16 h-16 bg-gradient-to-br from-green-500 to-teal-600 rounded-2xl flex items-center justify-center mx-auto mb-3 group-hover:scale-110 transition-transform shadow-lg">
<span class="text-xl font-bold text-white">V</span>
</div>
<h4 class="font-semibold text-foreground mb-1">Vite</h4>
<p class="text-xs text-muted-foreground">Lightning builds</p>
</div>
<div class="text-center group">
<div class="w-16 h-16 bg-gradient-to-br from-orange-500 to-red-600 rounded-2xl flex items-center justify-center mx-auto mb-3 group-hover:scale-110 transition-transform shadow-lg">
<span class="text-xl font-bold text-white">UC</span>
</div>
<h4 class="font-semibold text-foreground mb-1">UnoCSS</h4>
<p class="text-xs text-muted-foreground">Atomic CSS</p>
</div>
<div class="text-center group">
<div class="w-16 h-16 bg-gradient-to-br from-purple-500 to-indigo-600 rounded-2xl flex items-center justify-center mx-auto mb-3 group-hover:scale-110 transition-transform shadow-lg">
<span class="text-xl font-bold text-white">KB</span>
</div>
<h4 class="font-semibold text-foreground mb-1">Kobalte</h4>
<p class="text-xs text-muted-foreground">Components</p>
</div>
</div>
</div>
<!-- Backend Stack -->
<div class="glass-effect rounded-3xl p-8 border border-border/50">
<h3 class="text-2xl font-bold text-foreground mb-8 text-center flex items-center justify-center">
<svg class="w-8 h-8 mr-3 text-trackkeep-green" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01"></path>
</svg>
Backend
</h3>
<div class="grid grid-cols-2 md:grid-cols-4 gap-6">
<div class="text-center group">
<div class="w-16 h-16 bg-gradient-to-br from-cyan-500 to-blue-600 rounded-2xl flex items-center justify-center mx-auto mb-3 group-hover:scale-110 transition-transform shadow-lg">
<span class="text-xl font-bold text-white">Go</span>
</div>
<h4 class="font-semibold text-foreground mb-1">Go</h4>
<p class="text-xs text-muted-foreground">High-performance</p>
</div>
<div class="text-center group">
<div class="w-16 h-16 bg-gradient-to-br from-blue-600 to-indigo-700 rounded-2xl flex items-center justify-center mx-auto mb-3 group-hover:scale-110 transition-transform shadow-lg">
<span class="text-xl font-bold text-white">PG</span>
</div>
<h4 class="font-semibold text-foreground mb-1">PostgreSQL</h4>
<p class="text-xs text-muted-foreground">Database</p>
</div>
<div class="text-center group">
<div class="w-16 h-16 bg-gradient-to-br from-green-600 to-emerald-700 rounded-2xl flex items-center justify-center mx-auto mb-3 group-hover:scale-110 transition-transform shadow-lg">
<span class="text-xl font-bold text-white">G</span>
</div>
<h4 class="font-semibold text-foreground mb-1">Gin</h4>
<p class="text-xs text-muted-foreground">Web framework</p>
</div>
<div class="text-center group">
<div class="w-16 h-16 bg-gradient-to-br from-purple-600 to-pink-700 rounded-2xl flex items-center justify-center mx-auto mb-3 group-hover:scale-110 transition-transform shadow-lg">
<span class="text-xl font-bold text-white">G</span>
</div>
<h4 class="font-semibold text-foreground mb-1">GORM</h4>
<p class="text-xs text-muted-foreground">ORM</p>
</div>
</div>
</div>
<!-- Mobile & DevOps -->
<div class="glass-effect rounded-3xl p-8 border border-border/50">
<h3 class="text-2xl font-bold text-foreground mb-8 text-center flex items-center justify-center">
<svg class="w-8 h-8 mr-3 text-trackkeep-purple" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z"></path>
</svg>
Mobile & DevOps
</h3>
<div class="grid grid-cols-2 md:grid-cols-4 gap-6">
<div class="text-center group">
<div class="w-16 h-16 bg-gradient-to-br from-purple-500 to-pink-600 rounded-2xl flex items-center justify-center mx-auto mb-3 group-hover:scale-110 transition-transform shadow-lg">
<span class="text-xl font-bold text-white">RN</span>
</div>
<h4 class="font-semibold text-foreground mb-1">React Native</h4>
<p class="text-xs text-muted-foreground">Mobile apps</p>
</div>
<div class="text-center group">
<div class="w-16 h-16 bg-gradient-to-br from-blue-500 to-cyan-600 rounded-2xl flex items-center justify-center mx-auto mb-3 group-hover:scale-110 transition-transform shadow-lg">
<span class="text-xl font-bold text-white">D</span>
</div>
<h4 class="font-semibold text-foreground mb-1">Docker</h4>
<p class="text-xs text-muted-foreground">Containers</p>
</div>
<div class="text-center group">
<div class="w-16 h-16 bg-gradient-to-br from-orange-500 to-yellow-600 rounded-2xl flex items-center justify-center mx-auto mb-3 group-hover:scale-110 transition-transform shadow-lg">
<span class="text-xl font-bold text-white">GH</span>
</div>
<h4 class="font-semibold text-foreground mb-1">GitHub Actions</h4>
<p class="text-xs text-muted-foreground">CI/CD</p>
</div>
<div class="text-center group">
<div class="w-16 h-16 bg-gradient-to-br from-green-500 to-teal-600 rounded-2xl flex items-center justify-center mx-auto mb-3 group-hover:scale-110 transition-transform shadow-lg">
<span class="text-xl font-bold text-white">DC</span>
</div>
<h4 class="font-semibold text-foreground mb-1">Docker Compose</h4>
<p class="text-xs text-muted-foreground">Orchestration</p>
</div>
</div>
</div>
</div>
<!-- Architecture highlights -->
<div class="mt-16 grid grid-cols-1 lg:grid-cols-2 gap-8">
<div class="glass-effect rounded-2xl p-6 border border-border/50">
<h3 class="text-xl font-bold text-foreground mb-4 flex items-center">
<svg class="w-6 h-6 mr-2 text-trackkeep-green" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path>
</svg>
Performance First
</h3>
<ul class="space-y-3 text-muted-foreground">
<li class="flex items-start">
<svg class="w-5 h-5 text-trackkeep-green mr-2 mt-0.5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
</svg>
<span>Sub-second page loads with static generation</span>
</li>
<li class="flex items-start">
<svg class="w-5 h-5 text-trackkeep-green mr-2 mt-0.5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
</svg>
<span>Optimized database queries and caching</span>
</li>
<li class="flex items-start">
<svg class="w-5 h-5 text-trackkeep-green mr-2 mt-0.5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
</svg>
<span>CDN delivery for global performance</span>
</li>
</ul>
</div>
<div class="glass-effect rounded-2xl p-6 border border-border/50">
<h3 class="text-xl font-bold text-foreground mb-4 flex items-center">
<svg class="w-6 h-6 mr-2 text-trackkeep-blue" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"></path>
</svg>
Enterprise Ready
</h3>
<ul class="space-y-3 text-muted-foreground">
<li class="flex items-start">
<svg class="w-5 h-5 text-trackkeep-blue mr-2 mt-0.5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
</svg>
<span>Horizontal scaling with microservices</span>
</li>
<li class="flex items-start">
<svg class="w-5 h-5 text-trackkeep-blue mr-2 mt-0.5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
</svg>
<span>High availability with automatic failover</span>
</li>
<li class="flex items-start">
<svg class="w-5 h-5 text-trackkeep-blue mr-2 mt-0.5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
</svg>
<span>Comprehensive monitoring and logging</span>
</li>
</ul>
</div>
</div>
<!-- Open source emphasis -->
<div class="mt-16 text-center">
<div class="inline-flex items-center space-x-2 bg-trackkeep-blue/10 text-trackkeep-blue px-6 py-3 rounded-full glass-effect backdrop-blur-sm border border-trackkeep-blue/20">
<svg class="w-6 h-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
</svg>
<span class="font-bold">100% Open Source</span>
</div>
<p class="text-muted-foreground mt-4 max-w-2xl mx-auto text-lg">
Every component of Trackeep is open source. Inspect the code, contribute improvements, or deploy it your way.
</p>
</div>
</div>
</section>
@@ -0,0 +1,198 @@
---
// Testimonials section with social proof
---
<section id="testimonials" class="py-20 lg:py-32 bg-gradient-to-b from-background via-card/30 to-background relative overflow-hidden">
<!-- Enhanced Background decoration -->
<div class="absolute inset-0 bg-grid-pattern bg-grid-48 opacity-20"></div>
<div class="gradient-blob bg-primary w-[400px] h-[400px] top-10 right-10 animate-float parallax-slow"></div>
<div class="gradient-blob bg-trackeep-purple w-[350px] h-[350px] bottom-10 left-10 animate-float parallax-slow" style="animation-delay: 3s"></div>
<div class="gradient-blob bg-trackeep-green w-[300px] h-[300px] top-1/2 right-1/4 animate-float parallax-slow" style="animation-delay: 1.5s"></div>
<div class="gradient-blob bg-trackeep-blue w-[250px] h-[250px] bottom-1/3 left-1/4 animate-float parallax-slow" style="animation-delay: 2.5s"></div>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<!-- Enhanced Section header with shimmer effects -->
<div class="text-center mb-20">
<div class="inline-flex items-center px-6 py-3 rounded-full bg-gradient-to-r from-primary/10 to-trackeep-purple/10 border border-primary/20 mb-8 animate-fade-in glass-effect backdrop-blur-xl hover-lift group cursor-pointer glow-border">
<span class="w-3 h-3 bg-gradient-to-r from-primary to-trackeep-purple rounded-full mr-3 animate-pulse shadow-glow"></span>
<span class="text-sm font-semibold text-primary text-shimmer">Social Proof</span>
<svg class="w-4 h-4 ml-2 text-primary opacity-0 group-hover:opacity-100 transition-all duration-300 group-hover:translate-x-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/>
</svg>
</div>
<h2 class="text-5xl sm:text-6xl lg:text-7xl font-black text-foreground mb-8 leading-tight animate-fade-in">
<span class="block">Loved by</span>
<span class="gradient-text animate-glow text-shadow-glow text-shimmer">Developers & Teams</span>
</h2>
<p class="text-2xl lg:text-3xl text-muted-foreground max-w-5xl mx-auto leading-relaxed animate-slide-up font-medium" style="animation-delay: 0.1s">
Join thousands of users who have transformed their productivity with Trackkeep. Here's what they have to say.
</p>
</div>
<!-- Enhanced Testimonials grid with 3D effects -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-10 stagger-animation">
<!-- Testimonial 1 -->
<div class="feature-card group cursor-pointer animate-scale-in scroll-reveal hover-3d glow-border" style="animation-delay: 0.2s">
<div class="relative z-10">
<div class="flex items-center mb-6">
<div class="w-14 h-14 bg-gradient-to-br from-blue-500 to-purple-600 rounded-full flex items-center justify-center text-white font-semibold text-lg group-hover:scale-110 group-hover:rotate-6 transition-all duration-500 group-hover:shadow-glow border border-blue-500/30">
JD
</div>
<div class="ml-4">
<h4 class="font-bold text-xl text-foreground group-hover:text-blue-500 transition-colors">John Doe</h4>
<p class="text-sm text-muted-foreground font-medium">Senior Developer</p>
</div>
</div>
<div class="flex mb-4">
<svg class="w-6 h-6 text-yellow-400 animate-pulse" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg>
<svg class="w-6 h-6 text-yellow-400 animate-pulse" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg>
<svg class="w-6 h-6 text-yellow-400 animate-pulse" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg>
<svg class="w-6 h-6 text-yellow-400 animate-pulse" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg>
<svg class="w-6 h-6 text-yellow-400 animate-pulse" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg>
</div>
<blockquote class="text-muted-foreground leading-relaxed mb-6 text-lg font-medium">
"Trackkeep has completely transformed how I manage my development resources. The AI-powered organization saves me hours every week, and the self-hosted nature gives me complete peace of mind about my data."
</blockquote>
<div class="flex items-center text-blue-500 opacity-0 group-hover:opacity-100 transition-all duration-300 transform translate-y-2 group-hover:translate-y-0">
<span class="text-base font-semibold mr-2">Read more</span>
<svg class="w-5 h-5 group-hover:translate-x-2 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/>
</svg>
</div>
</div>
</div>
<!-- Testimonial 2 -->
<div class="feature-card group cursor-pointer animate-scale-in scroll-reveal hover-3d glow-border" style="animation-delay: 0.3s">
<div class="relative z-10">
<div class="flex items-center mb-6">
<div class="w-14 h-14 bg-gradient-to-br from-green-500 to-teal-600 rounded-full flex items-center justify-center text-white font-semibold text-lg group-hover:scale-110 group-hover:rotate-6 transition-all duration-500 group-hover:shadow-glow-green border border-green-500/30">
SM
</div>
<div class="ml-4">
<h4 class="font-bold text-xl text-foreground group-hover:text-green-500 transition-colors">Sarah Miller</h4>
<p class="text-sm text-muted-foreground font-medium">Product Manager</p>
</div>
</div>
<div class="flex mb-4">
<svg class="w-6 h-6 text-yellow-400 animate-pulse" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg>
<svg class="w-6 h-6 text-yellow-400 animate-pulse" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg>
<svg class="w-6 h-6 text-yellow-400 animate-pulse" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg>
<svg class="w-6 h-6 text-yellow-400 animate-pulse" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg>
<svg class="w-6 h-6 text-yellow-400 animate-pulse" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg>
</div>
<blockquote class="text-muted-foreground leading-relaxed mb-6 text-lg font-medium">
"The task management features are incredible. Our team's productivity has increased by 40% since we switched to Trackkeep. The mobile apps keep everyone connected, no matter where they're working from."
</blockquote>
<div class="flex items-center text-green-500 opacity-0 group-hover:opacity-100 transition-all duration-300 transform translate-y-2 group-hover:translate-y-0">
<span class="text-base font-semibold mr-2">Read more</span>
<svg class="w-5 h-5 group-hover:translate-x-2 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/>
</svg>
</div>
</div>
</div>
<!-- Testimonial 3 -->
<div class="card-papra p-6 hover-lift group animate-scale-in" style="animation-delay: 0.4s">
<div class="flex items-center mb-4">
<div class="w-12 h-12 bg-gradient-to-br from-purple-500 to-pink-600 rounded-full flex items-center justify-center text-white font-semibold text-lg">
MC
</div>
<div class="ml-4">
<h4 class="font-semibold text-foreground">Michael Chen</h4>
<p class="text-sm text-muted-foreground">DevOps Engineer</p>
</div>
</div>
<div class="flex mb-4">
<svg class="w-5 h-5 text-yellow-400" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg>
<svg class="w-5 h-5 text-yellow-400" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg>
<svg class="w-5 h-5 text-yellow-400" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg>
<svg class="w-5 h-5 text-yellow-400" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg>
<svg class="w-5 h-5 text-yellow-400" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg>
</div>
<blockquote class="text-muted-foreground leading-relaxed mb-4">
"As a DevOps engineer, I appreciate the attention to security and the ease of deployment. The Docker setup took less than 5 minutes, and the API documentation is comprehensive. This is how modern tools should be built."
</blockquote>
<div class="text-sm text-primary font-medium">
⭐⭐⭐⭐⭐
</div>
</div>
</div>
<!-- Stats section -->
<div class="mt-20 grid grid-cols-1 md:grid-cols-4 gap-8 text-center">
<div class="animate-scale-in" style="animation-delay: 0.5s">
<div class="text-4xl lg:text-5xl font-bold text-primary mb-2">10K+</div>
<div class="text-muted-foreground">Active Users</div>
</div>
<div class="animate-scale-in" style="animation-delay: 0.6s">
<div class="text-4xl lg:text-5xl font-bold text-trackeep-green mb-2">500K+</div>
<div class="text-muted-foreground">Bookmarks Saved</div>
</div>
<div class="animate-scale-in" style="animation-delay: 0.7s">
<div class="text-4xl lg:text-5xl font-bold text-trackeep-purple mb-2">50K+</div>
<div class="text-muted-foreground">Tasks Completed</div>
</div>
<div class="animate-scale-in" style="animation-delay: 0.8s">
<div class="text-4xl lg:text-5xl font-bold text-trackeep-orange mb-2">99.9%</div>
<div class="text-muted-foreground">Uptime</div>
</div>
</div>
<!-- CTA -->
<div class="mt-20 text-center animate-slide-up" style="animation-delay: 0.9s">
<div class="inline-flex items-center justify-center p-8 rounded-2xl bg-card/50 backdrop-blur-sm border border-border/50">
<div class="text-center">
<h3 class="text-2xl font-semibold text-foreground mb-4">
Ready to join them?
</h3>
<p class="text-muted-foreground mb-6 max-w-md">
Start your journey to better productivity and data privacy today.
</p>
<div class="flex flex-col sm:flex-row items-center justify-center gap-4">
<a href="https://demo.trackeep.org" target="_blank" rel="noopener" class="btn-primary px-8 py-4 shadow-glow group">
Try Live Demo
<svg class="w-5 h-5 ml-2 group-hover:translate-x-1 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/>
</svg>
</a>
<a href="#install" class="btn-outline px-8 py-4 backdrop-blur-sm">
Get Started Now
</a>
</div>
</div>
</div>
</div>
</div>
</section>
@@ -1,15 +0,0 @@
export function useSmoothScroll() {
const scrollToSection = (elementId: string) => {
const element = document.getElementById(elementId)
if (element) {
element.scrollIntoView({
behavior: 'smooth',
block: 'start'
})
}
}
return {
scrollToSection
}
}
-38
View File
@@ -1,38 +0,0 @@
import { ref, watch } from 'vue'
export function useTheme() {
const isDark = ref(false)
const toggleTheme = () => {
isDark.value = !isDark.value
updateTheme()
}
const updateTheme = () => {
if (isDark.value) {
document.documentElement.classList.add('dark')
localStorage.theme = 'dark'
} else {
document.documentElement.classList.remove('dark')
localStorage.theme = 'light'
}
}
const initTheme = () => {
if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
isDark.value = true
document.documentElement.classList.add('dark')
} else {
isDark.value = false
document.documentElement.classList.remove('dark')
}
}
watch(isDark, updateTheme)
return {
isDark,
toggleTheme,
initTheme
}
}
+95
View File
@@ -0,0 +1,95 @@
---
title: Introduction
description: Welcome to Trackkeep - Your Self-Hosted Productivity & Knowledge Hub
template: splash
hero:
tagline: Your Self-Hosted Productivity & Knowledge Hub
image:
file: ../../assets/hero.png
alt: Trackkeep Dashboard
actions:
- text: Quick Start
link: /quick-start
icon: right-arrow
variant: primary
- text: View Demo
link: https://demo.trackkeep.org
icon: external
variant: secondary
---
import { CardGrid, Card } from '@astrojs/starlight/components';
Trackkeep is a powerful, self-hosted productivity and knowledge management platform that puts you in control of your digital life. Built with privacy, security, and simplicity in mind.
## Why Trackkeep?
<CardGrid stagger>
<Card title="Privacy First" icon="pencil">
Your data stays yours. No tracking, no data mining, no selling your information. Complete ownership and control.
</Card>
<Card title="Open Source" icon="github">
Fully open source with permissive licensing. Audit the code, contribute, or customize it to fit your needs.
</Card>
<Card title="All-in-One" icon="stack">
Replace multiple apps with one unified platform for bookmarks, tasks, files, and notes.
</Card>
<Card title="AI Powered" icon="sparkles">
Smart features when you want them, complete privacy when you don't. You're always in control.
</Card>
<Card title="Self-Hosted" icon="server">
One-time setup, lifetime usage. No monthly fees, no feature gates, no vendor lock-in.
</Card>
<Card title="Developer Friendly" icon="code">
Rich API, webhooks, and extensibility. Integrate Trackkeep into your existing workflows.
</Card>
</CardGrid>
## Quick Install
Get started with a single command:
```bash
curl -sSL https://trackkeep.org/install.sh | sh
```
This will automatically:
- Check system requirements
- Download the latest version
- Set up Docker containers
- Initialize the database
- Start the services
## What's Included?
### Core Features
- **Smart Bookmarks**: Save and categorize web content with intelligent tagging
- **Task Management**: Plan and track your to-dos with intuitive boards
- **File Storage**: Upload and organize documents with version control
- **AI-Powered Insights**: Get smart recommendations and automated organization
- **Mobile Apps**: Native iOS and Android apps with seamless sync
### Technical Stack
- **Backend**: Go for high performance and reliability
- **Frontend**: Modern web technologies with responsive design
- **Database**: PostgreSQL for data integrity
- **Deployment**: Docker for easy setup and maintenance
- **API**: RESTful API with comprehensive documentation
## Who is Trackkeep for?
- **Individuals** who want to organize their digital life without compromising privacy
- **Teams** that need a secure, self-hosted collaboration platform
- **Developers** who want to extend and customize their productivity tools
- **Organizations** that require on-premises solutions for data sovereignty
## What's Next?
- [Quick Start Guide](/quick-start) - Get up and running in minutes
- [Installation Guide](/installation) - Detailed setup instructions
- [API Reference](/api) - Complete API documentation
- [Development Guide](/development) - Contribute to Trackkeep
---
Ready to take control of your digital life? [Start your journey](/quick-start) with Trackkeep today!
@@ -0,0 +1,640 @@
---
title: Troubleshooting
description: Common issues and solutions for Trackkeep
---
This comprehensive troubleshooting guide helps you resolve common issues with Trackkeep, from installation problems to performance optimization.
## Quick Diagnostics
### Health Check
Run the built-in health check to assess your Trackkeep installation:
```bash
# Check overall system health
curl https://your-domain.com/health
# Detailed health information
curl https://your-domain.com/health/detailed
# Component-specific checks
curl https://your-domain.com/health/database
curl https://your-domain.com/health/redis
curl https://your-domain.com/health/storage
```
### Diagnostic Tool
Use the built-in diagnostic tool:
```bash
# Run comprehensive diagnostics
trackkeep doctor
# Check specific components
trackkeep doctor --database
trackkeep doctor --storage
trackkeep doctor --network
# Generate diagnostic report
trackkeep doctor --report > diagnostics.json
```
## Installation Issues
### Database Connection Failed
**Symptoms:**
- Error: "Failed to connect to database"
- Application won't start
- 502 Bad Gateway errors
**Common Causes:**
- PostgreSQL not running
- Incorrect database credentials
- Network connectivity issues
- Database not created
**Solutions:**
1. **Check PostgreSQL Status:**
```bash
# Docker Compose
docker-compose ps postgres
docker-compose logs postgres
# System PostgreSQL
sudo systemctl status postgresql
sudo systemctl start postgresql
```
2. **Verify Database Credentials:**
```bash
# Test connection
psql -h localhost -U trackkeep -d trackkeep
# Check environment variables
echo $DATABASE_URL
```
3. **Create Database:**
```sql
-- Connect to PostgreSQL
CREATE DATABASE trackkeep;
CREATE USER trackkeep WITH PASSWORD 'your_password';
GRANT ALL PRIVILEGES ON DATABASE trackkeep TO trackkeep;
```
4. **Fix Docker Issues:**
```bash
# Restart database container
docker-compose restart postgres
# Rebuild containers
docker-compose down
docker-compose up -d
```
### Port Already in Use
**Symptoms:**
- Error: "Port 8080 is already in use"
- Application fails to start
- Port binding errors
**Solutions:**
1. **Find Process Using Port:**
```bash
# Find process on port 8080
sudo lsof -i :8080
sudo netstat -tulpn | grep :8080
```
2. **Kill Process:**
```bash
# Kill process by PID
sudo kill -9 <PID>
# Or use fuser
sudo fuser -k 8080/tcp
```
3. **Change Port:**
```env
# In .env file
PORT=8081
```
### Permission Denied
**Symptoms:**
- Error: "Permission denied"
- Cannot write to storage directory
- File upload failures
**Solutions:**
1. **Check Directory Permissions:**
```bash
# Check current permissions
ls -la /app/data
ls -la /app/logs
# Fix permissions
sudo chown -R trackkeep:trackkeep /app/data
sudo chmod -R 755 /app/data
```
2. **Docker Permission Issues:**
```bash
# Fix Docker socket permissions
sudo usermod -aG docker $USER
newgrp docker
# Or run with sudo
sudo docker-compose up -d
```
## Performance Issues
### Slow Response Times
**Symptoms:**
- Pages loading slowly (>5 seconds)
- API requests timing out
- High CPU usage
**Diagnostics:**
```bash
# Check system resources
top
htop
iostat -x 1
# Check application metrics
curl https://your-domain.com/metrics
```
**Solutions:**
1. **Database Optimization:**
```sql
-- PostgreSQL optimizations
ALTER SYSTEM SET shared_buffers = '256MB';
ALTER SYSTEM SET effective_cache_size = '1GB';
ALTER SYSTEM SET work_mem = '4MB';
SELECT pg_reload_conf();
```
2. **Enable Caching:**
```env
# Redis caching
REDIS_URL=redis://localhost:6379
CACHE_ENABLED=true
CACHE_TTL=3600
```
3. **Increase Resources:**
```yaml
# docker-compose.yml
services:
trackkeep:
deploy:
resources:
limits:
memory: 1G
cpus: '1.0'
```
### High Memory Usage
**Symptoms:**
- Out of memory errors
- Container restarts
- System swapping
**Solutions:**
1. **Monitor Memory Usage:**
```bash
# Check memory usage
docker stats
free -h
ps aux --sort=-%mem | head
```
2. **Optimize Configuration:**
```env
# Reduce memory usage
GOGC=50
GOMAXPROCS=4
```
3. **Add Swap Space:**
```bash
# Create swap file
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
```
### Database Slow Queries
**Symptoms:**
- Database queries taking >1 second
- High database CPU usage
- Timeouts during peak usage
**Diagnostics:**
```sql
-- Enable query logging
ALTER SYSTEM SET log_min_duration_statement = 1000;
ALTER SYSTEM SET log_statement = 'all';
SELECT pg_reload_conf();
-- Find slow queries
SELECT query, mean_time, calls
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;
```
**Solutions:**
1. **Add Indexes:**
```sql
-- Common query indexes
CREATE INDEX CONCURRENTLY idx_bookmarks_user_created
ON bookmarks(user_id, created_at DESC);
CREATE INDEX CONCURRENTLY idx_tasks_status_due
ON tasks(status, due_date);
```
2. **Optimize Queries:**
```sql
-- Use EXPLAIN ANALYZE
EXPLAIN ANALYZE SELECT * FROM bookmarks WHERE user_id = $1;
-- Check query plan
```
3. **Connection Pooling:**
```env
# PgBouncer configuration
DATABASE_URL=postgres://trackkeep:pass@localhost:6432/trackkeep
```
## Authentication Issues
### Login Failures
**Symptoms:**
- "Invalid credentials" error
- Cannot log in with correct password
- Session expiration issues
**Solutions:**
1. **Check User Account:**
```sql
-- Verify user exists
SELECT id, email, active FROM users WHERE email = '[email protected]';
-- Reset password
UPDATE users SET password_hash = crypt('new_password', gen_salt('bf'))
WHERE email = '[email protected]';
```
2. **Session Configuration:**
```env
# Session settings
SESSION_TIMEOUT=24h
SESSION_SECRET=your-secret-key
COOKIE_SECURE=true
```
3. **Clear Sessions:**
```bash
# Clear Redis sessions
redis-cli FLUSHDB
# Or clear specific sessions
redis-cli DEL "session:*"
```
### 2FA Issues
**Symptoms:**
- 2FA codes not working
- Cannot enable/disable 2FA
- Lost 2FA device
**Solutions:**
1. **Reset 2FA:**
```sql
-- Disable 2FA for user
UPDATE users SET two_factor_enabled = false, two_factor_secret = NULL
WHERE email = '[email protected]';
```
2. **Backup Codes:**
```bash
# Generate new backup codes
trackkeep admin:2fa-backup-codes [email protected]
```
## File Storage Issues
### Upload Failures
**Symptoms:**
- File upload errors
- "File too large" messages
- Storage quota exceeded
**Solutions:**
1. **Check Storage Configuration:**
```env
# Storage settings
STORAGE_TYPE=local
STORAGE_PATH=/app/data/files
MAX_FILE_SIZE=100MB
STORAGE_QUOTA=10GB
```
2. **Check Disk Space:**
```bash
# Check available space
df -h
du -sh /app/data/files
# Clean up old files
find /app/data/files -type f -mtime +30 -delete
```
3. **Fix Permissions:**
```bash
# Fix storage permissions
sudo chown -R trackkeep:trackkeep /app/data/files
sudo chmod -R 755 /app/data/files
```
### S3/Cloud Storage Issues
**Symptoms:**
- Cannot connect to S3
- Upload timeouts
- Access denied errors
**Solutions:**
1. **Verify Credentials:**
```bash
# Test S3 connection
aws s3 ls s3://your-bucket
# Check credentials
aws configure list
```
2. **Fix Configuration:**
```env
# S3 settings
S3_BUCKET=your-bucket
S3_REGION=us-east-1
S3_ACCESS_KEY=your-key
S3_SECRET_KEY=your-secret
S3_ENDPOINT=https://s3.amazonaws.com
```
## Network Issues
### SSL/TLS Problems
**Symptoms:**
- SSL certificate errors
- HTTPS not working
- Mixed content warnings
**Solutions:**
1. **Check Certificate:**
```bash
# Verify certificate
openssl x509 -in /etc/ssl/certs/cert.pem -text -noout
# Check certificate chain
openssl s_client -connect your-domain.com:443
```
2. **Renew Certificate:**
```bash
# Let's Encrypt renewal
sudo certbot renew
# Force renewal
sudo certbot renew --force-renewal
```
3. **Fix Nginx Configuration:**
```nginx
# Ensure proper SSL settings
ssl_certificate /etc/ssl/certs/cert.pem;
ssl_certificate_key /etc/ssl/certs/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
```
### CORS Issues
**Symptoms:**
- CORS errors in browser
- API requests blocked
- Cross-origin errors
**Solutions:**
1. **Configure CORS:**
```env
# CORS settings
CORS_ORIGINS=https://your-domain.com,https://app.your-domain.com
CORS_METHODS=GET,POST,PUT,DELETE,OPTIONS
CORS_HEADERS=Content-Type,Authorization
```
2. **Nginx CORS Headers:**
```nginx
# Add CORS headers
add_header Access-Control-Allow-Origin "https://your-domain.com";
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
add_header Access-Control-Allow-Headers "Content-Type, Authorization";
```
## Mobile App Issues
### Sync Problems
**Symptoms:**
- Mobile app not syncing
- Data inconsistency
- Offline mode issues
**Solutions:**
1. **Check API Endpoints:**
```bash
# Test mobile API
curl -I https://your-domain.com/api/v1/mobile/status
# Check mobile configuration
curl https://your-domain.com/api/v1/mobile/config
```
2. **Reset Sync:**
```bash
# Clear mobile sync data
redis-cli DEL "mobile_sync:*"
# Reset user sync
trackkeep admin:mobile-sync-reset [email protected]
```
### Push Notifications
**Symptoms:**
- Not receiving notifications
- Push token errors
- APNS/FCM failures
**Solutions:**
1. **Check Push Configuration:**
```env
# Push notification settings
FCM_SERVER_KEY=your-fcm-key
APNS_KEY_ID=your-apns-key
APNS_TEAM_ID=your-team-id
```
2. **Test Push Service:**
```bash
# Test FCM
curl -X POST https://fcm.googleapis.com/fcm/send \
-H "Authorization: key=$FCM_SERVER_KEY" \
-H "Content-Type: application/json" \
-d '{"to":"device_token","notification":{"title":"Test","body":"Test message"}}'
```
## AI Features Issues
### AI Not Working
**Symptoms:**
- AI features disabled
- Slow AI responses
- Poor AI quality
**Solutions:**
1. **Check AI Configuration:**
```env
# AI settings
AI_PROVIDER=openai
OPENAI_API_KEY=your-key
OPENAI_MODEL=gpt-3.5-turbo
```
2. **Test AI Service:**
```bash
# Test AI endpoint
curl -X POST https://your-domain.com/api/v1/ai/test \
-H "Content-Type: application/json" \
-d '{"text":"Test input"}'
```
3. **Local AI Issues:**
```bash
# Check local AI model
trackkeep ai status
trackkeep ai test
# Rebuild AI models
trackkeep ai rebuild
```
## Getting Help
### Support Channels
1. **Documentation**: [trackkeep.org/docs](https://trackkeep.org/docs)
2. **Community**: [discord.gg/trackkeep](https://discord.gg/trackkeep)
3. **Issues**: [github.com/Dvorinka/Trackkeep/issues](https://github.com/Dvorinka/Trackkeep/issues)
4. **Email**: [[email protected]](mailto:[email protected])
### Reporting Issues
When reporting issues, include:
1. **System Information:**
```bash
# Generate system report
trackkeep doctor --report > system-info.json
```
2. **Logs:**
```bash
# Application logs
docker-compose logs trackkeep --tail=100
# Database logs
docker-compose logs postgres --tail=100
```
3. **Configuration:**
```bash
# Sanitized configuration
trackkeep config show --hide-secrets
```
### Debug Mode
Enable debug mode for detailed logging:
```env
# Debug settings
DEBUG=true
LOG_LEVEL=debug
LOG_FORMAT=json
```
### Performance Monitoring
Set up monitoring for proactive issue detection:
```yaml
# monitoring/docker-compose.yml
version: '3.8'
services:
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
```
---
Still having issues? Don't hesitate to reach out to our [community](https://discord.gg/trackkeep) or create a [GitHub issue](https://github.com/Dvorinka/Trackkeep/issues) with detailed information about your problem.
+1
View File
@@ -0,0 +1 @@
/// <reference path="../.astro/types.d.ts" />
+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>DeepSeek</title><path d="M23.748 4.482c-.254-.124-.364.113-.512.234-.051.039-.094.09-.137.136-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.156-.708-.311-.955-.65-.172-.241-.219-.51-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.093.172.187.129.323-.082.28-.18.552-.266.833-.055.179-.137.217-.329.14a5.526 5.526 0 01-1.736-1.18c-.857-.828-1.631-1.742-2.597-2.458a11.365 11.365 0 00-.689-.471c-.985-.957.13-1.743.388-1.836.27-.098.093-.432-.779-.428-.872.004-1.67.295-2.687.684a3.055 3.055 0 01-.465.137 9.597 9.597 0 00-2.883-.102c-1.885.21-3.39 1.102-4.497 2.623C.082 8.606-.231 10.684.152 12.85c.403 2.284 1.569 4.175 3.36 5.653 1.858 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.133-.284 4.994-1.86.47.234.962.327 1.78.397.63.059 1.236-.03 1.705-.128.735-.156.684-.837.419-.961-2.155-1.004-1.682-.595-2.113-.926 1.096-1.296 2.746-2.642 3.392-7.003.05-.347.007-.565 0-.845-.004-.17.035-.237.23-.256a4.173 4.173 0 001.545-.475c1.396-.763 1.96-2.015 2.093-3.517.02-.23-.004-.467-.247-.588zM11.581 18c-2.089-1.642-3.102-2.183-3.52-2.16-.392.024-.321.471-.235.763.09.288.207.486.371.739.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.167-1.361-.802-2.5-1.86-3.301-3.307-.774-1.393-1.224-2.887-1.298-4.482-.02-.386.093-.522.477-.592a4.696 4.696 0 011.529-.039c2.132.312 3.946 1.265 5.468 2.774.868.86 1.525 1.887 2.202 2.891.72 1.066 1.494 2.082 2.48 2.914.348.292.625.514.891.677-.802.09-2.14.11-3.054-.614zm1-6.44a.306.306 0 01.415-.287.302.302 0 01.2.288.306.306 0 01-.31.307.303.303 0 01-.304-.308zm3.11 1.596c-.2.081-.399.151-.59.16a1.245 1.245 0 01-.798-.254c-.274-.23-.47-.358-.552-.758a1.73 1.73 0 01.016-.588c.07-.327-.008-.537-.239-.727-.187-.156-.426-.199-.688-.199a.559.559 0 01-.254-.078c-.11-.054-.2-.19-.114-.358.028-.054.16-.186.192-.21.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.391.451.462.576.685.914.176.265.336.537.445.848.067.195-.019.354-.25.452z" fill="#4D6BFE"></path></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

+1
View File
@@ -0,0 +1 @@
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Grok</title><path d="M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815"></path></svg>

After

Width:  |  Height:  |  Size: 756 B

+1
View File
@@ -0,0 +1 @@
<svg fill="currentColor" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>LongCat</title><path clip-rule="evenodd" d="M.507 19.883a.507.507 0 01-.489-.642L4.29 3.745a1.013 1.013 0 011.533-.578l5.622 3.687a1.013 1.013 0 001.11 0L18.2 3.165a1.013 1.013 0 011.532.58l4.25 15.497a.506.506 0 01-.49.64H18.07a6.297 6.297 0 001.53-4.115v-.177a6.09 6.09 0 00-1.513-4.017l-.697-3.495a.438.438 0 00-.694-.266L14.07 9.781a.748.748 0 01-.654.121 5.156 5.156 0 00-2.833 0 .746.746 0 01-.653-.121L7.302 7.81a.435.435 0 00-.688.269l-.675 3.652a5.36 5.36 0 00-1.539 3.76v.333c0 1.474.527 2.9 1.488 4.02l.032.038H.507z" fill="#29E154" fill-rule="evenodd"></path><path fill="#fff" d="M9.213 16.843h1.52v-3.546h-1.29l-.23 3.546zm5.573 0h-1.52v-3.546h1.29l.23 3.546z"></path></svg>

After

Width:  |  Height:  |  Size: 832 B

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Mistral</title><path d="M3.428 3.4h3.429v3.428H3.428V3.4zm13.714 0h3.43v3.428h-3.43V3.4z" fill="gold"></path><path d="M3.428 6.828h6.857v3.429H3.429V6.828zm10.286 0h6.857v3.429h-6.857V6.828z" fill="#FFAF00"></path><path d="M3.428 10.258h17.144v3.428H3.428v-3.428z" fill="#FF8205"></path><path d="M3.428 13.686h3.429v3.428H3.428v-3.428zm6.858 0h3.429v3.428h-3.429v-3.428zm6.856 0h3.43v3.428h-3.43v-3.428z" fill="#FA500F"></path><path d="M0 17.114h10.286v3.429H0v-3.429zm13.714 0H24v3.429H13.714v-3.429z" fill="#E10500"></path></svg>

After

Width:  |  Height:  |  Size: 655 B

+1
View File
@@ -0,0 +1 @@
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Ollama</title><path d="M7.905 1.09c.216.085.411.225.588.41.295.306.544.744.734 1.263.191.522.315 1.1.362 1.68a5.054 5.054 0 012.049-.636l.051-.004c.87-.07 1.73.087 2.48.474.101.053.2.11.297.17.05-.569.172-1.134.36-1.644.19-.52.439-.957.733-1.264a1.67 1.67 0 01.589-.41c.257-.1.53-.118.796-.042.401.114.745.368 1.016.737.248.337.434.769.561 1.287.23.934.27 2.163.115 3.645l.053.04.026.019c.757.576 1.284 1.397 1.563 2.35.435 1.487.216 3.155-.534 4.088l-.018.021.002.003c.417.762.67 1.567.724 2.4l.002.03c.064 1.065-.2 2.137-.814 3.19l-.007.01.01.024c.472 1.157.62 2.322.438 3.486l-.006.039a.651.651 0 01-.747.536.648.648 0 01-.54-.742c.167-1.033.01-2.069-.48-3.123a.643.643 0 01.04-.617l.004-.006c.604-.924.854-1.83.8-2.72-.046-.779-.325-1.544-.8-2.273a.644.644 0 01.18-.886l.009-.006c.243-.159.467-.565.58-1.12a4.229 4.229 0 00-.095-1.974c-.205-.7-.58-1.284-1.105-1.683-.595-.454-1.383-.673-2.38-.61a.653.653 0 01-.632-.371c-.314-.665-.772-1.141-1.343-1.436a3.288 3.288 0 00-1.772-.332c-1.245.099-2.343.801-2.67 1.686a.652.652 0 01-.61.425c-1.067.002-1.893.252-2.497.703-.522.39-.878.935-1.066 1.588a4.07 4.07 0 00-.068 1.886c.112.558.331 1.02.582 1.269l.008.007c.212.207.257.53.109.785-.36.622-.629 1.549-.673 2.44-.05 1.018.186 1.902.719 2.536l.016.019a.643.643 0 01.095.69c-.576 1.236-.753 2.252-.562 3.052a.652.652 0 01-1.269.298c-.243-1.018-.078-2.184.473-3.498l.014-.035-.008-.012a4.339 4.339 0 01-.598-1.309l-.005-.019a5.764 5.764 0 01-.177-1.785c.044-.91.278-1.842.622-2.59l.012-.026-.002-.002c-.293-.418-.51-.953-.63-1.545l-.005-.024a5.352 5.352 0 01.093-2.49c.262-.915.777-1.701 1.536-2.269.06-.045.123-.09.186-.132-.159-1.493-.119-2.73.112-3.67.127-.518.314-.95.562-1.287.27-.368.614-.622 1.015-.737.266-.076.54-.059.797.042zm4.116 9.09c.936 0 1.8.313 2.446.855.63.527 1.005 1.235 1.005 1.94 0 .888-.406 1.58-1.133 2.022-.62.375-1.451.557-2.403.557-1.009 0-1.871-.259-2.493-.734-.617-.47-.963-1.13-.963-1.845 0-.707.398-1.417 1.056-1.946.668-.537 1.55-.849 2.485-.849zm0 .896a3.07 3.07 0 00-1.916.65c-.461.37-.722.835-.722 1.25 0 .428.21.829.61 1.134.455.347 1.124.548 1.943.548.799 0 1.473-.147 1.932-.426.463-.28.7-.686.7-1.257 0-.423-.246-.89-.683-1.256-.484-.405-1.14-.643-1.864-.643zm.662 1.21l.004.004c.12.151.095.37-.056.49l-.292.23v.446a.375.375 0 01-.376.373.375.375 0 01-.376-.373v-.46l-.271-.218a.347.347 0 01-.052-.49.353.353 0 01.494-.051l.215.172.22-.174a.353.353 0 01.49.051zm-5.04-1.919c.478 0 .867.39.867.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zm8.706 0c.48 0 .868.39.868.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zM7.44 2.3l-.003.002a.659.659 0 00-.285.238l-.005.006c-.138.189-.258.467-.348.832-.17.692-.216 1.631-.124 2.782.43-.128.899-.208 1.404-.237l.01-.001.019-.034c.046-.082.095-.161.148-.239.123-.771.022-1.692-.253-2.444-.134-.364-.297-.65-.453-.813a.628.628 0 00-.107-.09L7.44 2.3zm9.174.04l-.002.001a.628.628 0 00-.107.09c-.156.163-.32.45-.453.814-.29.794-.387 1.776-.23 2.572l.058.097.008.014h.03a5.184 5.184 0 011.466.212c.086-1.124.038-2.043-.128-2.722-.09-.365-.21-.643-.349-.832l-.004-.006a.659.659 0 00-.285-.239h-.004z"></path></svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

+1
View File
@@ -0,0 +1 @@
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>OpenRouter</title><path d="M16.804 1.957l7.22 4.105v.087L16.73 10.21l.017-2.117-.821-.03c-1.059-.028-1.611.002-2.268.11-1.064.175-2.038.577-3.147 1.352L8.345 11.03c-.284.195-.495.336-.68.455l-.515.322-.397.234.385.23.53.338c.476.314 1.17.796 2.701 1.866 1.11.775 2.083 1.177 3.147 1.352l.3.045c.694.091 1.375.094 2.825.033l.022-2.159 7.22 4.105v.087L16.589 22l.014-1.862-.635.022c-1.386.042-2.137.002-3.138-.162-1.694-.28-3.26-.926-4.881-2.059l-2.158-1.5a21.997 21.997 0 00-.755-.498l-.467-.28a55.927 55.927 0 00-.76-.43C2.908 14.73.563 14.116 0 14.116V9.888l.14.004c.564-.007 2.91-.622 3.809-1.124l1.016-.58.438-.274c.428-.28 1.072-.726 2.686-1.853 1.621-1.133 3.186-1.78 4.881-2.059 1.152-.19 1.974-.213 3.814-.138l.02-1.907z"></path></svg>

After

Width:  |  Height:  |  Size: 906 B

+132
View File
@@ -0,0 +1,132 @@
---
export interface Props {
title: string;
description: string;
image?: string;
}
const { title, description, image = '/og-image.png' } = Astro.props;
---
<!DOCTYPE html>
<html lang="en" class="dark">
<head>
<meta charset="UTF-8" />
<meta name="description" content={description} />
<meta name="viewport" content="width=device-width" />
<!-- Favicon -->
<link rel="icon" type="image/png" href="/trackeepfavi.png" />
<link rel="apple-touch-icon" href="/trackeepfavi.png" />
<meta name="generator" content={Astro.generator} />
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://trackeep.org/" />
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:image" content={`https://trackeep.org${image}`} />
<!-- Twitter -->
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:url" content="https://trackeep.org/" />
<meta property="twitter:title" content={title} />
<meta property="twitter:description" content={description} />
<meta property="twitter:image" content={`https://trackeep.org${image}`} />
<!-- Preload critical resources -->
<link rel="preload" href="/src/styles/global.css" as="style" />
<link rel="stylesheet" href="/src/styles/global.css" />
<!-- Theme color -->
<meta name="theme-color" content="#39b9ff" />
<!-- Preconnect to external domains -->
<link rel="preconnect" href="https://fonts.bunny.net" />
</head>
<body class="min-h-screen bg-background font-sans antialiased">
<div class="relative overflow-hidden">
<!-- Background gradient blobs -->
<div class="gradient-blob bg-primary w-96 h-96 -top-48 -right-48"></div>
<div class="gradient-blob bg-trackeep-purple w-96 h-96 -bottom-48 -left-48"></div>
<!-- Main content -->
<main class="relative z-10">
<slot />
</main>
</div>
<!-- Dark mode enforcement - no theme toggle -->
<script>
// Force dark mode
document.documentElement.classList.add('dark');
document.documentElement.style.colorScheme = 'dark';
</script>
<!-- Enhanced interactions script -->
<!-- <script src="/src/scripts/enhanced-interactions.js"></script> -->
<!-- Copy Command Functionality -->
<script>
document.addEventListener('DOMContentLoaded', () => {
const copyButton = document.getElementById('copy-button');
const copyIcon = document.getElementById('copy-icon');
const checkIcon = document.getElementById('check-icon');
const copySuccess = document.getElementById('copy-success');
const installCommand = document.getElementById('install-command');
if (copyButton && installCommand) {
copyButton.addEventListener('click', async () => {
const command = installCommand.textContent;
try {
await navigator.clipboard.writeText(command);
// Show success state
copyIcon.classList.add('hidden');
checkIcon.classList.remove('hidden');
copySuccess.classList.remove('hidden');
// Reset after 3 seconds
setTimeout(() => {
copyIcon.classList.remove('hidden');
checkIcon.classList.add('hidden');
copySuccess.classList.add('hidden');
}, 3000);
} catch (err) {
// Fallback for older browsers
const textArea = document.createElement('textarea');
textArea.value = command;
textArea.style.position = 'fixed';
textArea.style.opacity = '0';
document.body.appendChild(textArea);
textArea.select();
try {
document.execCommand('copy');
// Show success state
copyIcon.classList.add('hidden');
checkIcon.classList.remove('hidden');
copySuccess.classList.remove('hidden');
// Reset after 3 seconds
setTimeout(() => {
copyIcon.classList.remove('hidden');
checkIcon.classList.add('hidden');
copySuccess.classList.add('hidden');
}, 3000);
} catch (fallbackErr) {
console.error('Failed to copy command:', fallbackErr);
}
document.body.removeChild(textArea);
}
});
}
});
</script>
</body>
</html>
-9
View File
@@ -1,9 +0,0 @@
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import 'uno.css'
const app = createApp(App)
app.use(router)
app.mount('#app')
+215
View File
@@ -0,0 +1,215 @@
---
import Layout from '../layouts/Layout.astro';
import Navigation from '../components/Navigation.astro';
import HeroSection from '../components/HeroSection.astro';
import FeaturesSection from '../components/FeaturesSection.astro';
import TechStackSection from '../components/TechStackSection.astro';
import DemoSection from '../components/DemoSection.astro';
import TestimonialsSection from '../components/TestimonialsSection.astro';
import BenefitsSection from '../components/BenefitsSection.astro';
import AISection from '../components/AISection.astro';
import PrivacySection from '../components/PrivacySection.astro';
import MobileSection from '../components/MobileSection.astro';
import Footer from '../components/Footer.astro';
---
<Layout title="Trackeep - Your Self-Hosted Productivity & Knowledge Hub" description="Track, save, and organize everything that matters to you. Self-hosted, privacy-first, and AI-powered productivity hub.">
<Navigation />
<HeroSection />
<!-- Modern Copy Command Section -->
<section class="py-16 lg:py-24 bg-gradient-to-b from-background via-card/20 to-background relative overflow-hidden">
<div class="absolute inset-0 bg-grid-pattern bg-grid-48 opacity-5"></div>
<!-- Minimal particle field -->
<div class="particle-field">
<div class="particle" style="left: 20%; animation-delay: 0s; animation-duration: 20s;"></div>
<div class="particle" style="left: 50%; animation-delay: 2s; animation-duration: 23s;"></div>
<div class="particle" style="left: 80%; animation-delay: 1s; animation-duration: 21s;"></div>
</div>
<div class="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="text-center mb-12">
<div class="inline-flex items-center px-6 py-3 rounded-full bg-primary/10 border border-primary/20 mb-8 animate-fade-in glass-effect">
<span class="w-3 h-3 bg-primary rounded-full mr-3 animate-pulse"></span>
<span class="text-sm font-semibold text-primary">Quick Start</span>
</div>
<h2 class="text-3xl lg:text-4xl font-bold text-foreground mb-4">
Get Started in <span class="gradient-text">Seconds</span>
</h2>
<p class="text-lg text-muted-foreground max-w-2xl mx-auto">
One command is all it takes to deploy Trackeep on your own infrastructure
</p>
</div>
<!-- Enhanced Terminal Box with Copy Functionality -->
<div class="max-w-4xl mx-auto">
<div class="terminal-box rounded-3xl border-2 border-border/30 shadow-2xl hover:shadow-glow transition-all duration-300 group">
<!-- Terminal Header -->
<div class="flex items-center justify-between px-6 py-4 border-b border-border/20">
<div class="flex items-center space-x-3">
<div class="w-3 h-3 bg-red-500 rounded-full hover:bg-red-600 transition-colors cursor-pointer"></div>
<div class="w-3 h-3 bg-yellow-500 rounded-full hover:bg-yellow-600 transition-colors cursor-pointer"></div>
<div class="w-3 h-3 bg-green-500 rounded-full hover:bg-green-600 transition-colors cursor-pointer"></div>
<span class="ml-4 text-sm text-muted-foreground font-mono">terminal</span>
</div>
<div class="flex items-center space-x-2">
<span class="text-xs text-muted-foreground font-mono">bash</span>
</div>
</div>
<!-- Terminal Content -->
<div class="p-6">
<div class="flex items-center justify-between">
<div class="flex items-center space-x-4 flex-1">
<span class="text-green-400 font-mono text-sm">$</span>
<code id="install-command" class="text-foreground font-mono text-lg flex-1">
git clone https://github.com/Dvorinka/Trackeep.git && cd Trackeep && ./start.sh
</code>
</div>
<button
id="copy-button"
class="ml-4 p-3 rounded-xl bg-trackeep-blue/10 hover:bg-trackeep-blue/20 text-trackeep-blue transition-all duration-300 group hover:scale-110 border border-trackeep-blue/20"
aria-label="Copy command"
>
<svg id="copy-icon" class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"></path>
</svg>
<svg id="check-icon" class="w-5 h-5 hidden" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
</button>
</div>
<!-- Success Message -->
<div id="copy-success" class="hidden mt-4 p-3 bg-green-500/10 border border-green-500/20 rounded-xl">
<p class="text-green-400 text-sm font-medium flex items-center">
<svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
Command copied to clipboard!
</p>
</div>
</div>
</div>
<!-- Additional Info -->
<div class="mt-8 text-center">
<p class="text-muted-foreground mb-4">
Or if you prefer Docker Compose:
</p>
<div class="inline-flex items-center space-x-4 text-sm">
<code class="bg-muted/50 px-3 py-2 rounded-lg font-mono">docker compose up -d</code>
<span class="text-muted-foreground">•</span>
<a href="https://demo.trackeep.org" target="_blank" rel="noopener" class="text-trackeep-blue hover:text-trackkeep-blue/80 transition-colors font-medium">
Try Live Demo →
</a>
</div>
</div>
</div>
</div>
</section>
<!-- Demo Screenshots Section -->
<section id="screenshots" class="py-24 lg:py-40 bg-gradient-to-b from-background via-card/20 to-background relative overflow-hidden">
<div class="absolute inset-0 bg-grid-pattern bg-grid-48 opacity-3"></div>
<!-- Minimal particle field -->
<div class="particle-field">
<div class="particle" style="left: 15%; animation-delay: 1s; animation-duration: 22s;"></div>
<div class="particle" style="left: 45%; animation-delay: 3s; animation-duration: 20s;"></div>
<div class="particle" style="left: 75%; animation-delay: 2s; animation-duration: 24s;"></div>
</div>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="text-center mb-20">
<div class="inline-flex items-center px-6 py-3 rounded-full bg-primary/10 border border-primary/20 mb-8 animate-fade-in glass-effect">
<span class="w-3 h-3 bg-primary rounded-full mr-3 animate-pulse"></span>
<span class="text-sm font-semibold text-primary">Visual Tour</span>
</div>
<h2 class="text-5xl sm:text-6xl lg:text-7xl font-black text-foreground mb-8 leading-tight">
<span class="block">See Trackeep in</span>
<span class="gradient-text">Action</span>
</h2>
<p class="text-2xl lg:text-3xl text-muted-foreground max-w-4xl mx-auto leading-relaxed">
Explore the clean, intuitive interface that makes organizing your digital life a breeze
</p>
</div>
<!-- Screenshots Grid -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
<div class="space-y-8">
<div class="group">
<h3 class="text-3xl font-bold text-foreground mb-4 group-hover:text-primary transition-colors">
Clean & Minimal Design
</h3>
<p class="text-xl text-muted-foreground leading-relaxed">
Inspired by the best productivity apps, Trackeep puts your content first with a distraction-free interface that's beautiful and functional.
</p>
</div>
<div class="group">
<h3 class="text-3xl font-bold text-foreground mb-4 group-hover:text-primary transition-colors">
Dark Mode Ready
</h3>
<p class="text-xl text-muted-foreground leading-relaxed">
Beautiful dark theme that's easy on the eyes. Perfect for late-night work sessions and reducing eye strain.
</p>
</div>
<div class="group">
<h3 class="text-3xl font-bold text-foreground mb-4 group-hover:text-primary transition-colors">
Responsive & Fast
</h3>
<p class="text-xl text-muted-foreground leading-relaxed">
Built with modern web technologies for lightning-fast performance across all your devices.
</p>
</div>
</div>
<div class="relative">
<div class="grid grid-cols-2 gap-4">
<div class="space-y-4">
<div class="relative overflow-hidden rounded-2xl shadow-2xl hover-lift glow-border">
<img src="/image.png" alt="Trackeep Dashboard" class="w-full h-auto object-cover" />
<div class="absolute inset-0 bg-gradient-to-t from-black/50 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300 flex items-end p-6">
<span class="text-white font-semibold">Main Dashboard</span>
</div>
</div>
<div class="relative overflow-hidden rounded-2xl shadow-2xl hover-lift glow-border">
<img src="/image copy.png" alt="Trackeep Bookmarks" class="w-full h-auto object-cover" />
<div class="absolute inset-0 bg-gradient-to-t from-black/50 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300 flex items-end p-6">
<span class="text-white font-semibold">Bookmarks View</span>
</div>
</div>
</div>
<div class="space-y-4 mt-8">
<div class="relative overflow-hidden rounded-2xl shadow-2xl hover-lift glow-border">
<img src="/image copy 2.png" alt="Trackeep Tasks" class="w-full h-auto object-cover" />
<div class="absolute inset-0 bg-gradient-to-t from-black/50 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300 flex items-end p-6">
<span class="text-white font-semibold">Task Management</span>
</div>
</div>
<div class="relative overflow-hidden rounded-2xl shadow-2xl hover-lift glow-border">
<img src="/image copy 3.png" alt="Trackeep Files" class="w-full h-auto object-cover" />
<div class="absolute inset-0 bg-gradient-to-t from-black/50 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300 flex items-end p-6">
<span class="text-white font-semibold">File Storage</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<FeaturesSection />
<AISection />
<PrivacySection />
<MobileSection />
<BenefitsSection />
<TechStackSection />
<DemoSection />
<TestimonialsSection />
<Footer />
</Layout>
-14
View File
@@ -1,14 +0,0 @@
import { createRouter, createWebHistory } from 'vue-router'
const router = createRouter({
history: createWebHistory(),
routes: [
{
path: '/',
name: 'home',
component: () => import('./views/Home.vue')
}
]
})
export default router
@@ -0,0 +1,222 @@
// Enhanced parallax and micro-interactions for Trackeep landing page
class ParallaxController {
constructor() {
this.elements = [];
this.init();
}
init() {
// Find all parallax elements
this.elements = document.querySelectorAll('[data-speed]');
// Add scroll listener
window.addEventListener('scroll', () => this.handleScroll());
// Initial update
this.handleScroll();
}
handleScroll() {
const scrolled = window.pageYOffset;
const windowHeight = window.innerHeight;
this.elements.forEach(element => {
const rect = element.getBoundingClientRect();
const elementTop = rect.top + scrolled;
const elementHeight = rect.height;
// Only apply parallax if element is in view
if (elementTop < scrolled + windowHeight && elementTop + elementHeight > scrolled) {
const speed = parseFloat(element.dataset.speed) || 0.5;
const yPos = -(scrolled * speed);
element.style.transform = `translate3d(0, ${yPos}px, 0)`;
}
});
}
}
class MagneticButtons {
constructor() {
this.init();
}
init() {
const buttons = document.querySelectorAll('.magnetic-button');
buttons.forEach(button => {
button.addEventListener('mousemove', (e) => this.handleMouseMove(e, button));
button.addEventListener('mouseleave', (e) => this.handleMouseLeave(e, button));
});
}
handleMouseMove(e, button) {
const rect = button.getBoundingClientRect();
const x = e.clientX - rect.left - rect.width / 2;
const y = e.clientY - rect.top - rect.height / 2;
const distance = Math.sqrt(x * x + y * y);
const maxDistance = Math.max(rect.width, rect.height) / 2;
if (distance < maxDistance) {
const strength = (maxDistance - distance) / maxDistance;
const moveX = (x / maxDistance) * strength * 10;
const moveY = (y / maxDistance) * strength * 10;
button.style.transform = `translate(${moveX}px, ${moveY}px) scale(1.05)`;
}
}
handleMouseLeave(e, button) {
button.style.transform = 'translate(0, 0) scale(1)';
}
}
class ScrollReveal {
constructor() {
this.elements = [];
this.init();
}
init() {
this.elements = document.querySelectorAll('.scroll-reveal');
// Initial check
this.checkElements();
// Add scroll listener
window.addEventListener('scroll', () => this.checkElements(), { passive: true });
// Add resize listener
window.addEventListener('resize', () => this.checkElements());
}
checkElements() {
const windowHeight = window.innerHeight;
const triggerBottom = windowHeight * 0.85;
this.elements.forEach(element => {
const elementTop = element.getBoundingClientRect().top;
if (elementTop < triggerBottom) {
element.classList.add('revealed');
}
});
}
}
class SmoothScroll {
constructor() {
this.init();
}
init() {
// Add smooth scroll behavior for anchor links
document.addEventListener('click', (e) => {
if (e.target.tagName === 'A' && e.target.hash) {
const target = document.querySelector(e.target.hash);
if (target) {
e.preventDefault();
this.scrollToElement(target);
}
}
});
}
scrollToElement(element) {
const headerOffset = 80; // Account for fixed header
const elementPosition = element.getBoundingClientRect().top;
const offsetPosition = elementPosition + window.pageYOffset - headerOffset;
window.scrollTo({
top: offsetPosition,
behavior: 'smooth'
});
}
}
class ParticleAnimation {
constructor() {
this.particles = [];
this.init();
}
init() {
const particleFields = document.querySelectorAll('.particle-field');
particleFields.forEach(field => {
this.createParticles(field);
});
}
createParticles(field) {
const particleCount = 20;
for (let i = 0; i < particleCount; i++) {
const particle = document.createElement('div');
particle.className = 'particle';
particle.style.left = Math.random() * 100 + '%';
particle.style.animationDelay = Math.random() * 10 + 's';
particle.style.animationDuration = (10 + Math.random() * 10) + 's';
field.appendChild(particle);
this.particles.push(particle);
}
}
}
class ThemeEnhancer {
constructor() {
this.init();
}
init() {
// Add enhanced theme transitions
const themeToggle = document.getElementById('theme-toggle');
if (themeToggle) {
themeToggle.addEventListener('click', () => {
document.body.style.transition = 'background-color 0.3s ease, color 0.3s ease';
setTimeout(() => {
document.body.style.transition = '';
}, 300);
});
}
}
}
// Initialize all controllers when DOM is ready
document.addEventListener('DOMContentLoaded', () => {
new ParallaxController();
new MagneticButtons();
new ScrollReveal();
new SmoothScroll();
new ParticleAnimation();
new ThemeEnhancer();
// Add loading animation removal
setTimeout(() => {
document.body.classList.add('loaded');
}, 100);
});
// Add intersection observer for better performance
const observerOptions = {
root: null,
rootMargin: '0px',
threshold: 0.1
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('revealed');
}
});
}, observerOptions);
// Observe all scroll-reveal elements
document.addEventListener('DOMContentLoaded', () => {
const revealElements = document.querySelectorAll('.scroll-reveal');
revealElements.forEach(el => observer.observe(el));
});
+124
View File
@@ -0,0 +1,124 @@
// Scroll progress indicator
document.addEventListener('DOMContentLoaded', () => {
// Create progress bar
const progressBar = document.createElement('div');
progressBar.id = 'scroll-progress';
progressBar.className = 'fixed top-0 left-0 w-full h-1 bg-gradient-to-r from-primary to-trackeep-purple transform-origin-left z-50 transition-transform duration-150';
progressBar.style.transform = 'scaleX(0)';
document.body.appendChild(progressBar);
// Update progress on scroll
const updateProgress = () => {
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
const scrollHeight = document.documentElement.scrollHeight - document.documentElement.clientHeight;
const progress = scrollTop / scrollHeight;
progressBar.style.transform = `scaleX(${progress})`;
};
// Throttled scroll handler
let ticking = false;
const requestTick = () => {
if (!ticking) {
window.requestAnimationFrame(updateProgress);
ticking = true;
setTimeout(() => { ticking = false; }, 16);
}
};
window.addEventListener('scroll', requestTick, { passive: true });
// Hide progress bar when at top
const toggleVisibility = () => {
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
if (scrollTop === 0) {
progressBar.style.opacity = '0';
} else {
progressBar.style.opacity = '1';
}
};
window.addEventListener('scroll', toggleVisibility, { passive: true });
toggleVisibility(); // Initial state
});
// Enhanced smooth scrolling for anchor links
document.addEventListener('DOMContentLoaded', () => {
const links = document.querySelectorAll('a[href^="#"]');
links.forEach(link => {
link.addEventListener('click', (e) => {
e.preventDefault();
const targetId = link.getAttribute('href').substring(1);
const targetElement = document.getElementById(targetId);
if (targetElement) {
const offsetTop = targetElement.offsetTop - 80; // Account for fixed header
window.scrollTo({
top: offsetTop,
behavior: 'smooth'
});
}
});
});
});
// Add hover effect to cards with 3D tilt
document.addEventListener('DOMContentLoaded', () => {
const cards = document.querySelectorAll('.feature-card, .card-papra');
cards.forEach(card => {
card.addEventListener('mousemove', (e) => {
const rect = card.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
const centerX = rect.width / 2;
const centerY = rect.height / 2;
const rotateX = (y - centerY) / 10;
const rotateY = (centerX - x) / 10;
card.style.transform = `perspective(1000px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) translateZ(10px)`;
});
card.addEventListener('mouseleave', () => {
card.style.transform = 'perspective(1000px) rotateX(0) rotateY(0) translateZ(0)';
});
});
});
// Add typing effect to hero section
document.addEventListener('DOMContentLoaded', () => {
const heroTitle = document.querySelector('h1 .gradient-text');
if (!heroTitle) return;
const text = heroTitle.textContent;
heroTitle.textContent = '';
heroTitle.style.borderRight = '3px solid hsl(var(--primary))';
heroTitle.style.animation = 'blink 1s infinite';
let index = 0;
const typeWriter = () => {
if (index < text.length) {
heroTitle.textContent += text.charAt(index);
index++;
setTimeout(typeWriter, 100);
} else {
heroTitle.style.borderRight = 'none';
heroTitle.style.animation = '';
}
};
// Start typing after page load
setTimeout(typeWriter, 500);
});
// Add blink animation for typing cursor
const style = document.createElement('style');
style.textContent = `
@keyframes blink {
0%, 50% { border-color: hsl(var(--primary)); }
51%, 100% { border-color: transparent; }
}
`;
document.head.appendChild(style);
+242
View File
@@ -0,0 +1,242 @@
// Parallax scrolling effect for gradient blobs
document.addEventListener('DOMContentLoaded', () => {
const blobs = document.querySelectorAll('.parallax-slow');
const heroSection = document.querySelector('section');
if (!blobs.length || !heroSection) return;
const handleScroll = () => {
const scrolled = window.pageYOffset;
const rate = scrolled * -0.5;
blobs.forEach((blob, index) => {
const speed = 0.5 + (index * 0.1);
const yPos = -(scrolled * speed);
blob.style.transform = `translateY(${yPos}px)`;
});
};
const handleMouseMove = (e) => {
const mouseX = e.clientX / window.innerWidth - 0.5;
const mouseY = e.clientY / window.innerHeight - 0.5;
blobs.forEach((blob, index) => {
const speed = 20 + (index * 10);
const x = mouseX * speed;
const y = mouseY * speed;
blob.style.transform = `translate(${x}px, ${y}px)`;
});
};
// Add scroll listener with throttling
let ticking = false;
const requestTick = () => {
if (!ticking) {
window.requestAnimationFrame(handleScroll);
ticking = true;
setTimeout(() => { ticking = false; }, 16);
}
};
window.addEventListener('scroll', requestTick, { passive: true });
// Add mouse movement listener for subtle parallax
window.addEventListener('mousemove', handleMouseMove, { passive: true });
// Reset blob positions on mouse leave
document.addEventListener('mouseleave', () => {
blobs.forEach(blob => {
blob.style.transform = 'translate(0, 0)';
});
});
});
// Smooth scroll reveal animation
document.addEventListener('DOMContentLoaded', () => {
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('revealed');
}
});
}, observerOptions);
// Observe all scroll-reveal elements
document.querySelectorAll('.scroll-reveal').forEach(el => {
observer.observe(el);
});
});
// Enhanced copy functionality with visual feedback
document.addEventListener('DOMContentLoaded', () => {
const copyButton = document.getElementById('copy-button');
const copyIcon = document.getElementById('copy-icon');
const checkIcon = document.getElementById('check-icon');
const copyText = document.getElementById('copy-text');
const command = 'curl -sSL https://trackeep.org/install.sh | sh';
if (!copyButton) return;
copyButton.addEventListener('click', async () => {
try {
await navigator.clipboard.writeText(command);
// Show success state with enhanced animation
copyIcon?.classList.add('hidden');
checkIcon?.classList.remove('hidden');
copyText.textContent = 'Copied!';
copyButton.classList.add('bg-green-600/50', 'hover:bg-green-700/50', 'border-green-500/50', 'scale-110');
copyButton.classList.remove('bg-gray-700/50', 'hover:bg-gray-600/50', 'border-gray-600/50');
// Add success pulse effect
copyButton.style.animation = 'pulse 0.5s ease-in-out';
// Reset after 2 seconds
setTimeout(() => {
copyIcon?.classList.remove('hidden');
checkIcon?.classList.add('hidden');
copyText.textContent = 'Copy';
copyButton.classList.remove('bg-green-600/50', 'hover:bg-green-700/50', 'border-green-500/50', 'scale-110');
copyButton.classList.add('bg-gray-700/50', 'hover:bg-gray-600/50', 'border-gray-600/50');
copyButton.style.animation = '';
}, 2000);
} catch (err) {
console.error('Failed to copy text: ', err);
// Show error state
copyText.textContent = 'Failed';
copyButton.classList.add('bg-red-600/50', 'border-red-500/50');
setTimeout(() => {
copyText.textContent = 'Copy';
copyButton.classList.remove('bg-red-600/50', 'border-red-500/50');
}, 1500);
}
});
});
// Theme toggle functionality
document.addEventListener('DOMContentLoaded', () => {
const themeToggle = document.getElementById('theme-toggle');
const html = document.documentElement;
if (!themeToggle) return;
// Get current theme
const currentTheme = localStorage.getItem('theme') || 'system';
const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
// Set initial theme
if (currentTheme === 'dark' || (currentTheme === 'system' && systemPrefersDark)) {
html.classList.add('dark');
}
themeToggle.addEventListener('click', () => {
const isDark = html.classList.toggle('dark');
const newTheme = isDark ? 'dark' : 'light';
localStorage.setItem('theme', newTheme);
// Add animation class
themeToggle.style.animation = 'rotate 0.3s ease-in-out';
setTimeout(() => {
themeToggle.style.animation = '';
}, 300);
});
// Listen for system theme changes
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
const currentTheme = localStorage.getItem('theme') || 'system';
if (currentTheme === 'system') {
html.classList.toggle('dark', e.matches);
}
});
});
// Mobile menu functionality
document.addEventListener('DOMContentLoaded', () => {
const mobileMenuButton = document.getElementById('mobile-menu-button');
const mobileMenu = document.getElementById('mobile-menu');
if (!mobileMenuButton || !mobileMenu) return;
mobileMenuButton.addEventListener('click', () => {
const isHidden = mobileMenu.classList.contains('hidden');
if (isHidden) {
mobileMenu.classList.remove('hidden');
mobileMenu.classList.add('animate-slide-up');
mobileMenuButton.style.animation = 'rotate 0.3s ease-in-out';
} else {
mobileMenu.classList.add('hidden');
mobileMenu.classList.remove('animate-slide-up');
mobileMenuButton.style.animation = 'rotate-reverse 0.3s ease-in-out';
}
setTimeout(() => {
mobileMenuButton.style.animation = '';
}, 300);
});
// Close mobile menu when clicking on links
mobileMenu.querySelectorAll('a').forEach(link => {
link.addEventListener('click', () => {
mobileMenu.classList.add('hidden');
mobileMenu.classList.remove('animate-slide-up');
});
});
// Close mobile menu when clicking outside
document.addEventListener('click', (e) => {
if (!mobileMenuButton.contains(e.target) && !mobileMenu.contains(e.target)) {
mobileMenu.classList.add('hidden');
mobileMenu.classList.remove('animate-slide-up');
}
});
});
// Add loading animation for page load
window.addEventListener('load', () => {
document.body.classList.add('loaded');
});
// Performance optimization: Debounce scroll events
function debounce(func, wait) {
let timeout;
return function executedFunction(...args) {
const later = () => {
clearTimeout(timeout);
func(...args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
}
// Add CSS for additional animations
const style = document.createElement('style');
style.textContent = `
@keyframes rotate {
from { transform: rotate(0deg); }
to { transform: rotate(180deg); }
}
@keyframes rotate-reverse {
from { transform: rotate(180deg); }
to { transform: rotate(0deg); }
}
body:not(.loaded) * {
animation-play-state: paused !important;
}
body.loaded * {
animation-play-state: running !important;
}
`;
document.head.appendChild(style);
+670
View File
@@ -0,0 +1,670 @@
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('https://fonts.bunny.net/inter/files/inter-greek-400-normal.woff2') format('woff2');
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 500;
font-display: swap;
src: url('https://fonts.bunny.net/inter/files/inter-greek-500-normal.woff2') format('woff2');
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('https://fonts.bunny.net/inter/files/inter-greek-600-normal.woff2') format('woff2');
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('https://fonts.bunny.net/inter/files/inter-greek-700-normal.woff2') format('woff2');
}
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
/* Dark Mode Only - Project Colors */
--background: 15 15 15;
--foreground: 250 250 250;
--card: 20 20 20;
--card-foreground: 250 250 250;
--popover: 20 20 20;
--popover-foreground: 250 250 250;
--primary: 57 185 255;
--primary-foreground: 250 250 250;
--secondary: 30 30 30;
--secondary-foreground: 250 250 250;
--muted: 30 30 30;
--muted-foreground: 200 200 200;
--accent: 30 30 30;
--accent-foreground: 250 250 250;
--destructive: 239 68 68;
--destructive-foreground: 250 250 250;
--border: 30 30 30;
--input: 30 30 30;
--ring: 57 185 255;
--radius: 0.5rem;
/* Custom Trackeep Colors - Simplified */
--trackeep-blue: 57 185 255;
--trackkeep-blue: 57 185 255;
--trackkeep-purple: 168 85 247;
--trackkeep-green: 34 197 94;
--trackkeep-orange: 251 146 60;
}
/* Force dark mode */
html, body {
color-scheme: dark;
}
html {
color-scheme: dark;
}
* {
@apply border-border;
}
body {
@apply bg-background text-foreground;
font-feature-settings: "rlig" 1, "calt" 1;
}
html {
scroll-behavior: smooth;
}
}
@layer components {
.btn-primary {
@apply bg-primary text-primary-foreground hover:bg-primary/90 inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-background;
}
.btn-secondary {
@apply bg-secondary text-secondary-foreground hover:bg-secondary/80 inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-background;
}
.btn-outline {
@apply border border-input hover:bg-accent hover:text-accent-foreground inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-background;
}
.card-papra {
@apply rounded-xl border bg-card/80 text-card-foreground shadow-lg backdrop-blur-sm;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.card-papra:hover {
@apply shadow-xl border-primary/30;
transform: translateY(-4px);
}
.nav-item-papra {
@apply text-sm font-medium transition-colors hover:text-primary;
}
.gradient-blob {
@apply absolute rounded-full blur-3xl opacity-30;
animation: blob 8s infinite;
filter: blur(80px);
}
.terminal-box {
@apply bg-gray-900 text-gray-100 font-mono text-sm rounded-xl p-6 border border-gray-700/50 shadow-2xl;
background: linear-gradient(135deg, #1a1a1a 0%, #2d2d2d 100%);
}
.feature-card {
@apply bg-card/80 border border-border/50 rounded-2xl p-8 hover-lift group relative overflow-hidden backdrop-blur-sm;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
.feature-card::before {
content: '';
@apply absolute inset-0 bg-gradient-to-br from-primary/10 via-transparent to-trackeep-purple/10 opacity-0 group-hover:opacity-100 transition-opacity duration-500;
}
.feature-card:hover {
@apply border-primary/40 shadow-2xl;
transform: translateY(-8px) scale(1.02);
}
.hero-gradient {
background: linear-gradient(135deg, hsl(var(--background)) 0%, hsl(var(--card)) 100%);
}
.cta-button {
@apply relative overflow-hidden bg-gradient-to-r from-primary to-trackeep-blue text-primary-foreground px-10 py-5 rounded-2xl font-bold text-xl hover-lift group shadow-lg;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.cta-button::before {
content: '';
@apply absolute inset-0 bg-gradient-to-r from-transparent via-white/20 to-transparent -translate-x-full group-hover:translate-x-full transition-transform duration-700;
}
.cta-button:hover {
@apply shadow-2xl shadow-glow;
transform: translateY(-4px) scale(1.05);
}
}
@layer utilities {
/* Main color utilities only */
.text-primary {
color: rgb(var(--trackkeep-blue));
}
.bg-primary {
background-color: rgb(var(--trackkeep-blue));
}
/* Simple shadow utilities */
.shadow-glow {
box-shadow: 0 0 20px rgba(var(--trackkeep-blue), 0.2);
}
/* Border utilities */
.border-primary {
border-color: rgb(var(--trackkeep-blue));
}
/* Clean animations */
.animate-float {
animation: float 8s ease-in-out infinite;
}
.animate-float-slow {
animation: float 16s ease-in-out infinite;
}
.animate-float-reverse {
animation: float-reverse 12s ease-in-out infinite;
}
.animate-pulse-slow {
animation: pulse 6s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}
.animate-slide-up {
animation: slideUp 1s ease-out forwards;
}
.animate-fade-in {
animation: fadeIn 1s ease-out forwards;
}
.animate-scale-in {
animation: scaleIn 0.8s ease-out forwards;
}
/* Clean text effect */
.text-gradient {
color: rgb(var(--trackkeep-blue));
font-weight: 700;
}
/* Simple card styles */
.feature-card {
background: rgba(var(--card), 0.3);
backdrop-filter: blur(15px);
-webkit-backdrop-filter: blur(15px);
border: 1px solid rgba(var(--border), 0.4);
border-radius: 1rem;
padding: 2rem;
transition: all 0.3s ease;
}
.feature-card:hover {
transform: translateY(-4px);
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
border-color: rgba(var(--trackkeep-blue), 0.3);
}
/* Simple button styles */
.btn-primary {
background: rgb(var(--trackkeep-blue));
color: white;
padding: 1rem 2rem;
border-radius: 0.75rem;
font-weight: 600;
border: none;
cursor: pointer;
transition: all 0.3s ease;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 10px 20px rgba(var(--trackkeep-blue), 0.3);
}
.btn-outline {
background: transparent;
color: rgb(var(--trackkeep-blue));
padding: 1rem 2rem;
border-radius: 0.75rem;
font-weight: 600;
border: 2px solid rgb(var(--trackkeep-blue));
cursor: pointer;
transition: all 0.3s ease;
}
.btn-outline:hover {
background: rgba(var(--trackkeep-blue), 0.1);
transform: translateY(-2px);
}
/* Simple glass effect */
.glass-effect {
background: rgba(var(--card), 0.2);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border: 1px solid rgba(var(--border), 0.3);
}
/* Simple terminal styling */
.terminal-box {
background: #0a0a0a;
border: 1px solid rgba(var(--trackkeep-blue), 0.3);
border-radius: 1rem;
overflow: hidden;
}
/* Grid pattern */
.bg-grid-pattern {
background-image:
linear-gradient(rgba(var(--trackkeep-blue), 0.03) 1px, transparent 1px),
linear-gradient(90deg, rgba(var(--trackkeep-blue), 0.03) 1px, transparent 1px);
background-size: 50px 50px;
}
.bg-grid-48 {
background-size: 48px 48px;
}
/* Simple particle system */
.particle-field {
position: absolute;
inset: 0;
overflow: hidden;
pointer-events: none;
}
.particle {
position: absolute;
width: 2px;
height: 2px;
background: rgb(var(--trackkeep-blue));
border-radius: 50%;
opacity: 0.3;
animation: particle-float 20s infinite linear;
}
}
@layer keyframes {
@keyframes float {
0%, 100% {
transform: translateY(0px) scale(1);
}
50% {
transform: translateY(-20px) scale(1.05);
}
}
@keyframes glow {
from {
filter: drop-shadow(0 0 10px hsl(var(--primary) / 0.3));
}
to {
filter: drop-shadow(0 0 20px hsl(var(--primary) / 0.6));
}
}
@keyframes slideUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes scaleIn {
from {
opacity: 0;
transform: scale(0.9);
}
to {
opacity: 1;
transform: scale(1);
}
}
@keyframes blob {
0% {
transform: translate(0px, 0px) scale(1);
}
33% {
transform: translate(30px, -50px) scale(1.1);
}
66% {
transform: translate(-20px, 20px) scale(0.9);
}
100% {
transform: translate(0px, 0px) scale(1);
}
}
@keyframes typing {
from {
width: 0;
}
to {
width: 100%;
}
}
@keyframes pulseGlow {
0%, 100% {
box-shadow: 0 0 5px hsl(var(--primary) / 0.5);
}
50% {
box-shadow: 0 0 20px hsl(var(--primary) / 0.8);
}
}
@keyframes gradientShift {
0%, 100% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
}
@keyframes shimmer {
0%, 100% {
background-position: -200% 0;
}
50% {
background-position: 200% 0;
}
}
@keyframes glowRotate {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@keyframes staggerFadeIn {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes particleFloat {
0% {
transform: translateY(100vh) rotate(0deg);
opacity: 0;
}
10% {
opacity: 0.4;
}
90% {
opacity: 0.4;
}
100% {
transform: translateY(-100vh) rotate(360deg);
opacity: 0;
}
}
@keyframes particle-float {
0% {
transform: translateY(100vh) translateX(0) rotate(0deg);
opacity: 0;
}
10% {
opacity: 0.4;
}
25% {
transform: translateY(75vh) translateX(20px) rotate(90deg);
}
50% {
transform: translateY(50vh) translateX(-10px) rotate(180deg);
}
75% {
transform: translateY(25vh) translateX(15px) rotate(270deg);
}
90% {
opacity: 0.4;
}
100% {
transform: translateY(-100vh) translateX(5px) rotate(360deg);
opacity: 0;
}
}
@keyframes morph {
0%, 100% {
border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%;
transform: scale(1) rotate(0deg);
}
25% {
border-radius: 30% 60% 70% 40% / 50% 60% 30% 60%;
transform: scale(1.1) rotate(90deg);
}
50% {
border-radius: 70% 30% 40% 60% / 30% 70% 60% 40%;
transform: scale(0.9) rotate(180deg);
}
75% {
border-radius: 40% 70% 60% 30% / 70% 40% 30% 60%;
transform: scale(1.05) rotate(270deg);
}
}
@keyframes morphReverse {
0%, 100% {
border-radius: 30% 70% 40% 60% / 70% 30% 60% 40%;
transform: scale(1) rotate(0deg);
}
25% {
border-radius: 60% 40% 70% 30% / 40% 70% 30% 60%;
transform: scale(0.9) rotate(-90deg);
}
50% {
border-radius: 40% 60% 30% 70% / 60% 40% 70% 30%;
transform: scale(1.1) rotate(-180deg);
}
75% {
border-radius: 70% 30% 60% 40% / 30% 60% 40% 70%;
transform: scale(0.95) rotate(-270deg);
}
}
@keyframes particleTrail {
0%, 100% {
transform: translate(0, 0) scale(1);
opacity: 0.7;
}
25% {
transform: translate(20px, -15px) scale(1.2);
opacity: 0.5;
}
50% {
transform: translate(-10px, -30px) scale(0.8);
opacity: 0.8;
}
75% {
transform: translate(-25px, -10px) scale(1.1);
opacity: 0.6;
}
}
@keyframes particleTrailReverse {
0%, 100% {
transform: translate(0, 0) scale(1);
opacity: 0.7;
}
25% {
transform: translate(-20px, 15px) scale(1.2);
opacity: 0.5;
}
50% {
transform: translate(10px, 30px) scale(0.8);
opacity: 0.8;
}
75% {
transform: translate(25px, 10px) scale(1.1);
opacity: 0.6;
}
}
@keyframes spinSlow {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@keyframes glowBorder {
0%, 100% {
box-shadow: 0 0 10px hsl(var(--primary) / 0.3), inset 0 0 10px hsl(var(--primary) / 0.1);
}
50% {
box-shadow: 0 0 25px hsl(var(--primary) / 0.6), inset 0 0 20px hsl(var(--primary) / 0.2);
}
}
@keyframes pulseBorder {
0%, 100% {
border-color: hsl(var(--primary) / 0.5);
box-shadow: 0 0 15px hsl(var(--primary) / 0.3);
}
50% {
border-color: hsl(var(--primary) / 0.8);
box-shadow: 0 0 30px hsl(var(--primary) / 0.5);
}
}
@keyframes textGlow {
from {
text-shadow: 0 0 10px hsl(var(--primary) / 0.3);
filter: drop-shadow(0 0 10px hsl(var(--primary) / 0.3));
}
to {
text-shadow: 0 0 20px hsl(var(--primary) / 0.6);
filter: drop-shadow(0 0 20px hsl(var(--primary) / 0.6));
}
}
@keyframes typing {
from {
width: 0;
}
to {
width: 100%;
}
}
@keyframes borderFlow {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
@keyframes gradientText {
0%, 100% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
}
@keyframes textMorph {
0%, 100% {
letter-spacing: 0.02em;
transform: scale(1);
}
25% {
letter-spacing: 0.05em;
transform: scale(1.02);
}
50% {
letter-spacing: 0.01em;
transform: scale(0.98);
}
75% {
letter-spacing: 0.03em;
transform: scale(1.01);
}
}
@keyframes wordSlide {
from {
opacity: 0;
transform: translateX(-50px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
@keyframes wordBounce {
0% {
opacity: 0;
transform: translateY(30px) scale(0.8);
}
50% {
transform: translateY(-10px) scale(1.1);
}
100% {
opacity: 1;
transform: translateY(0) scale(1);
}
}
}
+182
View File
@@ -0,0 +1,182 @@
/* Trackkeep Starlight Custom Styles */
:root {
--sl-color-accent-low: #5BC4F220;
--sl-color-accent: #5BC4F2;
--sl-color-accent-high: #5BC4F2;
--sl-color-text-accent: #5BC4F2;
--sl-color-bg-sidebar: #1a1a1a;
--sl-color-bg-sidebar-mobile: #1a1a1a;
--sl-color-text-sidebar: #fafafa;
--sl-color-text-sidebar-secondary: #a3a3a3;
--sl-color-bg-code: #0d1117;
--sl-color-text-code: #e6edf3;
--sl-hue: 200;
--sl-font-normal: 400;
--sl-font-medium: 500;
--sl-font-semibold: 600;
--sl-font-bold: 700;
}
/* Dark mode overrides */
[data-theme='dark'] {
--sl-color-bg: #0a0a0a;
--sl-color-bg-nav: #1a1a1a;
--sl-color-bg-panel: #1a1a1a;
--sl-color-bg-inline-code: #1a1a1a;
--sl-color-bg-hairline: #262626;
--sl-color-bg-scrollbar-thumb: #262626;
--sl-color-bg-scrollbar-thumb-hover: #393942;
--sl-color-text: #fafafa;
--sl-color-text-secondary: #a3a3a3;
--sl-color-text-hairline: #393942;
}
/* Light mode overrides */
[data-theme='light'] {
--sl-color-bg: #ffffff;
--sl-color-bg-nav: #fafafa;
--sl-color-bg-panel: #ffffff;
--sl-color-bg-inline-code: #f1f5f9;
--sl-color-bg-hairline: #e2e8f0;
--sl-color-bg-scrollbar-thumb: #e2e8f0;
--sl-color-bg-scrollbar-thumb-hover: #cbd5e1;
--sl-color-text: #0a0a0a;
--sl-color-text-secondary: #64748b;
--sl-color-text-hairline: #e2e8f0;
}
/* Custom component styles */
.starlight-aside--tip {
--sl-color-aside-bg: #5BC4F210;
--sl-color-aside-text: #5BC4F2;
--sl-color-aside-border: #5BC4F230;
}
.starlight-aside--note {
--sl-color-aside-bg: #3b82f610;
--sl-color-aside-text: #3b82f6;
--sl-color-aside-border: #3b82f630;
}
.starlight-aside--caution {
--sl-color-aside-bg: #f59e0b10;
--sl-color-aside-text: #f59e0b;
--sl-color-aside-border: #f59e0b30;
}
.starlight-aside--danger {
--sl-color-aside-bg: #ef444410;
--sl-color-aside-text: #ef4444;
--sl-color-aside-border: #ef444430;
}
/* Code block styling */
.starlight-aside--tip pre,
.starlight-aside--tip code {
--sl-color-bg-code: #5BC4F210;
--sl-color-text-code: #5BC4F2;
}
/* Table styling */
table {
--sl-color-bg-table-head: #5BC4F210;
--sl-color-text-table-head: #5BC4F2;
--sl-color-bg-table-row-stripe: #f8fafc;
}
[data-theme='dark'] table {
--sl-color-bg-table-row-stripe: #1a1a1a;
}
/* Custom button styles */
.starlight-cta {
background: linear-gradient(135deg, #5BC4F2, #0ea5e9);
border: none;
color: white;
font-weight: 600;
padding: 0.75rem 1.5rem;
border-radius: 0.5rem;
transition: all 0.2s ease;
}
.starlight-cta:hover {
transform: translateY(-2px);
box-shadow: 0 10px 25px -5px #5BC4F240;
}
/* Search bar styling */
.starlight-search {
--sl-color-search-bg: #f1f5f9;
--sl-color-search-text: #0a0a0a;
--sl-color-search-placeholder: #64748b;
--sl-color-search-border: #e2e8f0;
}
[data-theme='dark'] .starlight-search {
--sl-color-search-bg: #1a1a1a;
--sl-color-search-text: #fafafa;
--sl-color-search-placeholder: #a3a3a3;
--sl-color-search-border: #393942;
}
/* Sidebar link hover effects */
.sidebar a:hover {
background: #5BC4F210;
color: #5BC4F2;
}
/* Pagination styling */
.pagination-links a {
border: 1px solid #e2e8f0;
background: #ffffff;
color: #0a0a0a;
}
.pagination-links a:hover {
border-color: #5BC4F2;
background: #5BC4F210;
color: #5BC4F2;
}
[data-theme='dark'] .pagination-links a {
border-color: #393942;
background: #1a1a1a;
color: #fafafa;
}
[data-theme='dark'] .pagination-links a:hover {
border-color: #5BC4F2;
background: #5BC4F210;
color: #5BC4F2;
}
/* Custom scrollbar */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: #e2e8f0;
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: #cbd5e1;
}
[data-theme='dark'] ::-webkit-scrollbar-thumb {
background: #393942;
}
[data-theme='dark'] ::-webkit-scrollbar-thumb:hover {
background: #52525b;
}
-448
View File
@@ -1,448 +0,0 @@
<template>
<div class="min-h-screen">
<!-- Hero Section -->
<section class="relative py-24 lg:py-32 bg-gradient-to-br from-white via-gray-50 to-white dark:from-gray-900 dark:via-gray-800 dark:to-gray-900">
<div class="max-w-7xl mx-auto px-6 sm:px-8 lg:px-12">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-16 lg:gap-20 items-center">
<!-- Left Content -->
<div class="text-center lg:text-left space-y-8">
<div class="space-y-6">
<h1 class="text-5xl lg:text-7xl font-bold text-gray-900 dark:text-gray-100 leading-tight tracking-tight">
Your Self-Hosted
<span class="text-primary">Productivity</span>
<br class="hidden lg:block" />
& <span class="text-primary">Knowledge</span> Hub
</h1>
<p class="text-xl lg:text-2xl text-gray-600 dark:text-gray-400 leading-relaxed text-pretty max-w-2xl">
Track, save, and organize everything that matters to you all in one place, under your control.
No subscriptions, no data mining, just pure productivity.
</p>
</div>
<!-- Quick Install Component -->
<QuickInstall class="scale-95 lg:scale-100" />
<!-- Feature Highlights -->
<div class="grid grid-cols-1 sm:grid-cols-3 gap-6 pt-8">
<div class="text-center lg:text-left group">
<div class="flex items-center justify-center lg:justify-start mb-3">
<div class="bg-primary/10 text-primary p-3 rounded-xl group-hover:bg-primary/20 transition-papra">
<i class="ph ph-lock-simple text-2xl"></i>
</div>
<span class="font-semibold text-gray-900 dark:text-gray-100 ml-3">Privacy First</span>
</div>
<p class="text-gray-600 dark:text-gray-400 leading-relaxed">Your data stays yours</p>
</div>
<div class="text-center lg:text-left group">
<div class="flex items-center justify-center lg:justify-start mb-3">
<div class="bg-primary/10 text-primary p-3 rounded-xl group-hover:bg-primary/20 transition-papra">
<i class="ph ph-code text-2xl"></i>
</div>
<span class="font-semibold text-gray-900 dark:text-gray-100 ml-3">Open Source</span>
</div>
<p class="text-gray-600 dark:text-gray-400 leading-relaxed">Transparent & customizable</p>
</div>
<div class="text-center lg:text-left group">
<div class="flex items-center justify-center lg:justify-start mb-3">
<div class="bg-primary/10 text-primary p-3 rounded-xl group-hover:bg-primary/20 transition-papra">
<i class="ph ph-devices text-2xl"></i>
</div>
<span class="font-semibold text-gray-900 dark:text-gray-100 ml-3">All-in-One</span>
</div>
<p class="text-gray-600 dark:text-gray-400 leading-relaxed">Replace multiple apps</p>
</div>
</div>
<!-- CTA Buttons -->
<div class="flex flex-col sm:flex-row gap-4 justify-center lg:justify-start pt-8">
<a href="#features" @click="(e) => handleCTAClick(e, 'features')" class="btn-primary text-center">
Explore Features
</a>
<a href="https://demo.trackeep.org" target="_blank" class="btn-outline text-center">
View Demo
</a>
</div>
</div>
<!-- Right Content - Hero Image -->
<div class="relative">
<div class="relative rounded-3xl overflow-hidden shadow-strong">
<img
src="/hero-dashboard.png"
alt="Trackeep Dashboard"
class="w-full h-auto transform hover:scale-105 transition-papra duration-700"
@error="(e: Event) => { const target = e.target as HTMLImageElement; target.style.display='none'; heroImageError = true }"
/>
<!-- Placeholder if image fails to load -->
<div v-if="heroImageError" class="bg-gradient-to-br from-gray-100 to-gray-200 dark:from-gray-800 dark:to-gray-700 border border-gray-200 dark:border-gray-600 rounded-3xl p-16 min-h-[500px] flex items-center justify-center">
<div class="text-center">
<i class="ph ph-monitor text-8xl text-primary mb-6"></i>
<p class="text-xl text-gray-600 dark:text-gray-400 font-medium">Dashboard Preview</p>
</div>
</div>
</div>
<!-- Floating badges -->
<div class="absolute -top-6 -right-6 bg-primary text-white px-6 py-3 rounded-2xl font-bold shadow-strong transform rotate-3">
v1.0.0
</div>
<div class="absolute -bottom-6 -left-6 bg-white dark:bg-gray-900 border-2 border-gray-200 dark:border-gray-700 px-6 py-3 rounded-2xl font-bold shadow-strong transform -rotate-3">
<i class="ph ph-star-fill text-yellow-500 mr-2"></i>
4.9/5 Rating
</div>
</div>
</div>
</div>
</section>
<!-- Features Section -->
<section id="features" class="py-24 bg-gradient-to-br from-gray-50 to-white dark:from-gray-800/50 dark:to-gray-900">
<div class="max-w-7xl mx-auto px-6 sm:px-8 lg:px-12">
<div class="text-center mb-20">
<h2 class="text-4xl lg:text-6xl font-bold text-gray-900 dark:text-gray-100 mb-8 leading-tight tracking-tight">
Everything You Need to Stay
<span class="text-primary">Organized</span>
</h2>
<p class="text-xl lg:text-2xl text-gray-600 dark:text-gray-400 leading-relaxed text-pretty max-w-4xl mx-auto">
Trackeep combines all your productivity tools into one seamless experience with powerful features designed for modern workflows
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
<FeatureCard
icon="ph ph-bookmark-simple"
title="Bookmarks & Links"
description="Save and categorize web content with smart tags, powerful search, and automatic organization"
/>
<FeatureCard
icon="ph ph-check-square"
title="Task Management"
description="Plan and track your to-dos with customizable workflows, due dates, and priority levels"
/>
<FeatureCard
icon="ph ph-folder-simple"
title="File Storage"
description="Upload and organize documents with version control, sharing, and advanced search"
/>
<FeatureCard
icon="ph ph-sparkle"
title="AI-Powered"
description="Smart recommendations and automated organization with optional AI features"
/>
<FeatureCard
icon="ph ph-shield-check"
title="Privacy First"
description="Self-hosted and secure with end-to-end encryption and complete data control"
/>
<FeatureCard
icon="ph ph-device-mobile"
title="Mobile App"
description="Native iOS and Android apps for on-the-go access and offline support"
/>
</div>
</div>
</section>
<!-- Benefits Section -->
<section class="py-20 bg-white dark:bg-gray-900">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16">
<h2 class="text-3xl lg:text-4xl font-bold text-gray-900 dark:text-gray-100 mb-4">
Why Choose
<span class="text-primary">Trackeep</span>
</h2>
<p class="text-xl text-gray-600 dark:text-gray-400 max-w-3xl mx-auto">
The perfect balance of simplicity, privacy, and power
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
<div class="text-center">
<div class="bg-primary/10 text-primary w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4">
<i class="ph ph-lock-simple text-2xl"></i>
</div>
<h3 class="text-xl font-semibold text-gray-900 dark:text-gray-100 mb-3">Privacy First</h3>
<p class="text-gray-600 dark:text-gray-400">Your data stays yours. No tracking, no data mining, complete control over your information.</p>
</div>
<div class="text-center">
<div class="bg-primary/10 text-primary w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4">
<i class="ph ph-code text-2xl"></i>
</div>
<h3 class="text-xl font-semibold text-gray-900 dark:text-gray-100 mb-3">Open Source</h3>
<p class="text-gray-600 dark:text-gray-400">Transparent and customizable. Audit the code, modify features, contribute to the community.</p>
</div>
<div class="text-center">
<div class="bg-primary/10 text-primary w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4">
<i class="ph ph-stack text-2xl"></i>
</div>
<h3 class="text-xl font-semibold text-gray-900 dark:text-gray-100 mb-3">All-in-One</h3>
<p class="text-gray-600 dark:text-gray-400">Replace multiple apps with one unified platform for bookmarks, tasks, files, and knowledge.</p>
</div>
<div class="text-center">
<div class="bg-primary/10 text-primary w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4">
<i class="ph ph-sparkle text-2xl"></i>
</div>
<h3 class="text-xl font-semibold text-gray-900 dark:text-gray-100 mb-3">AI Optional</h3>
<p class="text-gray-600 dark:text-gray-400">Use AI features when you want them, with full control over what gets processed.</p>
</div>
<div class="text-center">
<div class="bg-primary/10 text-primary w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4">
<i class="ph ph-credit-card text-2xl"></i>
</div>
<h3 class="text-xl font-semibold text-gray-900 dark:text-gray-100 mb-3">No Subscriptions</h3>
<p class="text-gray-600 dark:text-gray-400">One-time setup, no monthly fees. Pay for hosting, not for features.</p>
</div>
<div class="text-center">
<div class="bg-primary/10 text-primary w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4">
<i class="ph ph-arrow-counter-clockwise text-2xl"></i>
</div>
<h3 class="text-xl font-semibold text-gray-900 dark:text-gray-100 mb-3">Data Portability</h3>
<p class="text-gray-600 dark:text-gray-400">Export your data anytime. No vendor lock-in, standard formats supported.</p>
</div>
</div>
</div>
</section>
<!-- How It Works Section -->
<section id="how-it-works" class="py-20 bg-white dark:bg-gray-900">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16">
<h2 class="text-3xl lg:text-4xl font-bold text-gray-900 dark:text-gray-100 mb-4">
Get Started in
<span class="text-primary">3 Simple Steps</span>
</h2>
<p class="text-xl text-gray-600 dark:text-gray-400 max-w-3xl mx-auto">
From zero to productivity in minutes
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<div class="text-center">
<div class="bg-primary text-white w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4 text-2xl font-bold">
1
</div>
<h3 class="text-xl font-semibold mb-2">Deploy</h3>
<p class="text-gray-600 dark:text-gray-400">Simple Docker setup with one command</p>
</div>
<div class="text-center">
<div class="bg-primary text-white w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4 text-2xl font-bold">
2
</div>
<h3 class="text-xl font-semibold mb-2">Configure</h3>
<p class="text-gray-600 dark:text-gray-400">Set up your preferences and integrations</p>
</div>
<div class="text-center">
<div class="bg-primary text-white w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4 text-2xl font-bold">
3
</div>
<h3 class="text-xl font-semibold mb-2">Use</h3>
<p class="text-gray-600 dark:text-gray-400">Start organizing your digital life</p>
</div>
</div>
</div>
</section>
<!-- Tech Stack Section -->
<section id="tech-stack" class="py-20 bg-gray-50 dark:bg-gray-800/50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16">
<h2 class="text-3xl lg:text-4xl font-bold text-gray-900 dark:text-gray-100 mb-4">
Built with
<span class="text-primary">Modern Technology</span>
</h2>
<p class="text-xl text-gray-600 dark:text-gray-400 max-w-3xl mx-auto">
Powered by the best tools for performance and reliability
</p>
</div>
<div class="grid grid-cols-2 md:grid-cols-4 gap-8">
<div class="text-center">
<div class="bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg p-6 mb-4">
<i class="ph ph-code text-4xl text-primary mb-2"></i>
<h4 class="font-semibold">SolidJS</h4>
<p class="text-sm text-gray-600 dark:text-gray-400">Frontend Framework</p>
</div>
</div>
<div class="text-center">
<div class="bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg p-6 mb-4">
<i class="ph ph-gear text-4xl text-primary mb-2"></i>
<h4 class="font-semibold">Go</h4>
<p class="text-sm text-gray-600 dark:text-gray-400">Backend Language</p>
</div>
</div>
<div class="text-center">
<div class="bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg p-6 mb-4">
<i class="ph ph-database text-4xl text-primary mb-2"></i>
<h4 class="font-semibold">PostgreSQL</h4>
<p class="text-sm text-gray-600 dark:text-gray-400">Database</p>
</div>
</div>
<div class="text-center">
<div class="bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg p-6 mb-4">
<i class="ph ph-devices text-4xl text-primary mb-2"></i>
<h4 class="font-semibold">React Native</h4>
<p class="text-sm text-gray-600 dark:text-gray-400">Mobile Apps</p>
</div>
</div>
</div>
</div>
</section>
<!-- Testimonials Section -->
<section class="py-20 bg-gray-50 dark:bg-gray-800/50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16">
<h2 class="text-3xl lg:text-4xl font-bold text-gray-900 dark:text-gray-100 mb-4">
Loved by
<span class="text-primary">Productivity Enthusiasts</span>
</h2>
<p class="text-xl text-gray-600 dark:text-gray-400 max-w-3xl mx-auto">
See what our users are saying about Trackeep
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<div class="bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-xl p-6 shadow-sm">
<div class="flex items-center mb-4">
<div class="bg-primary/20 text-primary w-10 h-10 rounded-full flex items-center justify-center mr-3">
<i class="ph ph-user"></i>
</div>
<div>
<h4 class="font-semibold text-gray-900 dark:text-gray-100">Sarah Chen</h4>
<p class="text-sm text-gray-600 dark:text-gray-400">Product Manager</p>
</div>
</div>
<p class="text-gray-600 dark:text-gray-400 italic">"Trackeep transformed how I organize my work. Having everything in one place saves me hours every week."</p>
<div class="flex mt-4">
<i class="ph ph-star-fill text-yellow-500"></i>
<i class="ph ph-star-fill text-yellow-500"></i>
<i class="ph ph-star-fill text-yellow-500"></i>
<i class="ph ph-star-fill text-yellow-500"></i>
<i class="ph ph-star-fill text-yellow-500"></i>
</div>
</div>
<div class="bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-xl p-6 shadow-sm">
<div class="flex items-center mb-4">
<div class="bg-primary/20 text-primary w-10 h-10 rounded-full flex items-center justify-center mr-3">
<i class="ph ph-user"></i>
</div>
<div>
<h4 class="font-semibold text-gray-900 dark:text-gray-100">Alex Rodriguez</h4>
<p class="text-sm text-gray-600 dark:text-gray-400">Software Developer</p>
</div>
</div>
<p class="text-gray-600 dark:text-gray-400 italic">"Finally, a tool that respects my privacy. Self-hosting means I control my data completely."</p>
<div class="flex mt-4">
<i class="ph ph-star-fill text-yellow-500"></i>
<i class="ph ph-star-fill text-yellow-500"></i>
<i class="ph ph-star-fill text-yellow-500"></i>
<i class="ph ph-star-fill text-yellow-500"></i>
<i class="ph ph-star-fill text-yellow-500"></i>
</div>
</div>
<div class="bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-xl p-6 shadow-sm">
<div class="flex items-center mb-4">
<div class="bg-primary/20 text-primary w-10 h-10 rounded-full flex items-center justify-center mr-3">
<i class="ph ph-user"></i>
</div>
<div>
<h4 class="font-semibold text-gray-900 dark:text-gray-100">Emily Watson</h4>
<p class="text-sm text-gray-600 dark:text-gray-400">Content Creator</p>
</div>
</div>
<p class="text-gray-600 dark:text-gray-400 italic">"The AI features are incredible but optional. I love having the choice to use them when needed."</p>
<div class="flex mt-4">
<i class="ph ph-star-fill text-yellow-500"></i>
<i class="ph ph-star-fill text-yellow-500"></i>
<i class="ph ph-star-fill text-yellow-500"></i>
<i class="ph ph-star-fill text-yellow-500"></i>
<i class="ph ph-star text-yellow-500"></i>
</div>
</div>
</div>
</div>
</section>
<!-- Final CTA Section -->
<section class="py-20 bg-primary">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
<h2 class="text-3xl lg:text-4xl font-bold text-white mb-6">
Ready to Take Control of Your Digital Life?
</h2>
<p class="text-xl text-white/90 mb-8 max-w-3xl mx-auto">
Join thousands of users who have already made the switch to self-hosted productivity.
No subscriptions, no data mining, just pure productivity.
</p>
<div class="flex flex-col sm:flex-row gap-4 justify-center mb-8">
<a href="#features" @click="(e) => handleCTAClick(e, 'features')" class="bg-white text-primary px-8 py-4 rounded-lg font-semibold hover:bg-gray-100 transition-colors">
Explore Features
</a>
<a href="https://demo.trackeep.org" target="_blank" class="border-2 border-white text-white px-8 py-4 rounded-lg font-semibold hover:bg-white hover:text-primary transition-colors">
View Live Demo
</a>
</div>
<!-- Quick Install Command -->
<div class="bg-white/10 backdrop-blur-sm border border-white/20 rounded-xl p-6 max-w-2xl mx-auto">
<p class="text-white mb-4 font-medium">Install Trackeep in seconds:</p>
<div class="relative bg-black/20 border border-white/30 rounded-lg p-4">
<code class="text-white text-sm font-mono">curl -sSL https://trackeep.org/install.sh | sh</code>
<button
@click="copyCommand"
class="absolute top-2 right-2 p-2 bg-white/20 hover:bg-white/30 rounded transition-colors"
aria-label="Copy command"
>
<i class="ph ph-copy text-white"></i>
</button>
</div>
</div>
</div>
</section>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import QuickInstall from '../components/QuickInstall.vue'
import FeatureCard from '../components/FeatureCard.vue'
import { useSmoothScroll } from '../composables/useSmoothScroll'
const { scrollToSection } = useSmoothScroll()
const heroImageError = ref(false)
const copyCommand = async () => {
const command = 'curl -sSL https://trackeep.org/install.sh | sh'
try {
await navigator.clipboard.writeText(command)
} catch (err) {
const textArea = document.createElement('textarea')
textArea.value = command
document.body.appendChild(textArea)
textArea.select()
document.execCommand('copy')
document.body.removeChild(textArea)
}
}
const handleCTAClick = (event: Event, sectionId: string) => {
event.preventDefault()
scrollToSection(sectionId)
}
</script>