tool.chip.free

Генератор на прес кит

Попълни инфо за приложението веднъж — изтегли ZIP със стилизирана HTML медийна страница, fact sheet, готов текст, икона, лого и скрийншоти. Изпрати на журналисти за 60 секунди.

App
Visual assets
P
No logo uploaded.
Developer / Company
Links
Optional
Live preview

Pitching tips

Need killer screenshots too?

Build polished App Store & Play Store screenshots in the LaunchShots editor — free, in your browser, no signup.

Open the editor →
Enjoying LaunchShots?
Free forever — if it saved you time, you can buy me a coffee.
Support →
Saved
'; } // Compute the list of files that will be in the zip (for preview "ZIP contents") function buildFileList(){ var files = []; files.push({path:'README.md', kind:'text', size:buildReadme().length}); files.push({path:'press-kit.html', kind:'html', size:buildStandaloneHTML('assets/icon.png', state.logo?'assets/logo.png':null, state.screens.map(function(_,i){return 'assets/screenshots/screenshot-'+String(i+1).padStart(2,'0')+'.png';})).length}); files.push({path:'boilerplate.txt', kind:'text', size:buildBoilerplate().length}); files.push({path:'fact-sheet.txt', kind:'text', size:buildFactSheet().length}); if(state.icon){ var b = dataURLtoBytes(state.icon); files.push({path:'assets/icon.'+extFromDataURL(state.icon), kind:'img', size:b.length}); } if(state.logo){ var b2 = dataURLtoBytes(state.logo); files.push({path:'assets/logo.'+extFromDataURL(state.logo), kind:'img', size:b2.length}); } state.screens.forEach(function(s, i){ var bx = dataURLtoBytes(s.dataURL); files.push({path:'assets/screenshots/screenshot-'+String(i+1).padStart(2,'0')+'.'+extFromDataURL(s.dataURL), kind:'img', size:bx.length}); }); return files; } function renderFilesView(){ var v = $('view-files'); var files = buildFileList(); var total = files.reduce(function(a,f){return a+f.size;},0); var grouped = {}; files.forEach(function(f){ var dir = f.path.indexOf('/') === -1 ? '/' : f.path.substring(0, f.path.lastIndexOf('/')); (grouped[dir] = grouped[dir] || []).push(f); }); var html = '

'+files.length+' files · '+bytes(total)+' uncompressed

'; Object.keys(grouped).sort().forEach(function(dir){ html += '
'+(dir==='/'?'(root)':dir+'/')+'
'; }); v.innerHTML = html; $('zipSizeHint').textContent = files.length+' files · ~'+bytes(total)+' (uncompressed)'; } // Render all 3 preview views function render(){ $('view-page').innerHTML = buildPagePreviewHTML(); $('view-md').textContent = buildReadme(); renderFilesView(); // Sync brand color input pair $('iconPreview').innerHTML = ''; if(state.icon){ var im = document.createElement('img'); im.src = state.icon; $('iconPreview').appendChild(im); } else { var sp = document.createElement('span'); sp.className='ph'; sp.textContent = (state.name||'A').charAt(0).toUpperCase(); $('iconPreview').appendChild(sp); } $('logoStatus').textContent = state.logo ? 'Logo uploaded.' : 'No logo uploaded.'; renderScreensList(); } function renderScreensList(){ var box = $('screensList'); box.innerHTML = ''; state.screens.forEach(function(s, idx){ var t = document.createElement('div'); t.className='screen-thumb'; var im = document.createElement('img'); im.src = s.dataURL; var rm = document.createElement('button'); rm.className='rm'; rm.textContent='×'; rm.title = 'Remove'; rm.type='button'; rm.addEventListener('click', function(){ state.screens.splice(idx, 1); render(); }); t.appendChild(im); t.appendChild(rm); box.appendChild(t); }); } // Preview tabs document.querySelectorAll('.preview-tabs button').forEach(function(b){ b.addEventListener('click', function(){ document.querySelectorAll('.preview-tabs button').forEach(function(x){ x.classList.remove('active'); }); b.classList.add('active'); var v = b.dataset.view; $('view-page').style.display = v==='page' ? '' : 'none'; $('view-md').style.display = v==='md' ? '' : 'none'; $('view-files').style.display= v==='files'? '' : 'none'; }); }); // Bind inputs function bind(id, key, after){ var el = $(id); el.addEventListener('input', function(){ state[key] = el.value; if(after) after(); render(); }); } bind('f-name','name'); bind('f-tag','tag'); bind('f-cat','cat'); bind('f-plat','plat'); bind('f-price','price'); bind('f-release','release'); bind('f-short','short'); bind('f-long','long'); bind('f-dev','dev'); bind('f-founded','founded'); bind('f-loc','loc'); bind('f-web','web'); bind('f-email','email'); bind('f-appstore','appstore'); bind('f-play','play'); bind('f-tw','tw'); bind('f-ig','ig'); bind('f-awards','awards'); bind('f-quotes','quotes'); // Color sync $('f-accent').addEventListener('input', function(){ state.accent = this.value; $('f-accentHex').value = this.value; render(); }); $('f-accentHex').addEventListener('input', function(){ var v = this.value.trim(); if(/^#[0-9a-fA-F]{6}$/.test(v)){ state.accent = v; $('f-accent').value = v; render(); } }); // Icon upload $('iconUploadBtn').addEventListener('click', function(){ $('iconUpload').click(); }); $('iconUpload').addEventListener('change', function(e){ var f = e.target.files[0]; if(!f) return; var r = new FileReader(); r.onload = function(ev){ state.icon = ev.target.result; render(); }; r.readAsDataURL(f); }); // Logo upload $('logoUploadBtn').addEventListener('click', function(){ $('logoUpload').click(); }); $('logoUpload').addEventListener('change', function(e){ var f = e.target.files[0]; if(!f) return; var r = new FileReader(); r.onload = function(ev){ state.logo = ev.target.result; render(); }; r.readAsDataURL(f); }); // Screens upload $('screensUploadBtn').addEventListener('click', function(){ $('screensUpload').click(); }); $('screensUpload').addEventListener('change', function(e){ var files = Array.prototype.slice.call(e.target.files); if(state.screens.length + files.length > 8){ toast('Max 8 screenshots'); files = files.slice(0, Math.max(0, 8 - state.screens.length)); if(files.length === 0){ e.target.value=''; return; } } var loaded = 0, total = files.length; files.forEach(function(f){ var r = new FileReader(); r.onload = function(ev){ state.screens.push({ dataURL: ev.target.result, name: f.name }); loaded++; if(loaded === total){ render(); } }; r.readAsDataURL(f); }); e.target.value = ''; }); // Reset $('resetBtn').addEventListener('click', function(){ if(!confirm('Reset all fields?')) return; location.reload(); }); // Build ZIP $('exportBtn').addEventListener('click', function(){ var btn = this; btn.disabled = true; var orig = btn.innerHTML; btn.innerHTML = 'Building ZIP…'; try{ var zip = new JSZip(); var slug = slugify(state.name); var root = zip.folder(slug + '-press-kit'); // Asset paths (relative inside zip) var iconExt = state.icon ? extFromDataURL(state.icon) : null; var iconRel = state.icon ? 'assets/icon.'+iconExt : null; var logoExt = state.logo ? extFromDataURL(state.logo) : null; var logoRel = state.logo ? 'assets/logo.'+logoExt : null; var screenRels = state.screens.map(function(s, i){ return 'assets/screenshots/screenshot-'+String(i+1).padStart(2,'0')+'.'+extFromDataURL(s.dataURL); }); root.file('README.md', buildReadme()); root.file('press-kit.html', buildStandaloneHTML(iconRel, logoRel, screenRels)); root.file('boilerplate.txt', buildBoilerplate()); root.file('fact-sheet.txt', buildFactSheet()); if(state.icon) root.file(iconRel, dataURLtoBytes(state.icon)); if(state.logo) root.file(logoRel, dataURLtoBytes(state.logo)); state.screens.forEach(function(s, i){ root.file(screenRels[i], dataURLtoBytes(s.dataURL)); }); zip.generateAsync({type:'blob', compression:'DEFLATE', compressionOptions:{level:6}}) .then(function(blob){ var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = slug + '-press-kit.zip'; document.body.appendChild(a); a.click(); setTimeout(function(){ URL.revokeObjectURL(url); a.remove(); }, 500); btn.disabled = false; btn.innerHTML = orig; toast('Downloaded ' + slug + '-press-kit.zip'); }) .catch(function(err){ console.error(err); btn.disabled = false; btn.innerHTML = orig; toast('Export failed — try again'); }); } catch(err){ console.error(err); btn.disabled = false; btn.innerHTML = orig; toast('Export failed'); } }); // Init hydrate(); render(); })();