@masters-union/union-stack 0.1.3 → 0.1.5
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.
- package/dist/cdn/loader.v1.global.js +234 -42
- package/dist/cdn/loader.v1.global.js.map +1 -1
- package/dist/{chunk-445C5G3Q.cjs → chunk-GJ2ORKJM.cjs} +2 -2
- package/dist/{chunk-445C5G3Q.cjs.map → chunk-GJ2ORKJM.cjs.map} +1 -1
- package/dist/{chunk-I4NHLGGL.js → chunk-YLAPR7HG.js} +2 -2
- package/dist/{chunk-I4NHLGGL.js.map → chunk-YLAPR7HG.js.map} +1 -1
- package/dist/{client-DrOHTZ94.d.cts → client-AMBRkgCm.d.cts} +8 -0
- package/dist/{client-DrOHTZ94.d.ts → client-AMBRkgCm.d.ts} +8 -0
- package/dist/index.cjs +3 -3
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/picker.cjs +431 -72
- package/dist/picker.cjs.map +1 -1
- package/dist/picker.d.cts +6 -2
- package/dist/picker.d.ts +6 -2
- package/dist/picker.js +431 -72
- package/dist/picker.js.map +1 -1
- package/dist/react.cjs +2 -2
- package/dist/react.d.cts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/react.js +1 -1
- package/package.json +4 -4
|
@@ -1,81 +1,273 @@
|
|
|
1
|
-
"use strict";var UnionStack=(()=>{var
|
|
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:
|
|
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;
|
|
7
|
-
|
|
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;
|
|
18
|
+
width: 100%; max-width: 480px;
|
|
19
|
+
max-height: min(calc(100dvh - 32px), 680px);
|
|
14
20
|
display: flex; flex-direction: column;
|
|
15
|
-
box-shadow:
|
|
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
|
|
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
|
|
24
|
-
.us-picker-
|
|
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
|
-
|
|
28
|
-
|
|
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-
|
|
31
|
-
.us-picker-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
|
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)
|
|
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-
|
|
42
|
-
.us-dropzone-
|
|
43
|
-
.us-
|
|
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;
|
|
47
|
-
|
|
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
|
-
|
|
50
|
-
|
|
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:
|
|
53
|
-
|
|
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%;
|
|
57
|
-
|
|
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"]
|
|
60
|
-
.us-file[data-state="failed"] .us-file-progress-bar { background:
|
|
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:
|
|
63
|
-
padding:
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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;
|
|
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
|
|
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
|
-
|
|
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.mastersunion.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
|