Açıklama Yok
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 5.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title>BizGaze Support</title>
  7. <style>
  8. :root{ --brand:#FFC708; --brand-d:#E0AC00; --blue:#1F3B73; --blue-d:#16294f; --blue-soft:#EAF0FB; --ink:#1f2430; --muted:#6b7280; --bg:#f6f8fb; --line:#e6e9ef; }
  9. *{box-sizing:border-box;}
  10. body{font-family:'Segoe UI',system-ui,sans-serif;background:var(--bg);color:var(--ink);margin:0;min-height:100vh;display:flex;flex-direction:column;}
  11. header{background:var(--blue);padding:.85rem 1.5rem;display:flex;justify-content:space-between;align-items:center;}
  12. .brandrow{display:flex;align-items:center;gap:.7rem;}
  13. .brand{font-weight:700;color:#fff;font-size:1.1rem;} .brand span{color:var(--brand);font-weight:600;}
  14. .signin{color:#dbe4f5;text-decoration:none;font-size:.9rem;border:1px solid #46598c;border-radius:8px;padding:.45rem 1rem;}
  15. .signin:hover{background:var(--blue-d);}
  16. .wrap{flex:1;display:grid;place-items:center;padding:2.5rem 1rem;}
  17. .inner{max-width:780px;width:100%;text-align:center;}
  18. h1{color:var(--blue);font-size:1.8rem;margin:0 0 .4rem;}
  19. .sub{color:var(--muted);margin-bottom:2.2rem;}
  20. .choices{display:flex;gap:1.4rem;flex-wrap:wrap;justify-content:center;}
  21. .choice{flex:1;min-width:260px;max-width:340px;background:#fff;border:1px solid var(--line);border-radius:18px;padding:2.2rem 1.6rem;text-decoration:none;color:var(--ink);box-shadow:0 10px 30px rgba(20,30,60,.06);transition:transform .12s,box-shadow .12s;}
  22. .choice:hover{transform:translateY(-3px);box-shadow:0 16px 38px rgba(20,30,60,.12);border-color:var(--brand);}
  23. .icon{width:66px;height:66px;border-radius:18px;display:grid;place-items:center;margin:0 auto 1.1rem;}
  24. .icon.share{background:#FFF7DA;} .icon.connect{background:var(--blue-soft);}
  25. .icon svg{width:34px;height:34px;}
  26. .choice h3{margin:.2rem 0 .4rem;color:var(--blue);font-size:1.15rem;}
  27. .choice p{margin:0;color:var(--muted);font-size:.9rem;line-height:1.5;}
  28. .foot{color:var(--muted);font-size:.82rem;margin-top:2.4rem;}
  29. footer{text-align:center;color:#9aa3b2;font-size:.8rem;padding:1rem;}
  30. .profile{position:relative}
  31. .profile .pbtn{display:flex;align-items:center;gap:.4rem;background:rgba(255,255,255,.14);color:#fff;border:1px solid #46598c;border-radius:10px;padding:.45rem .85rem;font-weight:600;font-size:.88rem;cursor:pointer}
  32. .profile .pbtn:hover{background:rgba(255,255,255,.24)}
  33. .profile .pmenu{position:absolute;right:0;top:calc(100% + 6px);background:#fff;border:1px solid #e6e9ef;border-radius:10px;box-shadow:0 10px 28px rgba(0,0,0,.18);min-width:190px;overflow:hidden;z-index:5000;display:none}
  34. .profile .pmenu.open{display:block}
  35. .profile .pmenu a{display:block;padding:.6rem .9rem;color:#1f2430;text-decoration:none;font-size:.9rem;cursor:pointer}
  36. .profile .pmenu a:hover{background:#f1f5f9}
  37. .profile .pmenu a.danger{color:#b91c1c;border-top:1px solid #eef1f6}
  38. </style>
  39. </head>
  40. <body>
  41. <header>
  42. <div class="brandrow">
  43. <img src="/logo.png" alt="" style="height:40px;width:auto;max-width:170px;border-radius:8px;object-fit:contain;background:#fff;padding:4px 10px" onerror="this.style.display='none'">
  44. <div class="brand">BizGaze <span>Support</span></div>
  45. </div>
  46. <div id="authArea"><a class="signin" href="/console">Staff sign in</a></div>
  47. </header>
  48. <div class="wrap">
  49. <div class="inner">
  50. <h1>How can we help you today?</h1>
  51. <div class="sub">Secure remote support — no downloads, you stay in control.</div>
  52. <div class="choices">
  53. <a class="choice" href="/share">
  54. <div class="icon share"><svg viewBox="0 0 24 24" fill="none" stroke="#BA7515" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2"/><path d="M8 21h8M12 17v4"/></svg></div>
  55. <h3>Share my screen</h3>
  56. <p>You need help. Get a one-time code and show your screen to a BizGaze support agent.</p>
  57. </a>
  58. <a class="choice" href="/connect">
  59. <div class="icon connect"><svg viewBox="0 0 24 24" fill="none" stroke="#1F3B73" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 17V7a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v10"/><path d="M2 21h20"/><path d="m9 9 3 3-3 3"/></svg></div>
  60. <h3>Connect to a screen</h3>
  61. <p>You're a support agent. Sign in, then enter the customer's code to view their screen.</p>
  62. </a>
  63. </div>
  64. <div class="foot">🔒 Screen sharing only starts after the customer approves it, and can be stopped anytime.</div>
  65. </div>
  66. </div>
  67. <footer>© BizGaze · Remote Support</footer>
  68. <script>
  69. function pEsc(s){return String(s==null?'':s).replace(/[&<>"]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;'}[c]));}
  70. function profileHTML(name){return '<div class="profile"><button class="pbtn" id="pbtn">'+pEsc(name)+' <span style="font-size:.65rem">&#9662;</span></button><div class="pmenu" id="pmenu"><a href="/console">Console / Dashboard</a><a id="plogout" class="danger">Logout</a></div></div>';}
  71. function wireProfile(){const btn=document.getElementById('pbtn'),menu=document.getElementById('pmenu');if(!btn)return;btn.onclick=(e)=>{e.stopPropagation();menu.classList.toggle('open');};document.addEventListener('click',()=>menu.classList.remove('open'));const lo=document.getElementById('plogout');if(lo)lo.onclick=async()=>{try{await fetch('/api/logout',{method:'POST'});}catch(_){}location.href='/';};}
  72. function makeBrandClickable(){document.querySelectorAll('.brandrow,.wordmark').forEach(el=>{el.style.cursor='pointer';el.addEventListener('click',()=>{location.href='/';});});}
  73. makeBrandClickable();
  74. (async function(){try{const r=await fetch('/api/me');if(r.ok){const me=await r.json();document.getElementById('authArea').innerHTML=profileHTML(me.name||me.email);wireProfile();}}catch(_){}})();
  75. </script>
  76. </body>
  77. </html>