| |
| user:jumpstartadmin [2026/06/17 15:26] – jumpstartadmin | user:jumpstartadmin [2026/06/17 15:50] (current) – external edit 127.0.0.1 |
|---|
| <!DOCTYPE html> | Movement tech enthusiast. Building JumpStart to make Deadlock movement accessible to everyone. |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Profile — JumpStart</title> | |
| <style> | |
| @font-face { font-family:'Forevs'; src:url('/wiki/lib/tpl/bootstrap3/fonts/ForevsDemo-Bold.otf') format('opentype'); font-weight:bold; } | |
| @font-face { font-family:'Radiance'; src:url('/wiki/lib/tpl/bootstrap3/fonts/radiance-semibold.otf') format('opentype'); font-weight:600; } | |
| @font-face { font-family:'Radiance'; src:url('/wiki/lib/tpl/bootstrap3/fonts/radiance-regular.otf') format('opentype'); font-weight:400; } | |
| *,*::before,*::after{box-sizing:border-box;margin:0;padding:0;} | |
| html,body{height:100%;overflow:hidden;background:#0a0716;color:#EDE8F5;font-family:'Radiance',sans-serif;} | |
| .profile-bg{position:fixed;inset:0;z-index:0;background:radial-gradient(ellipse at 30% 60%,rgba(107,79,187,0.12) 0%,transparent 60%),radial-gradient(ellipse at 80% 20%,rgba(61,43,122,0.08) 0%,transparent 50%),#0a0716;} | |
| .profile-bg::after{content:'';position:absolute;inset:0;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,0,0,0.03) 2px,rgba(0,0,0,0.03) 4px);pointer-events:none;} | |
| .profile-wrap::before{content:'';position:fixed;top:70px;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent 0%,#6B4FBB 30%,#B8ADDB 50%,#6B4FBB 70%,transparent 100%);z-index:10;pointer-events:none;} | |
| .profile-wrap{position:fixed;inset:0;padding-top:70px;display:flex;z-index:1;overflow:hidden;} | |
| .profile-left{width:300px;flex-shrink:0;background:rgba(18,15,41,0.85);border-right:1px solid rgba(107,79,187,0.2);display:flex;flex-direction:column;align-items:center;padding:48px 28px 32px;overflow-y:auto;scrollbar-width:none;} | |
| .profile-left::-webkit-scrollbar{display:none;} | |
| .avatar-ring{width:130px;height:130px;border-radius:50%;padding:3px;background:linear-gradient(135deg,#6B4FBB,#B8ADDB,#3D2B7A);margin-bottom:20px;flex-shrink:0;} | |
| .avatar-img{width:100%;height:100%;border-radius:50%;object-fit:cover;background:#1a1433;display:block;} | |
| .profile-role{display:inline-block;padding:3px 14px;border-radius:2px;background:rgba(107,79,187,0.25);border:1px solid rgba(107,79,187,0.45);font-size:0.6rem;font-weight:600;letter-spacing:0.2em;text-transform:uppercase;color:#B8ADDB;margin-bottom:16px;} | |
| .profile-name{font-family:'Forevs',serif;font-size:1.6rem;font-weight:bold;letter-spacing:0.06em;color:#EDE8F5;text-align:center;text-shadow:0 0 24px rgba(107,79,187,0.5);margin-bottom:4px;} | |
| .profile-username{font-size:0.8rem;color:rgba(184,173,219,0.45);letter-spacing:0.1em;margin-bottom:24px;} | |
| .profile-bio{font-size:0.88rem;color:rgba(184,173,219,0.7);line-height:1.6;text-align:center;margin-bottom:32px;font-style:italic;} | |
| .left-divider{width:100%;height:1px;background:rgba(107,79,187,0.15);margin-bottom:24px;} | |
| .profile-stats{display:flex;width:100%;margin-bottom:28px;border:1px solid rgba(107,79,187,0.18);border-radius:3px;overflow:hidden;} | |
| .profile-stat{flex:1;display:flex;flex-direction:column;align-items:center;padding:14px 8px;background:rgba(18,15,41,0.5);border-right:1px solid rgba(107,79,187,0.12);} | |
| .profile-stat:last-child{border-right:none;} | |
| .stat-val{font-family:'Forevs',serif;font-size:1.4rem;font-weight:bold;color:#EDE8F5;line-height:1;margin-bottom:4px;} | |
| .stat-label{font-size:0.58rem;font-weight:600;letter-spacing:0.18em;text-transform:uppercase;color:rgba(184,173,219,0.4);} | |
| .social-label{font-size:0.6rem;font-weight:600;letter-spacing:0.22em;text-transform:uppercase;color:rgba(107,79,187,0.55);margin-bottom:12px;align-self:flex-start;} | |
| .socials-grid{display:flex;flex-direction:column;gap:8px;width:100%;} | |
| .social-link{display:flex;align-items:center;gap:10px;padding:9px 12px;background:rgba(18,15,41,0.6);border:1px solid rgba(107,79,187,0.18);border-radius:3px;text-decoration:none;color:rgba(184,173,219,0.75);font-size:0.82rem;font-weight:600;letter-spacing:0.04em;transition:all 0.15s ease;overflow:hidden;} | |
| .social-link:hover{border-color:rgba(107,79,187,0.5);color:#EDE8F5;background:rgba(107,79,187,0.1);transform:translateX(3px);} | |
| .social-link svg{width:16px;height:16px;flex-shrink:0;opacity:0.7;} | |
| .social-link:hover svg{opacity:1;} | |
| .social-link span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} | |
| .btn-edit{display:block;width:100%;margin-top:32px;padding:10px;background:transparent;border:1px solid rgba(107,79,187,0.35);border-radius:3px;color:rgba(184,173,219,0.6);font-family:'Radiance',sans-serif;font-size:0.75rem;font-weight:600;letter-spacing:0.16em;text-transform:uppercase;text-align:center;text-decoration:none;transition:all 0.15s ease;} | |
| .btn-edit:hover{border-color:rgba(107,79,187,0.6);color:#B8ADDB;background:rgba(107,79,187,0.08);} | |
| .profile-right{flex:1;display:flex;flex-direction:column;overflow:hidden;} | |
| .profile-tabs{display:flex;border-bottom:1px solid rgba(107,79,187,0.18);padding:0 40px;flex-shrink:0;} | |
| .tab-btn{background:transparent;border:none;border-bottom:2px solid transparent;padding:18px 20px 16px;font-family:'Radiance',sans-serif;font-size:0.8rem;font-weight:600;letter-spacing:0.14em;text-transform:uppercase;color:rgba(184,173,219,0.45);cursor:pointer;transition:all 0.15s ease;margin-bottom:-1px;} | |
| .tab-btn:hover{color:#B8ADDB;} | |
| .tab-btn.active{color:#EDE8F5;border-bottom-color:#6B4FBB;} | |
| .tab-content{flex:1;overflow-y:auto;padding:32px 40px;scrollbar-width:thin;scrollbar-color:rgba(107,79,187,0.3) transparent;} | |
| .tab-content::-webkit-scrollbar{width:4px;} | |
| .tab-content::-webkit-scrollbar-thumb{background:rgba(107,79,187,0.3);border-radius:2px;} | |
| .tab-panel{display:none;} | |
| .tab-panel.active{display:block;} | |
| .section-head{font-size:0.62rem;font-weight:600;letter-spacing:0.22em;text-transform:uppercase;color:rgba(107,79,187,0.6);border-bottom:1px solid rgba(107,79,187,0.15);padding-bottom:8px;margin-bottom:16px;} | |
| .activity-list{display:flex;flex-direction:column;gap:8px;margin-bottom:32px;} | |
| .activity-item{display:flex;align-items:center;gap:14px;padding:12px 16px;background:rgba(18,15,41,0.5);border:1px solid rgba(107,79,187,0.12);border-radius:3px;text-decoration:none;transition:border-color 0.15s ease,background 0.15s ease;} | |
| .activity-item:hover{border-color:rgba(107,79,187,0.35);background:rgba(107,79,187,0.06);} | |
| .activity-icon{width:32px;height:32px;border-radius:2px;background:rgba(107,79,187,0.15);border:1px solid rgba(107,79,187,0.25);display:flex;align-items:center;justify-content:center;flex-shrink:0;} | |
| .activity-icon svg{width:14px;height:14px;stroke:#B8ADDB;} | |
| .activity-info{flex:1;min-width:0;} | |
| .activity-title{font-size:0.9rem;font-weight:600;color:#EDE8F5;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:2px;} | |
| .activity-meta{font-size:0.72rem;color:rgba(184,173,219,0.4);} | |
| .activity-badge{font-size:0.6rem;font-weight:600;letter-spacing:0.12em;text-transform:uppercase;padding:3px 8px;border-radius:2px;flex-shrink:0;} | |
| .badge-guide{background:rgba(107,79,187,0.2);border:1px solid rgba(107,79,187,0.4);color:#B8ADDB;} | |
| .badge-edit{background:rgba(42,31,82,0.4);border:1px solid rgba(61,43,122,0.4);color:rgba(184,173,219,0.6);} | |
| .guides-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px;} | |
| .guide-card{background:rgba(18,15,41,0.6);border:1px solid rgba(107,79,187,0.18);border-radius:3px;padding:18px 16px;text-decoration:none;transition:all 0.15s ease;display:flex;flex-direction:column;gap:8px;} | |
| .guide-card:hover{border-color:rgba(107,79,187,0.5);background:rgba(107,79,187,0.08);transform:translateY(-2px);} | |
| .guide-card-tag{font-size:0.58rem;font-weight:600;letter-spacing:0.18em;text-transform:uppercase;color:rgba(107,79,187,0.7);} | |
| .guide-card-title{font-size:0.95rem;font-weight:600;color:#EDE8F5;line-height:1.3;} | |
| .guide-card-meta{font-size:0.72rem;color:rgba(184,173,219,0.35);margin-top:auto;} | |
| .empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;gap:12px;color:rgba(184,173,219,0.3);} | |
| .empty-state svg{width:36px;height:36px;stroke:rgba(107,79,187,0.3);} | |
| .empty-state p{font-size:0.82rem;letter-spacing:0.08em;} | |
| .shimmer{background:linear-gradient(90deg,rgba(107,79,187,0.06) 25%,rgba(107,79,187,0.12) 50%,rgba(107,79,187,0.06) 75%);background-size:200% 100%;animation:shimmer 1.4s infinite;border-radius:3px;} | |
| @keyframes shimmer{0%{background-position:200% 0;}100%{background-position:-200% 0;}} | |
| .skeleton-line{height:14px;margin-bottom:8px;} | |
| .skeleton-avatar{width:124px;height:124px;border-radius:50%;margin:0 auto 20px;} | |
| </style> | |
| </head> | |
| <body> | |
| <div class="profile-bg"></div> | |
| <div class="profile-wrap"> | |
| <aside class="profile-left" id="left-panel"> | |
| <div class="skeleton-avatar shimmer"></div> | |
| <div class="shimmer skeleton-line" style="width:60%;margin:0 auto 8px;"></div> | |
| <div class="shimmer skeleton-line" style="width:40%;margin:0 auto 24px;height:10px;"></div> | |
| </aside> | |
| <div class="profile-right"> | |
| <div class="profile-tabs"> | |
| <button class="tab-btn active" data-tab="activity">Activity</button> | |
| <button class="tab-btn" data-tab="guides">Guides</button> | |
| </div> | |
| <div class="tab-content"> | |
| <div class="tab-panel active" id="tab-activity"> | |
| <div class="shimmer skeleton-line" style="width:30%;margin-bottom:16px;"></div> | |
| <div class="shimmer" style="height:56px;margin-bottom:8px;border-radius:3px;"></div> | |
| <div class="shimmer" style="height:56px;margin-bottom:8px;border-radius:3px;"></div> | |
| <div class="shimmer" style="height:56px;margin-bottom:8px;border-radius:3px;"></div> | |
| </div> | |
| <div class="tab-panel" id="tab-guides"></div> | |
| </div> | |
| </div> | |
| </div> | |
| <script> | |
| (function(){ | |
| var pageId=( document.body.getAttribute('data-page-id')||'').replace('user:',''); | |
| var username=pageId||'jumpstartadmin'; | |
| var currentUser=document.body.getAttribute('data-user')||''; | |
| var ICONS={ | |
| steam:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.477 2 2 6.477 2 12c0 4.991 3.657 9.128 8.438 9.879V14.89h-2.54V12h2.54V9.797c0-2.506 1.492-3.89 3.777-3.89 1.094 0 2.238.195 2.238.195v2.46h-1.26c-1.243 0-1.63.771-1.63 1.562V12h2.773l-.443 2.89h-2.33v6.989C18.343 21.129 22 16.99 22 12c0-5.523-4.477-10-10-10z"/></svg>', | |
| statlocker:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 20V10M12 20V4M6 20v-6"/></svg>', | |
| discord:'<svg viewBox="0 0 24 24" fill="currentColor"><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.27 18.27 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.057c.002.022.015.043.03.053a19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.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.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03z"/></svg>', | |
| twitter:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.744l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>', | |
| youtube:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z"/></svg>', | |
| twitch:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M11.571 4.714h1.715v5.143H11.57zm4.715 0H18v5.143h-1.714zM6 0L1.714 4.286v15.428h5.143V24l4.286-4.286h3.428L22.286 12V0zm14.571 11.143l-3.428 3.428h-3.429l-3 3v-3H6.857V1.714h13.714z"/></svg>' | |
| }; | |
| var LABELS={steam:'Steam',statlocker:'Statlocker',discord:'Discord',twitter:'Twitter / X',youtube:'YouTube',twitch:'Twitch'}; | |
| var EDIT_ICON='<svg viewBox="0 0 24 24" fill="none" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/></svg>'; | |
| var GUIDE_ICON='<svg viewBox="0 0 24 24" fill="none" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>'; | |
| function esc(s){return String(s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"');} | |
| function renderLeft(d){ | |
| var isOwn=currentUser&¤tUser===d.username; | |
| var soc='';var hasSoc=false; | |
| ['steam','statlocker','discord','twitter','youtube','twitch'].forEach(function(k){ | |
| if(!d.socials||!d.socials[k])return; | |
| hasSoc=true; | |
| soc+='<a class="social-link" href="'+esc(d.socials[k])+'" target="_blank" rel="noopener">'+(ICONS[k]||'')+'<span>'+LABELS[k]+'</span></a>'; | |
| }); | |
| document.getElementById('left-panel').innerHTML= | |
| '<div class="avatar-ring"><img class="avatar-img" src="'+esc(d.avatar)+'" alt="Avatar" onerror="this.src=\'/wiki/lib/tpl/bootstrap3/images/avatar.png\'"></div>'+ | |
| '<div class="profile-role">'+esc(d.role)+'</div>'+ | |
| '<div class="profile-name">'+esc(d.displayName)+'</div>'+ | |
| '<div class="profile-username">@'+esc(d.username)+'</div>'+ | |
| (d.bio?'<p class="profile-bio">'+esc(d.bio)+'</p>':'')+ | |
| '<div class="left-divider"></div>'+ | |
| '<div class="profile-stats">'+ | |
| '<div class="profile-stat"><div class="stat-val">'+(d.stats.guides||0)+'</div><div class="stat-label">Guides</div></div>'+ | |
| '<div class="profile-stat"><div class="stat-val">'+(d.stats.edits||0)+'</div><div class="stat-label">Edits</div></div>'+ | |
| '<div class="profile-stat"><div class="stat-val">'+esc(d.stats.joined||'—')+'</div><div class="stat-label">Joined</div></div>'+ | |
| '</div>'+ | |
| (hasSoc?'<div class="left-divider"></div><div class="social-label">Links</div><div class="socials-grid">'+soc+'</div>':'')+ | |
| (isOwn?'<a class="btn-edit" href="/wiki/doku.php?do=profile">Edit Profile</a>':''); | |
| } | |
| function renderActivity(edits){ | |
| if(!edits||!edits.length){document.getElementById('tab-activity').innerHTML='<div class="empty-state"><svg viewBox="0 0 24 24" fill="none" stroke-width="1.5" stroke-linecap="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg><p>No recent activity</p></div>';return;} | |
| var guides=edits.filter(function(e){return e.isGuide;}); | |
| var others=edits.filter(function(e){return !e.isGuide;}); | |
| var h=''; | |
| if(guides.length){ | |
| h+='<div class="section-head">Recent Guides</div><div class="activity-list">'; | |
| guides.slice(0,5).forEach(function(e){h+='<a class="activity-item" href="/wiki/doku.php?id='+esc(e.id)+'"><div class="activity-icon">'+GUIDE_ICON+'</div><div class="activity-info"><div class="activity-title">'+esc(e.title)+'</div><div class="activity-meta">'+esc(e.id)+' · '+esc(e.ago)+'</div></div><div class="activity-badge badge-guide">Guide</div></a>';}); | |
| h+='</div>'; | |
| } | |
| if(others.length){ | |
| h+='<div class="section-head">Recent Edits</div><div class="activity-list">'; | |
| others.slice(0,8).forEach(function(e){h+='<a class="activity-item" href="/wiki/doku.php?id='+esc(e.id)+'"><div class="activity-icon">'+EDIT_ICON+'</div><div class="activity-info"><div class="activity-title">'+esc(e.title)+'</div><div class="activity-meta">'+esc(e.id)+' · '+esc(e.ago)+'</div></div><div class="activity-badge badge-edit">Edit</div></a>';}); | |
| h+='</div>'; | |
| } | |
| document.getElementById('tab-activity').innerHTML=h; | |
| } | |
| function renderGuides(guides){ | |
| if(!guides||!guides.length){document.getElementById('tab-guides').innerHTML='<div class="empty-state"><svg viewBox="0 0 24 24" fill="none" stroke-width="1.5" stroke-linecap="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg><p>No guides authored yet</p></div>';return;} | |
| var h='<div class="section-head">Authored Guides</div><div class="guides-grid">'; | |
| guides.forEach(function(g){h+='<a class="guide-card" href="/wiki/doku.php?id='+esc(g.id)+'"><div class="guide-card-tag">'+esc(g.tag)+'</div><div class="guide-card-title">'+esc(g.title)+'</div><div class="guide-card-meta">Updated '+esc(g.updated)+'</div></a>';}); | |
| h+='</div>'; | |
| document.getElementById('tab-guides').innerHTML=h; | |
| } | |
| fetch('/wiki/doku.php?do=userprofile&user='+encodeURIComponent(username)) | |
| .then(function(r){return r.json();}) | |
| .then(function(d){ | |
| if(d.error){document.getElementById('left-panel').innerHTML='<div class="empty-state"><p>'+esc(d.error)+'</p></div>';return;} | |
| renderLeft(d);renderActivity(d.edits);renderGuides(d.guides); | |
| }) | |
| .catch(function(){document.getElementById('left-panel').innerHTML='<div class="empty-state"><p>Failed to load profile</p></div>';}); | |
| document.querySelectorAll('.tab-btn').forEach(function(btn){ | |
| btn.addEventListener('click',function(){ | |
| var tab=btn.getAttribute('data-tab'); | |
| document.querySelectorAll('.tab-btn').forEach(function(b){b.classList.remove('active');}); | |
| document.querySelectorAll('.tab-panel').forEach(function(p){p.classList.remove('active');}); | |
| btn.classList.add('active'); | |
| document.getElementById('tab-'+tab).classList.add('active'); | |
| }); | |
| }); | |
| })(); | |
| </script> | |
| </body> | |
| </html> | |