1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[280],{70280:function(t,e,r){r.r(e),r.d(e,{AtomSimulator:function(){return AtomSimulator}});var a=r(52676),o=r(94033),n=r.n(o),l=r(75271),s=r(16772),i=r(56602);let c=[{symbol:"H",name:"Hydrogen",color:"#f0f0f0",radius:14,valence:1,mass:1,atomicNumber:1,glow:"rgba(240,240,255,0.4)"},{symbol:"He",name:"Helium",color:"#a78bfa",radius:12,valence:0,mass:4,atomicNumber:2,glow:"rgba(167,139,250,0.4)"},{symbol:"Li",name:"Lithium",color:"#8b5cf6",radius:55,valence:1,mass:7,atomicNumber:3,glow:"rgba(139,92,246,0.4)"},{symbol:"C",name:"Carbon",color:"#374151",radius:29,valence:4,mass:12,atomicNumber:6,glow:"rgba(55,65,81,0.4)"},{symbol:"N",name:"Nitrogen",color:"#3b82f6",radius:27,valence:3,mass:14,atomicNumber:7,glow:"rgba(59,130,246,0.4)"},{symbol:"O",name:"Oxygen",color:"#ef4444",radius:25,valence:2,mass:16,atomicNumber:8,glow:"rgba(239,68,68,0.4)"},{symbol:"F",name:"Fluorine",color:"#84cc16",radius:24,valence:1,mass:19,atomicNumber:9,glow:"rgba(132,204,22,0.4)"},{symbol:"Ne",name:"Neon",color:"#f472b6",radius:18,valence:0,mass:20,atomicNumber:10,glow:"rgba(244,114,182,0.4)"},{symbol:"Na",name:"Sodium",color:"#6366f1",radius:68,valence:1,mass:23,atomicNumber:11,glow:"rgba(99,102,241,0.4)"},{symbol:"Mg",name:"Magnesium",color:"#14b8a6",radius:57,valence:2,mass:24,atomicNumber:12,glow:"rgba(20,184,166,0.4)"},{symbol:"Al",name:"Aluminum",color:"#a1a1aa",radius:46,valence:3,mass:27,atomicNumber:13,glow:"rgba(161,161,170,0.4)"},{symbol:"Si",name:"Silicon",color:"#ec4899",radius:42,valence:4,mass:28,atomicNumber:14,glow:"rgba(236,72,153,0.4)"},{symbol:"P",name:"Phosphorus",color:"#f97316",radius:41,valence:3,mass:31,atomicNumber:15,glow:"rgba(249,115,22,0.4)"},{symbol:"S",name:"Sulfur",color:"#fbbf24",radius:40,valence:2,mass:32,atomicNumber:16,glow:"rgba(251,191,36,0.4)"},{symbol:"Cl",name:"Chlorine",color:"#22c55e",radius:39,valence:1,mass:35,atomicNumber:17,glow:"rgba(34,197,94,0.4)"},{symbol:"K",name:"Potassium",color:"#c084fc",radius:83,valence:1,mass:39,atomicNumber:19,glow:"rgba(192,132,252,0.4)"},{symbol:"Ca",name:"Calcium",color:"#e87979",radius:67,valence:2,mass:40,atomicNumber:20,glow:"rgba(232,121,121,0.4)"},{symbol:"Br",name:"Bromine",color:"#991b1b",radius:45,valence:1,mass:80,atomicNumber:35,glow:"rgba(153,27,27,0.4)"},{symbol:"Fe",name:"Iron",color:"#7c2d12",radius:50,valence:3,mass:56,atomicNumber:26,glow:"rgba(124,45,18,0.4)"}],d=new Map(c.map(t=>[t.symbol,t]));function bondKey(t,e){return t<e?"".concat(t,"-").concat(e):"".concat(e,"-").concat(t)}function getBreakDistance(t,e,r){let a=arguments.length>3&&void 0!==arguments[3]&&arguments[3];return t.radius+e.radius+(a?45+8*r:1===r?55:2===r?80:110)}let u={"http://www.wikidata.org/entity/Q11574":"g/mol","http://www.wikidata.org/entity/Q11579":"kg/m\xb3","http://www.wikidata.org/entity/Q11583":"g/cm\xb3","http://www.wikidata.org/entity/Q11570":"K","http://www.wikidata.org/entity/Q11573":"\xb0C","http://www.wikidata.org/entity/Q11582":"\xb0F","http://www.wikidata.org/entity/Q25267":"g/mL","http://www.wikidata.org/entity/Q44395":"kg/L","http://www.wikidata.org/entity/Q162299":"mg/mL"};function formatWikidataQuantity(t){var e,r;if(!t||!t[0])return;let a=null===(r=t[0].mainsnak)||void 0===r?void 0:null===(e=r.datavalue)||void 0===e?void 0:e.value;if(!a||null==a.amount)return;let o=parseFloat(a.amount),n=a.unit&&"1"!==a.unit?u[a.unit]||a.unit.split("/").pop():"";return"".concat(o.toLocaleString()," ").concat(n).trim()}function connectedComponents(t,e){let r=new Map;t.forEach(t=>r.set(t.id,new Set)),e.forEach(t=>{var e,a;let o="string"==typeof t.source?t.source:t.source.id,n="string"==typeof t.target?t.target:t.target.id;null===(e=r.get(o))||void 0===e||e.add(n),null===(a=r.get(n))||void 0===a||a.add(o)});let a=new Set,o=new Map,n=new Map(t.map(t=>[t.id,t]));return t.forEach(t=>{if(a.has(t.id))return;let e=[t.id],l=[],s=[];for(;e.length;){var i;let t=e.pop();if(a.has(t))continue;a.add(t);let o=n.get(t);o&&(l.push(o),s.push(t)),null===(i=r.get(t))||void 0===i||i.forEach(t=>{a.has(t)||e.push(t)})}let c=[...s].sort()[0];o.set(c,l)}),o}function formulaForComponent(t){let e={};t.forEach(t=>{e[t.symbol]=(e[t.symbol]||0)+1});let r=Object.keys(e).sort((t,e)=>{let r=d.get(t),a=d.get(e);return"C"===t?-1:"C"===e?1:"H"===t?-1:"H"===e?1:((null==r?void 0:r.atomicNumber)||0)-((null==a?void 0:a.atomicNumber)||0)});return r.map(t=>1===e[t]?t:"".concat(t).concat(e[t])).join("")}function AtomSimulator(t){let{playerAddress:e}=t,r=(0,l.useRef)(null),o=(0,l.useRef)(null),u=(0,l.useRef)(null),f=(0,l.useRef)([]),m=(0,l.useRef)([]),p=(0,l.useRef)(null),g=(0,l.useRef)(null),b=(0,l.useRef)(!1),x=(0,l.useRef)({x:0,y:0}),h=(0,l.useRef)(new Set),y=(0,l.useRef)(new Set),w=(0,l.useRef)(!1),v=(0,l.useRef)(new Map),k=(0,l.useRef)(!1),M=(0,l.useRef)(""),j=(0,l.useRef)(""),N=(0,l.useRef)(new Map),[S,z]=(0,l.useState)([]),[C,A]=(0,l.useState)(0),[R,E]=(0,l.useState)(!1),[q,$]=(0,l.useState)(!0),[W,B]=(0,l.useState)("H"),[D,H]=(0,l.useState)(!1),[P,L]=(0,l.useState)(null),I=(0,l.useCallback)(async t=>{L({formula:t,loading:!0});try{var e,r,a,o,n,l,s,i;let c,d,u,f;let m=await fetch("https://en.wikipedia.org/w/api.php?action=query&list=search&srsearch=".concat(encodeURIComponent(t),"&format=json&origin=*"),{headers:{Accept:"application/json"}}
1),p=await m.json(),g=null==p?void 0:null===(a=p.query)||void 0===a?void 0:null===(r=a.search)||void 0===r?void 0:null===(e=r[0])||void 0===e?void 0:e.title;if(!g)throw Error("No Wikipedia article found for this formula.");let[b,x]=await Promise.all([fetch("https://en.wikipedia.org/api/rest_v1/page/summary/".concat(encodeURIComponent(g))),fetch("https://en.wikipedia.org/w/api.php?action=query&prop=pageprops&titles=".concat(encodeURIComponent(g),"&format=json&origin=*"),{headers:{Accept:"application/json"}})]),h=await b.json(),y=await x.json(),w=Object.values((null==y?void 0:null===(o=y.query)||void 0===o?void 0:o.pages)||{})[0],v=null==w?void 0:null===(n=w.pageprops)||void 0===n?void 0:n.wikibase_item;if(v){let t=await fetch("https://www.wikidata.org/wiki/Special:EntityData/".concat(v,".json")),e=await t.json(),r=null==e?void 0:null===(i=e.entities)||void 0===i?void 0:null===(s=i[v])||void 0===s?void 0:s.claims;c=formatWikidataQuantity(null==r?void 0:r.P2067),d=formatWikidataQuantity(null==r?void 0:r.P2054),u=formatWikidataQuantity(null==r?void 0:r.P2101),f=formatWikidataQuantity(null==r?void 0:r.P2102)}L({formula:t,title:h.title,extract:h.extract,image:null==h?void 0:null===(l=h.thumbnail)||void 0===l?void 0:l.source,molarMass:c,density:d,meltingPoint:u,boilingPoint:f,loading:!1})}catch(e){L({formula:t,loading:!1,error:e instanceof Error?e.message:"Failed to load molecule info."})}},[]),O=(0,l.useCallback)(()=>{let t=r.current;if(!t)return;t.innerHTML="";let e=t.clientWidth,a=t.clientHeight,n=s.Ys(t).append("svg").attr("width",e).attr("height",a).attr("class","atom-simulator-svg"),l=n.append("g"),i=n.append("defs"),d=i.append("pattern").attr("id","atom-grid").attr("width",40).attr("height",40).attr("patternUnits","userSpaceOnUse");d.append("path").attr("d","M 40 0 L 0 0 0 40").attr("fill","none").attr("stroke","rgba(255,255,255,0.05)").attr("stroke-width",1),l.append("rect").attr("width",e).attr("height",a).attr("fill","url(#atom-grid)"),c.forEach(t=>{let e=i.append("filter").attr("id","glow-".concat(t.symbol)).attr("x","-50%").attr("y","-50%").attr("width","200%").attr("height","200%");e.append("feGaussianBlur").attr("stdDeviation",4).attr("result","coloredBlur");let r=e.append("feMerge");r.append("feMergeNode").attr("in","coloredBlur"),r.append("feMergeNode").attr("in","SourceGraphic")});let f=i.append("filter").attr("id","electron-glow").attr("x","-100%").attr("y","-100%").attr("width","300%").attr("height","300%");f.append("feGaussianBlur").attr("stdDeviation",2.5).attr("result","coloredBlur");let m=f.append("feMerge");m.append("feMergeNode").attr("in","coloredBlur"),m.append("feMergeNode").attr("in","SourceGraphic");let p=i.append("filter").attr("id","bond-glow").attr("x","-150%").attr("y","-150%").attr("width","400%").attr("height","400%");p.append("feGaussianBlur").attr("stdDeviation",7).attr("result","coloredBlur");let g=p.append("feMerge");g.append("feMergeNode").attr("in","coloredBlur"),g.append("feMergeNode").attr("in","SourceGraphic");let b=i.append("radialGradient").attr("id","mol-aura");b.append("stop").attr("offset","0%").attr("stop-color","rgba(125,211,252,0.34)"),b.append("stop").attr("offset","42%").attr("stop-color","rgba(96,165,250,0.22)"),b.append("stop").attr("offset","72%").attr("stop-color","rgba(168,85,247,0.16)"),b.append("stop").attr("offset","100%").attr("stop-color","rgba(96,165,250,0)"),o.current=n,u.current=l},[]),Q=(0,l.useCallback)(()=>{let t=connectedComponents(f.current,m.current),e=[];t.forEach(t=>{t.length>1&&e.push(formulaForComponent(t))});let r=e.sort(),a=JSON.stringify({formulas:r,bonds:m.current.map(t=>({id:t.id,order:t.order,distance:t.distance}))});a!==M.current&&(M.current=a,console.debug("[AtomLab] molecules updated",{atomCount:f.current.length,bondCount:m.current.length,formulas:r,bonds:m.current.map(t=>({id:t.id,order:t.order,distance:t.distance}))})),z(r),A(f.current.length)},[]),F=(0,l.useCallback)(()=>{let t=u.current;if(!t)return;let e=f.current,r=m.current;function getAtom(t){return"object"==typeof t?t:f.current.find(e=>e.id===t)}let a=r.flatMap(t=>{var e;let r=1===(e=t.order)?[0]:2===e?[-3,3]:[-5,0,5],a="string"==typeof t.source?t.source:t.source.id,o="string"==typeof t.target?t.target:t.target.id;return r.map((e,r)=>({id:"".concat(t.id,"-").concat(r),source:a,target:o,offset:e}))}),o=connectedComponents(e,r),n=new Set,l=[];o.forEach((t,e)=>{if(t.length>1){t.forEach(t=>n.add(t.id));let r=t.reduce((t,e)=>t+e.x,0)/t.length,a=t.reduce((t,e)=>t+e.y,0)/t.length,o=Math.max(...t.map(t=>Math.sqrt((t.x-r)**2+(t.y-a)**2)+t.radius));l.push({x:r,y:a,r:o+18,id:e})}}),y.current=n;let i=JSON.stringify({auras:l.map(t=>({id:t.id,x:Math.round(t.x),y:Math.round(t.y),r:Math.round(t.r)})),members:[...n].sort()});i!==j.current&&(j.current=i,console.debug("[AtomLab] render molecule orbital state",{auraCount:l.length,moleculeMemberCount:n.size,auras:l.map(t=>({id:t.id,x:Math.round(t.x),y:Math.round(t.y),r:Math.round(t.r)}))}));let c=t.selectAll(".mol-aura-fill").data(l,t=>t.id);c.exit().remove(),c.enter().append("circle").attr("class","mol-aura-fill").merge
1(c).attr("cx",t=>t.x).attr("cy",t=>t.y).attr("r",t=>t.r).attr("fill","url(#mol-aura)").attr("filter","url(#bond-glow)").attr("pointer-events","none");let d=t.selectAll(".mol-aura-ring").data(l,t=>t.id);d.exit().remove(),d.enter().append("circle").attr("class","mol-aura-ring").merge(d).attr("cx",t=>t.x).attr("cy",t=>t.y).attr("r",t=>t.r).attr("fill","none").attr("stroke","rgba(125,211,252,0.95)").attr("stroke-width",3.5).attr("stroke-dasharray","12,6").attr("filter","url(#bond-glow)").attr("pointer-events","none");let M=t.selectAll(".bond-glow").data(a,t=>"glow-".concat(t.id));M.exit().remove();let N=M.enter().append("line").attr("class","bond-glow");N.merge(M).attr("stroke","rgba(96,165,250,0.35)").attr("stroke-width",10).attr("stroke-linecap","round").attr("filter","url(#bond-glow)").attr("x1",t=>{let e=getAtom(t.source),r=getAtom(t.target);if(!e||!r)return 0;let a=r.x-e.x,o=r.y-e.y;return e.x+-o/(Math.sqrt(a*a+o*o)||1)*t.offset}).attr("y1",t=>{let e=getAtom(t.source),r=getAtom(t.target);if(!e||!r)return 0;let a=r.x-e.x,o=r.y-e.y;return e.y+a/(Math.sqrt(a*a+o*o)||1)*t.offset}).attr("x2",t=>{let e=getAtom(t.source),r=getAtom(t.target);if(!e||!r)return 0;let a=r.x-e.x,o=r.y-e.y;return r.x+-o/(Math.sqrt(a*a+o*o)||1)*t.offset}).attr("y2",t=>{let e=getAtom(t.source),r=getAtom(t.target);if(!e||!r)return 0;let a=r.x-e.x,o=r.y-e.y;return r.y+a/(Math.sqrt(a*a+o*o)||1)*t.offset});let S=t.selectAll(".bond").data(a,t=>t.id);S.exit().remove();let z=S.enter().append("line").attr("class","bond");z.merge(S).attr("stroke","rgba(255,255,255,0.55)").attr("stroke-width",3).attr("stroke-linecap","round").attr("x1",t=>{let e=getAtom(t.source),r=getAtom(t.target);if(!e||!r)return 0;let a=r.x-e.x,o=r.y-e.y;return e.x+-o/(Math.sqrt(a*a+o*o)||1)*t.offset}).attr("y1",t=>{let e=getAtom(t.source),r=getAtom(t.target);if(!e||!r)return 0;let a=r.x-e.x,o=r.y-e.y;return e.y+a/(Math.sqrt(a*a+o*o)||1)*t.offset}).attr("x2",t=>{let e=getAtom(t.source),r=getAtom(t.target);if(!e||!r)return 0;let a=r.x-e.x,o=r.y-e.y;return r.x+-o/(Math.sqrt(a*a+o*o)||1)*t.offset}).attr("y2",t=>{let e=getAtom(t.source),r=getAtom(t.target);if(!e||!r)return 0;let a=r.x-e.x,o=r.y-e.y;return r.y+a/(Math.sqrt(a*a+o*o)||1)*t.offset});let C=t.selectAll(".atom").data(e,t=>t.id);C.exit().remove();let A=C.enter().append("g").attr("class","atom").style("cursor","grab").attr("transform",t=>"translate(".concat(t.x,",").concat(t.y,")"));A.each(function(t){let e=s.Ys(this);t.electrons.forEach(t=>{e.append("circle").attr("class","electron-orbit").attr("r",t.radius).attr("fill","none").attr("stroke","rgba(96,165,250,0.22)").attr("stroke-width",1).attr("stroke-dasharray","2,2").attr("pointer-events","none")}),e.append("circle").attr("class","atom-shell").attr("r",t.radius).attr("fill",t.color).attr("stroke","rgba(255,255,255,0.35)").attr("stroke-width",1.5).style("filter","url(#glow-".concat(t.symbol,")"));let r=t.atomicNumber,a=Math.max(0,Math.round(t.mass)-t.atomicNumber),{positions:o,radius:n}=function(t,e){let r=[];if(t<=0)return{positions:r,radius:0};let a=0;for(;1+3*(a+1)*(a+2)<t;)a++;let o=Math.max(2,Math.min(5,e/(1+2*a))),n=2.2*o;r.push({x:0,y:0});let l=1;for(let e=1;e<=a&&l<t;e++){let a=6*e,o=e*n,s=Math.min(a,t-l),i=e%2*(Math.PI/s);for(let t=0;t<s;t++){let e=t/s*Math.PI*2+i;r.push({x:Math.cos(e)*o,y:Math.sin(e)*o})}l+=s}return{positions:r,radius:o}}(r+a,.65*t.radius),l=.35*n,i=e.append("g").attr("class","nucleus").style("display","none"),c=[];for(let t=0;t<r;t++)c.push({type:"proton",spin:Math.random()>.5?"up":"down",x:0,y:0});for(let t=0;t<a;t++)c.push({type:"neutron",spin:Math.random()>.5?"up":"down",x:0,y:0});c.forEach((t,e)=>{var r,a,n,l;t.x=null!==(n=null===(r=o[e])||void 0===r?void 0:r.x)&&void 0!==n?n:0,t.y=null!==(l=null===(a=o[e])||void 0===a?void 0:a.y)&&void 0!==l?l:0}),c.forEach(t=>{let e=i.append("g").attr("class","nucleon").attr("transform","translate(".concat(t.x,", ").concat(t.y,")"));e.append("circle").attr("r",n).attr("fill","rgba(255,255,255,0.92)").attr("stroke","proton"===t.type?"#ef4444":"#3b82f6").attr("stroke-width",2),["#ef4444","#22c55e","#3b82f6"].forEach((t,r)=>
1{let a=.45*n*Math.cos(2*r*Math.PI/3),o=.45*n*Math.sin(2*r*Math.PI/3),s=e.append("g").attr("transform","translate(".concat(a,", ").concat(o,")"));s.append("circle").attr("r",l).attr("fill",t).attr("stroke","rgba(255,255,255,0.35)").attr("stroke-width",.5)}),e.append("text").attr("text-anchor","middle").attr("dy","0.35em").attr("font-size",1.2*n).attr("fill","#111827").attr("font-weight","800").attr("pointer-events","none").text("up"===t.spin?"â":"â")}),e.append("text").attr("class","atom-label").attr("text-anchor","middle").attr("dy","0.35em").attr("fill","H"===t.symbol?"#111827":"#ffffff").attr("font-size",Math.max(10,.6*t.radius)).attr("font-weight","700").attr("pointer-events","none").text(t.symbol),t.electrons.forEach(()=>{e.append("circle").attr("class","electron-tail").attr("r",2).attr("fill","rgba(96,165,250,0.35)").attr("pointer-events","none")}),t.electrons.forEach(()=>{e.append("circle").attr("class","electron").attr("r",3.5).attr("fill","#60a5fa").attr("filter","url(#electron-glow)").attr("pointer-events","none")})});let R=A.merge(C);R.attr("transform",t=>"translate(".concat(t.x,",").concat(t.y,")")),R.each(function(t){let e=s.Ys(this),r=y.current.has(t.id),a=k.current;e.selectAll(".electron-orbit").style("display",r||a?"none":null).attr("r",(e,r)=>{var a;return(null===(a=t.electrons[r])||void 0===a?void 0:a.radius)||0}),e.selectAll(".electron-tail").style("display",r||a?"none":null).attr("cx",(e,r)=>{let a=t.electrons[r];return a?Math.cos(a.angle-.18)*a.radius:0}).attr("cy",(e,r)=>{let a=t.electrons[r];return a?Math.sin(a.angle-.18)*a.radius:0}),e.selectAll(".electron").style("display",r||a?"none":null).attr("cx",(e,r)=>{let a=t.electrons[r];return a?Math.cos(a.angle)*a.radius:0}).attr("cy",(e,r)=>{let a=t.electrons[r];return a?Math.sin(a.angle)*a.radius:0}),e.select(".nucleus").style("display",a?"block":"none")}),A.on("mouseenter",(t,e)=>{s.Ys(t.currentTarget).select(".atom-shell").attr("stroke","#ffffff").attr("stroke-width",3)}).on("mouseleave",(t,e)=>{s.Ys(t.currentTarget).select(".atom-shell").attr("stroke","rgba(255,255,255,0.35)").attr("stroke-width",1.5)}).call(s.ohM().on("start",(t,e)=>{if(t.sourceEvent.stopPropagation(),g.current=e,e.fx=e.x,e.fy=e.y,x.current={x:t.x-e.x,y:t.y-e.y},s.Ys(t.sourceEvent.target).style("cursor","grabbing"),w.current){let t=connectedComponents(f.current,m.current),r=[];t.forEach(t=>{t.some(t=>t.id===e.id)&&(r=t)}),v.current=new Map,r.forEach(t=>{v.current.set(t.id,{x:t.x-e.x,y:t.y-e.y}),t.fx=t.x,t.fy=t.y})}p.current&&p.current.alphaTarget(.25).restart()}).on("drag",(t,e)=>{let r=t.x-x.current.x,a=t.y-x.current.y;if(w.current)v.current.forEach((t,e)=>{let o=getAtom(e);o&&(o.fx=r+t.x,o.fy=a+t.y)});else{e.fx=r,e.fy=a;let t=m.current.filter(t=>{let r="string"==typeof t.source?t.source:t.source.id,a="string"==typeof t.target?t.target:t.target.id;return r===e.id||a===e.id});t.forEach(t=>{let o="string"==typeof t.source?t.source:t.source.id,n="string"==typeof t.target?t.target:t.target.id,l=getAtom(o===e.id?n:o);if(!l)return;let s=r-l.x,i=a-l.y,c=Math.sqrt(s*s+i*i);c>getBreakDistance(e,l,t.order,!0)&&(console.debug("[AtomLab] drag broke bond",{bondId:t.id,dragged:"".concat(e.symbol,":").concat(e.id),other:"".concat(l.symbol,":").concat(l.id),order:t.order,dist:Math.round(c),breakDistance:Math.round(getBreakDistance(e,l,t.order,!0))}),e.bonds-=t.order,l.bonds-=t.order,h.current.add(bondKey(e.id,l.id)),m.current=m.current.filter(e=>e.id!==t.id))}),Q(),F()}p.current&&p.current.alpha(.4).restart()}).on("end",(t,e)=>{g.current=null,b.current=!0,setTimeout(()=>{b.current=!1},50),s.Ys(t.sourceEvent.target).style("cursor","grab"),w.current?v.current.forEach((t,e)=>{let r=getAtom(e);r&&(r.fx=null,r.fy=null)}):(e.fx=null,e.fy=null),setTimeout(()=>{h.current.clear()},350),Q(),p.current&&p.current.alphaTarget(0)}));let E=[],q=[];o.forEach((t,e)=>{if(t.length>1){let r=t.reduce((t,e)=>t+e.x,0)/t.length,a=t.reduce((t,e)=>t+e.y,0)/t.length-Math.max(...t.map(t=>t.radius))-14,o=formulaForComponent(t);E.push({x:r,y:a,text:o}),q.push({x:r+22,y:a-6,id:e,formula:o})}});let $=t.selectAll(".mol-label").data(E,t=>t.text);$.exit().remove();let W=$.enter().append("text").attr("class","mol-label");W.merge($).attr("x",t=>t.x).attr("y",t=>t.y).attr("text-anchor","middle").attr("fill","#ffffff").attr("font-size",13).attr("font-weight","600").attr("pointer-events","none").style("text-shadow","0 1px 3px rgba(0,0,0,0.8)").text(t=>t.text);let B=t.selectAll(".mol-info-icon").data(q,t=>t.id);B.exit().remove();let D=B.enter().append("g").attr("class","mol-info-icon").style("cursor","pointer");D.append("circle").attr("r",8).attr("fill","rgba(59,130,246,0.9)").attr("stroke","rgba(255,255,255,0.8)").attr("stroke-width",1),D.append("text").attr("text-anchor","middle").attr("dy","0.35em").attr("fill","#ffffff").attr("font-size",10).attr("font-weight","700").attr("pointer-events","none").text("i");let H=D.merge(B);H.attr("transform",t=>"translate(".concat(t.x,", ").concat(t.y,")")).on("click",(t,e)=>{t.stopPropagation(),I(e.formula)})},[]),T=(0,l.useCallback)((t,e,a)=>{let o=d.get(t);if(!o)return;let n=r.current,l=(null==n?void 0:n.clientWidth)||800,s=(null==n?void 0:n.clientHeight)||600,i={...o,id:"".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,9)),x:null!=e?e:l/2+(Math.random()-.5)*60,y:null!=a?a:s/2+(Math.random()-.5)*60,vx:0,vy:0,fx:null,fy:null,bonds:0,electrons:o.valence<=0?[]:Array.from({length:o.valence},(t,e)=>({angle:2*Math.PI*e/o.valence+.5*Math.random(),radius:o.radius+9+e%2*5,speed:.025+.015*Math.random()}))};f.current.push(i),console.debug("[AtomLab] spawned atom",{id:i.id,symbol:i.symbol,valence:i.valence,x:Math.round(i.x),y:Math.round(i.y),atomCount:f.current.length}),Q(),F(),p.current&&p.current.nodes(f.current).alpha(.5).restart()},[F,Q]),Y=(0,l.useCallback)(()=>{f.current=[],m.current=[],Q(),F(),p.current&&p.current.nodes([]).alpha(0).restart()},[F,Q]),G=(0,l.useCallback)(t=>{if(g.current||b.current)return;let e=r.current;if(!e)return;let a=e.getBoundingClientRect(),o=t.clientX-a.left,n=t.clientY-a.top;T(W,o,n),$(!1)},[W,T]);return(0,l.useEffect)(()=>{w.current=R},[R]),(0,l.useEffect)(()=>{k.current=D,F()},[D,F]),(0,l.useEffect)(()=>{O();let t=r.current;if(!t)return;let e=t.clientWidth,a=t.clientHeight,o=s.A4v(f.current).force("charge",s.q5i().strength(t=>
1y.current.has(t.id)?-10:-120).distanceMax(180)).force("center",s.wqt(e/2,a/2).strength(.04)).force("collision",s.Hh().radius(t=>y.current.has(t.id)?t.radius:t.radius+4).strength(.45)).force("x",s.RUJ(e/2).strength(.02)).force("y",s.Mrm(a/2).strength(.02)).alphaDecay(.02).alphaMin(.001).velocityDecay(.35);o.on("tick",()=>{let t=f.current,e=m.current;for(let r=0;r<t.length;r++){let a=t[r];for(let o=r+1;o<t.length;o++){let r=t[o],n=a.x-r.x,l=a.y-r.y,s=Math.sqrt(n*n+l*l),i=bondKey(a.id,r.id),c=e.findIndex(t=>t.id===i),d=c>=0?e[c]:null,u=d?d.order:0;if(!h.current.has(i)&&a.bonds<a.valence&&r.bonds<r.valence){let t=a.valence-a.bonds+u,o=r.valence-r.bonds+u,n="O"===a.symbol&&"O"===r.symbol?Math.min(2,t,o):"N"===a.symbol&&"N"===r.symbol?Math.min(3,t,o):"C"===a.symbol&&"O"===r.symbol||"O"===a.symbol&&"C"===r.symbol?Math.min(2,t,o):Math.min(1,t,o),l=n-u;if(l>0){let t=a.radius+r.radius+(1===n?4:2===n?0:-3),o=N.current.get(i)||1/0;s<=t+12&&Math.abs(o-s)>3&&(N.current.set(i,s),console.debug("[AtomLab] bond candidate near threshold",{key:i,pair:"".concat(a.symbol,"-").concat(r.symbol),dist:Math.round(s),bondDistance:Math.round(t),currentOrder:u,targetOrder:n,additional:l,aBonds:a.bonds,bBonds:r.bonds,aValence:a.valence,bValence:r.valence})),s<=t&&(d?(console.debug("[AtomLab] upgraded bond",{key:i,pair:"".concat(a.symbol,"-").concat(r.symbol),fromOrder:d.order,toOrder:n,dist:Math.round(s),bondDistance:Math.round(t)}),d.order=n,d.distance=t):(console.debug("[AtomLab] created bond",{key:i,pair:"".concat(a.symbol,"-").concat(r.symbol),order:n,dist:Math.round(s),bondDistance:Math.round(t),aBondsBefore:a.bonds,bBondsBefore:r.bonds}),e.push({id:i,source:a.id,target:r.id,order:n,distance:t})),a.bonds+=l,r.bonds+=l,Q())}}}}let r=o.force("link");r&&(r.links(e.map(t=>({...t}))),r.distance(t=>t.distance),r.strength(t=>1.4+.6*t.order)),t.forEach(t=>{t.electrons.forEach(t=>{t.angle+=t.speed})}),F()}),o.force("link",s.Fsl(m.current).id(t=>t.id).distance(t=>t.distance).strength(1.6)),p.current=o;let handleResize=()=>{O();let e=t.clientWidth,r=t.clientHeight;o.force("center",s.wqt(e/2,r/2).strength(.04)),o.force("x",s.RUJ(e/2).strength(.02)),o.force("y",s.Mrm(r/2).strength(.02)),o.alpha(.3).restart()};return window.addEventListener("resize",handleResize),()=>{window.removeEventListener("resize",handleResize),o.stop()}},[O,F]),(0,l.useEffect)(()=>{let t=setTimeout(()=>{0===f.current.length&&(T("H"),T("H"),T("O"))},100);return()=>clearTimeout(t)},[T]),(0,a.jsxs)("div",{style:{display:"flex",flexDirection:"row",height:"70vh",minHeight:520,gap:16},className:"jsx-a9c9fe8a929fcd7c",children:[(0,a.jsxs)("div",{style:{flex:1,position:"relative",minWidth:0},className:"jsx-a9c9fe8a929fcd7c",children:[(0,a.jsx)("div",{ref:r,onClick:G,style:{width:"100%",height:"100%",borderRadius:12,background:"linear-gradient(135deg, #0f172a 0%, #1e1b4b 100%)",border:"1px solid rgba(255,255,255,0.1)",overflow:"hidden",cursor:"crosshair",position:"relative"},className:"jsx-a9c9fe8a929fcd7c"}),q&&(0,a.jsxs)("div",{style:{position:"absolute",top:16,left:16,right:160,padding:"12px 16px",borderRadius:8,background:"rgba(0,0,0,0.55)",border:"1px solid rgba(255,255,255,0.12)",pointerEvents:"none"},className:"jsx-a9c9fe8a929fcd7c",children:[(0,a.jsx)(i.xv,{fontSize:"$sm",fontWeight:"$bold",color:"#ffffff",children:"Zero-G Atom Lab"}),(0,a.jsx)(i.xv,{fontSize:"$xs",color:"rgba(255,255,255,0.7)",mt:"$2",children:'Click an atom on the toolbar, then click anywhere in the space to spawn it. Single atoms bond when they drift close enough and both have free valence. Shared orbitals glow around each molecule. Drag one atom out to break it apart, or toggle "Move Molecule" to drag whole molecules.'})]}),(0,a.jsxs)("div",{style:{position:"absolute",bottom:12,left:12,display:"flex",gap:8,flexWrap:"wrap",alignItems:"center"},className:"jsx-a9c9fe8a929fcd7c",children:[(0,a.jsx)("div",{style:{padding:"6px 12px",background:"rgba(0,0,0,0.5)",borderRadius:6,border:"1px solid rgba(255,255,255,0.1)"},className:"jsx-a9c9fe8a929fcd7c",children:(0,a.jsxs)(i.xv,{fontSize:"$xs",color:"rgba(255,255,255,0.8)",children:["Atoms: ",C]})}),(0,a.jsx)("div",{style:{padding:"6px 12px",background:"rgba(0,0,0,0.5)",borderRadius:6,border:"1px solid rgba(255,255,255,0.1)"},className:"jsx-a9c9fe8a929fcd7c",children:(0,a.jsxs)(i.xv,{fontSize:"$xs",color:"rgba(255,255,255,0.8)",children:["Molecules: ",S.length?S.join(", "):"â"]})})]}),P&&(0,a.jsx)("div",{style:{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.6)",zIndex:10,padding:24},onClick:()=>L(null),className:"jsx-a9c9fe8a929fcd7c",children:(0,a.jsxs)("div",{style:{width:"100%",maxWidth:420,maxHeight:"80%",overflowY:"auto",background:"rgba(17,24,39,0.95)",border:"1px solid rgba(255,255,255,0.15)",borderRadius:12,padding:24,boxShadow:"0 20px 60px rgba(0,0,0,0.5)"},onClick:t=>t.stopPropagation(),className:"jsx-a9c9fe8a929fcd7c",children:[(0,a.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:12},className:"jsx-a9c9fe8a929fcd7c",children:[(0,a.jsxs)(i.xv,{fontSize:"$lg",fontWeight:"$bold",color:"#ffffff",children:[P.formula,P.title&&" â ".concat(P.title)]}),(0,a.jsx)("button",{onClick:()=>L(null),style:{background:"transparent",border:"none",color:"#ffffff",fontSize:20,cursor:"pointer",lineHeight:1},className:"jsx-a9c9fe8a929fcd7c",children:"\xd7"})]}),P.loading&&(0,a.jsx)(i.xv,{fontSize:"$sm",color:"rgba(255,255,255,0.7)",children:"Loading info from Wikipedia..."}),P.error&&(0,a.jsx)(i.xv,{fontSize:"$sm",color:"#f87171",children:P.error}),!P.loading&&!P.error&&(0,a.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:12},className:"jsx-a9c9fe8a929fcd7c",children:[P.image&&(0,a.jsx)("img",{src:P.image,alt:P.title||P.formula,style:{width:"100%",maxHeight:160,objectFit:"contain",borderRadius:8,background:"rgba(0,0,0,0.3)"},className:"jsx-a9c9fe8a929fcd7c"}),P.extract&&(0,a.jsx)(i.xv,{fontSize:"$sm",color:"rgba(255,255,255,0.85)",children:P.extract}),(0,a.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:10},className:"jsx-a9c9fe8a929fcd7c",children:[P.molarMass&&(0,a.jsxs)("div",{style:{padding:10,background:"rgba(255,255,255,0.06)",borderRadius:8},className:"jsx-a9c9fe8a929fcd7c",children:[(0,a.jsx)(i.xv,{fontSize:"$xs",color:"rgba(255,255,255,0.6)",children:"Molar mass"}),(0,a.jsx)(i.xv,{fontSize:"$sm",fontWeight:"$bold",color:"#ffffff",children:P.molarMass})]}),P.density&&(0,a.jsxs)("div",{style:{padding:10,background:"rgba(255,255,255,0.06)",borderRadius:8},className:"jsx-a9c9fe8a929fcd7c",children:[(0,a.jsx)(i.xv,{fontSize:"$xs",color:"rgba(255,255,255,0.6)",children:"Density"}),(0,a.jsx)(i.xv,{fontSize:"$sm",fontWeight:"$bold",color:"#ffffff",children:P.density})]}),P.meltingPoint&&(0,a.jsxs)("div",{style:{padding:10,background:"rgba(255,255,255,0.06)",borderRadius:8},className:"jsx-a9c9fe8a929fcd7c",children:[(0,a.jsx)(i.xv,{fontSize:"$xs",color:"rgba(255,255,255,0.6)",children:"Melting point"}),(0,a.jsx)(i.xv,{fontSize:"$sm",fontWeight:"$bold",color:"#ffffff",children:P.meltingPoint})]}),P.boilingPoint&&(0,a.jsxs)("div",{style:{padding:10,background:"rgba(255,255,255,0.06)",borderRadius:8},className:"jsx-a9c9fe8a929fcd7c",children:[(0,a.jsx)(i.xv,{fontSize:"$xs",color:"rgba(255,255,255,0.6)",children:"Boiling point"}),(0,a.jsx)(i.xv,{fontSize:"$sm",fontWeight:"$bold",color:"#ffffff",children:P.boilingPoint})]})]})]})]})})]}),(0,a.jsxs)("div",{style:{width:140,flexShrink:0,display:"flex",flexDirection:"column",gap:12,padding:16,borderRadius:12,background:"rgba(17,24,39,0.85)",border:"1px solid rgba(255,255,255,0.1)"},className:"jsx-a9c9fe8a929fcd7c",children:[(0,a.jsx)(i.xv,{fontSize:"$sm",fontWeight:"$bold",color:"#ffffff",children:"Atom Toolbar"}),(0,a.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:10,flex:1,minHeight:0,overflowY:"auto"},className:"jsx-a9c9fe8a929fcd7c",children:c.map(t=>(0,a.jsxs)("button",{onClick:()=>{B(t.symbol),$(!1)},onMouseDown:t=>{t.stopPropagation()},style:{width:"100%",display:"flex",alignItems:"center",gap:10,padding:"10px 12px",borderRadius:8,border:W===t.symbol?"2px solid ".concat(t.color):"1px solid rgba(255,255,255,0.15)",background:W===t.symbol?"rgba(255,255,255,0.1)":"rgba(0,0,0,0.3)",color:"#ffffff",cursor:"pointer",transition:"all 0.15s ease"},title:"".concat(t.name," â valence ").concat(t.valence),className:"jsx-a9c9fe8a929fcd7c",children:[(0,a.jsx)("span",{style:{width:24,height:24,borderRadius:"50%",background:t.color,display:"inline-flex",alignItems:"center",justifyContent:"center",fontSize:12,fontWeight:700,color:"H"===t.symbol?"#111827":"#ffffff",boxShadow:"0 0 8px ".concat(t.glow),flexShrink:0},className:"jsx-a9c9fe8a929fcd7c",children:t.symbol}),(0,a.jsx)("span",{style:{fontSize:13,fontWeight:500},className:"jsx-a9c9fe8a929fcd7c",children:t.name})]},t.symbol))}),(0,a.jsxs)("div",{style:{marginTop:"auto",display:"flex",flexDirection:"column",gap:10},className:"jsx-a9c9fe8a929fcd7c",children:[(0,a.jsx)(i.zx,{variant:R?"primary":"ghost",onClick:()=>E(t=>!t),attributes:{style:{width:"100%",justifyContent:"center"}},children:R?"Move Molecule: On":"Move Molecule: Off"}),(0,a.jsxs)("label",{style:{width:"100%",display:"flex",alignItems:"center",gap:8,padding:"10px 12px",borderRadius:8,border:"1px solid rgba(255,255,255,0.15)",background:D?"rgba(59,130,246,0.2)":"rgba(0,0,0,0.3)",color:"#ffffff",cursor:"pointer",fontSize:13,fontWeight:500,transition:"all 0.15s ease"},className:"jsx-a9c9fe8a929fcd7c",children:[(0,a.jsx)("input",{type:"checkbox",checked:D,onChange:t=>H(t.target.checked),style:{width:16,height:16,accentColor:"#3b82f6",cursor:"pointer"},className:"jsx-a9c9fe8a929fcd7c"}),"Pro mode"]}),(0,a.jsx)(i.zx,{variant:"ghost",onClick:Y,attributes:{style:{width:"100%",justifyContent:"center"}},children:"Clear Lab"})]})]}),(0,a.jsx)(n(),{id:"a9c9fe8a929fcd7c",children:".atom-simulator-svg{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.atom-shell{-webkit-transition:stroke.15s ease,stroke-width.15s ease;-moz-transition:stroke.15s ease,stroke-width.15s ease;-o-transition:stroke.15s ease,stroke-width.15s ease;transition:stroke.15s ease,stroke-width.15s ease}.atom-label{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.mol-label{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.electron-orbit{pointer-events:none}.electron-tail{pointer-events:none}.electron{pointer-events:none}.bond-glow{pointer-events:none}.mol-aura-fill{pointer-events:none;transform-box:fill-box;-webkit-transform-origin:center;-moz-transform-origin:center;-ms-transform-origin:center;-o-transform-origin:center;transform-origin:center;-webkit-animation:molecule-orbital-fill-pulse 1.8s ease-in-out infinite;-moz-animation:molecule-orbital-fill-pulse 1.8s ease-in-out infinite;-o-animation:molecule-orbital-fill-pulse 1.8s ease-in-out infinite;animation:molecule-orbital-fill-pulse 1.8s ease-in-out infinite}.mol-aura-ring{pointer-events:none;transform-box:fill-box;-webkit-transform-origin:center;-moz-transform-origin:center;-ms-transform-origin:center;-o-transform-origin:center;transform-origin:center;-webkit-animation:molecule-orbital-ring-pulse 1.8s ease-in-out infinite;-moz-animation:molecule-orbital-ring-pulse 1.8s ease-in-out infinite;-o-animation:molecule-orbital-ring-pulse 1.8s ease-in-out infinite;animation:molecule-orbital-ring-pulse 1.8s ease-in-out infinite}.nucleus{pointer-events:none;transform-box:fill-box;-webkit-transform-origin:center;-moz-transform-origin:center;-ms-transform-origin:center;-o-transform-origin:center;transform-origin:center;-webkit-animation:quantum-jitter.55s ease-in-out infinite alternate;-moz-animation:quantum-jitter.55s ease-in-out infinite alternate;-o-animation:quantum-jitter.55s ease-in-out infinite alternate;animation:quantum-jitter.55s ease-in-out infinite alternate}.nucleon{pointer-events:none}@-webkit-keyframes quantum-jitter{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}25%{-webkit-transform:translate(.6px,-.6px);transform:translate(.6px,-.6px)}50%{-webkit-transform:translate(-.6px,.6px);transform:translate(-.6px,.6px)}75%{-webkit-transform:translate(.6px,.6px);transform:translate(.6px,.6px)}100%{-webkit-transform:translate(-.6px,-.6px);transform:translate(-.6px,-.6px)}}@-moz-keyframes quantum-jitter{0%{-moz-transform:translate(0,0);transform:translate(0,0)}25%{-moz-transform:translate(.6px,-.6px);transform:translate(.6px,-.6px)}50%{-moz-transform:translate(-.6px,.6px);transform:translate(-.6px,.6px)}75%{-moz-transform:translate(.6px,.6px);transform:translate(.6px,.6px)}100%{-moz-transform:translate(-.6px,-.6px);transform:translate(-.6px,-.6px)}}@-o-keyframes quantum-jitter{0%{-o-transform:translate(0,0);transform:translate(0,0)}25%{-o-transform:translate(.6px,-.6px);transform:translate(.6px,-.6px)}50%{-o-transform:translate(-.6px,.6px);transform:translate(-.6px,.6px)}75%{-o-transform:translate(.6px,.6px);transform:translate(.6px,.6px)}100%{-o-transform:translate(-.6px,-.6px);transform:translate(-.6px,-.6px)}}@keyframes quantum-jitter{0%{-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}25%{-webkit-transform:translate(.6px,-.6px);-moz-transform:translate(.6px,-.6px);-o-transform:translate(.6px,-.6px);transform:translate(.6px,-.6px)}50%{-webkit-transform:translate(-.6px,.6px);-moz-transform:translate(-.6px,.6px);-o-transform:translate(-.6px,.6px);transform:translate(-.6px,.6px)}75%{-webkit-transform:translate(.6px,.6px);-moz-transform:translate(.6px,.6px);-o-transform:translate(.6px,.6px);transform:translate(.6px,.6px)}100%{-webkit-transform:translate(-.6px,-.6px);-moz-transform:translate(-.6px,-.6px);-o-transform:translate(-.6px,-.6px);transform:translate(-.6px,-.6px)}}@-webkit-keyframes molecule-orbital-fill-pulse{0%,100%{opacity:.42;-webkit-filter:url(#bond-glow);filter:url(#bond-glow)}50%{opacity:1;-webkit-filter:url(#bond-glow);filter:url(#bond-glow)}}@-moz-keyframes molecule-orbital-fill-pulse{0%,100%{opacity:.42;filter:url(#bond-glow)}50%{opacity:1;filter:url(#bond-glow)}}@-o-keyframes molecule-orbital-fill-pulse{0%,100%{opacity:.42;filter:url(#bond-glow)}50%{opacity:1;filter:url(#bond-glow)}}@keyframes molecule-orbital-fill-pulse{0%,100%{opacity:.42;-webkit-filter:url(#bond-glow);filter:url(#bond-glow)}50%{opacity:1;-webkit-filter:url(#bond-glow);filter:url(#bond-glow)}}@-webkit-keyframes molecule-orbital-ring-pulse{0%,100%{opacity:.58;stroke-width:2.5px}50%{opacity:1;stroke-width:5px}}@-moz-keyframes molecule-orbital-ring-pulse{0%,100%{opacity:.58;stroke-width:2.5px}50%{opacity:1;stroke-width:5px}}@-o-keyframes molecule-orbital-ring-pulse{0%,100%{opacity:.58;stroke-width:2.5px}50%{opacity:1;stroke-width:5px}}@keyframes molecule-orbital-ring-pulse{0%,100%{opacity:.58;stroke-width:2.5px}50%{opacity:1;stroke-width:5px}}"})]})}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.