🔍 ESC
↑ ↑ ↓ ↓ ← → ← → B A
AETHERION CHEAT CODE ACTIVATED
click anywhere to close
Press ⌘K or Ctrl+K to open command palette
ΔΙΑΘΕΣΙΜΟΣ
↑
💬
A
Aetherion Assistant
Online
Γεια! 👋 Είμαι ο AI assistant της Aetherion Projects. Μπορώ να απαντήσω για υπηρεσίες, τιμές, timelines και projects. Τι θέλεις να μάθεις;
← Πίσω

Ολοκλήρωση παραγγελίας

1
Καλάθι
2
Στοιχεία
3
Πληρωμή
4
Επιβεβαίωση

Τα domains σου

Σύνοψη

Υποσύνολο €0.00
ΦΠΑ 24% €0.00
Σύνολο €0.00
'; if(ch) ch.textContent=ed.value.length+' chars'; } window.pgUpdate=upd; window.pgReset=function(){ed.value=DEF;upd();}; window.pgSnippet=function(k){ed.value=SN[k]||DEF;upd();}; ed.addEventListener('keydown',function(e){ if((e.ctrlKey||e.metaKey)&&e.key==='Enter'){e.preventDefault();upd();} if(e.key==='Tab'){e.preventDefault();var s=ed.selectionStart;ed.value=ed.value.slice(0,s)+' '+ed.value.slice(ed.selectionEnd);ed.selectionStart=ed.selectionEnd=s+2;} }); ed.value=DEF; upd(); })(); /* ══ SERVER LOGS ════════════════════════════════════════════════════ */ (function(){ var out=document.getElementById('log-output'); if(!out) return; var C={'GET':'#4ade80','POST':'#818cf8','PUT':'#fbbf24','DELETE':'#f87171','200':'#4ade80','201':'#34d399','204':'#60a5fa','[WS]':'#c084fc','[DB]':'#60a5fa','[CRON]':'#fb923c'}; var R=[ ['GET','/api/v2/devices','200','18ms'],['POST','/api/v2/location','201','12ms'], ['GET','/api/v2/fleet','200','24ms'],['GET','/api/v2/alerts','200','8ms'], ['POST','/api/v2/auth/token','200','31ms'],['PUT','/api/v2/devices/3421','200','14ms'], ['[WS]','device:3421 connected','',''],['[WS]','device:1189 location update','',''], ['[DB]','SELECT devices WHERE active=true','','4ms'],['[CRON]','heartbeat 2.147 devices','',''], ['GET','/api/v2/map/tiles','200','6ms'],['DELETE','/api/v2/sessions/old','204','9ms'], ['POST','/api/v2/webhooks','200','22ms'],['[WS]','fleet:DE-Munich 14 vehicles','',''], ]; function addLog(){ var e=R[Math.floor(Math.random()*R.length)]; var t=new Date().toLocaleTimeString('en',{hour12:false}); var d=document.createElement('div'); d.style='border-bottom:1px solid rgba(255,255,255,.03);padding:.1rem 0;display:flex;gap:.6rem;overflow:hidden'; d.innerHTML=''+t+'' +''+e[0]+'' +''+e[1]+'' +(e[2]?''+e[2]+'':'') +(e[3]?''+e[3]+'':''); out.appendChild(d); if(out.children.length>40) out.removeChild(out.firstChild); out.scrollTop=out.scrollHeight; } setTimeout(function(){for(var i=0;i<5;i++)addLog();setInterval(addLog,1000+Math.random()*600);},800); function jitter(){ var api=20+Math.floor(Math.random()*20),db=8+Math.floor(Math.random()*12); var dev=2140+Math.floor(Math.random()*20),ws=840+Math.floor(Math.random()*20); function s(id,v){var e=document.getElementById(id);if(e)e.textContent=v;} function w(id,pct){var e=document.getElementById(id);if(e)e.style.width=pct+'%';} s('pm-api',api+'ms');s('pm-db',db+'ms'); s('pm-dev',dev.toLocaleString('el-GR'));s('pm-ws',ws); w('pm-api-bar',Math.max(40,100-api*2));w('pm-db-bar',Math.max(60,100-db*3)); w('pm-dev-bar',dev/3000*100);w('pm-ws-bar',ws/2000*100); } setInterval(jitter,2000);setTimeout(jitter,1500); })(); /* ══ CUSTOM CURSOR ═══════════════════════════════════════════════════ */ (function(){ var dot = document.getElementById('cursor-dot'); var ring = document.getElementById('cursor-ring'); if(!dot||!ring||window.matchMedia('(hover:none)').matches) return; var dx=0,dy=0,rx=0,ry=0; window.addEventListener('mousemove',function(e){ dx=e.clientX; dy=e.clientY; dot.style.transform='translate(calc('+dx+'px - 50%), calc('+dy+'px - 50%))'; },{passive:true}); // ring removed // expand effects removed })(); /* ══ SOCIAL PROOF TOASTS (disabled) ════════════════════════════════ */ /* DISABLED (function(){ var container = document.getElementById('toast-container'); if(!container) return; var visitors = [ {name:'Μ. Παπαδόπουλος', city:'Αθήνα 🇬🇷', action:'είδε το Portfolio', color:'#818cf8'}, {name:'Klaus M.', city:'München 🇩🇪', action:'ζήτησε προσφορά', color:'#fbbf24'}, {name:'Γ. Κωνσταντίνου', city:'Θεσσαλονίκη 🇬🇷', action:'διάβασε για FahrTrack', color:'#E03030'}, {name:'Nikos A.', city:'Λευκωσία 🇨🇾', action:'άνοιξε το Contact', color:'#4ade80'}, {name:'Thomas B.', city:'Wien 🇦🇹', action:'χρησιμοποίησε το Terminal', color:'#c084fc'}, {name:'Σ. Αλεξάνδρου', city:'Πάτρα 🇬🇷', action:'είδε τις τιμές', color:'#fb923c'}, ]; var i=0; function showToast(){ var v=visitors[i%visitors.length]; i++; var t=document.createElement('div'); t.className='toast'; t.innerHTML= '
👤
'+ '
'+ '
'+v.name+'
'+ '
'+v.city+' · '+v.action+'
'+ '
'; container.appendChild(t); requestAnimationFrame(function(){ requestAnimationFrame(function(){ t.classList.add('show'); }); }); setTimeout(function(){ t.classList.remove('show'); setTimeout(function(){ if(t.parentNode) t.parentNode.removeChild(t); },400); }, 4500); } // Start after 3s, then every 8s setTimeout(showToast, 3000); setInterval(showToast, 8000); })(); /* ══ LIVE TYPING DEMO (simplified) ══════════════════════════════ */ (function(){ var code = document.getElementById('live-demo-code'); if(!code) return; var lines = [ 'const site = await buildSite({', ' stack: ["React", "Node", "Stripe"],', ' lighthouse: 98,', ' deploy: "netlify"', '});', 'await site.deploy(); // ✓ live!', ]; var li=0; var obs=new IntersectionObserver(function(entries){ if(!entries[0].isIntersecting) return; obs.disconnect(); (function next(){ if(li>=lines.length) return; var d=document.createElement('div'); d.innerHTML=lines[li++]; code.appendChild(d); if(li'+cmd.icon+''+ ''+cmd.label+''+ ''+cmd.sub+''; div.addEventListener('click', function(){ execute(cmd); }); div.addEventListener('mouseenter', function(){ selected=idx; updateSelected(); }); return div; } function updateSelected(){ results.querySelectorAll('.cmd-item').forEach(function(el,i){ el.classList.toggle('selected', i===selected); }); } function execute(cmd){ close(); setTimeout(function(){ if(cmd.r){ if(window.showPage) window.showPage(cmd.r); window.scrollTo(0,0); } else if(cmd.action==='whatsapp'){ window.open('https://wa.me/30398371244','_blank'); } else if(cmd.action==='email'){ window.location.href='mailto:info@aetherionprojects.cloud'; } else if(cmd.action==='dark'){ if(window.toggleDark) window.toggleDark(); } else if(cmd.action==='terminal'){ if(window.showPage) window.showPage('home'); setTimeout(function(){ var t=document.getElementById('term-input'); if(t){ t.scrollIntoView({behavior:'smooth',block:'center'}); t.focus(); } },500); } }, 100); } // Keyboard shortcuts document.addEventListener('keydown', function(e){ if((e.metaKey||e.ctrlKey) && e.key==='k'){ e.preventDefault(); open(); return; } if(!backdrop.classList.contains('open')) return; if(e.key==='Escape'){ close(); return; } if(e.key==='ArrowDown'){ e.preventDefault(); selected=Math.min(selected+1,filtered.length-1); updateSelected(); } if(e.key==='ArrowUp'){ e.preventDefault(); selected=Math.max(selected-1,0); updateSelected(); } if(e.key==='Enter'){ if(filtered[selected]) execute(filtered[selected]); } }); input.addEventListener('input', function(){ var q=input.value.toLowerCase(); if(!q){ render(commands); return; } render(commands.filter(function(c){ return c.label.toLowerCase().includes(q) || c.sub.toLowerCase().includes(q); })); }); backdrop.addEventListener('click', function(e){ if(e.target===backdrop) close(); }); })(); /* ══ CONFETTI 🎉 ═════════════════════════════════════════════════════ */ window.launchConfetti = function(x, y){ var colors=['#818cf8','#c084fc','#4ade80','#fb923c','#f472b6','#fbbf24','#60a5fa']; for(var i=0;i<60;i++){ (function(i){ var el=document.createElement('div'); el.className='confetti-piece'; var color=colors[Math.floor(Math.random()*colors.length)]; el.style.cssText='left:'+(x||50)+'%;top:'+(y||0)+'px;background:'+color+ ';border-radius:'+(Math.random()>.5?'50%':'2px')+ ';animation-duration:'+(Math.random()*1.5+1)+'s'+ ';animation-delay:'+(Math.random()*.5)+'s'; document.body.appendChild(el); setTimeout(function(){ el.remove(); }, 2500); })(i); } }; /* ══ MOUSE TRAIL 🌟 ══════════════════════════════════════════════════ */ (function(){ var colors=['#6366f1','#818cf8','#c084fc','#4ade80','#f472b6']; var ci=0; var lastX=0,lastY=0; window.addEventListener('mousemove',function(e){ if(Math.abs(e.clientX-lastX)<25 && Math.abs(e.clientY-lastY)<25) return; lastX=e.clientX; lastY=e.clientY; // Only on dark sections var el=document.elementFromPoint(e.clientX,e.clientY); var dark=false; for(var k=el,d=0;k&&d<5;k=k.parentElement,d++){ var bg=window.getComputedStyle(k).backgroundColor; if(bg&&(bg.includes('17, 17')||bg.includes('10, 10')||bg.includes('12, 12')||bg.includes('13, 13'))){ dark=true;break; } } if(!dark) return; var dot=document.createElement('div'); dot.className='trail-dot'; dot.style.cssText='left:'+e.clientX+'px;top:'+e.clientY+'px;background:'+colors[ci%colors.length]+';opacity:.7;animation-duration:'+(Math.random()*.3+.4)+'s'; ci++; document.body.appendChild(dot); setTimeout(function(){dot.remove();},700); },{passive:true}); })(); /* ══ KONAMI CODE ↑↑↓↓←→←→BA ══════════════════════════════════════ */ (function(){ var seq=[38,38,40,40,37,39,37,39,66,65]; var pos=0; document.addEventListener('keydown',function(e){ if(e.keyCode===seq[pos]){ pos++; if(pos===seq.length){ pos=0; var ov=document.getElementById('konami-overlay'); if(!ov) return; ov.classList.add('show'); window.launchConfetti && window.launchConfetti(50,0); // Matrix rain on the konami canvas var wrap=document.getElementById('konami-canvas-wrap'); if(wrap){ var c=document.createElement('canvas'); c.width=300;c.height=120; c.style.cssText='display:block;margin:0 auto;opacity:.6'; wrap.innerHTML=''; wrap.appendChild(c); var ctx=c.getContext('2d'); var chars='アイウエオΑΒΓΔ0101'; var cols=Math.floor(c.width/14); var drops=Array(cols).fill(1); var iv=setInterval(function(){ ctx.fillStyle='rgba(10,0,20,.15)'; ctx.fillRect(0,0,c.width,c.height); ctx.fillStyle='#c084fc'; ctx.font='13px monospace'; drops.forEach(function(y,i){ ctx.fillText(chars[Math.floor(Math.random()*chars.length)],i*14,y*14); if(y*14>c.height && Math.random()>.95) drops[i]=0; drops[i]++; }); },60); setTimeout(function(){ clearInterval(iv); },6000); } } } else { pos=0; } }); })(); /* ══ CONTACT FORM CONFETTI ═══════════════════════════════════════════ */ (function(){ var form=document.getElementById('contact-form'); if(!form) return; form.addEventListener('submit',function(e){ setTimeout(function(){ window.launchConfetti && window.launchConfetti(50,0); },400); }); // Also on chat send var chatSend=document.getElementById('chat-send'); if(chatSend){ chatSend.addEventListener('click',function(){ window.launchConfetti && window.launchConfetti(Math.random()*80+10,200); }); } })(); /* ══ TIME-BASED GREETING IN HERO ════════════════════════════════════ */ (function(){ var el=document.getElementById('hero-greeting'); if(!el) return; var h=new Date(new Date().toLocaleString('en',{timeZone:'Europe/Athens'})).getHours(); var greet= h<5?'🌙 Καλά ξημερώματα' : h<12?'☀️ Καλημέρα' : h<17?'🌤 Καλό απόγευμα' : h<21?'🌆 Καλό βράδυ' : '🌙 Καλό βράδυ'; el.textContent=greet; })(); /* ═══════════════════════════════════════════════════════════════════ AETHERION DOMAINS — API CLIENT Replace API_BASE with your deployed API URL when going live ═══════════════════════════════════════════════════════════════════ */ var API_BASE = (function(){ // In production: 'https://api.aetherionprojects.cloud/api/v1' // In local dev: 'http://localhost:3001/api/v1' var host = window.location.hostname; if (host === 'localhost' || host === '127.0.0.1') { return 'http://localhost:3001/api/v1'; } return 'https://api.aetherionprojects.cloud/api/v1'; })(); /* ── Auth state ─────────────────────────────────────────────────────── */ var _accessToken = localStorage.getItem('ae_access') || null; function getAuthHeaders() { return _accessToken ? { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + _accessToken } : { 'Content-Type': 'application/json' }; } /* ── Refresh access token using httpOnly cookie ─────────────────────── */ async function refreshAccessToken() { try { var res = await fetch(API_BASE + '/auth/refresh', { method: 'POST', credentials: 'include', // sends httpOnly cookie }); if (!res.ok) return false; var data = await res.json(); _accessToken = data.data.accessToken; localStorage.setItem('ae_access', _accessToken); return true; } catch { return false; } } /* ── Authenticated fetch with auto-refresh ──────────────────────────── */ async function apiFetch(url, options) { options = options || {}; options.headers = Object.assign({}, getAuthHeaders(), options.headers || {}); options.credentials = 'include'; var res = await fetch(API_BASE + url, options); // If 401 — try refreshing once if (res.status === 401) { var refreshed = await refreshAccessToken(); if (refreshed) { options.headers = Object.assign({}, getAuthHeaders(), options.headers || {}); res = await fetch(API_BASE + url, options); } } return res; } async function apiGet(url) { var res = await apiFetch(url); if (!res.ok) throw new Error((await res.json()).error?.message || 'API error'); var data = await res.json(); return data.data; } async function apiPost(url, body) { var res = await apiFetch(url, { method: 'POST', body: JSON.stringify(body), }); if (!res.ok) { var err = await res.json(); throw new Error(err.error?.message || 'API error'); } return (await res.json()).data; } async function apiPut(url, body) { var res = await apiFetch(url, { method: 'PUT', body: JSON.stringify(body), }); if (!res.ok) throw new Error((await res.json()).error?.message || 'API error'); return (await res.json()).data; } async function apiDelete(url) { var res = await apiFetch(url, { method: 'DELETE' }); if (!res.ok) throw new Error((await res.json()).error?.message || 'API error'); return (await res.json()).data; } /* ── Auth helpers ──────────────────────────────────────────────────── */ function isLoggedIn() { return !!_accessToken; } function getCurrentUser() { if (!_accessToken) return null; try { var payload = JSON.parse(atob(_accessToken.split('.')[1])); return payload; } catch { return null; } } async function apiLogin(email, password) { var res = await fetch(API_BASE + '/auth/login', { method: 'POST', credentials: 'include', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email, password }), }); if (!res.ok) { var err = await res.json(); throw new Error(err.error?.message || 'Invalid credentials'); } var data = await res.json(); _accessToken = data.data.accessToken; localStorage.setItem('ae_access', _accessToken); return data.data.user; } async function apiRegister(email, password, firstName, lastName) { var res = await fetch(API_BASE + '/auth/register', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email, password, firstName, lastName }), }); if (!res.ok) { var err = await res.json(); throw new Error(err.error?.message || 'Registration failed'); } // Auto-login after register return apiLogin(email, password); } async function apiLogout() { try { await apiFetch('/auth/logout', { method: 'POST' }); } catch {} _accessToken = null; localStorage.removeItem('ae_access'); } /* ── Cart ──────────────────────────────────────────────────────────── */ var cart = JSON.parse(localStorage.getItem('ae_domain_cart') || '[]'); function saveCart() { localStorage.setItem('ae_domain_cart', JSON.stringify(cart)); } function cartTotal() { return cart.reduce(function(s, i) { return s + i.price; }, 0); } var cart=JSON.parse(localStorage.getItem('ae_domain_cart')||'[]'); function cartTotal(){return cart.reduce(function(s,i){return s+i.price;},0);} function renderCart(){ var el=document.getElementById('cart-items'); var si=document.getElementById('sum-items'); var sub=cartTotal();var vat=sub*.24;var tot=sub+vat; if(el) el.innerHTML=cart.length===0?'

Άδειο καλάθι. Αναζήτηση →

':cart.map(function(i){return '
'+i.fqdn+'€'+i.price.toFixed(2)+'
';}).join(''); if(si) si.innerHTML=cart.map(function(i){return '
'+i.fqdn+'€'+i.price.toFixed(2)+'
';}).join(''); var s=document.getElementById('sum-sub'),v=document.getElementById('sum-vat'),t=document.getElementById('sum-total'),pt=document.getElementById('pay-total'); if(s)s.textContent='€'+sub.toFixed(2);if(v)v.textContent='€'+vat.toFixed(2);if(t)t.textContent='€'+tot.toFixed(2);if(pt)pt.textContent='€'+tot.toFixed(2); } function goStep(n){ for(var i=1;i<=4;i++){ var el=document.getElementById('co-step-'+i); var ind=document.getElementById('step-ind-'+i); if(el)el.style.display=i===n?'block':'none'; if(ind){ind.className='step'+(i