const QR_DEPLOY_KEY="deployUrl_3d",QR_URL_EXAMPLE="https://heart3d.pages.dev/";function qrBaseUrl(n){return n?n.split("#")[0]:location.origin+location.pathname}function qrShareLink(n,a){const l=qrBaseUrl(n);if(a!=="en")return l;const e=l.includes("?");return/[?&]lang=/.test(l)?l:l+(e?"&":"?")+"lang=en"}function qrMode(n){return n?"deploy":location.protocol==="file:"?"file":["localhost","127.0.0.1","[::1]",""].includes(location.hostname)?"local":"public"}function ShareQR({lang:n}){const{useState:a,useEffect:l}=React,e=(t,o)=>n==="en"?o:t,[s,d]=a(()=>{try{return localStorage.getItem(QR_DEPLOY_KEY)||""}catch{return""}}),[p,u]=a(s),[m,R]=a(!1),[c,N]=a(""),[i,h]=a(""),[v,y]=a(""),[k,b]=a(""),g=()=>{const t=qrShareLink(s,n);N(t);try{const o=window.QR.generate(t);h(window.QR.toSvg(o,200)),y("")}catch(o){h(""),y(o&&o.message?o.message:String(o))}};l(g,[s,n]);const w=()=>{const t=r=>{b(r),setTimeout(()=>b(""),1500)};navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(c).then(()=>t(e("\u2713 \u5DF2\u590D\u5236","\u2713 Copied"))).catch(()=>o()):o();function o(){const r=document.createElement("textarea");r.value=c,document.body.appendChild(r),r.select();try{document.execCommand("copy"),t(e("\u2713 \u5DF2\u590D\u5236","\u2713 Copied"))}catch{t(e("\u590D\u5236\u5931\u8D25","Copy failed"))}document.body.removeChild(r)}},f=()=>{const t=p.trim();if(!t){alert(e("\u26A0 URL \u4E3A\u7A7A","\u26A0 URL is empty"));return}if(!/^https?:\/\//i.test(t)){alert(e("\u26A0 URL \u5FC5\u987B\u4EE5 http:// \u6216 https:// \u5F00\u5934","\u26A0 URL must start with http:// or https://"));return}try{localStorage.setItem(QR_DEPLOY_KEY,t)}catch{}d(t)},L=()=>{try{localStorage.removeItem(QR_DEPLOY_KEY)}catch{}u(""),d("")},S=qrMode(s),C={deploy:[e("\u516C\u7F51\uFF08\u626B\u7801\u53EF\u5F00\uFF09","public (scannable)"),"var(--ok)"],public:[e("\u672C\u9875\u5730\u5740\uFF08\u516C\u7F51\uFF09","this page (public)"),"var(--ok)"],local:[e("localhost\uFF08\u586B\u5165\u516C\u7F51 URL \u5373\u53D8\u53EF\u626B\uFF09","localhost (set the deploy URL to make it scannable)"),"var(--gold)"],file:[e("\u672C\u5730 file://\uFF08\u624B\u673A\u6253\u4E0D\u5F00\uFF09","local file:// (phones cannot open it)"),"var(--bad)"]}[S];return React.createElement("div",{className:"ctrl-section qr-card"},React.createElement("div",{className:"ctrl-label"},e("\u626B\u7801\u89C2\u770B \xB7 \u5206\u4EAB","SCAN TO OPEN \xB7 SHARE")),React.createElement("div",{className:"qr-desc"},e("\u624B\u673A\u626B\u7801\u6253\u5F00\u672C\u9875\u3002\u90E8\u7F72\u5230\u7F51\u4E0A\u540E\u5728\u90E8\u7F72\u9875\u751F\u6210\uFF0C\u6216\u5728\u4E0B\u9762\u586B\u597D\u90E8\u7F72 URL\u3002","Scan with a phone to open this page. Generate it on the deployed site, or set the deploy URL below.")),React.createElement("div",{className:"qr-frame"+(i?"":" empty"),"aria-label":e("\u4E8C\u7EF4\u7801","QR code"),dangerouslySetInnerHTML:i?{__html:i}:void 0},i?void 0:v?"\u26A0 "+v:e('\u70B9\u51FB"\u751F\u6210\u5206\u4EAB\u7801"','Press "Generate"')),React.createElement("div",{className:"qr-btns"},React.createElement("button",{className:"btn tiny primary",onClick:g},e("\u{1F517} \u751F\u6210\u5206\u4EAB\u7801","\u{1F517} Generate")),React.createElement("button",{className:"btn tiny ghost",onClick:w,disabled:!c},k||e("\u{1F4CB} \u590D\u5236\u94FE\u63A5","\u{1F4CB} Copy link")),React.createElement("button",{className:"btn tiny "+(m?"primary":"ghost"),onClick:()=>R(t=>!t)},e("\u2699 \u90E8\u7F72 URL","\u2699 Deploy URL"))),m&&React.createElement("div",{className:"qr-deploy"},React.createElement("input",{type:"text",value:p,placeholder:QR_URL_EXAMPLE,onChange:t=>u(t.target.value),onKeyDown:t=>{t.key==="Enter"&&f()}}),React.createElement("div",{className:"qr-btns"},React.createElement("button",{className:"btn tiny primary",onClick:f},e("\u2713 \u4FDD\u5B58","\u2713 Save")),React.createElement("button",{className:"btn tiny ghost",onClick:L,disabled:!s},e("\u2717 \u6E05\u9664","\u2717 Clear"))),React.createElement("div",{className:"qr-meta"},s?React.createElement(React.Fragment,null,e("\u5F53\u524D\uFF1A","Now: "),React.createElement("span",{style:{color:"var(--ok)"}},e("\u2713 \u516C\u7F51\u90E8\u7F72","\u2713 deployed")),React.createElement("br",null),React.createElement("span",{className:"qr-mono"},s)):e("\u6CA1\u586B\u65F6\u7528\u672C\u9875\u5730\u5740\uFF1B\u5728 localhost \u4E0A\u751F\u6210\u7684\u7801\u624B\u673A\u6253\u4E0D\u5F00\uFF0C\u586B\u516C\u7F51\u5730\u5740\u540E\u4FDD\u5B58\u3002","Without it the page address is used; a code generated on localhost will not open on a phone."))),React.createElement("div",{className:"qr-link qr-mono"},c||e("\u94FE\u63A5\u751F\u6210\u540E\u5728\u6B64\u663E\u793A","The link appears here")),React.createElement("div",{className:"qr-meta"},e("QR \u6A21\u5F0F\uFF1A","QR mode: "),React.createElement("strong",{style:{color:C[1]}},C[0])),React.createElement("div",{className:"qr-copy"},e("\xA9 2026 \u9648\u4EEA\u8015 \xB7 \u7A0B\u5E8F\u4E0E\u754C\u9762\u4FDD\u7559\u6240\u6709\u6743\u5229\uFF1B\u6A21\u578B\u4E0E\u5FC3\u97F3\u6309 CC BY-SA \u5171\u4EAB\uFF0C\u89C1\u4E0B\u65B9\u7F72\u540D","\xA9 2026 Chen Yigeng \xB7 Code & UI all rights reserved; model and heart sounds under CC BY-SA (see credits below)")))}Object.assign(window,{ShareQR,qrShareLink});
