| <!doctype html> |
| <html lang="en"> |
| <head> |
| <meta charset="utf-8" /> |
| <meta name="viewport" content="width=device-width,initial-scale=1" /> |
| <title>Reiker Gamer — Logo Maker</title> |
|
|
| |
| <link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700;900&family=Poppins:wght@400;700&family=Bangers&display=swap" rel="stylesheet"> |
|
|
| <style> |
| :root{ |
| --bg:#0f1724; |
| --card:#0b1220; |
| --muted:#94a3b8; |
| --accent:#7c3aed; |
| --glass: rgba(255,255,255,0.03); |
| } |
| *{box-sizing:border-box} |
| body{ |
| margin:0; |
| font-family: "Poppins", system-ui, -apple-system, "Segoe UI", Roboto; |
| background: linear-gradient(180deg,#071029 0%, #081428 50%, #071129 100%); |
| color:#e6eef8; |
| min-height:100vh; |
| display:flex; |
| align-items:center; |
| justify-content:center; |
| padding:28px; |
| } |
| .wrap{ |
| width:100%; |
| max-width:1100px; |
| display:grid; |
| grid-template-columns:420px 1fr; |
| gap:20px; |
| align-items:start; |
| } |
| .panel{ |
| background: linear-gradient(180deg, rgba(255,255,255,0.02), rgba(255,255,255,0.01)); |
| border-radius:12px; |
| padding:18px; |
| box-shadow: 0 6px 24px rgba(2,6,23,0.6); |
| border:1px solid rgba(255,255,255,0.03); |
| } |
| h1{font-size:18px;margin:0 0 12px 0} |
| label{display:block;font-size:13px;color:var(--muted);margin-top:8px} |
| .row{display:flex;gap:8px;align-items:center} |
| input[type="text"], select, input[type="number"]{ |
| width:100%; |
| padding:8px 10px; |
| border-radius:8px; |
| border:1px solid rgba(255,255,255,0.04); |
| background:var(--glass); |
| color:inherit; |
| font-size:14px; |
| } |
| input[type="color"]{width:48px;height:42px;padding:0;border-radius:8px;border:0} |
| .controls{display:grid;grid-template-columns:1fr 1fr;gap:10px} |
| canvas{ |
| width:100%; |
| height:380px; |
| display:block; |
| background: linear-gradient(180deg, rgba(255,255,255,0.01), rgba(255,255,255,0.02)); |
| border-radius:10px; |
| border:1px solid rgba(255,255,255,0.03); |
| } |
| .actions{display:flex;gap:8px;margin-top:12px;flex-wrap:wrap} |
| button{ |
| background:linear-gradient(90deg,var(--accent),#4c1d95); |
| color:white;padding:10px 14px;border-radius:10px;border:0;font-weight:600;cursor:pointer; |
| box-shadow: 0 6px 18px rgba(124,58,237,0.12); |
| } |
| .muted{color:var(--muted);font-size:13px;margin-top:6px} |
| .small{font-size:13px;padding:6px 8px;border-radius:8px;background:rgba(255,255,255,0.02);border:1px solid rgba(255,255,255,0.02)} |
| footer{font-size:12px;color:var(--muted);margin-top:10px} |
| @media (max-width:980px){ |
| .wrap{grid-template-columns:1fr; padding-bottom:30px} |
| canvas{height:320px} |
| } |
| </style> |
| </head> |
| <body> |
| <div class="wrap"> |
| |
| <div class="panel"> |
| <h1>Reiker Gamer — Logo Generator</h1> |
| <div> |
| <label>Brand Text</label> |
| <input id="brandText" type="text" value="Reiker Gamer" maxlength="24"> |
|
|
| <label>Font</label> |
| <select id="fontSelect" class="small"> |
| <option value="Orbitron, sans-serif">Orbitron (Gamer)</option> |
| <option value="Bangers, cursive">Bangers (Bold)</option> |
| <option value="Poppins, sans-serif">Poppins (Modern)</option> |
| </select> |
|
|
| <label class="row">Gradient Colors <span style="margin-left:auto;font-size:12px;color:var(--muted)">Left → Right</span></label> |
| <div class="row"> |
| <input id="colorA" type="color" value="#7c3aed"> |
| <input id="colorB" type="color" value="#06b6d4"> |
| <input id="bgColor" type="color" value="#071129" title="Background color" style="margin-left:8px"> |
| </div> |
|
|
| <label class="row">Badge Shape</label> |
| <div class="row" style="margin-top:6px"> |
| <select id="shape" class="small"> |
| <option value="none">No Badge</option> |
| <option value="circle">Circle</option> |
| <option value="shield">Shield</option> |
| <option value="hex">Hexagon</option> |
| </select> |
| <select id="iconStyle" class="small"> |
| <option value="none">No Icon</option> |
| <option value="headset">Headset</option> |
| <option value="controller">Controller</option> |
| <option value="eye">Fierce Eye</option> |
| </select> |
| </div> |
|
|
| <label class="row">Effects</label> |
| <div class="controls"> |
| <div> |
| <label>Glow Intensity <span class="muted" id="glowLabel">0.8</span></label> |
| <input id="glow" type="range" min="0" max="2" step="0.05" value="0.8"> |
| </div> |
| <div> |
| <label>Shadow Blur <span class="muted" id="shLabel">10</span></label> |
| <input id="shadow" type="range" min="0" max="40" step="1" value="10"> |
| </div> |
| </div> |
|
|
| <label class="row">Sizes / Export</label> |
| <div class="row" style="margin-top:6px"> |
| <input id="canvasW" type="number" value="1200" min="400" class="small" style="width:120px" /> |
| <input id="canvasH" type="number" value="600" min="200" class="small" style="width:120px" /> |
| <button id="resizeBtn" style="background:#0ea5a4">Resize</button> |
| </div> |
|
|
| <div class="actions"> |
| <button id="downloadPng">Download PNG</button> |
| <button id="downloadSvg">Download SVG</button> |
| <button id="randomBtn" style="background:#f59e0b">Surprise Me</button> |
| <button id="resetBtn" style="background:#334155">Reset</button> |
| </div> |
|
|
| <div class="muted"> |
| Tip: Use "VIP" or "Gamer Tag" as text. SVG preserves vector quality for large prints. |
| </div> |
| <footer>Made for <strong>Reiker Gamer</strong> — tweak colors, shapes, and download. 🎮</footer> |
| </div> |
| </div> |
|
|
| |
| <div class="panel" style="display:flex;flex-direction:column;gap:12px"> |
| <canvas id="preview" width="1200" height="600"></canvas> |
| <div class="row" style="justify-content:space-between;align-items:center"> |
| <div class="muted">Preview — live render</div> |
| <div class="muted">Canvas: <span id="csize">1200×600</span></div> |
| </div> |
| </div> |
| </div> |
|
|
| <script> |
| |
| const canvas = document.getElementById('preview'); |
| const ctx = canvas.getContext('2d', { alpha: false }); |
| const brandText = document.getElementById('brandText'); |
| const colorA = document.getElementById('colorA'); |
| const colorB = document.getElementById('colorB'); |
| const bgColor = document.getElementById('bgColor'); |
| const fontSelect = document.getElementById('fontSelect'); |
| const glow = document.getElementById('glow'); |
| const shadow = document.getElementById('shadow'); |
| const shape = document.getElementById('shape'); |
| const iconStyle = document.getElementById('iconStyle'); |
| const downloadPng = document.getElementById('downloadPng'); |
| const downloadSvg = document.getElementById('downloadSvg'); |
| const randomBtn = document.getElementById('randomBtn'); |
| const resetBtn = document.getElementById('resetBtn'); |
| const resizeBtn = document.getElementById('resizeBtn'); |
| const canvasW = document.getElementById('canvasW'); |
| const canvasH = document.getElementById('canvasH'); |
| const csize = document.getElementById('csize'); |
| const glowLabel = document.getElementById('glowLabel'); |
| const shLabel = document.getElementById('shLabel'); |
| |
| |
| function setCanvasSize(w,h){ |
| const dpr = Math.max(1, window.devicePixelRatio || 1); |
| canvas.width = Math.round(w * dpr); |
| canvas.height = Math.round(h * dpr); |
| canvas.style.width = w + 'px'; |
| canvas.style.height = h + 'px'; |
| ctx.setTransform(dpr,0,0,dpr,0,0); |
| csize.textContent = `${w}×${h}`; |
| } |
| setCanvasSize(1200,600); |
| |
| |
| function drawLogo(){ |
| const w = canvas.width / (window.devicePixelRatio || 1); |
| const h = canvas.height / (window.devicePixelRatio || 1); |
| |
| |
| ctx.fillStyle = bgColor.value; |
| ctx.fillRect(0,0,w,h); |
| |
| |
| const grad = ctx.createLinearGradient(0,0,w,0); |
| grad.addColorStop(0, colorA.value); |
| grad.addColorStop(1, colorB.value); |
| |
| |
| if(shape.value !== 'none'){ |
| drawBadge(shape.value, w, h); |
| } |
| |
| |
| const g = parseFloat(glow.value); |
| const sh = parseFloat(shadow.value); |
| |
| |
| const fontFamily = fontSelect.value; |
| const baseSize = Math.round(Math.min(w, h) * 0.18); |
| ctx.font = `900 ${baseSize}px ${fontFamily}`; |
| ctx.textAlign = 'center'; |
| ctx.textBaseline = 'middle'; |
| |
| |
| ctx.shadowColor = hexToRgba(colorB.value, 0.85); |
| ctx.shadowBlur = g * 32 + sh * 0.3; |
| ctx.fillStyle = grad; |
| |
| |
| ctx.lineWidth = Math.max(2, Math.floor(baseSize * 0.04)); |
| ctx.strokeStyle = 'rgba(0,0,0,0.45)'; |
| ctx.strokeText(brandText.value, w*0.63, h*0.52); |
| ctx.fillText(brandText.value, w*0.63, h*0.52); |
| |
| |
| ctx.shadowBlur = 0; |
| ctx.font = `600 ${Math.round(baseSize*0.28)}px ${fontFamily}`; |
| ctx.fillStyle = 'rgba(255,255,255,0.88)'; |
| ctx.fillText('GAMER', w*0.63, h*0.68); |
| |
| |
| if(iconStyle.value !== 'none' && shape.value !== 'none'){ |
| drawIcon(iconStyle.value, w, h); |
| } |
| } |
| |
| |
| function drawBadge(type, w, h){ |
| const cx = w*0.25; |
| const cy = h*0.5; |
| const radius = Math.min(w,h)*0.28; |
| ctx.save(); |
| ctx.translate(cx,cy); |
| |
| |
| const rg = ctx.createRadialGradient(0,0,radius*0.1,0,0,radius*1.1); |
| rg.addColorStop(0, hexToRgba(colorA.value,0.45)); |
| rg.addColorStop(1, hexToRgba(colorB.value,0.05)); |
| ctx.fillStyle = rg; |
| ctx.beginPath(); |
| ctx.ellipse(0,0,radius*1.15,radius*0.8,0,0,Math.PI*2); |
| ctx.fill(); |
| |
| |
| ctx.fillStyle = hexToRgba('#0b1220', 0.85); |
| ctx.strokeStyle = hexToRgba('#ffffff', 0.06); |
| ctx.lineWidth = 2; |
| |
| if(type === 'circle'){ |
| ctx.beginPath(); ctx.arc(0,0,radius,0,Math.PI*2); ctx.fill(); ctx.stroke(); |
| } else if(type === 'shield'){ |
| |
| const w2 = radius*0.9; |
| ctx.beginPath(); |
| ctx.moveTo(-w2*0.9, -radius*0.7); |
| ctx.lineTo(w2*0.9, -radius*0.7); |
| ctx.lineTo(w2*0.9, radius*0.1); |
| ctx.quadraticCurveTo(0, radius*1.1, -w2*0.9, radius*0.1); |
| ctx.closePath(); |
| ctx.fill(); ctx.stroke(); |
| } else if(type === 'hex'){ |
| ctx.beginPath(); |
| for(let i=0;i<6;i++){ |
| const a = Math.PI/3 * i - Math.PI/6; |
| const x = Math.cos(a)*radius; |
| const y = Math.sin(a)*radius*0.8; |
| if(i===0) ctx.moveTo(x,y); else ctx.lineTo(x,y); |
| } |
| ctx.closePath(); ctx.fill(); ctx.stroke(); |
| } |
| |
| ctx.restore(); |
| } |
| |
| |
| function drawIcon(name, w, h){ |
| const cx = w*0.25; |
| const cy = h*0.5; |
| const size = Math.min(w,h)*0.14; |
| ctx.save(); |
| ctx.translate(cx,cy); |
| ctx.fillStyle = colorB.value; |
| ctx.strokeStyle = hexToRgba('#000',0.45); |
| ctx.lineWidth = Math.max(2, Math.floor(size*0.06)); |
| if(name === 'headset'){ |
| |
| ctx.beginPath(); |
| ctx.ellipse(-size*0.4,0,size*0.36,size*0.46,0,0,Math.PI*2); |
| ctx.ellipse(size*0.4,0,size*0.36,size*0.46,0,0,Math.PI*2); |
| ctx.fill(); |
| |
| ctx.beginPath(); ctx.moveTo(-size, -size*0.45); ctx.quadraticCurveTo(0, -size*0.95, size, -size*0.45); ctx.stroke(); |
| |
| ctx.beginPath(); ctx.moveTo(size*0.6,size*0.2); ctx.lineTo(size*1.05,size*0.45); ctx.stroke(); |
| } else if(name === 'controller'){ |
| |
| ctx.beginPath(); |
| ctx.moveTo(-size*0.9,0); |
| ctx.quadraticCurveTo(-size*0.6,-size*0.6, -size*0.1,-size*0.5); |
| ctx.quadraticCurveTo(size*0.1,-size*0.6, size*0.4,-size*0.35); |
| ctx.quadraticCurveTo(size*0.9,-size*0.05, size*0.9,size*0.35); |
| ctx.quadraticCurveTo(size*0.6,size*0.7, 0,size*0.6); |
| ctx.quadraticCurveTo(-size*0.25,size*0.75, -size*0.6,size*0.45); |
| ctx.closePath(); |
| ctx.fill(); |
| |
| ctx.fillStyle = '#fff'; |
| ctx.beginPath(); ctx.arc(size*0.45,-size*0.05,size*0.06,0,Math.PI*2); ctx.fill(); |
| ctx.beginPath(); ctx.arc(size*0.2, size*0.06,size*0.06,0,Math.PI*2); ctx.fill(); |
| ctx.fillStyle = colorB.value; |
| } else if(name === 'eye'){ |
| ctx.beginPath(); |
| ctx.ellipse(0,0,size*0.9,size*0.5,0,0,Math.PI*2); |
| ctx.fill(); |
| ctx.fillStyle = '#fff'; |
| ctx.beginPath(); ctx.ellipse(0,0,size*0.36,size*0.36,0,0,Math.PI*2); ctx.fill(); |
| ctx.fillStyle = '#000'; |
| ctx.beginPath(); ctx.ellipse(0,0,size*0.12,size*0.12,0,0,Math.PI*2); ctx.fill(); |
| } |
| ctx.restore(); |
| } |
| |
| |
| function hexToRgba(hex, alpha=1){ |
| const c = hex.replace('#',''); |
| const bigint = parseInt(c, 16); |
| const r = (bigint >> 16) & 255; |
| const g = (bigint >> 8) & 255; |
| const b = bigint & 255; |
| return `rgba(${r},${g},${b},${alpha})`; |
| } |
| |
| |
| function buildSVG(){ |
| const w = parseInt(canvas.style.width); |
| const h = parseInt(canvas.style.height); |
| |
| const fontFamily = fontSelect.options[fontSelect.selectedIndex].text; |
| const brand = escapeXml(brandText.value); |
| const gradId = 'g1'; |
| const svg = []; |
| svg.push(`<svg xmlns="http://www.w3.org/2000/svg" width="${w}" height="${h}" viewBox="0 0 ${w} ${h}">`); |
| svg.push(`<defs>`); |
| svg.push(`<linearGradient id="${gradId}" x1="0%" y1="0%" x2="100%" y2="0%"><stop offset="0%" stop-color="${colorA.value}"/><stop offset="100%" stop-color="${colorB.value}"/></linearGradient>`); |
| svg.push(`</defs>`); |
| svg.push(`<rect width="${w}" height="${h}" fill="${bgColor.value}"/>`); |
| |
| |
| if(shape.value !== 'none'){ |
| const cx = Math.round(w*0.25), cy = Math.round(h*0.5); |
| const r = Math.round(Math.min(w,h)*0.28); |
| if(shape.value === 'circle'){ |
| svg.push(`<circle cx="${cx}" cy="${cy}" r="${r}" fill="#0b1220" stroke="rgba(255,255,255,0.06)" stroke-width="2"/>`); |
| } else if(shape.value === 'shield'){ |
| |
| const p = `${cx - r*0.9},${cy - r*0.7} ${cx + r*0.9},${cy - r*0.7} ${cx + r*0.9},${cy + r*0.1} ${cx},${cy + r*1.1} ${cx - r*0.9},${cy + r*0.1}`; |
| svg.push(`<path d="M ${p} Z" fill="#0b1220" stroke="rgba(255,255,255,0.06)" stroke-width="2"/>`); |
| } else if(shape.value === 'hex'){ |
| let pts = []; |
| for(let i=0;i<6;i++){ |
| const a = Math.PI/3 * i - Math.PI/6; |
| const x = Math.cos(a)*r + cx; |
| const y = Math.sin(a)*r*0.8 + cy; |
| pts.push(`${x},${y}`); |
| } |
| svg.push(`<polygon points="${pts.join(' ')}" fill="#0b1220" stroke="rgba(255,255,255,0.06)" stroke-width="2"/>`); |
| } |
| } |
| |
| |
| const fontFamilyCss = (fontSelect.value.split(',')[0]); |
| const fontSize = Math.round(Math.min(w,h)*0.18); |
| svg.push(`<text x="${Math.round(w*0.63)}" y="${Math.round(h*0.52)}" text-anchor="middle" dominant-baseline="middle" font-family="${fontFamilyCss}" font-weight="900" font-size="${fontSize}" fill="url(#${gradId})" stroke="rgba(0,0,0,0.45)" stroke-width="${Math.max(1,Math.floor(fontSize*0.04))}">${brand}</text>`); |
| svg.push(`<text x="${Math.round(w*0.63)}" y="${Math.round(h*0.68)}" text-anchor="middle" dominant-baseline="middle" font-family="${fontFamilyCss}" font-weight="600" font-size="${Math.round(fontSize*0.28)}" fill="rgba(255,255,255,0.9)">GAMER</text>`); |
| |
| svg.push(`</svg>`); |
| return svg.join(''); |
| } |
| |
| function escapeXml(str){ return str.replace(/[<&>'"]/g, function(c){ return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]; }); } |
| |
| |
| function downloadBlob(blob, filename){ |
| const url = URL.createObjectURL(blob); |
| const a = document.createElement('a'); |
| a.href = url; a.download = filename; document.body.appendChild(a); a.click(); |
| setTimeout(()=>{ URL.revokeObjectURL(url); a.remove(); }, 500); |
| } |
| |
| |
| drawLogo(); |
| |
| |
| [brandText, colorA, colorB, bgColor, fontSelect, glow, shadow, shape, iconStyle].forEach(el=>{ |
| el.addEventListener('input', () => { drawLogo(); glowLabel.textContent = glow.value; shLabel.textContent = shadow.value; }); |
| }); |
| |
| downloadPng.addEventListener('click', ()=>{ |
| |
| const dataUrl = canvas.toDataURL('image/png'); |
| fetch(dataUrl).then(res=>res.blob()).then(blob=>downloadBlob(blob, `reiker_gamer.png`)); |
| }); |
| |
| downloadSvg.addEventListener('click', ()=>{ |
| const svg = buildSVG(); |
| const blob = new Blob([svg], {type:'image/svg+xml;charset=utf-8'}); |
| downloadBlob(blob, 'reiker_gamer.svg'); |
| }); |
| |
| randomBtn.addEventListener('click', ()=>{ |
| |
| const colors = ['#ef4444','#f97316','#f59e0b','#06b6d4','#7c3aed','#06b6d4','#06b6d4','#ef4444','#14b8a6']; |
| colorA.value = colors[Math.floor(Math.random()*colors.length)]; |
| colorB.value = colors[Math.floor(Math.random()*colors.length)]; |
| shape.value = ['none','circle','shield','hex'][Math.floor(Math.random()*4)]; |
| iconStyle.value = ['none','headset','controller','eye'][Math.floor(Math.random()*4)]; |
| brandText.value = ['Reiker','ReikerG','REIKER','Reiker Gamer','Reik3r'][Math.floor(Math.random()*5)]; |
| fontSelect.value = ['Orbitron, sans-serif','Bangers, cursive','Poppins, sans-serif'][Math.floor(Math.random()*3)]; |
| glow.value = (Math.random()*1.2+0.2).toFixed(2); |
| shadow.value = Math.floor(Math.random()*28); |
| drawLogo(); |
| }); |
| |
| resetBtn.addEventListener('click', ()=>{ |
| brandText.value = 'Reiker Gamer'; |
| colorA.value = '#7c3aed'; |
| colorB.value = '#06b6d4'; |
| bgColor.value = '#071129'; |
| fontSelect.value = 'Orbitron, sans-serif'; |
| glow.value = 0.8; |
| shadow.value = 10; |
| shape.value = 'circle'; |
| iconStyle.value = 'headset'; |
| canvasW.value = 1200; canvasH.value = 600; |
| setCanvasSize(1200,600); |
| drawLogo(); |
| }); |
| |
| resizeBtn.addEventListener('click', ()=>{ |
| const w = Math.max(400, parseInt(canvasW.value) || 1200); |
| const h = Math.max(200, parseInt(canvasH.value) || 600); |
| setCanvasSize(w,h); |
| drawLogo(); |
| }); |
| |
| |
| window.addEventListener('resize', () => { |
| |
| }); |
| |
| |
| resetBtn.click(); |
| </script> |
| </body> |
| </html> |