@geekapps/silo-elements-nextjs 0.2.37 → 0.2.39
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/FileUploader.js +10 -10
- package/dist/FileUploader.js.map +1 -1
- package/dist/ImageUploader.js +5 -5
- package/dist/ImageUploader.js.map +1 -1
- package/dist/MediaUploader.js +11 -11
- package/dist/MediaUploader.js.map +1 -1
- package/dist/VideoPlayer.js +12 -12
- package/dist/VideoPlayer.js.map +1 -1
- package/dist/VideoUploader.js +4 -4
- package/dist/VideoUploader.js.map +1 -1
- package/dist/components/DropZone.js +3 -3
- package/dist/components/DropZone.js.map +1 -1
- package/dist/index.js +30 -30
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/styles.css +1 -1
package/dist/FileUploader.js
CHANGED
|
@@ -89,9 +89,9 @@ function DropZone({
|
|
|
89
89
|
...style
|
|
90
90
|
};
|
|
91
91
|
const cls = [
|
|
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" : "",
|
|
92
|
+
"silo-border-2 silo-border-dashed silo-border-slate-200 silo-rounded-xl silo-bg-slate-50 silo-text-slate-900 silo-cursor-pointer silo-outline-none silo-transition-colors silo-duration-150",
|
|
93
|
+
dragging ? "silo-border-indigo-500 silo-bg-slate-100" : "hover:silo-border-indigo-500 hover:silo-bg-slate-100",
|
|
94
|
+
disabled ? "silo-opacity-50 silo-cursor-not-allowed" : "",
|
|
95
95
|
className
|
|
96
96
|
].filter(Boolean).join(" ");
|
|
97
97
|
return /* @__PURE__ */ jsxs(
|
|
@@ -168,7 +168,7 @@ function ImageOptions({ value, onChange, style }) {
|
|
|
168
168
|
type: "button",
|
|
169
169
|
onClick: () => onChange({ ...value, format: f.value }),
|
|
170
170
|
title: f.hint,
|
|
171
|
-
className: `py-1 px-3 rounded-md text-xs font-semibold cursor-pointer transition-colors border
|
|
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"}`,
|
|
172
172
|
children: f.label
|
|
173
173
|
},
|
|
174
174
|
f.value
|
|
@@ -179,7 +179,7 @@ function ImageOptions({ value, onChange, style }) {
|
|
|
179
179
|
"span",
|
|
180
180
|
{
|
|
181
181
|
onClick: () => onChange({ ...value, optimize: !optimize }),
|
|
182
|
-
className: `relative w-9 h-5 rounded-full shrink-0 cursor-pointer transition-colors duration-150
|
|
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
183
|
children: /* @__PURE__ */ jsx(
|
|
184
184
|
"span",
|
|
185
185
|
{
|
|
@@ -217,7 +217,7 @@ function Toggle({ checked, onToggle, label }) {
|
|
|
217
217
|
/* @__PURE__ */ jsx(
|
|
218
218
|
"span",
|
|
219
219
|
{
|
|
220
|
-
className: `relative inline-block w-8 h-[18px] rounded-full shrink-0 cursor-pointer transition-colors duration-150
|
|
220
|
+
className: `relative inline-block w-8 h-[18px] rounded-full shrink-0 cursor-pointer transition-colors duration-150${checked ? "bg-indigo-500" : "bg-slate-200"}`,
|
|
221
221
|
children: /* @__PURE__ */ jsx(
|
|
222
222
|
"span",
|
|
223
223
|
{
|
|
@@ -486,7 +486,7 @@ function FileUploader({
|
|
|
486
486
|
) : /* @__PURE__ */ jsxs(
|
|
487
487
|
"div",
|
|
488
488
|
{
|
|
489
|
-
className: `text-[13px] font-semibold text-slate-900 overflow-hidden text-ellipsis whitespace-nowrap
|
|
489
|
+
className: `text-[13px] font-semibold text-slate-900 overflow-hidden text-ellipsis whitespace-nowrap${allowRename ? "cursor-text" : "cursor-default"}`,
|
|
490
490
|
onClick: () => allowRename && setEditingIndex(i),
|
|
491
491
|
title: allowRename ? "Clique para renomear" : void 0,
|
|
492
492
|
children: [
|
|
@@ -572,7 +572,7 @@ function FileUploader({
|
|
|
572
572
|
] }),
|
|
573
573
|
isDone && /* @__PURE__ */ jsx("span", { className: "text-lg shrink-0", children: "\u2705" }),
|
|
574
574
|
isErr && /* @__PURE__ */ jsx("span", { className: "text-[12px] font-semibold text-red-500 shrink-0", children: "Erro no envio" }),
|
|
575
|
-
!isDone && !isErr && /* @__PURE__ */ jsx("span", { className: `text-[12px] font-bold shrink-0
|
|
575
|
+
!isDone && !isErr && /* @__PURE__ */ jsx("span", { className: `text-[12px] font-bold shrink-0${isPaused ? "text-slate-400" : "text-indigo-500"}`, children: isPaused ? "Pausado" : `${p}%` }),
|
|
576
576
|
!isDone && !isErr && f.fileId && (isPaused ? /* @__PURE__ */ jsx("button", { className: "inline-flex items-center justify-center gap-1.5 text-[11px] font-semibold py-0.5 px-2.5 rounded-lg border-transparent bg-emerald-500 text-white cursor-pointer hover:opacity-90", onClick: () => batch.resumeFile(f.fileId), children: "Retomar" }) : st.status === "uploading" ? /* @__PURE__ */ jsx("button", { className: "inline-flex items-center justify-center gap-1.5 text-[11px] font-semibold py-0.5 px-2.5 rounded-lg border border-slate-200 bg-transparent text-slate-900 cursor-pointer hover:bg-slate-100", onClick: () => batch.pauseFile(f.fileId), children: "Pausar" }) : null)
|
|
577
577
|
] }),
|
|
578
578
|
!isDone && !isErr && /* @__PURE__ */ jsx(ProgressBar, { progress: p })
|
|
@@ -582,7 +582,7 @@ function FileUploader({
|
|
|
582
582
|
batch.state.status !== "done" && /* @__PURE__ */ jsx(
|
|
583
583
|
"button",
|
|
584
584
|
{
|
|
585
|
-
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 text-white cursor-pointer hover:opacity-90
|
|
585
|
+
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 text-white cursor-pointer hover:opacity-90${isBatchUploading ? "bg-amber-500" : "bg-emerald-500"}`,
|
|
586
586
|
onClick: isBatchUploading ? batch.pauseAll : batch.resumeAll,
|
|
587
587
|
children: isBatchUploading ? "\u23F8 Pausar tudo" : "\u25B6 Retomar tudo"
|
|
588
588
|
}
|
|
@@ -590,7 +590,7 @@ function FileUploader({
|
|
|
590
590
|
/* @__PURE__ */ jsx(
|
|
591
591
|
"button",
|
|
592
592
|
{
|
|
593
|
-
className: `inline-flex items-center justify-center gap-1.5 text-sm font-bold py-2.5 px-4 rounded-xl border-transparent text-white cursor-pointer hover:opacity-90
|
|
593
|
+
className: `inline-flex items-center justify-center gap-1.5 text-sm font-bold py-2.5 px-4 rounded-xl border-transparent text-white cursor-pointer hover:opacity-90${batch.state.status === "done" ? "bg-indigo-500" : "bg-red-500/90"}`,
|
|
594
594
|
onClick: batch.state.status === "done" ? batch.reset : batch.abortAll,
|
|
595
595
|
children: batch.state.status === "done" ? "Enviar mais arquivos" : "Cancelar"
|
|
596
596
|
}
|
package/dist/FileUploader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/theme.ts","../src/components/DropZone.tsx","../src/components/ProgressBar.tsx","../src/components/ImageOptions.tsx","../src/components/VideoOptions.tsx","../src/utils/format.ts","../src/FileUploader.tsx"],"names":["jsx","jsxs","useState","useCallback"],"mappings":"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","file":"FileUploader.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","\"use client\";\n\nimport type { CSSProperties } from \"react\";\nimport type { VideoUploadOptions } from \"@geekapps/silo-nextjs\";\n\nconst CODECS = [\n { value: \"h264\", label: \"H.264 (NVENC)\", hint: \"Compatibilidade máxima — GPU accelerated\" },\n { value: \"h265\", label: \"H.265 (NVENC)\", hint: \"Melhor compressão — GPU accelerated\" },\n];\n\nconst RESOLUTIONS = [\"144\", \"240\", \"360\", \"480\", \"720\", \"1080\", \"1440\", \"2160\"] as const;\nconst RESOLUTION_LABELS: Record<string, string> = {\n \"144\": \"144p\", \"240\": \"240p\", \"360\": \"360p\", \"480\": \"480p\",\n \"720\": \"720p\", \"1080\": \"1080p\", \"1440\": \"1440p\", \"2160\": \"4K\",\n};\n\ninterface VideoOptionsProps {\n value: VideoUploadOptions;\n onChange: (opts: VideoUploadOptions) => void;\n style?: CSSProperties;\n}\n\nfunction optionBtnCls(active: boolean): string {\n return `py-1 px-2.5 rounded-md text-xs font-semibold cursor-pointer transition-colors border ${\n active\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\nfunction Toggle({ checked, onToggle, label }: { checked: boolean; onToggle: () => void; label: string }) {\n return (\n <label className=\"inline-flex items-center gap-1.5 cursor-pointer select-none text-xs text-slate-900 font-medium\" onClick={onToggle}>\n <span\n className={`relative inline-block w-8 h-[18px] rounded-full shrink-0 cursor-pointer transition-colors duration-150 ${\n checked ? \"bg-indigo-500\" : \"bg-slate-200\"\n }`}\n >\n <span\n className=\"absolute top-0.5 w-3.5 h-3.5 rounded-full bg-white shadow-sm transition-[left] duration-150\"\n style={{ left: checked ? \"16px\" : \"2px\" }}\n />\n </span>\n {label}\n </label>\n );\n}\n\nexport function VideoOptions({ value, onChange, style }: VideoOptionsProps) {\n const codec = value.codec ?? \"h264\";\n const transcoding = value.transcoding ?? \"auto\";\n const isAuto = transcoding === \"auto\";\n const selectedRes: string[] = isAuto ? [] : (transcoding as string[]);\n\n type Res = \"360\" | \"480\" | \"720\" | \"1080\" | \"1440\" | \"2160\";\n function toggleRes(r: Res) {\n if (isAuto) {\n onChange({ ...value, transcoding: [r] });\n return;\n }\n const next = selectedRes.includes(r)\n ? selectedRes.filter((x) => x !== r)\n : [...selectedRes, r];\n onChange({ ...value, transcoding: next.length === 0 ? \"auto\" : (next as Res[]) });\n }\n\n function toggleFeature(key: keyof VideoUploadOptions) {\n onChange({ ...value, [key]: !value[key] });\n }\n\n return (\n <div className=\"flex flex-col gap-3\" style={style}>\n\n {/* Codec */}\n <div>\n <div className=\"text-[11px] font-bold text-slate-500 uppercase tracking-[0.05em] mb-1.5\">Codec</div>\n <div className=\"flex gap-1.5 flex-wrap\">\n {CODECS.map((c) => (\n <button key={c.value} type=\"button\" title={c.hint}\n onClick={() => onChange({ ...value, codec: c.value as NonNullable<VideoUploadOptions[\"codec\"]> })}\n className={optionBtnCls(codec === c.value)}\n >\n {c.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Resolutions */}\n <div>\n <div className=\"text-[11px] font-bold text-slate-500 uppercase tracking-[0.05em] mb-1.5\">\n Resoluções\n </div>\n <div className=\"flex gap-1.5 flex-wrap\">\n <button type=\"button\" onClick={() => onChange({ ...value, transcoding: \"auto\" })} className={optionBtnCls(isAuto)}>\n Auto\n </button>\n {RESOLUTIONS.map((r) => (\n <button key={r} type=\"button\"\n onClick={() => toggleRes(r as \"360\" | \"480\" | \"720\" | \"1080\" | \"1440\" | \"2160\")}\n className={optionBtnCls(!isAuto && selectedRes.includes(r))}\n >\n {RESOLUTION_LABELS[r]}\n </button>\n ))}\n </div>\n </div>\n\n {/* Features */}\n <div>\n <div className=\"text-[11px] font-bold text-slate-500 uppercase tracking-[0.05em] mb-2\">Recursos</div>\n <div className=\"flex flex-col gap-2\">\n <Toggle checked={value.thumbnails ?? true} onToggle={() => toggleFeature(\"thumbnails\")} label=\"Gerar thumbnails\" />\n <Toggle checked={value.storyboard ?? false} onToggle={() => toggleFeature(\"storyboard\")} label=\"Gerar storyboard\" />\n <Toggle checked={value.autoCaptions ?? false} onToggle={() => toggleFeature(\"autoCaptions\")} label=\"Legendas automáticas (IA)\" />\n <Toggle checked={value.separateAudio ?? false} onToggle={() => toggleFeature(\"separateAudio\")} label=\"Separar faixa de áudio\" />\n </div>\n </div>\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, useBatchUpload } from \"@geekapps/silo-nextjs\";\nimport type { ImageUploadOptions, VideoUploadOptions } from \"@geekapps/silo-nextjs\";\nimport type { FileUploaderProps } from \"./types.js\";\nimport { DropZone } from \"./components/DropZone.js\";\nimport { ProgressBar } from \"./components/ProgressBar.js\";\nimport { ImageOptions } from \"./components/ImageOptions.js\";\nimport { VideoOptions } from \"./components/VideoOptions.js\";\nimport { formatBytes, getFileIcon } from \"./utils/format.js\";\nimport { resolveTheme, themeToVars } from \"./utils/theme.js\";\n\nconst DEFAULT_VIDEO_OPTS: VideoUploadOptions = {\n thumbnails: true, storyboard: false, autoCaptions: false,\n separateAudio: false, codec: \"h264\", transcoding: \"auto\",\n};\n\nfunction createInitialImageOpts(image?: ImageUploadOptions): ImageUploadOptions {\n return image ?? { format: \"webp\", optimize: true };\n}\n\nfunction createInitialVideoOpts(video?: VideoUploadOptions): VideoUploadOptions {\n return video ?? DEFAULT_VIDEO_OPTS;\n}\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…\";\n if (progress < 95) return \"Quase lá…\";\n return \"Finalizando…\";\n}\n\nexport function FileUploader({\n bucket,\n onUpload,\n onBatchUpload,\n onError,\n className = \"\",\n style,\n disabled = false,\n maxSize,\n accept,\n multiple = false,\n allowRename = false,\n showImageOptions = false,\n showVideoOptions = false,\n image,\n video,\n theme,\n renderIcon,\n renderProgress,\n renderSuccess,\n renderError,\n children,\n}: FileUploaderProps) {\n const t = resolveTheme(theme);\n const vars = themeToVars(t);\n\n const containerStyle: CSSProperties = {\n ...vars as CSSProperties,\n ...style,\n };\n\n const single = useMultipartUpload(bucket);\n const batch = useBatchUpload();\n\n const [imageOpts, setImageOpts] = useState<ImageUploadOptions>(() => createInitialImageOpts(image));\n const [videoOpts, setVideoOpts] = useState<VideoUploadOptions>(() => createInitialVideoOpts(video));\n const [staged, setStaged] = useState<File[] | null>(null);\n const [renames, setRenames] = useState<Map<number, string>>(new Map());\n const [editingIndex, setEditingIndex] = useState<number | null>(null);\n\n function effectiveName(index: number, files: File[]): string {\n return renames.get(index) ?? files[index]?.name ?? \"\";\n }\n\n function setRename(index: number, name: string, files: File[]) {\n setRenames((prev) => {\n const next = new Map(prev);\n if (name.trim() && name.trim() !== files[index]?.name) next.set(index, name.trim());\n else next.delete(index);\n return next;\n });\n }\n\n function clearStaging() {\n setStaged(null);\n setRenames(new Map());\n setEditingIndex(null);\n setImageOpts(createInitialImageOpts(image));\n setVideoOpts(createInitialVideoOpts(video));\n }\n\n const doUpload = useCallback(async (files: File[], overrideImage?: ImageUploadOptions, overrideVideo?: VideoUploadOptions) => {\n const resolvedImage = overrideImage ?? imageOpts;\n const resolvedVideo = overrideVideo ?? videoOpts;\n const effectiveImage = showImageOptions ? resolvedImage : (image ?? resolvedImage);\n const effectiveVideo = showVideoOptions ? resolvedVideo : (video ?? resolvedVideo);\n if (multiple && files.length > 1) {\n try {\n const results = await batch.upload(files, { ...(bucket !== undefined && { bucket }), image: effectiveImage, video: effectiveVideo });\n onBatchUpload?.(results);\n results.forEach((r) => onUpload?.(r));\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n } else {\n const file = files[0];\n if (!file) return;\n try {\n const result = await single.upload(file, { ...(bucket !== undefined && { bucket }), image: effectiveImage, video: effectiveVideo });\n if (result) onUpload?.(result);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n }\n }, [single, batch, multiple, bucket, image, video, imageOpts, videoOpts, showImageOptions, showVideoOptions, onUpload, onBatchUpload, onError]);\n\n const handleFiles = useCallback(async (files: File[]) => {\n const needsStaging = allowRename\n || (showImageOptions && files.some((f) => f.type.startsWith(\"image/\")))\n || (showVideoOptions && files.some((f) => f.type.startsWith(\"video/\")));\n if (needsStaging) {\n setImageOpts(createInitialImageOpts(image));\n setVideoOpts(createInitialVideoOpts(video));\n setStaged(files);\n setRenames(new Map());\n }\n else await doUpload(files);\n }, [allowRename, showImageOptions, showVideoOptions, doUpload, image, video]);\n\n async function handleConfirmUpload() {\n if (!staged) return;\n const filesToUpload = staged.map((f, i) => {\n const name = effectiveName(i, staged);\n return name !== f.name ? new File([f], name, { type: f.type }) : f;\n });\n const snapshotImage = imageOpts;\n const snapshotVideo = videoOpts;\n clearStaging();\n await doUpload(filesToUpload, snapshotImage, snapshotVideo);\n }\n\n const isBatch = batch.state.files.length > 0;\n const isSingleUploading = single.state.status === \"uploading\" || single.state.status === \"preparing\" || single.state.status === \"completing\";\n const isBatchUploading = batch.state.status === \"uploading\" || batch.state.status === \"preparing\";\n const isUploading = isSingleUploading || isBatchUploading;\n const singleProgress = single.state.status === \"uploading\" ? single.state.progress : single.state.status === \"completing\" ? 99 : 0;\n\n if (single.state.status === \"error\" && renderError) return <div className=\"flex flex-col gap-3 w-full\" style={containerStyle}>{renderError(single.state.error, single.reset)}</div>;\n if (single.state.status === \"done\" && renderSuccess) return <div className=\"flex flex-col gap-3 w-full\" style={containerStyle}>{renderSuccess(single.state.result)}</div>;\n\n return (\n <div className={`flex flex-col gap-3 w-full${className ? ` ${className}` : \"\"}`} style={containerStyle}>\n\n {/* Drop zone */}\n {!isBatch && !staged && (\n <DropZone\n {...(accept !== undefined && { accept })}\n {...(maxSize !== undefined && { maxSize })}\n {...(onError !== undefined && { onError })}\n {...(theme !== undefined && { theme })}\n multiple={multiple}\n disabled={disabled || isUploading}\n onFiles={handleFiles}\n style={{ padding: \"28px 24px\", textAlign: \"center\" }}\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=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5m-13.5-9L12 3m0 0l4.5 4.5M12 3v13.5\" />\n </svg>\n )}\n {children ?? (\n <>\n <span className=\"text-slate-900 font-bold text-[15px]\">\n {multiple ? \"Arraste seus arquivos aqui\" : \"Arraste seu arquivo aqui\"}\n </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 </DropZone>\n )}\n\n {/* Staging */}\n {staged && (\n <div className=\"flex flex-col gap-2\">\n <div className=\"text-slate-500 text-[13px] font-semibold mb-0.5\">\n {staged.length === 1 ? \"1 arquivo selecionado\" : `${staged.length} arquivos selecionados`}\n </div>\n\n {staged.map((f, i) => (\n <div key={i} className=\"flex items-center gap-2.5 px-3 py-2.5 bg-slate-50 rounded-xl border border-slate-200\">\n <span className=\"text-xl shrink-0\">{getFileIcon(f.type)}</span>\n <div className=\"flex-1 min-w-0\">\n {editingIndex === i ? (\n <input\n autoFocus\n type=\"text\"\n defaultValue={effectiveName(i, staged)}\n onBlur={(e) => { setRename(i, e.target.value, staged); setEditingIndex(null); }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") { setRename(i, e.currentTarget.value, staged); setEditingIndex(null); }\n if (e.key === \"Escape\") setEditingIndex(null);\n }}\n className=\"w-full text-[13px] font-medium border border-indigo-500 rounded-md py-0.5 px-2 outline-none bg-slate-50 text-slate-900\"\n />\n ) : (\n <div\n className={`text-[13px] font-semibold text-slate-900 overflow-hidden text-ellipsis whitespace-nowrap ${allowRename ? \"cursor-text\" : \"cursor-default\"}`}\n onClick={() => allowRename && setEditingIndex(i)}\n title={allowRename ? \"Clique para renomear\" : undefined}\n >\n {effectiveName(i, staged)}\n {renames.has(i) && <span className=\"text-indigo-500 ml-1.5 text-[10px] font-bold\">renomeado</span>}\n </div>\n )}\n <div className=\"text-[11px] text-slate-400 mt-0.5\">{formatBytes(f.size)}</div>\n </div>\n {allowRename && (\n <button\n onClick={() => setEditingIndex(i)}\n title=\"Renomear\"\n className=\"text-slate-400 bg-none border-none cursor-pointer text-sm px-1 shrink-0 hover:text-slate-600\"\n >\n ✏️\n </button>\n )}\n <button\n onClick={() => { const next = staged.filter((_, j) => j !== i); if (next.length === 0) clearStaging(); else setStaged(next); }}\n className=\"text-slate-400 bg-none border-none cursor-pointer text-lg px-1 leading-none shrink-0 hover:text-slate-600\"\n >\n ×\n </button>\n </div>\n ))}\n\n {showImageOptions && staged.some((f) => f.type.startsWith(\"image/\")) && (\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 )}\n\n {showVideoOptions && staged.some((f) => f.type.startsWith(\"video/\")) && (\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 vídeo</div>\n <VideoOptions value={videoOpts} onChange={setVideoOpts} style={{ padding: \"12px 14px\" }} />\n </div>\n )}\n\n <div className=\"flex gap-2 mt-1\">\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={clearStaging}\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={handleConfirmUpload}\n >\n {staged.length > 1 ? `Enviar ${staged.length} arquivos` : \"Enviar arquivo\"}\n </button>\n </div>\n </div>\n )}\n\n {/* Single upload progress */}\n {isSingleUploading && !isBatch && (\n renderProgress ? renderProgress(singleProgress) : (\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\">\n {uploadLabel(single.state.status, singleProgress)}\n </span>\n <span className=\"text-[13px] font-bold text-indigo-500\">{singleProgress}%</span>\n </div>\n <ProgressBar progress={singleProgress} />\n </div>\n )\n )}\n\n {/* Batch upload progress */}\n {isBatch && (\n <div className=\"flex flex-col gap-2\">\n {batch.state.files.map((f, i) => {\n const st = f.status;\n const p = st.status === \"uploading\" ? st.progress : st.status === \"paused\" ? st.progress : st.status === \"done\" ? 100 : st.status === \"completing\" ? 99 : 0;\n const isPaused = st.status === \"paused\";\n const isDone = st.status === \"done\";\n const isErr = st.status === \"error\";\n\n return (\n <div key={i} className=\"flex flex-col items-stretch gap-2 px-3.5 py-3 bg-slate-50 rounded-xl border border-slate-200\">\n <div className=\"flex items-center gap-2.5\">\n <span className=\"text-lg shrink-0\">{getFileIcon(f.file.type)}</span>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-[13px] font-semibold text-slate-900 overflow-hidden text-ellipsis whitespace-nowrap\">{f.file.name}</div>\n <div className=\"text-[11px] text-slate-400\">{formatBytes(f.file.size)}</div>\n </div>\n {isDone && <span className=\"text-lg shrink-0\">✅</span>}\n {isErr && <span className=\"text-[12px] font-semibold text-red-500 shrink-0\">Erro no envio</span>}\n {!isDone && !isErr && (\n <span className={`text-[12px] font-bold shrink-0 ${isPaused ? \"text-slate-400\" : \"text-indigo-500\"}`}>\n {isPaused ? \"Pausado\" : `${p}%`}\n </span>\n )}\n {!isDone && !isErr && f.fileId && (\n isPaused\n ? <button className=\"inline-flex items-center justify-center gap-1.5 text-[11px] font-semibold py-0.5 px-2.5 rounded-lg border-transparent bg-emerald-500 text-white cursor-pointer hover:opacity-90\" onClick={() => batch.resumeFile(f.fileId!)}>Retomar</button>\n : st.status === \"uploading\" ? <button className=\"inline-flex items-center justify-center gap-1.5 text-[11px] font-semibold py-0.5 px-2.5 rounded-lg border border-slate-200 bg-transparent text-slate-900 cursor-pointer hover:bg-slate-100\" onClick={() => batch.pauseFile(f.fileId!)}>Pausar</button> : null\n )}\n </div>\n {!isDone && !isErr && <ProgressBar progress={p} />}\n </div>\n );\n })}\n\n <div className=\"flex gap-2\">\n {batch.state.status !== \"done\" && (\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 text-white cursor-pointer hover:opacity-90 ${isBatchUploading ? \"bg-amber-500\" : \"bg-emerald-500\"}`}\n onClick={isBatchUploading ? batch.pauseAll : batch.resumeAll}\n >\n {isBatchUploading ? \"⏸ Pausar tudo\" : \"▶ Retomar tudo\"}\n </button>\n )}\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-transparent text-white cursor-pointer hover:opacity-90 ${batch.state.status === \"done\" ? \"bg-indigo-500\" : \"bg-red-500/90\"}`}\n onClick={batch.state.status === \"done\" ? batch.reset : batch.abortAll}\n >\n {batch.state.status === \"done\" ? \"Enviar mais arquivos\" : \"Cancelar\"}\n </button>\n </div>\n\n {batch.state.status === \"done\" && (\n <div className=\"flex items-center gap-2.5 px-3 py-2.5 bg-green-500/[0.08] rounded-xl border border-green-500/20\">\n <span className=\"text-xl\">🎉</span>\n <span className=\"text-sm font-semibold text-green-700\">\n {batch.state.files.length === 1 ? \"Arquivo enviado com sucesso!\" : `${batch.state.files.length} arquivos enviados com sucesso!`}\n </span>\n </div>\n )}\n </div>\n )}\n\n {/* Single done */}\n {single.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 min-w-0\">\n <div className=\"font-bold text-sm text-green-700\">Arquivo enviado com sucesso!</div>\n <div className=\"text-[12px] text-slate-400 mt-0.5\">{formatBytes(single.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={single.reset}\n >\n Enviar outro\n </button>\n </div>\n )}\n\n {/* Single error */}\n {single.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 min-w-0\">\n <div className=\"font-bold text-[13px] text-red-500\">Não foi possível enviar o arquivo</div>\n <div className=\"text-[12px] text-slate-400 mt-0.5\">{single.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={single.reset}\n >\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/components/VideoOptions.tsx","../src/utils/format.ts","../src/FileUploader.tsx"],"names":["jsx","jsxs","useState","useCallback"],"mappings":";;;;;AAEO,IAAM,YAAA,GAAoC;AAAA,EAC/C,WAAA,EAAa,SAAA;AAAA,EACb,iBAAA,EAAmB,SAAA;AAAA,EACnB,eAAA,EAAiB,SAAA;AAAA,EACjB,oBAAA,EAAsB,SAAA;AAAA,EACtB,SAAA,EAAW,SAAA;AAAA,EACX,cAAA,EAAgB,SAAA;AAAA,EAChB,WAAA,EAAa,SAAA;AAAA,EACb,gBAAA,EAAkB,SAAA;AAAA,EAClB,UAAA,EAAY,SAAA;AAAA,EACZ,YAAA,EAAc,SAAA;AAAA,EACd,YAAA,EAAc,MAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAEO,SAAS,aAAa,KAAA,EAAwC;AACnE,EAAA,OAAO,EAAE,GAAG,YAAA,EAAc,GAAG,KAAA,EAAM;AACrC;AAEO,SAAS,YAAY,KAAA,EAAoD;AAC9E,EAAA,OAAO;AAAA,IACL,iBAAiB,KAAA,CAAM,WAAA;AAAA,IACvB,wBAAwB,KAAA,CAAM,iBAAA;AAAA,IAC9B,aAAa,KAAA,CAAM,eAAA;AAAA,IACnB,mBAAmB,KAAA,CAAM,oBAAA;AAAA,IACzB,eAAe,KAAA,CAAM,SAAA;AAAA,IACrB,qBAAqB,KAAA,CAAM,cAAA;AAAA,IAC3B,iBAAiB,KAAA,CAAM,WAAA;AAAA,IACvB,uBAAuB,KAAA,CAAM,gBAAA;AAAA,IAC7B,gBAAgB,KAAA,CAAM,UAAA;AAAA,IACtB,kBAAkB,KAAA,CAAM,YAAA;AAAA,IACxB,iBAAiB,KAAA,CAAM,YAAA;AAAA,IACvB,eAAe,KAAA,CAAM;AAAA,GACvB;AACF;ACTO,SAAS,QAAA,CAAS;AAAA,EACvB,MAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,QAAA,GAAW,KAAA;AAAA,EACX,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAChB,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,OAAyB,IAAI,CAAA;AAC9C,EAAA,MAAM,CAAA,GAAI,aAAa,KAAK,CAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAE1B,EAAA,MAAM,QAAA,GAAW,WAAA;AAAA,IACf,CAAC,KAAA,KAA0B;AACzB,MAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM;AACzB,QAAA,IAAI,OAAA,IAAW,CAAA,CAAE,IAAA,GAAO,OAAA,EAAS;AAC/B,UAAA,OAAA,GAAU,IAAI,MAAM,CAAA,MAAA,EAAS,CAAA,CAAE,IAAI,CAAA,sBAAA,EAAyB,OAAO,QAAQ,CAAC,CAAA;AAC5E,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,SAAS,OAAO;AAAA,GACnB;AAEA,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IACjB,CAAC,CAAA,KAAiC;AAChC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,WAAA,CAAY,KAAK,CAAA;AACjB,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,aAAa,KAAK,CAAA;AAC7C,MAAA,MAAM,KAAA,GAAQ,SAAS,KAAK,CAAA;AAC5B,MAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,OAAA,CAAQ,KAAK,CAAA;AAAA,IACjC,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,QAAA,EAAU,OAAO;AAAA,GAC9B;AAEA,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,CAAC,CAAA,KAAqC;AACpC,MAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA;AAC7C,MAAA,MAAM,KAAA,GAAQ,SAAS,KAAK,CAAA;AAC5B,MAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,OAAA,CAAQ,KAAK,CAAA;AAC/B,MAAA,CAAA,CAAE,OAAO,KAAA,GAAQ,EAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,UAAU,OAAO;AAAA,GACpB;AAEA,EAAA,MAAM,SAAA,GAA2B;AAAA,IAC/B,GAAG,IAAA;AAAA,IACH,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,GAAA,GAAM;AAAA,IACV,4LAAA;AAAA,IACA,WAAW,0CAAA,GAA6C,sDAAA;AAAA,IACxD,WAAW,yCAAA,GAA4C,EAAA;AAAA,IACvD;AAAA,GACF,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAE1B,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,GAAA;AAAA,MACX,KAAA,EAAO,SAAA;AAAA,MACP,UAAA,EAAY,CAAC,CAAA,KAAM;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,IAAI,CAAC,QAAA,EAAU,WAAA,CAAY,IAAI,CAAA;AAAA,MAAG,CAAA;AAAA,MAC3E,WAAA,EAAa,MAAM,WAAA,CAAY,KAAK,CAAA;AAAA,MACpC,MAAA,EAAQ,UAAA;AAAA,MACR,SAAS,MAAM,CAAC,QAAA,IAAY,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,MACpD,IAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAU,WAAW,EAAA,GAAK,CAAA;AAAA,MAC1B,SAAA,EAAW,CAAC,CAAA,KAAM;AAAE,QAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,MAAG,CAAA;AAAA,MACvF,YAAA,EAAW,aAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,QAAA;AAAA,YACL,IAAA,EAAK,MAAA;AAAA,YACL,MAAA;AAAA,YACA,QAAA;AAAA,YACA,SAAA,EAAU,QAAA;AAAA,YACV,QAAA,EAAU,YAAA;AAAA,YACV;AAAA;AAAA,SACF;AAAA,QACC;AAAA;AAAA;AAAA,GACH;AAEJ;AC1GO,SAAS,YAAY,EAAE,QAAA,EAAU,SAAA,GAAY,EAAA,EAAI,OAAM,EAAqB;AACjF,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAW,CAAA,6CAAA,EAAgD,SAAA,GAAY,CAAA,CAAA,EAAI,SAAS,KAAK,EAAE,CAAA,CAAA;AAAA,MAC3F,KAAA;AAAA,MACA,IAAA,EAAK,aAAA;AAAA,MACL,eAAA,EAAe,QAAA;AAAA,MACf,eAAA,EAAe,CAAA;AAAA,MACf,eAAA,EAAe,GAAA;AAAA,MAEf,QAAA,kBAAAA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,+EAAA;AAAA,UACV,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA;AAAI;AAAA;AACjC;AAAA,GACF;AAEJ;ACrBA,IAAM,OAAA,GAAU;AAAA,EACd,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAM,2BAAA,EAAyB;AAAA,EAC/D,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAM,yBAAA,EAAoB;AAAA,EAC1D,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAM,2BAAA,EAA4B;AAAA,EAClE,EAAE,KAAA,EAAO,KAAA,EAAQ,KAAA,EAAO,KAAA,EAAQ,MAAM,WAAA;AACxC,CAAA;AAQO,SAAS,YAAA,CAAa,EAAE,KAAA,EAAO,QAAA,EAAU,OAAM,EAAsB;AAC1E,EAAA,MAAM,GAAA,GAAM,MAAM,MAAA,IAAU,MAAA;AAC5B,EAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,IAAA;AAEnC,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAwB,KAAA,EAErC,QAAA,EAAA;AAAA,oBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEAAA,EAA0E,QAAA,EAAA,qBAAA,EAEzF,CAAA;AAAA,sBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,CAAA,CAAE,KAAA,EAAoD,CAAA;AAAA,UAClG,OAAO,CAAA,CAAE,IAAA;AAAA,UACT,WAAW,CAAA,kFAAA,EACT,GAAA,KAAQ,CAAA,CAAE,KAAA,GACN,+CACA,mEACN,CAAA,CAAA;AAAA,UAEC,QAAA,EAAA,CAAA,CAAE;AAAA,SAAA;AAAA,QAVE,CAAA,CAAE;AAAA,OAYV,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,oDAAA,EACf,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,CAAC,QAAA,EAAU,CAAA;AAAA,UACzD,SAAA,EAAW,CAAA,oFAAA,EACT,QAAA,GAAW,eAAA,GAAkB,cAC/B,CAAA,CAAA;AAAA,UAEA,QAAA,kBAAAA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,yFAAA;AAAA,cACV,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,GAAW,SAAS,KAAA;AAAM;AAAA;AAC3C;AAAA,OACF;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sCAAqC,QAAA,EAAA,kBAAA,EAErD,CAAA;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,4BAAA,EACb,QAAA,EAAA,QAAA,GAAW,sCAAiC,qBAAA,EAC/C;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACjEA,IAAM,MAAA,GAAS;AAAA,EACb,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,eAAA,EAAiB,MAAM,kDAAA,EAA2C;AAAA,EAC1F,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,eAAA,EAAiB,MAAM,6CAAA;AACjD,CAAA;AAEA,IAAM,WAAA,GAAc,CAAC,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAC9E,IAAM,iBAAA,GAA4C;AAAA,EAChD,KAAA,EAAO,MAAA;AAAA,EAAQ,KAAA,EAAO,MAAA;AAAA,EAAQ,KAAA,EAAO,MAAA;AAAA,EAAQ,KAAA,EAAO,MAAA;AAAA,EACpD,KAAA,EAAO,MAAA;AAAA,EAAQ,MAAA,EAAQ,OAAA;AAAA,EAAS,MAAA,EAAQ,OAAA;AAAA,EAAS,MAAA,EAAQ;AAC3D,CAAA;AAQA,SAAS,aAAa,MAAA,EAAyB;AAC7C,EAAA,OAAO,CAAA,qFAAA,EACL,MAAA,GACI,4CAAA,GACA,mEACN,CAAA,CAAA;AACF;AAEA,SAAS,MAAA,CAAO,EAAE,OAAA,EAAS,QAAA,EAAU,OAAM,EAA8D;AACvG,EAAA,uBACEC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,gGAAA,EAAiG,SAAS,QAAA,EACzH,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,CAAA,sGAAA,EACT,OAAA,GAAU,eAAA,GAAkB,cAC9B,CAAA,CAAA;AAAA,QAEA,QAAA,kBAAAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,6FAAA;AAAA,YACV,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,GAAU,SAAS,KAAA;AAAM;AAAA;AAC1C;AAAA,KACF;AAAA,IACC;AAAA,GAAA,EACH,CAAA;AAEJ;AAEO,SAAS,YAAA,CAAa,EAAE,KAAA,EAAO,QAAA,EAAU,OAAM,EAAsB;AAC1E,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,MAAA;AAC7B,EAAA,MAAM,WAAA,GAAc,MAAM,WAAA,IAAe,MAAA;AACzC,EAAA,MAAM,SAAS,WAAA,KAAgB,MAAA;AAC/B,EAAA,MAAM,WAAA,GAAwB,MAAA,GAAS,EAAC,GAAK,WAAA;AAG7C,EAAA,SAAS,UAAU,CAAA,EAAQ;AACzB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,aAAa,CAAC,CAAC,GAAG,CAAA;AACvC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,QAAA,CAAS,CAAC,IAC/B,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,CAAC,CAAA,GACjC,CAAC,GAAG,aAAa,CAAC,CAAA;AACtB,IAAA,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,WAAA,EAAa,KAAK,MAAA,KAAW,CAAA,GAAI,MAAA,GAAU,IAAA,EAAgB,CAAA;AAAA,EAClF;AAEA,EAAA,SAAS,cAAc,GAAA,EAA+B;AACpD,IAAA,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,CAAC,GAAG,GAAG,CAAC,KAAA,CAAM,GAAG,CAAA,EAAG,CAAA;AAAA,EAC3C;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAsB,KAAA,EAGnC,QAAA,EAAA;AAAA,oBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEAAA,EAA0E,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,sBAC9FA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACZ,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,qBACXA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAAqB,IAAA,EAAK,QAAA;AAAA,UAAS,OAAO,CAAA,CAAE,IAAA;AAAA,UAC3C,OAAA,EAAS,MAAM,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,KAAA,EAAmD,CAAA;AAAA,UAChG,SAAA,EAAW,YAAA,CAAa,KAAA,KAAU,CAAA,CAAE,KAAK,CAAA;AAAA,UAExC,QAAA,EAAA,CAAA,CAAE;AAAA,SAAA;AAAA,QAJQ,CAAA,CAAE;AAAA,OAMhB,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAC,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEAAA,EAA0E,QAAA,EAAA,kBAAA,EAEzF,CAAA;AAAA,sBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,OAAA,EAAS,MAAM,SAAS,EAAE,GAAG,KAAA,EAAO,WAAA,EAAa,QAAQ,CAAA,EAAG,WAAW,YAAA,CAAa,MAAM,GAAG,QAAA,EAAA,MAAA,EAEnH,CAAA;AAAA,QACC,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,qBAChBA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAAe,IAAA,EAAK,QAAA;AAAA,YACnB,OAAA,EAAS,MAAM,SAAA,CAAU,CAAqD,CAAA;AAAA,YAC9E,WAAW,YAAA,CAAa,CAAC,UAAU,WAAA,CAAY,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,YAEzD,4BAAkB,CAAC;AAAA,WAAA;AAAA,UAJT;AAAA,SAMd;AAAA,OAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAC,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EAAwE,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,sBAC/FC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAS,KAAA,CAAM,UAAA,IAAc,IAAA,EAAM,QAAA,EAAU,MAAM,aAAA,CAAc,YAAY,CAAA,EAAG,KAAA,EAAM,kBAAA,EAAmB,CAAA;AAAA,wBACjHA,GAAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAS,KAAA,CAAM,UAAA,IAAc,KAAA,EAAO,QAAA,EAAU,MAAM,aAAA,CAAc,YAAY,CAAA,EAAG,OAAM,kBAAA,EAAmB,CAAA;AAAA,wBAClHA,GAAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAS,KAAA,CAAM,YAAA,IAAgB,KAAA,EAAO,QAAA,EAAU,MAAM,aAAA,CAAc,cAAc,CAAA,EAAG,OAAM,8BAAA,EAA4B,CAAA;AAAA,wBAC/HA,GAAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAS,KAAA,CAAM,aAAA,IAAiB,KAAA,EAAO,QAAA,EAAU,MAAM,aAAA,CAAc,eAAe,CAAA,EAAG,OAAM,2BAAA,EAAyB;AAAA,OAAA,EAChI;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;ACxHO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA;AACjC,EAAA,IAAI,KAAA,GAAQ,QAAQ,CAAA,EAAG,OAAO,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC1D,EAAA,IAAI,KAAA,GAAQ,IAAA,IAAQ,CAAA,EAAG,OAAO,CAAA,EAAA,CAAI,QAAQ,IAAA,IAAQ,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC/D,EAAA,OAAO,IAAI,KAAA,GAAQ,IAAA,IAAQ,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC1C;AAEO,SAAS,YAAY,QAAA,EAA0B;AACpD,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,EAAG,OAAO,iBAAA;AAC1C,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,EAAG,OAAO,WAAA;AAC1C,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,EAAG,OAAO,WAAA;AAC1C,EAAA,IAAI,QAAA,KAAa,mBAAmB,OAAO,WAAA;AAC3C,EAAA,IAAI,QAAA,CAAS,SAAS,aAAa,CAAA,IAAK,SAAS,QAAA,CAAS,OAAO,GAAG,OAAO,WAAA;AAC3E,EAAA,IAAI,QAAA,CAAS,SAAS,cAAc,CAAA,IAAK,SAAS,QAAA,CAAS,YAAY,GAAG,OAAO,WAAA;AACjF,EAAA,IAAI,QAAA,CAAS,SAAS,MAAM,CAAA,IAAK,SAAS,QAAA,CAAS,UAAU,GAAG,OAAO,WAAA;AACvE,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,IAAK,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,IAAK,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,WAAA;AAC9F,EAAA,OAAO,WAAA;AACT;ACJA,IAAM,kBAAA,GAAyC;AAAA,EAC7C,UAAA,EAAY,IAAA;AAAA,EAAM,UAAA,EAAY,KAAA;AAAA,EAAO,YAAA,EAAc,KAAA;AAAA,EACnD,aAAA,EAAe,KAAA;AAAA,EAAO,KAAA,EAAO,MAAA;AAAA,EAAQ,WAAA,EAAa;AACpD,CAAA;AAEA,SAAS,uBAAuB,KAAA,EAAgD;AAC9E,EAAA,OAAO,KAAA,IAAS,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAU,IAAA,EAAK;AACnD;AAEA,SAAS,uBAAuB,KAAA,EAAgD;AAC9E,EAAA,OAAO,KAAA,IAAS,kBAAA;AAClB;AAEA,SAAS,WAAA,CAAY,QAAgB,QAAA,EAA0B;AAC7D,EAAA,IAAI,MAAA,KAAW,aAAa,OAAO,kBAAA;AACnC,EAAA,IAAI,MAAA,KAAW,cAAc,OAAO,kBAAA;AACpC,EAAA,IAAI,QAAA,GAAW,IAAI,OAAO,uBAAA;AAC1B,EAAA,IAAI,QAAA,GAAW,IAAI,OAAO,gBAAA;AAC1B,EAAA,IAAI,QAAA,GAAW,IAAI,OAAO,mBAAA;AAC1B,EAAA,OAAO,mBAAA;AACT;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,MAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,KAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,WAAA,GAAc,KAAA;AAAA,EACd,gBAAA,GAAmB,KAAA;AAAA,EACnB,gBAAA,GAAmB,KAAA;AAAA,EACnB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,CAAA,GAAI,aAAa,KAAK,CAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAE1B,EAAA,MAAM,cAAA,GAAgC;AAAA,IACpC,GAAG,IAAA;AAAA,IACH,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,MAAA,GAAS,mBAAmB,MAAM,CAAA;AACxC,EAAA,MAAM,QAAQ,cAAA,EAAe;AAE7B,EAAA,MAAM,CAAC,WAAW,YAAY,CAAA,GAAIE,SAA6B,MAAM,sBAAA,CAAuB,KAAK,CAAC,CAAA;AAClG,EAAA,MAAM,CAAC,WAAW,YAAY,CAAA,GAAIA,SAA6B,MAAM,sBAAA,CAAuB,KAAK,CAAC,CAAA;AAClG,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACxD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,IAAIA,QAAAA,iBAA8B,IAAI,KAAK,CAAA;AACrE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEpE,EAAA,SAAS,aAAA,CAAc,OAAe,KAAA,EAAuB;AAC3D,IAAA,OAAO,QAAQ,GAAA,CAAI,KAAK,KAAK,KAAA,CAAM,KAAK,GAAG,IAAA,IAAQ,EAAA;AAAA,EACrD;AAEA,EAAA,SAAS,SAAA,CAAU,KAAA,EAAe,IAAA,EAAc,KAAA,EAAe;AAC7D,IAAA,UAAA,CAAW,CAAC,IAAA,KAAS;AACnB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAI,IAAA,CAAK,IAAA,EAAK,IAAK,IAAA,CAAK,MAAK,KAAM,KAAA,CAAM,KAAK,CAAA,EAAG,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AAAA,WAC7E,IAAA,CAAK,OAAO,KAAK,CAAA;AACtB,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,YAAA,GAAe;AACtB,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,UAAA,iBAAW,IAAI,KAAK,CAAA;AACpB,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,YAAA,CAAa,sBAAA,CAAuB,KAAK,CAAC,CAAA;AAC1C,IAAA,YAAA,CAAa,sBAAA,CAAuB,KAAK,CAAC,CAAA;AAAA,EAC5C;AAEA,EAAA,MAAM,QAAA,GAAWC,WAAAA,CAAY,OAAO,KAAA,EAAe,eAAoC,aAAA,KAAuC;AAC5H,IAAA,MAAM,gBAAgB,aAAA,IAAiB,SAAA;AACvC,IAAA,MAAM,gBAAgB,aAAA,IAAiB,SAAA;AACvC,IAAA,MAAM,cAAA,GAAiB,gBAAA,GAAmB,aAAA,GAAiB,KAAA,IAAS,aAAA;AACpE,IAAA,MAAM,cAAA,GAAiB,gBAAA,GAAmB,aAAA,GAAiB,KAAA,IAAS,aAAA;AACpE,IAAA,IAAI,QAAA,IAAY,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAChC,MAAA,IAAI;AACF,QAAA,MAAM,UAAU,MAAM,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,EAAE,GAAI,MAAA,KAAW,KAAA,CAAA,IAAa,EAAE,QAAO,EAAI,KAAA,EAAO,cAAA,EAAgB,KAAA,EAAO,gBAAgB,CAAA;AACnI,QAAA,aAAA,GAAgB,OAAO,CAAA;AACvB,QAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,KAAM,QAAA,GAAW,CAAC,CAAC,CAAA;AAAA,MACtC,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,GAAU,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAAA,MAC/D;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,EAAE,GAAI,MAAA,KAAW,KAAA,CAAA,IAAa,EAAE,QAAO,EAAI,KAAA,EAAO,cAAA,EAAgB,KAAA,EAAO,gBAAgB,CAAA;AAClI,QAAA,IAAI,MAAA,aAAmB,MAAM,CAAA;AAAA,MAC/B,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,GAAU,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAAA,MAC/D;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,KAAA,EAAO,UAAU,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,WAAW,gBAAA,EAAkB,gBAAA,EAAkB,QAAA,EAAU,aAAA,EAAe,OAAO,CAAC,CAAA;AAE9I,EAAA,MAAM,WAAA,GAAcA,WAAAA,CAAY,OAAO,KAAA,KAAkB;AACvD,IAAA,MAAM,YAAA,GAAe,eACf,gBAAA,IAAoB,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAC,CAAA,IACjE,gBAAA,IAAoB,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAC,CAAA;AACvE,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,YAAA,CAAa,sBAAA,CAAuB,KAAK,CAAC,CAAA;AAC1C,MAAA,YAAA,CAAa,sBAAA,CAAuB,KAAK,CAAC,CAAA;AAC1C,MAAA,SAAA,CAAU,KAAK,CAAA;AACf,MAAA,UAAA,iBAAW,IAAI,KAAK,CAAA;AAAA,IACtB,CAAA,MACK,MAAM,QAAA,CAAS,KAAK,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,WAAA,EAAa,gBAAA,EAAkB,kBAAkB,QAAA,EAAU,KAAA,EAAO,KAAK,CAAC,CAAA;AAE5E,EAAA,eAAe,mBAAA,GAAsB;AACnC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACzC,MAAA,MAAM,IAAA,GAAO,aAAA,CAAc,CAAA,EAAG,MAAM,CAAA;AACpC,MAAA,OAAO,IAAA,KAAS,CAAA,CAAE,IAAA,GAAO,IAAI,KAAK,CAAC,CAAC,CAAA,EAAG,IAAA,EAAM,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA,GAAI,CAAA;AAAA,IACnE,CAAC,CAAA;AACD,IAAA,MAAM,aAAA,GAAgB,SAAA;AACtB,IAAA,MAAM,aAAA,GAAgB,SAAA;AACtB,IAAA,YAAA,EAAa;AACb,IAAA,MAAM,QAAA,CAAS,aAAA,EAAe,aAAA,EAAe,aAAa,CAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA;AAC3C,EAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,YAAA;AAChI,EAAA,MAAM,mBAAmB,KAAA,CAAM,KAAA,CAAM,WAAW,WAAA,IAAe,KAAA,CAAM,MAAM,MAAA,KAAW,WAAA;AACtF,EAAA,MAAM,cAAc,iBAAA,IAAqB,gBAAA;AACzC,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,YAAA,GAAe,EAAA,GAAK,CAAA;AAEjI,EAAA,IAAI,OAAO,KAAA,CAAM,MAAA,KAAW,WAAW,WAAA,EAAa,uBAAOH,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4BAAA,EAA6B,KAAA,EAAO,gBAAiB,QAAA,EAAA,WAAA,CAAY,MAAA,CAAO,MAAM,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE,CAAA;AAC7K,EAAA,IAAI,OAAO,KAAA,CAAM,MAAA,KAAW,MAAA,IAAU,aAAA,yBAAsBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAA6B,KAAA,EAAO,cAAA,EAAiB,wBAAc,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAE,CAAA;AAEnK,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,0BAAA,EAA6B,SAAA,GAAY,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,KAAA,EAAO,cAAA,EAGrF,QAAA,EAAA;AAAA,IAAA,CAAC,OAAA,IAAW,CAAC,MAAA,oBACZD,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACE,GAAI,MAAA,KAAW,MAAA,IAAa,EAAE,MAAA,EAAO;AAAA,QACrC,GAAI,OAAA,KAAY,MAAA,IAAa,EAAE,OAAA,EAAQ;AAAA,QACvC,GAAI,OAAA,KAAY,MAAA,IAAa,EAAE,OAAA,EAAQ;AAAA,QACvC,GAAI,KAAA,KAAU,MAAA,IAAa,EAAE,KAAA,EAAM;AAAA,QACpC,QAAA;AAAA,QACA,UAAU,QAAA,IAAY,WAAA;AAAA,QACtB,OAAA,EAAS,WAAA;AAAA,QACT,KAAA,EAAO,EAAE,OAAA,EAAS,WAAA,EAAa,WAAW,QAAA,EAAS;AAAA,QAEnD,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACZ,QAAA,EAAA;AAAA,UAAA,UAAA,GAAa,UAAA,EAAW,mBACvBD,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,SAAA,EAAU,2BAAA,EAC1F,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,WAAA,EAAa,GAAA,EAAK,CAAA,EAAE,wGAAA,EAAyG,CAAA,EAClL,CAAA;AAAA,UAED,QAAA,oBACCC,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAD,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sCAAA,EACb,QAAA,EAAA,QAAA,GAAW,+BAA+B,0BAAA,EAC7C,CAAA;AAAA,4BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAA6B,QAAA,EAAA,4CAAA,EAA0C,CAAA;AAAA,YACtF,OAAA,oBAAWC,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,4BAAA,EAA6B,QAAA,EAAA;AAAA,cAAA,qBAAA;AAAA,cAAiB,YAAY,OAAO;AAAA,aAAA,EAAE;AAAA,WAAA,EACjG;AAAA,SAAA,EAEJ;AAAA;AAAA,KACF;AAAA,IAID,MAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EACZ,QAAA,EAAA,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,uBAAA,GAA0B,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,sBAAA,CAAA,EACnE,CAAA;AAAA,MAEC,MAAA,CAAO,IAAI,CAAC,CAAA,EAAG,sBACdC,IAAAA,CAAC,KAAA,EAAA,EAAY,SAAA,EAAU,sFAAA,EACrB,QAAA,EAAA;AAAA,wBAAAD,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAoB,QAAA,EAAA,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA,EAAE,CAAA;AAAA,wBACxDC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA;AAAA,UAAA,YAAA,KAAiB,oBAChBD,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAS,IAAA;AAAA,cACT,IAAA,EAAK,MAAA;AAAA,cACL,YAAA,EAAc,aAAA,CAAc,CAAA,EAAG,MAAM,CAAA;AAAA,cACrC,MAAA,EAAQ,CAAC,CAAA,KAAM;AAAE,gBAAA,SAAA,CAAU,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,MAAM,CAAA;AAAG,gBAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,cAAG,CAAA;AAAA,cAC9E,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,gBAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AAAE,kBAAA,SAAA,CAAU,CAAA,EAAG,CAAA,CAAE,aAAA,CAAc,KAAA,EAAO,MAAM,CAAA;AAAG,kBAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,gBAAG;AAC7F,gBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,eAAA,CAAgB,IAAI,CAAA;AAAA,cAC9C,CAAA;AAAA,cACA,SAAA,EAAU;AAAA;AAAA,8BAGZC,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,CAAA,wFAAA,EAA2F,WAAA,GAAc,aAAA,GAAgB,gBAAgB,CAAA,CAAA;AAAA,cACpJ,OAAA,EAAS,MAAM,WAAA,IAAe,eAAA,CAAgB,CAAC,CAAA;AAAA,cAC/C,KAAA,EAAO,cAAc,sBAAA,GAAyB,MAAA;AAAA,cAE7C,QAAA,EAAA;AAAA,gBAAA,aAAA,CAAc,GAAG,MAAM,CAAA;AAAA,gBACvB,OAAA,CAAQ,IAAI,CAAC,CAAA,oBAAKD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CAAA,EAA+C,QAAA,EAAA,WAAA,EAAS;AAAA;AAAA;AAAA,WAC7F;AAAA,0BAEFA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAqC,QAAA,EAAA,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA,EAAE;AAAA,SAAA,EAC1E,CAAA;AAAA,QACC,+BACCA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,eAAA,CAAgB,CAAC,CAAA;AAAA,YAChC,KAAA,EAAM,UAAA;AAAA,YACN,SAAA,EAAU,8FAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBAEFA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAS,MAAM;AAAE,cAAA,MAAM,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,CAAC,CAAA;AAAG,cAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,YAAA,EAAa;AAAA,6BAAkB,IAAI,CAAA;AAAA,YAAG,CAAA;AAAA,YAC7H,SAAA,EAAU,2GAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EAAA,EAzCQ,CA0CV,CACD,CAAA;AAAA,MAEA,gBAAA,IAAoB,MAAA,CAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAC,CAAA,oBACjEC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oDAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iFAAA,EAAkF,QAAA,EAAA,+CAAA,EAA2B,CAAA;AAAA,wBAC5HA,GAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,YAAA,EAAc,KAAA,EAAO,EAAE,OAAA,EAAS,WAAA,EAAY,EAAG;AAAA,OAAA,EAC3F,CAAA;AAAA,MAGD,gBAAA,IAAoB,MAAA,CAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAC,CAAA,oBACjEC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oDAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iFAAA,EAAkF,QAAA,EAAA,2CAAA,EAAyB,CAAA;AAAA,wBAC1HA,GAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,YAAA,EAAc,KAAA,EAAO,EAAE,OAAA,EAAS,WAAA,EAAY,EAAG;AAAA,OAAA,EAC3F,CAAA;AAAA,sBAGFC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,oMAAA;AAAA,YACV,OAAA,EAAS,YAAA;AAAA,YACV,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,gMAAA;AAAA,YACV,OAAA,EAAS,mBAAA;AAAA,YAER,iBAAO,MAAA,GAAS,CAAA,GAAI,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA,SAAA,CAAA,GAAc;AAAA;AAAA;AAC5D,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAID,iBAAA,IAAqB,CAAC,OAAA,KACrB,cAAA,GAAiB,cAAA,CAAe,cAAc,CAAA,mBAC5CC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8EAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,UAAK,SAAA,EAAU,0CAAA,EACb,sBAAY,MAAA,CAAO,KAAA,CAAM,MAAA,EAAQ,cAAc,CAAA,EAClD,CAAA;AAAA,wBACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uCAAA,EAAyC,QAAA,EAAA;AAAA,UAAA,cAAA;AAAA,UAAe;AAAA,SAAA,EAAC;AAAA,OAAA,EAC3E,CAAA;AAAA,sBACAD,GAAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAU,cAAA,EAAgB;AAAA,KAAA,EACzC,CAAA,CAAA;AAAA,IAKH,OAAA,oBACCC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAC/B,QAAA,MAAM,KAAK,CAAA,CAAE,MAAA;AACb,QAAA,MAAM,IAAI,EAAA,CAAG,MAAA,KAAW,cAAc,EAAA,CAAG,QAAA,GAAW,GAAG,MAAA,KAAW,QAAA,GAAW,EAAA,CAAG,QAAA,GAAW,GAAG,MAAA,KAAW,MAAA,GAAS,MAAM,EAAA,CAAG,MAAA,KAAW,eAAe,EAAA,GAAK,CAAA;AAC1J,QAAA,MAAM,QAAA,GAAW,GAAG,MAAA,KAAW,QAAA;AAC/B,QAAA,MAAM,MAAA,GAAS,GAAG,MAAA,KAAW,MAAA;AAC7B,QAAA,MAAM,KAAA,GAAQ,GAAG,MAAA,KAAW,OAAA;AAE5B,QAAA,uBACEA,IAAAA,CAAC,KAAA,EAAA,EAAY,SAAA,EAAU,8FAAA,EACrB,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,UAAK,SAAA,EAAU,kBAAA,EAAoB,sBAAY,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAE,CAAA;AAAA,4BAC7DC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,8BAAAD,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0FAAA,EAA4F,QAAA,EAAA,CAAA,CAAE,KAAK,IAAA,EAAK,CAAA;AAAA,8BACvHA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAA8B,QAAA,EAAA,WAAA,CAAY,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAE;AAAA,aAAA,EACxE,CAAA;AAAA,YACC,0BAAUA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAmB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,YAC9C,yBAASA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mDAAkD,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,YACxF,CAAC,MAAA,IAAU,CAAC,KAAA,oBACXA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,8BAAA,EAAiC,QAAA,GAAW,mBAAmB,iBAAiB,CAAA,CAAA,EAC9F,qBAAW,SAAA,GAAY,CAAA,EAAG,CAAC,CAAA,CAAA,CAAA,EAC9B,CAAA;AAAA,YAED,CAAC,MAAA,IAAU,CAAC,KAAA,IAAS,CAAA,CAAE,WACtB,QAAA,mBACIA,GAAAA,CAAC,QAAA,EAAA,EAAO,WAAU,iLAAA,EAAkL,OAAA,EAAS,MAAM,KAAA,CAAM,WAAW,CAAA,CAAE,MAAO,CAAA,EAAG,QAAA,EAAA,SAAA,EAAO,IACvP,EAAA,CAAG,MAAA,KAAW,WAAA,mBAAcA,IAAC,QAAA,EAAA,EAAO,SAAA,EAAU,4LAAA,EAA6L,OAAA,EAAS,MAAM,KAAA,CAAM,SAAA,CAAU,EAAE,MAAO,CAAA,EAAG,oBAAM,CAAA,GAAY,IAAA;AAAA,WAAA,EAEhT,CAAA;AAAA,UACC,CAAC,UAAU,CAAC,KAAA,oBAASA,GAAAA,CAAC,WAAA,EAAA,EAAY,UAAU,CAAA,EAAG;AAAA,SAAA,EAAA,EApBxC,CAqBV,CAAA;AAAA,MAEJ,CAAC,CAAA;AAAA,sBAEDC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACZ,QAAA,EAAA;AAAA,QAAA,KAAA,CAAM,KAAA,CAAM,MAAA,KAAW,MAAA,oBACtBD,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,6JAAA,EAAgK,gBAAA,GAAmB,cAAA,GAAiB,gBAAgB,CAAA,CAAA;AAAA,YAC/N,OAAA,EAAS,gBAAA,GAAmB,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM,SAAA;AAAA,YAElD,6BAAmB,oBAAA,GAAkB;AAAA;AAAA,SACxC;AAAA,wBAEFA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,WAAW,CAAA,sJAAA,EAAyJ,KAAA,CAAM,MAAM,MAAA,KAAW,MAAA,GAAS,kBAAkB,eAAe,CAAA,CAAA;AAAA,YACrO,SAAS,KAAA,CAAM,KAAA,CAAM,WAAW,MAAA,GAAS,KAAA,CAAM,QAAQ,KAAA,CAAM,QAAA;AAAA,YAE5D,QAAA,EAAA,KAAA,CAAM,KAAA,CAAM,MAAA,KAAW,MAAA,GAAS,sBAAA,GAAyB;AAAA;AAAA;AAC5D,OAAA,EACF,CAAA;AAAA,MAEC,KAAA,CAAM,MAAM,MAAA,KAAW,MAAA,oBACtBC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iGAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,WAAA,EAAE,CAAA;AAAA,wBAC5BA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sCAAA,EACb,gBAAM,KAAA,CAAM,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,iCAAiC,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,+BAAA,CAAA,EAChG;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,IAID,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,MAAA,IAAU,CAAC,iCAClCC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+FAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,sBAC5BC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAAmC,QAAA,EAAA,8BAAA,EAA4B,CAAA;AAAA,wBAC9EA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EAAqC,sBAAY,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA,EAAE;AAAA,OAAA,EAC5F,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,6LAAA;AAAA,UACV,SAAS,MAAA,CAAO,KAAA;AAAA,UACjB,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,IAID,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,OAAA,IAAW,CAAC,+BACnCC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2FAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAc,QAAA,EAAA,cAAA,EAAE,CAAA;AAAA,sBAChCC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EAAqC,QAAA,EAAA,yCAAA,EAAiC,CAAA;AAAA,wBACrFA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAqC,QAAA,EAAA,MAAA,CAAO,KAAA,CAAM,MAAM,OAAA,EAAQ;AAAA,OAAA,EACjF,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,uLAAA;AAAA,UACV,SAAS,MAAA,CAAO,KAAA;AAAA,UACjB,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ","file":"FileUploader.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-border-2 silo-border-dashed silo-border-slate-200 silo-rounded-xl silo-bg-slate-50 silo-text-slate-900 silo-cursor-pointer silo-outline-none silo-transition-colors silo-duration-150\",\n dragging ? \"silo-border-indigo-500 silo-bg-slate-100\" : \"hover:silo-border-indigo-500 hover:silo-bg-slate-100\",\n disabled ? \"silo-opacity-50 silo-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","\"use client\";\n\nimport type { CSSProperties } from \"react\";\nimport type { VideoUploadOptions } from \"@geekapps/silo-nextjs\";\n\nconst CODECS = [\n { value: \"h264\", label: \"H.264 (NVENC)\", hint: \"Compatibilidade máxima — GPU accelerated\" },\n { value: \"h265\", label: \"H.265 (NVENC)\", hint: \"Melhor compressão — GPU accelerated\" },\n];\n\nconst RESOLUTIONS = [\"144\", \"240\", \"360\", \"480\", \"720\", \"1080\", \"1440\", \"2160\"] as const;\nconst RESOLUTION_LABELS: Record<string, string> = {\n \"144\": \"144p\", \"240\": \"240p\", \"360\": \"360p\", \"480\": \"480p\",\n \"720\": \"720p\", \"1080\": \"1080p\", \"1440\": \"1440p\", \"2160\": \"4K\",\n};\n\ninterface VideoOptionsProps {\n value: VideoUploadOptions;\n onChange: (opts: VideoUploadOptions) => void;\n style?: CSSProperties;\n}\n\nfunction optionBtnCls(active: boolean): string {\n return `py-1 px-2.5 rounded-md text-xs font-semibold cursor-pointer transition-colors border ${\n active\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\nfunction Toggle({ checked, onToggle, label }: { checked: boolean; onToggle: () => void; label: string }) {\n return (\n <label className=\"inline-flex items-center gap-1.5 cursor-pointer select-none text-xs text-slate-900 font-medium\" onClick={onToggle}>\n <span\n className={`relative inline-block w-8 h-[18px] rounded-full shrink-0 cursor-pointer transition-colors duration-150${\n checked ? \"bg-indigo-500\" : \"bg-slate-200\"\n }`}\n >\n <span\n className=\"absolute top-0.5 w-3.5 h-3.5 rounded-full bg-white shadow-sm transition-[left] duration-150\"\n style={{ left: checked ? \"16px\" : \"2px\" }}\n />\n </span>\n {label}\n </label>\n );\n}\n\nexport function VideoOptions({ value, onChange, style }: VideoOptionsProps) {\n const codec = value.codec ?? \"h264\";\n const transcoding = value.transcoding ?? \"auto\";\n const isAuto = transcoding === \"auto\";\n const selectedRes: string[] = isAuto ? [] : (transcoding as string[]);\n\n type Res = \"360\" | \"480\" | \"720\" | \"1080\" | \"1440\" | \"2160\";\n function toggleRes(r: Res) {\n if (isAuto) {\n onChange({ ...value, transcoding: [r] });\n return;\n }\n const next = selectedRes.includes(r)\n ? selectedRes.filter((x) => x !== r)\n : [...selectedRes, r];\n onChange({ ...value, transcoding: next.length === 0 ? \"auto\" : (next as Res[]) });\n }\n\n function toggleFeature(key: keyof VideoUploadOptions) {\n onChange({ ...value, [key]: !value[key] });\n }\n\n return (\n <div className=\"flex flex-col gap-3\" style={style}>\n\n {/* Codec */}\n <div>\n <div className=\"text-[11px] font-bold text-slate-500 uppercase tracking-[0.05em] mb-1.5\">Codec</div>\n <div className=\"flex gap-1.5 flex-wrap\">\n {CODECS.map((c) => (\n <button key={c.value} type=\"button\" title={c.hint}\n onClick={() => onChange({ ...value, codec: c.value as NonNullable<VideoUploadOptions[\"codec\"]> })}\n className={optionBtnCls(codec === c.value)}\n >\n {c.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Resolutions */}\n <div>\n <div className=\"text-[11px] font-bold text-slate-500 uppercase tracking-[0.05em] mb-1.5\">\n Resoluções\n </div>\n <div className=\"flex gap-1.5 flex-wrap\">\n <button type=\"button\" onClick={() => onChange({ ...value, transcoding: \"auto\" })} className={optionBtnCls(isAuto)}>\n Auto\n </button>\n {RESOLUTIONS.map((r) => (\n <button key={r} type=\"button\"\n onClick={() => toggleRes(r as \"360\" | \"480\" | \"720\" | \"1080\" | \"1440\" | \"2160\")}\n className={optionBtnCls(!isAuto && selectedRes.includes(r))}\n >\n {RESOLUTION_LABELS[r]}\n </button>\n ))}\n </div>\n </div>\n\n {/* Features */}\n <div>\n <div className=\"text-[11px] font-bold text-slate-500 uppercase tracking-[0.05em] mb-2\">Recursos</div>\n <div className=\"flex flex-col gap-2\">\n <Toggle checked={value.thumbnails ?? true} onToggle={() => toggleFeature(\"thumbnails\")} label=\"Gerar thumbnails\" />\n <Toggle checked={value.storyboard ?? false} onToggle={() => toggleFeature(\"storyboard\")} label=\"Gerar storyboard\" />\n <Toggle checked={value.autoCaptions ?? false} onToggle={() => toggleFeature(\"autoCaptions\")} label=\"Legendas automáticas (IA)\" />\n <Toggle checked={value.separateAudio ?? false} onToggle={() => toggleFeature(\"separateAudio\")} label=\"Separar faixa de áudio\" />\n </div>\n </div>\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, useBatchUpload } from \"@geekapps/silo-nextjs\";\nimport type { ImageUploadOptions, VideoUploadOptions } from \"@geekapps/silo-nextjs\";\nimport type { FileUploaderProps } from \"./types.js\";\nimport { DropZone } from \"./components/DropZone.js\";\nimport { ProgressBar } from \"./components/ProgressBar.js\";\nimport { ImageOptions } from \"./components/ImageOptions.js\";\nimport { VideoOptions } from \"./components/VideoOptions.js\";\nimport { formatBytes, getFileIcon } from \"./utils/format.js\";\nimport { resolveTheme, themeToVars } from \"./utils/theme.js\";\n\nconst DEFAULT_VIDEO_OPTS: VideoUploadOptions = {\n thumbnails: true, storyboard: false, autoCaptions: false,\n separateAudio: false, codec: \"h264\", transcoding: \"auto\",\n};\n\nfunction createInitialImageOpts(image?: ImageUploadOptions): ImageUploadOptions {\n return image ?? { format: \"webp\", optimize: true };\n}\n\nfunction createInitialVideoOpts(video?: VideoUploadOptions): VideoUploadOptions {\n return video ?? DEFAULT_VIDEO_OPTS;\n}\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…\";\n if (progress < 95) return \"Quase lá…\";\n return \"Finalizando…\";\n}\n\nexport function FileUploader({\n bucket,\n onUpload,\n onBatchUpload,\n onError,\n className = \"\",\n style,\n disabled = false,\n maxSize,\n accept,\n multiple = false,\n allowRename = false,\n showImageOptions = false,\n showVideoOptions = false,\n image,\n video,\n theme,\n renderIcon,\n renderProgress,\n renderSuccess,\n renderError,\n children,\n}: FileUploaderProps) {\n const t = resolveTheme(theme);\n const vars = themeToVars(t);\n\n const containerStyle: CSSProperties = {\n ...vars as CSSProperties,\n ...style,\n };\n\n const single = useMultipartUpload(bucket);\n const batch = useBatchUpload();\n\n const [imageOpts, setImageOpts] = useState<ImageUploadOptions>(() => createInitialImageOpts(image));\n const [videoOpts, setVideoOpts] = useState<VideoUploadOptions>(() => createInitialVideoOpts(video));\n const [staged, setStaged] = useState<File[] | null>(null);\n const [renames, setRenames] = useState<Map<number, string>>(new Map());\n const [editingIndex, setEditingIndex] = useState<number | null>(null);\n\n function effectiveName(index: number, files: File[]): string {\n return renames.get(index) ?? files[index]?.name ?? \"\";\n }\n\n function setRename(index: number, name: string, files: File[]) {\n setRenames((prev) => {\n const next = new Map(prev);\n if (name.trim() && name.trim() !== files[index]?.name) next.set(index, name.trim());\n else next.delete(index);\n return next;\n });\n }\n\n function clearStaging() {\n setStaged(null);\n setRenames(new Map());\n setEditingIndex(null);\n setImageOpts(createInitialImageOpts(image));\n setVideoOpts(createInitialVideoOpts(video));\n }\n\n const doUpload = useCallback(async (files: File[], overrideImage?: ImageUploadOptions, overrideVideo?: VideoUploadOptions) => {\n const resolvedImage = overrideImage ?? imageOpts;\n const resolvedVideo = overrideVideo ?? videoOpts;\n const effectiveImage = showImageOptions ? resolvedImage : (image ?? resolvedImage);\n const effectiveVideo = showVideoOptions ? resolvedVideo : (video ?? resolvedVideo);\n if (multiple && files.length > 1) {\n try {\n const results = await batch.upload(files, { ...(bucket !== undefined && { bucket }), image: effectiveImage, video: effectiveVideo });\n onBatchUpload?.(results);\n results.forEach((r) => onUpload?.(r));\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n } else {\n const file = files[0];\n if (!file) return;\n try {\n const result = await single.upload(file, { ...(bucket !== undefined && { bucket }), image: effectiveImage, video: effectiveVideo });\n if (result) onUpload?.(result);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n }\n }, [single, batch, multiple, bucket, image, video, imageOpts, videoOpts, showImageOptions, showVideoOptions, onUpload, onBatchUpload, onError]);\n\n const handleFiles = useCallback(async (files: File[]) => {\n const needsStaging = allowRename\n || (showImageOptions && files.some((f) => f.type.startsWith(\"image/\")))\n || (showVideoOptions && files.some((f) => f.type.startsWith(\"video/\")));\n if (needsStaging) {\n setImageOpts(createInitialImageOpts(image));\n setVideoOpts(createInitialVideoOpts(video));\n setStaged(files);\n setRenames(new Map());\n }\n else await doUpload(files);\n }, [allowRename, showImageOptions, showVideoOptions, doUpload, image, video]);\n\n async function handleConfirmUpload() {\n if (!staged) return;\n const filesToUpload = staged.map((f, i) => {\n const name = effectiveName(i, staged);\n return name !== f.name ? new File([f], name, { type: f.type }) : f;\n });\n const snapshotImage = imageOpts;\n const snapshotVideo = videoOpts;\n clearStaging();\n await doUpload(filesToUpload, snapshotImage, snapshotVideo);\n }\n\n const isBatch = batch.state.files.length > 0;\n const isSingleUploading = single.state.status === \"uploading\" || single.state.status === \"preparing\" || single.state.status === \"completing\";\n const isBatchUploading = batch.state.status === \"uploading\" || batch.state.status === \"preparing\";\n const isUploading = isSingleUploading || isBatchUploading;\n const singleProgress = single.state.status === \"uploading\" ? single.state.progress : single.state.status === \"completing\" ? 99 : 0;\n\n if (single.state.status === \"error\" && renderError) return <div className=\"flex flex-col gap-3 w-full\" style={containerStyle}>{renderError(single.state.error, single.reset)}</div>;\n if (single.state.status === \"done\" && renderSuccess) return <div className=\"flex flex-col gap-3 w-full\" style={containerStyle}>{renderSuccess(single.state.result)}</div>;\n\n return (\n <div className={`flex flex-col gap-3 w-full${className ? ` ${className}` : \"\"}`} style={containerStyle}>\n\n {/* Drop zone */}\n {!isBatch && !staged && (\n <DropZone\n {...(accept !== undefined && { accept })}\n {...(maxSize !== undefined && { maxSize })}\n {...(onError !== undefined && { onError })}\n {...(theme !== undefined && { theme })}\n multiple={multiple}\n disabled={disabled || isUploading}\n onFiles={handleFiles}\n style={{ padding: \"28px 24px\", textAlign: \"center\" }}\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=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5m-13.5-9L12 3m0 0l4.5 4.5M12 3v13.5\" />\n </svg>\n )}\n {children ?? (\n <>\n <span className=\"text-slate-900 font-bold text-[15px]\">\n {multiple ? \"Arraste seus arquivos aqui\" : \"Arraste seu arquivo aqui\"}\n </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 </DropZone>\n )}\n\n {/* Staging */}\n {staged && (\n <div className=\"flex flex-col gap-2\">\n <div className=\"text-slate-500 text-[13px] font-semibold mb-0.5\">\n {staged.length === 1 ? \"1 arquivo selecionado\" : `${staged.length} arquivos selecionados`}\n </div>\n\n {staged.map((f, i) => (\n <div key={i} className=\"flex items-center gap-2.5 px-3 py-2.5 bg-slate-50 rounded-xl border border-slate-200\">\n <span className=\"text-xl shrink-0\">{getFileIcon(f.type)}</span>\n <div className=\"flex-1 min-w-0\">\n {editingIndex === i ? (\n <input\n autoFocus\n type=\"text\"\n defaultValue={effectiveName(i, staged)}\n onBlur={(e) => { setRename(i, e.target.value, staged); setEditingIndex(null); }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") { setRename(i, e.currentTarget.value, staged); setEditingIndex(null); }\n if (e.key === \"Escape\") setEditingIndex(null);\n }}\n className=\"w-full text-[13px] font-medium border border-indigo-500 rounded-md py-0.5 px-2 outline-none bg-slate-50 text-slate-900\"\n />\n ) : (\n <div\n className={`text-[13px] font-semibold text-slate-900 overflow-hidden text-ellipsis whitespace-nowrap${allowRename ? \"cursor-text\" : \"cursor-default\"}`}\n onClick={() => allowRename && setEditingIndex(i)}\n title={allowRename ? \"Clique para renomear\" : undefined}\n >\n {effectiveName(i, staged)}\n {renames.has(i) && <span className=\"text-indigo-500 ml-1.5 text-[10px] font-bold\">renomeado</span>}\n </div>\n )}\n <div className=\"text-[11px] text-slate-400 mt-0.5\">{formatBytes(f.size)}</div>\n </div>\n {allowRename && (\n <button\n onClick={() => setEditingIndex(i)}\n title=\"Renomear\"\n className=\"text-slate-400 bg-none border-none cursor-pointer text-sm px-1 shrink-0 hover:text-slate-600\"\n >\n ✏️\n </button>\n )}\n <button\n onClick={() => { const next = staged.filter((_, j) => j !== i); if (next.length === 0) clearStaging(); else setStaged(next); }}\n className=\"text-slate-400 bg-none border-none cursor-pointer text-lg px-1 leading-none shrink-0 hover:text-slate-600\"\n >\n ×\n </button>\n </div>\n ))}\n\n {showImageOptions && staged.some((f) => f.type.startsWith(\"image/\")) && (\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 )}\n\n {showVideoOptions && staged.some((f) => f.type.startsWith(\"video/\")) && (\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 vídeo</div>\n <VideoOptions value={videoOpts} onChange={setVideoOpts} style={{ padding: \"12px 14px\" }} />\n </div>\n )}\n\n <div className=\"flex gap-2 mt-1\">\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={clearStaging}\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={handleConfirmUpload}\n >\n {staged.length > 1 ? `Enviar ${staged.length} arquivos` : \"Enviar arquivo\"}\n </button>\n </div>\n </div>\n )}\n\n {/* Single upload progress */}\n {isSingleUploading && !isBatch && (\n renderProgress ? renderProgress(singleProgress) : (\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\">\n {uploadLabel(single.state.status, singleProgress)}\n </span>\n <span className=\"text-[13px] font-bold text-indigo-500\">{singleProgress}%</span>\n </div>\n <ProgressBar progress={singleProgress} />\n </div>\n )\n )}\n\n {/* Batch upload progress */}\n {isBatch && (\n <div className=\"flex flex-col gap-2\">\n {batch.state.files.map((f, i) => {\n const st = f.status;\n const p = st.status === \"uploading\" ? st.progress : st.status === \"paused\" ? st.progress : st.status === \"done\" ? 100 : st.status === \"completing\" ? 99 : 0;\n const isPaused = st.status === \"paused\";\n const isDone = st.status === \"done\";\n const isErr = st.status === \"error\";\n\n return (\n <div key={i} className=\"flex flex-col items-stretch gap-2 px-3.5 py-3 bg-slate-50 rounded-xl border border-slate-200\">\n <div className=\"flex items-center gap-2.5\">\n <span className=\"text-lg shrink-0\">{getFileIcon(f.file.type)}</span>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-[13px] font-semibold text-slate-900 overflow-hidden text-ellipsis whitespace-nowrap\">{f.file.name}</div>\n <div className=\"text-[11px] text-slate-400\">{formatBytes(f.file.size)}</div>\n </div>\n {isDone && <span className=\"text-lg shrink-0\">✅</span>}\n {isErr && <span className=\"text-[12px] font-semibold text-red-500 shrink-0\">Erro no envio</span>}\n {!isDone && !isErr && (\n <span className={`text-[12px] font-bold shrink-0${isPaused ? \"text-slate-400\" : \"text-indigo-500\"}`}>\n {isPaused ? \"Pausado\" : `${p}%`}\n </span>\n )}\n {!isDone && !isErr && f.fileId && (\n isPaused\n ? <button className=\"inline-flex items-center justify-center gap-1.5 text-[11px] font-semibold py-0.5 px-2.5 rounded-lg border-transparent bg-emerald-500 text-white cursor-pointer hover:opacity-90\" onClick={() => batch.resumeFile(f.fileId!)}>Retomar</button>\n : st.status === \"uploading\" ? <button className=\"inline-flex items-center justify-center gap-1.5 text-[11px] font-semibold py-0.5 px-2.5 rounded-lg border border-slate-200 bg-transparent text-slate-900 cursor-pointer hover:bg-slate-100\" onClick={() => batch.pauseFile(f.fileId!)}>Pausar</button> : null\n )}\n </div>\n {!isDone && !isErr && <ProgressBar progress={p} />}\n </div>\n );\n })}\n\n <div className=\"flex gap-2\">\n {batch.state.status !== \"done\" && (\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 text-white cursor-pointer hover:opacity-90${isBatchUploading ? \"bg-amber-500\" : \"bg-emerald-500\"}`}\n onClick={isBatchUploading ? batch.pauseAll : batch.resumeAll}\n >\n {isBatchUploading ? \"⏸ Pausar tudo\" : \"▶ Retomar tudo\"}\n </button>\n )}\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-transparent text-white cursor-pointer hover:opacity-90${batch.state.status === \"done\" ? \"bg-indigo-500\" : \"bg-red-500/90\"}`}\n onClick={batch.state.status === \"done\" ? batch.reset : batch.abortAll}\n >\n {batch.state.status === \"done\" ? \"Enviar mais arquivos\" : \"Cancelar\"}\n </button>\n </div>\n\n {batch.state.status === \"done\" && (\n <div className=\"flex items-center gap-2.5 px-3 py-2.5 bg-green-500/[0.08] rounded-xl border border-green-500/20\">\n <span className=\"text-xl\">🎉</span>\n <span className=\"text-sm font-semibold text-green-700\">\n {batch.state.files.length === 1 ? \"Arquivo enviado com sucesso!\" : `${batch.state.files.length} arquivos enviados com sucesso!`}\n </span>\n </div>\n )}\n </div>\n )}\n\n {/* Single done */}\n {single.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 min-w-0\">\n <div className=\"font-bold text-sm text-green-700\">Arquivo enviado com sucesso!</div>\n <div className=\"text-[12px] text-slate-400 mt-0.5\">{formatBytes(single.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={single.reset}\n >\n Enviar outro\n </button>\n </div>\n )}\n\n {/* Single error */}\n {single.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 min-w-0\">\n <div className=\"font-bold text-[13px] text-red-500\">Não foi possível enviar o arquivo</div>\n <div className=\"text-[12px] text-slate-400 mt-0.5\">{single.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={single.reset}\n >\n Tentar novamente\n </button>\n </div>\n )}\n </div>\n );\n}\n"]}
|
package/dist/ImageUploader.js
CHANGED
|
@@ -89,9 +89,9 @@ function DropZone({
|
|
|
89
89
|
...style
|
|
90
90
|
};
|
|
91
91
|
const cls = [
|
|
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" : "",
|
|
92
|
+
"silo-border-2 silo-border-dashed silo-border-slate-200 silo-rounded-xl silo-bg-slate-50 silo-text-slate-900 silo-cursor-pointer silo-outline-none silo-transition-colors silo-duration-150",
|
|
93
|
+
dragging ? "silo-border-indigo-500 silo-bg-slate-100" : "hover:silo-border-indigo-500 hover:silo-bg-slate-100",
|
|
94
|
+
disabled ? "silo-opacity-50 silo-cursor-not-allowed" : "",
|
|
95
95
|
className
|
|
96
96
|
].filter(Boolean).join(" ");
|
|
97
97
|
return /* @__PURE__ */ jsxs(
|
|
@@ -168,7 +168,7 @@ function ImageOptions({ value, onChange, style }) {
|
|
|
168
168
|
type: "button",
|
|
169
169
|
onClick: () => onChange({ ...value, format: f.value }),
|
|
170
170
|
title: f.hint,
|
|
171
|
-
className: `py-1 px-3 rounded-md text-xs font-semibold cursor-pointer transition-colors border
|
|
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"}`,
|
|
172
172
|
children: f.label
|
|
173
173
|
},
|
|
174
174
|
f.value
|
|
@@ -179,7 +179,7 @@ function ImageOptions({ value, onChange, style }) {
|
|
|
179
179
|
"span",
|
|
180
180
|
{
|
|
181
181
|
onClick: () => onChange({ ...value, optimize: !optimize }),
|
|
182
|
-
className: `relative w-9 h-5 rounded-full shrink-0 cursor-pointer transition-colors duration-150
|
|
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
183
|
children: /* @__PURE__ */ jsx(
|
|
184
184
|
"span",
|
|
185
185
|
{
|
|
@@ -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 \"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"]}
|
|
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-border-2 silo-border-dashed silo-border-slate-200 silo-rounded-xl silo-bg-slate-50 silo-text-slate-900 silo-cursor-pointer silo-outline-none silo-transition-colors silo-duration-150\",\n dragging ? \"silo-border-indigo-500 silo-bg-slate-100\" : \"hover:silo-border-indigo-500 hover:silo-bg-slate-100\",\n disabled ? \"silo-opacity-50 silo-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"]}
|