@masters-union/union-stack 0.1.4 → 0.1.6

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.
@@ -1,81 +1,273 @@
1
- "use strict";var UnionStack=(()=>{var D=Object.defineProperty,se=Object.defineProperties,ae=Object.getOwnPropertyDescriptor,le=Object.getOwnPropertyDescriptors,de=Object.getOwnPropertyNames,K=Object.getOwnPropertySymbols;var W=Object.prototype.hasOwnProperty,pe=Object.prototype.propertyIsEnumerable;var V=(i,e,t)=>e in i?D(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t,x=(i,e)=>{for(var t in e||(e={}))W.call(e,t)&&V(i,t,e[t]);if(K)for(var t of K(e))pe.call(e,t)&&V(i,t,e[t]);return i},w=(i,e)=>se(i,le(e));var j=(i,e)=>()=>(i&&(e=i(i=0)),e);var G=(i,e)=>{for(var t in e)D(i,t,{get:e[t],enumerable:!0})},ce=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of de(e))!W.call(i,o)&&o!==t&&D(i,o,{get:()=>e[o],enumerable:!(r=ae(e,o))||r.enumerable});return i};var ue=i=>ce(D({},"__esModule",{value:!0}),i);function Z(){if(typeof document=="undefined"||document.getElementById(J))return;let i=document.createElement("style");i.id=J,i.textContent=ve,document.head.appendChild(i)}function ee(i){var r,o,n,a,s,l;let t=((i==null?void 0:i.mode)||"light")==="dark"?Pe:ke;return{"--us-primary":(r=i==null?void 0:i.primary)!=null?r:t.primary,"--us-bg":(o=i==null?void 0:i.background)!=null?o:t.background,"--us-fg":(n=i==null?void 0:i.foreground)!=null?n:t.foreground,"--us-muted":(a=i==null?void 0:i.muted)!=null?a:t.muted,"--us-border":(s=i==null?void 0:i.border)!=null?s:t.border,"--us-radius":(l=i==null?void 0:i.radius)!=null?l:"12px"}}var J,ke,Pe,ve,te=j(()=>{"use strict";J="unionstack-picker-styles";ke={primary:"#4f46e5",background:"#ffffff",foreground:"#0f172a",muted:"#64748b",border:"#e2e8f0"},Pe={primary:"#6366f1",background:"#0f172a",foreground:"#f1f5f9",muted:"#94a3b8",border:"#1e293b"},ve=`
1
+ "use strict";var UnionStack=(()=>{var j=Object.defineProperty,le=Object.defineProperties,de=Object.getOwnPropertyDescriptor,pe=Object.getOwnPropertyDescriptors,ce=Object.getOwnPropertyNames,W=Object.getOwnPropertySymbols;var G=Object.prototype.hasOwnProperty,ue=Object.prototype.propertyIsEnumerable;var Y=(r,e,t)=>e in r?j(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,$=(r,e)=>{for(var t in e||(e={}))G.call(e,t)&&Y(r,t,e[t]);if(W)for(var t of W(e))ue.call(e,t)&&Y(r,t,e[t]);return r},z=(r,e)=>le(r,pe(e));var q=(r,e)=>()=>(r&&(e=r(r=0)),e);var Q=(r,e)=>{for(var t in e)j(r,t,{get:e[t],enumerable:!0})},fe=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of ce(e))!G.call(r,i)&&i!==t&&j(r,i,{get:()=>e[i],enumerable:!(o=de(e,i))||o.enumerable});return r};var me=r=>fe(j({},"__esModule",{value:!0}),r);function te(){if(typeof document=="undefined"||document.getElementById(ee))return;let r=document.createElement("style");r.id=ee,r.textContent=Ue,document.head.appendChild(r)}function re(r){var o,i,s,a,n;let t=((r==null?void 0:r.mode)||"light")==="dark"?we:xe;return{"--us-primary":(o=r==null?void 0:r.primary)!=null?o:t.primary,"--us-bg":(i=r==null?void 0:r.background)!=null?i:t.background,"--us-fg":(s=r==null?void 0:r.foreground)!=null?s:t.foreground,"--us-muted":t.muted,"--us-subtle":t.subtle,"--us-border":(a=r==null?void 0:r.border)!=null?a:t.border,"--us-border-strong":t.borderStrong,"--us-elevated":t.elevated,"--us-success":t.success,"--us-danger":t.danger,"--us-radius":(n=r==null?void 0:r.radius)!=null?n:"12px"}}var ee,xe,we,Ue,ie=q(()=>{"use strict";ee="unionstack-picker-styles";xe={primary:"#4f46e5",background:"#ffffff",foreground:"#0f172a",muted:"#64748b",subtle:"#f8fafc",border:"#e2e8f0",borderStrong:"#cbd5e1",elevated:"#ffffff",success:"#16a34a",danger:"#dc2626"},we={primary:"#818cf8",background:"#0b0f1a",foreground:"#f1f5f9",muted:"#94a3b8",subtle:"#111827",border:"#1f2937",borderStrong:"#334155",elevated:"#0f1625",success:"#4ade80",danger:"#f87171"},Ue=`
2
2
  .us-picker-backdrop {
3
3
  position: fixed; inset: 0; z-index: 2147483000;
4
- background: rgba(2, 6, 23, 0.55);
4
+ background: color-mix(in srgb, #02060f 55%, transparent);
5
+ -webkit-backdrop-filter: blur(8px);
6
+ backdrop-filter: blur(8px);
5
7
  display: flex; align-items: center; justify-content: center;
6
- padding: 16px; font-family: ui-sans-serif, system-ui, sans-serif;
7
- animation: us-fade 120ms ease-out;
8
+ padding: 16px;
9
+ font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
10
+ animation: us-fade 140ms ease-out;
8
11
  }
9
12
  @keyframes us-fade { from { opacity: 0; } to { opacity: 1; } }
13
+
10
14
  .us-picker {
11
15
  background: var(--us-bg); color: var(--us-fg);
16
+ border: 1px solid var(--us-border);
12
17
  border-radius: var(--us-radius);
13
- width: 100%; max-width: 480px; max-height: calc(100vh - 32px);
18
+ width: 100%; max-width: 480px;
19
+ max-height: min(calc(100dvh - 32px), 680px);
14
20
  display: flex; flex-direction: column;
15
- box-shadow: 0 25px 50px -12px rgba(0,0,0,0.4);
21
+ box-shadow:
22
+ 0 1px 1px rgba(0,0,0,0.04),
23
+ 0 18px 40px -8px rgba(0,0,0,0.18),
24
+ 0 32px 80px -16px rgba(0,0,0,0.22);
16
25
  overflow: hidden;
26
+ animation: us-rise 240ms cubic-bezier(0.16, 1, 0.3, 1);
27
+ }
28
+ @keyframes us-rise {
29
+ from { opacity: 0; transform: translateY(8px) scale(0.985); }
30
+ to { opacity: 1; transform: translateY(0) scale(1); }
17
31
  }
18
32
  .us-picker * { box-sizing: border-box; }
33
+
34
+ /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
19
35
  .us-picker-header {
20
36
  display: flex; align-items: center; gap: 12px;
21
- padding: 16px 20px; border-bottom: 1px solid var(--us-border);
37
+ padding: 14px 16px;
38
+ border-bottom: 1px solid var(--us-border);
39
+ }
40
+ .us-picker-header-logo {
41
+ display: inline-flex; align-items: center; justify-content: center;
42
+ width: 28px; height: 28px; flex-shrink: 0;
43
+ border-radius: 8px;
44
+ background: var(--us-subtle);
45
+ color: var(--us-primary);
22
46
  }
23
- .us-picker-header img { height: 24px; }
24
- .us-picker-title { font-weight: 600; font-size: 16px; flex: 1; }
47
+ .us-picker-header-logo svg { width: 16px; height: 16px; }
48
+ .us-picker-header-logo img { width: 100%; height: 100%; border-radius: inherit; object-fit: cover; }
49
+ .us-picker-title { font-weight: 600; font-size: 14px; letter-spacing: -0.01em; flex: 1; }
25
50
  .us-picker-close {
26
51
  background: none; border: 0; cursor: pointer;
27
- color: var(--us-muted); font-size: 22px; line-height: 1;
28
- padding: 4px 8px; border-radius: 6px;
52
+ width: 32px; height: 32px;
53
+ display: inline-flex; align-items: center; justify-content: center;
54
+ color: var(--us-muted); border-radius: 8px;
55
+ transition: color 140ms, background 140ms;
29
56
  }
30
- .us-picker-close:hover { background: var(--us-border); color: var(--us-fg); }
31
- .us-picker-body { padding: 20px; overflow-y: auto; }
57
+ .us-picker-close:hover { background: var(--us-subtle); color: var(--us-fg); }
58
+ .us-picker-close:focus-visible { outline: 2px solid var(--us-primary); outline-offset: 1px; }
59
+ .us-picker-close svg { width: 16px; height: 16px; }
60
+
61
+ /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 body / dropzone \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
62
+ .us-picker-body { padding: 16px; overflow-y: auto; }
63
+
32
64
  .us-dropzone {
33
- border: 2px dashed var(--us-border); border-radius: var(--us-radius);
34
- padding: 32px 20px; text-align: center; cursor: pointer;
35
- transition: border-color 120ms, background 120ms;
65
+ position: relative;
66
+ border: 1.5px dashed var(--us-border-strong);
67
+ border-radius: calc(var(--us-radius) - 2px);
68
+ padding: 28px 20px;
69
+ text-align: center;
70
+ cursor: pointer;
71
+ transition: border-color 160ms, background 160ms, transform 200ms cubic-bezier(0.16, 1, 0.3, 1);
72
+ background: color-mix(in srgb, var(--us-subtle) 60%, transparent);
73
+ }
74
+ .us-dropzone:hover {
75
+ border-color: var(--us-primary);
76
+ background: color-mix(in srgb, var(--us-primary) 4%, var(--us-bg));
77
+ }
78
+ .us-dropzone:focus-visible {
79
+ outline: 2px solid var(--us-primary); outline-offset: 2px;
36
80
  }
37
- .us-dropzone:hover, .us-dropzone[data-drag="over"] {
81
+ .us-dropzone[data-drag="over"] {
82
+ border-style: solid;
38
83
  border-color: var(--us-primary);
39
- background: color-mix(in srgb, var(--us-primary) 5%, transparent);
84
+ background: color-mix(in srgb, var(--us-primary) 8%, var(--us-bg));
85
+ transform: scale(1.005);
86
+ }
87
+ .us-dropzone-icon {
88
+ width: 44px; height: 44px;
89
+ border-radius: 12px;
90
+ background: color-mix(in srgb, var(--us-primary) 12%, var(--us-bg));
91
+ color: var(--us-primary);
92
+ display: inline-flex; align-items: center; justify-content: center;
93
+ margin-bottom: 12px;
94
+ transition: transform 240ms cubic-bezier(0.16, 1.4, 0.3, 1);
95
+ }
96
+ .us-dropzone:hover .us-dropzone-icon { transform: translateY(-2px); }
97
+ .us-dropzone[data-drag="over"] .us-dropzone-icon {
98
+ transform: translateY(-3px) scale(1.06);
99
+ background: color-mix(in srgb, var(--us-primary) 18%, var(--us-bg));
100
+ }
101
+ .us-dropzone-icon svg { width: 22px; height: 22px; }
102
+ .us-dropzone-title {
103
+ font-size: 14px; font-weight: 600; letter-spacing: -0.01em;
104
+ margin-bottom: 2px;
105
+ }
106
+ .us-dropzone-hint { color: var(--us-muted); font-size: 12.5px; }
107
+ .us-dropzone-constraints {
108
+ margin-top: 10px;
109
+ font-size: 11px; color: var(--us-muted);
110
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
111
+ letter-spacing: 0.02em;
112
+ }
113
+
114
+ .us-dropzone--compact {
115
+ padding: 12px 16px;
116
+ display: flex; align-items: center; gap: 12px;
117
+ text-align: left;
118
+ }
119
+ .us-dropzone--compact .us-dropzone-icon {
120
+ width: 32px; height: 32px; border-radius: 8px; margin-bottom: 0;
40
121
  }
41
- .us-dropzone-title { font-weight: 500; margin-bottom: 4px; }
42
- .us-dropzone-hint { color: var(--us-muted); font-size: 13px; }
43
- .us-file-list { display: flex; flex-direction: column; gap: 8px; margin-top: 16px; }
122
+ .us-dropzone--compact .us-dropzone-icon svg { width: 16px; height: 16px; }
123
+ .us-dropzone--compact .us-dropzone-title { font-size: 13px; margin: 0; }
124
+ .us-dropzone--compact .us-dropzone-hint { display: none; }
125
+ .us-dropzone--compact .us-dropzone-constraints { display: none; }
126
+
127
+ /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 file list \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
128
+ .us-file-list { display: flex; flex-direction: column; gap: 8px; margin-top: 14px; }
129
+
44
130
  .us-file {
45
131
  display: flex; align-items: center; gap: 12px;
46
- padding: 10px 12px; border: 1px solid var(--us-border);
47
- border-radius: 10px; font-size: 14px;
132
+ padding: 10px 12px;
133
+ background: var(--us-elevated);
134
+ border: 1px solid var(--us-border);
135
+ border-radius: 10px;
136
+ transition: border-color 140ms, background 140ms;
137
+ animation: us-row-in 280ms cubic-bezier(0.16, 1, 0.3, 1) backwards;
138
+ position: relative;
48
139
  }
49
- .us-file-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
50
- .us-file-meta { color: var(--us-muted); font-size: 12px; }
140
+ @keyframes us-row-in {
141
+ from { opacity: 0; transform: translateY(6px); }
142
+ to { opacity: 1; transform: translateY(0); }
143
+ }
144
+ .us-file[data-state="done"] { border-color: color-mix(in srgb, var(--us-success) 30%, var(--us-border)); }
145
+ .us-file[data-state="failed"] { border-color: color-mix(in srgb, var(--us-danger) 30%, var(--us-border)); }
146
+
147
+ .us-file-thumb {
148
+ width: 40px; height: 40px; flex-shrink: 0;
149
+ border-radius: 8px;
150
+ background: var(--us-subtle);
151
+ background-size: cover; background-position: center;
152
+ display: inline-flex; align-items: center; justify-content: center;
153
+ color: var(--us-muted);
154
+ overflow: hidden;
155
+ }
156
+ .us-file-thumb[data-image="true"] { color: transparent; }
157
+ .us-file-thumb svg { width: 18px; height: 18px; }
158
+
159
+ .us-file-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
160
+ .us-file-row1 { display: flex; align-items: center; gap: 8px; }
161
+ .us-file-name {
162
+ font-size: 13px; font-weight: 500;
163
+ flex: 1; min-width: 0;
164
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
165
+ letter-spacing: -0.005em;
166
+ }
167
+ .us-file-meta { color: var(--us-muted); font-size: 11.5px; flex-shrink: 0; font-variant-numeric: tabular-nums; }
168
+
51
169
  .us-file-progress {
52
- height: 4px; background: var(--us-border); border-radius: 999px; overflow: hidden;
53
- margin-top: 6px;
170
+ height: 3px; background: var(--us-border); border-radius: 999px; overflow: hidden;
171
+ position: relative;
54
172
  }
55
173
  .us-file-progress-bar {
56
- height: 100%; background: var(--us-primary);
57
- width: 0%; transition: width 200ms;
174
+ height: 100%; width: 0%;
175
+ background: var(--us-primary);
176
+ border-radius: inherit;
177
+ transition: width 260ms cubic-bezier(0.4, 0.0, 0.2, 1);
178
+ position: relative;
179
+ }
180
+ /* Shimmer overlay while uploading. Stops on terminal states. */
181
+ .us-file[data-state="uploading"] .us-file-progress-bar::after {
182
+ content: ""; position: absolute; inset: 0;
183
+ background: linear-gradient(
184
+ 90deg,
185
+ transparent 0%,
186
+ color-mix(in srgb, #fff 35%, transparent) 50%,
187
+ transparent 100%
188
+ );
189
+ animation: us-shimmer 1.4s linear infinite;
190
+ }
191
+ @keyframes us-shimmer {
192
+ from { transform: translateX(-100%); }
193
+ to { transform: translateX(100%); }
58
194
  }
59
- .us-file[data-state="done"] .us-file-progress-bar { background: #16a34a; width: 100%; }
60
- .us-file[data-state="failed"] .us-file-progress-bar { background: #dc2626; }
195
+ .us-file[data-state="done"] .us-file-progress-bar { width: 100% !important; background: var(--us-success); }
196
+ .us-file[data-state="failed"] .us-file-progress-bar { background: var(--us-danger); }
197
+
198
+ .us-file-status {
199
+ flex-shrink: 0;
200
+ display: inline-flex; align-items: center; justify-content: center;
201
+ width: 24px; height: 24px;
202
+ color: var(--us-muted);
203
+ }
204
+ .us-file-status svg { width: 18px; height: 18px; }
205
+ .us-file[data-state="done"] .us-file-status { color: var(--us-success); animation: us-pop 320ms cubic-bezier(0.16, 1.4, 0.3, 1); }
206
+ .us-file[data-state="failed"] .us-file-status { color: var(--us-danger); animation: us-pop 320ms cubic-bezier(0.16, 1.4, 0.3, 1); }
207
+ .us-file[data-state="uploading"] .us-file-status { animation: us-spin 0.9s linear infinite; }
208
+ @keyframes us-pop {
209
+ from { transform: scale(0.5); opacity: 0; }
210
+ to { transform: scale(1); opacity: 1; }
211
+ }
212
+ @keyframes us-spin {
213
+ from { transform: rotate(0deg); }
214
+ to { transform: rotate(360deg); }
215
+ }
216
+
217
+ /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 actions / footer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
61
218
  .us-actions {
62
- display: flex; gap: 8px; justify-content: flex-end;
63
- padding: 14px 20px; border-top: 1px solid var(--us-border);
219
+ display: flex; gap: 8px; justify-content: space-between; align-items: center;
220
+ padding: 12px 16px;
221
+ border-top: 1px solid var(--us-border);
64
222
  }
223
+ .us-actions-summary { font-size: 12px; color: var(--us-muted); font-variant-numeric: tabular-nums; }
224
+ .us-actions-buttons { display: flex; gap: 8px; }
225
+
65
226
  .us-btn {
66
- padding: 8px 14px; border-radius: 8px; border: 1px solid var(--us-border);
67
- background: transparent; color: var(--us-fg); cursor: pointer; font-size: 14px;
68
- font-weight: 500;
227
+ appearance: none;
228
+ display: inline-flex; align-items: center; justify-content: center; gap: 6px;
229
+ padding: 8px 14px; min-height: 36px;
230
+ border-radius: 8px; border: 1px solid var(--us-border);
231
+ background: transparent; color: var(--us-fg);
232
+ cursor: pointer; font-size: 13px; font-weight: 500;
233
+ font-family: inherit; letter-spacing: -0.005em;
234
+ transition: background 140ms, border-color 140ms, transform 80ms ease-out;
69
235
  }
70
- .us-btn:hover { background: var(--us-border); }
236
+ .us-btn:hover { background: var(--us-subtle); border-color: var(--us-border-strong); }
237
+ .us-btn:active { transform: scale(0.98); }
238
+ .us-btn:focus-visible { outline: 2px solid var(--us-primary); outline-offset: 2px; }
71
239
  .us-btn-primary {
72
- background: var(--us-primary); color: white; border-color: var(--us-primary);
240
+ background: var(--us-primary); color: white;
241
+ border-color: var(--us-primary);
73
242
  }
74
- .us-btn-primary:hover { filter: brightness(0.95); }
243
+ .us-btn-primary:hover { filter: brightness(0.95); background: var(--us-primary); }
75
244
  .us-btn[disabled] { opacity: 0.5; cursor: not-allowed; }
245
+ .us-btn[disabled]:hover { transform: none; }
246
+ .us-btn svg { width: 14px; height: 14px; }
247
+
76
248
  .us-footer {
77
- padding: 8px 20px; font-size: 11px; color: var(--us-muted); text-align: center;
249
+ padding: 8px 16px 12px;
250
+ font-size: 11px; color: var(--us-muted); text-align: center;
251
+ display: flex; align-items: center; justify-content: center; gap: 6px;
252
+ }
253
+ .us-footer svg { width: 11px; height: 11px; opacity: 0.7; }
254
+ .us-footer a { color: var(--us-muted); text-decoration: none; font-weight: 500; }
255
+ .us-footer a:hover { color: var(--us-fg); }
256
+
257
+ /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 reduced motion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
258
+ @media (prefers-reduced-motion: reduce) {
259
+ .us-picker-backdrop,
260
+ .us-picker,
261
+ .us-file,
262
+ .us-dropzone,
263
+ .us-dropzone-icon,
264
+ .us-btn,
265
+ .us-file-status,
266
+ .us-file-progress-bar { animation: none !important; transition: none !important; }
267
+ .us-file[data-state="uploading"] .us-file-progress-bar::after { animation: none; opacity: 0; }
78
268
  }
79
- .us-footer a { color: var(--us-muted); }
80
- `});function Ue(i,e){var n,a,s,l,d,p,h,c,b,S,R,A,I,T,g,k,P,y,v,f;let t=x({},e),r=e.branding||{};t.branding={logoUrl:(a=(n=r.logoUrl)!=null?n:i.branding.logoUrl)!=null?a:void 0,title:(l=(s=r.title)!=null?s:i.branding.title)!=null?l:void 0,hideFooter:(d=r.hideFooter)!=null?d:i.branding.hideFooter};let o=e.theme||{};if(t.theme={primary:(h=(p=o.primary)!=null?p:i.theme.primary)!=null?h:void 0,background:(b=(c=o.background)!=null?c:i.theme.background)!=null?b:void 0,foreground:(R=(S=o.foreground)!=null?S:i.theme.foreground)!=null?R:void 0,border:(I=(A=o.border)!=null?A:i.theme.border)!=null?I:void 0,radius:(g=(T=o.radius)!=null?T:i.theme.radius)!=null?g:void 0,mode:(P=(k=o.mode)!=null?k:i.theme.mode)!=null?P:void 0},t.maxFileSize=(y=e.maxFileSize)!=null?y:i.constraints.maxFileSizeBytes,t.maxFiles=(v=e.maxFiles)!=null?v:i.constraints.maxFilesPerUpload,!e.accept&&((f=i.constraints.allowedMimeTypes)!=null&&f.length)){let $=i.constraints.allowedMimeTypes.filter(H=>H!=="*/*");$.length>0&&(t.accept=$.join(","))}return t}function m(i,e,t){let r=document.createElement(i);return e&&(r.className=e),t!==void 0&&(r.textContent=t),r}function ie(i){return i<1024?`${i} B`:i<1024*1024?`${(i/1024).toFixed(1)} KB`:i<1024*1024*1024?`${(i/1024/1024).toFixed(1)} MB`:`${(i/1024/1024/1024).toFixed(2)} GB`}function re(){return typeof crypto!="undefined"&&"randomUUID"in crypto?crypto.randomUUID().replace(/-/g,""):Math.random().toString(36).slice(2)+Date.now().toString(36)}function M(i,e){let t=new C(i,e);return{open:()=>t.open(),close:()=>t.close(),cancel:()=>t.cancel()}}var xe,Ce,C,oe=j(()=>{"use strict";te();xe="Upload files",Ce="https://unionstack.mastersunion.link",C=class{constructor(e,t){this.client=e;this.opts=t;this.$backdrop=null;this.$list=null;this.$confirm=null;this.$cancel=null;this.$closeBtn=null;this.$input=null;this.items=[];this.abortCtrl=new AbortController;this.uploadStarted=!1;this.resolved=!1;this.donePromise=new Promise(r=>{this.resolvePromise=r})}async open(){var e,t;if(typeof document=="undefined")throw new Error("[union-stack] Picker requires a browser environment.");try{let r=await this.client.pickerConfigPromise;r&&(this.opts=Ue(r,this.opts))}catch(r){}return Z(),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()}mount(){var s,l,d,p,h;let e=document.createElement("div");e.className="us-picker-backdrop",Object.entries(ee(this.opts.theme)).forEach(([c,b])=>{e.style.setProperty(c,b)}),e.addEventListener("click",c=>{c.target===e&&!this.uploadStarted&&this.cancel()});let t=m("div","us-picker"),r=m("div","us-picker-header");if((s=this.opts.branding)!=null&&s.logoUrl){let c=document.createElement("img");c.src=this.opts.branding.logoUrl,c.alt="logo",r.appendChild(c)}let o=m("div","us-picker-title",(d=(l=this.opts.branding)==null?void 0:l.title)!=null?d:xe);r.appendChild(o),this.$closeBtn=document.createElement("button"),this.$closeBtn.type="button",this.$closeBtn.className="us-picker-close",this.$closeBtn.setAttribute("aria-label","Close"),this.$closeBtn.textContent="\xD7",this.$closeBtn.onclick=()=>this.cancel(),r.appendChild(this.$closeBtn),t.appendChild(r);let n=m("div","us-picker-body");n.appendChild(this.renderDropzone()),this.$list=m("div","us-file-list"),n.appendChild(this.$list),t.appendChild(n);let a=m("div","us-actions");if(this.$cancel=document.createElement("button"),this.$cancel.type="button",this.$cancel.className="us-btn",this.$cancel.textContent="Cancel",this.$cancel.onclick=()=>this.cancel(),this.$confirm=document.createElement("button"),this.$confirm.type="button",this.$confirm.className="us-btn us-btn-primary",this.$confirm.textContent="Upload",this.$confirm.disabled=!0,this.$confirm.onclick=()=>this.startUpload(),a.appendChild(this.$cancel),a.appendChild(this.$confirm),t.appendChild(a),!((p=this.opts.branding)!=null&&p.hideFooter)){let c=m("div","us-footer");c.innerHTML=`Powered by <a href="${Ce}" target="_blank" rel="noopener">UnionStack</a>`,t.appendChild(c)}e.appendChild(t),((h=this.opts.container)!=null?h:document.body).appendChild(e),this.$backdrop=e}renderDropzone(){var r;let e=m("div","us-dropzone");e.setAttribute("role","button"),e.setAttribute("tabindex","0"),e.appendChild(m("div","us-dropzone-title","Drag files here")),e.appendChild(m("div","us-dropzone-hint","or click to browse"));let t=document.createElement("input");return t.type="file",t.multiple=((r=this.opts.maxFiles)!=null?r:10)>1,this.opts.accept&&(t.accept=this.opts.accept),t.style.display="none",t.onchange=()=>{t.files&&this.addFiles(Array.from(t.files)),t.value=""},this.$input=t,e.appendChild(t),e.onclick=()=>t.click(),e.onkeydown=o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),t.click())},e.addEventListener("dragover",o=>{o.preventDefault(),e.setAttribute("data-drag","over")}),e.addEventListener("dragleave",()=>e.removeAttribute("data-drag")),e.addEventListener("drop",o=>{var a;o.preventDefault(),e.removeAttribute("data-drag");let n=(a=o.dataTransfer)==null?void 0:a.files;n&&this.addFiles(Array.from(n))}),e}unmount(){var e,t,r;(e=this.$backdrop)!=null&&e.parentNode&&this.$backdrop.parentNode.removeChild(this.$backdrop),this.$backdrop=null,(r=(t=this.opts).onClose)==null||r.call(t)}addFiles(e){var n;let r=((n=this.opts.maxFiles)!=null?n:1/0)-this.items.length;if(r<=0)return;let o=e.slice(0,r);for(let a of o){if(this.opts.maxFileSize&&a.size>this.opts.maxFileSize){let l={uploadId:re(),file:a,state:"failed",progress:0,error:`File exceeds ${ie(this.opts.maxFileSize)} limit`};this.items.push(l),this.renderItem(l);continue}let s={uploadId:re(),file:a,state:"queued",progress:0};this.items.push(s),this.renderItem(s)}this.refreshConfirm()}renderItem(e){if(!this.$list)return;let t=m("div","us-file");t.dataset.state=e.state,t.dataset.uploadId=e.uploadId;let r=m("div","","");r.style.flex="1",r.style.minWidth="0",r.appendChild(m("div","us-file-name",e.file.name));let o=m("div","us-file-meta",ie(e.file.size));r.appendChild(o);let n=m("div","us-file-progress"),a=m("div","us-file-progress-bar");n.appendChild(a),r.appendChild(n),t.appendChild(r);let s=m("div","us-file-meta");s.style.minWidth="60px",s.style.textAlign="right",s.textContent=e.state==="failed"?e.error||"failed":e.state==="done"?"done":"0%",t.appendChild(s),e.$row=t,e.$bar=a,e.$status=s,this.$list.appendChild(t)}setItemState(e,t,r){e.state=t,r!==void 0&&(e.progress=r),e.$row&&(e.$row.dataset.state=t),e.$bar&&(e.$bar.style.width=`${e.progress}%`),e.$status&&(t==="failed"?e.$status.textContent=e.error||"failed":t==="done"?e.$status.textContent="done":e.$status.textContent=`${Math.round(e.progress)}%`)}refreshConfirm(){if(!this.$confirm)return;let e=this.items.filter(t=>t.state==="queued").length;this.$confirm.disabled=e===0||this.uploadStarted}async startUpload(){if(this.uploadStarted)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,r=e.map(o=>o.file);try{await this.client.uploadMany(r,w(x({},this.opts),{signal:this.abortCtrl.signal,onUploadStarted:o=>{var n,a;o.forEach((s,l)=>{let d=e[l];d&&(d.uploadId=s.uploadId,d.$row&&(d.$row.dataset.uploadId=s.uploadId),t.set(s.uploadId,d))}),(a=(n=this.opts).onUploadStarted)==null||a.call(n,o)},onFileUploadStarted:o=>{var a,s;let n=t.get(o.uploadId);n&&this.setItemState(n,"uploading",0),(s=(a=this.opts).onFileUploadStarted)==null||s.call(a,o)},onFileUploadProgress:(o,n)=>{var s,l;let a=t.get(o.uploadId);a&&this.setItemState(a,"uploading",n.totalPercent),(l=(s=this.opts).onFileUploadProgress)==null||l.call(s,o,n)},onFileUploadFinished:o=>{var a,s;let n=t.get(o.uploadId);n&&(n.uploaded=o,this.setItemState(n,"done",100)),(s=(a=this.opts).onFileUploadFinished)==null||s.call(a,o)},onFileUploadFailed:(o,n)=>{var s,l;let a=t.get(o.uploadId);a&&(a.error=n.message,this.setItemState(a,"failed")),(l=(s=this.opts).onFileUploadFailed)==null||l.call(s,o,n)},onUploadDone:o=>{var n,a;(a=(n=this.opts).onUploadDone)==null||a.call(n,o),this.resolveResult(o),this.unmount()},onError:o=>{var n,a;(a=(n=this.opts).onError)==null||a.call(n,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(r=>r.uploaded).map(r=>r.uploaded),filesFailed:this.items.filter(r=>r.state==="failed").map(r=>({file:{uploadId:r.uploadId,filename:r.file.name,mimetype:r.file.type||"application/octet-stream",size:r.file.size,source:"local"},error:{code:"VALIDATION",message:r.error||"failed",retryable:!1}}))};this.resolvePromise(t)}}});var ne={};G(ne,{Picker:()=>C,openPicker:()=>M});var _=j(()=>{"use strict";oe()});var we={};G(we,{Picker:()=>C,UnionStackClient:()=>E,init:()=>Fe,openPicker:()=>M});function u(i,e,t={}){var r;return{code:i,message:e,status:t.status,retryable:(r=t.retryable)!=null?r:fe(i,t.status),cause:t.cause}}function fe(i,e){return!!(i==="NETWORK"||i==="PART_FAILED"||i==="SERVER"&&e&&e>=500)}function Q(i,e){let t=e==null?void 0:e.error,r=(t==null?void 0:t.message)||`Request failed with status ${i}`,o=((t==null?void 0:t.code)||"").toUpperCase();if(i===401)return u("AUTH",r,{status:i,retryable:!1});if(i===403)return u("AUTH",r,{status:i,retryable:!1});if(i===413)return u("VALIDATION",r,{status:i,retryable:!1});if(i===415)return u("VALIDATION",r,{status:i,retryable:!1});if(i===429){let n=o==="QUOTA_EXCEEDED";return u(n?"QUOTA":"NETWORK",r,{status:i,retryable:!n})}return i>=500?u("SERVER",r,{status:i,retryable:!0}):u("SERVER",r,{status:i,retryable:!1})}var me=3,he=3,X=[400,1200,3600],L=class{constructor(e){this.cfg=e}describe(e,t={}){let r=typeof File!="undefined"&&e instanceof File,o=t.filename||(r?e.name:"untitled"),n=t.mimeType||e.type||"application/octet-stream";return{uploadId:ge(),filename:o,mimetype:n,size:e.size,source:"local"}}async upload(e,t={}){var o,n,a;let r=this.describe(e,{filename:t.filename,mimeType:t.mimeType});(o=t.onFileUploadStarted)==null||o.call(t,r);try{let s=await this.initUpload(r,t),l=await this.uploadAllParts(e,s,r,t),d=await this.completeUpload(s.sessionId,l,t),p=w(x({},r),{handle:d.handle,fileId:d.fileId,url:d.url,size:d.size,mimetype:d.mimetype,filename:d.filename,status:"Stored",etag:d.etag});return(n=t.onFileUploadFinished)==null||n.call(t,p),p}catch(s){let l=Y(s);throw(a=t.onFileUploadFailed)==null||a.call(t,r,l),s!=null&&s.sessionId&&this.abortSilently(s.sessionId).catch(()=>{}),l}}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,r,o){var I,T;let n=t.totalParts,a=t.chunkSize,s=Math.max(1,(I=o.concurrency)!=null?I:me),l=(T=o.maxRetriesPerPart)!=null?T:he,d=new Map(t.partUrls.map(g=>[g.partNumber,g.url])),p=new Array(n),h=new Array(n).fill(0),c=1,b=e.size,S=()=>{var y;let g=h.reduce((v,f)=>v+f,0),k=b>0?Math.min(100,Math.round(g/b*100)):100,P={totalBytes:b,loaded:g,totalPercent:k};(y=o.onFileUploadProgress)==null||y.call(o,r,P)},R=async()=>{var g,k,P,y,v;for(;;){if((g=o.signal)!=null&&g.aborted)throw u("ABORTED","Upload aborted by caller.",{retryable:!1});let f=c++;if(f>n)return;let $=(f-1)*a,H=Math.min($+a,e.size),z=e.slice($,H),O=0,B;for(;O<=l;){if((k=o.signal)!=null&&k.aborted)throw u("ABORTED","Upload aborted by caller.",{retryable:!1});try{let U=d.get(f);U||(U=(await this.api("POST","/sdk/v1/uploads/sign-part",{sessionId:t.sessionId,partNumber:f},o.signal)).url,d.set(f,U));let F=(v=await((y=(P=this.cfg).fetch)==null?void 0:y.call(P,U,{method:"PUT",body:z,signal:o.signal})))!=null?v:await fetch(U,{method:"PUT",body:z,signal:o.signal});if(!F.ok)throw(F.status===403||F.status===401)&&d.delete(f),u("PART_FAILED",`Part ${f} PUT failed (HTTP ${F.status})`,{status:F.status});let q=F.headers.get("etag");if(!q)throw u("PART_FAILED",`Part ${f}: R2 did not return an ETag.`);p[f-1]={partNumber:f,etag:q,size:z.size},h[f-1]=z.size,S();break}catch(U){if(B=U,O++,O>l)break;await be(X[Math.min(O-1,X.length-1)])}}if(!p[f-1])throw ye(Y(B!=null?B:u("PART_FAILED",`Part ${f} failed after ${l} retries.`)),t.sessionId)}},A=Array.from({length:Math.min(s,n)},R);return await Promise.all(A),p}async completeUpload(e,t,r){return this.api("POST","/sdk/v1/uploads/complete",{sessionId:e,parts:t.map(o=>({partNumber:o.partNumber,etag:o.etag}))},r.signal)}async abortSilently(e){try{await this.abort(e)}catch(t){}}async api(e,t,r,o){var d;let n=(d=this.cfg.fetch)!=null?d:fetch,a=`${this.cfg.apiBase}${t}`,s;try{s=await n(a,{method:e,headers:{Authorization:`Bearer ${this.cfg.apiKey}`,"Content-Type":"application/json"},body:r===void 0?void 0:JSON.stringify(r),signal:o})}catch(p){throw(p==null?void 0:p.name)==="AbortError"?u("ABORTED","Request aborted.",{retryable:!1,cause:p}):u("NETWORK","Network request failed.",{retryable:!0,cause:p})}let l=null;try{l=await s.json()}catch(p){}if(!s.ok)throw Q(s.status,l);return l}};function ge(){return typeof crypto!="undefined"&&"randomUUID"in crypto?crypto.randomUUID().replace(/-/g,""):Math.random().toString(36).slice(2)+Date.now().toString(36)}function be(i){return new Promise(e=>setTimeout(e,i))}function Y(i){if(i&&typeof i=="object"&&"code"in i&&"message"in i&&"retryable"in i)return i;let e=(i==null?void 0:i.message)||"Upload failed.";return u("NETWORK",e,{cause:i})}function ye(i,e){return i&&typeof i=="object"&&(i.sessionId=e),i}var Ee="https://cdn-api.mastersunion.org/cdn-api",E=class{constructor(e){if(!e.apiKey)throw u("CONFIG","apiKey is required.",{retryable:!1});this.resolvedCfg=w(x({},e),{apiBase:Ee}),this.uploader=new L(this.resolvedCfg),this.pickerConfigPromise=this.resolvedCfg.skipConfigPrefetch?Promise.resolve(null):this.uploader.fetchPickerConfig().catch(()=>null)}upload(e,t={}){return this.uploader.upload(e,t)}async uploadMany(e,t={}){var s,l,d;if(!Array.isArray(e)||e.length===0){let p=u("VALIDATION","uploadMany requires a non-empty array of files.",{retryable:!1});throw(s=t.onError)==null||s.call(t,p),p}let r=e.map(p=>this.uploader.describe(p,{filename:t.filename,mimeType:t.mimeType}));(l=t.onUploadStarted)==null||l.call(t,r);let o=[],n=[];await Promise.all(e.map(async(p,h)=>{try{let c=await this.uploader.upload(p,t);c.uploadId=r[h].uploadId,o.push(c)}catch(c){n.push({file:r[h],error:c})}}));let a={filesUploaded:o,filesFailed:n};return(d=t.onUploadDone)==null||d.call(t,a),a}picker(e={}){let t=null,r=!1,o,n,a=new Promise((s,l)=>{o=s,n=l});return{open:async()=>{if(r)return a;r=!0;try{t=(await Promise.resolve().then(()=>(_(),ne))).openPicker(this,e);let l=await t.open();return o(l),l}catch(s){let l=s!=null&&s.code?s:u("CONFIG","Failed to load picker.",{retryable:!1,cause:s});throw n(l),l}},close:()=>{t==null||t.close()},cancel:()=>{t==null||t.cancel()}}}get config(){return this.resolvedCfg}};var N={init(i){return new E(i)}};_();var Fe=N.init.bind(N);(function(){if(typeof document=="undefined")return;let e=document.currentScript;if(!e)return;let t=e.getAttribute("data-unionstack-key");if(t)try{let r=N.init({apiKey:t});queueMicrotask(()=>{window.UnionStack&&(window.UnionStack.client=r)})}catch(r){console.error("[UnionStack] auto-init failed:",r)}})();return ue(we);})();
269
+
270
+ /* \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 */
271
+ .us-file-list:empty { display: none; }
272
+ `});function Ce(r,e){var s,a,n,l,d,p,h,b,k,x,g,I,S,R,y,w,U,v,C,f;let t=$({},e),o=e.branding||{};t.branding={logoUrl:(a=(s=o.logoUrl)!=null?s:r.branding.logoUrl)!=null?a:void 0,title:(l=(n=o.title)!=null?n:r.branding.title)!=null?l:void 0,hideFooter:(d=o.hideFooter)!=null?d:r.branding.hideFooter};let i=e.theme||{};if(t.theme={primary:(h=(p=i.primary)!=null?p:r.theme.primary)!=null?h:void 0,background:(k=(b=i.background)!=null?b:r.theme.background)!=null?k:void 0,foreground:(g=(x=i.foreground)!=null?x:r.theme.foreground)!=null?g:void 0,border:(S=(I=i.border)!=null?I:r.theme.border)!=null?S:void 0,radius:(y=(R=i.radius)!=null?R:r.theme.radius)!=null?y:void 0,mode:(U=(w=i.mode)!=null?w:r.theme.mode)!=null?U:void 0},t.maxFileSize=(v=e.maxFileSize)!=null?v:r.constraints.maxFileSizeBytes,t.maxFiles=(C=e.maxFiles)!=null?C:r.constraints.maxFilesPerUpload,!e.accept&&((f=r.constraints.allowedMimeTypes)!=null&&f.length)){let A=r.constraints.allowedMimeTypes.filter(_=>_!=="*/*");A.length>0&&(t.accept=A.join(","))}return t}function oe(r){return r?r.startsWith("image/")?m.image:r.startsWith("video/")?m.video:r.startsWith("audio/")?m.audio:r==="application/pdf"?m.pdf:r.startsWith("application/zip")||r.includes("compressed")||r==="application/x-tar"||r==="application/gzip"?m.archive:m.file:m.file}function c(r,e,t){let o=document.createElement(r);return e&&(o.className=e),t!==void 0&&(o.textContent=t),o}function D(r){return r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:r<1024*1024*1024?`${(r/1024/1024).toFixed(1)} MB`:`${(r/1024/1024/1024).toFixed(2)} GB`}function ne(){return typeof crypto!="undefined"&&"randomUUID"in crypto?crypto.randomUUID().replace(/-/g,""):Math.random().toString(36).slice(2)+Date.now().toString(36)}function H(r,e){let t=new F(r,e);return{open:()=>t.open(),close:()=>t.close(),cancel:()=>t.cancel()}}var Pe,$e,m,F,se=q(()=>{"use strict";ie();Pe="Upload files",$e="https://unionstack.link",m={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>',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>',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>'};F=class{constructor(e,t){this.client=e;this.opts=t;this.$backdrop=null;this.$list=null;this.$confirm=null;this.$cancel=null;this.$closeBtn=null;this.$input=null;this.items=[];this.abortCtrl=new AbortController;this.uploadStarted=!1;this.resolved=!1;this.$summary=null;this.donePromise=new Promise(o=>{this.resolvePromise=o})}async open(){var e,t;if(typeof document=="undefined")throw new Error("[union-stack] Picker requires a browser environment.");try{let o=await this.client.pickerConfigPromise;o&&(this.opts=Ce(o,this.opts))}catch(o){}return te(),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()}mount(){var p,h,b,k,x;let e=document.createElement("div");e.className="us-picker-backdrop",Object.entries(re(this.opts.theme)).forEach(([g,I])=>{e.style.setProperty(g,I)}),e.addEventListener("click",g=>{g.target===e&&!this.uploadStarted&&this.cancel()});let t=c("div","us-picker"),o=c("div","us-picker-header"),i=c("div","us-picker-header-logo");if((p=this.opts.branding)!=null&&p.logoUrl){let g=document.createElement("img");g.src=this.opts.branding.logoUrl,g.alt="",i.appendChild(g)}else i.innerHTML=m.zap;o.appendChild(i);let s=c("div","us-picker-title",(b=(h=this.opts.branding)==null?void 0:h.title)!=null?b:Pe);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=m.close,this.$closeBtn.onclick=()=>this.cancel(),o.appendChild(this.$closeBtn),t.appendChild(o);let a=c("div","us-picker-body");a.appendChild(this.renderDropzone()),this.$list=c("div","us-file-list"),a.appendChild(this.$list),t.appendChild(a);let n=this.opts.autoUpload!==!1,l=c("div","us-actions");this.$summary=c("div","us-actions-summary",""),l.appendChild(this.$summary);let d=c("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(),d.appendChild(this.$cancel),n||(this.$confirm=document.createElement("button"),this.$confirm.type="button",this.$confirm.className="us-btn us-btn-primary",this.$confirm.innerHTML=`${m.upload} <span>Upload</span>`,this.$confirm.disabled=!0,this.$confirm.onclick=()=>this.startUpload(),d.appendChild(this.$confirm)),l.appendChild(d),t.appendChild(l),!((k=this.opts.branding)!=null&&k.hideFooter)){let g=c("div","us-footer");g.innerHTML=`${m.zap} <span>Powered by <a href="${$e}" target="_blank" rel="noopener">UnionStack</a></span>`,t.appendChild(g)}e.appendChild(t),((x=this.opts.container)!=null?x:document.body).appendChild(e),this.$backdrop=e}renderDropzone(){var s;let e=c("div","us-dropzone");e.setAttribute("role","button"),e.setAttribute("tabindex","0"),e.setAttribute("aria-label","Drop files here or click to browse");let t=c("div","us-dropzone-icon");t.innerHTML=m.upload,e.appendChild(t),e.appendChild(c("div","us-dropzone-title","Drop files to upload")),e.appendChild(c("div","us-dropzone-hint","or click to browse from your device"));let o=[];if(this.opts.maxFileSize&&o.push(`max ${D(this.opts.maxFileSize)}`),this.opts.accept){let a=this.opts.accept.split(",").map(n=>n.trim()).filter(n=>n&&n!=="*/*").map(n=>n.replace("/*",""));a.length>0&&a.length<=4&&o.push(a.join(" \xB7 "))}o.length>0&&e.appendChild(c("div","us-dropzone-constraints",o.join(" \xB7 ")));let i=document.createElement("input");return i.type="file",i.multiple=((s=this.opts.maxFiles)!=null?s:10)>1,this.opts.accept&&(i.accept=this.opts.accept),i.style.display="none",i.onchange=()=>{i.files&&this.addFiles(Array.from(i.files)),i.value=""},this.$input=i,e.appendChild(i),e.onclick=()=>i.click(),e.onkeydown=a=>{(a.key==="Enter"||a.key===" ")&&(a.preventDefault(),i.click())},e.addEventListener("dragover",a=>{a.preventDefault(),e.setAttribute("data-drag","over")}),e.addEventListener("dragleave",()=>e.removeAttribute("data-drag")),e.addEventListener("drop",a=>{var l;a.preventDefault(),e.removeAttribute("data-drag");let n=(l=a.dataTransfer)==null?void 0:l.files;n&&this.addFiles(Array.from(n))}),e}unmount(){var e,t,o;(e=this.$backdrop)!=null&&e.parentNode&&this.$backdrop.parentNode.removeChild(this.$backdrop),this.$backdrop=null;for(let i of this.items)i.objectUrl&&URL.revokeObjectURL(i.objectUrl);(o=(t=this.opts).onClose)==null||o.call(t)}addFiles(e){var n;let o=((n=this.opts.maxFiles)!=null?n:1/0)-this.items.length;if(o<=0)return;let i=e.slice(0,o);for(let l of i){if(this.opts.maxFileSize&&l.size>this.opts.maxFileSize){let p={uploadId:ne(),file:l,state:"failed",progress:0,error:`File exceeds ${D(this.opts.maxFileSize)} limit`};this.items.push(p),this.renderItem(p);continue}let d={uploadId:ne(),file:l,state:"queued",progress:0};this.items.push(d),this.renderItem(d)}this.refreshConfirm();let s=this.opts.autoUpload!==!1,a=this.items.some(l=>l.state==="queued");s&&a&&!this.uploadStarted&&requestAnimationFrame(()=>{this.uploadStarted||this.startUpload()})}renderItem(e){if(!this.$list)return;let t=c("div","us-file");t.dataset.state=e.state,t.dataset.uploadId=e.uploadId;let o=Math.min(this.items.length-1,8);t.style.animationDelay=`${o*35}ms`;let i=c("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,i.style.backgroundImage=`url("${h}")`,i.dataset.image="true"}catch(h){i.innerHTML=oe(e.file.type)}else i.innerHTML=oe(e.file.type);t.appendChild(i);let s=c("div","us-file-main"),a=c("div","us-file-row1");a.appendChild(c("div","us-file-name",e.file.name));let n=c("div","us-file-meta",D(e.file.size));a.appendChild(n),s.appendChild(a);let l=c("div","us-file-progress"),d=c("div","us-file-progress-bar");l.appendChild(d),s.appendChild(l),t.appendChild(s);let p=c("div","us-file-status");p.setAttribute("aria-label",this.statusLabel(e)),p.innerHTML=this.statusIcon(e.state),t.appendChild(p),e.$row=t,e.$bar=d,e.$status=p,e.$meta=n,this.$list.appendChild(t),this.updateSummary()}statusIcon(e){switch(e){case"uploading":return m.spinner;case"done":return m.check;case"failed":return m.alert;case"cancelled":return m.alert;default:return m.spinner}}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,o){if(e.state=t,o!==void 0&&(e.progress=o),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 i=D(e.file.size);switch(t){case"uploading":e.$meta.textContent=`${i} \xB7 ${Math.round(e.progress)}%`;break;case"done":e.$meta.textContent=i;break;case"failed":e.$meta.textContent=e.error||"Failed";break;default:e.$meta.textContent=i}}this.updateSummary()}updateSummary(){if(!this.$summary)return;let e=this.items.length;if(e===0){this.$summary.textContent="";return}let t=this.items.filter(s=>s.state==="done").length,o=this.items.filter(s=>s.state==="failed").length;this.items.filter(s=>s.state==="uploading"||s.state==="queued").length>0?this.$summary.textContent=`Uploading ${t+1} of ${e}`:o>0?this.$summary.textContent=`${t} of ${e} uploaded \xB7 ${o} failed`:t===e?this.$summary.textContent=`${e} file${e===1?"":"s"} uploaded`:this.$summary.textContent=`${e} file${e===1?"":"s"} ready`}refreshConfirm(){if(!this.$confirm)return;let e=this.items.filter(t=>t.state==="queued").length;this.$confirm.disabled=e===0||this.uploadStarted}async startUpload(){if(this.uploadStarted)return;let e=this.items.filter(i=>i.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,o=e.map(i=>i.file);try{await this.client.uploadMany(o,z($({},this.opts),{signal:this.abortCtrl.signal,onUploadStarted:i=>{var s,a;i.forEach((n,l)=>{let d=e[l];d&&(d.uploadId=n.uploadId,d.$row&&(d.$row.dataset.uploadId=n.uploadId),t.set(n.uploadId,d))}),(a=(s=this.opts).onUploadStarted)==null||a.call(s,i)},onFileUploadStarted:i=>{var a,n;let s=t.get(i.uploadId);s&&this.setItemState(s,"uploading",0),(n=(a=this.opts).onFileUploadStarted)==null||n.call(a,i)},onFileUploadProgress:(i,s)=>{var n,l;let a=t.get(i.uploadId);a&&this.setItemState(a,"uploading",s.totalPercent),(l=(n=this.opts).onFileUploadProgress)==null||l.call(n,i,s)},onFileUploadFinished:i=>{var a,n;let s=t.get(i.uploadId);s&&(s.uploaded=i,this.setItemState(s,"done",100)),(n=(a=this.opts).onFileUploadFinished)==null||n.call(a,i)},onFileUploadFailed:(i,s)=>{var n,l;let a=t.get(i.uploadId);a&&(a.error=s.message,this.setItemState(a,"failed")),(l=(n=this.opts).onFileUploadFailed)==null||l.call(n,i,s)},onUploadDone:i=>{var s,a;(a=(s=this.opts).onUploadDone)==null||a.call(s,i),this.resolveResult(i),this.unmount()},onError:i=>{var s,a;(a=(s=this.opts).onError)==null||a.call(s,i),this.resolveResult(),this.unmount()}}))}catch(i){this.resolved||(this.resolveResult(),this.unmount())}}resolveResult(e){if(this.resolved)return;this.resolved=!0;let t=e!=null?e:{filesUploaded:this.items.filter(o=>o.uploaded).map(o=>o.uploaded),filesFailed:this.items.filter(o=>o.state==="failed").map(o=>({file:{uploadId:o.uploadId,filename:o.file.name,mimetype:o.file.type||"application/octet-stream",size:o.file.size,source:"local"},error:{code:"VALIDATION",message:o.error||"failed",retryable:!1}}))};this.resolvePromise(t)}}});var ae={};Q(ae,{Picker:()=>F,openPicker:()=>H});var V=q(()=>{"use strict";se()});var Ie={};Q(Ie,{Picker:()=>F,UnionStackClient:()=>E,init:()=>Ee,openPicker:()=>H});function u(r,e,t={}){var o;return{code:r,message:e,status:t.status,retryable:(o=t.retryable)!=null?o:he(r,t.status),cause:t.cause}}function he(r,e){return!!(r==="NETWORK"||r==="PART_FAILED"||r==="SERVER"&&e&&e>=500)}function X(r,e){let t=e==null?void 0:e.error,o=(t==null?void 0:t.message)||`Request failed with status ${r}`,i=((t==null?void 0:t.code)||"").toUpperCase();if(r===401)return u("AUTH",o,{status:r,retryable:!1});if(r===403)return u("AUTH",o,{status:r,retryable:!1});if(r===413)return u("VALIDATION",o,{status:r,retryable:!1});if(r===415)return u("VALIDATION",o,{status:r,retryable:!1});if(r===429){let s=i==="QUOTA_EXCEEDED";return u(s?"QUOTA":"NETWORK",o,{status:r,retryable:!s})}return r>=500?u("SERVER",o,{status:r,retryable:!0}):u("SERVER",o,{status:r,retryable:!1})}var ge=3,be=3,J=[400,1200,3600],O=class{constructor(e){this.cfg=e}describe(e,t={}){let o=typeof File!="undefined"&&e instanceof File,i=t.filename||(o?e.name:"untitled"),s=t.mimeType||e.type||"application/octet-stream";return{uploadId:ye(),filename:i,mimetype:s,size:e.size,source:"local"}}async upload(e,t={}){var i,s,a;let o=this.describe(e,{filename:t.filename,mimeType:t.mimeType});(i=t.onFileUploadStarted)==null||i.call(t,o);try{let n=await this.initUpload(o,t),l=await this.uploadAllParts(e,n,o,t),d=await this.completeUpload(n.sessionId,l,t),p=z($({},o),{handle:d.handle,fileId:d.fileId,url:d.url,size:d.size,mimetype:d.mimetype,filename:d.filename,status:"Stored",etag:d.etag});return(s=t.onFileUploadFinished)==null||s.call(t,p),p}catch(n){let l=Z(n);throw(a=t.onFileUploadFailed)==null||a.call(t,o,l),n!=null&&n.sessionId&&this.abortSilently(n.sessionId).catch(()=>{}),l}}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,o,i){var S,R;let s=t.totalParts,a=t.chunkSize,n=Math.max(1,(S=i.concurrency)!=null?S:ge),l=(R=i.maxRetriesPerPart)!=null?R:be,d=new Map(t.partUrls.map(y=>[y.partNumber,y.url])),p=new Array(s),h=new Array(s).fill(0),b=1,k=e.size,x=()=>{var v;let y=h.reduce((C,f)=>C+f,0),w=k>0?Math.min(100,Math.round(y/k*100)):100,U={totalBytes:k,loaded:y,totalPercent:w};(v=i.onFileUploadProgress)==null||v.call(i,o,U)},g=async()=>{var y,w,U,v,C;for(;;){if((y=i.signal)!=null&&y.aborted)throw u("ABORTED","Upload aborted by caller.",{retryable:!1});let f=b++;if(f>s)return;let A=(f-1)*a,_=Math.min(A+a,e.size),L=e.slice(A,_),B=0,M;for(;B<=l;){if((w=i.signal)!=null&&w.aborted)throw u("ABORTED","Upload aborted by caller.",{retryable:!1});try{let P=d.get(f);P||(P=(await this.api("POST","/sdk/v1/uploads/sign-part",{sessionId:t.sessionId,partNumber:f},i.signal)).url,d.set(f,P));let T=(C=await((v=(U=this.cfg).fetch)==null?void 0:v.call(U,P,{method:"PUT",body:L,signal:i.signal})))!=null?C:await fetch(P,{method:"PUT",body:L,signal:i.signal});if(!T.ok)throw(T.status===403||T.status===401)&&d.delete(f),u("PART_FAILED",`Part ${f} PUT failed (HTTP ${T.status})`,{status:T.status});let K=T.headers.get("etag");if(!K)throw u("PART_FAILED",`Part ${f}: R2 did not return an ETag.`);p[f-1]={partNumber:f,etag:K,size:L.size},h[f-1]=L.size,x();break}catch(P){if(M=P,B++,B>l)break;await ke(J[Math.min(B-1,J.length-1)])}}if(!p[f-1])throw ve(Z(M!=null?M:u("PART_FAILED",`Part ${f} failed after ${l} retries.`)),t.sessionId)}},I=Array.from({length:Math.min(n,s)},g);return await Promise.all(I),p}async completeUpload(e,t,o){return this.api("POST","/sdk/v1/uploads/complete",{sessionId:e,parts:t.map(i=>({partNumber:i.partNumber,etag:i.etag}))},o.signal)}async abortSilently(e){try{await this.abort(e)}catch(t){}}async api(e,t,o,i){var d;let s=(d=this.cfg.fetch)!=null?d:fetch,a=`${this.cfg.apiBase}${t}`,n;try{n=await s(a,{method:e,headers:{Authorization:`Bearer ${this.cfg.apiKey}`,"Content-Type":"application/json"},body:o===void 0?void 0:JSON.stringify(o),signal:i})}catch(p){throw(p==null?void 0:p.name)==="AbortError"?u("ABORTED","Request aborted.",{retryable:!1,cause:p}):u("NETWORK","Network request failed.",{retryable:!0,cause:p})}let l=null;try{l=await n.json()}catch(p){}if(!n.ok)throw X(n.status,l);return l}};function ye(){return typeof crypto!="undefined"&&"randomUUID"in crypto?crypto.randomUUID().replace(/-/g,""):Math.random().toString(36).slice(2)+Date.now().toString(36)}function ke(r){return new Promise(e=>setTimeout(e,r))}function Z(r){if(r&&typeof r=="object"&&"code"in r&&"message"in r&&"retryable"in r)return r;let e=(r==null?void 0:r.message)||"Upload failed.";return u("NETWORK",e,{cause:r})}function ve(r,e){return r&&typeof r=="object"&&(r.sessionId=e),r}var Fe="https://cdn-api.mastersunion.org/cdn-api",E=class{constructor(e){if(!e.apiKey)throw u("CONFIG","apiKey is required.",{retryable:!1});this.resolvedCfg=z($({},e),{apiBase:Fe}),this.uploader=new O(this.resolvedCfg),this.pickerConfigPromise=this.resolvedCfg.skipConfigPrefetch?Promise.resolve(null):this.uploader.fetchPickerConfig().catch(()=>null)}upload(e,t={}){return this.uploader.upload(e,t)}async uploadMany(e,t={}){var n,l,d;if(!Array.isArray(e)||e.length===0){let p=u("VALIDATION","uploadMany requires a non-empty array of files.",{retryable:!1});throw(n=t.onError)==null||n.call(t,p),p}let o=e.map(p=>this.uploader.describe(p,{filename:t.filename,mimeType:t.mimeType}));(l=t.onUploadStarted)==null||l.call(t,o);let i=[],s=[];await Promise.all(e.map(async(p,h)=>{try{let b=await this.uploader.upload(p,t);b.uploadId=o[h].uploadId,i.push(b)}catch(b){s.push({file:o[h],error:b})}}));let a={filesUploaded:i,filesFailed:s};return(d=t.onUploadDone)==null||d.call(t,a),a}picker(e={}){let t=null,o=!1,i,s,a=new Promise((n,l)=>{i=n,s=l});return{open:async()=>{if(o)return a;o=!0;try{t=(await Promise.resolve().then(()=>(V(),ae))).openPicker(this,e);let l=await t.open();return i(l),l}catch(n){let l=n!=null&&n.code?n:u("CONFIG","Failed to load picker.",{retryable:!1,cause:n});throw s(l),l}},close:()=>{t==null||t.close()},cancel:()=>{t==null||t.cancel()}}}get config(){return this.resolvedCfg}};var N={init(r){return new E(r)}};V();var Ee=N.init.bind(N);(function(){if(typeof document=="undefined")return;let e=document.currentScript;if(!e)return;let t=e.getAttribute("data-unionstack-key");if(t)try{let o=N.init({apiKey:t});queueMicrotask(()=>{window.UnionStack&&(window.UnionStack.client=o)})}catch(o){console.error("[UnionStack] auto-init failed:",o)}})();return me(Ie);})();
81
273
  //# sourceMappingURL=loader.v1.global.js.map