@geekapps/silo-elements-nextjs 0.2.36 → 0.2.37

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.
@@ -89,9 +89,9 @@ function DropZone({
89
89
  ...style
90
90
  };
91
91
  const cls = [
92
- "silo-dropzone",
93
- dragging ? "silo-dropzone--dragging" : "",
94
- disabled ? "silo-dropzone--disabled" : "",
92
+ "border-2 border-dashed border-slate-200 rounded-xl bg-slate-50 text-slate-900 cursor-pointer outline-none transition-colors duration-150",
93
+ dragging ? "border-indigo-500 bg-slate-100" : "hover:border-indigo-500 hover:bg-slate-100",
94
+ disabled ? "opacity-50 cursor-not-allowed" : "",
95
95
  className
96
96
  ].filter(Boolean).join(" ");
97
97
  return /* @__PURE__ */ jsxs(
@@ -120,7 +120,7 @@ function DropZone({
120
120
  type: "file",
121
121
  accept,
122
122
  multiple,
123
- style: { display: "none" },
123
+ className: "hidden",
124
124
  onChange: handleChange,
125
125
  disabled
126
126
  }
@@ -134,13 +134,19 @@ function ProgressBar({ progress, className = "", style }) {
134
134
  return /* @__PURE__ */ jsx(
135
135
  "div",
136
136
  {
137
- className: `silo-progress-track${className ? ` ${className}` : ""}`,
137
+ className: `h-1 rounded-full bg-slate-200 overflow-hidden${className ? ` ${className}` : ""}`,
138
138
  style,
139
139
  role: "progressbar",
140
140
  "aria-valuenow": progress,
141
141
  "aria-valuemin": 0,
142
142
  "aria-valuemax": 100,
143
- children: /* @__PURE__ */ jsx("div", { className: "silo-progress-fill", style: { width: `${progress}%` } })
143
+ children: /* @__PURE__ */ jsx(
144
+ "div",
145
+ {
146
+ className: "h-full rounded-full bg-indigo-500 transition-[width] duration-200 ease-linear",
147
+ style: { width: `${progress}%` }
148
+ }
149
+ )
144
150
  }
145
151
  );
146
152
  }
@@ -153,60 +159,38 @@ var FORMATS = [
153
159
  function ImageOptions({ value, onChange, style }) {
154
160
  const fmt = value.format ?? "webp";
155
161
  const optimize = value.optimize ?? true;
156
- return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: 10, ...style }, children: [
162
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2.5", style, children: [
157
163
  /* @__PURE__ */ jsxs("div", { children: [
158
- /* @__PURE__ */ jsx("div", { style: { fontSize: 11, fontWeight: 700, color: "var(--silo-text-muted, #64748b)", letterSpacing: "0.05em", textTransform: "uppercase", marginBottom: 6 }, children: "Formato de sa\xEDda" }),
159
- /* @__PURE__ */ jsx("div", { style: { display: "flex", gap: 6, flexWrap: "wrap" }, children: FORMATS.map((f) => /* @__PURE__ */ jsx(
164
+ /* @__PURE__ */ jsx("div", { className: "text-[11px] font-bold text-slate-500 uppercase tracking-[0.05em] mb-1.5", children: "Formato de sa\xEDda" }),
165
+ /* @__PURE__ */ jsx("div", { className: "flex gap-1.5 flex-wrap", children: FORMATS.map((f) => /* @__PURE__ */ jsx(
160
166
  "button",
161
167
  {
162
168
  type: "button",
163
169
  onClick: () => onChange({ ...value, format: f.value }),
164
170
  title: f.hint,
165
- style: {
166
- padding: "4px 12px",
167
- borderRadius: 6,
168
- border: `1px solid ${fmt === f.value ? "var(--silo-accent, #6366f1)" : "var(--silo-border, #e2e8f0)"}`,
169
- background: fmt === f.value ? "var(--silo-accent, #6366f1)" : "transparent",
170
- color: fmt === f.value ? "#fff" : "var(--silo-text, #0f172a)",
171
- fontSize: 12,
172
- fontWeight: 600,
173
- cursor: "pointer"
174
- },
171
+ className: `py-1 px-3 rounded-md text-xs font-semibold cursor-pointer transition-colors border ${fmt === f.value ? "border-indigo-500 bg-indigo-500 text-white" : "border-slate-200 bg-transparent text-slate-900 hover:bg-slate-100"}`,
175
172
  children: f.label
176
173
  },
177
174
  f.value
178
175
  )) })
179
176
  ] }),
180
- /* @__PURE__ */ jsxs("label", { style: { display: "flex", alignItems: "center", gap: 8, cursor: "pointer", userSelect: "none" }, children: [
177
+ /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 cursor-pointer select-none", children: [
181
178
  /* @__PURE__ */ jsx(
182
179
  "span",
183
180
  {
184
181
  onClick: () => onChange({ ...value, optimize: !optimize }),
185
- style: {
186
- width: 36,
187
- height: 20,
188
- borderRadius: 10,
189
- background: optimize ? "var(--silo-accent, #6366f1)" : "var(--silo-border, #e2e8f0)",
190
- position: "relative",
191
- flexShrink: 0,
192
- transition: "background 0.15s",
193
- cursor: "pointer"
194
- },
195
- children: /* @__PURE__ */ jsx("span", { style: {
196
- position: "absolute",
197
- top: 2,
198
- left: optimize ? 18 : 2,
199
- width: 16,
200
- height: 16,
201
- borderRadius: "50%",
202
- background: "#fff",
203
- transition: "left 0.15s",
204
- boxShadow: "0 1px 3px rgba(0,0,0,0.2)"
205
- } })
182
+ className: `relative w-9 h-5 rounded-full shrink-0 cursor-pointer transition-colors duration-150 ${optimize ? "bg-indigo-500" : "bg-slate-200"}`,
183
+ children: /* @__PURE__ */ jsx(
184
+ "span",
185
+ {
186
+ className: "absolute top-0.5 w-4 h-4 rounded-full bg-white shadow-sm transition-[left] duration-150",
187
+ style: { left: optimize ? "18px" : "2px" }
188
+ }
189
+ )
206
190
  }
207
191
  ),
208
- /* @__PURE__ */ jsx("span", { style: { fontSize: 12, color: "var(--silo-text, #0f172a)", fontWeight: 500 }, children: "Otimizar tamanho" }),
209
- /* @__PURE__ */ jsx("span", { style: { fontSize: 11, color: "var(--silo-text-muted, #94a3b8)" }, children: optimize ? "Qualidade 85 \u2014 menor tamanho" : "Qualidade m\xE1xima" })
192
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-slate-900 font-medium", children: "Otimizar tamanho" }),
193
+ /* @__PURE__ */ jsx("span", { className: "text-[11px] text-slate-400", children: optimize ? "Qualidade 85 \u2014 menor tamanho" : "Qualidade m\xE1xima" })
210
194
  ] })
211
195
  ] });
212
196
  }
@@ -273,19 +257,14 @@ function ImageUploader({
273
257
  }, [showImageOptions, image, imageOpts, doUpload, showPreview]);
274
258
  const containerStyle = {
275
259
  ...vars,
276
- display: "flex",
277
- flexDirection: "column",
278
- gap: "12px",
279
- width: "100%",
280
- fontFamily: "var(--silo-font)",
281
260
  ...style
282
261
  };
283
262
  const isUploading = state.status === "uploading" || state.status === "preparing" || state.status === "completing";
284
263
  const progress = state.status === "uploading" ? state.progress : state.status === "completing" ? 99 : 0;
285
264
  const isPaused = state.status === "idle" && preview !== null && !stagedFile;
286
- if (state.status === "error" && renderError) return /* @__PURE__ */ jsx("div", { style: containerStyle, children: renderError(state.error, reset) });
287
- if (state.status === "done" && renderSuccess) return /* @__PURE__ */ jsx("div", { style: containerStyle, children: renderSuccess(state.result) });
288
- return /* @__PURE__ */ jsxs("div", { className: `silo-image-uploader${className ? ` ${className}` : ""}`, style: containerStyle, children: [
265
+ if (state.status === "error" && renderError) return /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-3 w-full", style: containerStyle, children: renderError(state.error, reset) });
266
+ if (state.status === "done" && renderSuccess) return /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-3 w-full", style: containerStyle, children: renderSuccess(state.result) });
267
+ return /* @__PURE__ */ jsxs("div", { className: `flex flex-col gap-3 w-full${className ? ` ${className}` : ""}`, style: containerStyle, children: [
289
268
  /* @__PURE__ */ jsx(
290
269
  DropZone,
291
270
  {
@@ -296,15 +275,15 @@ function ImageUploader({
296
275
  disabled: disabled || isUploading,
297
276
  onFiles: handleFiles,
298
277
  style: { padding: "32px 24px", textAlign: "center" },
299
- children: preview && !isUploading && !stagedFile ? /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", alignItems: "center", gap: 8 }, children: [
300
- /* @__PURE__ */ jsx("img", { src: preview, alt: "Pr\xE9-visualiza\xE7\xE3o", style: { maxWidth: "100%", maxHeight: 200, borderRadius: 8, objectFit: "contain" } }),
301
- /* @__PURE__ */ jsx("span", { className: "silo-text-muted", style: { fontSize: 12 }, children: "Clique ou arraste para trocar a imagem" })
302
- ] }) : /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", alignItems: "center", gap: 8 }, children: [
303
- renderIcon ? renderIcon() : /* @__PURE__ */ jsx("svg", { width: "40", height: "40", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", className: "silo-text-muted", style: { opacity: 0.5 }, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z" }) }),
278
+ children: preview && !isUploading && !stagedFile ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-2", children: [
279
+ /* @__PURE__ */ jsx("img", { src: preview, alt: "Pr\xE9-visualiza\xE7\xE3o", className: "max-w-full max-h-[200px] rounded-lg object-contain" }),
280
+ /* @__PURE__ */ jsx("span", { className: "text-[12px] text-slate-400", children: "Clique ou arraste para trocar a imagem" })
281
+ ] }) : /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-2", children: [
282
+ renderIcon ? renderIcon() : /* @__PURE__ */ jsx("svg", { width: "40", height: "40", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", className: "text-slate-400 opacity-50", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z" }) }),
304
283
  children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
305
- /* @__PURE__ */ jsx("span", { className: "silo-text", style: { fontWeight: 700, fontSize: 15 }, children: "Arraste sua imagem aqui" }),
306
- /* @__PURE__ */ jsx("span", { className: "silo-text-muted", style: { fontSize: 13 }, children: "ou clique para escolher do seu dispositivo" }),
307
- maxSize && /* @__PURE__ */ jsxs("span", { className: "silo-text-muted", style: { fontSize: 12 }, children: [
284
+ /* @__PURE__ */ jsx("span", { className: "text-slate-900 font-bold text-[15px]", children: "Arraste sua imagem aqui" }),
285
+ /* @__PURE__ */ jsx("span", { className: "text-slate-500 text-[13px]", children: "ou clique para escolher do seu dispositivo" }),
286
+ maxSize && /* @__PURE__ */ jsxs("span", { className: "text-slate-400 text-[12px]", children: [
308
287
  "Tamanho m\xE1ximo: ",
309
288
  formatBytes(maxSize)
310
289
  ] })
@@ -313,61 +292,103 @@ function ImageUploader({
313
292
  }
314
293
  ),
315
294
  showImageOptions && stagedFile && !isUploading && state.status !== "done" && /* @__PURE__ */ jsxs(Fragment, { children: [
316
- preview && /* @__PURE__ */ jsx("div", { className: "silo-section-body", style: { overflow: "hidden" }, children: /* @__PURE__ */ jsx("img", { src: preview, alt: "Pr\xE9-visualiza\xE7\xE3o", style: { width: "100%", maxHeight: 200, objectFit: "contain", display: "block", background: "var(--silo-bg-hover, #f8fafc)" } }) }),
317
- /* @__PURE__ */ jsxs("div", { className: "silo-section-body", children: [
318
- /* @__PURE__ */ jsx("div", { className: "silo-section-header", children: "\u{1F5BC}\uFE0F Configura\xE7\xF5es de imagem" }),
295
+ preview && /* @__PURE__ */ jsx("div", { className: "border border-slate-200 rounded-xl overflow-hidden", children: /* @__PURE__ */ jsx("img", { src: preview, alt: "Pr\xE9-visualiza\xE7\xE3o", className: "w-full max-h-[200px] object-contain block bg-slate-50" }) }),
296
+ /* @__PURE__ */ jsxs("div", { className: "border border-slate-200 rounded-xl overflow-hidden", children: [
297
+ /* @__PURE__ */ jsx("div", { className: "px-3.5 py-2 bg-slate-100 text-[12px] font-bold text-slate-500 tracking-[0.04em]", children: "\u{1F5BC}\uFE0F Configura\xE7\xF5es de imagem" }),
319
298
  /* @__PURE__ */ jsx(ImageOptions, { value: imageOpts, onChange: setImageOpts, style: { padding: "12px 14px" } })
320
299
  ] }),
321
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: 8 }, children: [
322
- /* @__PURE__ */ jsx("button", { className: "silo-btn silo-btn--lg", onClick: () => {
323
- setStagedFile(null);
324
- setPreview(null);
325
- }, children: "Cancelar" }),
326
- /* @__PURE__ */ jsx("button", { className: "silo-btn silo-btn--lg silo-btn--primary", style: { flex: 1 }, onClick: () => {
327
- const f = stagedFile;
328
- setStagedFile(null);
329
- void doUpload(f, imageOpts);
330
- }, children: "Enviar imagem" })
300
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
301
+ /* @__PURE__ */ jsx(
302
+ "button",
303
+ {
304
+ className: "inline-flex items-center justify-center gap-1.5 text-sm font-bold py-2.5 px-4 rounded-xl border border-slate-200 bg-transparent text-slate-900 cursor-pointer transition-colors hover:bg-slate-100",
305
+ onClick: () => {
306
+ setStagedFile(null);
307
+ setPreview(null);
308
+ },
309
+ children: "Cancelar"
310
+ }
311
+ ),
312
+ /* @__PURE__ */ jsx(
313
+ "button",
314
+ {
315
+ className: "flex-1 inline-flex items-center justify-center gap-1.5 text-sm font-bold py-2.5 px-4 rounded-xl border-transparent bg-indigo-500 text-white cursor-pointer transition-opacity hover:opacity-90",
316
+ onClick: () => {
317
+ const f = stagedFile;
318
+ setStagedFile(null);
319
+ void doUpload(f, imageOpts);
320
+ },
321
+ children: "Enviar imagem"
322
+ }
323
+ )
331
324
  ] })
332
325
  ] }),
333
- isUploading && (renderProgress ? renderProgress(progress) : /* @__PURE__ */ jsxs("div", { className: "silo-card", style: { flexDirection: "column", gap: 8, padding: 16 }, children: [
334
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [
335
- /* @__PURE__ */ jsx("span", { className: "silo-text", style: { fontSize: 13, fontWeight: 600 }, children: uploadLabel(state.status, progress) }),
336
- /* @__PURE__ */ jsxs("span", { className: "silo-text-accent", style: { fontSize: 13, fontWeight: 700 }, children: [
326
+ isUploading && (renderProgress ? renderProgress(progress) : /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 px-3 py-4 bg-slate-50 rounded-xl border border-slate-200", children: [
327
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between items-center", children: [
328
+ /* @__PURE__ */ jsx("span", { className: "text-[13px] font-semibold text-slate-900", children: uploadLabel(state.status, progress) }),
329
+ /* @__PURE__ */ jsxs("span", { className: "text-[13px] font-bold text-indigo-500", children: [
337
330
  progress,
338
331
  "%"
339
332
  ] })
340
333
  ] }),
341
334
  /* @__PURE__ */ jsx(ProgressBar, { progress })
342
335
  ] })),
343
- isPaused && /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: 8 }, children: [
344
- /* @__PURE__ */ jsx("button", { className: "silo-btn silo-btn--lg silo-btn--success", style: { flex: 1 }, onClick: () => resume({ ...bucket !== void 0 && { bucket }, image: imageOpts }), children: "\u25B6 Retomar envio" }),
345
- /* @__PURE__ */ jsx("button", { className: "silo-btn silo-btn--lg", onClick: () => {
346
- abort();
347
- setPreview(null);
348
- }, children: "Cancelar" })
336
+ isPaused && /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
337
+ /* @__PURE__ */ jsx(
338
+ "button",
339
+ {
340
+ className: "flex-1 inline-flex items-center justify-center gap-1.5 text-sm font-bold py-2.5 px-4 rounded-xl border-transparent bg-emerald-500 text-white cursor-pointer hover:opacity-90",
341
+ onClick: () => resume({ ...bucket !== void 0 && { bucket }, image: imageOpts }),
342
+ children: "\u25B6 Retomar envio"
343
+ }
344
+ ),
345
+ /* @__PURE__ */ jsx(
346
+ "button",
347
+ {
348
+ className: "inline-flex items-center justify-center gap-1.5 text-sm font-bold py-2.5 px-4 rounded-xl border border-slate-200 bg-transparent text-slate-900 cursor-pointer hover:bg-slate-100",
349
+ onClick: () => {
350
+ abort();
351
+ setPreview(null);
352
+ },
353
+ children: "Cancelar"
354
+ }
355
+ )
349
356
  ] }),
350
- state.status === "done" && !renderSuccess && /* @__PURE__ */ jsxs("div", { className: "silo-card silo-card--success", style: { gap: 12, padding: "14px 16px" }, children: [
351
- /* @__PURE__ */ jsx("span", { style: { fontSize: 24 }, children: "\u2705" }),
352
- /* @__PURE__ */ jsxs("div", { style: { flex: 1 }, children: [
353
- /* @__PURE__ */ jsx("div", { style: { fontWeight: 700, fontSize: 14, color: "#16a34a" }, children: "Imagem enviada com sucesso!" }),
354
- /* @__PURE__ */ jsx("div", { className: "silo-text-muted", style: { fontSize: 12, marginTop: 2 }, children: formatBytes(state.result.size) })
357
+ state.status === "done" && !renderSuccess && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 px-4 py-3.5 bg-green-500/[0.08] rounded-xl border border-green-500/20", children: [
358
+ /* @__PURE__ */ jsx("span", { className: "text-2xl", children: "\u2705" }),
359
+ /* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
360
+ /* @__PURE__ */ jsx("div", { className: "font-bold text-sm text-green-700", children: "Imagem enviada com sucesso!" }),
361
+ /* @__PURE__ */ jsx("div", { className: "text-[12px] text-slate-400 mt-0.5", children: formatBytes(state.result.size) })
355
362
  ] }),
356
- /* @__PURE__ */ jsx("button", { className: "silo-btn", style: { borderColor: "rgba(34,197,94,0.3)", color: "#16a34a", padding: "4px 10px", flexShrink: 0 }, onClick: () => {
357
- reset();
358
- setPreview(null);
359
- }, children: "Enviar outra" })
363
+ /* @__PURE__ */ jsx(
364
+ "button",
365
+ {
366
+ className: "inline-flex items-center justify-center text-xs font-semibold py-1 px-2.5 rounded-lg border border-green-500/30 text-green-700 bg-transparent cursor-pointer hover:bg-green-500/10 shrink-0",
367
+ onClick: () => {
368
+ reset();
369
+ setPreview(null);
370
+ },
371
+ children: "Enviar outra"
372
+ }
373
+ )
360
374
  ] }),
361
- state.status === "error" && !renderError && /* @__PURE__ */ jsxs("div", { className: "silo-card silo-card--error", style: { gap: 12, padding: "14px 16px" }, children: [
362
- /* @__PURE__ */ jsx("span", { style: { fontSize: 22 }, children: "\u26A0\uFE0F" }),
363
- /* @__PURE__ */ jsxs("div", { style: { flex: 1 }, children: [
364
- /* @__PURE__ */ jsx("div", { className: "silo-text-error", style: { fontWeight: 700, fontSize: 13 }, children: "N\xE3o foi poss\xEDvel enviar a imagem" }),
365
- /* @__PURE__ */ jsx("div", { className: "silo-text-muted", style: { fontSize: 12, marginTop: 2 }, children: state.error.message })
375
+ state.status === "error" && !renderError && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 px-4 py-3.5 bg-red-500/[0.07] rounded-xl border border-red-500/20", children: [
376
+ /* @__PURE__ */ jsx("span", { className: "text-[22px]", children: "\u26A0\uFE0F" }),
377
+ /* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
378
+ /* @__PURE__ */ jsx("div", { className: "font-bold text-[13px] text-red-500", children: "N\xE3o foi poss\xEDvel enviar a imagem" }),
379
+ /* @__PURE__ */ jsx("div", { className: "text-[12px] text-slate-400 mt-0.5", children: state.error.message })
366
380
  ] }),
367
- /* @__PURE__ */ jsx("button", { className: "silo-btn", style: { borderColor: "rgba(239,68,68,0.3)", color: "#ef4444", padding: "4px 10px", flexShrink: 0 }, onClick: () => {
368
- reset();
369
- setPreview(null);
370
- }, children: "Tentar novamente" })
381
+ /* @__PURE__ */ jsx(
382
+ "button",
383
+ {
384
+ className: "inline-flex items-center justify-center text-xs font-semibold py-1 px-2.5 rounded-lg border border-red-500/30 text-red-500 bg-transparent cursor-pointer hover:bg-red-500/10 shrink-0",
385
+ onClick: () => {
386
+ reset();
387
+ setPreview(null);
388
+ },
389
+ children: "Tentar novamente"
390
+ }
391
+ )
371
392
  ] })
372
393
  ] });
373
394
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/theme.ts","../src/components/DropZone.tsx","../src/components/ProgressBar.tsx","../src/components/ImageOptions.tsx","../src/utils/format.ts","../src/ImageUploader.tsx"],"names":["jsx","jsxs","useState","useCallback"],"mappings":"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","file":"ImageUploader.js","sourcesContent":["import type { SiloTheme } from \"../types.js\";\n\nexport const defaultTheme: Required<SiloTheme> = {\n borderColor: \"#e2e8f0\",\n borderColorActive: \"#6366f1\",\n backgroundColor: \"#f8fafc\",\n backgroundColorHover: \"#f1f5f9\",\n textColor: \"#0f172a\",\n textColorMuted: \"#64748b\",\n accentColor: \"#6366f1\",\n accentColorHover: \"#4f46e5\",\n errorColor: \"#ef4444\",\n successColor: \"#22c55e\",\n borderRadius: \"12px\",\n fontFamily: \"inherit\",\n};\n\nexport function resolveTheme(theme?: SiloTheme): Required<SiloTheme> {\n return { ...defaultTheme, ...theme };\n}\n\nexport function themeToVars(theme: Required<SiloTheme>): Record<string, string> {\n return {\n \"--silo-border\": theme.borderColor,\n \"--silo-border-active\": theme.borderColorActive,\n \"--silo-bg\": theme.backgroundColor,\n \"--silo-bg-hover\": theme.backgroundColorHover,\n \"--silo-text\": theme.textColor,\n \"--silo-text-muted\": theme.textColorMuted,\n \"--silo-accent\": theme.accentColor,\n \"--silo-accent-hover\": theme.accentColorHover,\n \"--silo-error\": theme.errorColor,\n \"--silo-success\": theme.successColor,\n \"--silo-radius\": theme.borderRadius,\n \"--silo-font\": theme.fontFamily,\n };\n}\n","\"use client\";\n\nimport {\n useState,\n useRef,\n useCallback,\n type DragEvent,\n type ChangeEvent,\n type ReactNode,\n type CSSProperties,\n} from \"react\";\nimport type { SiloTheme } from \"../types.js\";\nimport { resolveTheme, themeToVars } from \"../utils/theme.js\";\n\ninterface DropZoneProps {\n accept?: string;\n multiple?: boolean;\n disabled?: boolean;\n maxSize?: number;\n onFiles: (files: File[]) => void;\n onError?: (error: Error) => void;\n className?: string;\n style?: CSSProperties;\n theme?: SiloTheme;\n children: ReactNode;\n}\n\nexport function DropZone({\n accept,\n multiple = false,\n disabled = false,\n maxSize,\n onFiles,\n onError,\n className = \"\",\n style,\n theme,\n children,\n}: DropZoneProps) {\n const [dragging, setDragging] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const t = resolveTheme(theme);\n const vars = themeToVars(t);\n\n const validate = useCallback(\n (files: File[]): File[] => {\n return files.filter((f) => {\n if (maxSize && f.size > maxSize) {\n onError?.(new Error(`File \"${f.name}\" exceeds max size of ${maxSize} bytes`));\n return false;\n }\n return true;\n });\n },\n [maxSize, onError]\n );\n\n const handleDrop = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setDragging(false);\n if (disabled) return;\n const files = Array.from(e.dataTransfer.files);\n const valid = validate(files);\n if (valid.length) onFiles(valid);\n },\n [disabled, validate, onFiles]\n );\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files ?? []);\n const valid = validate(files);\n if (valid.length) onFiles(valid);\n e.target.value = \"\";\n },\n [validate, onFiles]\n );\n\n const rootStyle: CSSProperties = {\n ...vars as CSSProperties,\n ...style,\n };\n\n const cls = [\n \"silo-dropzone\",\n dragging ? \"silo-dropzone--dragging\" : \"\",\n disabled ? \"silo-dropzone--disabled\" : \"\",\n className,\n ].filter(Boolean).join(\" \");\n\n return (\n <div\n className={cls}\n style={rootStyle}\n onDragOver={(e) => { e.preventDefault(); if (!disabled) setDragging(true); }}\n onDragLeave={() => setDragging(false)}\n onDrop={handleDrop}\n onClick={() => !disabled && inputRef.current?.click()}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n onKeyDown={(e) => { if (e.key === \"Enter\" || e.key === \" \") inputRef.current?.click(); }}\n aria-label=\"Upload area\"\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n style={{ display: \"none\" }}\n onChange={handleChange}\n disabled={disabled}\n />\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport type { CSSProperties } from \"react\";\n\ninterface ProgressBarProps {\n progress: number;\n className?: string;\n style?: CSSProperties;\n}\n\nexport function ProgressBar({ progress, className = \"\", style }: ProgressBarProps) {\n return (\n <div\n className={`silo-progress-track${className ? ` ${className}` : \"\"}`}\n style={style}\n role=\"progressbar\"\n aria-valuenow={progress}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div className=\"silo-progress-fill\" style={{ width: `${progress}%` }} />\n </div>\n );\n}\n","\"use client\";\n\nimport type { CSSProperties } from \"react\";\nimport type { ImageUploadOptions } from \"@geekapps/silo-nextjs\";\n\nconst FORMATS = [\n { value: \"webp\", label: \"WebP\", hint: \"Melhor custo-benefício\" },\n { value: \"avif\", label: \"AVIF\", hint: \"Máxima compressão\" },\n { value: \"jpeg\", label: \"JPEG\", hint: \"Compatibilidade universal\" },\n { value: \"png\", label: \"PNG\", hint: \"Sem perda\" },\n];\n\ninterface ImageOptionsProps {\n value: ImageUploadOptions;\n onChange: (opts: ImageUploadOptions) => void;\n style?: CSSProperties;\n}\n\nexport function ImageOptions({ value, onChange, style }: ImageOptionsProps) {\n const fmt = value.format ?? \"webp\";\n const optimize = value.optimize ?? true;\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10, ...style }}>\n {/* Format */}\n <div>\n <div style={{ fontSize: 11, fontWeight: 700, color: \"var(--silo-text-muted, #64748b)\", letterSpacing: \"0.05em\", textTransform: \"uppercase\", marginBottom: 6 }}>\n Formato de saída\n </div>\n <div style={{ display: \"flex\", gap: 6, flexWrap: \"wrap\" }}>\n {FORMATS.map((f) => (\n <button\n key={f.value}\n type=\"button\"\n onClick={() => onChange({ ...value, format: f.value as NonNullable<ImageUploadOptions[\"format\"]> })}\n title={f.hint}\n style={{\n padding: \"4px 12px\",\n borderRadius: 6,\n border: `1px solid ${fmt === f.value ? \"var(--silo-accent, #6366f1)\" : \"var(--silo-border, #e2e8f0)\"}`,\n background: fmt === f.value ? \"var(--silo-accent, #6366f1)\" : \"transparent\",\n color: fmt === f.value ? \"#fff\" : \"var(--silo-text, #0f172a)\",\n fontSize: 12,\n fontWeight: 600,\n cursor: \"pointer\",\n }}\n >\n {f.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Optimize toggle */}\n <label style={{ display: \"flex\", alignItems: \"center\", gap: 8, cursor: \"pointer\", userSelect: \"none\" }}>\n <span\n onClick={() => onChange({ ...value, optimize: !optimize })}\n style={{\n width: 36,\n height: 20,\n borderRadius: 10,\n background: optimize ? \"var(--silo-accent, #6366f1)\" : \"var(--silo-border, #e2e8f0)\",\n position: \"relative\",\n flexShrink: 0,\n transition: \"background 0.15s\",\n cursor: \"pointer\",\n }}\n >\n <span style={{\n position: \"absolute\",\n top: 2,\n left: optimize ? 18 : 2,\n width: 16,\n height: 16,\n borderRadius: \"50%\",\n background: \"#fff\",\n transition: \"left 0.15s\",\n boxShadow: \"0 1px 3px rgba(0,0,0,0.2)\",\n }} />\n </span>\n <span style={{ fontSize: 12, color: \"var(--silo-text, #0f172a)\", fontWeight: 500 }}>\n Otimizar tamanho\n </span>\n <span style={{ fontSize: 11, color: \"var(--silo-text-muted, #94a3b8)\" }}>\n {optimize ? \"Qualidade 85 — menor tamanho\" : \"Qualidade máxima\"}\n </span>\n </label>\n </div>\n );\n}\n","export function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 ** 2) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 ** 3) return `${(bytes / 1024 ** 2).toFixed(1)} MB`;\n return `${(bytes / 1024 ** 3).toFixed(2)} GB`;\n}\n\nexport function getFileIcon(mimeType: string): string {\n if (mimeType.startsWith(\"image/\")) return \"🖼️\";\n if (mimeType.startsWith(\"video/\")) return \"🎬\";\n if (mimeType.startsWith(\"audio/\")) return \"🎵\";\n if (mimeType === \"application/pdf\") return \"📄\";\n if (mimeType.includes(\"spreadsheet\") || mimeType.includes(\"excel\")) return \"📊\";\n if (mimeType.includes(\"presentation\") || mimeType.includes(\"powerpoint\")) return \"📑\";\n if (mimeType.includes(\"word\") || mimeType.includes(\"document\")) return \"📝\";\n if (mimeType.includes(\"zip\") || mimeType.includes(\"tar\") || mimeType.includes(\"gzip\")) return \"📦\";\n return \"📎\";\n}\n","\"use client\";\n\nimport { useState, useCallback, type CSSProperties } from \"react\";\nimport { useMultipartUpload } from \"@geekapps/silo-nextjs\";\nimport type { ImageUploadOptions } from \"@geekapps/silo-nextjs\";\nimport type { ImageUploaderProps } from \"./types.js\";\nimport { DropZone } from \"./components/DropZone.js\";\nimport { ProgressBar } from \"./components/ProgressBar.js\";\nimport { ImageOptions } from \"./components/ImageOptions.js\";\nimport { formatBytes } from \"./utils/format.js\";\nimport { resolveTheme, themeToVars } from \"./utils/theme.js\";\n\nfunction uploadLabel(status: string, progress: number): string {\n if (status === \"preparing\") return \"Preparando…\";\n if (status === \"completing\") return \"Concluindo…\";\n if (progress < 30) return \"Iniciando envio…\";\n if (progress < 70) return \"Enviando imagem…\";\n if (progress < 95) return \"Quase lá…\";\n return \"Finalizando…\";\n}\n\nexport function ImageUploader({\n bucket,\n expiresIn,\n onUpload,\n onError,\n className = \"\",\n style,\n disabled = false,\n maxSize,\n accept = \"image/*\",\n showPreview = true,\n showImageOptions = false,\n image,\n theme,\n renderIcon,\n renderProgress,\n renderSuccess,\n renderError,\n children,\n}: ImageUploaderProps) {\n const { state, upload, pause, resume, abort, reset } = useMultipartUpload(bucket);\n const [preview, setPreview] = useState<string | null>(null);\n const [imageOpts, setImageOpts] = useState<ImageUploadOptions>(image ?? { format: \"webp\", optimize: true });\n const [stagedFile, setStagedFile] = useState<File | null>(null);\n const t = resolveTheme(theme);\n const vars = themeToVars(t);\n\n const doUpload = useCallback(async (file: File, opts: ImageUploadOptions) => {\n if (showPreview) setPreview(URL.createObjectURL(file));\n try {\n const result = await upload(file, { ...(bucket !== undefined && { bucket }), image: opts });\n if (result) onUpload?.(result);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n }, [upload, bucket, onUpload, onError, showPreview]);\n\n const handleFiles = useCallback(async (files: File[]) => {\n const file = files[0];\n if (!file) return;\n if (showImageOptions) {\n setStagedFile(file);\n if (showPreview) setPreview(URL.createObjectURL(file));\n } else {\n await doUpload(file, image ?? imageOpts);\n }\n }, [showImageOptions, image, imageOpts, doUpload, showPreview]);\n\n const containerStyle: CSSProperties = {\n ...vars as CSSProperties,\n display: \"flex\", flexDirection: \"column\", gap: \"12px\",\n width: \"100%\", fontFamily: \"var(--silo-font)\", ...style,\n };\n\n const isUploading = state.status === \"uploading\" || state.status === \"preparing\" || state.status === \"completing\";\n const progress = state.status === \"uploading\" ? state.progress : state.status === \"completing\" ? 99 : 0;\n const isPaused = state.status === \"idle\" && preview !== null && !stagedFile;\n\n if (state.status === \"error\" && renderError) return <div style={containerStyle}>{renderError(state.error, reset)}</div>;\n if (state.status === \"done\" && renderSuccess) return <div style={containerStyle}>{renderSuccess(state.result)}</div>;\n\n return (\n <div className={`silo-image-uploader${className ? ` ${className}` : \"\"}`} style={containerStyle}>\n <DropZone\n {...(accept !== undefined && { accept })}\n {...(maxSize !== undefined && { maxSize })}\n {...(onError !== undefined && { onError })}\n {...(theme !== undefined && { theme })}\n disabled={disabled || isUploading}\n onFiles={handleFiles}\n style={{ padding: \"32px 24px\", textAlign: \"center\" }}\n >\n {preview && !isUploading && !stagedFile ? (\n <div style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", gap: 8 }}>\n <img src={preview} alt=\"Pré-visualização\" style={{ maxWidth: \"100%\", maxHeight: 200, borderRadius: 8, objectFit: \"contain\" }} />\n <span className=\"silo-text-muted\" style={{ fontSize: 12 }}>Clique ou arraste para trocar a imagem</span>\n </div>\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", gap: 8 }}>\n {renderIcon ? renderIcon() : (\n <svg width=\"40\" height=\"40\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" className=\"silo-text-muted\" style={{ opacity: 0.5 }}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n )}\n {children ?? (\n <>\n <span className=\"silo-text\" style={{ fontWeight: 700, fontSize: 15 }}>Arraste sua imagem aqui</span>\n <span className=\"silo-text-muted\" style={{ fontSize: 13 }}>ou clique para escolher do seu dispositivo</span>\n {maxSize && <span className=\"silo-text-muted\" style={{ fontSize: 12 }}>Tamanho máximo: {formatBytes(maxSize)}</span>}\n </>\n )}\n </div>\n )}\n </DropZone>\n\n {showImageOptions && stagedFile && !isUploading && state.status !== \"done\" && (\n <>\n {preview && (\n <div className=\"silo-section-body\" style={{ overflow: \"hidden\" }}>\n <img src={preview} alt=\"Pré-visualização\" style={{ width: \"100%\", maxHeight: 200, objectFit: \"contain\", display: \"block\", background: \"var(--silo-bg-hover, #f8fafc)\" }} />\n </div>\n )}\n <div className=\"silo-section-body\">\n <div className=\"silo-section-header\">🖼️ Configurações de imagem</div>\n <ImageOptions value={imageOpts} onChange={setImageOpts} style={{ padding: \"12px 14px\" }} />\n </div>\n <div style={{ display: \"flex\", gap: 8 }}>\n <button className=\"silo-btn silo-btn--lg\" onClick={() => { setStagedFile(null); setPreview(null); }}>Cancelar</button>\n <button className=\"silo-btn silo-btn--lg silo-btn--primary\" style={{ flex: 1 }} onClick={() => { const f = stagedFile; setStagedFile(null); void doUpload(f, imageOpts); }}>\n Enviar imagem\n </button>\n </div>\n </>\n )}\n\n {isUploading && (\n renderProgress ? renderProgress(progress) : (\n <div className=\"silo-card\" style={{ flexDirection: \"column\", gap: 8, padding: 16 }}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <span className=\"silo-text\" style={{ fontSize: 13, fontWeight: 600 }}>{uploadLabel(state.status, progress)}</span>\n <span className=\"silo-text-accent\" style={{ fontSize: 13, fontWeight: 700 }}>{progress}%</span>\n </div>\n <ProgressBar progress={progress} />\n </div>\n )\n )}\n\n {isPaused && (\n <div style={{ display: \"flex\", gap: 8 }}>\n <button className=\"silo-btn silo-btn--lg silo-btn--success\" style={{ flex: 1 }} onClick={() => resume({ ...(bucket !== undefined && { bucket }), image: imageOpts })}>\n ▶ Retomar envio\n </button>\n <button className=\"silo-btn silo-btn--lg\" onClick={() => { abort(); setPreview(null); }}>Cancelar</button>\n </div>\n )}\n\n {state.status === \"done\" && !renderSuccess && (\n <div className=\"silo-card silo-card--success\" style={{ gap: 12, padding: \"14px 16px\" }}>\n <span style={{ fontSize: 24 }}>✅</span>\n <div style={{ flex: 1 }}>\n <div style={{ fontWeight: 700, fontSize: 14, color: \"#16a34a\" }}>Imagem enviada com sucesso!</div>\n <div className=\"silo-text-muted\" style={{ fontSize: 12, marginTop: 2 }}>{formatBytes(state.result.size)}</div>\n </div>\n <button className=\"silo-btn\" style={{ borderColor: \"rgba(34,197,94,0.3)\", color: \"#16a34a\", padding: \"4px 10px\", flexShrink: 0 }} onClick={() => { reset(); setPreview(null); }}>\n Enviar outra\n </button>\n </div>\n )}\n\n {state.status === \"error\" && !renderError && (\n <div className=\"silo-card silo-card--error\" style={{ gap: 12, padding: \"14px 16px\" }}>\n <span style={{ fontSize: 22 }}>⚠️</span>\n <div style={{ flex: 1 }}>\n <div className=\"silo-text-error\" style={{ fontWeight: 700, fontSize: 13 }}>Não foi possível enviar a imagem</div>\n <div className=\"silo-text-muted\" style={{ fontSize: 12, marginTop: 2 }}>{state.error.message}</div>\n </div>\n <button className=\"silo-btn\" style={{ borderColor: \"rgba(239,68,68,0.3)\", color: \"#ef4444\", padding: \"4px 10px\", flexShrink: 0 }} onClick={() => { reset(); setPreview(null); }}>\n Tentar novamente\n </button>\n </div>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/theme.ts","../src/components/DropZone.tsx","../src/components/ProgressBar.tsx","../src/components/ImageOptions.tsx","../src/utils/format.ts","../src/ImageUploader.tsx"],"names":["jsx","jsxs","useState","useCallback"],"mappings":"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","file":"ImageUploader.js","sourcesContent":["import type { SiloTheme } from \"../types.js\";\n\nexport const defaultTheme: Required<SiloTheme> = {\n borderColor: \"#e2e8f0\",\n borderColorActive: \"#6366f1\",\n backgroundColor: \"#f8fafc\",\n backgroundColorHover: \"#f1f5f9\",\n textColor: \"#0f172a\",\n textColorMuted: \"#64748b\",\n accentColor: \"#6366f1\",\n accentColorHover: \"#4f46e5\",\n errorColor: \"#ef4444\",\n successColor: \"#22c55e\",\n borderRadius: \"12px\",\n fontFamily: \"inherit\",\n};\n\nexport function resolveTheme(theme?: SiloTheme): Required<SiloTheme> {\n return { ...defaultTheme, ...theme };\n}\n\nexport function themeToVars(theme: Required<SiloTheme>): Record<string, string> {\n return {\n \"--silo-border\": theme.borderColor,\n \"--silo-border-active\": theme.borderColorActive,\n \"--silo-bg\": theme.backgroundColor,\n \"--silo-bg-hover\": theme.backgroundColorHover,\n \"--silo-text\": theme.textColor,\n \"--silo-text-muted\": theme.textColorMuted,\n \"--silo-accent\": theme.accentColor,\n \"--silo-accent-hover\": theme.accentColorHover,\n \"--silo-error\": theme.errorColor,\n \"--silo-success\": theme.successColor,\n \"--silo-radius\": theme.borderRadius,\n \"--silo-font\": theme.fontFamily,\n };\n}\n","\"use client\";\n\nimport {\n useState,\n useRef,\n useCallback,\n type DragEvent,\n type ChangeEvent,\n type ReactNode,\n type CSSProperties,\n} from \"react\";\nimport type { SiloTheme } from \"../types.js\";\nimport { resolveTheme, themeToVars } from \"../utils/theme.js\";\n\ninterface DropZoneProps {\n accept?: string;\n multiple?: boolean;\n disabled?: boolean;\n maxSize?: number;\n onFiles: (files: File[]) => void;\n onError?: (error: Error) => void;\n className?: string;\n style?: CSSProperties;\n theme?: SiloTheme;\n children: ReactNode;\n}\n\nexport function DropZone({\n accept,\n multiple = false,\n disabled = false,\n maxSize,\n onFiles,\n onError,\n className = \"\",\n style,\n theme,\n children,\n}: DropZoneProps) {\n const [dragging, setDragging] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const t = resolveTheme(theme);\n const vars = themeToVars(t);\n\n const validate = useCallback(\n (files: File[]): File[] => {\n return files.filter((f) => {\n if (maxSize && f.size > maxSize) {\n onError?.(new Error(`File \"${f.name}\" exceeds max size of ${maxSize} bytes`));\n return false;\n }\n return true;\n });\n },\n [maxSize, onError]\n );\n\n const handleDrop = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setDragging(false);\n if (disabled) return;\n const files = Array.from(e.dataTransfer.files);\n const valid = validate(files);\n if (valid.length) onFiles(valid);\n },\n [disabled, validate, onFiles]\n );\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files ?? []);\n const valid = validate(files);\n if (valid.length) onFiles(valid);\n e.target.value = \"\";\n },\n [validate, onFiles]\n );\n\n const rootStyle: CSSProperties = {\n ...vars as CSSProperties,\n ...style,\n };\n\n const cls = [\n \"border-2 border-dashed border-slate-200 rounded-xl bg-slate-50 text-slate-900 cursor-pointer outline-none transition-colors duration-150\",\n dragging ? \"border-indigo-500 bg-slate-100\" : \"hover:border-indigo-500 hover:bg-slate-100\",\n disabled ? \"opacity-50 cursor-not-allowed\" : \"\",\n className,\n ].filter(Boolean).join(\" \");\n\n return (\n <div\n className={cls}\n style={rootStyle}\n onDragOver={(e) => { e.preventDefault(); if (!disabled) setDragging(true); }}\n onDragLeave={() => setDragging(false)}\n onDrop={handleDrop}\n onClick={() => !disabled && inputRef.current?.click()}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n onKeyDown={(e) => { if (e.key === \"Enter\" || e.key === \" \") inputRef.current?.click(); }}\n aria-label=\"Upload area\"\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n onChange={handleChange}\n disabled={disabled}\n />\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport type { CSSProperties } from \"react\";\n\ninterface ProgressBarProps {\n progress: number;\n className?: string;\n style?: CSSProperties;\n}\n\nexport function ProgressBar({ progress, className = \"\", style }: ProgressBarProps) {\n return (\n <div\n className={`h-1 rounded-full bg-slate-200 overflow-hidden${className ? ` ${className}` : \"\"}`}\n style={style}\n role=\"progressbar\"\n aria-valuenow={progress}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div\n className=\"h-full rounded-full bg-indigo-500 transition-[width] duration-200 ease-linear\"\n style={{ width: `${progress}%` }}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport type { CSSProperties } from \"react\";\nimport type { ImageUploadOptions } from \"@geekapps/silo-nextjs\";\n\nconst FORMATS = [\n { value: \"webp\", label: \"WebP\", hint: \"Melhor custo-benefício\" },\n { value: \"avif\", label: \"AVIF\", hint: \"Máxima compressão\" },\n { value: \"jpeg\", label: \"JPEG\", hint: \"Compatibilidade universal\" },\n { value: \"png\", label: \"PNG\", hint: \"Sem perda\" },\n];\n\ninterface ImageOptionsProps {\n value: ImageUploadOptions;\n onChange: (opts: ImageUploadOptions) => void;\n style?: CSSProperties;\n}\n\nexport function ImageOptions({ value, onChange, style }: ImageOptionsProps) {\n const fmt = value.format ?? \"webp\";\n const optimize = value.optimize ?? true;\n\n return (\n <div className=\"flex flex-col gap-2.5\" style={style}>\n {/* Format */}\n <div>\n <div className=\"text-[11px] font-bold text-slate-500 uppercase tracking-[0.05em] mb-1.5\">\n Formato de saída\n </div>\n <div className=\"flex gap-1.5 flex-wrap\">\n {FORMATS.map((f) => (\n <button\n key={f.value}\n type=\"button\"\n onClick={() => onChange({ ...value, format: f.value as NonNullable<ImageUploadOptions[\"format\"]> })}\n title={f.hint}\n className={`py-1 px-3 rounded-md text-xs font-semibold cursor-pointer transition-colors border ${\n fmt === f.value\n ? \"border-indigo-500 bg-indigo-500 text-white\"\n : \"border-slate-200 bg-transparent text-slate-900 hover:bg-slate-100\"\n }`}\n >\n {f.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Optimize toggle */}\n <label className=\"flex items-center gap-2 cursor-pointer select-none\">\n <span\n onClick={() => onChange({ ...value, optimize: !optimize })}\n className={`relative w-9 h-5 rounded-full shrink-0 cursor-pointer transition-colors duration-150 ${\n optimize ? \"bg-indigo-500\" : \"bg-slate-200\"\n }`}\n >\n <span\n className=\"absolute top-0.5 w-4 h-4 rounded-full bg-white shadow-sm transition-[left] duration-150\"\n style={{ left: optimize ? \"18px\" : \"2px\" }}\n />\n </span>\n <span className=\"text-xs text-slate-900 font-medium\">\n Otimizar tamanho\n </span>\n <span className=\"text-[11px] text-slate-400\">\n {optimize ? \"Qualidade 85 — menor tamanho\" : \"Qualidade máxima\"}\n </span>\n </label>\n </div>\n );\n}\n","export function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 ** 2) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 ** 3) return `${(bytes / 1024 ** 2).toFixed(1)} MB`;\n return `${(bytes / 1024 ** 3).toFixed(2)} GB`;\n}\n\nexport function getFileIcon(mimeType: string): string {\n if (mimeType.startsWith(\"image/\")) return \"🖼️\";\n if (mimeType.startsWith(\"video/\")) return \"🎬\";\n if (mimeType.startsWith(\"audio/\")) return \"🎵\";\n if (mimeType === \"application/pdf\") return \"📄\";\n if (mimeType.includes(\"spreadsheet\") || mimeType.includes(\"excel\")) return \"📊\";\n if (mimeType.includes(\"presentation\") || mimeType.includes(\"powerpoint\")) return \"📑\";\n if (mimeType.includes(\"word\") || mimeType.includes(\"document\")) return \"📝\";\n if (mimeType.includes(\"zip\") || mimeType.includes(\"tar\") || mimeType.includes(\"gzip\")) return \"📦\";\n return \"📎\";\n}\n","\"use client\";\n\nimport { useState, useCallback, type CSSProperties } from \"react\";\nimport { useMultipartUpload } from \"@geekapps/silo-nextjs\";\nimport type { ImageUploadOptions } from \"@geekapps/silo-nextjs\";\nimport type { ImageUploaderProps } from \"./types.js\";\nimport { DropZone } from \"./components/DropZone.js\";\nimport { ProgressBar } from \"./components/ProgressBar.js\";\nimport { ImageOptions } from \"./components/ImageOptions.js\";\nimport { formatBytes } from \"./utils/format.js\";\nimport { resolveTheme, themeToVars } from \"./utils/theme.js\";\n\nfunction uploadLabel(status: string, progress: number): string {\n if (status === \"preparing\") return \"Preparando…\";\n if (status === \"completing\") return \"Concluindo…\";\n if (progress < 30) return \"Iniciando envio…\";\n if (progress < 70) return \"Enviando imagem…\";\n if (progress < 95) return \"Quase lá…\";\n return \"Finalizando…\";\n}\n\nexport function ImageUploader({\n bucket,\n expiresIn,\n onUpload,\n onError,\n className = \"\",\n style,\n disabled = false,\n maxSize,\n accept = \"image/*\",\n showPreview = true,\n showImageOptions = false,\n image,\n theme,\n renderIcon,\n renderProgress,\n renderSuccess,\n renderError,\n children,\n}: ImageUploaderProps) {\n const { state, upload, pause, resume, abort, reset } = useMultipartUpload(bucket);\n const [preview, setPreview] = useState<string | null>(null);\n const [imageOpts, setImageOpts] = useState<ImageUploadOptions>(image ?? { format: \"webp\", optimize: true });\n const [stagedFile, setStagedFile] = useState<File | null>(null);\n const t = resolveTheme(theme);\n const vars = themeToVars(t);\n\n const doUpload = useCallback(async (file: File, opts: ImageUploadOptions) => {\n if (showPreview) setPreview(URL.createObjectURL(file));\n try {\n const result = await upload(file, { ...(bucket !== undefined && { bucket }), image: opts });\n if (result) onUpload?.(result);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n }, [upload, bucket, onUpload, onError, showPreview]);\n\n const handleFiles = useCallback(async (files: File[]) => {\n const file = files[0];\n if (!file) return;\n if (showImageOptions) {\n setStagedFile(file);\n if (showPreview) setPreview(URL.createObjectURL(file));\n } else {\n await doUpload(file, image ?? imageOpts);\n }\n }, [showImageOptions, image, imageOpts, doUpload, showPreview]);\n\n const containerStyle: CSSProperties = {\n ...vars as CSSProperties,\n ...style,\n };\n\n const isUploading = state.status === \"uploading\" || state.status === \"preparing\" || state.status === \"completing\";\n const progress = state.status === \"uploading\" ? state.progress : state.status === \"completing\" ? 99 : 0;\n const isPaused = state.status === \"idle\" && preview !== null && !stagedFile;\n\n if (state.status === \"error\" && renderError) return <div className=\"flex flex-col gap-3 w-full\" style={containerStyle}>{renderError(state.error, reset)}</div>;\n if (state.status === \"done\" && renderSuccess) return <div className=\"flex flex-col gap-3 w-full\" style={containerStyle}>{renderSuccess(state.result)}</div>;\n\n return (\n <div className={`flex flex-col gap-3 w-full${className ? ` ${className}` : \"\"}`} style={containerStyle}>\n <DropZone\n {...(accept !== undefined && { accept })}\n {...(maxSize !== undefined && { maxSize })}\n {...(onError !== undefined && { onError })}\n {...(theme !== undefined && { theme })}\n disabled={disabled || isUploading}\n onFiles={handleFiles}\n style={{ padding: \"32px 24px\", textAlign: \"center\" }}\n >\n {preview && !isUploading && !stagedFile ? (\n <div className=\"flex flex-col items-center gap-2\">\n <img src={preview} alt=\"Pré-visualização\" className=\"max-w-full max-h-[200px] rounded-lg object-contain\" />\n <span className=\"text-[12px] text-slate-400\">Clique ou arraste para trocar a imagem</span>\n </div>\n ) : (\n <div className=\"flex flex-col items-center gap-2\">\n {renderIcon ? renderIcon() : (\n <svg width=\"40\" height=\"40\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" className=\"text-slate-400 opacity-50\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n )}\n {children ?? (\n <>\n <span className=\"text-slate-900 font-bold text-[15px]\">Arraste sua imagem aqui</span>\n <span className=\"text-slate-500 text-[13px]\">ou clique para escolher do seu dispositivo</span>\n {maxSize && <span className=\"text-slate-400 text-[12px]\">Tamanho máximo: {formatBytes(maxSize)}</span>}\n </>\n )}\n </div>\n )}\n </DropZone>\n\n {showImageOptions && stagedFile && !isUploading && state.status !== \"done\" && (\n <>\n {preview && (\n <div className=\"border border-slate-200 rounded-xl overflow-hidden\">\n <img src={preview} alt=\"Pré-visualização\" className=\"w-full max-h-[200px] object-contain block bg-slate-50\" />\n </div>\n )}\n <div className=\"border border-slate-200 rounded-xl overflow-hidden\">\n <div className=\"px-3.5 py-2 bg-slate-100 text-[12px] font-bold text-slate-500 tracking-[0.04em]\">🖼️ Configurações de imagem</div>\n <ImageOptions value={imageOpts} onChange={setImageOpts} style={{ padding: \"12px 14px\" }} />\n </div>\n <div className=\"flex gap-2\">\n <button\n className=\"inline-flex items-center justify-center gap-1.5 text-sm font-bold py-2.5 px-4 rounded-xl border border-slate-200 bg-transparent text-slate-900 cursor-pointer transition-colors hover:bg-slate-100\"\n onClick={() => { setStagedFile(null); setPreview(null); }}\n >\n Cancelar\n </button>\n <button\n className=\"flex-1 inline-flex items-center justify-center gap-1.5 text-sm font-bold py-2.5 px-4 rounded-xl border-transparent bg-indigo-500 text-white cursor-pointer transition-opacity hover:opacity-90\"\n onClick={() => { const f = stagedFile; setStagedFile(null); void doUpload(f, imageOpts); }}\n >\n Enviar imagem\n </button>\n </div>\n </>\n )}\n\n {isUploading && (\n renderProgress ? renderProgress(progress) : (\n <div className=\"flex flex-col gap-2 px-3 py-4 bg-slate-50 rounded-xl border border-slate-200\">\n <div className=\"flex justify-between items-center\">\n <span className=\"text-[13px] font-semibold text-slate-900\">{uploadLabel(state.status, progress)}</span>\n <span className=\"text-[13px] font-bold text-indigo-500\">{progress}%</span>\n </div>\n <ProgressBar progress={progress} />\n </div>\n )\n )}\n\n {isPaused && (\n <div className=\"flex gap-2\">\n <button\n className=\"flex-1 inline-flex items-center justify-center gap-1.5 text-sm font-bold py-2.5 px-4 rounded-xl border-transparent bg-emerald-500 text-white cursor-pointer hover:opacity-90\"\n onClick={() => resume({ ...(bucket !== undefined && { bucket }), image: imageOpts })}\n >\n ▶ Retomar envio\n </button>\n <button\n className=\"inline-flex items-center justify-center gap-1.5 text-sm font-bold py-2.5 px-4 rounded-xl border border-slate-200 bg-transparent text-slate-900 cursor-pointer hover:bg-slate-100\"\n onClick={() => { abort(); setPreview(null); }}\n >\n Cancelar\n </button>\n </div>\n )}\n\n {state.status === \"done\" && !renderSuccess && (\n <div className=\"flex items-center gap-3 px-4 py-3.5 bg-green-500/[0.08] rounded-xl border border-green-500/20\">\n <span className=\"text-2xl\">✅</span>\n <div className=\"flex-1\">\n <div className=\"font-bold text-sm text-green-700\">Imagem enviada com sucesso!</div>\n <div className=\"text-[12px] text-slate-400 mt-0.5\">{formatBytes(state.result.size)}</div>\n </div>\n <button\n className=\"inline-flex items-center justify-center text-xs font-semibold py-1 px-2.5 rounded-lg border border-green-500/30 text-green-700 bg-transparent cursor-pointer hover:bg-green-500/10 shrink-0\"\n onClick={() => { reset(); setPreview(null); }}\n >\n Enviar outra\n </button>\n </div>\n )}\n\n {state.status === \"error\" && !renderError && (\n <div className=\"flex items-center gap-3 px-4 py-3.5 bg-red-500/[0.07] rounded-xl border border-red-500/20\">\n <span className=\"text-[22px]\">⚠️</span>\n <div className=\"flex-1\">\n <div className=\"font-bold text-[13px] text-red-500\">Não foi possível enviar a imagem</div>\n <div className=\"text-[12px] text-slate-400 mt-0.5\">{state.error.message}</div>\n </div>\n <button\n className=\"inline-flex items-center justify-center text-xs font-semibold py-1 px-2.5 rounded-lg border border-red-500/30 text-red-500 bg-transparent cursor-pointer hover:bg-red-500/10 shrink-0\"\n onClick={() => { reset(); setPreview(null); }}\n >\n Tentar novamente\n </button>\n </div>\n )}\n </div>\n );\n}\n"]}