PageSourceSearch

https://tempstash.onrender.com/assets/SecureDropUpload-K4fL1tER.js

js tempstash.onrender.com collected 2026-10-03 11:43:24 UTC 24,422 bytes, 118 lines download raw bytes

1import{h as fe,r as i,j as e}from"./vendor-react-CUnmROEk.js";import{s as J,S as H,a as W}from"./secureDropCrypto-e_ATtb4L.js";import{P as F}from"./PublicLayout-B8M4IsEK.js";import{c as xe,n as be,S as A,A as ye,v as we,L as ve,C as Se,E as je,h as ze}from"./index-DTm5UXEN.js";import{u as q}from"./userFacingError-CMJthwvA.js";import{b as ke}from"./dateTime-DvL_GfPj.js";import{C as Ie}from"./circle-check-zhCdb6s7.js";import"./vendor-tools-CCs4dTof.js";import"./external-link-BbEwJ1B9.js";import"./vendor-supabase-fVq5vccW.js";const Ne=[["path",{d:"M10.5 22H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v6",key:"g5mvt7"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"m14 20 2 2 4-4",key:"15kota"}]],Ce=xe("file-check-corner",Ne);class v extends Error{status;constructor(c,n){super(c),this.name="ResumableSecureDropUploadError",this.status=n}get retryable(){return this.status===0||this.status===408||this.status===409||this.status===429||this.status>=500}}const L=()=>({url:"https://yfjyrgbfgolxydxbkygv.supabase.co",anonKey:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InlmanlyZ2JmZ29seHlkeGJreWd2Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3Njk2NzgwMTMsImV4cCI6MjA4NTI1NDAxM30.ASuCtborBTZcwcrQ21eObvi1OcD30OBHBtQ1FlZWtBU"}),ee=()=>`${L().url}/functions/v1/secure-drop-resumable-upload`,re=async a=>{const c=await a.json().catch(()=>null),n=typeof c?.error=="string"&&c.error.trim()?c.error:"Secure Drop upload could not be completed";throw new v(n,a.status)},te=a=>typeof a=="number"&&Number.isSafeInteger(a)&&a>=0,ae={async start(a,c,n){const{anonKey:u}=L();let m;try{m=await fetch(ee(),{method:"POST",headers:{Authorization:`Bearer ${u}`,apikey:u,"Content-Type":"application/json","x-secure-drop-token":a,...c?{"x-secure-drop-passphrase":c}:{}},body:JSON.stringify({action:"start",plaintextSize:n.plaintextSize,encryptedSize:n.encryptedSize,chunkSize:n.chunkSize,encryptedFileName:n.encryptedFileName,wrappedKey:n.wrappedKey,iv:n.iv,aadVersion:n.aadVersion,ciphertextVersion:n.ciphertextVersion,encryptedMetadata:n.encryptedMetadata,senderNameEncrypted:n.encryptedMetadata.senderNameEncrypted||null})})}catch{throw new v("Network connection was interrupted before the upload could start",0)}m.ok||await re(m);const r=await m.json().catch(()=>null);if(!r||typeof r.uploadId!="string"||!/^[0-9a-f-]{36}$/i.test(r.uploadId)||typeof r.uploadCapability!="string"||!/^[A-Za-z0-9_-]{43}$/.test(r.uploadCapability)||r.encryptedSize!==n.encryptedSize||r.chunkSize!==n.chunkSize||r.nextOffset!==0||typeof r.reservationExpiresAt!="string")throw new v("Secure Drop returned an invalid upload session",502);return{uploadId:r.uploadId,uploadCapability:r.uploadCapability,encryptedSize:n.encryptedSize,chunkSize:n.chunkSize,nextOffset:0,reservationExpiresAt:r.reservationExpiresAt}},async uploadChunk(a,c,n){if(!te(a.nextOffset)||!Number.isSafeInteger(a.encryptedSize)||a.nextOffset>=a.encryptedSize||!/^[0-9a-f-]{36}$/i.test(n))throw new v("Secure Drop upload state is invalid",400);const u=a.nextOffset,m=u+c.size-1;if(!Number.isSafeInteger(m)||c.size<1||m>=a.encryptedSize)throw new v("Secure Drop chunk size is invalid",400);const{anonKey:r}=L();let S;try{S=await fetch(ee(),{method:"PUT",headers:{Authorization:`Bearer ${r}`,apikey:r,"Content-Type":"application/octet-stream","Content-Range":`bytes ${u}-${m}/${a.encryptedSize}`,"x-secure-drop-upload-id":a.uploadId,"x-secure-drop-upload-capability":a.uploadCapability,"x-secure-drop-chunk-token":n},body:c})}catch{throw new v("Network connection was interrupted while uploading a chunk",0)}S.ok||await re(S);const d=await S.json().catch(()=>null);if(!d||d.ok!==!0||!te(d.nextOffset)||typeof d.completed!="boolean"||d.nextOffset<u||d.nextOffset>a.encryptedSize)throw new v("Secure Drop returned an invalid upload progress update",502);return{nextOffset:d.nextOffset,completed:d.completed}}},Ee=a=>{const c=new TextEncoder().encode(JSON.stringify(a));let n="";return c.forEach(u=>{n+=String.fromCharCode(u)}),btoa(n)},x=a=>a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(1)} KB`:a<1024*1024*1024?`${(a/(1024*1024)).toFixed(1)} MB`:`${(a/(1024*1024*1024)).toFixed(1)} GB`,Oe=a=>{if(!Number.isSafeInteger(a)||a<0||a%W!==0)throw new Error("Secure Drop upload progress is invali
1d");return a/W},Re=()=>{const{token:a}=fe(),{startOperation:c,updateOperation:n,completeOperation:u,failOperation:m}=be(),[r,S]=i.useState(null),[d,se]=i.useState(""),[R,oe]=i.useState(""),[l,Z]=i.useState([]),[ie,K]=i.useState(!0),[N,C]=i.useState(null),[j,h]=i.useState(""),[z,E]=i.useState(null),[le,P]=i.useState(!1),[k,V]=i.useState(null),[Y,ce]=i.useState(!1),[de,pe]=i.useState(()=>Date.now()),O=i.useRef(new Map),X=i.useRef(async()=>{}),_=i.useCallback(async t=>{try{K(!0),C(null);const b=await fetch("https://yfjyrgbfgolxydxbkygv.supabase.co/functions/v1/secure-drop-info",{method:"POST",headers:{Authorization:"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InlmanlyZ2JmZ29seHlkeGJreWd2Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3Njk2NzgwMTMsImV4cCI6MjA4NTI1NDAxM30.ASuCtborBTZcwcrQ21eObvi1OcD30OBHBtQ1FlZWtBU","Content-Type":"application/json"},body:JSON.stringify({token:a,passphrase:t})}),y=await b.json().catch(()=>null);if(!b.ok||y?.error)throw new Error(y?.error||"Secure Drop unavailable");S(y),t&&ce(!0)}catch(g){C(q(g,"Secure Drop is unavailable. The link may have expired or been closed."))}finally{K(!1)}},[a]);i.useEffect(()=>{_()},[_]),i.useEffect(()=>{const t=window.setInterval(()=>pe(Date.now()),6e4);return()=>window.clearInterval(t)},[]);const ue=i.useMemo(()=>l.reduce((t,g)=>t+g.size,0),[l]),G=i.useMemo(()=>l.reduce((t,g)=>t+J.estimateEncryptedSize(g.size),0),[l]),me=r?Math.max(r.max_total_size-r.total_uploaded_size,0):0,he=r?.upload_limit===null?Number.POSITIVE_INFINITY:Math.max((r?.upload_limit||0)-(r?.uploaded_count||0),0),D=r?ke(r.expires_at,de):null,B=!!(r&&(l.length>he||G>me||l.some(t=>t.size>r.max_file_size)||!r.allow_multiple_files&&l.length>1)),Q=async()=>{if(!r||!a||l.length===0)return;const t=[...l],g=new Set;let f=null;try{if(C(null),P(!1),V(null),!r.allow_multiple_files&&t.length>1)throw new Error("This Secure Drop accepts one file at a time.");const b=r.upload_limit===null?Number.POSITIVE_INFINITY:Math.max(r.upload_limit-r.uploaded_count,0);if(t.length>b)throw new Error(`This Secure Drop has space for ${b} more upload${b===1?"":"s"}.`);const y=t.reduce((p,o)=>p+J.estimateEncryptedSize(o.size),0),$=Math.max(r.max_total_size-r.total_uploaded_size,0);if(y>$)throw new Error(`The selected files exceed the remaining ${x($)} total-size allowance.`);for(const p of t)if(p.size>r.max_file_size)throw new Error(`${p.name} is larger than the ${x(r.max_file_size)} file allowance`);f=c({kind:"upload",label:`Sending ${t.length} encrypted file${t.length===1?"":"s"}`,detail:"Encrypting in this browser",progress:0});for(const[p,o]of t.entries()){const U=p/t.length;if(o.size>=H){let s=O.current.get(o);if(!s){h(`Preparing encrypted chunks for ${o.name}...`),n(f,{detail:`Encrypting ${o.name}`,progress:U*100});const I=await J.encryptChunkedForDrop(o,r.public_key,R);h(`Starting secure upload for ${o.name}...`);const T=await ae.start(a,d,I);s={payload:I,session:T},O.current.set(o,s)}for(;s.session.nextOffset<s.session.encryptedSize;){const I=Oe(s.session.nextOffset),T=await s.payload.encryptChunk(I),M=crypto.randomUUID();h(`Uploading ${o.name}...`),E({fileName:o.name,uploadedBytes:s.session.nextOffset,totalBytes:s.session.encryptedSize});const w=await ae.uploadChunk(s.session,T,M);s={...s,session:{...s.session,nextOffset:w.nextOffset}},O.current.set(o,s),E({fileName:o.name,uploadedBytes:w.nextOffset,totalBytes:s.session.encryptedSize});const ge=w.nextOffset/s.session.encryptedSize;if(n(f,{detail:`Uploading ${o.name}`,progress:Math.min(99,(U+ge/t.length)*100)}),w.completed&&w.nextOffset!==s.session.encryptedSize)throw new Error("Secure Drop returned incomplete upload progress")}h(`Verifying ${o.name}...`),O.current.delete(o)}else{h(`Encrypting ${o.name}...`),n(f,{detail:`Encrypting ${o.name}`,progress:U*100});const s=await J.encryptForDrop(o,r.public_key,R);h(`Uploading ${o.name}...`),n(f,{detail:`Uploading ${o.name}`,progress:(U+.55/t.length)*100});const M=await fetch("https://yfjyrgbfgolxydxbkygv.supabase.co/functions/v1/secure-drop-upload",{method:"POST",headers:{Authorization:"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InlmanlyZ2JmZ29seHlkeGJreWd2Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3Njk2NzgwMTMsImV4cCI6MjA4NTI1NDAxM30.ASuCtborBTZcwcrQ21eObvi1OcD30OBHBtQ1FlZWtBU","Content-Type":"application/octet-stream","x-secure-drop-token":a,...d?{"x-secure-drop-passphrase":d}:{},"x-secure-drop-size":String(s.encryptedBlob.size),"x-secure-drop-metadata":Ee({encryptedFileName:s.encryptedFileName,wrappedKey:s.wrappedKey,iv:s.iv,aadVersion:s.aadVersion,ciphertextVersion:s.ciphertextVersion,encryptedMetadata:s.encryptedMetadata,senderNameEncrypted:s.encryptedMetadata.senderNameEncrypted||null})},body:s.encryptedBlob});if(h(`Verifying ${o.name}...`),!M.ok){const w=await M.json().catch(()=>({error:"Upload failed"}));throw new Error(w.error||"Upload failed")}}g.add(o),n(f,{detail:`${o.name} delivered`,progress:(p+1)/t.length*100})}h("Complete"),E(null),P(!0),V({fileCount:t.length,totalBytes:t.reduce((p,o)=>p+o.size,0),completedAt:Date.now()}),Z([]),u(f,`${t.length} encrypted file${t.length===1?"":"s"} delivered`),await _(d)}catch(b){const y=q(b,"Upload could not be completed. Keep this page open and retry the current file.");C(y),g.size>0&&Z($=>$.filter(p=>!g.has(p))),f&&m(f,y,()=>X.current()),h(""),E(null)}};return X.current=Q,ie?e.jsxs(F,{children:[e.jsx(A,{title:"Secure Drop | Tempstash",description:"Open a private encrypted upload request.",noIndex:!0}),e.jsx(ye,{title:"Loading Secure Drop",subtitle:"Checking the encrypted upload session"})]}):N&&!r?e.jsxs(F,{children:[e.jsx(A,{title:"Secure Drop Unavailable | Tempstash",description:"This private Secure Drop link is unavailable.",noIndex:!0}),e.jsxs("div",{className:"drop-public centered",role:"alert",children:[e.jsx(we,{size:56}),e.jsx("h1",{children:"Secure Drop unavailable"}),e.jsx("p",{children:N})]}),e.jsx("style",{children:ne})]}):r?.passphrase_required?e.jsxs(F,{children:[e.jsx(A,{title:"Unlock Secure Drop | Tempstash",description:"Enter the access passphrase for this private Secure Drop link.",noIndex:!0}),e.jsxs("form",{className:"drop-public centered",onSubmit:t=>{t.preventDefault(),_(d)},children:[e.jsx(ve,{size:48}),e.jsx("h1",{children:"Passphrase Required"}),e.jsx("p",{children:"Enter the Secure Drop access passphrase to continue."}),e.jsx("input",{type:"password",autoComplete:"current-password",maxLength:512,value:d,onChange:t=>se(t.target.value),placeholder:"Access passphrase","aria-label":"Secure Drop access passphrase"}),e.jsx("button",{type:"submit",disabled:!d,children:"Unlock Secure Drop"})]}),e.jsx("style",{children:ne})]}):e.jsxs(F,{children:[e.jsx(A,{title:"Secure Drop | Tempstash",description:"Send encrypted files through a private Tempstash Secure Drop link.",noIndex:!0}),e.jsxs("div",{className:"drop-public",children:[e.jsxs("section",{className:"drop-hero",children:[e.jsx(Se,{size:44}),e.jsx("span",{children:"Secure Drop"}),e.jsx("h1",{children:r?.title||"Encrypted Upload"}),r?.owner_display_name&&e.jsxs("div",{className:"owner-chip",children:["Requested by ",r.owner_display_name]}),e.jsx("p",{children:"Your files are encrypted in your browser before being uploaded. Tempstash never sees the plaintext file or filename."}),e.jsx("small",{children:"Powered by Tempstash"})]}),e.jsxs("form",{className:"upload-panel",onSubmit:t=>{t.preventDefault(),Q()},children:[e.jsxs("div",{className:"limits",children:[e.jsxs("span",{children:["Max file: ",x(r?.max_file_size||0)]}),e.jsxs("span",{children:["Remaining uploads: ",r?.upload_limit===null?"Unlimited":Math.max((r?.upload_limit||0)-(r?.uploaded_count||0),0)]}),e.jsxs("span",{title:D?.absolute,children:["Expires: ",D?.relative||"-"]})]}),k&&e.jsxs("section",{className:"upload-receipt",role:"status","aria-live":"polite",children:[e.jsx("span",{className:"receipt-icon",children:e.jsx(Ce,{size:24,"aria-hidden":"true"})}),e.jsxs("div",{children:[e.jsx("span",{className:"receipt-eyebrow",children:"Delivery receipt"}),e.jsxs("h2",{children:[k.fileCount," encrypted file",k.fileCount===1?"":"s"," delivered"]}),e.jsxs("p",{children:[x(k.totalBytes)," was encrypted in this browser and sent to the owner's Google Drive."]}),e.jsxs("small",{children:["Completed ",new Date(k.completedAt).toLocaleStr
1ing()," · You can safely close this page."]})]})]}),e.jsx("input",{maxLength:120,value:R,onChange:t=>oe(t.target.value),placeholder:"Sender name (optional)","aria-label":"Sender name (optional)"}),e.jsx(je,{files:l,multiple:r?.allow_multiple_files,onChange:t=>{Z(t),t.length>0&&(P(!1),V(null),h(""))}}),l.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"selected",children:l.map(t=>e.jsxs("span",{children:[t.name," · ",x(t.size)]},`${t.name}-${t.size}`))}),e.jsxs("section",{className:`upload-confidence ${B?"invalid":""}`,"aria-label":"Upload summary",children:[e.jsxs("div",{className:"confidence-heading",children:[e.jsx(ze,{size:19,"aria-hidden":"true"}),e.jsxs("div",{children:[e.jsx("strong",{children:B?"Review the selected files":"Ready for encrypted delivery"}),e.jsx("span",{children:"Confirm what will be sent before encryption starts."})]})]}),e.jsxs("div",{className:"confidence-grid",children:[e.jsxs("span",{children:[e.jsxs("strong",{children:[l.length," file",l.length===1?"":"s"]}),e.jsxs("small",{children:[x(ue)," selected"]})]}),e.jsxs("span",{children:[e.jsx("strong",{children:x(G)}),e.jsx("small",{children:"Estimated encrypted transfer"})]}),e.jsxs("span",{children:[e.jsx("strong",{children:D?.relative}),e.jsx("small",{children:D?.absolute})]}),e.jsxs("span",{children:[e.jsx("strong",{children:Y?"Passphrase verified":"No access passphrase"}),e.jsx("small",{children:Y?"This upload page was unlocked":"This link did not require one"})]})]}),B&&e.jsx("p",{children:"One or more selected files exceed this drop's file count or size allowance. Remove them before uploading."})]})]}),l.some(t=>t.size>=H)&&e.jsxs("p",{className:"beta-note",role:"note",children:[e.jsx("strong",{children:"Large-file upload beta:"})," files of 50 MB or more upload in encrypted chunks. Keep this page open until it finishes. Report a problem to ",e.jsx("a",{href:"mailto:[email protected]",children:"[email protected]"}),"."]}),N&&e.jsx("p",{className:"error",role:"alert",children:N}),j&&e.jsx("p",{className:"stage",role:"status","aria-live":"polite",children:j}),z&&e.jsxs("div",{className:"upload-progress",role:"status","aria-live":"polite",children:[e.jsx("progress",{"aria-label":"Encrypted upload progress",value:z.uploadedBytes,max:z.totalBytes}),e.jsxs("span",{children:[z.fileName,": ",x(z.uploadedBytes)," of ",x(z.totalBytes)," encrypted"]})]}),le&&e.jsxs("p",{className:"success",role:"status",children:[e.jsx(Ie,{size:16})," Delivery confirmed"]}),e.jsx("div",{className:"upload-submit-row",children:e.jsx("button",{type:"submit",disabled:l.length===0||B||!!j&&j!=="Complete",children:j&&j!=="Complete"?"Encrypting & Uploading...":`Encrypt & Upload${l.length>1?` ${l.length} files`:""}`})})]})]}),e.jsx("style",{children:`
2                .drop-public { width: min(760px, calc(100% - 2rem)); margin: 0 auto; padding: 3rem 0 5rem; color: var(--text-primary); overflow-wrap: anywhere; }
3                .drop-public.centered, .drop-public.loading { min-height: 70vh; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; gap: 1rem; }
4                .drop-hero { text-align: center; display: flex; flex-direction: column; gap: .75rem; align-items: center; margin-bottom: 2rem; }
5                .drop-hero svg { color: var(--accent-color); }
6                .drop-hero span { color: var(--accent-color); text-transform: uppercase; font-size: .8rem; font-weight: 800; letter-spacing: .1em; }
7                .drop-hero h1 { font-size: clamp(2.2rem, 8vw, 4rem); margin: 0; }
8                .owner-chip { border: 1px solid rgba(88,166,255,.28); background: rgba(88,166,255,.1); color: var(--text-primary); border-radius: 999px; padding: .5rem .8rem; font-size: .92rem; font-weight: 800; }
9                .drop-hero p { color: var(--text-secondary); font-size: 1.05rem; max-width: 580px; }
10                .drop-hero small { color: var(--text-secondary); }
11                .upload-panel { display: flex; flex-direction: column; gap: 1rem; background: var(--surface-color); border: 1px solid var(--glass-border); border-radius: var(--radius-xl); padding: 1.5rem; }
12                .limits { display: grid; grid-template-columns: repeat(3, 1fr); gap: .6rem; }
13                .limits span, .selected span { background: rgba(255,255,255,.04); border: 1px solid var(--border-color); border-radius: 8px; padding: .65rem; color: var(--text-secondary); font-size: .85rem; }
14                .selected { display: grid; gap: .45rem; }
15                .upload-receipt {
16                    padding: 1rem;
17                    border: 1px solid rgba(52,199,89,.3);
18                    border-radius: 10px;
19                    display: grid;
20                    grid-template-columns: 42px minmax(0, 1fr);
21                    gap: .8rem;
22                    background: rgba(52,199,89,.07);
23                }
24                .receipt-icon { width: 42px; height: 42px; display: inline-flex; align-items: center; justify-content: center; border-radius: 9px; color: #86efac; background: rgba(52,199,89,.12); }
25                .upload-receipt > div { min-width: 0; display: grid; gap: .22rem; }
26                .receipt-eyebrow { color: #86efac; font-size: .68rem; font-weight: 850; text-transform: uppercase; letter-spacing: .08em; }
27                .upload-receipt h2 { margin: 0; font-size: 1rem; }
28                .upload-receipt p { margin: 0; color: var(--text-secondary); font-size: .82rem; line-height: 1.45; }
29                .upload-receipt small { color: var(--text-secondary); font-size: .72rem; line-height: 1.4; }
30                .upload-confidence { padding: .9rem; border: 1px solid rgba(88,166,255,.25); border-radius: 10px; display: grid; gap: .8rem; background: rgba(88,166,255,.055); }
31                .upload-confidence.invalid { border-color: rgba(248,81,73,.34); background: rgba(248,81,73,.06); }
32                .confidence-heading { display: flex; align-items: center; gap: .6rem; }
33                .confidence-heading > svg { flex: 0 0 auto; color: var(--accent-color); }
34                .upload-confidence.invalid .confidence-heading > svg { color: #ff8f87; }
35                .confidence-heading > div { min-width: 0; display: grid; gap: .12rem; }
36                .confidence-heading strong { font-size: .83rem; }
37                .confidence-heading span { color: var(--text-secondary); font-size: .74rem; }
38                .confidence-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .45rem; }
39                .confidence-grid > span { min-width: 0; padding: .58rem .65rem; border-radius: 8px; display: grid; gap: .15rem; background: rgba(0,0,0,.17); }
40                .confidence-grid strong, .confidence-grid small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
41                .confidence-grid strong { font-size: .78rem; }
42                .confidence-grid small { color: var(--text-secondary); font-size: .68rem; }
43                .upload-confidence > p { margin: 0; color: #ffaaa4; font-size: .76rem; line-height: 1.45; }
44                input { min-height: 44px; border-radius: 8px; border: 1px solid var(--border-color); background: rgba(0,0,0,.35); color: var(--text-primary); padding: .65rem; }
45                button { min-height: 46px; border: 0; border-radius: 10px; background: var(--accent-gradient); color: #0d1117; font-weight: 900; cursor: pointer; }
46                button:disabled { opacity: .5;
46 cursor: not-allowed; }
47                .error { color: #ff453a; }
48                .stage { color: var(--accent-color); font-weight: 700; }
49                .beta-note { margin: 0; padding: .75rem .85rem; border: 1px solid rgba(88, 166, 255, .35); border-radius: 8px; background: rgba(88, 166, 255, .08); color: var(--text-secondary); font-size: .88rem; line-height: 1.5; }
50                .beta-note strong { color: var(--text-primary); }
51                .beta-note a { color: var(--accent-color); }
52                .upload-progress { display: grid; gap: .45rem; color: var(--text-secondary); font-size: .86rem; }
53                .upload-progress progress {
54                    width: 100%;
55                    height: .55rem;
56                    display: block;
57                    overflow: hidden;
58                    border: 0;
59                    border-radius: 999px;
60                    appearance: none;
61                    -webkit-appearance: none;
62                    background: rgba(255,255,255,.09);
63                }
64                .upload-progress progress::-webkit-progress-bar {
65                    border-radius: inherit;
66                    background: rgba(255,255,255,.09);
67                }
68                .upload-progress progress::-webkit-progress-value {
69                    border-radius: inherit;
70                    background: var(--accent-color);
71                }
72                .upload-progress progress::-moz-progress-bar {
73                    border-radius: inherit;
74                    background: var(--accent-color);
75                }
76                .success { display: inline-flex; align-items: center; gap: .4rem; color: #34c759; font-weight: 800; }
77                .upload-submit-row { display: flex; }
78                .upload-submit-row > button { width: 100%; }
79                @media (max-width: 700px) {
80                    .drop-public { padding: 2rem 0 3.5rem; }
81                    .drop-public.centered { min-height: 55vh; padding-inline: .5rem; }
82                    .drop-public.centered h1 { margin: .25rem 0; font-size: 1.9rem; line-height: 1.2; }
83                    .drop-hero { margin-bottom: 1.5rem; }
84                    .drop-hero h1 { font-size: 2.15rem; line-height: 1.12; }
85                    .drop-hero p { margin: .25rem 0; font-size: .95rem; line-height: 1.55; }
86                    .upload-panel { padding: 1rem; border-radius: 16px; }
87                    .limits { grid-template-columns: 1fr; }
88                    .confidence-grid { grid-template-columns: 1fr; }
89                    .selected span { overflow-wrap: anywhere; }
90                    .drop-public button, .drop-public input { width: 100%; min-height: 48px; }
91                    .upload-submit-row { position: sticky; z-index: 5; bottom: 0; margin: .25rem -1rem -1rem; padding: .75rem 1rem calc(.75rem + env(safe-area-inset-bottom)); border-top: 1px solid var(--border-color); background: rgba(22,27,34,.96); backdrop-filter: blur(14px); }
92                }
93            `})]})},ne=`
94    .drop-public.centered {
95        width: min(100% - 2rem, 560px);
96        min-height: 58vh;
97        margin: 0 auto;
98        padding: 3rem 0;
99        display: flex;
100        flex-direction: column;
101        align-items: center;
102        justify-content: center;
103        gap: 1rem;
104        color: var(--text-secondary);
105        text-align: center;
106        overflow-wrap: anywhere;
107    }
108    .drop-public.centered svg { color: var(--accent-color); }
109    .drop-public.centered h1 { margin: .35rem 0 0; color: var(--text-primary); font-size: clamp(1.85rem, 7vw, 2.6rem); line-height: 1.15; }
110    .drop-public.centered p { margin: 0; line-height: 1.55; }
111    .drop-public.centered input { width: min(100%, 420px); min-height: 48px; padding: 0 .9rem; border: 1px solid var(--border-color); border-radius: 12px; background: var(--input-bg); color: var(--text-primary); }
112    .drop-public.centered button { width: min(100%, 420px); min-height: 48px; padding: 0 1rem; border-radius: 12px; background: var(--accent-color); color: #0d1117; font-weight: 800; }
113    .drop-public.centered button:disabled { opacity: .45; }
114    @media (max-width: 520px) {
115        .drop-public.centered { min-height: 52vh; padding: 2rem 0; }
116        .drop-public.centered input, .drop-public.centered button { width: 100%; }
117    }
118`;export{Re as SecureDropUpload};

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.