@masters-union/union-stack 0.3.16 → 0.3.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/cdn/loader.v1.global.js +2 -2
  2. package/dist/cdn/loader.v1.global.js.map +1 -1
  3. package/dist/{chunk-3FCZBKNN.cjs → chunk-4645KBSE.cjs} +8 -8
  4. package/dist/{chunk-3FCZBKNN.cjs.map → chunk-4645KBSE.cjs.map} +1 -1
  5. package/dist/{chunk-XBQENFBZ.js → chunk-G2H5WZDV.js} +14 -12
  6. package/dist/chunk-G2H5WZDV.js.map +1 -0
  7. package/dist/{chunk-EBE7EIOZ.cjs → chunk-PVM2ZX45.cjs} +14 -14
  8. package/dist/{chunk-EBE7EIOZ.cjs.map → chunk-PVM2ZX45.cjs.map} +1 -1
  9. package/dist/{chunk-OZGVTEMZ.js → chunk-QQFNG3ZF.js} +4 -4
  10. package/dist/{chunk-OZGVTEMZ.js.map → chunk-QQFNG3ZF.js.map} +1 -1
  11. package/dist/{chunk-7NJTA5ZD.js → chunk-RYS4MXXL.js} +4 -4
  12. package/dist/{chunk-7NJTA5ZD.js.map → chunk-RYS4MXXL.js.map} +1 -1
  13. package/dist/{chunk-GTE65IAM.cjs → chunk-TQDC5KIC.cjs} +14 -12
  14. package/dist/chunk-TQDC5KIC.cjs.map +1 -0
  15. package/dist/{client-BCLIIiX2.d.ts → client-BofkorBV.d.ts} +1 -1
  16. package/dist/{client-CSZ-4GVl.d.cts → client-C_pEvbZS.d.cts} +1 -1
  17. package/dist/index.cjs +5 -5
  18. package/dist/index.d.cts +3 -3
  19. package/dist/index.d.ts +3 -3
  20. package/dist/index.js +4 -4
  21. package/dist/node.cjs +8 -8
  22. package/dist/node.d.cts +2 -2
  23. package/dist/node.d.ts +2 -2
  24. package/dist/node.js +2 -2
  25. package/dist/picker.cjs +3 -3
  26. package/dist/picker.d.cts +3 -3
  27. package/dist/picker.d.ts +3 -3
  28. package/dist/picker.js +1 -1
  29. package/dist/react.cjs +4 -4
  30. package/dist/react.d.cts +4 -4
  31. package/dist/react.d.ts +4 -4
  32. package/dist/react.js +3 -3
  33. package/dist/{types-BWs1slkL.d.cts → types-BsGu9Oi3.d.cts} +2 -0
  34. package/dist/{types-BWs1slkL.d.ts → types-BsGu9Oi3.d.ts} +2 -0
  35. package/package.json +1 -1
  36. package/dist/chunk-GTE65IAM.cjs.map +0 -1
  37. package/dist/chunk-XBQENFBZ.js.map +0 -1
@@ -1,4 +1,4 @@
1
- "use strict";var UnionStack=(()=>{var K=Object.defineProperty,$e=Object.defineProperties,Re=Object.getOwnPropertyDescriptor,Te=Object.getOwnPropertyDescriptors,Pe=Object.getOwnPropertyNames,ne=Object.getOwnPropertySymbols;var ae=Object.prototype.hasOwnProperty,Me=Object.prototype.propertyIsEnumerable;var se=(n,e,t)=>e in n?K(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,C=(n,e)=>{for(var t in e||(e={}))ae.call(e,t)&&se(n,t,e[t]);if(ne)for(var t of ne(e))Me.call(e,t)&&se(n,t,e[t]);return n},$=(n,e)=>$e(n,Te(e));var W=(n,e)=>()=>(n&&(e=n(n=0)),e);var le=(n,e)=>{for(var t in e)K(n,t,{get:e[t],enumerable:!0})},Se=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Pe(e))!ae.call(n,o)&&o!==t&&K(n,o,{get:()=>e[o],enumerable:!(i=Re(e,o))||i.enumerable});return n};var Le=n=>Se(K({},"__esModule",{value:!0}),n);function v(n,e,t={}){var i;return{code:n,message:e,status:t.status,retryable:(i=t.retryable)!=null?i:Fe(n,t.status),cause:t.cause}}function Fe(n,e){return!!(n==="NETWORK"||n==="PART_FAILED"||n==="SERVER"&&e&&e>=500)}function de(n,e){let t=e==null?void 0:e.error,i=(t==null?void 0:t.message)||`Request failed with status ${n}`,o=((t==null?void 0:t.code)||"").toUpperCase();if(n===401)return v("AUTH",i,{status:n,retryable:!1});if(n===403)return v("AUTH",i,{status:n,retryable:!1});if(n===413)return v("VALIDATION",i,{status:n,retryable:!1});if(n===415)return v("VALIDATION",i,{status:n,retryable:!1});if(n===422)return o==="EMPTY_UPLOAD"?v("EMPTY_FILE",j,{status:n,retryable:!1}):v("VALIDATION",i,{status:n,retryable:!1});if(n===426)return v("CONFIG",i,{status:n,retryable:!1});if(n===429){let r=o==="QUOTA_EXCEEDED";return v(r?"QUOTA":"NETWORK",i,{status:n,retryable:!r})}return n>=500?v("SERVER",i,{status:n,retryable:!0}):v("SERVER",i,{status:n,retryable:!1})}var j,V=W(()=>{"use strict";j="This file is empty (0 bytes) and can't be uploaded. If it's stored in iCloud, OneDrive, or Google Drive, open it once to download it to this device, then try again."});function Oe(){if(document.getElementById(fe))return;let n=(t,i)=>{let o=document.createElement("link");o.rel="preconnect",o.href=t,i&&(o.crossOrigin="anonymous"),document.head.appendChild(o)};n("https://fonts.googleapis.com"),n("https://fonts.gstatic.com",!0);let e=document.createElement("link");e.id=fe,e.rel="stylesheet",e.href=je,document.head.appendChild(e)}function ge(){if(typeof document=="undefined"||(Oe(),document.getElementById(me)))return;let n=document.createElement("style");n.id=me,n.textContent=We,document.head.appendChild(n)}function ve(n){var i,o,r,s,a;let t=((n==null?void 0:n.mode)||"light")==="dark"?Ne:_e;return{"--us-primary":(i=n==null?void 0:n.primary)!=null?i:t.primary,"--us-on-primary":t.onPrimary,"--us-bg":(o=n==null?void 0:n.background)!=null?o:t.background,"--us-fg":(r=n==null?void 0:n.foreground)!=null?r:t.foreground,"--us-muted":t.muted,"--us-border":(s=n==null?void 0:n.border)!=null?s:t.border,"--us-subtle":"color-mix(in srgb, var(--us-fg) 5%, var(--us-bg))","--us-overlay":"color-mix(in srgb, var(--us-fg) 9%, var(--us-bg))","--us-border-strong":"color-mix(in srgb, var(--us-fg) 18%, var(--us-border))","--us-elevated":t.elevated,"--us-raised":t.raised,"--us-accent":t.accent,"--us-success":t.success,"--us-danger":t.danger,"--us-radius":(a=n==null?void 0:n.radius)!=null?a:"12px"}}var me,fe,je,_e,Ne,We,be=W(()=>{"use strict";me="unionstack-picker-styles",fe="unionstack-picker-fonts",je="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap";_e={primary:"#494bd6",onPrimary:"#ffffff",background:"#fdfbff",foreground:"#1b1b21",muted:"#5e5c6e",subtle:"#f3f1fa",border:"#e4e1ee",borderStrong:"#c8c5d4",elevated:"#ffffff",overlay:"#eceaf4",raised:"#ffffff",accent:"#b35a00",success:"#2c9a5b",danger:"#ba1a1a"},Ne={primary:"#f4f4f5",onPrimary:"#18181b",background:"#0a0a0c",foreground:"#f4f4f5",muted:"#8b8b93",subtle:"#161618",border:"#2a2a2e",borderStrong:"#3f3f46",elevated:"#141416",overlay:"#1d1d20",raised:"#27272a",accent:"#ffb783",success:"#7ad08e",danger:"#ffb4ab"},We=`
1
+ "use strict";var UnionStack=(()=>{var K=Object.defineProperty,$e=Object.defineProperties,Re=Object.getOwnPropertyDescriptor,Te=Object.getOwnPropertyDescriptors,Pe=Object.getOwnPropertyNames,ne=Object.getOwnPropertySymbols;var ae=Object.prototype.hasOwnProperty,Me=Object.prototype.propertyIsEnumerable;var se=(n,e,t)=>e in n?K(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,C=(n,e)=>{for(var t in e||(e={}))ae.call(e,t)&&se(n,t,e[t]);if(ne)for(var t of ne(e))Me.call(e,t)&&se(n,t,e[t]);return n},$=(n,e)=>$e(n,Te(e));var W=(n,e)=>()=>(n&&(e=n(n=0)),e);var le=(n,e)=>{for(var t in e)K(n,t,{get:e[t],enumerable:!0})},Se=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Pe(e))!ae.call(n,o)&&o!==t&&K(n,o,{get:()=>e[o],enumerable:!(i=Re(e,o))||i.enumerable});return n};var Le=n=>Se(K({},"__esModule",{value:!0}),n);function v(n,e,t={}){var i;return{code:n,message:e,status:t.status,retryable:(i=t.retryable)!=null?i:Fe(n,t.status),docs:t.docs,cause:t.cause}}function Fe(n,e){return!!(n==="NETWORK"||n==="PART_FAILED"||n==="SERVER"&&e&&e>=500)}function de(n,e){let t=e==null?void 0:e.error,i=(t==null?void 0:t.message)||`Request failed with status ${n}`,o=((t==null?void 0:t.code)||"").toUpperCase(),r=typeof(t==null?void 0:t.docs)=="string"?t.docs:void 0;if(n===401)return v("AUTH",i,{status:n,retryable:!1,docs:r});if(n===403)return v("AUTH",i,{status:n,retryable:!1,docs:r});if(n===413)return v("VALIDATION",i,{status:n,retryable:!1,docs:r});if(n===415)return v("VALIDATION",i,{status:n,retryable:!1,docs:r});if(n===422)return o==="EMPTY_UPLOAD"?v("EMPTY_FILE",j,{status:n,retryable:!1,docs:r}):v("VALIDATION",i,{status:n,retryable:!1,docs:r});if(n===426)return v("CONFIG",i,{status:n,retryable:!1,docs:r});if(n===429){let s=o==="QUOTA_EXCEEDED";return v(s?"QUOTA":"NETWORK",i,{status:n,retryable:!s,docs:r})}return n>=500?v("SERVER",i,{status:n,retryable:!0,docs:r}):v("SERVER",i,{status:n,retryable:!1,docs:r})}var j,V=W(()=>{"use strict";j="This file is empty (0 bytes) and can't be uploaded. If it's stored in iCloud, OneDrive, or Google Drive, open it once to download it to this device, then try again."});function Oe(){if(document.getElementById(fe))return;let n=(t,i)=>{let o=document.createElement("link");o.rel="preconnect",o.href=t,i&&(o.crossOrigin="anonymous"),document.head.appendChild(o)};n("https://fonts.googleapis.com"),n("https://fonts.gstatic.com",!0);let e=document.createElement("link");e.id=fe,e.rel="stylesheet",e.href=je,document.head.appendChild(e)}function ge(){if(typeof document=="undefined"||(Oe(),document.getElementById(me)))return;let n=document.createElement("style");n.id=me,n.textContent=We,document.head.appendChild(n)}function ve(n){var i,o,r,s,a;let t=((n==null?void 0:n.mode)||"light")==="dark"?Ne:_e;return{"--us-primary":(i=n==null?void 0:n.primary)!=null?i:t.primary,"--us-on-primary":t.onPrimary,"--us-bg":(o=n==null?void 0:n.background)!=null?o:t.background,"--us-fg":(r=n==null?void 0:n.foreground)!=null?r:t.foreground,"--us-muted":t.muted,"--us-border":(s=n==null?void 0:n.border)!=null?s:t.border,"--us-subtle":"color-mix(in srgb, var(--us-fg) 5%, var(--us-bg))","--us-overlay":"color-mix(in srgb, var(--us-fg) 9%, var(--us-bg))","--us-border-strong":"color-mix(in srgb, var(--us-fg) 18%, var(--us-border))","--us-elevated":t.elevated,"--us-raised":t.raised,"--us-accent":t.accent,"--us-success":t.success,"--us-danger":t.danger,"--us-radius":(a=n==null?void 0:n.radius)!=null?a:"12px"}}var me,fe,je,_e,Ne,We,be=W(()=>{"use strict";me="unionstack-picker-styles",fe="unionstack-picker-fonts",je="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap";_e={primary:"#494bd6",onPrimary:"#ffffff",background:"#fdfbff",foreground:"#1b1b21",muted:"#5e5c6e",subtle:"#f3f1fa",border:"#e4e1ee",borderStrong:"#c8c5d4",elevated:"#ffffff",overlay:"#eceaf4",raised:"#ffffff",accent:"#b35a00",success:"#2c9a5b",danger:"#ba1a1a"},Ne={primary:"#f4f4f5",onPrimary:"#18181b",background:"#0a0a0c",foreground:"#f4f4f5",muted:"#8b8b93",subtle:"#161618",border:"#2a2a2e",borderStrong:"#3f3f46",elevated:"#141416",overlay:"#1d1d20",raised:"#27272a",accent:"#ffb783",success:"#7ad08e",danger:"#ffb4ab"},We=`
2
2
  .us-picker-backdrop {
3
3
  --us-font: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
4
4
  --us-mono: "JetBrains Mono", ui-monospace, "SF Mono", Menlo, monospace;
@@ -540,5 +540,5 @@
540
540
 
541
541
  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 empty state niceties \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
542
542
  .us-file-list:empty { display: none; }
543
- `});function w(n,e,t){let i=document.createElement(n);return e&&(i.className=e),t!==void 0&&(i.textContent=t),i}function X(n,e){let t=document.createElement("button");return t.type="button",t.className="us-tool",t.innerHTML=`${e} <span>${qe(n)}</span>`,t}function qe(n){return n.replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[e])}function x(n,e,t){return Math.max(e,Math.min(t,n))}function ye(n){return new Promise((e,t)=>{let i=URL.createObjectURL(n),o=new Image;o.onload=()=>{URL.revokeObjectURL(i),e(o)},o.onerror=()=>{URL.revokeObjectURL(i),t(new Error("decode failed"))},o.src=i})}function xe(n){return/^image\/(png|webp|gif)$/.test(n)}var L,G,ke=W(()=>{"use strict";L={back:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><polyline points="15 18 9 12 15 6"/></svg>',crop:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M6 2v14a2 2 0 0 0 2 2h14"/><path d="M18 22V8a2 2 0 0 0-2-2H2"/></svg>',circle:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/></svg>',rotate:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12a9 9 0 1 1-9-9c2.52 0 4.82.93 6.58 2.46L21 8"/><path d="M21 3v5h-5"/></svg>',undo:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M3 7v6h6"/><path d="M21 17a9 9 0 0 0-15-6.7L3 13"/></svg>',check:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>'},G=class{constructor(e){this.opts=e;this.cropBox=null;this.hasAlpha=!1;this.mode="none";this.cropRect=null;this.dragKind=null;this.dragStart=null;this.onPointerMove=e=>{if(!this.dragKind||!this.dragStart||!this.cropRect)return;let t=this.canvasMetrics(),i=(e.clientX-this.dragStart.px)/(t.scaleX||1),o=(e.clientY-this.dragStart.py)/(t.scaleY||1),r=this.dragStart.rect,s=this.working.width,a=this.working.height,l=this.minCropImg();if(this.aspect&&this.dragKind!=="move"){switch(this.dragKind){case"se":this.cropRect=this.lockedRectFromDrag(r.x,r.y,r.w+i,1,1);break;case"nw":{let u=r.x+r.w,h=r.y+r.h;this.cropRect=this.lockedRectFromDrag(u,h,u-(r.x+i),-1,-1);break}case"ne":{let u=r.y+r.h;this.cropRect=this.lockedRectFromDrag(r.x,u,r.w+i,1,-1);break}case"sw":{let u=r.x+r.w;this.cropRect=this.lockedRectFromDrag(u,r.y,u-(r.x+i),-1,1);break}}this.updateCropBox();return}let{x:d,y:c,w:p,h:f}=r;switch(this.dragKind){case"move":d=x(r.x+i,0,s-r.w),c=x(r.y+o,0,a-r.h);break;case"nw":{let u=x(r.x+i,0,r.x+r.w-l),h=x(r.y+o,0,r.y+r.h-l);p=r.w+(r.x-u),f=r.h+(r.y-h),d=u,c=h;break}case"ne":{let u=x(r.w+i,l,s-r.x),h=x(r.y+o,0,r.y+r.h-l);f=r.h+(r.y-h),p=u,c=h;break}case"sw":{let u=x(r.x+i,0,r.x+r.w-l),h=x(r.h+o,l,a-r.y);p=r.w+(r.x-u),f=h,d=u;break}case"se":p=x(r.w+i,l,s-r.x),f=x(r.h+o,l,a-r.y);break}this.cropRect={x:d,y:c,w:p,h:f},this.updateCropBox()};this.onPointerUp=()=>{this.dragKind=null,this.dragStart=null,document.removeEventListener("pointermove",this.onPointerMove),document.removeEventListener("pointerup",this.onPointerUp)}}get aspect(){let e=this.opts.lockedAspect;return e&&e.width>0&&e.height>0?e.width/e.height:null}async open(){this.mount();try{await this.loadOriginalIntoWorking(),this.opts.originalFile&&this.opts.originalFile!==this.opts.file&&this.markEdited(!0),this.draw()}catch(e){this.canvasWrap.textContent=`Couldn't load image: ${e.message}`}}close(){document.removeEventListener("pointermove",this.onPointerMove),document.removeEventListener("pointerup",this.onPointerUp),this.root.remove()}mount(){this.root=w("div","us-editor");let e=w("div","us-editor-header"),t=document.createElement("button");t.type="button",t.className="us-editor-back",t.setAttribute("aria-label","Back"),t.innerHTML=L.back,t.onclick=()=>{this.opts.onCancel(),this.close()},e.appendChild(t),e.appendChild(w("div","us-editor-title",this.opts.title)),this.root.appendChild(e),this.canvasWrap=w("div","us-editor-canvas-wrap"),this.displayCanvas=document.createElement("canvas"),this.displayCanvas.className="us-editor-canvas",this.canvasWrap.appendChild(this.displayCanvas),this.root.appendChild(this.canvasWrap),this.cropDims=w("div","us-crop-dims"),this.cropDims.hidden=!0,this.widthInput=this.makeDimInput("Crop width in pixels","w"),this.heightInput=this.makeDimInput("Crop height in pixels","h"),this.cropDims.appendChild(w("span","us-crop-dims-label","Crop size")),this.cropDims.appendChild(this.widthInput),this.cropDims.appendChild(w("span","us-crop-dims-x","\xD7")),this.cropDims.appendChild(this.heightInput),this.cropDims.appendChild(w("span","us-crop-dims-unit","px")),this.root.appendChild(this.cropDims);let i=w("div","us-editor-toolbar");this.cropTool=X("Crop",L.crop),this.cropTool.onclick=()=>this.toggleCropMode(),this.circleTool=X("Circle",L.circle),this.circleTool.onclick=()=>this.applyCircle(),this.rotateTool=X("Rotate 90\xB0",L.rotate),this.rotateTool.onclick=()=>this.applyRotate(),this.revertTool=X("Revert",L.undo),this.revertTool.onclick=()=>this.revert(),this.revertTool.disabled=!0,i.appendChild(this.cropTool),i.appendChild(this.circleTool),i.appendChild(this.rotateTool),i.appendChild(w("div","us-tool-spacer")),i.appendChild(this.revertTool),this.root.appendChild(i);let o=w("div","us-editor-footer"),r=document.createElement("button");r.type="button",r.className="us-btn",r.textContent="Cancel",r.onclick=()=>{this.opts.onCancel(),this.close()},this.applyBtn=document.createElement("button"),this.applyBtn.type="button",this.applyBtn.className="us-btn us-btn-primary",this.applyBtn.innerHTML=`${L.check} <span>Apply</span>`,this.applyBtn.onclick=()=>this.applyAndClose(),o.appendChild(r),o.appendChild(this.applyBtn),this.root.appendChild(o),this.opts.host.appendChild(this.root)}async loadOriginalIntoWorking(){let e=await ye(this.opts.file),t=document.createElement("canvas");t.width=e.naturalWidth,t.height=e.naturalHeight;let i=t.getContext("2d");if(!i)throw new Error("Canvas 2D context unavailable");i.drawImage(e,0,0),this.working=t,this.hasAlpha=xe(this.opts.file.type),this.markEdited(!1)}async loadTrueOriginalIntoWorking(){var r;let e=(r=this.opts.originalFile)!=null?r:this.opts.file,t=await ye(e),i=document.createElement("canvas");i.width=t.naturalWidth,i.height=t.naturalHeight;let o=i.getContext("2d");if(!o)throw new Error("Canvas 2D context unavailable");o.drawImage(t,0,0),this.working=i,this.hasAlpha=xe(e.type),this.markEdited(!1)}draw(){let{width:e,height:t}=this.working,i=Math.min(1,720/Math.max(e,t)),o=Math.max(1,Math.round(e*i)),r=Math.max(1,Math.round(t*i));this.displayCanvas.width=o,this.displayCanvas.height=r;let s=this.displayCanvas.getContext("2d");s&&(s.clearRect(0,0,o,r),s.drawImage(this.working,0,0,o,r),this.updateCropBox())}toggleCropMode(){this.mode==="crop"?this.applyCrop():this.enterCropMode()}enterCropMode(){this.mode="crop",this.cropTool.dataset.active="true",this.cropTool.innerHTML=`${L.check} <span>Apply crop</span>`;let e=this.working.width,t=this.working.height;if(this.aspect){let o=this.aspect,r=this.minCropImg(),s=e,a=s/o;a>t&&(a=t,s=a*o),s=s*.9,a=s/o,s<r&&(s=r,a=s/o),a<r&&(a=r,s=a*o),s>e&&(s=e,a=s/o),a>t&&(a=t,s=a*o),this.cropRect={x:Math.round((e-s)/2),y:Math.round((t-a)/2),w:s,h:a}}else{let o=Math.round(Math.min(e,t)*.1);this.cropRect={x:o,y:o,w:e-o*2,h:t-o*2}}this.renderCropBox();let i=this.aspect!==null;this.widthInput.readOnly=i,this.heightInput.readOnly=i,this.cropDims.dataset.locked=i?"true":"false",this.cropDims.hidden=!1,this.syncCropDimsInputs()}exitCropMode(){this.mode="none",this.cropTool.removeAttribute("data-active"),this.cropTool.innerHTML=`${L.crop} <span>Crop</span>`,this.cropRect=null,this.cropBox&&(this.cropBox.remove(),this.cropBox=null),this.cropDims.hidden=!0}makeDimInput(e,t){let i=document.createElement("input");return i.type="number",i.min="1",i.inputMode="numeric",i.className="us-crop-dim-input",i.setAttribute("aria-label",e),i.addEventListener("input",()=>this.onDimInput(t)),i.addEventListener("change",()=>this.syncCropDimsInputs()),i}syncCropDimsInputs(){if(!this.cropRect||!this.widthInput||!this.heightInput)return;let e=Math.max(1,Math.round(this.cropRect.w)),t=Math.max(1,Math.round(this.cropRect.h));document.activeElement!==this.widthInput&&(this.widthInput.value=String(e)),document.activeElement!==this.heightInput&&(this.heightInput.value=String(t))}onDimInput(e){if(this.aspect!==null||!this.cropRect)return;let t=e==="w"?this.widthInput:this.heightInput,i=parseInt(t.value,10);if(!Number.isFinite(i)||i<=0)return;let o=this.minCropImg();if(e==="w"){let r=this.working.width-this.cropRect.x;this.cropRect=$(C({},this.cropRect),{w:x(i,o,r)})}else{let r=this.working.height-this.cropRect.y;this.cropRect=$(C({},this.cropRect),{h:x(i,o,r)})}this.updateCropBox()}renderCropBox(){if(!this.cropRect)return;this.cropBox&&this.cropBox.remove();let e=w("div","us-crop-box");for(let t of["nw","ne","sw","se"]){let i=w("div","us-crop-handle");i.dataset.pos=t,i.addEventListener("pointerdown",o=>this.beginDrag(o,t)),e.appendChild(i)}e.addEventListener("pointerdown",t=>{t.target.classList.contains("us-crop-handle")||this.beginDrag(t,"move")}),this.canvasWrap.appendChild(e),this.cropBox=e,this.updateCropBox()}canvasMetrics(){let e=this.displayCanvas.getBoundingClientRect(),t=this.canvasWrap.getBoundingClientRect();return{scaleX:e.width/(this.working.width||1),scaleY:e.height/(this.working.height||1),offX:e.left-t.left,offY:e.top-t.top}}minCropImg(){let{scaleX:e}=this.canvasMetrics();return e>0?24/e:24}updateCropBox(){if(!this.cropBox||!this.cropRect)return;let e=this.canvasMetrics();this.cropBox.style.left=`${e.offX+this.cropRect.x*e.scaleX}px`,this.cropBox.style.top=`${e.offY+this.cropRect.y*e.scaleY}px`,this.cropBox.style.width=`${this.cropRect.w*e.scaleX}px`,this.cropBox.style.height=`${this.cropRect.h*e.scaleY}px`,this.syncCropDimsInputs()}beginDrag(e,t){this.cropRect&&(e.preventDefault(),this.dragKind=t,this.dragStart={px:e.clientX,py:e.clientY,rect:C({},this.cropRect)},document.addEventListener("pointermove",this.onPointerMove),document.addEventListener("pointerup",this.onPointerUp))}lockedRectFromDrag(e,t,i,o,r){let s=this.aspect,a=this.working.width,l=this.working.height,d=this.minCropImg(),c=Math.max(d,i),p=c/s;p<d&&(p=d,c=p*s);let f=o>0?a-e:e,u=r>0?l-t:t;c=Math.min(c,f,u*s),p=c/s;let h=o>0?e:e-c,R=r>0?t:t-p;return{x:h,y:R,w:c,h:p}}applyCrop(){var a,l;if(!this.cropRect){this.exitCropMode();return}let e=x(Math.round(this.cropRect.x),0,this.working.width-1),t=x(Math.round(this.cropRect.y),0,this.working.height-1),i=x(Math.round(this.cropRect.w),1,this.working.width-e),o=x(Math.round(this.cropRect.h),1,this.working.height-t),r=document.createElement("canvas");r.width=i,r.height=o;let s=r.getContext("2d");s&&(s.drawImage(this.working,e,t,i,o,0,0,i,o),this.working=r,this.exitCropMode(),this.markEdited(!0),(l=(a=this.opts).onCropApplied)==null||l.call(a),this.draw())}applyRotate(){var r,s;let{width:e,height:t}=this.working,i=document.createElement("canvas");i.width=t,i.height=e;let o=i.getContext("2d");o&&(o.translate(t,0),o.rotate(Math.PI/2),o.drawImage(this.working,0,0),this.working=i,this.exitCropMode(),this.markEdited(!0),(s=(r=this.opts).onAspectReset)==null||s.call(r),this.draw())}applyCircle(){var l,d;let{width:e,height:t}=this.working,i=Math.min(e,t),o=Math.round((e-i)/2),r=Math.round((t-i)/2),s=document.createElement("canvas");s.width=i,s.height=i;let a=s.getContext("2d");a&&(a.save(),a.beginPath(),a.arc(i/2,i/2,i/2,0,Math.PI*2),a.closePath(),a.clip(),a.drawImage(this.working,o,r,i,i,0,0,i,i),a.restore(),this.working=s,this.hasAlpha=!0,this.exitCropMode(),this.markEdited(!0),(d=(l=this.opts).onAspectReset)==null||d.call(l),this.draw())}async revert(){var e,t;await this.loadTrueOriginalIntoWorking(),this.exitCropMode(),(t=(e=this.opts).onAspectReset)==null||t.call(e),this.draw()}markEdited(e){this.revertTool.disabled=!e}async applyAndClose(){this.applyBtn.disabled=!0,this.mode==="crop"&&this.applyCrop();try{let e=await this.exportFile();this.opts.onApply(e),this.close()}catch(e){this.applyBtn.disabled=!1,console.error("[union-stack] image export failed",e)}}exportFile(){return new Promise((e,t)=>{let i=this.hasAlpha?"image/png":"image/jpeg",o=i==="image/jpeg"?.92:void 0;this.working.toBlob(r=>{if(!r)return t(new Error("toBlob returned null"));let s=this.opts.file.name.replace(/\.[^.]+$/,""),a=i==="image/png"?"png":"jpg";e(new File([r],`${s}-edited.${a}`,{type:i}))},i,o)})}}});function Ke(n,e){var a,l,d,c,p,f,u,h,R,F,M,S,k,E,I,g,T,y,_,q,A,B,z,U,P,N,te,re;let t=C({},e),i=e.branding||{};t.branding={logoUrl:(l=(a=i.logoUrl)!=null?a:n.branding.logoUrl)!=null?l:void 0,title:(c=(d=i.title)!=null?d:n.branding.title)!=null?c:void 0,hideFooter:(p=i.hideFooter)!=null?p:n.branding.hideFooter};let o=e.theme||{};if(t.theme={primary:(u=(f=o.primary)!=null?f:n.theme.primary)!=null?u:void 0,background:(R=(h=o.background)!=null?h:n.theme.background)!=null?R:void 0,foreground:(M=(F=o.foreground)!=null?F:n.theme.foreground)!=null?M:void 0,border:(k=(S=o.border)!=null?S:n.theme.border)!=null?k:void 0,radius:(I=(E=o.radius)!=null?E:n.theme.radius)!=null?I:void 0,mode:(T=(g=o.mode)!=null?g:n.theme.mode)!=null?T:void 0},t.maxFileSize=(y=e.maxFileSize)!=null?y:n.constraints.maxFileSizeBytes,t.maxFiles=(_=e.maxFiles)!=null?_:n.constraints.maxFilesPerUpload,!e.accept&&((q=n.constraints.allowedMimeTypes)!=null&&q.length)){let oe=n.constraints.allowedMimeTypes.filter(Ue=>Ue!=="*/*");oe.length>0&&(t.accept=oe.join(","))}let r=(A=n.image)!=null?A:null,s=(B=e.cropAspectRatio)!=null?B:r&&r.cropRatioW&&r.cropRatioH?{width:r.cropRatioW,height:r.cropRatioH}:void 0;return t.cropAspectRatio=s,t.forceCrop=((U=(z=e.forceCrop)!=null?z:r==null?void 0:r.forceCrop)!=null?U:!1)&&!!s&&e.imageEditing!==!1,t.minImageWidth=(N=(P=e.minImageWidth)!=null?P:r==null?void 0:r.minWidth)!=null?N:void 0,t.minImageHeight=(re=(te=e.minImageHeight)!=null?te:r==null?void 0:r.minHeight)!=null?re:void 0,t}function J(n){return n?n.startsWith("image/")?b.image:n.startsWith("video/")?b.video:n.startsWith("audio/")?b.audio:n==="application/pdf"?b.pdf:n.startsWith("application/zip")||n.includes("compressed")||n==="application/x-tar"||n==="application/gzip"?b.archive:b.file:b.file}function m(n,e,t){let i=document.createElement(n);return e&&(i.className=e),t!==void 0&&(i.textContent=t),i}function Je(n){var i,o,r;let e=n.trim().toLowerCase();if(!e)return"";if(e.endsWith("/*")||!e.includes("/")){let s=e.replace("/*","");return(i=Ge[s])!=null?i:s.charAt(0).toUpperCase()+s.slice(1)}if(we[e])return we[e];if(e.startsWith("."))return e.slice(1).toUpperCase();let t=(o=e.split("/")[1])!=null?o:e;return((r=t.split("+")[0].split(".").pop())!=null?r:t).toUpperCase()}function O(n){return n<1024?`${n} B`:n<1024*1024?`${(n/1024).toFixed(1)} KB`:n<1024*1024*1024?`${(n/1024/1024).toFixed(1)} MB`:`${(n/1024/1024/1024).toFixed(2)} GB`}function Q(){return typeof crypto!="undefined"&&"randomUUID"in crypto?crypto.randomUUID().replace(/-/g,""):Math.random().toString(36).slice(2)+Date.now().toString(36)}async function Qe(n){var e;if(typeof createImageBitmap=="function")try{let t=await createImageBitmap(n),i=t.width,o=t.height;return(e=t.close)==null||e.call(t),{w:i,h:o}}catch(t){}return new Promise((t,i)=>{if(typeof URL=="undefined"||!URL.createObjectURL){i(new Error("no object URL support"));return}let o=URL.createObjectURL(n),r=new Image;r.onload=()=>{URL.revokeObjectURL(o),t({w:r.naturalWidth,h:r.naturalHeight})},r.onerror=()=>{URL.revokeObjectURL(o),i(new Error("decode failed"))},r.src=o})}async function Ze(n){let e;try{e=await fetch(n,{mode:"cors",credentials:"omit"})}catch(r){throw new Error(`Could not reach ${et(n)} \u2014 check the URL or CORS.`)}if(!e.ok)throw new Error(`Server returned ${e.status} \u2014 file unavailable.`);let t=await e.blob(),i=tt(n)||"download",o=t.type||it(i);return new File([t],i,{type:o})}function et(n){try{return new URL(n).host}catch(e){return"that host"}}function tt(n){try{let t=new URL(n).pathname.split("/").filter(Boolean).pop();return t?decodeURIComponent(t):""}catch(e){return""}}function it(n){let e=n.toLowerCase().split(".").pop()||"";return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",svg:"image/svg+xml",pdf:"application/pdf",mp4:"video/mp4",mov:"video/quicktime",mp3:"audio/mpeg",wav:"audio/wav",zip:"application/zip",json:"application/json",txt:"text/plain",csv:"text/csv"}[e]||"application/octet-stream"}function Z(n,e){let t=new H(n,e);return{open:()=>t.open(),close:()=>t.close(),cancel:()=>t.cancel()}}var Ve,Ye,b,Xe,H,we,Ge,Ce=W(()=>{"use strict";V();be();ke();Ve="Upload files",Ye="https://unionstack.link",b={upload:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>',fileUp:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><path d="M12 18v-6"/><path d="m9 15 3-3 3 3"/></svg>',close:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',check:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>',alert:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>',spinner:'<svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="9" stroke="currentColor" opacity="0.2"/><path d="M21 12a9 9 0 0 0-9-9" stroke="currentColor"/></svg>',clock:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><polyline points="12 7.5 12 12 15 13.5"/></svg>',image:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="8.5" cy="8.5" r="1.5"/><polyline points="21 15 16 10 5 21"/></svg>',video:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polygon points="23 7 16 12 23 17 23 7"/><rect x="1" y="5" width="15" height="14" rx="2"/></svg>',audio:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18V5l12-2v13"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="16" r="3"/></svg>',pdf:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="9" y1="13" x2="15" y2="13"/><line x1="9" y1="17" x2="13" y2="17"/></svg>',archive:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="20" height="5" rx="2"/><path d="M4 9v9a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9"/><line x1="10" y1="13" x2="14" y2="13"/></svg>',file:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>',zap:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"/></svg>',device:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>',link:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.72"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.72-1.72"/></svg>',pencil:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/></svg>'};Xe='button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])',H=class{constructor(e,t){this.client=e;this.opts=t;this.$backdrop=null;this.$panel=null;this.$list=null;this.$confirm=null;this.$cancel=null;this.$closeBtn=null;this.$input=null;this.$deviceSource=null;this.$urlSource=null;this.$urlInput=null;this.$urlHint=null;this.$urlAddBtn=null;this.items=[];this.editor=null;this.abortCtrl=new AbortController;this.uploadStarted=!1;this.validateSeqCounter=0;this.resolved=!1;this.previouslyFocused=null;this.noticeTimer=null;this.$summary=null;this.donePromise=new Promise(i=>{this.resolvePromise=i})}async open(){var e,t;if(typeof document=="undefined")throw new Error("[union-stack] Picker requires a browser environment.");try{let i=await this.client.pickerConfigPromise;i&&(this.opts=Ke(i,this.opts))}catch(i){}return ge(),this.mount(),(t=(e=this.opts).onOpen)==null||t.call(e),this.donePromise}close(){this.unmount(),this.resolved||this.resolveResult()}cancel(){var e,t;this.abortCtrl.abort(),(t=(e=this.opts).onCancel)==null||t.call(e),this.close()}get acceptStr(){let e=this.opts.accept;return Array.isArray(e)?e.join(","):e!=null?e:""}mount(){var u,h,R,F,M,S,k,E,I;this.previouslyFocused=(u=document.activeElement)!=null?u:null;let e=document.createElement("div");e.className="us-picker-backdrop",Object.entries(ve(this.opts.theme)).forEach(([g,T])=>{e.style.setProperty(g,T)}),e.style.colorScheme=((h=this.opts.theme)==null?void 0:h.mode)==="dark"?"dark":"light",e.addEventListener("click",g=>{g.target===e&&!this.uploadStarted&&this.cancel()});let t=m("div","us-picker");this.$panel=t;let i=`us-picker-title-${Q()}`;t.setAttribute("role","dialog"),t.setAttribute("aria-modal","true"),t.setAttribute("aria-labelledby",i),t.tabIndex=-1,t.addEventListener("keydown",g=>{g.key==="Escape"&&!this.uploadStarted?(g.preventDefault(),this.cancel()):g.key==="Tab"&&this.trapFocus(g)});let o=m("div","us-picker-header"),r=m("div","us-picker-header-logo");if((R=this.opts.branding)!=null&&R.logoUrl){let g=document.createElement("img");g.src=this.opts.branding.logoUrl,g.alt="",r.appendChild(g)}else r.innerHTML=b.zap;o.appendChild(r);let s=m("div","us-picker-title",(M=(F=this.opts.branding)==null?void 0:F.title)!=null?M:Ve);s.id=i,o.appendChild(s),this.$closeBtn=document.createElement("button"),this.$closeBtn.type="button",this.$closeBtn.className="us-picker-close",this.$closeBtn.setAttribute("aria-label","Close"),this.$closeBtn.innerHTML=b.close,this.$closeBtn.onclick=()=>this.cancel(),o.appendChild(this.$closeBtn),t.appendChild(o);let a=m("div","us-picker-body"),l=this.resolvedSources();l.length>1&&a.appendChild(this.renderSourceTabs(l)),l.includes("device")&&(this.$deviceSource=this.renderDropzone(),a.appendChild(this.$deviceSource)),l.includes("url")&&(this.$urlSource=this.renderUrlSource(),a.appendChild(this.$urlSource)),this.$list=m("div","us-file-list"),a.appendChild(this.$list),t.appendChild(a),this.activateSource((S=l[0])!=null?S:"device");let d=this.opts.autoUpload===!0,c=m("div","us-actions");this.$summary=m("div","us-actions-summary",""),this.$summary.setAttribute("role","status"),this.$summary.setAttribute("aria-live","polite"),c.appendChild(this.$summary);let p=m("div","us-actions-buttons");if(this.$cancel=document.createElement("button"),this.$cancel.type="button",this.$cancel.className="us-btn",this.$cancel.textContent="Cancel",this.$cancel.onclick=()=>this.cancel(),p.appendChild(this.$cancel),d||(this.$confirm=document.createElement("button"),this.$confirm.type="button",this.$confirm.className="us-btn us-btn-primary",this.$confirm.innerHTML=`${b.upload} <span>Upload</span>`,this.$confirm.disabled=!0,this.$confirm.onclick=()=>this.startUpload(),p.appendChild(this.$confirm)),c.appendChild(p),t.appendChild(c),!((k=this.opts.branding)!=null&&k.hideFooter)){let g=m("div","us-footer");g.innerHTML=`${b.zap} <span>Powered by <a href="${Ye}" target="_blank" rel="noopener">UnionStack</a></span>`,t.appendChild(g)}e.appendChild(t),((E=this.opts.container)!=null?E:document.body).appendChild(e),this.$backdrop=e,((I=t.querySelector('.us-source-tab[data-active="true"]'))!=null?I:t).focus()}trapFocus(e){if(!this.$panel)return;let t=Array.from(this.$panel.querySelectorAll(Xe)).filter(s=>!s.hasAttribute("disabled")&&s.offsetParent!==null);if(t.length===0)return;let i=t[0],o=t[t.length-1],r=document.activeElement;e.shiftKey&&r===i?(e.preventDefault(),o.focus()):!e.shiftKey&&r===o&&(e.preventDefault(),i.focus())}resolvedSources(){let e=this.opts.fromSources;return!e||e.length===0?["device","url"]:e}renderSourceTabs(e){let t=m("div","us-source-tabs");return t.setAttribute("role","tablist"),t.setAttribute("aria-label","Upload source"),e.forEach((i,o)=>{let r=document.createElement("button");r.type="button",r.className="us-source-tab",r.setAttribute("role","tab"),r.setAttribute("aria-selected","false"),r.tabIndex=-1,r.dataset.source=i,r.innerHTML=i==="device"?`${b.device} <span>My Device</span>`:`${b.link} <span>Link</span>`,r.onclick=()=>this.activateSource(i),r.onkeydown=s=>this.onTabKeydown(s,e,o),t.appendChild(r)}),t}onTabKeydown(e,t,i){var r,s;let o=i;if(e.key==="ArrowRight"||e.key==="ArrowDown")o=(i+1)%t.length;else if(e.key==="ArrowLeft"||e.key==="ArrowUp")o=(i-1+t.length)%t.length;else if(e.key==="Home")o=0;else if(e.key==="End")o=t.length-1;else return;e.preventDefault(),this.activateSource(t[o]),(s=(r=this.$panel)==null?void 0:r.querySelector(`.us-source-tab[data-source="${t[o]}"]`))==null||s.focus()}activateSource(e){var i;if(this.$deviceSource){let o=e==="device";this.$deviceSource.style.display=o?"":"none"}this.$urlSource&&(this.$urlSource.dataset.active=e==="url"?"true":"false");let t=(i=this.$panel)==null?void 0:i.querySelectorAll(".us-source-tab");t==null||t.forEach(o=>{let r=o.dataset.source===e;o.dataset.active=r?"true":"false",o.setAttribute("aria-selected",r?"true":"false"),o.tabIndex=r?0:-1})}renderUrlSource(){let e=m("div","us-url-source"),t=m("div","us-url-form"),i=document.createElement("input");i.type="url",i.className="us-url-input",i.placeholder="https://example.com/photo.jpg",i.setAttribute("aria-label","File URL"),i.onkeydown=s=>{s.key==="Enter"&&(s.preventDefault(),this.handleUrlAdd())},this.$urlInput=i;let o=document.createElement("button");o.type="button",o.className="us-btn us-btn-primary",o.textContent="Add file",o.onclick=()=>this.handleUrlAdd(),this.$urlAddBtn=o,t.appendChild(i),t.appendChild(o),e.appendChild(t);let r=m("div","us-url-hint","Paste a direct file URL. The host must allow CORS so we can fetch it from the browser.");return this.$urlHint=r,e.appendChild(r),e}async handleUrlAdd(){if(!this.$urlInput||!this.$urlAddBtn||!this.$urlHint)return;let e=this.$urlInput.value.trim();if(!e){this.setUrlHint("Enter a URL first.",!0);return}if(!/^https?:\/\//i.test(e)){this.setUrlHint("URL must start with http:// or https://",!0);return}this.$urlAddBtn.disabled=!0;let t=this.$urlAddBtn.textContent;this.$urlAddBtn.textContent="Fetching\u2026",this.setUrlHint("Downloading\u2026",!1);try{let i=await Ze(e);this.addFiles([i]),this.$urlInput.value="",this.setUrlHint("Paste a direct file URL. The host must allow CORS so we can fetch it from the browser.",!1)}catch(i){let o=i.message||"Failed to fetch URL";this.setUrlHint(o,!0)}finally{this.$urlAddBtn.disabled=!1,this.$urlAddBtn.textContent=t||"Add file"}}setUrlHint(e,t){this.$urlHint&&(this.$urlHint.textContent=e,this.$urlHint.dataset.error=t?"true":"false")}renderDropzone(){var s;let e=m("div","us-dropzone");e.setAttribute("role","button"),e.setAttribute("tabindex","0"),e.setAttribute("aria-label","Drop files here or click to browse");let t=m("div","us-dropzone-icon");t.innerHTML=b.fileUp,e.appendChild(t),e.appendChild(m("div","us-dropzone-title","Drop files to upload")),e.appendChild(m("div","us-dropzone-hint","or click to browse from your device"));let i=[];if(this.opts.maxFileSize&&i.push(`max ${O(this.opts.maxFileSize)}`),this.acceptStr){let a=[],l=new Set;for(let d of this.acceptStr.split(",")){let c=d.trim();if(!c||c==="*/*")continue;let p=Je(c);p&&!l.has(p)&&(l.add(p),a.push(p))}a.length>0&&i.push(a.length>5?`${a.slice(0,5).join(", ")} +${a.length-5}`:a.join(", "))}i.length>0&&e.appendChild(m("div","us-dropzone-constraints",i.join(" \xB7 ")));let o=document.createElement("input");o.type="file",o.multiple=((s=this.opts.maxFiles)!=null?s:10)>1,this.acceptStr&&(o.accept=this.acceptStr),o.style.display="none",o.onchange=()=>{o.files&&this.addFiles(Array.from(o.files)),o.value=""},this.$input=o,e.appendChild(o),e.onclick=()=>o.click(),e.onkeydown=a=>{(a.key==="Enter"||a.key===" ")&&(a.preventDefault(),o.click())};let r=0;return e.addEventListener("dragenter",a=>{a.preventDefault(),r++,e.setAttribute("data-drag","over")}),e.addEventListener("dragover",a=>a.preventDefault()),e.addEventListener("dragleave",()=>{r=Math.max(0,r-1),r===0&&e.removeAttribute("data-drag")}),e.addEventListener("drop",a=>{var d;a.preventDefault(),r=0,e.removeAttribute("data-drag");let l=(d=a.dataTransfer)==null?void 0:d.files;l&&this.addFiles(Array.from(l))}),e}unmount(){var e,t,i,o,r;this.editor&&(this.editor.close(),this.editor=null),this.noticeTimer&&(clearTimeout(this.noticeTimer),this.noticeTimer=null),(e=this.$backdrop)!=null&&e.parentNode&&this.$backdrop.parentNode.removeChild(this.$backdrop),this.$backdrop=null,this.$panel=null;for(let s of this.items)s.objectUrl&&URL.revokeObjectURL(s.objectUrl);(i=(t=this.previouslyFocused)==null?void 0:t.focus)==null||i.call(t),this.previouslyFocused=null,(r=(o=this.opts).onClose)==null||r.call(o)}fileMatchesAccept(e){let t=this.acceptStr.split(",").map(r=>r.trim().toLowerCase()).filter(Boolean);if(t.length===0||t.includes("*/*"))return!0;let i=(e.type||"").toLowerCase(),o=e.name.toLowerCase();return t.some(r=>r.startsWith(".")?o.endsWith(r):r.endsWith("/*")?i.startsWith(r.slice(0,-1)):i===r)}addFiles(e){var c;let t=(c=this.opts.maxFiles)!=null?c:1/0,i=0,o=e.filter(p=>this.fileMatchesAccept(p)?!0:(i++,!1)),r=t-this.items.length,s=r>0?o.slice(0,r):[],a=o.length-s.length,l=[];i>0&&l.push(`${i} file${i>1?"s":""} skipped \u2014 unsupported type`),a>0&&l.push(`${a} file${a>1?"s":""} skipped \u2014 max ${t} allowed`);let d=s.filter(p=>p.size===0).length;d>0&&l.push(`${d} empty file${d>1?"s":""} skipped \u2014 open it in iCloud/Drive to download first`),l.length&&this.flashNotice(l.join(" \xB7 "));for(let p of s){if(p.size===0){let u={uploadId:Q(),file:p,originalFile:p,edited:!1,state:"failed",progress:0,error:j,errorCode:"EMPTY_FILE"};this.items.push(u),this.renderItem(u);continue}if(this.opts.maxFileSize&&p.size>this.opts.maxFileSize){let u={uploadId:Q(),file:p,originalFile:p,edited:!1,state:"failed",progress:0,error:`File exceeds ${O(this.opts.maxFileSize)} limit`};this.items.push(u),this.renderItem(u);continue}let f={uploadId:Q(),file:p,originalFile:p,edited:!1,state:"queued",progress:0};this.items.push(f),this.renderItem(f),this.shouldCheckDimensions(p)&&(f.validating=!0,this.validateDimensions(f))}this.refreshConfirm(),this.maybeAutoUpload()}renderItem(e){if(!this.$list)return;let t=m("div","us-file");t.dataset.state=e.state,t.dataset.uploadId=e.uploadId;let i=Math.min(this.items.length-1,8);t.style.animationDelay=`${i*35}ms`;let o=m("div","us-file-thumb");if(e.file.type.startsWith("image/")&&typeof URL!="undefined"&&URL.createObjectURL)try{let h=URL.createObjectURL(e.file);e.objectUrl=h,o.style.backgroundImage=`url("${h}")`,o.dataset.image="true"}catch(h){o.innerHTML=J(e.file.type)}else o.innerHTML=J(e.file.type);t.appendChild(o);let r=m("div","us-file-main"),s=m("div","us-file-row1");s.appendChild(m("div","us-file-name",e.file.name));let a=m("div","us-file-meta",O(e.file.size));s.appendChild(a),r.appendChild(s);let l=m("div","us-file-progress"),d=m("div","us-file-progress-bar");l.appendChild(d),r.appendChild(l);let c=m("div","us-file-error");e.error&&(c.textContent=e.error),r.appendChild(c),t.appendChild(r);let p=e.file.type.startsWith("image/"),f=this.opts.imageEditing!==!1;if(p&&f&&e.state==="queued"){let h=document.createElement("button");h.type="button",h.className="us-file-action",h.setAttribute("aria-label","Edit image"),h.title="Edit image",h.innerHTML=b.pencil,h.dataset.edited=e.edited?"true":"false",h.onclick=()=>this.openEditor(e),t.appendChild(h),e.$edit=h}let u=m("div","us-file-status");u.setAttribute("aria-label",this.statusLabel(e)),u.innerHTML=this.statusIcon(e.state),t.appendChild(u),e.$row=t,e.$bar=d,e.$status=u,e.$meta=a,e.$error=c,e.$thumb=o,this.$list.appendChild(t),this.updateSummary(),this.updateItemBadge(e)}replaceItemFile(e,t,i){if(e.file=t,e.edited=i,e.objectUrl&&URL.revokeObjectURL(e.objectUrl),e.objectUrl=void 0,e.$thumb)if(e.$thumb.style.backgroundImage="",e.$thumb.removeAttribute("data-image"),t.type.startsWith("image/")&&typeof URL!="undefined"&&URL.createObjectURL)try{let o=URL.createObjectURL(t);e.objectUrl=o,e.$thumb.style.backgroundImage=`url("${o}")`,e.$thumb.dataset.image="true",e.$thumb.innerHTML=""}catch(o){e.$thumb.innerHTML=J(t.type)}else e.$thumb.innerHTML=J(t.type);if(e.$meta&&(e.$meta.textContent=O(t.size)),e.$row){let o=e.$row.querySelector(".us-file-name");o&&(o.textContent=t.name)}e.$edit&&(e.$edit.dataset.edited=i?"true":"false")}openEditor(e){if(!this.$panel||this.editor||e.state!=="queued")return;let t=!1;this.editor=new G({host:this.$panel,file:e.file,originalFile:e.originalFile,title:e.originalFile.name,lockedAspect:this.opts.cropAspectRatio,onCropApplied:()=>{t=!0},onAspectReset:()=>{t=!1},onApply:i=>{let o=i!==e.originalFile;this.replaceItemFile(e,i,o),t&&(e.ratioCropped=!0),this.editor=null,this.shouldCheckDimensions(e.file)&&(e.validating=!0,this.validateDimensions(e)),this.updateItemBadge(e),this.refreshConfirm()},onCancel:()=>{this.editor=null}}),this.editor.open()}statusIcon(e){switch(e){case"uploading":return b.spinner;case"done":return b.check;case"failed":return b.alert;case"cancelled":return b.alert;default:return b.clock}}statusLabel(e){switch(e.state){case"queued":return"Waiting to upload";case"uploading":return`Uploading ${Math.round(e.progress)} percent`;case"done":return"Upload complete";case"failed":return e.error?`Failed: ${e.error}`:"Upload failed";case"cancelled":return"Cancelled"}}setItemState(e,t,i){if(e.state=t,i!==void 0&&(e.progress=i),e.$row&&(e.$row.dataset.state=t),e.$bar&&(e.$bar.style.width=`${e.progress}%`),e.$status&&(e.$status.innerHTML=this.statusIcon(t),e.$status.setAttribute("aria-label",this.statusLabel(e))),e.$meta){let o=O(e.file.size);t==="uploading"?e.$meta.textContent=`${o} \xB7 ${Math.round(e.progress)}%`:e.$meta.textContent=o}e.$error&&(e.$error.textContent=t==="failed"?e.error||"Upload failed":""),this.updateSummary()}updateSummary(){if(!this.$summary)return;let e=this.items.length;if(e===0){this.$summary.textContent="";return}let t=this.items.filter(r=>r.state==="done").length,i=this.items.filter(r=>r.state==="failed").length,o=this.items.filter(r=>r.state==="uploading"||r.state==="queued").length;if(!this.uploadStarted&&o>0){let r=this.items.filter(s=>s.state==="queued").length;this.$summary.textContent=`${r} file${r===1?"":"s"} ready`}else o>0?this.$summary.textContent=`Uploading ${t+1} of ${e}`:i>0?this.$summary.textContent=`${t} of ${e} uploaded \xB7 ${i} failed`:t===e?this.$summary.textContent=`${e} file${e===1?"":"s"} uploaded`:this.$summary.textContent=`${e} file${e===1?"":"s"} ready`}needsCrop(e){return this.opts.forceCrop===!0&&!!this.opts.cropAspectRatio&&e.state==="queued"&&e.file.type.startsWith("image/")&&e.file.type!=="image/svg+xml"&&!e.ratioCropped}hasUncroppedImages(){return this.items.some(e=>this.needsCrop(e))}anyValidating(){return this.items.some(e=>e.validating===!0)}shouldCheckDimensions(e){return!!(this.opts.minImageWidth||this.opts.minImageHeight)&&e.type.startsWith("image/")&&e.type!=="image/svg+xml"}updateItemBadge(e){e.$row&&(this.needsCrop(e)?(e.$row.dataset.cropRequired="true",e.$meta&&(e.$meta.textContent="Crop to ratio required")):(delete e.$row.dataset.cropRequired,e.state==="queued"&&e.$meta&&!e.validating&&(e.$meta.textContent=O(e.file.size))))}async validateDimensions(e){var a,l;let t=++this.validateSeqCounter;e.validateSeq=t;let i=(a=this.opts.minImageWidth)!=null?a:0,o=(l=this.opts.minImageHeight)!=null?l:0,r=e.file,s=null;try{s=await Qe(r)}catch(d){s=null}if(e.validateSeq===t){if(e.validating=!1,e.state==="queued")if(s&&s.w>0&&s.h>0&&(s.w<i||s.h<o)){let d=`${i||"?"}\xD7${o||"?"}`;e.error=`Image too small \u2014 needs at least ${d}px (got ${s.w}\xD7${s.h})`,this.setItemState(e,"failed")}else this.updateItemBadge(e);this.refreshConfirm(),this.maybeAutoUpload()}}maybeAutoUpload(){this.opts.autoUpload!==!0||this.uploadStarted||this.anyValidating()||this.hasUncroppedImages()||this.items.some(e=>e.state==="queued")&&requestAnimationFrame(()=>{this.uploadStarted||this.startUpload()})}refreshConfirm(){if(!this.$confirm)return;let e=this.items.filter(t=>t.state==="queued").length;this.$confirm.disabled=e===0||this.uploadStarted||this.hasUncroppedImages()||this.anyValidating()}flashNotice(e){this.$summary&&(this.$summary.textContent=e,this.$summary.dataset.tone="warn",this.noticeTimer&&clearTimeout(this.noticeTimer),this.noticeTimer=setTimeout(()=>{this.$summary&&(this.$summary.textContent="",delete this.$summary.dataset.tone),this.noticeTimer=null},4e3))}async startUpload(){if(this.uploadStarted)return;if(this.anyValidating()){this.flashNotice("Checking image dimensions\u2026");return}if(this.hasUncroppedImages()){this.items.forEach(o=>this.updateItemBadge(o)),this.flashNotice("Crop required \u2014 crop every image to the set ratio before uploading.");return}let e=this.items.filter(o=>o.state==="queued");if(e.length===0)return;this.uploadStarted=!0,this.$confirm&&(this.$confirm.disabled=!0,this.$confirm.textContent="Uploading\u2026"),this.$cancel&&(this.$cancel.textContent="Stop"),this.$closeBtn&&(this.$closeBtn.disabled=!0),this.$input&&(this.$input.disabled=!0);let t=new Map,i=e.map(o=>o.file);try{await this.client.uploadMany(i,$(C({},this.opts),{signal:this.abortCtrl.signal,onUploadStarted:o=>{var r,s;o.forEach((a,l)=>{let d=e[l];d&&(d.uploadId=a.uploadId,d.$row&&(d.$row.dataset.uploadId=a.uploadId),t.set(a.uploadId,d))}),(s=(r=this.opts).onUploadStarted)==null||s.call(r,o)},onFileUploadStarted:o=>{var s,a;let r=t.get(o.uploadId);r&&this.setItemState(r,"uploading",0),(a=(s=this.opts).onFileUploadStarted)==null||a.call(s,o)},onFileUploadProgress:(o,r)=>{var a,l;let s=t.get(o.uploadId);s&&this.setItemState(s,"uploading",r.totalPercent),(l=(a=this.opts).onFileUploadProgress)==null||l.call(a,o,r)},onFileUploadFinished:o=>{var s,a;let r=t.get(o.uploadId);r&&(r.uploaded=o,this.setItemState(r,"done",100)),(a=(s=this.opts).onFileUploadFinished)==null||a.call(s,o)},onFileUploadFailed:(o,r)=>{var a,l;let s=t.get(o.uploadId);s&&(s.error=r.message,s.errorCode=r.code,this.setItemState(s,"failed")),r.code==="EMPTY_FILE"&&this.flashNotice(j),(l=(a=this.opts).onFileUploadFailed)==null||l.call(a,o,r)},onUploadDone:o=>{var r,s;(s=(r=this.opts).onUploadDone)==null||s.call(r,o),this.resolveResult(o),this.unmount()},onError:o=>{var r,s;(s=(r=this.opts).onError)==null||s.call(r,o),this.resolveResult(),this.unmount()}}))}catch(o){this.resolved||(this.resolveResult(),this.unmount())}}resolveResult(e){if(this.resolved)return;this.resolved=!0;let t=e!=null?e:{filesUploaded:this.items.filter(i=>i.uploaded).map(i=>i.uploaded),filesFailed:this.items.filter(i=>i.state==="failed").map(i=>({file:{uploadId:i.uploadId,filename:i.file.name,mimetype:i.file.type||"application/octet-stream",size:i.file.size,source:"local"},error:{code:i.errorCode||"VALIDATION",message:i.error||"failed",retryable:!1}}))};this.resolvePromise(t)}};we={"application/pdf":"PDF","application/msword":"DOC","application/vnd.openxmlformats-officedocument.wordprocessingml.document":"DOCX","application/vnd.ms-excel":"XLS","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"XLSX","application/vnd.ms-powerpoint":"PPT","application/vnd.openxmlformats-officedocument.presentationml.presentation":"PPTX","application/zip":"ZIP","application/json":"JSON","application/rtf":"RTF","text/plain":"TXT","text/csv":"CSV","text/html":"HTML","text/markdown":"MD","image/jpeg":"JPG","image/png":"PNG","image/gif":"GIF","image/webp":"WEBP","image/svg+xml":"SVG","image/heic":"HEIC","video/mp4":"MP4","audio/mpeg":"MP3"},Ge={image:"Images",video:"Video",audio:"Audio",text:"Text",font:"Fonts"}});var Ee={};le(Ee,{Picker:()=>H,openPicker:()=>Z});var ie=W(()=>{"use strict";Ce()});var st={};le(st,{Picker:()=>H,UnionStackClient:()=>D,init:()=>nt,openPicker:()=>Z});V();var pe="0.3.16",ce=`js/${pe}`,dt=`node/${pe}`;var Ae=3,Be=3,ue=[400,1200,3600],Y=class{constructor(e){this.cfg=e}describe(e,t={}){let i=typeof File!="undefined"&&e instanceof File,o=t.filename||(i?e.name:"untitled"),r=t.mimeType||e.type||"application/octet-stream";return{uploadId:ze(),filename:o,mimetype:r,size:e.size,source:"local"}}async upload(e,t={}){var o,r,s,a;let i=this.describe(e,{filename:t.filename,mimeType:t.mimeType});if((o=t.onFileUploadStarted)==null||o.call(t,i),e.size===0){let l=v("EMPTY_FILE",j,{retryable:!1});throw(r=t.onFileUploadFailed)==null||r.call(t,i,l),l}try{let l=await this.initUpload(i,t),d=await this.uploadAllParts(e,l,i,t),c=await this.completeUpload(l.sessionId,d,t),p=$(C({},i),{handle:c.handle,fileId:c.fileId,url:c.url,size:c.size,mimetype:c.mimetype,filename:c.filename,key:c.key,container:c.container,status:"Stored",etag:c.etag,metadata:c.metadata});return(s=t.onFileUploadFinished)==null||s.call(t,p),p}catch(l){let d=he(l);throw(a=t.onFileUploadFailed)==null||a.call(t,i,d),l!=null&&l.sessionId&&this.abortSilently(l.sessionId).catch(()=>{}),d}}async abort(e){await this.api("POST","/sdk/v1/uploads/abort",{sessionId:e})}async fetchPickerConfig(){return this.api("GET","/sdk/v1/picker-config")}async initUpload(e,t){return this.api("POST","/sdk/v1/uploads/init",{filename:e.filename,mimeType:e.mimetype,size:e.size,metadata:t.metadata},t.signal)}async uploadAllParts(e,t,i,o){var M,S;let r=t.totalParts,s=t.chunkSize,a=Math.max(1,(M=o.concurrency)!=null?M:Ae),l=(S=o.maxRetriesPerPart)!=null?S:Be,d=new Map(t.partUrls.map(k=>[k.partNumber,k.url])),c=new Array(r),p=new Array(r).fill(0),f=1,u=e.size,h=()=>{var g;let k=p.reduce((T,y)=>T+y,0),E=u>0?Math.min(100,Math.round(k/u*100)):100,I={totalBytes:u,loaded:k,totalPercent:E};(g=o.onFileUploadProgress)==null||g.call(o,i,I)},R=async()=>{var k,E,I,g,T;for(;;){if((k=o.signal)!=null&&k.aborted)throw v("ABORTED","Upload aborted by caller.",{retryable:!1});let y=f++;if(y>r)return;let _=(y-1)*s,q=Math.min(_+s,e.size),A=e.slice(_,q),B=0,z;for(;B<=l;){if((E=o.signal)!=null&&E.aborted)throw v("ABORTED","Upload aborted by caller.",{retryable:!1});try{let U=d.get(y);U||(U=(await this.api("POST","/sdk/v1/uploads/sign-part",{sessionId:t.sessionId,partNumber:y},o.signal)).url,d.set(y,U));let P=(T=await((g=(I=this.cfg).fetch)==null?void 0:g.call(I,U,{method:"PUT",body:A,signal:o.signal})))!=null?T:await fetch(U,{method:"PUT",body:A,signal:o.signal});if(!P.ok)throw(P.status===403||P.status===401)&&d.delete(y),v("PART_FAILED",`Part ${y} PUT failed (HTTP ${P.status})`,{status:P.status});let N=P.headers.get("etag");if(!N)throw v("PART_FAILED",`Part ${y}: R2 did not return an ETag.`);c[y-1]={partNumber:y,etag:N,size:A.size},p[y-1]=A.size,h();break}catch(U){if(z=U,B++,B>l)break;await He(ue[Math.min(B-1,ue.length-1)])}}if(!c[y-1])throw De(he(z!=null?z:v("PART_FAILED",`Part ${y} failed after ${l} retries.`)),t.sessionId)}},F=Array.from({length:Math.min(a,r)},R);return await Promise.all(F),c}async completeUpload(e,t,i){return this.api("POST","/sdk/v1/uploads/complete",{sessionId:e,parts:t.map(o=>({partNumber:o.partNumber,etag:o.etag}))},i.signal)}async abortSilently(e){try{await this.abort(e)}catch(t){}}async api(e,t,i,o){var d,c;let r=(d=this.cfg.fetch)!=null?d:fetch,s=`${this.cfg.apiBase}${t}`,a;try{a=await r(s,{method:e,headers:{Authorization:`Bearer ${this.cfg.apiKey}`,"Content-Type":"application/json","X-UnionStack-SDK":(c=this.cfg.sdkHeader)!=null?c:ce},body:i===void 0?void 0:JSON.stringify(i),signal:o})}catch(p){throw(p==null?void 0:p.name)==="AbortError"?v("ABORTED","Request aborted.",{retryable:!1,cause:p}):v("NETWORK","Network request failed.",{retryable:!0,cause:p})}let l=null;try{l=await a.json()}catch(p){}if(!a.ok)throw de(a.status,l);return l}};function ze(){return typeof crypto!="undefined"&&"randomUUID"in crypto?crypto.randomUUID().replace(/-/g,""):Math.random().toString(36).slice(2)+Date.now().toString(36)}function He(n){return new Promise(e=>setTimeout(e,n))}function he(n){if(n&&typeof n=="object"&&"code"in n&&"message"in n&&"retryable"in n)return n;let e=(n==null?void 0:n.message)||"Upload failed.";return v("NETWORK",e,{cause:n})}function De(n,e){return n&&typeof n=="object"&&(n.sessionId=e),n}V();var rt="https://api.unionstack.link/v1",Ie="unionstack-preloader-styles";function ot(){if(typeof document=="undefined")return()=>{};if(!document.getElementById(Ie)){let i=document.createElement("style");i.id=Ie,i.textContent="@keyframes us-preload-spin{to{transform:rotate(360deg)}}@keyframes us-preload-fade{from{opacity:0}to{opacity:1}}",document.head.appendChild(i)}let n=document.createElement("div");n.setAttribute("role","status"),n.setAttribute("aria-label","Loading file picker"),n.style.cssText="position:fixed;inset:0;z-index:2147483000;display:flex;align-items:center;justify-content:center;background:rgba(2,6,23,0.4);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);animation:us-preload-fade 140ms ease-out;";let e=document.createElement("div");e.style.cssText="width:36px;height:36px;border-radius:50%;border:3px solid rgba(220,225,251,0.25);border-top-color:#c0c1ff;animation:us-preload-spin 0.8s linear infinite;",n.appendChild(e),document.body.appendChild(n);let t=!1;return()=>{t||(t=!0,n.remove())}}var D=class{constructor(e){e.apiKey||console.error("[UnionStack] apiKey is not set. Uploads and the picker are disabled until a valid apiKey is provided."),this.resolvedCfg=$(C({},e),{apiBase:rt}),this.uploader=new Y(this.resolvedCfg),this.pickerConfigPromise=!e.apiKey||this.resolvedCfg.skipConfigPrefetch?Promise.resolve(null):this.uploader.fetchPickerConfig().then(t=>(t!=null&&t.sdkWarning&&console.warn(`[UnionStack] ${t.sdkWarning}`),t)).catch(()=>null)}missingKeyError(){return this.resolvedCfg.apiKey?null:v("CONFIG","apiKey is required.",{retryable:!1})}upload(e,t={}){let i=this.missingKeyError();return i?Promise.reject(i):this.uploader.upload(e,t)}async uploadMany(e,t={}){var l,d,c,p;let i=this.missingKeyError();if(i)throw(l=t.onError)==null||l.call(t,i),i;if(!Array.isArray(e)||e.length===0){let f=v("VALIDATION","uploadMany requires a non-empty array of files.",{retryable:!1});throw(d=t.onError)==null||d.call(t,f),f}let o=e.map(f=>this.uploader.describe(f,{filename:t.filename,mimeType:t.mimeType}));(c=t.onUploadStarted)==null||c.call(t,o);let r=[],s=[];await Promise.all(e.map(async(f,u)=>{try{let h=await this.uploader.upload(f,t);h.uploadId=o[u].uploadId,r.push(h)}catch(h){s.push({file:o[u],error:h})}}));let a={filesUploaded:r,filesFailed:s};return(p=t.onUploadDone)==null||p.call(t,a),a}picker(e={}){let t=null,i=!1,o,r,s=new Promise((a,l)=>{o=a,r=l});return{open:async()=>{if(i)return s;let a=this.missingKeyError();if(a)throw r(a),a;i=!0;let l=ot();try{t=(await Promise.resolve().then(()=>(ie(),Ee))).openPicker(this,$(C({},e),{onOpen:()=>{var p;l(),(p=e.onOpen)==null||p.call(e)}}));let c=await t.open();return l(),o(c),c}catch(d){l();let c=d!=null&&d.code?d:v("CONFIG","Failed to load picker.",{retryable:!1,cause:d});throw r(c),c}},close:()=>{t==null||t.close()},cancel:()=>{t==null||t.cancel()}}}get config(){return this.resolvedCfg}};var ee={init(n){return new D(n)}};ie();var nt=ee.init.bind(ee);(function(){if(typeof document=="undefined")return;let e=document.currentScript;if(!e)return;let t=e.getAttribute("data-unionstack-key");if(t)try{let i=ee.init({apiKey:t});queueMicrotask(()=>{window.UnionStack&&(window.UnionStack.client=i)})}catch(i){console.error("[UnionStack] auto-init failed:",i)}})();return Le(st);})();
543
+ `});function w(n,e,t){let i=document.createElement(n);return e&&(i.className=e),t!==void 0&&(i.textContent=t),i}function X(n,e){let t=document.createElement("button");return t.type="button",t.className="us-tool",t.innerHTML=`${e} <span>${qe(n)}</span>`,t}function qe(n){return n.replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[e])}function x(n,e,t){return Math.max(e,Math.min(t,n))}function ye(n){return new Promise((e,t)=>{let i=URL.createObjectURL(n),o=new Image;o.onload=()=>{URL.revokeObjectURL(i),e(o)},o.onerror=()=>{URL.revokeObjectURL(i),t(new Error("decode failed"))},o.src=i})}function xe(n){return/^image\/(png|webp|gif)$/.test(n)}var L,G,ke=W(()=>{"use strict";L={back:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><polyline points="15 18 9 12 15 6"/></svg>',crop:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M6 2v14a2 2 0 0 0 2 2h14"/><path d="M18 22V8a2 2 0 0 0-2-2H2"/></svg>',circle:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/></svg>',rotate:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12a9 9 0 1 1-9-9c2.52 0 4.82.93 6.58 2.46L21 8"/><path d="M21 3v5h-5"/></svg>',undo:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M3 7v6h6"/><path d="M21 17a9 9 0 0 0-15-6.7L3 13"/></svg>',check:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>'},G=class{constructor(e){this.opts=e;this.cropBox=null;this.hasAlpha=!1;this.mode="none";this.cropRect=null;this.dragKind=null;this.dragStart=null;this.onPointerMove=e=>{if(!this.dragKind||!this.dragStart||!this.cropRect)return;let t=this.canvasMetrics(),i=(e.clientX-this.dragStart.px)/(t.scaleX||1),o=(e.clientY-this.dragStart.py)/(t.scaleY||1),r=this.dragStart.rect,s=this.working.width,a=this.working.height,l=this.minCropImg();if(this.aspect&&this.dragKind!=="move"){switch(this.dragKind){case"se":this.cropRect=this.lockedRectFromDrag(r.x,r.y,r.w+i,1,1);break;case"nw":{let u=r.x+r.w,h=r.y+r.h;this.cropRect=this.lockedRectFromDrag(u,h,u-(r.x+i),-1,-1);break}case"ne":{let u=r.y+r.h;this.cropRect=this.lockedRectFromDrag(r.x,u,r.w+i,1,-1);break}case"sw":{let u=r.x+r.w;this.cropRect=this.lockedRectFromDrag(u,r.y,u-(r.x+i),-1,1);break}}this.updateCropBox();return}let{x:d,y:c,w:p,h:f}=r;switch(this.dragKind){case"move":d=x(r.x+i,0,s-r.w),c=x(r.y+o,0,a-r.h);break;case"nw":{let u=x(r.x+i,0,r.x+r.w-l),h=x(r.y+o,0,r.y+r.h-l);p=r.w+(r.x-u),f=r.h+(r.y-h),d=u,c=h;break}case"ne":{let u=x(r.w+i,l,s-r.x),h=x(r.y+o,0,r.y+r.h-l);f=r.h+(r.y-h),p=u,c=h;break}case"sw":{let u=x(r.x+i,0,r.x+r.w-l),h=x(r.h+o,l,a-r.y);p=r.w+(r.x-u),f=h,d=u;break}case"se":p=x(r.w+i,l,s-r.x),f=x(r.h+o,l,a-r.y);break}this.cropRect={x:d,y:c,w:p,h:f},this.updateCropBox()};this.onPointerUp=()=>{this.dragKind=null,this.dragStart=null,document.removeEventListener("pointermove",this.onPointerMove),document.removeEventListener("pointerup",this.onPointerUp)}}get aspect(){let e=this.opts.lockedAspect;return e&&e.width>0&&e.height>0?e.width/e.height:null}async open(){this.mount();try{await this.loadOriginalIntoWorking(),this.opts.originalFile&&this.opts.originalFile!==this.opts.file&&this.markEdited(!0),this.draw()}catch(e){this.canvasWrap.textContent=`Couldn't load image: ${e.message}`}}close(){document.removeEventListener("pointermove",this.onPointerMove),document.removeEventListener("pointerup",this.onPointerUp),this.root.remove()}mount(){this.root=w("div","us-editor");let e=w("div","us-editor-header"),t=document.createElement("button");t.type="button",t.className="us-editor-back",t.setAttribute("aria-label","Back"),t.innerHTML=L.back,t.onclick=()=>{this.opts.onCancel(),this.close()},e.appendChild(t),e.appendChild(w("div","us-editor-title",this.opts.title)),this.root.appendChild(e),this.canvasWrap=w("div","us-editor-canvas-wrap"),this.displayCanvas=document.createElement("canvas"),this.displayCanvas.className="us-editor-canvas",this.canvasWrap.appendChild(this.displayCanvas),this.root.appendChild(this.canvasWrap),this.cropDims=w("div","us-crop-dims"),this.cropDims.hidden=!0,this.widthInput=this.makeDimInput("Crop width in pixels","w"),this.heightInput=this.makeDimInput("Crop height in pixels","h"),this.cropDims.appendChild(w("span","us-crop-dims-label","Crop size")),this.cropDims.appendChild(this.widthInput),this.cropDims.appendChild(w("span","us-crop-dims-x","\xD7")),this.cropDims.appendChild(this.heightInput),this.cropDims.appendChild(w("span","us-crop-dims-unit","px")),this.root.appendChild(this.cropDims);let i=w("div","us-editor-toolbar");this.cropTool=X("Crop",L.crop),this.cropTool.onclick=()=>this.toggleCropMode(),this.circleTool=X("Circle",L.circle),this.circleTool.onclick=()=>this.applyCircle(),this.rotateTool=X("Rotate 90\xB0",L.rotate),this.rotateTool.onclick=()=>this.applyRotate(),this.revertTool=X("Revert",L.undo),this.revertTool.onclick=()=>this.revert(),this.revertTool.disabled=!0,i.appendChild(this.cropTool),i.appendChild(this.circleTool),i.appendChild(this.rotateTool),i.appendChild(w("div","us-tool-spacer")),i.appendChild(this.revertTool),this.root.appendChild(i);let o=w("div","us-editor-footer"),r=document.createElement("button");r.type="button",r.className="us-btn",r.textContent="Cancel",r.onclick=()=>{this.opts.onCancel(),this.close()},this.applyBtn=document.createElement("button"),this.applyBtn.type="button",this.applyBtn.className="us-btn us-btn-primary",this.applyBtn.innerHTML=`${L.check} <span>Apply</span>`,this.applyBtn.onclick=()=>this.applyAndClose(),o.appendChild(r),o.appendChild(this.applyBtn),this.root.appendChild(o),this.opts.host.appendChild(this.root)}async loadOriginalIntoWorking(){let e=await ye(this.opts.file),t=document.createElement("canvas");t.width=e.naturalWidth,t.height=e.naturalHeight;let i=t.getContext("2d");if(!i)throw new Error("Canvas 2D context unavailable");i.drawImage(e,0,0),this.working=t,this.hasAlpha=xe(this.opts.file.type),this.markEdited(!1)}async loadTrueOriginalIntoWorking(){var r;let e=(r=this.opts.originalFile)!=null?r:this.opts.file,t=await ye(e),i=document.createElement("canvas");i.width=t.naturalWidth,i.height=t.naturalHeight;let o=i.getContext("2d");if(!o)throw new Error("Canvas 2D context unavailable");o.drawImage(t,0,0),this.working=i,this.hasAlpha=xe(e.type),this.markEdited(!1)}draw(){let{width:e,height:t}=this.working,i=Math.min(1,720/Math.max(e,t)),o=Math.max(1,Math.round(e*i)),r=Math.max(1,Math.round(t*i));this.displayCanvas.width=o,this.displayCanvas.height=r;let s=this.displayCanvas.getContext("2d");s&&(s.clearRect(0,0,o,r),s.drawImage(this.working,0,0,o,r),this.updateCropBox())}toggleCropMode(){this.mode==="crop"?this.applyCrop():this.enterCropMode()}enterCropMode(){this.mode="crop",this.cropTool.dataset.active="true",this.cropTool.innerHTML=`${L.check} <span>Apply crop</span>`;let e=this.working.width,t=this.working.height;if(this.aspect){let o=this.aspect,r=this.minCropImg(),s=e,a=s/o;a>t&&(a=t,s=a*o),s=s*.9,a=s/o,s<r&&(s=r,a=s/o),a<r&&(a=r,s=a*o),s>e&&(s=e,a=s/o),a>t&&(a=t,s=a*o),this.cropRect={x:Math.round((e-s)/2),y:Math.round((t-a)/2),w:s,h:a}}else{let o=Math.round(Math.min(e,t)*.1);this.cropRect={x:o,y:o,w:e-o*2,h:t-o*2}}this.renderCropBox();let i=this.aspect!==null;this.widthInput.readOnly=i,this.heightInput.readOnly=i,this.cropDims.dataset.locked=i?"true":"false",this.cropDims.hidden=!1,this.syncCropDimsInputs()}exitCropMode(){this.mode="none",this.cropTool.removeAttribute("data-active"),this.cropTool.innerHTML=`${L.crop} <span>Crop</span>`,this.cropRect=null,this.cropBox&&(this.cropBox.remove(),this.cropBox=null),this.cropDims.hidden=!0}makeDimInput(e,t){let i=document.createElement("input");return i.type="number",i.min="1",i.inputMode="numeric",i.className="us-crop-dim-input",i.setAttribute("aria-label",e),i.addEventListener("input",()=>this.onDimInput(t)),i.addEventListener("change",()=>this.syncCropDimsInputs()),i}syncCropDimsInputs(){if(!this.cropRect||!this.widthInput||!this.heightInput)return;let e=Math.max(1,Math.round(this.cropRect.w)),t=Math.max(1,Math.round(this.cropRect.h));document.activeElement!==this.widthInput&&(this.widthInput.value=String(e)),document.activeElement!==this.heightInput&&(this.heightInput.value=String(t))}onDimInput(e){if(this.aspect!==null||!this.cropRect)return;let t=e==="w"?this.widthInput:this.heightInput,i=parseInt(t.value,10);if(!Number.isFinite(i)||i<=0)return;let o=this.minCropImg();if(e==="w"){let r=this.working.width-this.cropRect.x;this.cropRect=$(C({},this.cropRect),{w:x(i,o,r)})}else{let r=this.working.height-this.cropRect.y;this.cropRect=$(C({},this.cropRect),{h:x(i,o,r)})}this.updateCropBox()}renderCropBox(){if(!this.cropRect)return;this.cropBox&&this.cropBox.remove();let e=w("div","us-crop-box");for(let t of["nw","ne","sw","se"]){let i=w("div","us-crop-handle");i.dataset.pos=t,i.addEventListener("pointerdown",o=>this.beginDrag(o,t)),e.appendChild(i)}e.addEventListener("pointerdown",t=>{t.target.classList.contains("us-crop-handle")||this.beginDrag(t,"move")}),this.canvasWrap.appendChild(e),this.cropBox=e,this.updateCropBox()}canvasMetrics(){let e=this.displayCanvas.getBoundingClientRect(),t=this.canvasWrap.getBoundingClientRect();return{scaleX:e.width/(this.working.width||1),scaleY:e.height/(this.working.height||1),offX:e.left-t.left,offY:e.top-t.top}}minCropImg(){let{scaleX:e}=this.canvasMetrics();return e>0?24/e:24}updateCropBox(){if(!this.cropBox||!this.cropRect)return;let e=this.canvasMetrics();this.cropBox.style.left=`${e.offX+this.cropRect.x*e.scaleX}px`,this.cropBox.style.top=`${e.offY+this.cropRect.y*e.scaleY}px`,this.cropBox.style.width=`${this.cropRect.w*e.scaleX}px`,this.cropBox.style.height=`${this.cropRect.h*e.scaleY}px`,this.syncCropDimsInputs()}beginDrag(e,t){this.cropRect&&(e.preventDefault(),this.dragKind=t,this.dragStart={px:e.clientX,py:e.clientY,rect:C({},this.cropRect)},document.addEventListener("pointermove",this.onPointerMove),document.addEventListener("pointerup",this.onPointerUp))}lockedRectFromDrag(e,t,i,o,r){let s=this.aspect,a=this.working.width,l=this.working.height,d=this.minCropImg(),c=Math.max(d,i),p=c/s;p<d&&(p=d,c=p*s);let f=o>0?a-e:e,u=r>0?l-t:t;c=Math.min(c,f,u*s),p=c/s;let h=o>0?e:e-c,R=r>0?t:t-p;return{x:h,y:R,w:c,h:p}}applyCrop(){var a,l;if(!this.cropRect){this.exitCropMode();return}let e=x(Math.round(this.cropRect.x),0,this.working.width-1),t=x(Math.round(this.cropRect.y),0,this.working.height-1),i=x(Math.round(this.cropRect.w),1,this.working.width-e),o=x(Math.round(this.cropRect.h),1,this.working.height-t),r=document.createElement("canvas");r.width=i,r.height=o;let s=r.getContext("2d");s&&(s.drawImage(this.working,e,t,i,o,0,0,i,o),this.working=r,this.exitCropMode(),this.markEdited(!0),(l=(a=this.opts).onCropApplied)==null||l.call(a),this.draw())}applyRotate(){var r,s;let{width:e,height:t}=this.working,i=document.createElement("canvas");i.width=t,i.height=e;let o=i.getContext("2d");o&&(o.translate(t,0),o.rotate(Math.PI/2),o.drawImage(this.working,0,0),this.working=i,this.exitCropMode(),this.markEdited(!0),(s=(r=this.opts).onAspectReset)==null||s.call(r),this.draw())}applyCircle(){var l,d;let{width:e,height:t}=this.working,i=Math.min(e,t),o=Math.round((e-i)/2),r=Math.round((t-i)/2),s=document.createElement("canvas");s.width=i,s.height=i;let a=s.getContext("2d");a&&(a.save(),a.beginPath(),a.arc(i/2,i/2,i/2,0,Math.PI*2),a.closePath(),a.clip(),a.drawImage(this.working,o,r,i,i,0,0,i,i),a.restore(),this.working=s,this.hasAlpha=!0,this.exitCropMode(),this.markEdited(!0),(d=(l=this.opts).onAspectReset)==null||d.call(l),this.draw())}async revert(){var e,t;await this.loadTrueOriginalIntoWorking(),this.exitCropMode(),(t=(e=this.opts).onAspectReset)==null||t.call(e),this.draw()}markEdited(e){this.revertTool.disabled=!e}async applyAndClose(){this.applyBtn.disabled=!0,this.mode==="crop"&&this.applyCrop();try{let e=await this.exportFile();this.opts.onApply(e),this.close()}catch(e){this.applyBtn.disabled=!1,console.error("[union-stack] image export failed",e)}}exportFile(){return new Promise((e,t)=>{let i=this.hasAlpha?"image/png":"image/jpeg",o=i==="image/jpeg"?.92:void 0;this.working.toBlob(r=>{if(!r)return t(new Error("toBlob returned null"));let s=this.opts.file.name.replace(/\.[^.]+$/,""),a=i==="image/png"?"png":"jpg";e(new File([r],`${s}-edited.${a}`,{type:i}))},i,o)})}}});function Ke(n,e){var a,l,d,c,p,f,u,h,R,F,M,S,k,E,I,g,T,y,_,q,A,B,z,U,P,N,te,re;let t=C({},e),i=e.branding||{};t.branding={logoUrl:(l=(a=i.logoUrl)!=null?a:n.branding.logoUrl)!=null?l:void 0,title:(c=(d=i.title)!=null?d:n.branding.title)!=null?c:void 0,hideFooter:(p=i.hideFooter)!=null?p:n.branding.hideFooter};let o=e.theme||{};if(t.theme={primary:(u=(f=o.primary)!=null?f:n.theme.primary)!=null?u:void 0,background:(R=(h=o.background)!=null?h:n.theme.background)!=null?R:void 0,foreground:(M=(F=o.foreground)!=null?F:n.theme.foreground)!=null?M:void 0,border:(k=(S=o.border)!=null?S:n.theme.border)!=null?k:void 0,radius:(I=(E=o.radius)!=null?E:n.theme.radius)!=null?I:void 0,mode:(T=(g=o.mode)!=null?g:n.theme.mode)!=null?T:void 0},t.maxFileSize=(y=e.maxFileSize)!=null?y:n.constraints.maxFileSizeBytes,t.maxFiles=(_=e.maxFiles)!=null?_:n.constraints.maxFilesPerUpload,!e.accept&&((q=n.constraints.allowedMimeTypes)!=null&&q.length)){let oe=n.constraints.allowedMimeTypes.filter(Ue=>Ue!=="*/*");oe.length>0&&(t.accept=oe.join(","))}let r=(A=n.image)!=null?A:null,s=(B=e.cropAspectRatio)!=null?B:r&&r.cropRatioW&&r.cropRatioH?{width:r.cropRatioW,height:r.cropRatioH}:void 0;return t.cropAspectRatio=s,t.forceCrop=((U=(z=e.forceCrop)!=null?z:r==null?void 0:r.forceCrop)!=null?U:!1)&&!!s&&e.imageEditing!==!1,t.minImageWidth=(N=(P=e.minImageWidth)!=null?P:r==null?void 0:r.minWidth)!=null?N:void 0,t.minImageHeight=(re=(te=e.minImageHeight)!=null?te:r==null?void 0:r.minHeight)!=null?re:void 0,t}function J(n){return n?n.startsWith("image/")?b.image:n.startsWith("video/")?b.video:n.startsWith("audio/")?b.audio:n==="application/pdf"?b.pdf:n.startsWith("application/zip")||n.includes("compressed")||n==="application/x-tar"||n==="application/gzip"?b.archive:b.file:b.file}function m(n,e,t){let i=document.createElement(n);return e&&(i.className=e),t!==void 0&&(i.textContent=t),i}function Je(n){var i,o,r;let e=n.trim().toLowerCase();if(!e)return"";if(e.endsWith("/*")||!e.includes("/")){let s=e.replace("/*","");return(i=Ge[s])!=null?i:s.charAt(0).toUpperCase()+s.slice(1)}if(we[e])return we[e];if(e.startsWith("."))return e.slice(1).toUpperCase();let t=(o=e.split("/")[1])!=null?o:e;return((r=t.split("+")[0].split(".").pop())!=null?r:t).toUpperCase()}function O(n){return n<1024?`${n} B`:n<1024*1024?`${(n/1024).toFixed(1)} KB`:n<1024*1024*1024?`${(n/1024/1024).toFixed(1)} MB`:`${(n/1024/1024/1024).toFixed(2)} GB`}function Q(){return typeof crypto!="undefined"&&"randomUUID"in crypto?crypto.randomUUID().replace(/-/g,""):Math.random().toString(36).slice(2)+Date.now().toString(36)}async function Qe(n){var e;if(typeof createImageBitmap=="function")try{let t=await createImageBitmap(n),i=t.width,o=t.height;return(e=t.close)==null||e.call(t),{w:i,h:o}}catch(t){}return new Promise((t,i)=>{if(typeof URL=="undefined"||!URL.createObjectURL){i(new Error("no object URL support"));return}let o=URL.createObjectURL(n),r=new Image;r.onload=()=>{URL.revokeObjectURL(o),t({w:r.naturalWidth,h:r.naturalHeight})},r.onerror=()=>{URL.revokeObjectURL(o),i(new Error("decode failed"))},r.src=o})}async function Ze(n){let e;try{e=await fetch(n,{mode:"cors",credentials:"omit"})}catch(r){throw new Error(`Could not reach ${et(n)} \u2014 check the URL or CORS.`)}if(!e.ok)throw new Error(`Server returned ${e.status} \u2014 file unavailable.`);let t=await e.blob(),i=tt(n)||"download",o=t.type||it(i);return new File([t],i,{type:o})}function et(n){try{return new URL(n).host}catch(e){return"that host"}}function tt(n){try{let t=new URL(n).pathname.split("/").filter(Boolean).pop();return t?decodeURIComponent(t):""}catch(e){return""}}function it(n){let e=n.toLowerCase().split(".").pop()||"";return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",svg:"image/svg+xml",pdf:"application/pdf",mp4:"video/mp4",mov:"video/quicktime",mp3:"audio/mpeg",wav:"audio/wav",zip:"application/zip",json:"application/json",txt:"text/plain",csv:"text/csv"}[e]||"application/octet-stream"}function Z(n,e){let t=new H(n,e);return{open:()=>t.open(),close:()=>t.close(),cancel:()=>t.cancel()}}var Ve,Ye,b,Xe,H,we,Ge,Ce=W(()=>{"use strict";V();be();ke();Ve="Upload files",Ye="https://unionstack.link",b={upload:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>',fileUp:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><path d="M12 18v-6"/><path d="m9 15 3-3 3 3"/></svg>',close:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',check:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>',alert:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>',spinner:'<svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="9" stroke="currentColor" opacity="0.2"/><path d="M21 12a9 9 0 0 0-9-9" stroke="currentColor"/></svg>',clock:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><polyline points="12 7.5 12 12 15 13.5"/></svg>',image:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="8.5" cy="8.5" r="1.5"/><polyline points="21 15 16 10 5 21"/></svg>',video:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polygon points="23 7 16 12 23 17 23 7"/><rect x="1" y="5" width="15" height="14" rx="2"/></svg>',audio:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18V5l12-2v13"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="16" r="3"/></svg>',pdf:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="9" y1="13" x2="15" y2="13"/><line x1="9" y1="17" x2="13" y2="17"/></svg>',archive:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="20" height="5" rx="2"/><path d="M4 9v9a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9"/><line x1="10" y1="13" x2="14" y2="13"/></svg>',file:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>',zap:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"/></svg>',device:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>',link:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.72"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.72-1.72"/></svg>',pencil:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/></svg>'};Xe='button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])',H=class{constructor(e,t){this.client=e;this.opts=t;this.$backdrop=null;this.$panel=null;this.$list=null;this.$confirm=null;this.$cancel=null;this.$closeBtn=null;this.$input=null;this.$deviceSource=null;this.$urlSource=null;this.$urlInput=null;this.$urlHint=null;this.$urlAddBtn=null;this.items=[];this.editor=null;this.abortCtrl=new AbortController;this.uploadStarted=!1;this.validateSeqCounter=0;this.resolved=!1;this.previouslyFocused=null;this.noticeTimer=null;this.$summary=null;this.donePromise=new Promise(i=>{this.resolvePromise=i})}async open(){var e,t;if(typeof document=="undefined")throw new Error("[union-stack] Picker requires a browser environment.");try{let i=await this.client.pickerConfigPromise;i&&(this.opts=Ke(i,this.opts))}catch(i){}return ge(),this.mount(),(t=(e=this.opts).onOpen)==null||t.call(e),this.donePromise}close(){this.unmount(),this.resolved||this.resolveResult()}cancel(){var e,t;this.abortCtrl.abort(),(t=(e=this.opts).onCancel)==null||t.call(e),this.close()}get acceptStr(){let e=this.opts.accept;return Array.isArray(e)?e.join(","):e!=null?e:""}mount(){var u,h,R,F,M,S,k,E,I;this.previouslyFocused=(u=document.activeElement)!=null?u:null;let e=document.createElement("div");e.className="us-picker-backdrop",Object.entries(ve(this.opts.theme)).forEach(([g,T])=>{e.style.setProperty(g,T)}),e.style.colorScheme=((h=this.opts.theme)==null?void 0:h.mode)==="dark"?"dark":"light",e.addEventListener("click",g=>{g.target===e&&!this.uploadStarted&&this.cancel()});let t=m("div","us-picker");this.$panel=t;let i=`us-picker-title-${Q()}`;t.setAttribute("role","dialog"),t.setAttribute("aria-modal","true"),t.setAttribute("aria-labelledby",i),t.tabIndex=-1,t.addEventListener("keydown",g=>{g.key==="Escape"&&!this.uploadStarted?(g.preventDefault(),this.cancel()):g.key==="Tab"&&this.trapFocus(g)});let o=m("div","us-picker-header"),r=m("div","us-picker-header-logo");if((R=this.opts.branding)!=null&&R.logoUrl){let g=document.createElement("img");g.src=this.opts.branding.logoUrl,g.alt="",r.appendChild(g)}else r.innerHTML=b.zap;o.appendChild(r);let s=m("div","us-picker-title",(M=(F=this.opts.branding)==null?void 0:F.title)!=null?M:Ve);s.id=i,o.appendChild(s),this.$closeBtn=document.createElement("button"),this.$closeBtn.type="button",this.$closeBtn.className="us-picker-close",this.$closeBtn.setAttribute("aria-label","Close"),this.$closeBtn.innerHTML=b.close,this.$closeBtn.onclick=()=>this.cancel(),o.appendChild(this.$closeBtn),t.appendChild(o);let a=m("div","us-picker-body"),l=this.resolvedSources();l.length>1&&a.appendChild(this.renderSourceTabs(l)),l.includes("device")&&(this.$deviceSource=this.renderDropzone(),a.appendChild(this.$deviceSource)),l.includes("url")&&(this.$urlSource=this.renderUrlSource(),a.appendChild(this.$urlSource)),this.$list=m("div","us-file-list"),a.appendChild(this.$list),t.appendChild(a),this.activateSource((S=l[0])!=null?S:"device");let d=this.opts.autoUpload===!0,c=m("div","us-actions");this.$summary=m("div","us-actions-summary",""),this.$summary.setAttribute("role","status"),this.$summary.setAttribute("aria-live","polite"),c.appendChild(this.$summary);let p=m("div","us-actions-buttons");if(this.$cancel=document.createElement("button"),this.$cancel.type="button",this.$cancel.className="us-btn",this.$cancel.textContent="Cancel",this.$cancel.onclick=()=>this.cancel(),p.appendChild(this.$cancel),d||(this.$confirm=document.createElement("button"),this.$confirm.type="button",this.$confirm.className="us-btn us-btn-primary",this.$confirm.innerHTML=`${b.upload} <span>Upload</span>`,this.$confirm.disabled=!0,this.$confirm.onclick=()=>this.startUpload(),p.appendChild(this.$confirm)),c.appendChild(p),t.appendChild(c),!((k=this.opts.branding)!=null&&k.hideFooter)){let g=m("div","us-footer");g.innerHTML=`${b.zap} <span>Powered by <a href="${Ye}" target="_blank" rel="noopener">UnionStack</a></span>`,t.appendChild(g)}e.appendChild(t),((E=this.opts.container)!=null?E:document.body).appendChild(e),this.$backdrop=e,((I=t.querySelector('.us-source-tab[data-active="true"]'))!=null?I:t).focus()}trapFocus(e){if(!this.$panel)return;let t=Array.from(this.$panel.querySelectorAll(Xe)).filter(s=>!s.hasAttribute("disabled")&&s.offsetParent!==null);if(t.length===0)return;let i=t[0],o=t[t.length-1],r=document.activeElement;e.shiftKey&&r===i?(e.preventDefault(),o.focus()):!e.shiftKey&&r===o&&(e.preventDefault(),i.focus())}resolvedSources(){let e=this.opts.fromSources;return!e||e.length===0?["device","url"]:e}renderSourceTabs(e){let t=m("div","us-source-tabs");return t.setAttribute("role","tablist"),t.setAttribute("aria-label","Upload source"),e.forEach((i,o)=>{let r=document.createElement("button");r.type="button",r.className="us-source-tab",r.setAttribute("role","tab"),r.setAttribute("aria-selected","false"),r.tabIndex=-1,r.dataset.source=i,r.innerHTML=i==="device"?`${b.device} <span>My Device</span>`:`${b.link} <span>Link</span>`,r.onclick=()=>this.activateSource(i),r.onkeydown=s=>this.onTabKeydown(s,e,o),t.appendChild(r)}),t}onTabKeydown(e,t,i){var r,s;let o=i;if(e.key==="ArrowRight"||e.key==="ArrowDown")o=(i+1)%t.length;else if(e.key==="ArrowLeft"||e.key==="ArrowUp")o=(i-1+t.length)%t.length;else if(e.key==="Home")o=0;else if(e.key==="End")o=t.length-1;else return;e.preventDefault(),this.activateSource(t[o]),(s=(r=this.$panel)==null?void 0:r.querySelector(`.us-source-tab[data-source="${t[o]}"]`))==null||s.focus()}activateSource(e){var i;if(this.$deviceSource){let o=e==="device";this.$deviceSource.style.display=o?"":"none"}this.$urlSource&&(this.$urlSource.dataset.active=e==="url"?"true":"false");let t=(i=this.$panel)==null?void 0:i.querySelectorAll(".us-source-tab");t==null||t.forEach(o=>{let r=o.dataset.source===e;o.dataset.active=r?"true":"false",o.setAttribute("aria-selected",r?"true":"false"),o.tabIndex=r?0:-1})}renderUrlSource(){let e=m("div","us-url-source"),t=m("div","us-url-form"),i=document.createElement("input");i.type="url",i.className="us-url-input",i.placeholder="https://example.com/photo.jpg",i.setAttribute("aria-label","File URL"),i.onkeydown=s=>{s.key==="Enter"&&(s.preventDefault(),this.handleUrlAdd())},this.$urlInput=i;let o=document.createElement("button");o.type="button",o.className="us-btn us-btn-primary",o.textContent="Add file",o.onclick=()=>this.handleUrlAdd(),this.$urlAddBtn=o,t.appendChild(i),t.appendChild(o),e.appendChild(t);let r=m("div","us-url-hint","Paste a direct file URL. The host must allow CORS so we can fetch it from the browser.");return this.$urlHint=r,e.appendChild(r),e}async handleUrlAdd(){if(!this.$urlInput||!this.$urlAddBtn||!this.$urlHint)return;let e=this.$urlInput.value.trim();if(!e){this.setUrlHint("Enter a URL first.",!0);return}if(!/^https?:\/\//i.test(e)){this.setUrlHint("URL must start with http:// or https://",!0);return}this.$urlAddBtn.disabled=!0;let t=this.$urlAddBtn.textContent;this.$urlAddBtn.textContent="Fetching\u2026",this.setUrlHint("Downloading\u2026",!1);try{let i=await Ze(e);this.addFiles([i]),this.$urlInput.value="",this.setUrlHint("Paste a direct file URL. The host must allow CORS so we can fetch it from the browser.",!1)}catch(i){let o=i.message||"Failed to fetch URL";this.setUrlHint(o,!0)}finally{this.$urlAddBtn.disabled=!1,this.$urlAddBtn.textContent=t||"Add file"}}setUrlHint(e,t){this.$urlHint&&(this.$urlHint.textContent=e,this.$urlHint.dataset.error=t?"true":"false")}renderDropzone(){var s;let e=m("div","us-dropzone");e.setAttribute("role","button"),e.setAttribute("tabindex","0"),e.setAttribute("aria-label","Drop files here or click to browse");let t=m("div","us-dropzone-icon");t.innerHTML=b.fileUp,e.appendChild(t),e.appendChild(m("div","us-dropzone-title","Drop files to upload")),e.appendChild(m("div","us-dropzone-hint","or click to browse from your device"));let i=[];if(this.opts.maxFileSize&&i.push(`max ${O(this.opts.maxFileSize)}`),this.acceptStr){let a=[],l=new Set;for(let d of this.acceptStr.split(",")){let c=d.trim();if(!c||c==="*/*")continue;let p=Je(c);p&&!l.has(p)&&(l.add(p),a.push(p))}a.length>0&&i.push(a.length>5?`${a.slice(0,5).join(", ")} +${a.length-5}`:a.join(", "))}i.length>0&&e.appendChild(m("div","us-dropzone-constraints",i.join(" \xB7 ")));let o=document.createElement("input");o.type="file",o.multiple=((s=this.opts.maxFiles)!=null?s:10)>1,this.acceptStr&&(o.accept=this.acceptStr),o.style.display="none",o.onchange=()=>{o.files&&this.addFiles(Array.from(o.files)),o.value=""},this.$input=o,e.appendChild(o),e.onclick=()=>o.click(),e.onkeydown=a=>{(a.key==="Enter"||a.key===" ")&&(a.preventDefault(),o.click())};let r=0;return e.addEventListener("dragenter",a=>{a.preventDefault(),r++,e.setAttribute("data-drag","over")}),e.addEventListener("dragover",a=>a.preventDefault()),e.addEventListener("dragleave",()=>{r=Math.max(0,r-1),r===0&&e.removeAttribute("data-drag")}),e.addEventListener("drop",a=>{var d;a.preventDefault(),r=0,e.removeAttribute("data-drag");let l=(d=a.dataTransfer)==null?void 0:d.files;l&&this.addFiles(Array.from(l))}),e}unmount(){var e,t,i,o,r;this.editor&&(this.editor.close(),this.editor=null),this.noticeTimer&&(clearTimeout(this.noticeTimer),this.noticeTimer=null),(e=this.$backdrop)!=null&&e.parentNode&&this.$backdrop.parentNode.removeChild(this.$backdrop),this.$backdrop=null,this.$panel=null;for(let s of this.items)s.objectUrl&&URL.revokeObjectURL(s.objectUrl);(i=(t=this.previouslyFocused)==null?void 0:t.focus)==null||i.call(t),this.previouslyFocused=null,(r=(o=this.opts).onClose)==null||r.call(o)}fileMatchesAccept(e){let t=this.acceptStr.split(",").map(r=>r.trim().toLowerCase()).filter(Boolean);if(t.length===0||t.includes("*/*"))return!0;let i=(e.type||"").toLowerCase(),o=e.name.toLowerCase();return t.some(r=>r.startsWith(".")?o.endsWith(r):r.endsWith("/*")?i.startsWith(r.slice(0,-1)):i===r)}addFiles(e){var c;let t=(c=this.opts.maxFiles)!=null?c:1/0,i=0,o=e.filter(p=>this.fileMatchesAccept(p)?!0:(i++,!1)),r=t-this.items.length,s=r>0?o.slice(0,r):[],a=o.length-s.length,l=[];i>0&&l.push(`${i} file${i>1?"s":""} skipped \u2014 unsupported type`),a>0&&l.push(`${a} file${a>1?"s":""} skipped \u2014 max ${t} allowed`);let d=s.filter(p=>p.size===0).length;d>0&&l.push(`${d} empty file${d>1?"s":""} skipped \u2014 open it in iCloud/Drive to download first`),l.length&&this.flashNotice(l.join(" \xB7 "));for(let p of s){if(p.size===0){let u={uploadId:Q(),file:p,originalFile:p,edited:!1,state:"failed",progress:0,error:j,errorCode:"EMPTY_FILE"};this.items.push(u),this.renderItem(u);continue}if(this.opts.maxFileSize&&p.size>this.opts.maxFileSize){let u={uploadId:Q(),file:p,originalFile:p,edited:!1,state:"failed",progress:0,error:`File exceeds ${O(this.opts.maxFileSize)} limit`};this.items.push(u),this.renderItem(u);continue}let f={uploadId:Q(),file:p,originalFile:p,edited:!1,state:"queued",progress:0};this.items.push(f),this.renderItem(f),this.shouldCheckDimensions(p)&&(f.validating=!0,this.validateDimensions(f))}this.refreshConfirm(),this.maybeAutoUpload()}renderItem(e){if(!this.$list)return;let t=m("div","us-file");t.dataset.state=e.state,t.dataset.uploadId=e.uploadId;let i=Math.min(this.items.length-1,8);t.style.animationDelay=`${i*35}ms`;let o=m("div","us-file-thumb");if(e.file.type.startsWith("image/")&&typeof URL!="undefined"&&URL.createObjectURL)try{let h=URL.createObjectURL(e.file);e.objectUrl=h,o.style.backgroundImage=`url("${h}")`,o.dataset.image="true"}catch(h){o.innerHTML=J(e.file.type)}else o.innerHTML=J(e.file.type);t.appendChild(o);let r=m("div","us-file-main"),s=m("div","us-file-row1");s.appendChild(m("div","us-file-name",e.file.name));let a=m("div","us-file-meta",O(e.file.size));s.appendChild(a),r.appendChild(s);let l=m("div","us-file-progress"),d=m("div","us-file-progress-bar");l.appendChild(d),r.appendChild(l);let c=m("div","us-file-error");e.error&&(c.textContent=e.error),r.appendChild(c),t.appendChild(r);let p=e.file.type.startsWith("image/"),f=this.opts.imageEditing!==!1;if(p&&f&&e.state==="queued"){let h=document.createElement("button");h.type="button",h.className="us-file-action",h.setAttribute("aria-label","Edit image"),h.title="Edit image",h.innerHTML=b.pencil,h.dataset.edited=e.edited?"true":"false",h.onclick=()=>this.openEditor(e),t.appendChild(h),e.$edit=h}let u=m("div","us-file-status");u.setAttribute("aria-label",this.statusLabel(e)),u.innerHTML=this.statusIcon(e.state),t.appendChild(u),e.$row=t,e.$bar=d,e.$status=u,e.$meta=a,e.$error=c,e.$thumb=o,this.$list.appendChild(t),this.updateSummary(),this.updateItemBadge(e)}replaceItemFile(e,t,i){if(e.file=t,e.edited=i,e.objectUrl&&URL.revokeObjectURL(e.objectUrl),e.objectUrl=void 0,e.$thumb)if(e.$thumb.style.backgroundImage="",e.$thumb.removeAttribute("data-image"),t.type.startsWith("image/")&&typeof URL!="undefined"&&URL.createObjectURL)try{let o=URL.createObjectURL(t);e.objectUrl=o,e.$thumb.style.backgroundImage=`url("${o}")`,e.$thumb.dataset.image="true",e.$thumb.innerHTML=""}catch(o){e.$thumb.innerHTML=J(t.type)}else e.$thumb.innerHTML=J(t.type);if(e.$meta&&(e.$meta.textContent=O(t.size)),e.$row){let o=e.$row.querySelector(".us-file-name");o&&(o.textContent=t.name)}e.$edit&&(e.$edit.dataset.edited=i?"true":"false")}openEditor(e){if(!this.$panel||this.editor||e.state!=="queued")return;let t=!1;this.editor=new G({host:this.$panel,file:e.file,originalFile:e.originalFile,title:e.originalFile.name,lockedAspect:this.opts.cropAspectRatio,onCropApplied:()=>{t=!0},onAspectReset:()=>{t=!1},onApply:i=>{let o=i!==e.originalFile;this.replaceItemFile(e,i,o),t&&(e.ratioCropped=!0),this.editor=null,this.shouldCheckDimensions(e.file)&&(e.validating=!0,this.validateDimensions(e)),this.updateItemBadge(e),this.refreshConfirm()},onCancel:()=>{this.editor=null}}),this.editor.open()}statusIcon(e){switch(e){case"uploading":return b.spinner;case"done":return b.check;case"failed":return b.alert;case"cancelled":return b.alert;default:return b.clock}}statusLabel(e){switch(e.state){case"queued":return"Waiting to upload";case"uploading":return`Uploading ${Math.round(e.progress)} percent`;case"done":return"Upload complete";case"failed":return e.error?`Failed: ${e.error}`:"Upload failed";case"cancelled":return"Cancelled"}}setItemState(e,t,i){if(e.state=t,i!==void 0&&(e.progress=i),e.$row&&(e.$row.dataset.state=t),e.$bar&&(e.$bar.style.width=`${e.progress}%`),e.$status&&(e.$status.innerHTML=this.statusIcon(t),e.$status.setAttribute("aria-label",this.statusLabel(e))),e.$meta){let o=O(e.file.size);t==="uploading"?e.$meta.textContent=`${o} \xB7 ${Math.round(e.progress)}%`:e.$meta.textContent=o}e.$error&&(e.$error.textContent=t==="failed"?e.error||"Upload failed":""),this.updateSummary()}updateSummary(){if(!this.$summary)return;let e=this.items.length;if(e===0){this.$summary.textContent="";return}let t=this.items.filter(r=>r.state==="done").length,i=this.items.filter(r=>r.state==="failed").length,o=this.items.filter(r=>r.state==="uploading"||r.state==="queued").length;if(!this.uploadStarted&&o>0){let r=this.items.filter(s=>s.state==="queued").length;this.$summary.textContent=`${r} file${r===1?"":"s"} ready`}else o>0?this.$summary.textContent=`Uploading ${t+1} of ${e}`:i>0?this.$summary.textContent=`${t} of ${e} uploaded \xB7 ${i} failed`:t===e?this.$summary.textContent=`${e} file${e===1?"":"s"} uploaded`:this.$summary.textContent=`${e} file${e===1?"":"s"} ready`}needsCrop(e){return this.opts.forceCrop===!0&&!!this.opts.cropAspectRatio&&e.state==="queued"&&e.file.type.startsWith("image/")&&e.file.type!=="image/svg+xml"&&!e.ratioCropped}hasUncroppedImages(){return this.items.some(e=>this.needsCrop(e))}anyValidating(){return this.items.some(e=>e.validating===!0)}shouldCheckDimensions(e){return!!(this.opts.minImageWidth||this.opts.minImageHeight)&&e.type.startsWith("image/")&&e.type!=="image/svg+xml"}updateItemBadge(e){e.$row&&(this.needsCrop(e)?(e.$row.dataset.cropRequired="true",e.$meta&&(e.$meta.textContent="Crop to ratio required")):(delete e.$row.dataset.cropRequired,e.state==="queued"&&e.$meta&&!e.validating&&(e.$meta.textContent=O(e.file.size))))}async validateDimensions(e){var a,l;let t=++this.validateSeqCounter;e.validateSeq=t;let i=(a=this.opts.minImageWidth)!=null?a:0,o=(l=this.opts.minImageHeight)!=null?l:0,r=e.file,s=null;try{s=await Qe(r)}catch(d){s=null}if(e.validateSeq===t){if(e.validating=!1,e.state==="queued")if(s&&s.w>0&&s.h>0&&(s.w<i||s.h<o)){let d=`${i||"?"}\xD7${o||"?"}`;e.error=`Image too small \u2014 needs at least ${d}px (got ${s.w}\xD7${s.h})`,this.setItemState(e,"failed")}else this.updateItemBadge(e);this.refreshConfirm(),this.maybeAutoUpload()}}maybeAutoUpload(){this.opts.autoUpload!==!0||this.uploadStarted||this.anyValidating()||this.hasUncroppedImages()||this.items.some(e=>e.state==="queued")&&requestAnimationFrame(()=>{this.uploadStarted||this.startUpload()})}refreshConfirm(){if(!this.$confirm)return;let e=this.items.filter(t=>t.state==="queued").length;this.$confirm.disabled=e===0||this.uploadStarted||this.hasUncroppedImages()||this.anyValidating()}flashNotice(e){this.$summary&&(this.$summary.textContent=e,this.$summary.dataset.tone="warn",this.noticeTimer&&clearTimeout(this.noticeTimer),this.noticeTimer=setTimeout(()=>{this.$summary&&(this.$summary.textContent="",delete this.$summary.dataset.tone),this.noticeTimer=null},4e3))}async startUpload(){if(this.uploadStarted)return;if(this.anyValidating()){this.flashNotice("Checking image dimensions\u2026");return}if(this.hasUncroppedImages()){this.items.forEach(o=>this.updateItemBadge(o)),this.flashNotice("Crop required \u2014 crop every image to the set ratio before uploading.");return}let e=this.items.filter(o=>o.state==="queued");if(e.length===0)return;this.uploadStarted=!0,this.$confirm&&(this.$confirm.disabled=!0,this.$confirm.textContent="Uploading\u2026"),this.$cancel&&(this.$cancel.textContent="Stop"),this.$closeBtn&&(this.$closeBtn.disabled=!0),this.$input&&(this.$input.disabled=!0);let t=new Map,i=e.map(o=>o.file);try{await this.client.uploadMany(i,$(C({},this.opts),{signal:this.abortCtrl.signal,onUploadStarted:o=>{var r,s;o.forEach((a,l)=>{let d=e[l];d&&(d.uploadId=a.uploadId,d.$row&&(d.$row.dataset.uploadId=a.uploadId),t.set(a.uploadId,d))}),(s=(r=this.opts).onUploadStarted)==null||s.call(r,o)},onFileUploadStarted:o=>{var s,a;let r=t.get(o.uploadId);r&&this.setItemState(r,"uploading",0),(a=(s=this.opts).onFileUploadStarted)==null||a.call(s,o)},onFileUploadProgress:(o,r)=>{var a,l;let s=t.get(o.uploadId);s&&this.setItemState(s,"uploading",r.totalPercent),(l=(a=this.opts).onFileUploadProgress)==null||l.call(a,o,r)},onFileUploadFinished:o=>{var s,a;let r=t.get(o.uploadId);r&&(r.uploaded=o,this.setItemState(r,"done",100)),(a=(s=this.opts).onFileUploadFinished)==null||a.call(s,o)},onFileUploadFailed:(o,r)=>{var a,l;let s=t.get(o.uploadId);s&&(s.error=r.message,s.errorCode=r.code,this.setItemState(s,"failed")),r.code==="EMPTY_FILE"&&this.flashNotice(j),(l=(a=this.opts).onFileUploadFailed)==null||l.call(a,o,r)},onUploadDone:o=>{var r,s;(s=(r=this.opts).onUploadDone)==null||s.call(r,o),this.resolveResult(o),this.unmount()},onError:o=>{var r,s;(s=(r=this.opts).onError)==null||s.call(r,o),this.resolveResult(),this.unmount()}}))}catch(o){this.resolved||(this.resolveResult(),this.unmount())}}resolveResult(e){if(this.resolved)return;this.resolved=!0;let t=e!=null?e:{filesUploaded:this.items.filter(i=>i.uploaded).map(i=>i.uploaded),filesFailed:this.items.filter(i=>i.state==="failed").map(i=>({file:{uploadId:i.uploadId,filename:i.file.name,mimetype:i.file.type||"application/octet-stream",size:i.file.size,source:"local"},error:{code:i.errorCode||"VALIDATION",message:i.error||"failed",retryable:!1}}))};this.resolvePromise(t)}};we={"application/pdf":"PDF","application/msword":"DOC","application/vnd.openxmlformats-officedocument.wordprocessingml.document":"DOCX","application/vnd.ms-excel":"XLS","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"XLSX","application/vnd.ms-powerpoint":"PPT","application/vnd.openxmlformats-officedocument.presentationml.presentation":"PPTX","application/zip":"ZIP","application/json":"JSON","application/rtf":"RTF","text/plain":"TXT","text/csv":"CSV","text/html":"HTML","text/markdown":"MD","image/jpeg":"JPG","image/png":"PNG","image/gif":"GIF","image/webp":"WEBP","image/svg+xml":"SVG","image/heic":"HEIC","video/mp4":"MP4","audio/mpeg":"MP3"},Ge={image:"Images",video:"Video",audio:"Audio",text:"Text",font:"Fonts"}});var Ee={};le(Ee,{Picker:()=>H,openPicker:()=>Z});var ie=W(()=>{"use strict";Ce()});var st={};le(st,{Picker:()=>H,UnionStackClient:()=>D,init:()=>nt,openPicker:()=>Z});V();var pe="0.3.17",ce=`js/${pe}`,dt=`node/${pe}`;var Ae=3,Be=3,ue=[400,1200,3600],Y=class{constructor(e){this.cfg=e}describe(e,t={}){let i=typeof File!="undefined"&&e instanceof File,o=t.filename||(i?e.name:"untitled"),r=t.mimeType||e.type||"application/octet-stream";return{uploadId:ze(),filename:o,mimetype:r,size:e.size,source:"local"}}async upload(e,t={}){var o,r,s,a;let i=this.describe(e,{filename:t.filename,mimeType:t.mimeType});if((o=t.onFileUploadStarted)==null||o.call(t,i),e.size===0){let l=v("EMPTY_FILE",j,{retryable:!1});throw(r=t.onFileUploadFailed)==null||r.call(t,i,l),l}try{let l=await this.initUpload(i,t),d=await this.uploadAllParts(e,l,i,t),c=await this.completeUpload(l.sessionId,d,t),p=$(C({},i),{handle:c.handle,fileId:c.fileId,url:c.url,size:c.size,mimetype:c.mimetype,filename:c.filename,key:c.key,container:c.container,status:"Stored",etag:c.etag,metadata:c.metadata});return(s=t.onFileUploadFinished)==null||s.call(t,p),p}catch(l){let d=he(l);throw(a=t.onFileUploadFailed)==null||a.call(t,i,d),l!=null&&l.sessionId&&this.abortSilently(l.sessionId).catch(()=>{}),d}}async abort(e){await this.api("POST","/sdk/v1/uploads/abort",{sessionId:e})}async fetchPickerConfig(){return this.api("GET","/sdk/v1/picker-config")}async initUpload(e,t){return this.api("POST","/sdk/v1/uploads/init",{filename:e.filename,mimeType:e.mimetype,size:e.size,metadata:t.metadata},t.signal)}async uploadAllParts(e,t,i,o){var M,S;let r=t.totalParts,s=t.chunkSize,a=Math.max(1,(M=o.concurrency)!=null?M:Ae),l=(S=o.maxRetriesPerPart)!=null?S:Be,d=new Map(t.partUrls.map(k=>[k.partNumber,k.url])),c=new Array(r),p=new Array(r).fill(0),f=1,u=e.size,h=()=>{var g;let k=p.reduce((T,y)=>T+y,0),E=u>0?Math.min(100,Math.round(k/u*100)):100,I={totalBytes:u,loaded:k,totalPercent:E};(g=o.onFileUploadProgress)==null||g.call(o,i,I)},R=async()=>{var k,E,I,g,T;for(;;){if((k=o.signal)!=null&&k.aborted)throw v("ABORTED","Upload aborted by caller.",{retryable:!1});let y=f++;if(y>r)return;let _=(y-1)*s,q=Math.min(_+s,e.size),A=e.slice(_,q),B=0,z;for(;B<=l;){if((E=o.signal)!=null&&E.aborted)throw v("ABORTED","Upload aborted by caller.",{retryable:!1});try{let U=d.get(y);U||(U=(await this.api("POST","/sdk/v1/uploads/sign-part",{sessionId:t.sessionId,partNumber:y},o.signal)).url,d.set(y,U));let P=(T=await((g=(I=this.cfg).fetch)==null?void 0:g.call(I,U,{method:"PUT",body:A,signal:o.signal})))!=null?T:await fetch(U,{method:"PUT",body:A,signal:o.signal});if(!P.ok)throw(P.status===403||P.status===401)&&d.delete(y),v("PART_FAILED",`Part ${y} PUT failed (HTTP ${P.status})`,{status:P.status});let N=P.headers.get("etag");if(!N)throw v("PART_FAILED",`Part ${y}: R2 did not return an ETag.`);c[y-1]={partNumber:y,etag:N,size:A.size},p[y-1]=A.size,h();break}catch(U){if(z=U,B++,B>l)break;await He(ue[Math.min(B-1,ue.length-1)])}}if(!c[y-1])throw De(he(z!=null?z:v("PART_FAILED",`Part ${y} failed after ${l} retries.`)),t.sessionId)}},F=Array.from({length:Math.min(a,r)},R);return await Promise.all(F),c}async completeUpload(e,t,i){return this.api("POST","/sdk/v1/uploads/complete",{sessionId:e,parts:t.map(o=>({partNumber:o.partNumber,etag:o.etag}))},i.signal)}async abortSilently(e){try{await this.abort(e)}catch(t){}}async api(e,t,i,o){var d,c;let r=(d=this.cfg.fetch)!=null?d:fetch,s=`${this.cfg.apiBase}${t}`,a;try{a=await r(s,{method:e,headers:{Authorization:`Bearer ${this.cfg.apiKey}`,"Content-Type":"application/json","X-UnionStack-SDK":(c=this.cfg.sdkHeader)!=null?c:ce},body:i===void 0?void 0:JSON.stringify(i),signal:o})}catch(p){throw(p==null?void 0:p.name)==="AbortError"?v("ABORTED","Request aborted.",{retryable:!1,cause:p}):v("NETWORK","Network request failed.",{retryable:!0,cause:p})}let l=null;try{l=await a.json()}catch(p){}if(!a.ok)throw de(a.status,l);return l}};function ze(){return typeof crypto!="undefined"&&"randomUUID"in crypto?crypto.randomUUID().replace(/-/g,""):Math.random().toString(36).slice(2)+Date.now().toString(36)}function He(n){return new Promise(e=>setTimeout(e,n))}function he(n){if(n&&typeof n=="object"&&"code"in n&&"message"in n&&"retryable"in n)return n;let e=(n==null?void 0:n.message)||"Upload failed.";return v("NETWORK",e,{cause:n})}function De(n,e){return n&&typeof n=="object"&&(n.sessionId=e),n}V();var rt="https://api.unionstack.link/v1",Ie="unionstack-preloader-styles";function ot(){if(typeof document=="undefined")return()=>{};if(!document.getElementById(Ie)){let i=document.createElement("style");i.id=Ie,i.textContent="@keyframes us-preload-spin{to{transform:rotate(360deg)}}@keyframes us-preload-fade{from{opacity:0}to{opacity:1}}",document.head.appendChild(i)}let n=document.createElement("div");n.setAttribute("role","status"),n.setAttribute("aria-label","Loading file picker"),n.style.cssText="position:fixed;inset:0;z-index:2147483000;display:flex;align-items:center;justify-content:center;background:rgba(2,6,23,0.4);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);animation:us-preload-fade 140ms ease-out;";let e=document.createElement("div");e.style.cssText="width:36px;height:36px;border-radius:50%;border:3px solid rgba(220,225,251,0.25);border-top-color:#c0c1ff;animation:us-preload-spin 0.8s linear infinite;",n.appendChild(e),document.body.appendChild(n);let t=!1;return()=>{t||(t=!0,n.remove())}}var D=class{constructor(e){e.apiKey||console.error("[UnionStack] apiKey is not set. Uploads and the picker are disabled until a valid apiKey is provided."),this.resolvedCfg=$(C({},e),{apiBase:rt}),this.uploader=new Y(this.resolvedCfg),this.pickerConfigPromise=!e.apiKey||this.resolvedCfg.skipConfigPrefetch?Promise.resolve(null):this.uploader.fetchPickerConfig().then(t=>(t!=null&&t.sdkWarning&&console.warn(`[UnionStack] ${t.sdkWarning}`),t)).catch(()=>null)}missingKeyError(){return this.resolvedCfg.apiKey?null:v("CONFIG","apiKey is required.",{retryable:!1})}upload(e,t={}){let i=this.missingKeyError();return i?Promise.reject(i):this.uploader.upload(e,t)}async uploadMany(e,t={}){var l,d,c,p;let i=this.missingKeyError();if(i)throw(l=t.onError)==null||l.call(t,i),i;if(!Array.isArray(e)||e.length===0){let f=v("VALIDATION","uploadMany requires a non-empty array of files.",{retryable:!1});throw(d=t.onError)==null||d.call(t,f),f}let o=e.map(f=>this.uploader.describe(f,{filename:t.filename,mimeType:t.mimeType}));(c=t.onUploadStarted)==null||c.call(t,o);let r=[],s=[];await Promise.all(e.map(async(f,u)=>{try{let h=await this.uploader.upload(f,t);h.uploadId=o[u].uploadId,r.push(h)}catch(h){s.push({file:o[u],error:h})}}));let a={filesUploaded:r,filesFailed:s};return(p=t.onUploadDone)==null||p.call(t,a),a}picker(e={}){let t=null,i=!1,o,r,s=new Promise((a,l)=>{o=a,r=l});return{open:async()=>{if(i)return s;let a=this.missingKeyError();if(a)throw r(a),a;i=!0;let l=ot();try{t=(await Promise.resolve().then(()=>(ie(),Ee))).openPicker(this,$(C({},e),{onOpen:()=>{var p;l(),(p=e.onOpen)==null||p.call(e)}}));let c=await t.open();return l(),o(c),c}catch(d){l();let c=d!=null&&d.code?d:v("CONFIG","Failed to load picker.",{retryable:!1,cause:d});throw r(c),c}},close:()=>{t==null||t.close()},cancel:()=>{t==null||t.cancel()}}}get config(){return this.resolvedCfg}};var ee={init(n){return new D(n)}};ie();var nt=ee.init.bind(ee);(function(){if(typeof document=="undefined")return;let e=document.currentScript;if(!e)return;let t=e.getAttribute("data-unionstack-key");if(t)try{let i=ee.init({apiKey:t});queueMicrotask(()=>{window.UnionStack&&(window.UnionStack.client=i)})}catch(i){console.error("[UnionStack] auto-init failed:",i)}})();return Le(st);})();
544
544
  //# sourceMappingURL=loader.v1.global.js.map