-
+ {/* ═══════ FOOTER ═══════ */}
+
+
+
)
}
-// ── Data ──
+// ────────────────────────────────────────────────────────────
+// Sub-components
+// ────────────────────────────────────────────────────────────
-const features = [
- {
- icon: '\u{1F510}',
- iconLabel: 'Locked padlock',
- title: 'Biometric Authentication',
- description: 'Advanced face recognition with liveness detection and anti-spoofing measures.',
- },
- {
- icon: '\u{1F3E2}',
- iconLabel: 'Office building',
- title: 'Multi-Tenant Architecture',
- description: 'Isolated data and configurations per tenant with row-level security.',
- },
- {
- icon: '\u{1F465}',
- iconLabel: 'People',
- title: 'User Management',
- description: 'Comprehensive user lifecycle management with RBAC permissions.',
- },
- {
- icon: '\u{1F4CA}',
- iconLabel: 'Bar chart',
- title: 'Audit Logging',
- description: 'Complete audit trail for compliance and security monitoring.',
- },
- {
- icon: '\u{1F511}',
- iconLabel: 'Key',
- title: 'JWT Authentication',
- description: 'Secure token-based authentication with refresh token rotation.',
- },
- {
- icon: '\u{1F4F1}',
- iconLabel: 'Mobile phone',
- title: 'Cross-Platform SDKs',
- description: 'Native support for Android, iOS, and Desktop applications.',
- },
-]
+function SectionHead({ kicker, title, sub, compact = false }: { kicker: string; title: string; sub?: string; compact?: boolean }) {
+ return (
+
+
+
+ {kicker}
+
+
+ {title}
+
+ {sub && {sub}
}
+
+ )
+}
-const howItWorks = [
- {
- title: 'Register',
- description: 'Create a tenant account and configure your authentication flow with the methods you need.',
- icon: '\u{1F4DD}',
- iconLabel: 'Memo',
- },
- {
- title: 'Enroll Biometric',
- description: 'Users enroll their face, voice, or other biometric data through secure capture.',
- icon: '\u{1F9D1}',
- iconLabel: 'Person',
- },
- {
- title: 'Authenticate',
- description: 'Verify identity in real-time using multi-step flows combining any of 10 auth methods.',
- icon: '\u{2705}',
- iconLabel: 'Check mark',
- },
-]
+function ArchLayer({ label, single, children }: { label: string; single?: boolean; children: React.ReactNode }) {
+ return (
+
+
{label}
+
+ {children}
+
+
+ )
+}
-const techStack = [
- { logo: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/spring/spring-original.svg', name: 'Spring Boot', description: 'Identity Core API' },
- { logo: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/fastapi/fastapi-original.svg', name: 'FastAPI', description: 'Biometric Processor' },
- { logo: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/react/react-original.svg', name: 'React', description: 'Admin Dashboard' },
- { logo: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/kotlin/kotlin-original.svg', name: 'Kotlin', description: 'Mobile/Desktop Apps' },
- { logo: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/postgresql/postgresql-original.svg', name: 'PostgreSQL', description: 'Primary Database' },
- { logo: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/redis/redis-original.svg', name: 'Redis', description: 'Cache & Queue' },
- { logo: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/docker/docker-original.svg', name: 'Docker', description: 'Containerization' },
- { logo: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/traefikproxy/traefikproxy-original.svg', name: 'Traefik', description: 'API Gateway + TLS' },
-]
+function ArchNode({ icon, title, accent = false }: { icon: keyof typeof icons; title: string; accent?: boolean }) {
+ return (
+
+ )
+}
-const services = [
- {
- icon: '\u{1F510}',
- iconLabel: 'Locked padlock',
- name: 'Identity Core API',
- description: 'Central authentication and identity management service handling users, tenants, and permissions.',
- tech: ['Spring Boot 3.4.7', 'Java 21', 'PostgreSQL', 'Redis'],
- },
- {
- icon: '\u{1F441}\uFE0F',
- iconLabel: 'Eye',
- name: 'Biometric Processor',
- description: 'ML-powered face recognition engine with 46+ endpoints for enrollment, verification, and analysis.',
- tech: ['FastAPI', 'Python 3.12', 'InsightFace', 'pgvector'],
- },
- {
- icon: '\u{1F5A5}\uFE0F',
- iconLabel: 'Desktop computer',
- name: 'Admin Dashboard',
- description: 'Feature-rich web application for tenant administrators to manage users and monitor activity.',
- tech: ['React 18', 'TypeScript', 'MUI', 'Redux Toolkit'],
- },
+// ────────────────────────────────────────────────────────────
+// Data
+// ────────────────────────────────────────────────────────────
+
+const techStack = [
+ { logo: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/spring/spring-original.svg', name: 'Spring Boot' },
+ { logo: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/fastapi/fastapi-original.svg', name: 'FastAPI' },
+ { logo: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/react/react-original.svg', name: 'React' },
+ { logo: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/kotlin/kotlin-original.svg', name: 'Kotlin' },
+ { logo: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/postgresql/postgresql-original.svg', name: 'PostgreSQL' },
+ { logo: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/redis/redis-original.svg', name: 'Redis' },
+ { logo: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/docker/docker-original.svg', name: 'Docker' },
+ { logo: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/traefikproxy/traefikproxy-original.svg', name: 'Traefik' },
]
const teamMembers = [
- {
- initials: 'AG',
- name: 'Ahmet Abdullah Gültekin',
- role: 'Project Lead · Full-Stack Developer',
- scope: 'Architecture · Backend · Frontend · Mobile · Biometrics · ML · DevOps',
- gradient: 'from-blue-500 to-violet-500',
- },
- {
- initials: 'AE',
- name: 'Ayşe Gülsüm Eren',
- role: 'Mobile & Puzzle Developer',
- scope: 'Kotlin Multiplatform · Biometric Puzzles · Hand Tracking',
- gradient: 'from-fuchsia-500 to-pink-500',
- },
- {
- initials: 'AA',
- name: 'Ayşenur Arıcı',
- role: 'ML & Vision Researcher',
- scope: 'YOLO Training · Liveness · Anti-Spoofing',
- gradient: 'from-emerald-500 to-teal-500',
- },
+ { initials: 'AG', name: 'Ahmet Abdullah Gültekin', role: 'Project Lead · Full-Stack', scope: 'Architecture · Backend · Frontend · Mobile · Biometrics · ML · DevOps', gradient: 'from-primary-500 to-accent-500' },
+ { initials: 'AE', name: 'Ayşe Gülsüm Eren', role: 'Mobile & Puzzle Developer', scope: 'Kotlin Multiplatform · Biometric Puzzles · Hand Tracking', gradient: 'from-fuchsia-500 to-pink-500' },
+ { initials: 'AA', name: 'Ayşenur Arıcı', role: 'ML & Vision Researcher', scope: 'YOLO Training · Liveness · Anti-Spoofing', gradient: 'from-emerald-500 to-teal-500' },
]
-
-export default App
diff --git a/landing-website/src/index.css b/landing-website/src/index.css
index 6213b17..8bbc095 100644
--- a/landing-website/src/index.css
+++ b/landing-website/src/index.css
@@ -2,39 +2,120 @@
@tailwind components;
@tailwind utilities;
+:root {
+ color-scheme: dark;
+}
+
+html {
+ scroll-behavior: smooth;
+}
+
body {
font-family: 'Inter', system-ui, sans-serif;
+ background: #070713;
+ color: #e6e6f0;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
+ text-rendering: optimizeLegibility;
+ font-feature-settings: 'ss01', 'ss02', 'cv01', 'cv09';
+ overflow-x: hidden;
}
@layer utilities {
.gradient-text {
- @apply bg-clip-text text-transparent bg-gradient-to-r from-primary-500 to-accent-500;
+ @apply bg-clip-text text-transparent;
+ background-image: linear-gradient(135deg, #ffffff 0%, #a5b4fc 35%, #22d3ee 80%);
}
-
- .gradient-bg {
- @apply bg-gradient-to-br from-slate-900 via-slate-800 to-slate-900;
+ .gradient-text-accent {
+ @apply bg-clip-text text-transparent;
+ background-image: linear-gradient(135deg, #a78bfa, #6366f1);
+ }
+ .glass {
+ background: rgba(17, 17, 32, 0.6);
+ backdrop-filter: blur(20px) saturate(1.4);
+ -webkit-backdrop-filter: blur(20px) saturate(1.4);
+ border: 1px solid rgba(99, 102, 241, 0.15);
+ }
+ .dot-grid {
+ background-image: radial-gradient(rgba(148, 163, 184, 0.18) 1px, transparent 1px);
+ background-size: 24px 24px;
+ }
+ .mask-fade-b {
+ -webkit-mask-image: linear-gradient(to bottom, black 60%, transparent 100%);
+ mask-image: linear-gradient(to bottom, black 60%, transparent 100%);
+ }
+ .ring-glow {
+ box-shadow: 0 0 0 1px rgba(99, 102, 241, 0.4), 0 20px 60px -20px rgba(99, 102, 241, 0.55);
}
}
-/* Slow ambient pulse for background blobs */
-@keyframes pulse-slow {
- 0%, 100% { opacity: 0.6; transform: scale(1); }
- 50% { opacity: 1; transform: scale(1.08); }
+/* Selection + scrollbar */
+::selection {
+ background-color: rgba(99, 102, 241, 0.35);
+ color: #fff;
}
+::-webkit-scrollbar { width: 10px; height: 10px; }
+::-webkit-scrollbar-track { background: #070713; }
+::-webkit-scrollbar-thumb { background: #2a2a40; border-radius: 10px; border: 2px solid #070713; }
+::-webkit-scrollbar-thumb:hover { background: #3b3b56; }
-.animate-pulse-slow {
- animation: pulse-slow 6s ease-in-out infinite;
+/* Ambient aurora background */
+.aurora {
+ position: fixed;
+ inset: 0;
+ pointer-events: none;
+ z-index: 0;
+ overflow: hidden;
+}
+.aurora::before,
+.aurora::after {
+ content: '';
+ position: absolute;
+ border-radius: 50%;
+ filter: blur(130px);
+ opacity: 0.55;
+}
+.aurora::before {
+ width: 640px;
+ height: 640px;
+ top: -200px;
+ right: -140px;
+ background: radial-gradient(circle, rgba(99, 102, 241, 0.35), transparent 70%);
+ animation: drift-a 28s ease-in-out infinite alternate;
+}
+.aurora::after {
+ width: 520px;
+ height: 520px;
+ bottom: 10%;
+ left: -180px;
+ background: radial-gradient(circle, rgba(34, 211, 238, 0.22), transparent 70%);
+ animation: drift-b 34s ease-in-out infinite alternate;
+}
+@keyframes drift-a {
+ 0% { transform: translate(0, 0) scale(1); }
+ 100% { transform: translate(-80px, 60px) scale(1.2); }
+}
+@keyframes drift-b {
+ 0% { transform: translate(0, 0) scale(1); }
+ 100% { transform: translate(60px, -90px) scale(1.2); }
}
-/* Smooth scroll */
-html {
- scroll-behavior: smooth;
+/* Noise texture overlay */
+.noise::before {
+ content: '';
+ position: fixed;
+ inset: 0;
+ pointer-events: none;
+ z-index: 1;
+ opacity: 0.03;
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.5 0'/%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23n)'/%3E%3C/svg%3E");
}
-/* Selection color */
-::selection {
- background-color: rgba(59, 130, 246, 0.3);
- color: white;
+@media (prefers-reduced-motion: reduce) {
+ *, *::before, *::after {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ scroll-behavior: auto !important;
+ }
}
diff --git a/landing-website/tailwind.config.js b/landing-website/tailwind.config.js
index e22e42d..c8cb158 100644
--- a/landing-website/tailwind.config.js
+++ b/landing-website/tailwind.config.js
@@ -8,25 +8,79 @@ export default {
extend: {
colors: {
primary: {
- 50: '#eff6ff',
- 100: '#dbeafe',
- 200: '#bfdbfe',
- 300: '#93c5fd',
- 400: '#60a5fa',
- 500: '#3b82f6',
- 600: '#2563eb',
- 700: '#1d4ed8',
- 800: '#1e40af',
- 900: '#1e3a8a',
+ 50: '#eef2ff',
+ 100: '#e0e7ff',
+ 200: '#c7d2fe',
+ 300: '#a5b4fc',
+ 400: '#818cf8',
+ 500: '#6366f1',
+ 600: '#4f46e5',
+ 700: '#4338ca',
+ 800: '#3730a3',
+ 900: '#312e81',
},
accent: {
400: '#a78bfa',
500: '#8b5cf6',
600: '#7c3aed',
- }
+ },
+ cyan: {
+ 400: '#22d3ee',
+ 500: '#06b6d4',
+ 600: '#0891b2',
+ },
+ trust: {
+ 400: '#34d399',
+ 500: '#10b981',
+ 600: '#059669',
+ },
+ // custom canvas tokens
+ canvas: {
+ DEFAULT: '#070713',
+ sub: '#0c0c1a',
+ card: '#11112099',
+ border: '#1e1e2f',
+ borderStrong: '#2e2e44',
+ },
},
fontFamily: {
sans: ['Inter', 'system-ui', 'sans-serif'],
+ display: ['"Space Grotesk"', 'Inter', 'sans-serif'],
+ mono: ['"JetBrains Mono"', 'ui-monospace', 'Menlo', 'monospace'],
+ },
+ boxShadow: {
+ 'glow-primary': '0 10px 40px rgba(99, 102, 241, 0.35)',
+ 'glow-accent': '0 10px 40px rgba(139, 92, 246, 0.35)',
+ 'soft': '0 8px 32px rgba(0, 0, 0, 0.25)',
+ },
+ backgroundImage: {
+ 'grid-slate': "linear-gradient(rgba(99,102,241,0.05) 1px, transparent 1px), linear-gradient(90deg, rgba(99,102,241,0.05) 1px, transparent 1px)",
+ 'radial-primary': "radial-gradient(circle at center, rgba(99,102,241,0.2) 0%, transparent 60%)",
+ },
+ animation: {
+ 'pulse-slow': 'pulse-slow 6s ease-in-out infinite',
+ 'float': 'float 8s ease-in-out infinite',
+ 'scan': 'scan 2.4s ease-in-out infinite',
+ 'shimmer': 'shimmer 3s linear infinite',
+ },
+ keyframes: {
+ 'pulse-slow': {
+ '0%, 100%': { opacity: '0.55', transform: 'scale(1)' },
+ '50%': { opacity: '0.95', transform: 'scale(1.08)' },
+ },
+ 'float': {
+ '0%, 100%': { transform: 'translateY(0px)' },
+ '50%': { transform: 'translateY(-12px)' },
+ },
+ 'scan': {
+ '0%': { transform: 'translateY(-110%)' },
+ '50%': { transform: 'translateY(110%)' },
+ '100%': { transform: 'translateY(-110%)' },
+ },
+ 'shimmer': {
+ '0%': { backgroundPosition: '-200% 0' },
+ '100%': { backgroundPosition: '200% 0' },
+ },
},
},
},
diff --git a/web-app b/web-app
index 4e4cdd3..ff17a57 160000
--- a/web-app
+++ b/web-app
@@ -1 +1 @@
-Subproject commit 4e4cdd393d3ac0a471f2661f83e8aeb0a2da588c
+Subproject commit ff17a57c3fc3e8537d9754b4df94dcb4cb9fe983