<style>:root{--bg:#0b1020;--card:rgba(255,255,255,0.06);--edge:rgba(255,255,255,0.18);--text:#e8ecf3;--muted:#9aa4b2;--accent:#7c5cff;--accent-2:#19c4ff;--mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Courier New", monospace;--radius:16px;}[data-theme='light']{--bg:#f6f8fb;--card:#ffffff;--edge:rgba(12,17,32,.06);--text:#0b1220;--muted:#556070}.wrap{max-width:1200px;margin:20px auto;padding:18px}.card{background:var(--card);border:1px solid var(--edge);border-radius:14px;padding:12px;margin-bottom:14px}header{display:flex;align-items:center;gap:12px;margin-bottom:12px}h1{margin:0;font-size:20px}.toolbar{display:flex;gap:8px;flex-wrap:wrap}.btn{background:linear-gradient(135deg,var(--accent),var(--accent-2));color:#fff;border:none;padding:8px 12px;border-radius:10px;cursor:pointer;font-weight:700}.btn.ghost{background:transparent;border:1px solid var(--edge);color:var(--text)}textarea{width:100%;min-height:320px;padding:12px;border-radius:10px;border:1px solid var(--edge);background:transparent;color:var(--text);font-family:var(--mono);resize:vertical}.row{display:flex;gap:8px;align-items:center}.meta{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px;color:var(--muted);font-size:13px}.file{display:none}.small{font-size:13px;padding:6px 8px}.note{color:var(--muted);font-size:13px}</style><div class="wrap" id="app"><div class='hd'><div style="width:56px;height:56px;background:conic-gradient(from 120deg,var(--accent),var(--accent-2));border-radius:12px"></div><div><h1>Premium CSS/JS/HTML Minifier — Pro</h1><div class="note">Offline, PWA-ready, Beautify, HTML minify, Theme toggle, Local save</div></div></div><div class="card"><div class="toolbar"><button class="btn" id="auto">Auto Minify</button><button class="btn" id="minCss">Minify CSS</button><button class="btn" id="minJs">Minify JS</button><button class="btn" id="minHtml">Minify HTML</button><button class="btn ghost" id="beautify">Beautify / Format</button><button class="btn ghost" id="download">Download</button><button class="btn ghost" id="saveLocal">Save Locally</button><button class="btn ghost" id="loadLocal">Load Local</button><label class="btn ghost small" for="fileInput">Upload</label><input id="fileInput" class="file" type="file" multiple accept=".js,.css,.html,.txt" /><button class="btn" id="themeToggle">Toggle Theme</button></div><div style="margin-top:10px"><textarea id="input" placeholder="এখানে CSS/JS/HTML পেস্ট করুন..." spellcheck="false"></textarea></div><div class="meta"><div>Input bytes:<b id="inBytes">0</b></div><div>Output bytes:<b id="outBytes">0</b></div><div>Saving:<b id="saving">0%</b></div><div>Detected:<b id="detected">—</b></div></div></div><div class="card"><div style="display:flex;justify-content:space-between ;align-items:center"><div><strong>Output</strong></div><div class="row"><button class="btn" id="copy">Copy</button><button class="btn ghost" id="clear">Clear</button></div></div><div style="margin-top:10px"><textarea id="output" placeholder="মিনিফাইড / ফরম্যাটেড আউটপুট এখানে দেখাবে..." spellcheck="false"></textarea></div></div><div class="card note"><strong>Features Added:</strong><ul><li>PWA service worker (offline installable)</li><li>Beautify / simple formatter for CSS/JS/HTML</li><li>HTML minifier (comments, whitespace)</li><li>Local save/load (localStorage)</li><li>Theme toggle (light/dark) — stored in localStorage</li></ul></div><div class="note">Tip:Aggressive JS minify may break complex code — always keep a backup (use Save Locally).</div></div><script>const $ = s => document.querySelector(s);const byLen = s => new TextEncoder().encode(s || '').length;function setDetected(text){$('#detected').textContent = (text||'—').toUpperCase();}function updateStats(){const inText = $('#input').value || '';const out = $('#output').value || '';$('#inBytes').textContent = byLen(inText);$('#outBytes').textContent = byLen(out);$('#saving').textContent = (inText?((1 - (byLen(out)||1)/(byLen(inText)||1))*100).toFixed(1):0) + '%';}function isCSS(t){return /\{[\s\S]*\}/.test(t) && /:|;/.test(t)}function detectType(t){if(isCSS(t)) return 'css';if(/\b(function|const|let|var|=>|class|import|export)\b/.test(t)) return 'js';if(/<\/?[a-z][\s\S]*>/i.test(t)) return 'html';return 'unknown';}// ✅ CSS Minifyfunction minifyCSS(css){css = css.replace(/\/\*[\s\S]*?\*\//g,'');css = css.replace(/\s+/g,' ');css = css.replace(/\s*([{}:;>+,~=])\s*/g,'$1');css = css.replace(/;}/g,'}');return css.trim();}// ✅ HTML Minifyfunction minifyHTML(html){html = html.replace(/<!--[\s\S]*?-->/g,'');html = html.replace(/>\s+</g,'><');html = html.replace(/\s{2,}/g,' ');return html.trim();}// ✅ JS Minify (safe basic)function minifyJS(code){let out='';let i=0;const L=code.length;let inStr=false, q='';let esc=false, inTpl=false, tplDepth=0;while(i<L){let c=code[i], n=code[i+1];// block commentsif(!inStr && !inTpl && c==='/' && n==='*'){i+=2;while(i<L && !(code[i]==='*'&&code[i+1]==='/')) i++;i+=2;continue;}// line commentsif(!inStr && !inTpl && c==='/' && n==='/' ){i+=2;while(i<L && code[i]!=="\n") i++;i++;continue;}// string startif(!inTpl && !inStr && (c==="\""||c=="'")){inStr=true;q=c;out+=c;i++;continue;}if(inStr){out+=c;if(esc) esc=false;else if(c==='\\') esc=true;else if(c===q) inStr=false;i++;continue;}// templateif(!inStr && c===''){inTpl=true;out+=c;i++;continue;}if(inTpl){out+=c;if(esc) esc=false;else if(c==='\\') esc=true;else if(c==='$' && code[i+1]==='{'){tplDepth++;i++;out+='{';}else if(c==='}' && tplDepth>0){tplDepth--;}else if(c==='' && tplDepth===0){inTpl=false;}i++;continue;}if(/\s/.test(c)){const prev=out[out.length-1]||'';const next=code[i+1]||'';if(/[A-Za-z0-9_$]/.test(prev)&&/[A-Za-z0-9_$]/.test(next)) out+=' ';i++;continue;}out+=c;i++;}out=out.replace(/;\s*}/g,'}');out=out.replace(/\n+/g,'');return out.trim();}// Beautifyfunction beautifyCSS(s){s=s.replace(/\s*([{}:;>,])\s*/g,'$1');s=s.replace(/\{/g,'{\n').replace(/;}/g,';}\n').replace(/}/g,'}\n');return s.replace(/\n\s*\n/g,'\n');}function beautifyJS(s){s=s.replace(/\s*;\s*/g,';\n');s=s.replace(/\{\s*/g,'{\n');s=s.replace(/\s*\}/g,'}\n');return s;}function beautifyHTML(s){return s.replace(/>\s*</g,'>\n<');}// Events$('#input').addEventListener('input', ()=>{setDetected(detectType($('#input').value));updateStats();});$('#minCss').addEventListener('click', ()=>{$('#output').value = minifyCSS($('#input').value);updateStats();});$('#minJs').addEventListener('click', ()=>{$('#output').value = minifyJS($('#input').value);updateStats();});$('#minHtml').addEventListener('click', ()=>{$('#output').value = minifyHTML($('#input').value);updateStats();});$('#auto').addEventListener('click', ()=>{const t=detectType($('#input').value);if(t==='css') $('#minCss').click();else if(t==='js') $('#minJs').click();else if(t==='html') $('#minHtml').click();else $('#output').value = minifyHTML($('#input').value);updateStats();});$('#beautify').addEventListener('click', ()=>{const t=detectType($('#input').value);if(t==='css') $('#output').value = beautifyCSS($('#input').value);else if(t==='js') $('#output').value = beautifyJS($('#input').value);else if(t==='html') $('#output').value = beautifyHTML($('#input').value);updateStats();});$('#copy').addEventListener('click', async ()=>{try{await navigator.clipboard.writeText($('#output').value);toast('Copied ✔');}catch(e){toast('Copy failed');}});$('#clear').addEventListener('click', ()=>{$('#input').value='';$('#output').value='';setDetected('—');updateStats();});$('#download').addEventListener('click', ()=>{const t=detectType($('#input').value);const ext=t==='css'?'.min.css':t==='js'?'.min.js':t==='html'?'.min.html':'.txt';const blob=new Blob([$('#output').value||$('#input').value],{type:'text/plain;charset=utf-8'});const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download='minified'+ext;a.click();URL.revokeObjectURL(a.href);});// local save/load$('#saveLocal').addEventListener('click', ()=>{const key=prompt('Save key name','minifier_backup');if(!key) return;localStorage.setItem('minifier_'+key, $('#input').value);toast('Saved locally → '+key);});$('#loadLocal').addEventListener('click', ()=>{const key=prompt('Load key name','minifier_backup');if(!key) return;const v=localStorage.getItem('minifier_'+key);if(v===-null){toast('No saved data');} else{$('#input').value=v;setDetected(detectType(v));updateStats();toast('Loaded '+key);}});// file upload$('#fileInput').addEventListener('change', async (e)=>{const files=[...e.target.files];let combined='';for(const f of files){combined += (combined?"\n\n":"")+await f.text();}$('#input').value=combined;setDetected(detectType(combined));updateStats();});// themefunction setTheme(t){document.documentElement.setAttribute('data-theme',t);localStorage.setItem('theme',t);}$('#themeToggle').addEventListener('click', ()=>{const cur=document.documentElement.getAttribute('data-theme')||'dark';setTheme(cur==='dark'?'light':'dark');toast('Theme:'+document.documentElement.getAttribute('data-theme'));});(function(){const saved=localStorage.getItem('theme')||'dark';setTheme(saved);})();// toastfunction toast(msg){const el=document.createElement('div');el.textContent=msg;Object.assign(el.style,{position:'fixed',right:'18px',bottom:'18px',background:'rgba(0,0,0,.7)',color:'#fff',padding:'10px 12px',borderRadius:'8px',zIndex:9999});document.body.appendChild(el);setTimeout(()=>el.remove(),1600);}// PWA inline SWif('serviceWorker' in navigator){try{const swCode="self.addEventListener('install',e=>{self.skipWaiting();});self.addEventListener('activate',e=>{self.clients.claim();});self.addEventListener('fetch',e=>{e.respondWith(fetch(e.request).catch(()=>{}));});";const blob=new Blob([swCode],{type:'application/javascript'});const swUrl=URL.createObjectURL(blob);navigator.serviceWorker.register(swUrl).catch(()=>{});}catch(e){}}setDetected('—');updateStats();</script>}body{background:#dfdfdf;margin: auto;max-width:800px;box-shadow:0px 0px 3px;font-family:serif, arial;}a{color:#0088aa;text-decoration:none;}a:visited{color:#0088aa;}input[type=text], input[type=password]{border:1px solid #afafaf;padding:3px;}textarea{border:1px solid #afafaf;padding:3px;}input[type=submit]{background:#0088aa;border:none;padding:4px;}form{padding:4px;}img{max-width:90%;}.head{padding:1px;background:white;}.nav{}.cmenu{color:gray;background:#2a2a2a;padding:4px;}.cmenu a{color:white;}.menu{background:#0088aa;color:white;padding:4px;border-bottom:2px solid #afafaf;}.menu a{color:white;}.post{margin:4px;background:white;border:1px solid #afafaf;}.title{padding:3px;border-bottom:1px solid #dfdfdf;}.content{padding:3px;text-align:justify;}.content img{border:1px solid #afafaf;padding:2px;margin:2px;}.error{padding:3px;color:red;}.post-bottom{padding:3px;}.page{padding:2px;}.page a{background:white;border:1px solid #0088aa;padding:2px;padding-right:4px;padding-left:4px;}.page span{background:#0088aa;padding:3px;padding-right:5px;padding-left:5px;color:white;font-weight:bold;}.foot{background:#fafafa;padding:4px;border-top:3px solid #afafaf;}