🧮 Kalkulatory i Przeliczniki
109 narzędzi online — bez reklam, bez logowania
function chFixWidth() { var el = document.getElementById('ch-wrap'); if (!el) return; // Reset el.style.marginLeft = ''; el.style.width = ''; // Zmierz realny offset od lewej krawędzi viewportu var left = el.getBoundingClientRect().left + (window.pageXOffset || document.documentElement.scrollLeft || 0); if (left > 1) { el.style.marginLeft = '-' + left + 'px'; } el.style.width = '100vw'; }
var CATS={podstawowy:"📐 Podstawowy",finanse:"💰 Finanse",jednostki:"📏 Jednostki",zdrowie:"❤️ Zdrowie",data:"📅 Data & Czas",geometria:"📐 Geometria",fizyka:"⚗️ Fizyka",dom:"🏠 Dom & Auto",matematyka:"🔬 Matematyka",kuchnia:"🍳 Kuchnia",tech:"💻 Technologia"};
function h(id){return document.getElementById(id);} function q(el,id){return el.querySelector("#"+id);} function fv(el,id){return parseFloat(q(el,id).value);} function sv(el,id){return q(el,id).value;} function ok(el,id,txt){var r=q(el,id);r.textContent=txt;r.className="res ok";} function er(el,id,txt){var r=q(el,id);r.textContent=txt;r.className="res err";} function inp(id,lbl,type,ph){return "
";} function sel(id,lbl,opts){var o="";opts.forEach(function(x){o+="";});return "
";} function row(n){return function(){return "
";};} var r2=row(2),r3=row(3),r4=row(4); function btn(id,t){return "";} function res(id){return "
";} function note(t){return "
"+t+"
";} function clean(n){return (+n.toPrecision(8)).toString();}
var CARDS = [ /* ===== PODSTAWOWY ===== */ {id:"bc",cat:"podstawowy",ib:"#dbeafe",icon:"🔢",title:"Kalkulator podstawowy", html:"
", init:function(el){ var d=q(el,"bc-d"),s=q(el,"bc-s"),c="0",p=null,o=null,fr=false; el.querySelector(".cbtns").addEventListener("click",function(e){ var b=e.target.closest("[data-v]");if(!b)return;var v=b.dataset.v; if((v>="0"&&v<="9")||v==="."){if(fr||c==="0"){c=(v==="."?"0.":v);fr=false;}else{if(v==="."&&c.includes("."))return;c+=v;}d.textContent=c;} else if(v==="AC"){c="0";p=null;o=null;fr=false;s.innerHTML=" ";d.textContent="0";} else if(v==="+/-"){c=String(-parseFloat(c)||0);d.textContent=c;} else if(v==="%"){c=String(parseFloat(c)/100);d.textContent=c;} else if(["+","-","×","÷"].includes(v)){p=parseFloat(c);o=v;fr=true;s.textContent=p+" "+v;} else if(v==="="){if(o&&p!==null){var a=p,bb=parseFloat(c),r; if(o==="+")r=a+bb;else if(o==="-")r=a-bb;else if(o==="×")r=a*bb;else r=bb===0?"Err":a/bb; s.textContent=a+" "+o+" "+bb+" =";c=String(Math.round(r*1e10)/1e10);d.textContent=c;o=null;p=null;fr=true;}} }); }}, {id:"pct",cat:"podstawowy",ib:"#fef3c7",icon:"%",title:"Kalkulator procentów", html:r2(inp("pc-b","Wartość bazowa","number","500"),inp("pc-p","Procent (%)","number","23"))+btn("pc-btn")+res("pc-r"), init:function(el){q(el,"pc-btn").onclick=function(){var b=fv(el,"pc-b"),p=fv(el,"pc-p");if(isNaN(b)||isNaN(p)){er(el,"pc-r","Podaj obie wartości");return;}var v=b*p/100;ok(el,"pc-r",p+"% z "+b+" = "+v.toFixed(2)+"\n"+b+" + "+p+"% = "+(b+v).toFixed(2)+"\n"+b+" − "+p+"% = "+(b-v).toFixed(2));};}} , {id:"pch",cat:"podstawowy",ib:"#d1fae5",icon:"📈",title:"Zmiana procentowa A→B", html:r2(inp("pa-a","Wartość A","number","200"),inp("pa-b","Wartość B","number","250"))+btn("pa-btn")+res("pa-r"), init:function(el){q(el,"pa-btn").onclick=function(){var a=fv(el,"pa-a"),b=fv(el,"pa-b");if(isNaN(a)||isNaN(b)||a===0){er(el,"pa-r","Podaj wartości (A≠0)");return;}var ch=(b-a)/Math.abs(a)*100;ok(el,"pa-r",(ch>=0?"▲ Wzrost":"▼ Spadek")+": "+Math.abs(ch).toFixed(4)+"%\nRóżnica: "+(b-a>=0?"+":"")+(b-a).toFixed(4));};}} ,
{id:"pwr",cat:"podstawowy",ib:"#fce7f3",icon:"√",title:"Potęgi i pierwiastki", html:r2(inp("pr-x","Liczba (x)","number","8"),inp("pr-n","Wykładnik (n)","number","3"))+btn("pr-btn")+res("pr-r"), init:function(el){q(el,"pr-btn").onclick=function(){var x=fv(el,"pr-x"),n=fv(el,"pr-n");if(isNaN(x)||isNaN(n)){er(el,"pr-r","Podaj x i n");return;}var f=function(v){return (+v.toPrecision(8)).toString();};ok(el,"pr-r","x^n = "+f(Math.pow(x,n))+"\n√x = "+f(Math.sqrt(Math.abs(x)))+"\n∛x = "+f(Math.cbrt(x)));};}} ,
{id:"fact",cat:"podstawowy",ib:"#ffedd5",icon:"n!",title:"Silnia i kombinacje",
html:r2(inp("fc-n","n (0–170)","number","10"),inp("fc-k","k dla C(n,k)","number","3"))+btn("fc-btn")+res("fc-r"),
init:function(el){q(el,"fc-btn").onclick=function(){var n=parseInt(q(el,"fc-n").value),k=parseInt(q(el,"fc-k").value);if(isNaN(n)||n<0||n>170){er(el,"fc-r","n musi być 0–170");return;}var f=1;for(var i=2;i<=n;i++)f*=i;var txt="n! = "+n+"! = "+f.toExponential(4);if(!isNaN(k)&&k>=0&&k<=n){var c=1;for(var i=0;i
{id:"ratio",cat:"podstawowy",ib:"#d1fae5",icon:"⚖️",title:"Proporcje A:B = C:D", html:note("Podaj A, B, C — oblicz D")+r3(inp("ra-a","A","number","2"),inp("ra-b","B","number","3"),inp("ra-c","C","number","6"))+btn("ra-btn","Oblicz D")+res("ra-r"), init:function(el){q(el,"ra-btn").onclick=function(){var a=fv(el,"ra-a"),b=fv(el,"ra-b"),c=fv(el,"ra-c");if(isNaN(a)||isNaN(b)||isNaN(c)||a===0){er(el,"ra-r","Podaj A≠0, B i C");return;}ok(el,"ra-r","D = "+b*c/a);};}} ,
{id:"pct3",cat:"podstawowy",ib:"#fce7f3",icon:"📊",title:"Ile procent A jest z B?", html:r2(inp("ap-a","Wartość A","number","75"),inp("ap-b","Całość B","number","200"))+btn("ap-btn")+res("ap-r"), init:function(el){q(el,"ap-btn").onclick=function(){var a=fv(el,"ap-a"),b=fv(el,"ap-b");if(isNaN(a)||isNaN(b)||b===0){er(el,"ap-r","Podaj A i B (B≠0)");return;}ok(el,"ap-r",a+" stanowi "+(a/b*100).toFixed(4)+"% z "+b+"\nRóżnica: "+(b-a)+" = "+((b-a)/b*100).toFixed(2)+"%");};}} ,
/* ===== FINANSE ===== */ {id:"vat",cat:"finanse",ib:"#fef3c7",icon:"🧾",title:"Kalkulator VAT", html:r2(sel("va-r","Stawka VAT",[["23","23%",1],["8","8%"],["5","5%"],["0","0%"]]),sel("va-t","Typ",[["net","Netto→Brutto",1],["gross","Brutto→Netto"]]))+inp("va-a","Kwota (zł)","number","1000")+btn("va-btn","Oblicz VAT")+res("va-r2"), init:function(el){q(el,"va-btn").onclick=function(){var a=fv(el,"va-a"),rt=parseFloat(sv(el,"va-r"))/100,t=sv(el,"va-t");if(isNaN(a)){er(el,"va-r2","Podaj kwotę");return;}var net,gross,vat;if(t==="net"){net=a;vat=a*rt;gross=a+vat;}else{gross=a;net=a/(1+rt);vat=gross-net;}ok(el,"va-r2","Netto: "+net.toFixed(2)+" zł\nVAT: "+vat.toFixed(2)+" zł\nBrutto: "+gross.toFixed(2)+" zł");};}} ,
{id:"loan",cat:"finanse",ib:"#e0e7ff",icon:"🏦",title:"Rata kredytu (EMI)", html:inp("ln-a","Kwota kredytu (zł)","number","300000")+r2(inp("ln-r","Oprocentowanie roczne (%)","number","7"),inp("ln-m","Okres (miesięcy)","number","360"))+btn("ln-btn","Oblicz ratę")+res("ln-r2"), init:function(el){q(el,"ln-btn").onclick=function(){var P=fv(el,"ln-a"),r=fv(el,"ln-r")/100/12,n=fv(el,"ln-m");if(isNaN(P)||isNaN(r)||isNaN(n)){er(el,"ln-r2","Wypełnij wszystkie pola");return;}var emi=r===0?P/n:P*r*Math.pow(1+r,n)/(Math.pow(1+r,n)-1),total=emi*n;ok(el,"ln-r2","Rata: "+emi.toFixed(2)+" zł\nŁącznie: "+total.toFixed(2)+" zł\nOdsetki: "+(total-P).toFixed(2)+" zł");};}} ,
{id:"ci",cat:"finanse",ib:"#d1fae5",icon:"📈",title:"Procent składany", html:inp("ci-p","Kapitał (zł)","number","10000")+r3(inp("ci-r","Stopa roczna (%)","number","5"),inp("ci-t","Lata","number","10"),sel("ci-n","Kapitalizacja",[["1","Rocznie"],["4","Kwartalnie"],["12","Miesięcznie",1],["365","Dziennie"]]))+btn("ci-btn")+res("ci-r2"), init:function(el){q(el,"ci-btn").onclick=function(){var P=fv(el,"ci-p"),r=fv(el,"ci-r")/100,t=fv(el,"ci-t"),n=parseFloat(sv(el,"ci-n"));if(isNaN(P)||isNaN(r)||isNaN(t)){er(el,"ci-r2","Wypełnij pola");return;}var A=P*Math.pow(1+r/n,n*t);ok(el,"ci-r2","Wartość końcowa: "+A.toFixed(2)+" zł\nZysk: "+(A-P).toFixed(2)+" zł");};}} ,
{id:"curr",cat:"finanse",ib:"#fce7f3",icon:"💱",title:"Przelicznik walut (orientacyjny)", html:inp("cx-a","Kwota","number","100")+r2(sel("cx-f","Z",[["PLN","PLN",1],["EUR","EUR"],["USD","USD"],["GBP","GBP"],["CHF","CHF"],["CZK","CZK"]]),sel("cx-t","Na",[["EUR","EUR",1],["PLN","PLN"],["USD","USD"],["GBP","GBP"],["CHF","CHF"],["CZK","CZK"]]))+btn("cx-btn","Przelicz")+res("cx-r")+note("Sprawdź aktualne kursy: NBP.pl"), init:function(el){var R={PLN:1,EUR:4.25,USD:3.97,GBP:5.00,CHF:4.43,CZK:0.173};q(el,"cx-btn").onclick=function(){var a=fv(el,"cx-a"),fr=sv(el,"cx-f"),to=sv(el,"cx-t");if(isNaN(a)){er(el,"cx-r","Podaj kwotę");return;}var res2=a*R[fr]/R[to];ok(el,"cx-r",a+" "+fr+" ≈ "+res2.toFixed(4)+" "+to+"\n1 "+fr+" ≈ "+(R[fr]/R[to]).toFixed(4)+" "+to);};}} ,
{id:"roi",cat:"finanse",ib:"#d1fae5",icon:"💹",title:"ROI – zwrot z inwestycji", html:r2(inp("ri-c","Koszt (zł)","number","50000"),inp("ri-g","Przychód (zł)","number","65000"))+inp("ri-t","Czas (lata)","number","2")+btn("ri-btn","Oblicz ROI")+res("ri-r"), init:function(el){q(el,"ri-btn").onclick=function(){var c=fv(el,"ri-c"),g=fv(el,"ri-g"),t=fv(el,"ri-t");if(isNaN(c)||isNaN(g)||c===0){er(el,"ri-r","Podaj koszt i przychód");return;}var roi=(g-c)/c*100,txt="ROI = "+roi.toFixed(2)+"%\nZysk = "+(g-c).toFixed(2)+" zł";if(!isNaN(t)&&t>0)txt+="\nRoczny ROI ≈ "+((Math.pow(g/c,1/t)-1)*100).toFixed(2)+"%";ok(el,"ri-r",txt);};}} ,
{id:"tip",cat:"finanse",ib:"#fef3c7",icon:"💁",title:"Kalkulator napiwku", html:r2(inp("ti-a","Rachunek (zł)","number","120"),inp("ti-p","Napiwek (%)","number","10"))+inp("ti-n","Liczba osób","number","2")+btn("ti-btn")+res("ti-r"), init:function(el){q(el,"ti-btn").onclick=function(){var a=fv(el,"ti-a"),p=fv(el,"ti-p"),n=fv(el,"ti-n")||1;if(isNaN(a)){er(el,"ti-r","Podaj kwotę");return;}var tip=a*p/100;ok(el,"ti-r","Napiwek: "+tip.toFixed(2)+" zł\nŁącznie: "+(a+tip).toFixed(2)+" zł\nNa osobę: "+((a+tip)/n).toFixed(2)+" zł");};}} ,
{id:"sal",cat:"finanse",ib:"#ede9fe",icon:"💼",title:"Wynagrodzenie brutto/netto (PL)", html:r2(inp("sl-a","Kwota (zł)","number","6000"),sel("sl-t","Typ",[["gross","Brutto→Netto",1],["net","Netto→Brutto"]]))+btn("sl-btn","Oblicz (umowa o pracę)")+res("sl-r")+note("Szacunkowe – bez ulg"), init:function(el){q(el,"sl-btn").onclick=function(){var a=fv(el,"sl-a"),t=sv(el,"sl-t");if(isNaN(a)){er(el,"sl-r","Podaj kwotę");return;}if(t==="gross"){var zus=a*0.1371,health=a*0.0698,pit=Math.max((a-zus-250)*0.12,0),net=a-zus-health-pit;ok(el,"sl-r","Brutto: "+a.toFixed(2)+" zł\nZUS: "+zus.toFixed(2)+" zł\nPIT: "+pit.toFixed(2)+" zł\nNetto ≈: "+net.toFixed(2)+" zł");}else{ok(el,"sl-r","Brutto ≈: "+(a/0.694).toFixed(2)+" zł");}};}} ,
{id:"infl",cat:"finanse",ib:"#fee2e2",icon:"📉",title:"Kalkulator inflacji", html:inp("in-a","Kwota (zł)","number","1000")+r2(inp("in-r","Inflacja roczna (%)","number","5"),inp("in-t","Lata","number","10"))+btn("in-btn","Oblicz siłę nabywczą")+res("in-r2"), init:function(el){q(el,"in-btn").onclick=function(){var a=fv(el,"in-a"),r=fv(el,"in-r")/100,t=fv(el,"in-t");if(isNaN(a)||isNaN(r)||isNaN(t)){er(el,"in-r2","Wypełnij pola");return;}var pv=a/Math.pow(1+r,t);ok(el,"in-r2","Za "+t+" lat "+a+" zł będzie warte:\n"+pv.toFixed(2)+" zł\nStraci: "+(a-pv).toFixed(2)+" zł siły nab.");};}} ,
{id:"bep",cat:"finanse",ib:"#ffedd5",icon:"⚖️",title:"Próg rentowności (BEP)", html:inp("be-f","Koszty stałe (zł)","number","10000")+r2(inp("be-p","Cena sprzedaży (zł)","number","50"),inp("be-v","Koszt zmienny/szt","number","30"))+btn("be-btn")+res("be-r"), init:function(el){q(el,"be-btn").onclick=function(){var f=fv(el,"be-f"),p=fv(el,"be-p"),v=fv(el,"be-v");if(isNaN(f)||p<=v){er(el,"be-r","Cena musi być > koszt zmienny");return;}var b=f/(p-v);ok(el,"be-r","BEP: "+Math.ceil(b)+" szt.\nPrzychód: "+(Math.ceil(b)*p).toFixed(2)+" zł");};}} ,
{id:"disc",cat:"finanse",ib:"#d1fae5",icon:"🏷️",title:"Kalkulator rabatu", html:r2(inp("dc-p","Cena pierwotna (zł)","number","299.99"),inp("dc-d","Rabat (%)","number","30"))+btn("dc-btn")+res("dc-r"), init:function(el){q(el,"dc-btn").onclick=function(){var p=fv(el,"dc-p"),d=fv(el,"dc-d");if(isNaN(p)||isNaN(d)){er(el,"dc-r","Podaj cenę i rabat");return;}var save=p*d/100;ok(el,"dc-r","Cena po rabacie: "+(p-save).toFixed(2)+" zł\nOszczędzasz: "+save.toFixed(2)+" zł");};}} ,
{id:"sav",cat:"finanse",ib:"#dbeafe",icon:"🐷",title:"Cel oszczędnościowy",
html:inp("sg-g","Cel (zł)","number","100000")+r3(inp("sg-s","Mam już (zł)","number","0"),inp("sg-m","Wpłata/mies (zł)","number","1000"),inp("sg-r","Oprocentowanie (%)","number","4"))+btn("sg-btn")+res("sg-r2"),
init:function(el){q(el,"sg-btn").onclick=function(){var goal=fv(el,"sg-g"),start=fv(el,"sg-s")||0,monthly=fv(el,"sg-m"),rate=(fv(el,"sg-r")||0)/100/12;if(isNaN(goal)||isNaN(monthly)||monthly<=0){er(el,"sg-r2","Podaj cel i wpłatę");return;}var bal=start,months=0;while(bal
{id:"pit",cat:"finanse",ib:"#fce7f3",icon:"🇵🇱",title:"Podatek PIT i ZUS 2024", html:inp("pit-a","Roczny dochód brutto (zł)","number","80000")+sel("pit-t","Typ",[["uop","Umowa o pracę",1],["b2b","B2B liniowy 19%"]])+btn("pit-btn")+res("pit-r")+note("Uproszczone – skonsultuj z księgowym"), init:function(el){q(el,"pit-btn").onclick=function(){var a=fv(el,"pit-a"),t=sv(el,"pit-t");if(isNaN(a)||a<0){er(el,"pit-r","Podaj dochód");return;}var tax,zus,net;if(t==="uop"){zus=a*0.1371;var base=a-zus-3000;tax=base<=120000?Math.max(base*0.12-3600,0):(120000-zus-3000)*0.12-3600+(base-120000)*0.32;net=a-zus-a*0.0698-tax;}else{zus=17474;tax=Math.max((a-zus)*0.19,0);net=a-zus-tax;}ok(el,"pit-r","ZUS: "+zus.toFixed(0)+" zł\nPodatek: "+tax.toFixed(0)+" zł\nNetto: "+net.toFixed(0)+" zł\nNetto/mies.: "+(net/12).toFixed(0)+" zł");};}} , {id:"ot",cat:"finanse",ib:"#dbeafe",icon:"📋",title:"Wypłata z nadgodzinami", html:r2(inp("ot-r","Stawka godz. (zł)","number","50"),inp("ot-h","Przeprac. godziny","number","180"))+r2(inp("ot-n","Norma godz./mies.","number","168"),sel("ot-s","Nadgodziny",[["1.5","Dobowe (×1.5)",1],["2","Nocne/weekend (×2)"]]))+btn("ot-btn")+res("ot-r2"), init:function(el){q(el,"ot-btn").onclick=function(){var rt=fv(el,"ot-r"),h=fv(el,"ot-h"),norm=fv(el,"ot-n")||168,s=parseFloat(sv(el,"ot-s"));if(isNaN(rt)||isNaN(h)){er(el,"ot-r2","Podaj stawkę i godziny");return;}var over=Math.max(0,h-norm),reg=Math.min(h,norm)*rt,extra=over*rt*s;ok(el,"ot-r2","Normalne: "+Math.min(h,norm)+"h = "+reg.toFixed(2)+" zł\nNadgodziny: "+over+"h×"+s+" = "+extra.toFixed(2)+" zł\nRazem: "+(reg+extra).toFixed(2)+" zł");};}} , /* ===== JEDNOSTKI ===== */ {id:"len",cat:"jednostki",ib:"#dbeafe",icon:"📏",title:"Przelicznik długości", html:inp("le-v","Wartość","number","1")+r2(sel("le-f","Z",[["mm","mm"],["cm","cm"],["m","m",1],["km","km"],["in","cal (in)"],["ft","stopa (ft)"],["mi","mila (mi)"]]),sel("le-t","Na",[["mm","mm"],["cm","cm"],["m","m"],["km","km"],["in","cal (in)",1],["ft","stopa"],["mi","mila"]]))+btn("le-btn","Przelicz")+res("le-r"), init:function(el){var R={mm:.001,cm:.01,m:1,km:1000,in:.0254,ft:.3048,yd:.9144,mi:1609.344,nm:1852};q(el,"le-btn").onclick=function(){var v=fv(el,"le-v"),f=sv(el,"le-f"),t=sv(el,"le-t");if(isNaN(v)){er(el,"le-r","Podaj wartość");return;}ok(el,"le-r",v+" "+f+" = "+clean(v*R[f]/R[t])+" "+t);};}} , {id:"wt",cat:"jednostki",ib:"#fef3c7",icon:"⚖️",title:"Przelicznik masy", html:inp("we-v","Wartość","number","1")+r2(sel("we-f","Z",[["g","g"],["dag","dag"],["kg","kg",1],["t","tona"],["oz","uncja"],["lb","funt (lb)"]]),sel("we-t","Na",[["g","g"],["dag","dag"],["kg","kg"],["t","tona"],["oz","uncja",1],["lb","funt"]]))+btn("we-btn","Przelicz")+res("we-r"), init:function(el){var R={mg:1e-6,g:.001,dag:.01,kg:1,t:1000,oz:.0283495,lb:.453592};q(el,"we-btn").onclick=function(){var v=fv(el,"we-v"),f=sv(el,"we-f"),t=sv(el,"we-t");if(isNaN(v)){er(el,"we-r","Podaj wartość");return;}ok(el,"we-r",v+" "+f+" = "+clean(v*R[f]/R[t])+" "+t);};}} , {id:"temp",cat:"jednostki",ib:"#fee2e2",icon:"🌡️",title:"Przelicznik temperatury", html:inp("te-v","Wartość","number","100")+r2(sel("te-f","Z",[["C","°C",1],["F","°F"],["K","K"]]),sel("te-t","Na",[["C","°C"],["F","°F",1],["K","K"]]))+btn("te-btn","Przelicz")+res("te-r"), init:function(el){q(el,"te-btn").onclick=function(){var v=fv(el,"te-v"),f=sv(el,"te-f"),t=sv(el,"te-t");if(isNaN(v)){er(el,"te-r","Podaj wartość");return;}var c=f==="C"?v:f==="F"?(v-32)*5/9:v-273.15,res2=t==="C"?c:t==="F"?c*9/5+32:c+273.15;ok(el,"te-r",v+" "+f+" = "+Math.round(res2*1e6)/1e6+" "+t);};}} , {id:"vol",cat:"jednostki",ib:"#d1fae5",icon:"🧴",title:"Przelicznik objętości", html:inp("vo-v","Wartość","number","1")+r2(sel("vo-f","Z",[["ml","ml"],["dl","dl"],["l","litr",1],["m3","m³"],["cup","szklanka US"],["gal","galon US"]]),sel("vo-t","Na",[["ml","ml",1],["dl","dl"],["l","litr"],["m3","m³"],["cup","szklanka"],["gal","galon"]]))+btn("vo-btn","Przelicz")+res("vo-r"), init:function(el){var R={ml:.001,dl:.1,l:1,m3:1000,tsp:.00493,tbsp:.01479,cup:.23659,pt:.47318,gal:3.78541};q(el,"vo-btn").onclick=function(){var v=fv(el,"vo-v"),f=sv(el,"vo-f"),t=sv(el,"vo-t");if(isNaN(v)){er(el,"vo-r","Podaj wartość");return;}ok(el,"vo-r",v+" "+f+" = "+clean(v*R[f]/R[t])+" "+t);};}} , {id:"spd",cat:"jednostki",ib:"#ede9fe",icon:"🚀",title:"Przelicznik prędkości", html:inp("sp-v","Wartość","number","100")+r2(sel("sp-f","Z",[["ms","m/s"],["kmh","km/h",1],["mph","mph"],["kn","węzeł"]]),sel("sp-t","Na",[["ms","m/s"],["kmh","km/h"],["mph","mph",1],["kn","węzeł"]]))+btn("sp-btn","Przelicz")+res("sp-r"), init:function(el){var R={ms:1,kmh:1/3.6,mph:.44704,kn:.514444,mach:340.29};q(el,"sp-btn").onclick=function(){var v=fv(el,"sp-v"),f=sv(el,"sp-f"),t=sv(el,"sp-t");if(isNaN(v)){er(el,"sp-r","Podaj wartość");return;}ok(el,"sp-r",v+" "+f+" = "+clean(v*R[f]/R[t])+" "+t);};}} , {id:"data2",cat:"jednostki",ib:"#e0e7ff",icon:"💾",title:"Przelicznik danych cyfrowych", html:inp("ds-v","Wartość","number","1")+r2(sel("ds-f","Z",[["bit","bit"],["B","Bajt",1],["KB","KB"],["MB","MB"],["GB","GB"],["TB","TB"]]),sel("ds-t","Na",[["bit","bit"],["B","Bajt"],["KB","KB"],["MB","MB",1],["GB","GB"],["TB","TB"]]))+btn("ds-btn","Przelicz")+res("ds-r"), init:function(el){var R={bit:.125,B:1,KB:1e3,MB:1e6,GB:1e9,TB:1e12};q(el,"ds-btn").onclick=function(){var v=fv(el,"ds-v"),f=sv(el,"ds-f"),t=sv(el,"ds-t");if(isNaN(v)){er(el,"ds-r","Podaj wartość");return;}ok(el,"ds-r",v+" "+f+" = "+clean(v*R[f]/R[t])+" "+t);};}} , {id:"area",cat:"jednostki",ib:"#d1fae5",icon:"⬜",title:"Przelicznik powierzchni", html:inp("ar-v","Wartość","number","1")+r2(sel("ar-f","Z",[["cm2","cm²"],["m2","m²",1],["km2","km²"],["ha","hektar"],["ft2","ft²"],["ac","akr"]]),sel("ar-t","Na",[["cm2","cm²"],["m2","m²"],["km2","km²"],["ha","hektar",1],["ft2","ft²"],["ac","akr"]]))+btn("ar-btn","Przelicz")+res("ar-r"), init:function(el){var R={cm2:1e-4,m2:1,km2:1e6,ha:1e4,ft2:.0929,ac:4046.86};q(el,"ar-btn").onclick=function(){var v=fv(el,"ar-v"),f=sv(el,"ar-f"),t=sv(el,"ar-t");if(isNaN(v)){er(el,"ar-r","Podaj wartość");return;}ok(el,"ar-r",v+" "+f+" = "+clean(v*R[f]/R[t])+" "+t);};}} , {id:"pres",cat:"jednostki",ib:"#fce7f3",icon:"🌡",title:"Przelicznik ciśnienia", html:inp("ps-v","Wartość","number","1")+r2(sel("ps-f","Z",[["Pa","Pa"],["hPa","hPa",1],["kPa","kPa"],["bar","bar"],["atm","atm"],["mmHg","mmHg"],["psi","psi"]]),sel("ps-t","Na",[["Pa","Pa"],["hPa","hPa"],["kPa","kPa"],["bar","bar"],["atm","atm",1],["mmHg","mmHg"],["psi","psi"]]))+btn("ps-btn","Przelicz")+res("ps-r"), init:function(el){var R={Pa:1,hPa:100,kPa:1000,bar:1e5,atm:101325,mmHg:133.322,psi:6894.76};q(el,"ps-btn").onclick=function(){var v=fv(el,"ps-v"),f=sv(el,"ps-f"),t=sv(el,"ps-t");if(isNaN(v)){er(el,"ps-r","Podaj wartość");return;}ok(el,"ps-r",v+" "+f+" = "+clean(v*R[f]/R[t])+" "+t);};}} , {id:"enrg",cat:"jednostki",ib:"#fef3c7",icon:"⚡",title:"Przelicznik energii", html:inp("en-v","Wartość","number","1")+r2(sel("en-f","Z",[["J","J",1],["kJ","kJ"],["MJ","MJ"],["cal","kaloria"],["kcal","kcal"],["kWh","kWh"],["BTU","BTU"]]),sel("en-t","Na",[["J","J"],["kJ","kJ"],["MJ","MJ"],["cal","kaloria"],["kcal","kcal",1],["kWh","kWh"],["BTU","BTU"]]))+btn("en-btn","Przelicz")+res("en-r"), init:function(el){var R={J:1,kJ:1000,MJ:1e6,cal:4.184,kcal:4184,kWh:3.6e6,BTU:1055.06};q(el,"en-btn").onclick=function(){var v=fv(el,"en-v"),f=sv(el,"en-f"),t=sv(el,"en-t");if(isNaN(v)){er(el,"en-r","Podaj wartość");return;}ok(el,"en-r",v+" "+f+" = "+clean(v*R[f]/R[t])+" "+t);};}} , {id:"ang",cat:"jednostki",ib:"#ede9fe",icon:"📐",title:"Przelicznik kątów", html:inp("an-v","Wartość","number","90")+r2(sel("an-f","Z",[["deg","Stopnie °",1],["rad","Radiany"],["grad","Grady"],["rev","Obroty"]]),sel("an-t","Na",[["deg","Stopnie"],["rad","Radiany",1],["grad","Grady"],["rev","Obroty"]]))+btn("an-btn","Przelicz")+res("an-r"), init:function(el){var D={deg:1,rad:180/Math.PI,grad:.9,rev:360};q(el,"an-btn").onclick=function(){var v=fv(el,"an-v"),f=sv(el,"an-f"),t=sv(el,"an-t");if(isNaN(v)){er(el,"an-r","Podaj wartość");return;}ok(el,"an-r",v+" "+f+" = "+clean(v*D[f]/D[t])+" "+t);};}} , {id:"tunit",cat:"jednostki",ib:"#ffedd5",icon:"⏱️",title:"Przelicznik czasu", html:inp("tu-v","Wartość","number","1")+r2(sel("tu-f","Z",[["ms","milisekunda"],["s","sekunda",1],["min","minuta"],["h","godzina"],["day","dzień"],["wk","tydzień"],["yr","rok"]]),sel("tu-t","Na",[["ms","milisekunda"],["s","sekunda"],["min","minuta",1],["h","godzina"],["day","dzień"],["wk","tydzień"],["yr","rok"]]))+btn("tu-btn","Przelicz")+res("tu-r"), init:function(el){var R={ms:.001,s:1,min:60,h:3600,day:86400,wk:604800,yr:31557600};q(el,"tu-btn").onclick=function(){var v=fv(el,"tu-v"),f=sv(el,"tu-f"),t=sv(el,"tu-t");if(isNaN(v)){er(el,"tu-r","Podaj wartość");return;}ok(el,"tu-r",v+" "+f+" = "+clean(v*R[f]/R[t])+" "+t);};}} , {id:"pwr2",cat:"jednostki",ib:"#d1fae5",icon:"💡",title:"Przelicznik mocy", html:inp("pw-v","Wartość","number","100")+r2(sel("pw-f","Z",[["W","W",1],["kW","kW"],["MW","MW"],["hp","KM (hp)"],["cv","CV"]]),sel("pw-t","Na",[["W","W"],["kW","kW",1],["MW","MW"],["hp","KM"],["cv","CV"]]))+btn("pw-btn","Przelicz")+res("pw-r"), init:function(el){var R={W:1,kW:1000,MW:1e6,hp:745.7,cv:735.499};q(el,"pw-btn").onclick=function(){var v=fv(el,"pw-v"),f=sv(el,"pw-f"),t=sv(el,"pw-t");if(isNaN(v)){er(el,"pw-r","Podaj wartość");return;}ok(el,"pw-r",v+" "+f+" = "+clean(v*R[f]/R[t])+" "+t);};}} , {id:"fuel2",cat:"jednostki",ib:"#fce7f3",icon:"⛽",title:"Spalanie l/100 ↔ mpg", html:inp("fp-v","Wartość","number","7")+r2(sel("fp-f","Z",[["l100","l/100km",1],["kml","km/l"],["mpg","mpg (US)"]]),sel("fp-t","Na",[["l100","l/100km"],["kml","km/l"],["mpg","mpg (US)",1]]))+btn("fp-btn","Przelicz")+res("fp-r"), init:function(el){q(el,"fp-btn").onclick=function(){var v=fv(el,"fp-v"),f=sv(el,"fp-f"),t=sv(el,"fp-t");if(isNaN(v)||v<=0){er(el,"fp-r","Podaj wartość > 0");return;}var l100=f==="l100"?v:f==="kml"?100/v:235.215/v,res2=t==="l100"?l100:t==="kml"?100/l100:235.215/l100;ok(el,"fp-r",v+" "+f+" = "+res2.toFixed(4)+" "+t);};}} ,
/* ===== ZDROWIE ===== */ {id:"bmi",cat:"zdrowie",ib:"#fee2e2",icon:"❤️",title:"Kalkulator BMI", html:r2(inp("bm-w","Waga (kg)","number","70"),inp("bm-h","Wzrost (cm)","number","175"))+btn("bm-btn","Oblicz BMI")+res("bm-r"), init:function(el){q(el,"bm-btn").onclick=function(){var w=fv(el,"bm-w"),h=fv(el,"bm-h")/100;if(isNaN(w)||h<=0){er(el,"bm-r","Podaj wagę i wzrost");return;}var bmi=w/(h*h),cat=bmi<18.5?"▼ Niedowaga":bmi<25?"✓ Prawidłowa":bmi<30?"▲ Nadwaga":"⚠ Otyłość";ok(el,"bm-r","BMI: "+bmi.toFixed(2)+"\n"+cat+"\nPrawidłowa: "+(18.5*h*h).toFixed(1)+"–"+(25*h*h).toFixed(1)+" kg");};}} , {id:"bmr",cat:"zdrowie",ib:"#ffedd5",icon:"🔥",title:"BMR & TDEE – kalorie", html:r2(inp("br-w","Waga (kg)","number","70"),inp("br-h","Wzrost (cm)","number","175"))+r2(inp("br-a","Wiek","number","30"),sel("br-s","Płeć",[["m","Mężczyzna",1],["f","Kobieta"]]))+sel("br-ac","Aktywność",[["1.2","Siedzący"],["1.375","Lekka (1-3×/tydz)"],["1.55","Umiarkowana",1],["1.725","Wysoka"],["1.9","Bardzo wysoka"]])+btn("br-btn")+res("br-r"), init:function(el){q(el,"br-btn").onclick=function(){var w=fv(el,"br-w"),h=fv(el,"br-h"),a=fv(el,"br-a"),s=sv(el,"br-s"),act=parseFloat(sv(el,"br-ac"));if(isNaN(w)||isNaN(h)||isNaN(a)){er(el,"br-r","Wypełnij wszystkie pola");return;}var bmr=s==="m"?10*w+6.25*h-5*a+5:10*w+6.25*h-5*a-161,tdee=bmr*act;ok(el,"br-r","BMR: "+Math.round(bmr)+" kcal\nTDEE: "+Math.round(tdee)+" kcal\nChudnięcie: "+Math.round(tdee-500)+" kcal\nPrzyrost: "+Math.round(tdee+300)+" kcal");};}} , {id:"water",cat:"zdrowie",ib:"#dbeafe",icon:"💧",title:"Zapotrzebowanie na wodę", html:r2(inp("wa-w","Waga (kg)","number","70"),sel("wa-a","Aktywność",[["1","Niska"],["1.3","Normalna",1],["1.6","Wysoka"],["1.9","Intensywna"]]))+btn("wa-btn")+res("wa-r"), init:function(el){q(el,"wa-btn").onclick=function(){var w=fv(el,"wa-w"),a=parseFloat(sv(el,"wa-a"));if(isNaN(w)){er(el,"wa-r","Podaj wagę");return;}var t=w*0.033*a;ok(el,"wa-r","Zalecane: "+t.toFixed(2)+" l/dzień\n≈ "+Math.round(t*1000/250)+" szklanek 250ml");};}} , {id:"hr",cat:"zdrowie",ib:"#fee2e2",icon:"💓",title:"Strefy tętna", html:r2(inp("hz-a","Wiek (lata)","number","30"),inp("hz-r","Tętno spoczynkowe","number","60"))+btn("hz-btn","Oblicz strefy")+res("hz-r2"), init:function(el){q(el,"hz-btn").onclick=function(){var age=fv(el,"hz-a"),rest=fv(el,"hz-r")||60;if(isNaN(age)){er(el,"hz-r2","Podaj wiek");return;}var max=220-age,hrr=max-rest;function z(p){return Math.round(rest+hrr*p);}ok(el,"hz-r2","Maks: "+max+" bpm\nZ1 Regeneracja: "+z(.5)+"–"+z(.6)+"\nZ2 Aerobowa: "+z(.6)+"–"+z(.7)+"\nZ3 Próg: "+z(.7)+"–"+z(.8)+"\nZ4 Beztlen.: "+z(.8)+"–"+z(.9));};}} , {id:"iw",cat:"zdrowie",ib:"#d1fae5",icon:"⚖️",title:"Idealna waga ciała", html:r2(inp("iw-h","Wzrost (cm)","number","175"),sel("iw-s","Płeć",[["m","Mężczyzna",1],["f","Kobieta"]]))+btn("iw-btn")+res("iw-r"), init:function(el){q(el,"iw-btn").onclick=function(){var h=fv(el,"iw-h"),s=sv(el,"iw-s"),h2=h/100;if(isNaN(h)||h<100){er(el,"iw-r","Podaj wzrost (min 100cm)");return;}var dev=(h-152.4)*.453592,div=s==="m"?50+dev:45.5+dev;ok(el,"iw-r","Devine: "+div.toFixed(1)+" kg\nBMI=22: "+(22*h2*h2).toFixed(1)+" kg\nZakres: "+(18.5*h2*h2).toFixed(1)+"–"+(25*h2*h2).toFixed(1)+" kg");};}} , {id:"bac",cat:"zdrowie",ib:"#fef3c7",icon:"🍺",title:"Kalkulator promili (BAC)", html:r2(inp("ba-w","Waga (kg)","number","70"),sel("ba-s","Płeć",[["0.7","Mężczyzna",1],["0.6","Kobieta"]]))+r2(inp("ba-a","Alkohol czysty (g)","number","40"),inp("ba-t","Czas od spożycia (h)","number","1"))+note("0.5l piwa 5%≈20g | 100ml wódki 40%≈32g")+btn("ba-btn")+res("ba-r"), init:function(el){q(el,"ba-btn").onclick=function(){var w=fv(el,"ba-w"),s=parseFloat(sv(el,"ba-s")),a=fv(el,"ba-a"),t=fv(el,"ba-t")||0;if(isNaN(w)||isNaN(a)){er(el,"ba-r","Podaj wagę i alkohol");return;}var bac=Math.max(0,(a/(w*s*10))-.15*t),st=bac<.02?"Trzeźwy ✓":bac<.05?"Lekkie":bac<.2?"Widoczne ⚠":"Upojenie ⛔";ok(el,"ba-r","BAC: "+bac.toFixed(3)+" ‰\nStan: "+st);};}} , {id:"preg",cat:"zdrowie",ib:"#fce7f3",icon:"🤱",title:"Termin porodu", html:inp("pg-d","Data ostatniej miesiączki (LMP)","date","")+btn("pg-btn","Oblicz termin")+res("pg-r"), init:function(el){q(el,"pg-btn").onclick=function(){var d=new Date(q(el,"pg-d").value);if(isNaN(d)){er(el,"pg-r","Wybierz datę");return;}var due=new Date(d);due.setDate(due.getDate()+280);var now=new Date(),wks=Math.floor((now-d)/86400000/7),diff=Math.round((due-now)/86400000);ok(el,"pg-r","Termin: "+due.toLocaleDateString("pl-PL",{day:"numeric",month:"long",year:"numeric"})+"\nObecnie: "+wks+" tyg.\n"+(diff>0?diff+" dni do terminu":Math.abs(diff)+" dni po terminie"));};}} ,
{id:"sleep",cat:"zdrowie",ib:"#ede9fe",icon:"😴",title:"Optymalne pory snu",
html:inp("sl2-t","Zasypiasz o (czas)","time","")+btn("sl2-btn","Oblicz (cykl=90 min)")+res("sl2-r"),
init:function(el){q(el,"sl2-t").value="23:00";q(el,"sl2-btn").onclick=function(){var st=q(el,"sl2-t").value.split(":"),sm=parseInt(st[0])*60+parseInt(st[1])+14,txt="Optymalne budzenia:\n";for(var i=3;i<=7;i++){var wm=(sm+i*90)%1440;txt+=(i*1.5)+"h: "+String(Math.floor(wm/60)).padStart(2,"0")+":"+String(wm%60).padStart(2,"0")+"\n";}ok(el,"sl2-r",txt.trim());};}}
,
{id:"cal",cat:"zdrowie",ib:"#d1fae5",icon:"🍎",title:"Kalorie z makroskładników",
html:r2(inp("cf-p","Białko (g)","number","20"),inp("cf-c","Węglowodany (g)","number","50"))+r2(inp("cf-f","Tłuszcze (g)","number","15"),inp("cf-fi","Błonnik (g)","number","5"))+btn("cf-btn","Oblicz kalorie")+res("cf-r"),
init:function(el){q(el,"cf-btn").onclick=function(){var p=fv(el,"cf-p")||0,c=fv(el,"cf-c")||0,f=fv(el,"cf-f")||0,fi=fv(el,"cf-fi")||0,total=p*4+c*4+f*9-fi*2;ok(el,"cf-r","Łącznie: "+total.toFixed(0)+" kcal\nBiałko: "+(p*4).toFixed(0)+" kcal\nWęglowodany: "+(c*4).toFixed(0)+" kcal\nTłuszcze: "+(f*9).toFixed(0)+" kcal");};}}
,
{id:"whr",cat:"zdrowie",ib:"#fef3c7",icon:"📏",title:"Wskaźnik talia-biodra (WHR)",
html:r2(inp("wh-w","Obwód talii (cm)","number","80"),inp("wh-h2","Obwód bioder (cm)","number","95"))+sel("wh-s","Płeć",[["m","Mężczyzna",1],["f","Kobieta"]])+btn("wh-btn","Oblicz WHR")+res("wh-r"),
init:function(el){q(el,"wh-btn").onclick=function(){var w=fv(el,"wh-w"),h=fv(el,"wh-h2"),s=sv(el,"wh-s");if(isNaN(w)||isNaN(h)||h===0){er(el,"wh-r","Podaj oba wymiary");return;}var whr=w/h,risk=s==="m"?(whr<.9?"Niskie ✓":whr<.95?"Umiarkowane":"Wysokie ⚠"):(whr<.8?"Niskie ✓":whr<.85?"Umiarkowane":"Wysokie ⚠");ok(el,"wh-r","WHR = "+whr.toFixed(3)+"\nRyzyko: "+risk);};}}
,
{id:"cbmi",cat:"zdrowie",ib:"#fce7f3",icon:"👶",title:"BMI dla dzieci",
html:r3(inp("cb-w","Waga (kg)","number","20"),inp("cb-h","Wzrost (cm)","number","110"),inp("cb-a","Wiek (lata)","number","6"))+sel("cb-s","Płeć",[["m","Chłopiec",1],["f","Dziewczynka"]])+btn("cb-btn")+res("cb-r"),
init:function(el){q(el,"cb-btn").onclick=function(){var w=fv(el,"cb-w"),h=fv(el,"cb-h")/100,a=fv(el,"cb-a");if(isNaN(w)||isNaN(h)||isNaN(a)||h<=0){er(el,"cb-r","Podaj wszystkie dane");return;}var bmi=w/(h*h),msg=bmi<14?"Niedowaga":bmi<18?"Prawidłowe":bmi<22?"Nadwaga":"Otyłość";ok(el,"cb-r","BMI: "+bmi.toFixed(2)+"\nOcena: "+msg);};}}
,
/* ===== DATA & CZAS ===== */
{id:"age",cat:"data",ib:"#fce7f3",icon:"🎂",title:"Kalkulator wieku",
html:inp("ag-d","Data urodzenia","date","")+btn("ag-btn","Oblicz wiek")+res("ag-r"),
init:function(el){q(el,"ag-btn").onclick=function(){var d=new Date(q(el,"ag-d").value);if(isNaN(d)){er(el,"ag-r","Wybierz datę");return;}var now=new Date(),y=now.getFullYear()-d.getFullYear(),m=now.getMonth()-d.getMonth();if(m<0||(m===0&&now.getDate()
{id:"wkno",cat:"data",ib:"#dbeafe",icon:"📆",title:"Numer tygodnia i dzień roku", html:inp("wn-d","Data","date","")+btn("wn-btn","Sprawdź")+res("wn-r"), init:function(el){q(el,"wn-d").value=new Date().toISOString().split("T")[0];q(el,"wn-btn").onclick=function(){var d=new Date(q(el,"wn-d").value);if(isNaN(d)){er(el,"wn-r","Wybierz datę");return;}var jan1=new Date(d.getFullYear(),0,1),doy=Math.ceil((d-jan1)/86400000)+1,wk=Math.ceil((doy+jan1.getDay())/7),days=["Niedz.","Pon.","Wt.","Śr.","Czw.","Pt.","Sob."];ok(el,"wn-r",d.toLocaleDateString("pl-PL")+"\n"+days[d.getDay()]+"\nTydzień nr: "+wk+"\nDzień roku: "+doy);};}} ,
{id:"hms",cat:"data",ib:"#ffedd5",icon:"⏱",title:"Przelicznik sekund/minut/godzin", html:r2(inp("hm-v","Wartość","number","3661"),sel("hm-f","Format",[["s","sekundy",1],["m","minuty"],["h","godziny"]]))+btn("hm-btn","Przelicz")+res("hm-r"), init:function(el){q(el,"hm-btn").onclick=function(){var v=fv(el,"hm-v"),f=sv(el,"hm-f");if(isNaN(v)||v<0){er(el,"hm-r","Podaj wartość");return;}var s2=f==="s"?v:f==="m"?v*60:v*3600;ok(el,"hm-r",Math.floor(s2/3600)+"h "+Math.floor((s2%3600)/60)+"min "+Math.floor(s2%60)+"s\nSekundy: "+s2.toFixed(0)+"\nMinuty: "+(s2/60).toFixed(2));};}} , {id:"dadd",cat:"data",ib:"#d1fae5",icon:"➕",title:"Dodaj/odejmij dni od daty", html:r2(inp("da-d","Data bazowa","date",""),inp("da-n","Liczba dni (+/-)","number","30"))+btn("da-btn")+res("da-r"), init:function(el){q(el,"da-d").value=new Date().toISOString().split("T")[0];q(el,"da-btn").onclick=function(){var d=new Date(q(el,"da-d").value),n=parseInt(q(el,"da-n").value);if(isNaN(d)||isNaN(n)){er(el,"da-r","Wybierz datę i dni");return;}var nd=new Date(d);nd.setDate(nd.getDate()+n);ok(el,"da-r",d.toLocaleDateString("pl-PL")+" + "+n+" dni\n= "+nd.toLocaleDateString("pl-PL",{weekday:"long",day:"numeric",month:"long",year:"numeric"}));};}} , /* ===== GEOMETRIA ===== */ {id:"circ",cat:"geometria",ib:"#e0e7ff",icon:"⭕",title:"Koło – pole i obwód", html:inp("ci2-r","Promień (r)","number","5")+btn("ci2-btn")+res("ci2-r2"), init:function(el){q(el,"ci2-btn").onclick=function(){var r=fv(el,"ci2-r");if(isNaN(r)||r<=0){er(el,"ci2-r2","Podaj r > 0");return;}ok(el,"ci2-r2","Pole: "+(Math.PI*r*r).toFixed(6)+"\nObwód: "+(2*Math.PI*r).toFixed(6)+"\nŚrednica: "+(2*r));};}} ,
{id:"rect",cat:"geometria",ib:"#d1fae5",icon:"▭",title:"Prostokąt / Kwadrat", html:r2(inp("re-a","Długość (a)","number","10"),inp("re-b","Szerokość (b)","number","5"))+btn("re-btn")+res("re-r"), init:function(el){q(el,"re-btn").onclick=function(){var a=fv(el,"re-a"),b=fv(el,"re-b");if(isNaN(a)||isNaN(b)||a<=0||b<=0){er(el,"re-r","Podaj boki > 0");return;}ok(el,"re-r","Pole: "+(a*b)+"\nObwód: "+(2*(a+b))+"\nPrzekątna: "+Math.sqrt(a*a+b*b).toFixed(6));};}} ,
{id:"tri",cat:"geometria",ib:"#fef3c7",icon:"△",title:"Trójkąt (wzór Herona)", html:r3(inp("tr-a","Bok a","number","3"),inp("tr-b","Bok b","number","4"),inp("tr-c","Bok c","number","5"))+btn("tr-btn")+res("tr-r"), init:function(el){q(el,"tr-btn").onclick=function(){var a=fv(el,"tr-a"),b=fv(el,"tr-b"),c=fv(el,"tr-c");if(isNaN(a)||a+b<=c||a+c<=b||b+c<=a){er(el,"tr-r","Nieprawidłowe boki");return;}var s=(a+b+c)/2,area=Math.sqrt(s*(s-a)*(s-b)*(s-c));ok(el,"tr-r","Pole: "+area.toFixed(6)+"\nObwód: "+(a+b+c)+"\nR (opisany): "+(a*b*c/(4*area)).toFixed(4)+"\nr (wpisany): "+(area/s).toFixed(4));};}} , {id:"sph",cat:"geometria",ib:"#dbeafe",icon:"🌐",title:"Kula", html:inp("sp2-r","Promień (r)","number","5")+btn("sp2-btn")+res("sp2-r2"), init:function(el){q(el,"sp2-btn").onclick=function(){var r=fv(el,"sp2-r");if(isNaN(r)||r<=0){er(el,"sp2-r2","Podaj r > 0");return;}ok(el,"sp2-r2","Objętość: "+(4/3*Math.PI*r*r*r).toFixed(4)+"\nPole: "+(4*Math.PI*r*r).toFixed(4)+"\nŚrednica: "+(2*r));};}} ,
{id:"cyl",cat:"geometria",ib:"#d1fae5",icon:"🥫",title:"Walec", html:r2(inp("cy-r","Promień (r)","number","3"),inp("cy-h","Wysokość (h)","number","10"))+btn("cy-btn")+res("cy-r2"), init:function(el){q(el,"cy-btn").onclick=function(){var r=fv(el,"cy-r"),h=fv(el,"cy-h");if(isNaN(r)||isNaN(h)||r<=0||h<=0){er(el,"cy-r2","Podaj r i h > 0");return;}ok(el,"cy-r2","Objętość: "+(Math.PI*r*r*h).toFixed(4)+"\nPow. boczna: "+(2*Math.PI*r*h).toFixed(4)+"\nCałk. pow.: "+(2*Math.PI*r*(r+h)).toFixed(4));};}} ,
{id:"cone",cat:"geometria",ib:"#ede9fe",icon:"🔺",title:"Stożek", html:r2(inp("co-r","Promień (r)","number","3"),inp("co-h","Wysokość (h)","number","4"))+btn("co-btn")+res("co-r2"), init:function(el){q(el,"co-btn").onclick=function(){var r=fv(el,"co-r"),h=fv(el,"co-h");if(isNaN(r)||isNaN(h)||r<=0||h<=0){er(el,"co-r2","Podaj r i h > 0");return;}var l=Math.sqrt(r*r+h*h);ok(el,"co-r2","Objętość: "+(1/3*Math.PI*r*r*h).toFixed(4)+"\nPow. boczna: "+(Math.PI*r*l).toFixed(4)+"\nTworzącą: "+l.toFixed(4));};}} ,
{id:"cube",cat:"geometria",ib:"#ffedd5",icon:"🎲",title:"Sześcian / Prostopadłościan", html:r3(inp("cu-a","a","number","5"),inp("cu-b","b (opcja)","number",""),inp("cu-c","c (opcja)","number",""))+btn("cu-btn")+res("cu-r"), init:function(el){q(el,"cu-btn").onclick=function(){var a=fv(el,"cu-a"),b=fv(el,"cu-b"),c2=fv(el,"cu-c");if(isNaN(a)||a<=0){er(el,"cu-r","Podaj a > 0");return;}if(isNaN(b)){ok(el,"cu-r","Objętość: "+a*a*a+"\nPole: "+(6*a*a)+"\nPrzekątna: "+(Math.sqrt(3)*a).toFixed(4));}else{var bv=b||a,cv=isNaN(c2)?bv:c2;ok(el,"cu-r","Objętość: "+a*bv*cv+"\nPole pow.: "+(2*(a*bv+bv*cv+a*cv))+"\nPrzekątna: "+Math.sqrt(a*a+bv*bv+cv*cv).toFixed(4));}};}} ,
{id:"trap",cat:"geometria",ib:"#fce7f3",icon:"⌓",title:"Trapez", html:r3(inp("tz2-a","Podstawa a","number","8"),inp("tz2-b","Podstawa b","number","4"),inp("tz2-h","Wysokość h","number","5"))+btn("tz2-btn")+res("tz2-r"), init:function(el){q(el,"tz2-btn").onclick=function(){var a=fv(el,"tz2-a"),b=fv(el,"tz2-b"),h=fv(el,"tz2-h");if(isNaN(a)||isNaN(b)||isNaN(h)){er(el,"tz2-r","Podaj podstawy i wysokość");return;}ok(el,"tz2-r","Pole: "+((a+b)/2*h).toFixed(4)+"\nŚrodkowa: "+((a+b)/2).toFixed(4));};}} ,
/* ===== FIZYKA ===== */ {id:"vdt",cat:"fizyka",ib:"#dbeafe",icon:"🚗",title:"Prędkość, dystans, czas", html:note("Podaj dwie wartości")+r3(inp("vd-v","Prędkość (km/h)","number",""),inp("vd-d","Dystans (km)","number",""),inp("vd-t","Czas (h)","number",""))+btn("vd-btn")+res("vd-r"), init:function(el){q(el,"vd-btn").onclick=function(){var vv=q(el,"vd-v").value,dv=q(el,"vd-d").value,tv=q(el,"vd-t").value,V=vv!==""?parseFloat(vv):null,D=dv!==""?parseFloat(dv):null,T=tv!==""?parseFloat(tv):null;if(V!==null&&D!==null){T=D/V;ok(el,"vd-r","Czas: "+T.toFixed(4)+" h\n= "+Math.floor(T)+"h "+(T%1*60).toFixed(0)+"min");}else if(V!==null&&T!==null){ok(el,"vd-r","Dystans: "+(V*T).toFixed(4)+" km");}else if(D!==null&&T!==null&&T!==0){ok(el,"vd-r","Prędkość: "+(D/T).toFixed(4)+" km/h");}else er(el,"vd-r","Podaj dwie wartości");};}} ,
{id:"fma",cat:"fizyka",ib:"#d1fae5",icon:"⚡",title:"F = m · a", html:note("Pozostaw jedno pole puste")+r3(inp("fm-f","Siła F (N)","number",""),inp("fm-m","Masa m (kg)","number",""),inp("fm-a","Przysp. a (m/s²)","number",""))+btn("fm-btn","Oblicz")+res("fm-r"), init:function(el){q(el,"fm-btn").onclick=function(){var fv2=q(el,"fm-f").value,mv=q(el,"fm-m").value,av=q(el,"fm-a").value,F=fv2!==""?parseFloat(fv2):null,M=mv!==""?parseFloat(mv):null,A=av!==""?parseFloat(av):null;if(F===null&&M!==null&&A!==null)ok(el,"fm-r","F = "+M*A+" N");else if(M===null&&F!==null&&A!==null&&A!==0)ok(el,"fm-r","m = "+(F/A).toFixed(4)+" kg");else if(A===null&&F!==null&&M!==null&&M!==0)ok(el,"fm-r","a = "+(F/M).toFixed(4)+" m/s²");else er(el,"fm-r","Podaj dwie wartości");};}} ,
{id:"ohm",cat:"fizyka",ib:"#fef3c7",icon:"🔌",title:"Prawo Ohma U=I·R", html:note("Pozostaw jedno pole puste")+r3(inp("oh-u","Napięcie U (V)","number",""),inp("oh-i","Prąd I (A)","number",""),inp("oh-r","Opór R (Ω)","number",""))+btn("oh-btn")+res("oh-r2"), init:function(el){q(el,"oh-btn").onclick=function(){var uv=q(el,"oh-u").value,iv=q(el,"oh-i").value,rv=q(el,"oh-r").value,U=uv!==""?parseFloat(uv):null,I=iv!==""?parseFloat(iv):null,R2=rv!==""?parseFloat(rv):null;if(U===null&&I!==null&&R2!==null)ok(el,"oh-r2","U = "+(I*R2).toFixed(4)+" V\nP = "+(I*I*R2).toFixed(4)+" W");else if(I===null&&U!==null&&R2!==null&&R2!==0)ok(el,"oh-r2","I = "+(U/R2).toFixed(4)+" A\nP = "+(U*U/R2).toFixed(4)+" W");else if(R2===null&&U!==null&&I!==null&&I!==0)ok(el,"oh-r2","R = "+(U/I).toFixed(4)+" Ω\nP = "+(U*I).toFixed(4)+" W");else er(el,"oh-r2","Podaj dwie wartości");};}} ,
{id:"kin",cat:"fizyka",ib:"#d1fae5",icon:"💨",title:"Energia kinetyczna Ek=½mv²", html:r2(inp("ke-m","Masa (kg)","number","1000"),inp("ke-v","Prędkość (m/s)","number","30"))+btn("ke-btn")+res("ke-r"), init:function(el){q(el,"ke-btn").onclick=function(){var m=fv(el,"ke-m"),v=fv(el,"ke-v");if(isNaN(m)||isNaN(v)){er(el,"ke-r","Podaj masę i prędkość");return;}var Ek=.5*m*v*v;ok(el,"ke-r","Ek = "+Ek.toFixed(2)+" J = "+(Ek/1000).toFixed(4)+" kJ\nv = "+(v*3.6).toFixed(2)+" km/h");};}} ,
{id:"pot",cat:"fizyka",ib:"#ffedd5",icon:"🏔️",title:"Energia potencjalna Ep=mgh", html:r3(inp("pe-m","Masa (kg)","number","70"),inp("pe-h","Wysokość (m)","number","10"),inp("pe-g","g (m/s²)","number","9.81"))+btn("pe-btn")+res("pe-r"), init:function(el){q(el,"pe-btn").onclick=function(){var m=fv(el,"pe-m"),h=fv(el,"pe-h"),g=fv(el,"pe-g")||9.81;if(isNaN(m)||isNaN(h)){er(el,"pe-r","Podaj masę i wysokość");return;}var Ep=m*g*h;ok(el,"pe-r","Ep = "+Ep.toFixed(4)+" J\nv przy spadku = "+Math.sqrt(2*g*h).toFixed(4)+" m/s");};}} ,
{id:"fall",cat:"fizyka",ib:"#fee2e2",icon:"🍎",title:"Swobodny spadek", html:note("Podaj jedną wartość")+r3(inp("ff-t","Czas (s)","number",""),inp("ff-h","Wysokość (m)","number",""),inp("ff-v","Prędkość końcowa (m/s)","number",""))+btn("ff-btn","Oblicz (g=9.81)")+res("ff-r"), init:function(el){q(el,"ff-btn").onclick=function(){var tv=q(el,"ff-t").value,hv=q(el,"ff-h").value,vv=q(el,"ff-v").value,g=9.81,T=tv!==""?parseFloat(tv):null,H=hv!==""?parseFloat(hv):null,V=vv!==""?parseFloat(vv):null;if(T!==null){H=.5*g*T*T;V=g*T;}else if(H!==null){T=Math.sqrt(2*H/g);V=g*T;}else if(V!==null){T=V/g;H=V*V/(2*g);}else{er(el,"ff-r","Podaj jedną wartość");return;}ok(el,"ff-r","Czas: "+T.toFixed(4)+" s\nWys.: "+H.toFixed(4)+" m\nPrędkość: "+V.toFixed(4)+" m/s");};}} ,
{id:"wave",cat:"fizyka",ib:"#d1fae5",icon:"〰️",title:"Fale v=f·λ", html:note("Podaj dwie wartości")+r3(inp("wv-v","Prędkość v (m/s)","number",""),inp("wv-f","Częst. f (Hz)","number",""),inp("wv-l","Dł. fali λ (m)","number",""))+btn("wv-btn")+res("wv-r"), init:function(el){q(el,"wv-btn").onclick=function(){var vv=q(el,"wv-v").value,fv2=q(el,"wv-f").value,lv=q(el,"wv-l").value,V=vv!==""?parseFloat(vv):null,F=fv2!==""?parseFloat(fv2):null,L=lv!==""?parseFloat(lv):null;if(V===null&&F!==null&&L!==null)ok(el,"wv-r","v = "+(F*L).toFixed(4)+" m/s");else if(F===null&&V!==null&&L!==null&&L!==0)ok(el,"wv-r","f = "+(V/L).toFixed(4)+" Hz");else if(L===null&&V!==null&&F!==null&&F!==0)ok(el,"wv-r","λ = "+(V/F).toFixed(6)+" m");else er(el,"wv-r","Podaj dwie wartości");};}} ,
{id:"dens",cat:"fizyka",ib:"#fef3c7",icon:"🧊",title:"Gęstość ρ=m/V", html:note("Pozostaw jedno pole puste")+r3(inp("de-d","Gęstość ρ (kg/m³)","number",""),inp("de-m","Masa m (kg)","number",""),inp("de-v","Objętość V (m³)","number",""))+btn("de-btn")+res("de-r"), init:function(el){q(el,"de-btn").onclick=function(){var dv=q(el,"de-d").value,mv=q(el,"de-m").value,vv=q(el,"de-v").value,D=dv!==""?parseFloat(dv):null,M=mv!==""?parseFloat(mv):null,V=vv!==""?parseFloat(vv):null;if(D===null&&M!==null&&V!==null&&V!==0)ok(el,"de-r","ρ = "+(M/V).toFixed(4)+" kg/m³");else if(M===null&&D!==null&&V!==null)ok(el,"de-r","m = "+(D*V).toFixed(4)+" kg");else if(V===null&&D!==null&&M!==null&&D!==0)ok(el,"de-r","V = "+(M/D).toFixed(6)+" m³");else er(el,"de-r","Podaj dwie wartości");};}} ,
{id:"elpow",cat:"fizyka",ib:"#e0e7ff",icon:"💡",title:"Moc elektryczna P=U·I", html:r2(inp("ep-u","Napięcie U (V)","number","230"),inp("ep-i","Prąd I (A)","number","5"))+r2(inp("ep-t","Czas (h)","number","1"),inp("ep-c","Cena zł/kWh","number","0.85"))+btn("ep-btn")+res("ep-r"), init:function(el){q(el,"ep-btn").onclick=function(){var U=fv(el,"ep-u"),I=fv(el,"ep-i"),t=fv(el,"ep-t")||1,c=fv(el,"ep-c")||.85;if(isNaN(U)||isNaN(I)){er(el,"ep-r","Podaj napięcie i prąd");return;}var P=U*I,W=P*t;ok(el,"ep-r","Moc: "+P.toFixed(2)+" W\nEnergia ("+t+"h): "+(W/1000).toFixed(4)+" kWh\nKoszt: "+(W/1000*c).toFixed(4)+" zł");};}} ,
{id:"gas",cat:"fizyka",ib:"#ede9fe",icon:"🌡️",title:"Gaz doskonały pV=nRT", html:note("Pozostaw jedno pole puste")+r2(inp("ig-p","Ciśnienie p (Pa)","number",""),inp("ig-v","Objętość V (m³)","number",""))+r2(inp("ig-n","Ilość n (mol)","number",""),inp("ig-t","Temperatura T (K)","number",""))+btn("ig-btn","Oblicz (R=8.314)")+res("ig-r"), init:function(el){q(el,"ig-btn").onclick=function(){var pv=q(el,"ig-p").value,vv=q(el,"ig-v").value,nv=q(el,"ig-n").value,tv=q(el,"ig-t").value,R=8.314,P=pv!==""?parseFloat(pv):null,V=vv!==""?parseFloat(vv):null,N=nv!==""?parseFloat(nv):null,T=tv!==""?parseFloat(tv):null;if(P===null&&V!==null&&N!==null&&T!==null)ok(el,"ig-r","p = "+(N*R*T/V).toFixed(4)+" Pa");else if(V===null&&P!==null&&N!==null&&T!==null&&P!==0)ok(el,"ig-r","V = "+(N*R*T/P).toFixed(6)+" m³");else if(N===null&&P!==null&&V!==null&&T!==null)ok(el,"ig-r","n = "+(P*V/(R*T)).toFixed(6)+" mol");else if(T===null&&P!==null&&V!==null&&N!==null&&N!==0)ok(el,"ig-r","T = "+(P*V/(N*R)).toFixed(4)+" K = "+(P*V/(N*R)-273.15).toFixed(2)+" °C");else er(el,"ig-r","Podaj 3 wartości");};}} ,
/* ===== DOM & AUTO ===== */ {id:"paint",cat:"dom",ib:"#d1fae5",icon:"🎨",title:"Zużycie farby", html:r2(inp("pa-l","Długość pokoju (m)","number","5"),inp("pa-w","Szerokość (m)","number","4"))+r3(inp("pa-h","Wys. (m)","number","2.6"),inp("pa-s","Okna+drzwi (m²)","number","5"),inp("pa-n","Warstwy","number","2"))+inp("pa-c","Wydajność (m²/l)","number","10")+btn("pa-btn")+res("pa-r"), init:function(el){q(el,"pa-btn").onclick=function(){var l=fv(el,"pa-l"),w=fv(el,"pa-w"),h=fv(el,"pa-h")||2.6,s=fv(el,"pa-s")||0,n=fv(el,"pa-n")||2,c=fv(el,"pa-c")||10;if(isNaN(l)||isNaN(w)){er(el,"pa-r","Podaj wymiary");return;}var area=2*(l+w)*h-s,total=area*n/c;ok(el,"pa-r","Pow. ścian: "+area.toFixed(2)+" m²\nZużycie: "+total.toFixed(2)+" l\nPojemniki 5l: "+Math.ceil(total/5)+" szt.");};}} ,
{id:"tiles",cat:"dom",ib:"#dbeafe",icon:"🔲",title:"Kalkulator płytek", html:r2(inp("ti2-a","Powierzchnia (m²)","number","20"),inp("ti2-w","Zapas (%)","number","10"))+r2(inp("ti2-tl","Dług. płytki (cm)","number","60"),inp("ti2-tw","Szer. płytki (cm)","number","60"))+btn("ti2-btn")+res("ti2-r"), init:function(el){q(el,"ti2-btn").onclick=function(){var a=fv(el,"ti2-a"),w=fv(el,"ti2-w")||10,tl=fv(el,"ti2-tl")/100,tw=fv(el,"ti2-tw")/100;if(isNaN(a)){er(el,"ti2-r","Podaj powierzchnię");return;}var tile=tl*tw,needed=Math.ceil(a/tile),total=Math.ceil(needed*(1+w/100));ok(el,"ti2-r","Płytki: "+needed+" szt.\nZ zapasem: "+total+" szt.\nPudełka po 10: "+Math.ceil(total/10));};}} ,
{id:"fuel3",cat:"dom",ib:"#fee2e2",icon:"⛽",title:"Koszt paliwa w trasie", html:r3(inp("fu-d","Dystans (km)","number","500"),inp("fu-c","Spalanie (l/100km)","number","7"),inp("fu-p","Cena paliwa (zł/l)","number","7.50"))+btn("fu-btn")+res("fu-r"), init:function(el){q(el,"fu-btn").onclick=function(){var d=fv(el,"fu-d"),c=fv(el,"fu-c"),p=fv(el,"fu-p");if(isNaN(d)||isNaN(c)){er(el,"fu-r","Podaj dystans i spalanie");return;}var liters=d*c/100;ok(el,"fu-r","Paliwo: "+liters.toFixed(2)+" l\nKoszt: "+(liters*p).toFixed(2)+" zł\nKoszt/km: "+(liters*p/d).toFixed(3)+" zł");};}} ,
{id:"brake",cat:"dom",ib:"#ede9fe",icon:"🚗",title:"Droga hamowania", html:r2(inp("bd-v","Prędkość (km/h)","number","100"),sel("bd-s","Nawierzchnia",[["0.8","Sucha (μ=0.8)",1],["0.4","Mokra (μ=0.4)"],["0.2","Oblodzona"],["0.1","Gołoledź"]]))+btn("bd-btn")+res("bd-r"), init:function(el){q(el,"bd-btn").onclick=function(){var v=fv(el,"bd-v"),mu=parseFloat(sv(el,"bd-s"));if(isNaN(v)){er(el,"bd-r","Podaj prędkość");return;}var vms=v/3.6,d=vms*vms/(2*9.81*mu),react=vms*.75;ok(el,"bd-r","Hamowanie: "+d.toFixed(1)+" m\nReakcja (0.75s): "+react.toFixed(1)+" m\nCałkowita: "+(d+react).toFixed(1)+" m");};}} ,
{id:"ebill",cat:"dom",ib:"#ffedd5",icon:"🔌",title:"Koszt energii elektrycznej", html:r3(inp("eb-p","Moc urządzenia (W)","number","150"),inp("eb-h","h/dzień","number","8"),inp("eb-c","Cena zł/kWh","number","0.85"))+btn("eb-btn")+res("eb-r"), init:function(el){q(el,"eb-btn").onclick=function(){var p=fv(el,"eb-p"),h=fv(el,"eb-h"),c=fv(el,"eb-c")||.85;if(isNaN(p)||isNaN(h)){er(el,"eb-r","Podaj moc i czas");return;}var daily=p/1000*h;ok(el,"eb-r","Dziennie: "+daily.toFixed(3)+" kWh\nMiesięcznie: "+(daily*30).toFixed(2)+" kWh\nKoszt mies.: "+(daily*30*c).toFixed(2)+" zł\nRocznie: "+(daily*365*c).toFixed(2)+" zł");};}} ,
{id:"room",cat:"dom",ib:"#dbeafe",icon:"📐",title:"Metraż pomieszczenia", html:r3(inp("ra2-l","Długość (m)","number","5"),inp("ra2-w","Szerokość (m)","number","4"),inp("ra2-h","Wysokość (m)","number","2.6"))+btn("ra2-btn")+res("ra2-r"), init:function(el){q(el,"ra2-btn").onclick=function(){var l=fv(el,"ra2-l"),w=fv(el,"ra2-w"),h=fv(el,"ra2-h");if(isNaN(l)||isNaN(w)||isNaN(h)){er(el,"ra2-r","Podaj wymiary");return;}ok(el,"ra2-r","Powierzchnia: "+(l*w).toFixed(2)+" m²\nObjętość: "+(l*w*h).toFixed(2)+" m³\nŚciany: "+(2*(l+w)*h).toFixed(2)+" m²");};}} ,
{id:"conc",cat:"dom",ib:"#fef3c7",icon:"🏗️",title:"Kalkulator betonu", html:r3(inp("cb-l","Długość (m)","number","5"),inp("cb-w2","Szerokość (m)","number","3"),inp("cb-t","Grubość (cm)","number","15"))+btn("cb-btn","Oblicz (beton B20)")+res("cb-r"), init:function(el){q(el,"cb-btn").onclick=function(){var l=fv(el,"cb-l"),w=fv(el,"cb-w2"),t=fv(el,"cb-t")/100;if(isNaN(l)||isNaN(w)||isNaN(t)){er(el,"cb-r","Podaj wymiary");return;}var V=l*w*t;ok(el,"cb-r","Objętość: "+V.toFixed(3)+" m³\nCement: "+Math.ceil(V*300/25)+" worków 25kg");};}} ,
{id:"heat",cat:"dom",ib:"#fee2e2",icon:"🔥",title:"Zapotrzebowanie na ciepło", html:r2(inp("he-a","Powierzchnia (m²)","number","80"),sel("he-i","Izolacja",[["150","Słaba – 150 W/m³"],["60","Standard – 60 W/m³",1],["40","Dobra – 40 W/m³"],["20","Pasywna – 20 W/m³"]]))+btn("he-btn")+res("he-r"), init:function(el){q(el,"he-btn").onclick=function(){var a=fv(el,"he-a"),u=parseFloat(sv(el,"he-i"));if(isNaN(a)){er(el,"he-r","Podaj powierzchnię");return;}var P=a*2.6*u;ok(el,"he-r","Moc grzewcza: "+P.toFixed(0)+" W = "+(P/1000).toFixed(2)+" kW\nSzac. zużycie: "+Math.round(P*.0022)+" kWh/rok");};}} ,
{id:"solar",cat:"dom",ib:"#fef3c7",icon:"☀️",title:"Opłacalność paneli słonecznych", html:r2(inp("sol-p","Moc instalacji (kWp)","number","10"),inp("sol-c","Koszt instalacji (zł)","number","40000"))+r2(inp("sol-e","Cena prądu (zł/kWh)","number","0.85"),inp("sol-u","Zużycie roczne (kWh)","number","4000"))+btn("sol-btn")+res("sol-r"), init:function(el){q(el,"sol-btn").onclick=function(){var p=fv(el,"sol-p"),c=fv(el,"sol-c"),e=fv(el,"sol-e")||.85,u=fv(el,"sol-u");if(isNaN(p)||isNaN(c)){er(el,"sol-r","Podaj moc i koszt");return;}var annual=p*1000,saving=annual*e,payback=c/saving;ok(el,"sol-r","Produkcja: "+annual.toFixed(0)+" kWh/rok\nOszcz.: "+saving.toFixed(0)+" zł\nZwrot: "+payback.toFixed(1)+" lat"+(isNaN(u)?"":"\nPokrycie: "+Math.min(annual/u*100,100).toFixed(0)+"%"));};}} ,
{id:"wallp",cat:"dom",ib:"#d1fae5",icon:"🖼️",title:"Kalkulator tapety", html:r2(inp("wp2-o","Obwód ścian (m)","number","18"),inp("wp2-h2","Wysokość (m)","number","2.6"))+r3(inp("wp2-s","Okna+drzwi (m²)","number","5"),inp("wp2-w2","Szer. tapety (cm)","number","53"),inp("wp2-rl","Dł. rolki (m)","number","10"))+btn("wp2-btn")+res("wp2-r2"), init:function(el){q(el,"wp2-btn").onclick=function(){var o=fv(el,"wp2-o"),h=fv(el,"wp2-h2")||2.6,w=fv(el,"wp2-w2")/100,rl=fv(el,"wp2-rl")||10;if(isNaN(o)){er(el,"wp2-r2","Podaj wymiary");return;}var strips=Math.ceil(o/w),perRoll=Math.floor(rl/h),rolls=Math.ceil(strips/perRoll);ok(el,"wp2-r2","Pasy: "+strips+"\nRolki: "+rolls+" szt.\nZ zapasem: "+(rolls+1)+" szt.");};}} ,
/* ===== MATEMATYKA ===== */ {id:"trig",cat:"matematyka",ib:"#dbeafe",icon:"📐",title:"Trygonometria", html:r2(inp("tg-a","Kąt","number","30"),sel("tg-u","Jednostka",[["deg","Stopnie °",1],["rad","Radiany"]]))+btn("tg-btn","Oblicz sin/cos/tan/cot")+res("tg-r"), init:function(el){q(el,"tg-btn").onclick=function(){var a=fv(el,"tg-a"),u=sv(el,"tg-u");if(isNaN(a)){er(el,"tg-r","Podaj kąt");return;}var rad=u==="deg"?a*Math.PI/180:a,fmt=function(x){return Math.abs(x)<1e-10?"0":(+x.toPrecision(8)).toString();};ok(el,"tg-r","sin: "+fmt(Math.sin(rad))+"\ncos: "+fmt(Math.cos(rad))+"\ntan: "+(Math.abs(Math.cos(rad))<1e-10?"niezdef.":fmt(Math.tan(rad)))+"\ncot: "+(Math.abs(Math.sin(rad))<1e-10?"niezdef.":fmt(1/Math.tan(rad))));};}} , {id:"log",cat:"matematyka",ib:"#d1fae5",icon:"㏒",title:"Logarytmy", html:r2(inp("lo-x","Liczba (x > 0)","number","100"),inp("lo-b","Dowolna podstawa","number","10"))+btn("lo-btn")+res("lo-r"), init:function(el){q(el,"lo-btn").onclick=function(){var x=fv(el,"lo-x"),b=fv(el,"lo-b");if(isNaN(x)||x<=0){er(el,"lo-r","x musi być > 0");return;}var txt="ln("+x+") = "+(+Math.log(x).toPrecision(8)).toString()+"\nlog₁₀ = "+(+Math.log10(x).toPrecision(8)).toString()+"\nlog₂ = "+(+Math.log2(x).toPrecision(8)).toString();if(!isNaN(b)&&b>0&&b!==1)txt+="\nlog₍"+b+"₎ = "+(+(Math.log(x)/Math.log(b)).toPrecision(8)).toString();ok(el,"lo-r",txt);};}} ,
{id:"mat",cat:"matematyka",ib:"#ede9fe",icon:"▦",title:"Macierz 2×2", html:note("A = [[a,b],[c,d]]")+r4(inp("mx-a","a","number","1"),inp("mx-b","b","number","2"),inp("mx-c","c","number","3"),inp("mx-d","d","number","4"))+btn("mx-btn")+res("mx-r"), init:function(el){q(el,"mx-btn").onclick=function(){var a=fv(el,"mx-a"),b=fv(el,"mx-b"),c=fv(el,"mx-c"),d=fv(el,"mx-d");if([a,b,c,d].some(isNaN)){er(el,"mx-r","Podaj 4 wartości");return;}var det=a*d-b*c,txt="det(A) = "+det+"\ntr(A) = "+(a+d);if(det!==0)txt+="\nA⁻¹:\n["+(d/det).toFixed(4)+", "+(-b/det).toFixed(4)+"]\n["+(-c/det).toFixed(4)+", "+(a/det).toFixed(4)+"]";else txt+="\nMacierz osobliwa";ok(el,"mx-r",txt);};}} ,
{id:"aseq",cat:"matematyka",ib:"#ffedd5",icon:"1,2,3",title:"Postęp arytmetyczny",
html:r3(inp("as-a","a₁","number","1"),inp("as-d","różnica d","number","2"),inp("as-n","wyrazów n","number","10"))+btn("as-btn")+res("as-r"),
init:function(el){q(el,"as-btn").onclick=function(){var a1=fv(el,"as-a"),d=fv(el,"as-d"),n=parseInt(q(el,"as-n").value);if(isNaN(a1)||isNaN(d)||isNaN(n)||n<1){er(el,"as-r","Podaj a₁, d i n≥1");return;}var an=a1+(n-1)*d,Sn=n/2*(a1+an),first=[];for(var i=0;i
{id:"gseq",cat:"matematyka",ib:"#d1fae5",icon:"×r",title:"Postęp geometryczny",
html:r3(inp("gs-a","a₁","number","2"),inp("gs-q","iloraz q","number","3"),inp("gs-n","wyrazów n","number","8"))+btn("gs-btn")+res("gs-r"),
init:function(el){q(el,"gs-btn").onclick=function(){var a1=fv(el,"gs-a"),q2=fv(el,"gs-q"),n=parseInt(q(el,"gs-n").value);if(isNaN(a1)||isNaN(q2)||isNaN(n)||n<1){er(el,"gs-r","Podaj a₁, q i n≥1");return;}var an=a1*Math.pow(q2,n-1),Sn=q2===1?a1*n:a1*(Math.pow(q2,n)-1)/(q2-1),first=[];for(var i=0;i
{id:"prime",cat:"matematyka",ib:"#fce7f3",icon:"🔢",title:"Czy liczba pierwsza?", html:inp("pm-n","Liczba (2–1 000 000)","number","97")+btn("pm-btn","Sprawdź + rozkład")+res("pm-r"), init:function(el){q(el,"pm-btn").onclick=function(){var n=parseInt(q(el,"pm-n").value);if(isNaN(n)||n<2||n>1000000){er(el,"pm-r","Podaj liczbę 2–1 000 000");return;}function ip(x){if(x<2)return false;for(var i=2;i<=Math.sqrt(x);i++)if(x%i===0)return false;return true;}function fac(x){var f=[],d=2;while(d*d<=x){while(x%d===0){f.push(d);x=Math.floor(x/d);}d++;}if(x>1)f.push(x);return f;}ok(el,"pm-r",(ip(n)?"✓ Liczba pierwsza":"✗ Złożona")+"\nRozkład: "+fac(n).join("×"));};}} ,
{id:"fib",cat:"matematyka",ib:"#dbeafe",icon:"🌀",title:"Ciąg Fibonacciego",
html:inp("fb-n","Liczba wyrazów (1–50)","number","10")+btn("fb-btn","Generuj")+res("fb-r"),
init:function(el){q(el,"fb-btn").onclick=function(){var n=parseInt(q(el,"fb-n").value);if(isNaN(n)||n<1||n>50){er(el,"fb-r","Podaj n (1–50)");return;}var fib=[0,1];for(var i=2;i
{id:"interp",cat:"matematyka",ib:"#e0e7ff",icon:"📈",title:"Interpolacja liniowa", html:r2(inp("il-x1","x₁","number","0"),inp("il-y1","y₁","number","0"))+r2(inp("il-x2","x₂","number","10"),inp("il-y2","y₂","number","100"))+inp("il-x","Szukam y dla x =","number","5")+btn("il-btn","Interpoluj")+res("il-r"), init:function(el){q(el,"il-btn").onclick=function(){var x1=fv(el,"il-x1"),y1=fv(el,"il-y1"),x2=fv(el,"il-x2"),y2=fv(el,"il-y2"),x=fv(el,"il-x");if([x1,y1,x2,y2,x].some(isNaN)||x1===x2){er(el,"il-r","Podaj wszystkie wartości (x1≠x2)");return;}ok(el,"il-r","y("+x+") = "+(y1+(y2-y1)*(x-x1)/(x2-x1)).toFixed(6).replace(/\.?0+$/,""));};}} ,
{id:"roman",cat:"matematyka",ib:"#fef3c7",icon:"Ⅻ",title:"Liczby rzymskie",
html:r2(inp("rm-a","Liczba arabska (1–3999)","number","2024"),inp("rm-r","Liczba rzymska","text","XIV"))+btn("rm-btn","Przelicz")+res("rm-res"),
init:function(el){q(el,"rm-btn").onclick=function(){var a=parseInt(q(el,"rm-a").value),rv=q(el,"rm-r").value.trim().toUpperCase(),V=[1000,900,500,400,100,90,50,40,10,9,5,4,1],S=["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"],txt="";function toR(n){var o="";V.forEach(function(v,i){while(n>=v){o+=S[i];n-=v;}});return o;}function frR(s){var m={I:1,V:5,X:10,L:50,C:100,D:500,M:1000},n2=0;for(var i=0;i
/* ===== KUCHNIA ===== */ {id:"kunit",cat:"kuchnia",ib:"#d1fae5",icon:"🥄",title:"Jednostki kuchenne", html:inp("kc-v","Wartość","number","1")+r2(sel("kc-f","Z",[["tsp","łyżeczka (tsp)",1],["tbsp","łyżka (tbsp)"],["cup","szklanka US"],["ml","ml"],["dl","dl"],["l","l"]]),sel("kc-t","Na",[["ml","ml",1],["tbsp","łyżka"],["cup","szklanka"],["dl","dl"],["l","l"],["tsp","łyżeczka"]]))+btn("kc-btn","Przelicz")+res("kc-r"), init:function(el){var R={tsp:4.929,tbsp:14.787,cup:240,ml:1,dl:100,l:1000};q(el,"kc-btn").onclick=function(){var v=fv(el,"kc-v"),f=sv(el,"kc-f"),t=sv(el,"kc-t");if(isNaN(v)){er(el,"kc-r","Podaj wartość");return;}ok(el,"kc-r",v+" "+f+" = "+clean(v*R[f]/R[t])+" "+t);};}} ,
{id:"oven",cat:"kuchnia",ib:"#fee2e2",icon:"🔥",title:"Temperatura piekarnika", html:r2(inp("ot-v","Temperatura","number","180"),sel("ot-u","Jednostka",[["C","°C",1],["F","°F"],["gas","Stopień gazowy"]]))+btn("ot-btn","Przelicz + klasyfikuj")+res("ot-r"), init:function(el){q(el,"ot-btn").onclick=function(){var v=fv(el,"ot-v"),u=sv(el,"ot-u");if(isNaN(v)){er(el,"ot-r","Podaj temperaturę");return;}var C=u==="C"?v:u==="F"?(v-32)*5/9:v*25+121,F=C*9/5+32,gas=Math.max(1,Math.min(Math.round((C-121)/25),9)),label=C<120?"Niska":C<160?"Umiarkowana":C<200?"Średnia":C<230?"Wysoka":"Bardzo wysoka";ok(el,"ot-r",C.toFixed(0)+"°C | "+F.toFixed(0)+"°F | Stopień "+gas+"\n"+label);};}} , {id:"recipe",cat:"kuchnia",ib:"#d1fae5",icon:"👨🍳",title:"Skalowanie przepisu", html:r3(inp("rs-o","Porcje oryg.","number","4"),inp("rs-n","Nowe porcje","number","6"),inp("rs-a","Ilość składnika","number","300"))+inp("rs-u","Jednostka","text","g / ml")+btn("rs-btn")+res("rs-r"), init:function(el){q(el,"rs-btn").onclick=function(){var o=fv(el,"rs-o"),n=fv(el,"rs-n"),a=fv(el,"rs-a"),u=q(el,"rs-u").value||"";if(isNaN(o)||isNaN(n)||isNaN(a)||o===0){er(el,"rs-r","Podaj wartości");return;}ok(el,"rs-r","Nowa ilość: "+(a*n/o).toFixed(2)+" "+u+"\nWsp. ×"+(n/o).toFixed(2));};}} , {id:"alco",cat:"kuchnia",ib:"#ede9fe",icon:"🍷",title:"Jednostki alkoholu", html:r3(inp("ad-v","Objętość (ml)","number","330"),inp("ad-p","Stężenie (%)","number","5"),inp("ad-c","Cena (zł)","number","5"))+btn("ad-btn")+res("ad-r"), init:function(el){q(el,"ad-btn").onclick=function(){var v=fv(el,"ad-v"),p=fv(el,"ad-p"),c=fv(el,"ad-c");if(isNaN(v)||isNaN(p)){er(el,"ad-r","Podaj obj. i stężenie");return;}var g=v*p/100*.789,kcal=g*7,units=g/10,txt="Alkohol: "+g.toFixed(1)+" g\nJednostki UK: "+units.toFixed(1)+"\nKalorie: "+kcal.toFixed(0)+" kcal";if(!isNaN(c))txt+="\nCena/jedn.: "+(c/units).toFixed(2)+" zł";ok(el,"ad-r",txt);};}} , {id:"egg",cat:"kuchnia",ib:"#fef3c7",icon:"🥚",title:"Czas gotowania jajek", html:r2(sel("eg-s","Waga jajka",[["50","Małe (50g)"],["60","Średnie (60g)",1],["70","Duże (70g)"],["80","XL (80g)"]]),sel("eg-t","Temperatura",[["4","Z lodówki"],["20","Pokojowa",1]]))+btn("eg-btn","Czas gotowania")+res("eg-r"), init:function(el){q(el,"eg-btn").onclick=function(){var s=parseInt(sv(el,"eg-s")),t=parseInt(sv(el,"eg-t")),extra=t===4?1.5:0,se=(s-60)/10*.5;ok(el,"eg-r","Na miękko: "+(4+extra+se).toFixed(0)+" min\nNa półmiękko: "+(6+extra+se).toFixed(0)+" min\nNa twardo: "+(9+extra+se).toFixed(0)+" min\n*od zimnej wody");};}} , {id:"cwater",cat:"kuchnia",ib:"#d1fae5",icon:"💧",title:"Woda do gotowania", html:r2(inp("cw-g","Ilość produktu (g)","number","200"),sel("cw-t","Produkt",[["pasta","Makaron",1],["rice","Ryż"],["kasha","Kasza"]]))+btn("cw-btn")+res("cw-r"), init:function(el){q(el,"cw-btn").onclick=function(){var g=fv(el,"cw-g"),t=sv(el,"cw-t");if(isNaN(g)||g<=0){er(el,"cw-r","Podaj ilość");return;}if(t==="pasta")ok(el,"cw-r","Woda: "+(g*10).toFixed(0)+" ml\nSól: "+(g*.01).toFixed(0)+" g\nUgotowane: "+(g*2.2).toFixed(0)+" g");else if(t==="rice")ok(el,"cw-r","Woda: "+(g*2).toFixed(0)+" ml (1:2)\nUgotowane: "+(g*2.5).toFixed(0)+" g");else ok(el,"cw-r","Woda: "+(g*2.5).toFixed(0)+" ml\nUgotowane: "+(g*3).toFixed(0)+" g");};}} , /* ===== TECHNOLOGIA ===== */ {id:"hrgb",cat:"tech",ib:"#fce7f3",icon:"🎨",title:"Kolory HEX/RGB/HSL", html:inp("hr-hex","HEX","text","#2563eb")+r3(inp("hr-r","R (0-255)","number",""),inp("hr-g","G","number",""),inp("hr-b","B","number",""))+btn("hr-btn","Przelicz")+res("hr-res"), init:function(el){q(el,"hr-btn").onclick=function(){var hex=q(el,"hr-hex").value.trim(),ri=q(el,"hr-r").value,gi=q(el,"hr-g").value,bi=q(el,"hr-b").value,R2,G,B;if(hex){var h=hex.replace("#","");if(h.length===3)h=h.split("").map(function(x){return x+x;}).join("");if(h.length!==6){er(el,"hr-res","Nieprawidłowy HEX");return;}R2=parseInt(h.slice(0,2),16);G=parseInt(h.slice(2,4),16);B=parseInt(h.slice(4,6),16);}else if(ri!==""&&gi!==""&&bi!==""){R2=parseInt(ri);G=parseInt(gi);B=parseInt(bi);}else{er(el,"hr-res","Podaj HEX lub RGB");return;}var hexOut="#"+[R2,G,B].map(function(x){return x.toString(16).padStart(2,"0").toUpperCase();}).join(""),r2=R2/255,g2=G/255,b2=B/255,max=Math.max(r2,g2,b2),min=Math.min(r2,g2,b2),l=(max+min)/2,s2=max===min?0:(l<.5?(max-min)/(max+min):(max-min)/(2-max-min)),h2=0;if(max!==min){if(max===r2)h2=(g2-b2)/(max-min)%6;else if(max===g2)h2=(b2-r2)/(max-min)+2;else h2=(r2-g2)/(max-min)+4;h2=Math.round(h2*60);if(h2<0)h2+=360;}ok(el,"hr-res","HEX: "+hexOut+"\nRGB: rgb("+R2+", "+G+", "+B+")\nHSL: hsl("+h2+", "+(s2*100).toFixed(1)+"%, "+(l*100).toFixed(1)+"%)");};}} , {id:"dltime",cat:"tech",ib:"#dbeafe",icon:"📥",title:"Czas pobierania pliku", html:r2(inp("dt-s","Rozmiar pliku","number","1"),sel("dt-u","Jednostka",[["MB","MB",1],["GB","GB"],["KB","KB"]]))+sel("dt-sp","Prędkość łącza",[["1","1 Mbps"],["10","10 Mbps"],["50","50 Mbps"],["100","100 Mbps",1],["300","300 Mbps"],["1000","1 Gbps"]])+btn("dt-btn")+res("dt-r"), init:function(el){q(el,"dt-btn").onclick=function(){var s=fv(el,"dt-s"),u=sv(el,"dt-u"),sp=parseFloat(sv(el,"dt-sp")),mb={KB:1/1024,MB:1,GB:1024};if(isNaN(s)||s<=0){er(el,"dt-r","Podaj rozmiar");return;}var bits=s*mb[u]*8,secs=bits/sp;ok(el,"dt-r","Czas: "+Math.floor(secs/3600)+"h "+Math.floor((secs%3600)/60)+"min "+Math.floor(secs%60)+"s\nPrzy "+sp+" Mbps");};}} , {id:"ppi",cat:"tech",ib:"#d1fae5",icon:"📱",title:"PPI – gęstość pikseli", html:r3(inp("pp-w","Szer. (px)","number","1920"),inp("pp-h2","Wys. (px)","number","1080"),inp("pp-d","Przekątna (cale)","number","15.6"))+btn("pp-btn","Oblicz PPI")+res("pp-r"), init:function(el){q(el,"pp-btn").onclick=function(){var w=fv(el,"pp-w"),h=fv(el,"pp-h2"),d=fv(el,"pp-d");if(isNaN(w)||isNaN(h)||isNaN(d)||d<=0){er(el,"pp-r","Podaj wszystkie wartości");return;}var ppi=Math.sqrt(w*w+h*h)/d;ok(el,"pp-r","PPI: "+ppi.toFixed(1)+"\n"+(ppi<100?"Niska":ppi<200?"Standard HD":ppi<300?"Wysoka QHD":"Retina")+"\nPixels: "+(w*h).toLocaleString("pl-PL"));};}} , {id:"aspect",cat:"tech",ib:"#e0e7ff",icon:"🖥️",title:"Proporcje ekranu", html:r2(inp("as2-w","Szerokość (px)","number","1920"),inp("as2-h2","Wysokość (px)","number","1080"))+btn("as2-btn")+res("as2-r"), init:function(el){q(el,"as2-btn").onclick=function(){var w=parseInt(q(el,"as2-w").value),h=parseInt(q(el,"as2-h2").value);if(isNaN(w)||isNaN(h)||w<=0||h<=0){er(el,"as2-r","Podaj wymiary");return;}function g(a,b){return b===0?a:g(b,a%b);}var gcd=g(w,h);ok(el,"as2-r","Proporcje: "+w/gcd+":"+h/gcd+"\nFormat: "+(w/h).toFixed(4)+":1");};}} , {id:"wcag",cat:"tech",ib:"#fef3c7",icon:"♿",title:"Kontrast WCAG", html:r2(inp("wc-t","Tekst (HEX)","text",""),inp("wc-b","Tło (HEX)","text",""))+btn("wc-btn","Sprawdź WCAG")+res("wc-r"), init:function(el){q(el,"wc-t").value="#0f172a";q(el,"wc-b").value="#ffffff";q(el,"wc-btn").onclick=function(){function lum(hex){var h=hex.replace("#","");if(h.length===3)h=h.split("").map(function(x){return x+x;}).join("");var rgb=[parseInt(h.slice(0,2),16)/255,parseInt(h.slice(2,4),16)/255,parseInt(h.slice(4,6),16)/255];return rgb.reduce(function(s,v,i){v=v<=.03928?v/12.92:Math.pow((v+.055)/1.055,2.4);return s+v*[.2126,.7152,.0722][i];},0);}try{var L1=lum(q(el,"wc-t").value),L2=lum(q(el,"wc-b").value),ratio=(Math.max(L1,L2)+.05)/(Math.min(L1,L2)+.05);ok(el,"wc-r","Kontrast: "+ratio.toFixed(2)+":1\nWCAG AA mały: "+(ratio>=4.5?"✓ OK":"✗ Nie")+"\nWCAG AA duży: "+(ratio>=3?"✓":"✗")+"\nWCAG AAA: "+(ratio>=7?"✓":"✗"));}catch(e){er(el,"wc-r","Nieprawidłowy HEX");}};}} ,
{id:"passgen",cat:"tech",ib:"#d1fae5",icon:"🔐",title:"Generator haseł",
html:r2(inp("pg2-l","Długość","number","16"),sel("pg2-t","Typ",[["all","Wszystkie znaki",1],["alpha","Litery+cyfry"],["num","Cyfry (PIN)"]]))+btn("pg2-btn","Generuj hasło")+res("pg2-r"),
init:function(el){q(el,"pg2-btn").onclick=function(){var l=parseInt(q(el,"pg2-l").value)||16,t=sv(el,"pg2-t"),chars=t==="all"?"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+-=":t==="alpha"?"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789":"0123456789",pass="",arr=new Uint8Array(l);window.crypto.getRandomValues(arr);for(var i=0;i