Files
securebit-chat/dist/app.js
T

51 lines
338 KiB
JavaScript
Raw Normal View History

function La(t=globalThis.window){return t?.SECUREBIT_DEBUG===!0}function Li({targetWindow:t=globalThis.window,webrtcManagerRef:e,onClearData:n,clearConsole:r=()=>{typeof console.clear=="function"&&console.clear()}}){return La(t)?(t.forceCleanup=()=>{n(),e.current&&e.current.disconnect()},t.clearLogs=r,t.webrtcManagerRef=e,()=>{delete t.forceCleanup,delete t.clearLogs,delete t.webrtcManagerRef}):()=>{}}var Ba="securebit-net";var Ur="ice-device-key",Hr="ice-settings";function Wr(){return typeof indexedDB<"u"&&typeof crypto<"u"&&!!crypto.subtle}function Vr(){return new Promise((t,e)=>{let n;try{n=indexedDB.open(Ba,1)}catch(r){e(r);return}n.onupgradeneeded=()=>{let r=n.result;r.objectStoreNames.contains("kv")||r.createObjectStore("kv")},n.onsuccess=()=>t(n.result),n.onerror=()=>e(n.error)})}function Gr(t,e){return new Promise((n,r)=>{let c=t.transaction("kv","readonly").objectStore("kv").get(e);c.onsuccess=()=>n(c.result),c.onerror=()=>r(c.error)})}function Bi(t,e,n){return new Promise((r,s)=>{let c=t.transaction("kv","readwrite");c.objectStore("kv").put(n,e),c.oncomplete=()=>r(),c.onerror=()=>s(c.error)})}function za(t,e){return new Promise((n,r)=>{let s=t.transaction("kv","readwrite");s.objectStore("kv").delete(e),s.oncomplete=()=>n(),s.onerror=()=>r(s.error)})}async function Ua(t){let e=await Gr(t,Ur);if(e instanceof CryptoKey)return e;let n=await crypto.subtle.generateKey({name:"AES-GCM",length:256},!1,["encrypt","decrypt"]);return await Bi(t,Ur,n),n}async function zi(t){if(!Wr())throw new Error("Persistent storage is not available in this browser");let e=await Vr(),n=await Ua(e),r=JSON.stringify({version:1,servers:Array.isArray(t?.servers)?t.servers:[],privacyMode:t?.privacyMode==="relay-only"?"relay-only":"standard"}),s=crypto.getRandomValues(new Uint8Array(12)),c=await crypto.subtle.encrypt({name:"AES-GCM",iv:s},n,new TextEncoder().encode(r));await Bi(e,Hr,{iv:Array.from(s),data:Array.from(new Uint8Array(c))})}async function Ui(){if(!Wr())return null;try{let t=await Vr(),e=await Gr(t,Hr);if(!e||!Array.isArray(e.iv)||!Array.isArray(e.data))return null;let n=await Gr(t,Ur);if(!(n instanceof CryptoKey))return null;let r=await crypto.subtle.decrypt({name:"AES-GCM",iv:new Uint8Array(e.iv)},n,new Uint8Array(e.data)),s=JSON.parse(new TextDecoder().decode(r));return{servers:Array.isArray(s.servers)?s.servers:[],privacyMode:s.privacyMode==="relay-only"?"relay-only":"standard"}}catch{return null}}async function jr(){if(Wr())try{let t=await Vr();await za(t,Hr)}catch{}}var Mn=["en","de","fr","es","uk","ru","zh","ko","hi","ar","he","fa","ur"],ar={en:{htmlLang:"en",nativeName:"English",abbr:"EN",dir:"ltr",path:"/"},de:{htmlLang:"de",nativeName:"Deutsch",abbr:"DE",dir:"ltr",path:"/de/"},fr:{htmlLang:"fr",nativeName:"Fran\xE7ais",abbr:"FR",dir:"ltr",path:"/fr/"},es:{htmlLang:"es",nativeName:"Espa\xF1ol",abbr:"ES",dir:"ltr",path:"/es/"},uk:{htmlLang:"uk",nativeName:"\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430",abbr:"UK",dir:"ltr",path:"/uk/"},ru:{htmlLang:"ru",nativeName:"\u0420\u0443\u0441\u0441\u043A\u0438\u0439",abbr:"RU",dir:"ltr",path:"/ru/"},zh:{htmlLang:"zh-Hans",nativeName:"\u7B80\u4F53\u4E2D\u6587",abbr:"ZH",dir:"ltr",path:"/zh/"},ko:{htmlLang:"ko",nativeName:"\uD55C\uAD6D\uC5B4",abbr:"KO",dir:"ltr",path:"/ko/"},hi:{htmlLang:"hi",nativeName:"\u0939\u093F\u0928\u094D\u0926\u0940",abbr:"HI",dir:"ltr",path:"/hi/"},ar:{htmlLang:"ar",nativeName:"\u0627\u0644\u0639\u0631\u0628\u064A\u0629",abbr:"AR",dir:"rtl",path:"/ar/"},he:{htmlLang:"he",nativeName:"\u05E2\u05D1\u05E8\u05D9\u05EA",abbr:"HE",dir:"rtl",path:"/he/"},fa:{htmlLang:"fa",nativeName:"\u0641\u0627\u0631\u0633\u06CC",abbr:"FA",dir:"rtl",path:"/fa/"},ur:{htmlLang:"ur",nativeName:"\u0627\u0631\u062F\u0648",abbr:"UR",dir:"rtl",path:"/ur/"}},Gi={en:{"language.suggest.text":"This page is also available in English.","language.suggest.cta":"Read in English","language.suggest.dismiss":"Dismiss"},de:{"language.suggest.text":"Diese Seite gibt es auch auf Deutsch.","language.suggest.cta":"Auf Deutsch lesen","language.suggest.dismiss":"Schlie\xDFen"},fr:{"language.su
Please wait for real-time cryptographic verification to complete.`,"sec.verificationUnavailable":"Security verification not available","chat.placeholder":"Type an encrypted message\u2026","chat.send":"Send message","chat.sendFiles":"Send files","chat.hideFiles":"Hide files","chat.recordVoice":"Record voice message","chat.sendVoice":"Send voice message","chat.discard":"Discard","chat.codeBlock":"Send as a code block (expands the input)","chat.codeHint":"Code snippet \xB7 formatting preserved \xB7 \u2318\u21B5 to send","chat.viewOnce":"View once","chat.viewOnceTitle":"View once - vanishes after the peer reads it","chat.viewOncePrefix":"View once \xB7 ","chat.viewOnceTap":"View once \xB7 tap to reveal","chat.viewedOnce":"Viewed once","chat.disappearing":"Disappearing message - deletes on both sides","chat.disappearAfter":"Disappear after","chat.visibleFor":"Visible for","chat.timerPrefix":"Timer \xB7 ","chat.expired":"This message has expired","chat.deleteForEveryone":"Delete for everyone","chat.sending":"Sending","chat.delivered":"Delivered","chat.notSent":"Not sent","chat.notSentReason":"Not sent - the secure channel is not ready. Reconnect to continue.","chat.encrypted":"Encrypted","chat.decrypted":"Decrypted","chat.encryptedOnDevice":"Encrypted on your device","chat.uploading":"Uploading","chat.downloading":"Downloading","chat.transferring":"Transferring\u2026","chat.copied":"Copied!","chat.collapse":"Collapse","chat.closeMenu":"Close menu","chat.newChat":"New chat","chat.newGroup":"New group","chat.createGroup":"Create a group","chat.groupChats":"Group chats","chat.secureChat":"Secure chat","chat.nameThis":"Name this chat","chat.rename":"Rename chat (local only)","chat.renameHint":"Double-click to rename","chat.localLabel":"Local label \xB7 stored only on this device","chat.setStatus":"Set your status","chat.yourStatusPrefix":"Your status - ","chat.meshHint":"Up to 8 peers \xB7 P2P mesh","chat.offline":"Offline","chat.noNetwork":"No network \xB7 reconnecting","chat.startVoiceCall":"Start encrypted voice call","chat.startVideoCall":"Start encrypted video call","chat.verifyForCalls":"Verify the session to enable calls","chat.e2eeNote":"Every message is end-to-end encrypted on your device before it leaves.","chat.peersOnly":"Sent end-to-end to connected peers only - never stored on a server.","flow.invitationCreated":"Secure invitation created","flow.invitationCreatedBang":"Secure invitation created and encrypted!","flow.responseCreated":"Secure response created","flow.responseCreatedBang":"Secure response created!","flow.sendInvitation":"Send the invitation code to your interlocutor via a secure channel (voice call, SMS, etc.).","flow.sendResponse":"Send the response code to the initiator via a secure channel or let them scan the QR code below.","flow.sendEncryptedCode":"Send the encrypted code","flow.sendTheResponse":"Send the response","flow.pasteOrWrite":"Paste or write code\u2026","flow.processingInvitation":"Processing the secure invitation...","flow.processingResponse":"Processing the secure response...","flow.finalizing":"Finalizing the secure connection...","flow.channelEstablished":"Secure channel established","flow.channelReady":"Secure channel is ready","flow.restoring":"Restoring connection\u2026","flow.invitationCaptured":"Invitation captured.","err.needInvitation":"You need to insert the invitation code from your interlocutor.","err.needResponse":"You need to insert the response code from your interlocutor.","err.responseFormat":"Invalid response format - please check the code","err.responseNoKey":"Invalid response code - missing or corrupted cryptographic key. Please check the code and try again.","err.responseNoSignKey":"Invalid response code - missing signature verification key. Please check the code and try again.","err.responseOutdated":"Response data is outdated - please use a fresh invitation","err.setupError":"Connection setup error","err.notReady":"Connection not ready","err.securityBreach":"Security breach detected - connection rejected","err.securityValidation":"Security validation failed - poss
Please wait for real-time cryptographic verification to complete.`);return}let n="'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace",r=M=>String(M).replace(/[&<>"]/g,B=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[B]),s=e.color==="orange"?"#f0892a":e.color==="yellow"?"#e3c84e":e.color==="red"?"#e5727a":"#3ecf8e",c=e.color==="orange"?"240,137,42":e.color==="yellow"?"227,200,78":e.color==="red"?"229,114,122":"62,207,142",d=Math.max(0,Math.min(100,Math.round(e.score||0))),h=2*Math.PI*56,y=`${(h*Math.min(1,d/100)).toFixed(1)} ${h.toFixed(1)}`,v=String(e.level||"SECURE").toUpperCase(),w=e.isRealData!==!1,p=e.verificationResults?Object.entries(e.verificationResults):[],S=Number.isFinite(e.passedChecks)?e.passedChecks:p.filter(([,M])=>M&&M.passed).length,g=Number.isFinite(e.totalChecks)?e.totalChecks:p.length,C=new Date(e.timestamp||Date.now()).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}),L=M=>{let B=a(`secTest.${M}`);return B===`secTest.${M}`?F(M):B},F=M=>{let B=String(M).replace(/^verify/i,"").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").trim();return B=B.replace(/\b(ecdh|ecdsa|aes|gcm|hmac|pfs|sas|mitm|asn|dtls|hkdf|spki|oid|p384)\b/gi,te=>te.toUpperCase()),B.charAt(0).toUpperCase()+B.slice(1)},ae='<svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="#3ecf8e" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 13l4 4 10-11"/></svg>',ee='<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="#e5727a" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6L6 18M6 6l12 12"/></svg>',de=p.map(([M,B],te)=>{let j=!!(B&&B.passed),q=B&&B.details||(j?a("sec.testPassed"):a("sec.testFailed")),re=a(`secDetail.${q}`),oe=re===`secDetail.${q}`?q:re,pe=j?"#161618":"#121214",O=j?"rgba(62,207,142,0.16)":"rgba(229,114,122,0.18)",V=j?"rgba(62,207,142,0.12)":"rgba(229,114,122,0.1)",ne=j?"rgba(62,207,142,0.26)":"rgba(229,114,122,0.24)",Ae=j?"#f4f4f6":"#cfcfd4";return`<div style="display:flex; align-items:flex-start; gap:13px; padding:16px 18px; border-radius:14px; background:${pe}; border:1px solid ${O}; animation:svIn .3s cubic-bezier(.2,.7,.3,1) both; animation-delay:${(te*.04).toFixed(2)}s;">
<span style="flex:none; width:34px; height:34px; border-radius:9px; display:grid; place-items:center; background:${V}; border:1px solid ${ne};">${j?ae:ee}</span>
<div style="flex:1; min-width:0;">
<div style="font-size:14.5px; font-weight:700; letter-spacing:-0.2px; color:${Ae}; margin-bottom:3px;">${r(L(M))}</div>
<div style="font-family:${n}; font-size:11.5px; line-height:1.45; color:#8a8a92;">${r(oe)}</div>
</div>
</div>`}).join(""),se=document.createElement("div");se.id="sb-security-report",se.style.cssText="position:fixed; inset:0; z-index:10000; display:flex; align-items:center; justify-content:center; padding:24px; background:rgba(8,8,10,0.62); backdrop-filter:blur(4px); -webkit-backdrop-filter:blur(4px); font-family:'Manrope',system-ui,-apple-system,sans-serif; overflow:auto;",se.innerHTML=`
<style>@keyframes svIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes svPulse{0%,100%{opacity:1}50%{opacity:.4}}</style>
<div style="position:relative; max-width:960px; width:100%; border-radius:20px; background:radial-gradient(1100px 640px at 50% -6%, rgba(${c},0.05), transparent 62%), #0f0f11; border:1px solid rgba(255,255,255,0.08); color:#e8e8eb; padding:30px; box-shadow:0 30px 70px rgba(0,0,0,0.55); animation:svIn .3s cubic-bezier(.2,.7,.3,1); max-height:calc(100vh - 48px); overflow:auto;">
<button class="sv-close" type="button" title="${a("chat.close")}" style="position:absolute; top:16px; inset-inline-end:16px; width:32px; height:32px; border-radius:9px; display:grid; place-items:center; border:1px solid rgba(255,255,255,0.08); background:rgba(255,255,255,0.02); color:#8a8a92; cursor:pointer; z-index:2;">
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round" style="pointer-events:none;"><path d="M6 6l12 12M18 6L6 18"/></svg>
</button>
<div style="position:relative; overflow:hidden; border-radius:18px; background:#141416; border:1px solid rgba(255,255,255,0.07); padding:28px 30px; display:flex; align-items:center; gap:30px; flex-wrap:wrap; margin-bottom:20px;">
<div style="position:absolute; top:0; left:0; right:0; height:1px; background:linear-gradient(90deg, transparent, rgba(${c},0.6), transparent);"></div>
<div style="position:relative; flex:none; width:128px; height:128px;">
<svg width="128" height="128" viewBox="0 0 128 128" style="transform:rotate(-90deg);">
<circle cx="64" cy="64" r="56" fill="none" stroke="rgba(255,255,255,0.06)" stroke-width="9"/>
<circle cx="64" cy="64" r="56" fill="none" stroke="${s}" stroke-width="9" stroke-linecap="round" stroke-dasharray="${y}"/>
</svg>
<div style="position:absolute; inset:0; display:flex; flex-direction:column; align-items:center; justify-content:center;">
<span style="font-size:30px; font-weight:800; letter-spacing:-1px; color:#f4f4f6; line-height:1;">${d}</span>
<span style="font-family:${n}; font-size:10px; font-weight:600; color:#6b6b73; text-transform:uppercase; letter-spacing:1px; margin-top:4px;">/ 100 pts</span>
</div>
</div>
<div style="flex:1; min-width:240px;">
<div style="font-family:${n}; font-size:11px; font-weight:600; color:#6b6b73; text-transform:uppercase; letter-spacing:1.6px; margin-bottom:10px;">${a("report.title")}</div>
<div style="display:flex; align-items:center; gap:12px; margin-bottom:14px; flex-wrap:wrap;">
<h2 style="margin:0; font-size:26px; font-weight:800; letter-spacing:-0.7px; color:#f4f4f6;">Security level: ${r(v)}</h2>
<span style="display:inline-flex; align-items:center; gap:8px; padding:6px 12px; border-radius:9px; background:rgba(${c},0.12); border:1px solid rgba(${c},0.3); font-family:${n}; font-size:11px; font-weight:700; color:${s}; text-transform:uppercase; letter-spacing:0.6px;"><span style="width:7px; height:7px; border-radius:50%; background:${s}; animation:svPulse 2s ease-in-out infinite;"></span>${a("report.active")}</span>
</div>
<div style="display:flex; gap:28px; flex-wrap:wrap;">
<div><div style="font-family:${n}; font-size:10px; font-weight:600; color:#56565e; text-transform:uppercase; letter-spacing:1px; margin-bottom:4px;">${a("report.testsPassed")}</div><div style="font-size:15px; font-weight:700; color:#e8e8eb;"><span style="color:${s};">${S}</span> / ${g}</div></div>
<div><div style="font-family:${n}; font-size:10px; font-weight:600; color:#56565e; text-transform:uppercase; letter-spacing:1px; margin-bottom:4px;">${a("report.verifiedAt")}</div><div style="font-family:${n}; font-size:15px; font-weight:600; color:#e8e8eb;">${r(C)}</div></div>
<div><div style="font-family:${n}; font-size:10px; font-weight:600; color:#56565e; text-transform:uppercase; letter-spacing:1px; margin-bottom:4px;">${a("report.source")}</div><div style="font-size:15px; font-weight:600; color:#e8e8eb;">${w?a("sec.realTests"):a("sec.simulatedData")}</div></div>
</div>
</div>
<button class="sv-rerun" type="button" style="flex:none; display:inline-flex; align-items:center; gap:9px; padding:12px 18px; border-radius:11px; border:1px solid rgba(255,255,255,0.1); background:rgba(255,255,255,0.025); color:#cfcfd4; font-family:'Manrope',sans-serif; font-size:14px; font-weight:700; cursor:pointer; transition:all .2s;">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="pointer-events:none;"><path d="M21 12a9 9 0 1 1-3-6.7L21 8"/><path d="M21 3v5h-5"/></svg>
Re-run
</button>
</div>
<div style="display:grid; grid-template-columns:repeat(auto-fit, minmax(248px, 1fr)); gap:12px;">${de}</div>
<div style="display:flex; align-items:center; gap:12px; margin-top:18px; padding:16px 20px; border-radius:14px; background:rgba(${c},0.06); border:1px solid rgba(${c},0.18);">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="${s}" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" style="flex:none;"><path d="M12 3l8 4v5c0 4.5-3.2 7.8-8 9-4.8-1.2-8-4.5-8-9V7l8-4z"/><path d="M9.2 12.2l2 2 3.6-3.8"/></svg>
<span style="font-size:14px; font-weight:600; color:#e8e8eb;">${w?a("sec.realTimeNote"):a("sec.simulatedWarning")}</span>
</div>
</div>`;let I=M=>{M.key==="Escape"&&P()},P=()=>{se.parentNode&&se.remove(),document.removeEventListener("keydown",I)};se.querySelector(".sv-close").addEventListener("click",P),se.addEventListener("click",M=>{M.target===se&&P()}),document.addEventListener("keydown",I);let H=se.querySelector(".sv-rerun");H.addEventListener("mouseenter",()=>{H.style.borderColor="rgba(240,137,42,0.45)",H.style.color="#f0892a"}),H.addEventListener("mouseleave",()=>{H.style.borderColor="rgba(255,255,255,0.1)",H.style.color="#cfcfd4"}),H.addEventListener("click",()=>{P(),$s(t)}),document.body.appendChild(se)},Go=({status:t,onDisconnect:e,webrtcManager:n,title:r,isOffline:s,peerPresence:c,onRenameTitle:d})=>{let h="'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace",[y,v]=React.useState(!1),[w,p]=React.useState(null),[S,g]=React.useState(!1),[C,L]=React.useState("");React.useEffect(()=>{let Q=!0,be=async()=>{try{if(!n)return;let Re=null;typeof n.getRealSecurityLevel=="function"?Re=await n.getRealSecurityLevel():typeof n.calculateAndReportSecurityLevel=="function"?Re=await n.calculateAndReportSecurityLevel():window.EnhancedSecureCryptoUtils&&(Re=await window.EnhancedSecureCryptoUtils.calculateSecurityLevel(n)),Q&&Re&&Re.isRealData!==!1&&p(Re)}catch{}};be();let Pe=Re=>{Q&&Re.detail&&Re.detail.securityData&&p(Re.detail.securityData)};document.addEventListener("real-security-calculated",Pe);let Ze=setInterval(be,15e3);return()=>{Q=!1,clearInterval(Ze),document.removeEventListener("real-security-calculated",Pe)}},[n]);let F=t==="connected"||t==="verified",ae=t==="disconnected"||t==="peer_disconnected",ee=F&&!s,de=s||ae?"#e5727a":F?"#3ecf8e":"#e3c84e",se=s?a("chat.offline"):F?a("status.connected"):t==="peer_disconnected"?a("status.peerDisconnected"):t==="disconnected"?a("chat.disconnected"):a("status.connecting"),I=s||ae?"0 0 0 3px rgba(229,114,122,0.16)":F?"0 0 0 3px rgba(62,207,142,0.16)":"0 0 0 3px rgba(227,200,78,0.16)",P=F&&!s?Kr[c]||"#3ecf8e":de,H=F&&!s&&c&&Qr[c]||null,M=()=>{L(r||""),g(!0)},B=()=>{typeof d=="function"&&d(C),g(!1)},te=Q=>{Q.key==="Enter"?(Q.preventDefault(),B()):Q.key==="Escape"&&g(!1)},j=w&&Number.isFinite(w.passedChecks)?w.passedChecks:null,q=w&&Number.isFinite(w.totalChecks)?w.totalChecks:null,re=Q=>{if(!Q)return Q;let be=a(`secLevel.${Q}`);return be===`secLevel.${Q}`?Q:be},oe=j!=null&&q?j+"/"+q:w?w.score+"%":"\u2014",pe=w?w.color==="green"?"#3ecf8e":w.color==="orange"?"#f0892a":w.color==="yellow"?"#e3c84e":"#e5727a":"#3ecf8e",O=React.createElement("div",{key:"sec",title:a("sas.runVerification"),onClick:()=>$s(n),className:"sb-secpill",style:{display:"flex",alignItems:"center",gap:"9px",padding:"7px 13px",borderRadius:"9px",border:"1px solid "+(y?"rgba(255,255,255,0.16)":"rgba(255,255,255,0.07)"),background:y?"rgba(255,255,255,0.05)":"rgba(255,255,255,0.02)",cursor:"pointer",fontFamily:"inherit",transition:"all .15s"}},[React.createElement("i",{key:"i",className:"fas fa-shield-halved",style:{color:pe,fontSize:"13px"}}),React.createElement("span",{key:"l",className:"sb-sec-label",style:{fontSize:"13px",fontWeight:600,color:"#e8e8eb"}},w?re(w.level)||a("chatHdr.secure"):a("chatHdr.secure")),React.createElement("span",{key:"d",className:"sb-sec-div",style:{width:"1px",height:"13px",background:"rgba(255,255,255,0.12)"}}),React.createElement("span",{key:"s",className:"sb-sec-score",style:{fontFamily:h,fontSize:"11.5px",fontWeight:500,color:"#8a8a92"}},oe),React.createElement("button",{key:"c",type:"button",title:a("sec.panelTitle"),onClick:Q=>{Q.stopPropagation(),v(be=>!be)},style:{background:"none",border:"none",padding:0,margin:0,cursor:"pointer",display:"grid",placeItems:"center"}},React.createElement("i",{className:"fas fa-chevron-down",style:{color:"#6b6b73",fontSize:"11px",transform:y?"rotate(180deg)":"rotate(0deg)",transition:"transform .2s"}}))]),V=React.createElement("style",{key:"hdr-css",dangerouslySetInnerHTML:{__html:".sb-call-btn:not(.sb-call-off):hover{border-color:rgba(62,207,142,0.45) !important;color:#3ecf8e !important;background:rgba(62,207,142,0.07) !important;}@media (max-width
//# sourceMappingURL=app.js.map