@geekapps/silo-elements-nextjs 0.3.6 → 0.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,7 @@
1
1
  import { useState, useCallback, useRef } from 'react';
2
2
  import { useMultipartUpload } from '@geekapps/silo-nextjs';
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
+ import MediaInfoFactory from 'mediainfo.js';
4
5
 
5
6
  // src/utils/theme.ts
6
7
  var defaultTheme = {
@@ -461,6 +462,125 @@ function formatBytes(bytes) {
461
462
  if (bytes < 1024 ** 3) return `${(bytes / 1024 ** 2).toFixed(1)} MB`;
462
463
  return `${(bytes / 1024 ** 3).toFixed(2)} GB`;
463
464
  }
465
+ var CODEC_MESSAGES = {
466
+ AV1: { title: "AV1 n\xE3o \xE9 suportado como entrada", detail: "O pipeline de transcodifica\xE7\xE3o n\xE3o aceita arquivos AV1. Converta para H.264 ou H.265 antes de enviar." },
467
+ VP9: { title: "VP9 n\xE3o \xE9 suportado como entrada", detail: "Arquivos WebM/VP9 n\xE3o s\xE3o aceitos. Converta para H.264 ou H.265 antes de enviar." },
468
+ VP8: { title: "VP8 n\xE3o \xE9 suportado como entrada", detail: "Arquivos WebM/VP8 n\xE3o s\xE3o aceitos. Converta para H.264 antes de enviar." },
469
+ "MPEG-1 Video": { title: "MPEG-1 n\xE3o \xE9 suportado", detail: "Formato muito antigo. Converta para H.264 antes de enviar." },
470
+ "MPEG-2 Video": { title: "MPEG-2 n\xE3o \xE9 suportado", detail: "Converta para H.264 antes de enviar." }
471
+ };
472
+ var CONTAINER_MESSAGES = {
473
+ FLV: { title: "Formato FLV n\xE3o suportado", detail: "Arquivos Flash Video n\xE3o s\xE3o aceitos. Converta para MP4 (H.264) antes de enviar." },
474
+ "Flash Video": { title: "Formato FLV n\xE3o suportado", detail: "Arquivos Flash Video n\xE3o s\xE3o aceitos. Converta para MP4 (H.264) antes de enviar." },
475
+ RealMedia: { title: "Formato RealMedia n\xE3o suportado", detail: "Converta para MP4 (H.264) antes de enviar." },
476
+ ASF: { title: "Formato ASF/WMV n\xE3o suportado", detail: "Converta para MP4 (H.264) antes de enviar." }
477
+ };
478
+ function issueMessage(issue) {
479
+ if (issue.code === "unsupported_codec") {
480
+ return CODEC_MESSAGES[issue.codec] ?? { title: `Codec ${issue.codec} n\xE3o suportado`, detail: "Converta para H.264 ou H.265 antes de enviar." };
481
+ }
482
+ const key = Object.keys(CONTAINER_MESSAGES).find((k) => issue.container.includes(k));
483
+ return (key ? CONTAINER_MESSAGES[key] : null) ?? { title: `Container ${issue.container} n\xE3o suportado`, detail: "Converta para MP4 (H.264) antes de enviar." };
484
+ }
485
+ function fmt(n, unit) {
486
+ return `${n.toLocaleString("pt-BR")}${unit}`;
487
+ }
488
+ function fmtDuration(secs) {
489
+ const h = Math.floor(secs / 3600);
490
+ const m = Math.floor(secs % 3600 / 60);
491
+ const s = Math.floor(secs % 60);
492
+ if (h > 0) return `${h}h ${m}m ${s}s`;
493
+ if (m > 0) return `${m}m ${s}s`;
494
+ return `${s}s`;
495
+ }
496
+ function VideoCompatAlert({ info, issues, analyzing }) {
497
+ if (analyzing) {
498
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: 8, padding: "10px 14px", background: "rgba(99,102,241,0.06)", border: "1px solid rgba(99,102,241,0.18)", borderRadius: 10 }, children: [
499
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 14 }, children: "\u{1F50D}" }),
500
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 12, color: "rgba(165,180,252,0.9)" }, children: "Analisando arquivo\u2026" })
501
+ ] });
502
+ }
503
+ const v = info.video;
504
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: 8 }, children: [
505
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexWrap: "wrap", gap: 6 }, children: [
506
+ v && /* @__PURE__ */ jsxs(Fragment, { children: [
507
+ /* @__PURE__ */ jsx(Chip, { label: v.codec || "?", color: "neutral" }),
508
+ v.width > 0 && v.height > 0 && /* @__PURE__ */ jsx(Chip, { label: `${v.width}\xD7${v.height}`, color: "neutral" }),
509
+ v.duration > 0 && /* @__PURE__ */ jsx(Chip, { label: fmtDuration(v.duration), color: "neutral" }),
510
+ v.frameRate > 0 && /* @__PURE__ */ jsx(Chip, { label: fmt(Math.round(v.frameRate), " fps"), color: "neutral" }),
511
+ v.hdr && /* @__PURE__ */ jsx(Chip, { label: "HDR", color: "purple" })
512
+ ] }),
513
+ info.audio && /* @__PURE__ */ jsx(Chip, { label: info.audio.codec || "sem \xE1udio", color: "neutral" }),
514
+ /* @__PURE__ */ jsx(Chip, { label: formatBytes(info.fileSize), color: "neutral" })
515
+ ] }),
516
+ issues.map((issue, i) => {
517
+ const msg = issueMessage(issue);
518
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: 8, padding: "10px 14px", background: "rgba(239,68,68,0.07)", border: "1px solid rgba(239,68,68,0.22)", borderRadius: 10 }, children: [
519
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 14, flexShrink: 0 }, children: "\u{1F6AB}" }),
520
+ /* @__PURE__ */ jsxs("div", { children: [
521
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 12, fontWeight: 700, color: "#f87171", marginBottom: 2 }, children: msg.title }),
522
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 11, color: "rgba(255,255,255,0.5)", lineHeight: 1.55 }, children: msg.detail })
523
+ ] })
524
+ ] }, i);
525
+ })
526
+ ] });
527
+ }
528
+ function Chip({ label, color }) {
529
+ const s = color === "purple" ? { background: "rgba(168,85,247,0.12)", border: "1px solid rgba(168,85,247,0.25)", color: "#c084fc" } : { background: "rgba(255,255,255,0.05)", border: "1px solid rgba(255,255,255,0.1)", color: "rgba(255,255,255,0.6)" };
530
+ return /* @__PURE__ */ jsx("span", { style: { ...s, fontSize: 11, fontWeight: 600, borderRadius: 6, padding: "2px 8px", display: "inline-block" }, children: label });
531
+ }
532
+ var UNSUPPORTED_CODECS = ["AV1", "VP8", "VP9", "MPEG-1 Video", "MPEG-2 Video", "Theora", "RealVideo"];
533
+ var UNSUPPORTED_CONTAINERS = ["FLV", "Flash Video", "RealMedia", "ASF"];
534
+ function getCompatIssues(info) {
535
+ const issues = [];
536
+ if (info.video && UNSUPPORTED_CODECS.includes(info.video.codec)) {
537
+ issues.push({ code: "unsupported_codec", codec: info.video.codec });
538
+ }
539
+ if (UNSUPPORTED_CONTAINERS.some((c) => info.container.includes(c))) {
540
+ issues.push({ code: "unsupported_container", container: info.container });
541
+ }
542
+ return issues;
543
+ }
544
+ async function analyzeVideoFile(file) {
545
+ const wasmUrl = `https://cdn.jsdelivr.net/npm/mediainfo.js@0.3.7/dist/MediaInfoModule.wasm`;
546
+ const mediainfo = await MediaInfoFactory({ format: "object", locateFile: () => wasmUrl });
547
+ const getSize = () => file.size;
548
+ const readChunk = (chunkSize, offset) => new Promise((resolve, reject) => {
549
+ const reader = new FileReader();
550
+ reader.onload = (e) => resolve(new Uint8Array(e.target.result));
551
+ reader.onerror = reject;
552
+ reader.readAsArrayBuffer(file.slice(offset, offset + chunkSize));
553
+ });
554
+ const result = await mediainfo.analyzeData(getSize, readChunk);
555
+ mediainfo.close();
556
+ const tracks = result.media?.track ?? [];
557
+ const general = tracks.find((t) => t["@type"] === "General");
558
+ const video = tracks.find((t) => t["@type"] === "Video");
559
+ const audio = tracks.find((t) => t["@type"] === "Audio");
560
+ const str = (v) => typeof v === "string" ? v : "";
561
+ const num = (v) => parseFloat(str(v)) || 0;
562
+ const hdrFormats = str(video?.["HDR_Format"] ?? video?.["transfer_characteristics"]);
563
+ const isHdr = hdrFormats.length > 0 && !hdrFormats.toLowerCase().includes("bt.709") && !hdrFormats.toLowerCase().includes("sdr");
564
+ return {
565
+ container: str(general?.["Format"]) || file.type || "Unknown",
566
+ fileSize: file.size,
567
+ video: video ? {
568
+ codec: str(video["Format"]),
569
+ width: num(video["Width"]),
570
+ height: num(video["Height"]),
571
+ duration: num(video["Duration"]) / 1e3,
572
+ bitrate: num(video["BitRate"]),
573
+ frameRate: num(video["FrameRate"]),
574
+ hdr: isHdr,
575
+ colorSpace: str(video["colour_primaries"]) || str(video["ColorSpace"])
576
+ } : null,
577
+ audio: audio ? {
578
+ codec: str(audio["Format"]),
579
+ channels: num(audio["Channels"]),
580
+ sampleRate: num(audio["SamplingRate"])
581
+ } : null
582
+ };
583
+ }
464
584
  var DEFAULT_VIDEO_OPTS = {
465
585
  thumbnails: true,
466
586
  storyboard: false,
@@ -505,6 +625,9 @@ function VideoUploader({
505
625
  const [preview, setPreview] = useState(null);
506
626
  const [videoOpts, setVideoOpts] = useState(() => createInitialVideoOpts(video));
507
627
  const [stagedFile, setStagedFile] = useState(null);
628
+ const [videoInfo, setVideoInfo] = useState(null);
629
+ const [videoIssues, setVideoIssues] = useState([]);
630
+ const [analyzing, setAnalyzing] = useState(false);
508
631
  const t = resolveTheme(theme);
509
632
  const vars = themeToVars(t);
510
633
  const doUpload = useCallback(async (file, opts) => {
@@ -521,8 +644,19 @@ function VideoUploader({
521
644
  if (!file) return;
522
645
  if (showVideoOptions) {
523
646
  setVideoOpts(createInitialVideoOpts(video));
647
+ setVideoInfo(null);
648
+ setVideoIssues([]);
524
649
  setStagedFile(file);
525
650
  if (showPreview) setPreview(URL.createObjectURL(file));
651
+ setAnalyzing(true);
652
+ try {
653
+ const info = await analyzeVideoFile(file);
654
+ setVideoInfo(info);
655
+ setVideoIssues(getCompatIssues(info));
656
+ } catch {
657
+ } finally {
658
+ setAnalyzing(false);
659
+ }
526
660
  } else {
527
661
  await doUpload(file, video ?? videoOpts);
528
662
  }
@@ -565,7 +699,11 @@ function VideoUploader({
565
699
  ),
566
700
  showVideoOptions && stagedFile && !isUploading && state.status !== "done" && /* @__PURE__ */ jsxs(Fragment, { children: [
567
701
  preview && /* @__PURE__ */ jsx("div", { className: "border border-slate-200 rounded-xl overflow-hidden bg-black", children: /* @__PURE__ */ jsx("video", { src: preview, className: "w-full max-h-[200px] block", muted: true, playsInline: true, controls: true }) }),
568
- /* @__PURE__ */ jsxs("div", { className: "border border-slate-200 rounded-xl overflow-hidden", children: [
702
+ (analyzing || videoInfo) && /* @__PURE__ */ jsxs("div", { className: "border border-slate-200 rounded-xl overflow-hidden", children: [
703
+ /* @__PURE__ */ jsx("div", { className: "px-3.5 py-2 bg-slate-100 text-[12px] font-bold text-slate-500 tracking-[0.04em]", children: "\u{1F4CB} Informa\xE7\xF5es do arquivo" }),
704
+ /* @__PURE__ */ jsx("div", { className: "p-3.5", children: /* @__PURE__ */ jsx(VideoCompatAlert, { info: videoInfo, issues: videoIssues, analyzing }) })
705
+ ] }),
706
+ videoIssues.length === 0 && /* @__PURE__ */ jsxs("div", { className: "border border-slate-200 rounded-xl overflow-hidden", children: [
569
707
  /* @__PURE__ */ jsx("div", { className: "px-3.5 py-2 bg-slate-100 text-[12px] font-bold text-slate-500 tracking-[0.04em]", children: "\u{1F3AC} Configura\xE7\xF5es de v\xEDdeo" }),
570
708
  /* @__PURE__ */ jsx(VideoOptions, { value: videoOpts, onChange: setVideoOpts, style: { padding: "12px 14px" } })
571
709
  ] }),
@@ -577,6 +715,8 @@ function VideoUploader({
577
715
  onClick: () => {
578
716
  setStagedFile(null);
579
717
  setPreview(null);
718
+ setVideoInfo(null);
719
+ setVideoIssues([]);
580
720
  setVideoOpts(createInitialVideoOpts(video));
581
721
  },
582
722
  children: "Cancelar"
@@ -585,10 +725,13 @@ function VideoUploader({
585
725
  /* @__PURE__ */ jsx(
586
726
  "button",
587
727
  {
588
- 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 hover:opacity-90",
728
+ disabled: videoIssues.length > 0 || analyzing,
729
+ 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 hover:opacity-90 disabled:opacity-40 disabled:cursor-not-allowed",
589
730
  onClick: () => {
590
731
  const f = stagedFile;
591
732
  setStagedFile(null);
733
+ setVideoInfo(null);
734
+ setVideoIssues([]);
592
735
  void doUpload(f, videoOpts);
593
736
  setVideoOpts(createInitialVideoOpts(video));
594
737
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/theme.ts","../src/components/DropZone.tsx","../src/components/ProgressBar.tsx","../src/components/VideoOptions.tsx","../src/utils/format.ts","../src/VideoUploader.tsx"],"names":["jsx","jsxs","useState","useCallback","Fragment"],"mappings":"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","file":"VideoUploader.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 border: `2px dashed ${dragging ? \"var(--silo-border-active)\" : \"var(--silo-border)\"}`,\n borderRadius: \"var(--silo-radius)\",\n background: dragging ? \"var(--silo-bg-hover)\" : \"var(--silo-bg)\",\n color: \"var(--silo-text)\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.5 : 1,\n outline: \"none\",\n transition: \"border-color 150ms, background 150ms\",\n ...style,\n };\n\n return (\n <div\n className={className}\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={className}\n style={{ height: 4, borderRadius: 9999, background: \"var(--silo-border, #e2e8f0)\", overflow: \"hidden\", ...style }}\n role=\"progressbar\"\n aria-valuenow={progress}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div\n style={{ height: \"100%\", borderRadius: 9999, background: \"var(--silo-accent, #6366f1)\", width: `${progress}%`, transition: \"width 200ms linear\" }}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport type { VideoUploadOptions } from \"@geekapps/silo-nextjs\";\n\n// ── Video codec ───────────────────────────────────────────────────────────────\n\nconst VIDEO_CODECS = [\n {\n value: \"h264\",\n label: \"H.264\",\n sublabel: \"Compatível com tudo\",\n description: \"Funciona em qualquer dispositivo — celulares, Smart TVs, navegadores antigos e novos. A escolha mais segura se você não sabe onde o vídeo será assistido.\",\n },\n {\n value: \"h265\",\n label: \"H.265\",\n sublabel: \"Menor tamanho\",\n description: \"Arquivo até 50% menor que H.264 com a mesma qualidade de imagem. Requer dispositivo moderno (2016+). Ideal para vídeos longos ou em alta resolução.\",\n },\n {\n value: \"av1\",\n label: \"AV1\",\n sublabel: \"Máx. eficiência\",\n description: \"O codec mais eficiente disponível — arquivo até 50% menor que H.265. Exige navegador recente (Chrome 70+, Firefox 67+, Safari 17+).\",\n warning: \"Não funciona em iPhones com iOS abaixo de 16 nem em Smart TVs mais antigas. Use H.264 se precisar de compatibilidade ampla.\",\n },\n] as const;\n\n// ── Audio ─────────────────────────────────────────────────────────────────────\n\nconst AUDIO_SIMPLE = [\n {\n value: \"passthrough\",\n label: \"Manter original\",\n badge: \"Recomendado\",\n description: \"Mantém o áudio exatamente como está no arquivo original, sem perdas. Se o formato não for compatível com streaming, converte automaticamente para AAC estéreo.\",\n },\n {\n value: \"aac\",\n label: \"AAC\",\n description: \"Formato mais compatível do mercado — funciona em absolutamente todos os players, celulares e Smart TVs.\",\n },\n {\n value: \"opus\",\n label: \"Opus\",\n description: \"Melhor qualidade que AAC no mesmo tamanho. Funciona em Chrome, Firefox e Android. Não suportado no Safari/iPhone.\",\n },\n] as const;\n\nconst AUDIO_ADVANCED_CODEC = [\n { value: \"passthrough\", label: \"Original\", description: \"Copia sem reprocessar quando compatível (mantém AC3, E-AC3, Dolby Atmos). AAC estéreo como fallback.\" },\n { value: \"aac\", label: \"AAC\", description: \"Compatibilidade máxima com todos os dispositivos.\" },\n { value: \"opus\", label: \"Opus\", description: \"Qualidade superior ao AAC. Chrome/Firefox/Android.\" },\n] as const;\n\nconst AUDIO_CHANNELS = [\n { value: \"original\", label: \"Original\", description: \"Mantém os canais do arquivo fonte.\" },\n { value: \"stereo\", label: \"Estéreo (2.0)\", description: \"Dois canais — compatível com fones e qualquer dispositivo.\" },\n { value: \"5.1\", label: \"Surround 5.1\", description: \"Seis canais. Ideal para home theaters.\" },\n] as const;\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 HD\", \"1080\": \"1080p Full HD\", \"1440\": \"1440p 2K\", \"2160\": \"4K UHD\",\n};\n\n// ── Primitives ────────────────────────────────────────────────────────────────\n\nfunction btn(active: boolean, disabled = false): CSSProperties {\n if (disabled) return {\n border: \"1px solid rgba(255,255,255,0.08)\", background: \"rgba(255,255,255,0.03)\",\n color: \"rgba(255,255,255,0.2)\", padding: \"4px 10px\", borderRadius: 6,\n fontSize: 12, fontWeight: 600, cursor: \"not-allowed\",\n };\n return active\n ? { border: \"1px solid #6366f1\", background: \"#6366f1\", color: \"#fff\", padding: \"4px 10px\", borderRadius: 6, fontSize: 12, fontWeight: 600, cursor: \"pointer\" }\n : { border: \"1px solid rgba(255,255,255,0.15)\", background: \"rgba(255,255,255,0.05)\", color: \"rgba(255,255,255,0.7)\", padding: \"4px 10px\", borderRadius: 6, fontSize: 12, fontWeight: 600, cursor: \"pointer\" };\n}\n\nfunction Label({ children }: { children: React.ReactNode }) {\n return <div style={{ fontSize: 11, fontWeight: 700, textTransform: \"uppercase\", letterSpacing: \"0.05em\", marginBottom: 7, color: \"rgba(255,255,255,0.28)\" }}>{children}</div>;\n}\n\nfunction Hint({ children }: { children: React.ReactNode }) {\n return <p style={{ marginTop: 5, fontSize: 11, color: \"rgba(255,255,255,0.38)\", lineHeight: 1.55 }}>{children}</p>;\n}\n\nfunction Warn({ children }: { children: React.ReactNode }) {\n return (\n <div style={{ marginTop: 6, display: \"flex\", gap: 6, background: \"rgba(251,191,36,0.07)\", border: \"1px solid rgba(251,191,36,0.18)\", borderRadius: 7, padding: \"6px 10px\" }}>\n <span style={{ fontSize: 12, flexShrink: 0 }}>⚠</span>\n <span style={{ fontSize: 11, color: \"#fbbf24\", lineHeight: 1.55 }}>{children}</span>\n </div>\n );\n}\n\nfunction Note({ children }: { children: React.ReactNode }) {\n return (\n <div style={{ marginTop: 6, display: \"flex\", gap: 6, background: \"rgba(99,102,241,0.07)\", border: \"1px solid rgba(99,102,241,0.18)\", borderRadius: 7, padding: \"6px 10px\" }}>\n <span style={{ fontSize: 12, flexShrink: 0 }}>ℹ</span>\n <span style={{ fontSize: 11, color: \"rgba(165,180,252,0.9)\", lineHeight: 1.55 }}>{children}</span>\n </div>\n );\n}\n\nfunction Toggle({ checked, onToggle, label, hint, disabled }: {\n checked: boolean; onToggle: () => void; label: string; hint?: string; disabled?: boolean;\n}) {\n return (\n <div style={{ display: \"flex\", alignItems: \"flex-start\", gap: 8, cursor: disabled ? \"not-allowed\" : \"pointer\", userSelect: \"none\", opacity: disabled ? 0.4 : 1 }}\n onClick={() => !disabled && onToggle()}>\n <span style={{ position: \"relative\", display: \"inline-block\", width: 32, height: 18, borderRadius: 9, flexShrink: 0, marginTop: 1, background: (checked && !disabled) ? \"#6366f1\" : \"rgba(255,255,255,0.12)\", transition: \"background 150ms\" }}>\n <span style={{ position: \"absolute\", top: 2, left: (checked && !disabled) ? 16 : 2, width: 14, height: 14, borderRadius: \"50%\", background: \"#fff\", boxShadow: \"0 1px 3px rgba(0,0,0,.3)\", transition: \"left 150ms\" }} />\n </span>\n <div>\n <span style={{ fontSize: 12, fontWeight: 500, color: disabled ? \"rgba(255,255,255,0.4)\" : \"rgba(255,255,255,0.85)\" }}>{label}</span>\n {hint && <p style={{ fontSize: 11, color: \"rgba(255,255,255,0.35)\", marginTop: 2, lineHeight: 1.5 }}>{hint}</p>}\n </div>\n </div>\n );\n}\n\nfunction Divider() {\n return <div style={{ height: 1, background: \"rgba(255,255,255,0.06)\", margin: \"2px 0\" }} />;\n}\n\n// ── Main component ────────────────────────────────────────────────────────────\n\ninterface VideoOptionsProps {\n value: VideoUploadOptions;\n onChange: (opts: VideoUploadOptions) => void;\n style?: CSSProperties;\n}\n\nexport function VideoOptions({ value, onChange, style }: VideoOptionsProps) {\n const [advanced, setAdvanced] = useState(false);\n\n const codec = value.codec ?? \"h264\";\n const transcoding = value.transcoding ?? \"auto\";\n const isAuto = transcoding === \"auto\";\n const selectedRes = isAuto ? [] : (transcoding as string[]);\n const audioCodec = value.audioCodec ?? \"passthrough\";\n const audioChannels = value.audioChannels ?? \"original\";\n const preserveAtmos = value.preserveAtmos ?? true;\n const hdrMode = value.hdr ?? \"preserve\";\n const hdrSupported = codec === \"h265\" || codec === \"av1\";\n const showAtmosOpt = audioCodec === \"passthrough\";\n const showAtmosWarn = audioCodec === \"aac\" || audioCodec === \"opus\";\n const selectedCodec = VIDEO_CODECS.find((c) => c.value === codec);\n\n type Res = \"144\" | \"240\" | \"360\" | \"480\" | \"720\" | \"1080\" | \"1440\" | \"2160\";\n function toggleRes(r: Res) {\n if (isAuto) { onChange({ ...value, transcoding: [r] }); return; }\n const next = selectedRes.includes(r) ? selectedRes.filter((x) => x !== r) : [...selectedRes, r];\n onChange({ ...value, transcoding: next.length === 0 ? \"auto\" : (next as Res[]) });\n }\n\n return (\n <div className=\"flex flex-col gap-5\" style={style}>\n\n {/* ══ SEÇÃO: VÍDEO ═══════════════════════════════════════════════════════ */}\n <div>\n <Label>Formato de vídeo</Label>\n\n {/* Codec */}\n <div className=\"mb-4\">\n <div className=\"flex gap-1.5 flex-wrap mb-1\">\n {VIDEO_CODECS.map((c) => (\n <button key={c.value} type=\"button\"\n onClick={() => onChange({ ...value, codec: c.value as NonNullable<VideoUploadOptions[\"codec\"]> })}\n style={btn(codec === c.value)}\n >\n {c.label}\n </button>\n ))}\n </div>\n {selectedCodec && (\n <Hint><strong style={{ color: \"rgba(255,255,255,0.55)\" }}>{selectedCodec.sublabel}.</strong>{\" \"}{selectedCodec.description}</Hint>\n )}\n {\"warning\" in (selectedCodec ?? {}) && (selectedCodec as { warning?: string }).warning && (\n <Warn>{(selectedCodec as { warning?: string }).warning}</Warn>\n )}\n </div>\n\n {/* Resoluções */}\n <div className=\"mb-4\">\n <Label>Versões de qualidade (resoluções)</Label>\n <div className=\"flex gap-1.5 flex-wrap mb-1\">\n <button type=\"button\" onClick={() => onChange({ ...value, transcoding: \"auto\" })} style={btn(isAuto)}>\n Automático\n </button>\n {RESOLUTIONS.map((r) => (\n <button key={r} type=\"button\" onClick={() => toggleRes(r as Res)} style={btn(!isAuto && selectedRes.includes(r))}>\n {RESOLUTION_LABELS[r]}\n </button>\n ))}\n </div>\n <Hint>\n {isAuto\n ? \"Gera automaticamente todas as versões até a qualidade original do vídeo.\"\n : \"Somente as versões selecionadas serão geradas.\"}\n </Hint>\n </div>\n\n {/* HDR */}\n <div style={{ opacity: hdrSupported ? 1 : 0.45 }}>\n <Label>Imagem HDR (alto contraste e cores vibrantes)</Label>\n {!advanced ? (\n <>\n <Toggle\n checked={hdrMode === \"preserve\"}\n onToggle={() => onChange({ ...value, hdr: hdrMode === \"preserve\" ? \"sdr\" : \"preserve\" })}\n label=\"Manter imagem HDR do vídeo original\"\n hint=\"Preserva HDR10, HDR10+, HLG e Dolby Vision. Só funciona com H.265 ou AV1.\"\n disabled={!hdrSupported}\n />\n {!hdrSupported && (\n <Warn>O H.264 não suporta HDR. Se o vídeo for HDR, a imagem será convertida automaticamente para SDR. Para manter o HDR, escolha H.265 ou AV1.</Warn>\n )}\n </>\n ) : (\n <>\n <div className=\"flex gap-1.5 flex-wrap mb-1\">\n <button type=\"button\" onClick={() => hdrSupported && onChange({ ...value, hdr: \"preserve\" })} style={btn(hdrMode === \"preserve\" && hdrSupported, !hdrSupported)}>\n Manter HDR\n </button>\n <button type=\"button\" onClick={() => onChange({ ...value, hdr: \"sdr\" })} style={btn(hdrMode === \"sdr\" || !hdrSupported)}>\n Converter para SDR\n </button>\n </div>\n {!hdrSupported\n ? <Warn>O H.264 não suporta HDR. O vídeo será convertido para SDR automaticamente. Escolha H.265 ou AV1 para manter o HDR.</Warn>\n : <Hint>{hdrMode === \"preserve\"\n ? \"HDR10, HDR10+, HLG e Dolby Vision preservados. Em telas sem HDR o vídeo funciona normalmente.\"\n : \"Convertido para SDR padrão — compatível com qualquer tela.\"}</Hint>\n }\n </>\n )}\n </div>\n </div>\n\n <Divider />\n\n {/* ══ SEÇÃO: ÁUDIO ═══════════════════════════════════════════════════════ */}\n <div>\n <Label>Áudio</Label>\n\n {!advanced ? (\n <div className=\"mb-4\">\n <div className=\"flex gap-1.5 flex-wrap mb-1\">\n {AUDIO_SIMPLE.map((a) => (\n <button key={a.value} type=\"button\"\n onClick={() => onChange({ ...value, audioCodec: a.value })}\n style={btn(audioCodec === a.value)}\n >\n {a.label}\n {\"badge\" in a && a.badge ? (\n <span style={{ marginLeft: 5, fontSize: 9, fontWeight: 700, background: \"rgba(255,255,255,0.15)\", borderRadius: 4, padding: \"1px 4px\", verticalAlign: \"middle\" }}>\n {a.badge}\n </span>\n ) : null}\n </button>\n ))}\n </div>\n <Hint>{AUDIO_SIMPLE.find((a) => a.value === audioCodec)?.description}</Hint>\n </div>\n ) : (\n <>\n {/* Codec avançado */}\n <div className=\"mb-4\">\n <Label>Formato de áudio (codec)</Label>\n <div className=\"flex gap-1.5 flex-wrap mb-1\">\n {AUDIO_ADVANCED_CODEC.map((a) => (\n <button key={a.value} type=\"button\"\n onClick={() => onChange({ ...value, audioCodec: a.value })}\n style={btn(audioCodec === a.value)}\n >\n {a.label}\n </button>\n ))}\n </div>\n <Hint>{AUDIO_ADVANCED_CODEC.find((a) => a.value === audioCodec)?.description}</Hint>\n {showAtmosWarn && (\n <Warn>Este formato não suporta Dolby Atmos. Use <strong>Dolby Digital Plus (E-AC3)</strong> ou <strong>Original</strong> para manter o som espacial 3D.</Warn>\n )}\n </div>\n\n {/* Canais */}\n <div className=\"mb-4\">\n <Label>Canais de áudio</Label>\n <div className=\"flex gap-1.5 flex-wrap mb-1\">\n {AUDIO_CHANNELS.map((c) => (\n <button key={c.value} type=\"button\"\n onClick={() => onChange({ ...value, audioChannels: c.value })}\n style={btn(audioChannels === c.value)}\n >\n {c.label}\n </button>\n ))}\n </div>\n <Hint>{AUDIO_CHANNELS.find((c) => c.value === audioChannels)?.description}</Hint>\n </div>\n\n {/* Dolby Atmos */}\n {showAtmosOpt && (\n <div className=\"mb-4\">\n <Label>Dolby Atmos (som espacial 3D)</Label>\n <Toggle\n checked={preserveAtmos}\n onToggle={() => onChange({ ...value, preserveAtmos: !preserveAtmos })}\n label=\"Manter Dolby Atmos quando disponível no arquivo\"\n hint=\"Funciona somente com Dolby Digital Plus (E-AC3) ou Original.\"\n />\n {!preserveAtmos && (\n <Note>Com Atmos desativado, o áudio será mixado em surround convencional sem informação espacial.</Note>\n )}\n </div>\n )}\n </>\n )}\n\n {/* Faixa de áudio separada */}\n <Toggle\n checked={value.separateAudio ?? false}\n onToggle={() => onChange({ ...value, separateAudio: !value.separateAudio })}\n label=\"Exportar faixa de áudio separada\"\n hint=\"Gera também um arquivo de áudio independente do vídeo.\"\n />\n </div>\n\n <Divider />\n\n {/* ══ SEÇÃO: MINIATURAS ══════════════════════════════════════════════════ */}\n <div>\n <Label>Miniaturas (thumbnails)</Label>\n <Toggle\n checked={value.thumbnails ?? true}\n onToggle={() => onChange({ ...value, thumbnails: !(value.thumbnails ?? true) })}\n label=\"Gerar miniaturas automaticamente\"\n hint=\"Imagens de prévia usadas em players, listas e compartilhamentos. Recomendado manter ativo.\"\n />\n </div>\n\n <Divider />\n\n {/* ══ SEÇÃO: STORYBOARD ══════════════════════════════════════════════════ */}\n <div>\n <Label>Storyboard</Label>\n <Toggle\n checked={value.storyboard ?? false}\n onToggle={() => onChange({ ...value, storyboard: !value.storyboard })}\n label=\"Gerar storyboard para pré-visualização\"\n hint=\"Mostra frames do vídeo ao passar o mouse na barra de progresso do player. Aumenta levemente o tempo de processamento.\"\n />\n </div>\n\n {/* Toggle avançado */}\n <button\n type=\"button\"\n onClick={() => setAdvanced((v) => !v)}\n style={{ alignSelf: \"flex-start\", fontSize: 11, color: \"rgba(255,255,255,0.3)\", background: \"none\", border: \"none\", cursor: \"pointer\", padding: 0, textDecoration: \"underline\", textUnderlineOffset: 3 }}\n >\n {advanced ? \"← Voltar ao modo simples\" : \"Configurações avançadas de áudio e HDR →\"}\n </button>\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 { VideoUploadOptions } from \"@geekapps/silo-nextjs\";\nimport type { VideoUploaderProps } from \"./types.js\";\nimport { DropZone } from \"./components/DropZone.js\";\nimport { ProgressBar } from \"./components/ProgressBar.js\";\nimport { VideoOptions } from \"./components/VideoOptions.js\";\nimport { formatBytes } 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 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 envio…\";\n if (progress < 20) return \"Iniciando envio…\";\n if (progress < 50) return \"Enviando vídeo…\";\n if (progress < 80) return \"Ainda enviando…\";\n if (progress < 97) return \"Quase terminando…\";\n return \"Finalizando…\";\n}\n\nexport function VideoUploader({\n bucket,\n expiresIn,\n onUpload,\n onError,\n className = \"\",\n style,\n disabled = false,\n maxSize,\n accept = \"video/*\",\n showPreview = true,\n showVideoOptions = false,\n video,\n theme,\n renderIcon,\n renderProgress,\n renderSuccess,\n renderError,\n children,\n}: VideoUploaderProps) {\n const { state, upload, pause, resume, abort, reset } = useMultipartUpload(bucket);\n const [preview, setPreview] = useState<string | null>(null);\n const [videoOpts, setVideoOpts] = useState<VideoUploadOptions>(() => createInitialVideoOpts(video));\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: VideoUploadOptions) => {\n if (showPreview) setPreview(URL.createObjectURL(file));\n try {\n const result = await upload(file, { ...(bucket !== undefined && { bucket }), video: 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 (showVideoOptions) {\n setVideoOpts(createInitialVideoOpts(video));\n setStagedFile(file);\n if (showPreview) setPreview(URL.createObjectURL(file));\n } else {\n await doUpload(file, video ?? videoOpts);\n }\n }, [showVideoOptions, video, videoOpts, 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 <video src={preview} className=\"max-w-full max-h-[180px] rounded-lg\" muted playsInline />\n <span className=\"text-[12px] text-slate-400\">Clique ou arraste para trocar o vídeo</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=\"M15 10l4.553-2.069A1 1 0 0121 8.878v6.244a1 1 0 01-1.447.894L15 14M3 8a2 2 0 012-2h8a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2V8z\" />\n </svg>\n )}\n {children ?? (\n <>\n <span className=\"text-slate-900 font-bold text-[15px]\">Arraste seu vídeo aqui</span>\n <span className=\"text-slate-500 text-[13px]\">ou clique para escolher do seu dispositivo</span>\n <span className=\"text-slate-400 text-[12px]\">\n MP4, MOV, MKV, WebM{maxSize ? ` · Máx ${formatBytes(maxSize)}` : \"\"}\n </span>\n </>\n )}\n </div>\n )}\n </DropZone>\n\n {showVideoOptions && stagedFile && !isUploading && state.status !== \"done\" && (\n <>\n {preview && (\n <div className=\"border border-slate-200 rounded-xl overflow-hidden bg-black\">\n <video src={preview} className=\"w-full max-h-[200px] block\" muted playsInline controls />\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 vídeo</div>\n <VideoOptions value={videoOpts} onChange={setVideoOpts} 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 hover:bg-slate-100\"\n onClick={() => { setStagedFile(null); setPreview(null); setVideoOpts(createInitialVideoOpts(video)); }}\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 hover:opacity-90\"\n onClick={() => { const f = stagedFile; setStagedFile(null); void doUpload(f, videoOpts); setVideoOpts(createInitialVideoOpts(video)); }}\n >\n Enviar vídeo\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 <div className=\"flex gap-2 items-center\">\n <span className=\"text-[13px] font-bold text-indigo-500\">{progress}%</span>\n <button\n className=\"inline-flex items-center justify-center text-[11px] font-semibold py-0.5 px-2 rounded-lg border border-slate-200 bg-transparent text-slate-900 cursor-pointer hover:bg-slate-100\"\n onClick={pause}\n >\n Pausar\n </button>\n </div>\n </div>\n <ProgressBar progress={progress} />\n <span className=\"text-[11px] text-slate-400\">O processamento do vídeo começa automaticamente após o envio</span>\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 }), video: videoOpts })}\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 flex-col gap-2 px-4 py-3.5 bg-green-500/[0.08] rounded-xl border border-green-500/20\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-2xl\">✅</span>\n <div className=\"flex-1\">\n <div className=\"font-bold text-sm text-green-700\">Vídeo enviado 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 outro\n </button>\n </div>\n <div className=\"text-[12px] text-slate-500 px-3 py-2 rounded-lg bg-green-500/[0.06] border border-green-500/15\">\n 🎬 Seu vídeo está sendo processado em segundo plano. Isso pode levar alguns minutos dependendo do tamanho.\n </div>\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 o vídeo</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/VideoOptions.tsx","../src/utils/format.ts","../src/components/VideoCompatAlert.tsx","../src/utils/videoInfo.ts","../src/VideoUploader.tsx"],"names":["jsx","jsxs","useState","Fragment","useCallback"],"mappings":"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","file":"VideoUploader.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 border: `2px dashed ${dragging ? \"var(--silo-border-active)\" : \"var(--silo-border)\"}`,\n borderRadius: \"var(--silo-radius)\",\n background: dragging ? \"var(--silo-bg-hover)\" : \"var(--silo-bg)\",\n color: \"var(--silo-text)\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.5 : 1,\n outline: \"none\",\n transition: \"border-color 150ms, background 150ms\",\n ...style,\n };\n\n return (\n <div\n className={className}\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={className}\n style={{ height: 4, borderRadius: 9999, background: \"var(--silo-border, #e2e8f0)\", overflow: \"hidden\", ...style }}\n role=\"progressbar\"\n aria-valuenow={progress}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div\n style={{ height: \"100%\", borderRadius: 9999, background: \"var(--silo-accent, #6366f1)\", width: `${progress}%`, transition: \"width 200ms linear\" }}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport type { VideoUploadOptions } from \"@geekapps/silo-nextjs\";\n\n// ── Video codec ───────────────────────────────────────────────────────────────\n\nconst VIDEO_CODECS = [\n {\n value: \"h264\",\n label: \"H.264\",\n sublabel: \"Compatível com tudo\",\n description: \"Funciona em qualquer dispositivo — celulares, Smart TVs, navegadores antigos e novos. A escolha mais segura se você não sabe onde o vídeo será assistido.\",\n },\n {\n value: \"h265\",\n label: \"H.265\",\n sublabel: \"Menor tamanho\",\n description: \"Arquivo até 50% menor que H.264 com a mesma qualidade de imagem. Requer dispositivo moderno (2016+). Ideal para vídeos longos ou em alta resolução.\",\n },\n {\n value: \"av1\",\n label: \"AV1\",\n sublabel: \"Máx. eficiência\",\n description: \"O codec mais eficiente disponível — arquivo até 50% menor que H.265. Exige navegador recente (Chrome 70+, Firefox 67+, Safari 17+).\",\n warning: \"Não funciona em iPhones com iOS abaixo de 16 nem em Smart TVs mais antigas. Use H.264 se precisar de compatibilidade ampla.\",\n },\n] as const;\n\n// ── Audio ─────────────────────────────────────────────────────────────────────\n\nconst AUDIO_SIMPLE = [\n {\n value: \"passthrough\",\n label: \"Manter original\",\n badge: \"Recomendado\",\n description: \"Mantém o áudio exatamente como está no arquivo original, sem perdas. Se o formato não for compatível com streaming, converte automaticamente para AAC estéreo.\",\n },\n {\n value: \"aac\",\n label: \"AAC\",\n description: \"Formato mais compatível do mercado — funciona em absolutamente todos os players, celulares e Smart TVs.\",\n },\n {\n value: \"opus\",\n label: \"Opus\",\n description: \"Melhor qualidade que AAC no mesmo tamanho. Funciona em Chrome, Firefox e Android. Não suportado no Safari/iPhone.\",\n },\n] as const;\n\nconst AUDIO_ADVANCED_CODEC = [\n { value: \"passthrough\", label: \"Original\", description: \"Copia sem reprocessar quando compatível (mantém AC3, E-AC3, Dolby Atmos). AAC estéreo como fallback.\" },\n { value: \"aac\", label: \"AAC\", description: \"Compatibilidade máxima com todos os dispositivos.\" },\n { value: \"opus\", label: \"Opus\", description: \"Qualidade superior ao AAC. Chrome/Firefox/Android.\" },\n] as const;\n\nconst AUDIO_CHANNELS = [\n { value: \"original\", label: \"Original\", description: \"Mantém os canais do arquivo fonte.\" },\n { value: \"stereo\", label: \"Estéreo (2.0)\", description: \"Dois canais — compatível com fones e qualquer dispositivo.\" },\n { value: \"5.1\", label: \"Surround 5.1\", description: \"Seis canais. Ideal para home theaters.\" },\n] as const;\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 HD\", \"1080\": \"1080p Full HD\", \"1440\": \"1440p 2K\", \"2160\": \"4K UHD\",\n};\n\n// ── Primitives ────────────────────────────────────────────────────────────────\n\nfunction btn(active: boolean, disabled = false): CSSProperties {\n if (disabled) return {\n border: \"1px solid rgba(255,255,255,0.08)\", background: \"rgba(255,255,255,0.03)\",\n color: \"rgba(255,255,255,0.2)\", padding: \"4px 10px\", borderRadius: 6,\n fontSize: 12, fontWeight: 600, cursor: \"not-allowed\",\n };\n return active\n ? { border: \"1px solid #6366f1\", background: \"#6366f1\", color: \"#fff\", padding: \"4px 10px\", borderRadius: 6, fontSize: 12, fontWeight: 600, cursor: \"pointer\" }\n : { border: \"1px solid rgba(255,255,255,0.15)\", background: \"rgba(255,255,255,0.05)\", color: \"rgba(255,255,255,0.7)\", padding: \"4px 10px\", borderRadius: 6, fontSize: 12, fontWeight: 600, cursor: \"pointer\" };\n}\n\nfunction Label({ children }: { children: React.ReactNode }) {\n return <div style={{ fontSize: 11, fontWeight: 700, textTransform: \"uppercase\", letterSpacing: \"0.05em\", marginBottom: 7, color: \"rgba(255,255,255,0.28)\" }}>{children}</div>;\n}\n\nfunction Hint({ children }: { children: React.ReactNode }) {\n return <p style={{ marginTop: 5, fontSize: 11, color: \"rgba(255,255,255,0.38)\", lineHeight: 1.55 }}>{children}</p>;\n}\n\nfunction Warn({ children }: { children: React.ReactNode }) {\n return (\n <div style={{ marginTop: 6, display: \"flex\", gap: 6, background: \"rgba(251,191,36,0.07)\", border: \"1px solid rgba(251,191,36,0.18)\", borderRadius: 7, padding: \"6px 10px\" }}>\n <span style={{ fontSize: 12, flexShrink: 0 }}>⚠</span>\n <span style={{ fontSize: 11, color: \"#fbbf24\", lineHeight: 1.55 }}>{children}</span>\n </div>\n );\n}\n\nfunction Note({ children }: { children: React.ReactNode }) {\n return (\n <div style={{ marginTop: 6, display: \"flex\", gap: 6, background: \"rgba(99,102,241,0.07)\", border: \"1px solid rgba(99,102,241,0.18)\", borderRadius: 7, padding: \"6px 10px\" }}>\n <span style={{ fontSize: 12, flexShrink: 0 }}>ℹ</span>\n <span style={{ fontSize: 11, color: \"rgba(165,180,252,0.9)\", lineHeight: 1.55 }}>{children}</span>\n </div>\n );\n}\n\nfunction Toggle({ checked, onToggle, label, hint, disabled }: {\n checked: boolean; onToggle: () => void; label: string; hint?: string; disabled?: boolean;\n}) {\n return (\n <div style={{ display: \"flex\", alignItems: \"flex-start\", gap: 8, cursor: disabled ? \"not-allowed\" : \"pointer\", userSelect: \"none\", opacity: disabled ? 0.4 : 1 }}\n onClick={() => !disabled && onToggle()}>\n <span style={{ position: \"relative\", display: \"inline-block\", width: 32, height: 18, borderRadius: 9, flexShrink: 0, marginTop: 1, background: (checked && !disabled) ? \"#6366f1\" : \"rgba(255,255,255,0.12)\", transition: \"background 150ms\" }}>\n <span style={{ position: \"absolute\", top: 2, left: (checked && !disabled) ? 16 : 2, width: 14, height: 14, borderRadius: \"50%\", background: \"#fff\", boxShadow: \"0 1px 3px rgba(0,0,0,.3)\", transition: \"left 150ms\" }} />\n </span>\n <div>\n <span style={{ fontSize: 12, fontWeight: 500, color: disabled ? \"rgba(255,255,255,0.4)\" : \"rgba(255,255,255,0.85)\" }}>{label}</span>\n {hint && <p style={{ fontSize: 11, color: \"rgba(255,255,255,0.35)\", marginTop: 2, lineHeight: 1.5 }}>{hint}</p>}\n </div>\n </div>\n );\n}\n\nfunction Divider() {\n return <div style={{ height: 1, background: \"rgba(255,255,255,0.06)\", margin: \"2px 0\" }} />;\n}\n\n// ── Main component ────────────────────────────────────────────────────────────\n\ninterface VideoOptionsProps {\n value: VideoUploadOptions;\n onChange: (opts: VideoUploadOptions) => void;\n style?: CSSProperties;\n}\n\nexport function VideoOptions({ value, onChange, style }: VideoOptionsProps) {\n const [advanced, setAdvanced] = useState(false);\n\n const codec = value.codec ?? \"h264\";\n const transcoding = value.transcoding ?? \"auto\";\n const isAuto = transcoding === \"auto\";\n const selectedRes = isAuto ? [] : (transcoding as string[]);\n const audioCodec = value.audioCodec ?? \"passthrough\";\n const audioChannels = value.audioChannels ?? \"original\";\n const preserveAtmos = value.preserveAtmos ?? true;\n const hdrMode = value.hdr ?? \"preserve\";\n const hdrSupported = codec === \"h265\" || codec === \"av1\";\n const showAtmosOpt = audioCodec === \"passthrough\";\n const showAtmosWarn = audioCodec === \"aac\" || audioCodec === \"opus\";\n const selectedCodec = VIDEO_CODECS.find((c) => c.value === codec);\n\n type Res = \"144\" | \"240\" | \"360\" | \"480\" | \"720\" | \"1080\" | \"1440\" | \"2160\";\n function toggleRes(r: Res) {\n if (isAuto) { onChange({ ...value, transcoding: [r] }); return; }\n const next = selectedRes.includes(r) ? selectedRes.filter((x) => x !== r) : [...selectedRes, r];\n onChange({ ...value, transcoding: next.length === 0 ? \"auto\" : (next as Res[]) });\n }\n\n return (\n <div className=\"flex flex-col gap-5\" style={style}>\n\n {/* ══ SEÇÃO: VÍDEO ═══════════════════════════════════════════════════════ */}\n <div>\n <Label>Formato de vídeo</Label>\n\n {/* Codec */}\n <div className=\"mb-4\">\n <div className=\"flex gap-1.5 flex-wrap mb-1\">\n {VIDEO_CODECS.map((c) => (\n <button key={c.value} type=\"button\"\n onClick={() => onChange({ ...value, codec: c.value as NonNullable<VideoUploadOptions[\"codec\"]> })}\n style={btn(codec === c.value)}\n >\n {c.label}\n </button>\n ))}\n </div>\n {selectedCodec && (\n <Hint><strong style={{ color: \"rgba(255,255,255,0.55)\" }}>{selectedCodec.sublabel}.</strong>{\" \"}{selectedCodec.description}</Hint>\n )}\n {\"warning\" in (selectedCodec ?? {}) && (selectedCodec as { warning?: string }).warning && (\n <Warn>{(selectedCodec as { warning?: string }).warning}</Warn>\n )}\n </div>\n\n {/* Resoluções */}\n <div className=\"mb-4\">\n <Label>Versões de qualidade (resoluções)</Label>\n <div className=\"flex gap-1.5 flex-wrap mb-1\">\n <button type=\"button\" onClick={() => onChange({ ...value, transcoding: \"auto\" })} style={btn(isAuto)}>\n Automático\n </button>\n {RESOLUTIONS.map((r) => (\n <button key={r} type=\"button\" onClick={() => toggleRes(r as Res)} style={btn(!isAuto && selectedRes.includes(r))}>\n {RESOLUTION_LABELS[r]}\n </button>\n ))}\n </div>\n <Hint>\n {isAuto\n ? \"Gera automaticamente todas as versões até a qualidade original do vídeo.\"\n : \"Somente as versões selecionadas serão geradas.\"}\n </Hint>\n </div>\n\n {/* HDR */}\n <div style={{ opacity: hdrSupported ? 1 : 0.45 }}>\n <Label>Imagem HDR (alto contraste e cores vibrantes)</Label>\n {!advanced ? (\n <>\n <Toggle\n checked={hdrMode === \"preserve\"}\n onToggle={() => onChange({ ...value, hdr: hdrMode === \"preserve\" ? \"sdr\" : \"preserve\" })}\n label=\"Manter imagem HDR do vídeo original\"\n hint=\"Preserva HDR10, HDR10+, HLG e Dolby Vision. Só funciona com H.265 ou AV1.\"\n disabled={!hdrSupported}\n />\n {!hdrSupported && (\n <Warn>O H.264 não suporta HDR. Se o vídeo for HDR, a imagem será convertida automaticamente para SDR. Para manter o HDR, escolha H.265 ou AV1.</Warn>\n )}\n </>\n ) : (\n <>\n <div className=\"flex gap-1.5 flex-wrap mb-1\">\n <button type=\"button\" onClick={() => hdrSupported && onChange({ ...value, hdr: \"preserve\" })} style={btn(hdrMode === \"preserve\" && hdrSupported, !hdrSupported)}>\n Manter HDR\n </button>\n <button type=\"button\" onClick={() => onChange({ ...value, hdr: \"sdr\" })} style={btn(hdrMode === \"sdr\" || !hdrSupported)}>\n Converter para SDR\n </button>\n </div>\n {!hdrSupported\n ? <Warn>O H.264 não suporta HDR. O vídeo será convertido para SDR automaticamente. Escolha H.265 ou AV1 para manter o HDR.</Warn>\n : <Hint>{hdrMode === \"preserve\"\n ? \"HDR10, HDR10+, HLG e Dolby Vision preservados. Em telas sem HDR o vídeo funciona normalmente.\"\n : \"Convertido para SDR padrão — compatível com qualquer tela.\"}</Hint>\n }\n </>\n )}\n </div>\n </div>\n\n <Divider />\n\n {/* ══ SEÇÃO: ÁUDIO ═══════════════════════════════════════════════════════ */}\n <div>\n <Label>Áudio</Label>\n\n {!advanced ? (\n <div className=\"mb-4\">\n <div className=\"flex gap-1.5 flex-wrap mb-1\">\n {AUDIO_SIMPLE.map((a) => (\n <button key={a.value} type=\"button\"\n onClick={() => onChange({ ...value, audioCodec: a.value })}\n style={btn(audioCodec === a.value)}\n >\n {a.label}\n {\"badge\" in a && a.badge ? (\n <span style={{ marginLeft: 5, fontSize: 9, fontWeight: 700, background: \"rgba(255,255,255,0.15)\", borderRadius: 4, padding: \"1px 4px\", verticalAlign: \"middle\" }}>\n {a.badge}\n </span>\n ) : null}\n </button>\n ))}\n </div>\n <Hint>{AUDIO_SIMPLE.find((a) => a.value === audioCodec)?.description}</Hint>\n </div>\n ) : (\n <>\n {/* Codec avançado */}\n <div className=\"mb-4\">\n <Label>Formato de áudio (codec)</Label>\n <div className=\"flex gap-1.5 flex-wrap mb-1\">\n {AUDIO_ADVANCED_CODEC.map((a) => (\n <button key={a.value} type=\"button\"\n onClick={() => onChange({ ...value, audioCodec: a.value })}\n style={btn(audioCodec === a.value)}\n >\n {a.label}\n </button>\n ))}\n </div>\n <Hint>{AUDIO_ADVANCED_CODEC.find((a) => a.value === audioCodec)?.description}</Hint>\n {showAtmosWarn && (\n <Warn>Este formato não suporta Dolby Atmos. Use <strong>Dolby Digital Plus (E-AC3)</strong> ou <strong>Original</strong> para manter o som espacial 3D.</Warn>\n )}\n </div>\n\n {/* Canais */}\n <div className=\"mb-4\">\n <Label>Canais de áudio</Label>\n <div className=\"flex gap-1.5 flex-wrap mb-1\">\n {AUDIO_CHANNELS.map((c) => (\n <button key={c.value} type=\"button\"\n onClick={() => onChange({ ...value, audioChannels: c.value })}\n style={btn(audioChannels === c.value)}\n >\n {c.label}\n </button>\n ))}\n </div>\n <Hint>{AUDIO_CHANNELS.find((c) => c.value === audioChannels)?.description}</Hint>\n </div>\n\n {/* Dolby Atmos */}\n {showAtmosOpt && (\n <div className=\"mb-4\">\n <Label>Dolby Atmos (som espacial 3D)</Label>\n <Toggle\n checked={preserveAtmos}\n onToggle={() => onChange({ ...value, preserveAtmos: !preserveAtmos })}\n label=\"Manter Dolby Atmos quando disponível no arquivo\"\n hint=\"Funciona somente com Dolby Digital Plus (E-AC3) ou Original.\"\n />\n {!preserveAtmos && (\n <Note>Com Atmos desativado, o áudio será mixado em surround convencional sem informação espacial.</Note>\n )}\n </div>\n )}\n </>\n )}\n\n {/* Faixa de áudio separada */}\n <Toggle\n checked={value.separateAudio ?? false}\n onToggle={() => onChange({ ...value, separateAudio: !value.separateAudio })}\n label=\"Exportar faixa de áudio separada\"\n hint=\"Gera também um arquivo de áudio independente do vídeo.\"\n />\n </div>\n\n <Divider />\n\n {/* ══ SEÇÃO: MINIATURAS ══════════════════════════════════════════════════ */}\n <div>\n <Label>Miniaturas (thumbnails)</Label>\n <Toggle\n checked={value.thumbnails ?? true}\n onToggle={() => onChange({ ...value, thumbnails: !(value.thumbnails ?? true) })}\n label=\"Gerar miniaturas automaticamente\"\n hint=\"Imagens de prévia usadas em players, listas e compartilhamentos. Recomendado manter ativo.\"\n />\n </div>\n\n <Divider />\n\n {/* ══ SEÇÃO: STORYBOARD ══════════════════════════════════════════════════ */}\n <div>\n <Label>Storyboard</Label>\n <Toggle\n checked={value.storyboard ?? false}\n onToggle={() => onChange({ ...value, storyboard: !value.storyboard })}\n label=\"Gerar storyboard para pré-visualização\"\n hint=\"Mostra frames do vídeo ao passar o mouse na barra de progresso do player. Aumenta levemente o tempo de processamento.\"\n />\n </div>\n\n {/* Toggle avançado */}\n <button\n type=\"button\"\n onClick={() => setAdvanced((v) => !v)}\n style={{ alignSelf: \"flex-start\", fontSize: 11, color: \"rgba(255,255,255,0.3)\", background: \"none\", border: \"none\", cursor: \"pointer\", padding: 0, textDecoration: \"underline\", textUnderlineOffset: 3 }}\n >\n {advanced ? \"← Voltar ao modo simples\" : \"Configurações avançadas de áudio e HDR →\"}\n </button>\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 type { VideoFileInfo, VideoCompatIssue } from \"../utils/videoInfo.js\";\nimport { formatBytes } from \"../utils/format.js\";\n\nconst CODEC_MESSAGES: Record<string, { title: string; detail: string }> = {\n AV1: { title: \"AV1 não é suportado como entrada\", detail: \"O pipeline de transcodificação não aceita arquivos AV1. Converta para H.264 ou H.265 antes de enviar.\" },\n VP9: { title: \"VP9 não é suportado como entrada\", detail: \"Arquivos WebM/VP9 não são aceitos. Converta para H.264 ou H.265 antes de enviar.\" },\n VP8: { title: \"VP8 não é suportado como entrada\", detail: \"Arquivos WebM/VP8 não são aceitos. Converta para H.264 antes de enviar.\" },\n \"MPEG-1 Video\": { title: \"MPEG-1 não é suportado\", detail: \"Formato muito antigo. Converta para H.264 antes de enviar.\" },\n \"MPEG-2 Video\": { title: \"MPEG-2 não é suportado\", detail: \"Converta para H.264 antes de enviar.\" },\n};\n\nconst CONTAINER_MESSAGES: Record<string, { title: string; detail: string }> = {\n FLV: { title: \"Formato FLV não suportado\", detail: \"Arquivos Flash Video não são aceitos. Converta para MP4 (H.264) antes de enviar.\" },\n \"Flash Video\": { title: \"Formato FLV não suportado\", detail: \"Arquivos Flash Video não são aceitos. Converta para MP4 (H.264) antes de enviar.\" },\n RealMedia: { title: \"Formato RealMedia não suportado\", detail: \"Converta para MP4 (H.264) antes de enviar.\" },\n ASF: { title: \"Formato ASF/WMV não suportado\", detail: \"Converta para MP4 (H.264) antes de enviar.\" },\n};\n\nfunction issueMessage(issue: VideoCompatIssue): { title: string; detail: string } {\n if (issue.code === \"unsupported_codec\") {\n return CODEC_MESSAGES[issue.codec] ?? { title: `Codec ${issue.codec} não suportado`, detail: \"Converta para H.264 ou H.265 antes de enviar.\" };\n }\n const key = Object.keys(CONTAINER_MESSAGES).find((k) => issue.container.includes(k));\n return (key ? CONTAINER_MESSAGES[key] : null) ?? { title: `Container ${issue.container} não suportado`, detail: \"Converta para MP4 (H.264) antes de enviar.\" };\n}\n\nfunction fmt(n: number, unit: string) { return `${n.toLocaleString(\"pt-BR\")}${unit}`; }\nfunction fmtDuration(secs: number) {\n const h = Math.floor(secs / 3600);\n const m = Math.floor((secs % 3600) / 60);\n const s = Math.floor(secs % 60);\n if (h > 0) return `${h}h ${m}m ${s}s`;\n if (m > 0) return `${m}m ${s}s`;\n return `${s}s`;\n}\n\ninterface Props {\n info: VideoFileInfo;\n issues: VideoCompatIssue[];\n analyzing?: boolean;\n}\n\nexport function VideoCompatAlert({ info, issues, analyzing }: Props) {\n if (analyzing) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, padding: \"10px 14px\", background: \"rgba(99,102,241,0.06)\", border: \"1px solid rgba(99,102,241,0.18)\", borderRadius: 10 }}>\n <span style={{ fontSize: 14 }}>🔍</span>\n <span style={{ fontSize: 12, color: \"rgba(165,180,252,0.9)\" }}>Analisando arquivo…</span>\n </div>\n );\n }\n\n const v = info.video;\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n {/* Resumo das props */}\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 6 }}>\n {v && (\n <>\n <Chip label={v.codec || \"?\"} color=\"neutral\" />\n {v.width > 0 && v.height > 0 && <Chip label={`${v.width}×${v.height}`} color=\"neutral\" />}\n {v.duration > 0 && <Chip label={fmtDuration(v.duration)} color=\"neutral\" />}\n {v.frameRate > 0 && <Chip label={fmt(Math.round(v.frameRate), \" fps\")} color=\"neutral\" />}\n {v.hdr && <Chip label=\"HDR\" color=\"purple\" />}\n </>\n )}\n {info.audio && <Chip label={info.audio.codec || \"sem áudio\"} color=\"neutral\" />}\n <Chip label={formatBytes(info.fileSize)} color=\"neutral\" />\n </div>\n\n {/* Avisos de incompatibilidade */}\n {issues.map((issue, i) => {\n const msg = issueMessage(issue);\n return (\n <div key={i} style={{ display: \"flex\", gap: 8, padding: \"10px 14px\", background: \"rgba(239,68,68,0.07)\", border: \"1px solid rgba(239,68,68,0.22)\", borderRadius: 10 }}>\n <span style={{ fontSize: 14, flexShrink: 0 }}>🚫</span>\n <div>\n <div style={{ fontSize: 12, fontWeight: 700, color: \"#f87171\", marginBottom: 2 }}>{msg.title}</div>\n <div style={{ fontSize: 11, color: \"rgba(255,255,255,0.5)\", lineHeight: 1.55 }}>{msg.detail}</div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction Chip({ label, color }: { label: string; color: \"neutral\" | \"purple\" }) {\n const s: React.CSSProperties = color === \"purple\"\n ? { background: \"rgba(168,85,247,0.12)\", border: \"1px solid rgba(168,85,247,0.25)\", color: \"#c084fc\" }\n : { background: \"rgba(255,255,255,0.05)\", border: \"1px solid rgba(255,255,255,0.1)\", color: \"rgba(255,255,255,0.6)\" };\n return (\n <span style={{ ...s, fontSize: 11, fontWeight: 600, borderRadius: 6, padding: \"2px 8px\", display: \"inline-block\" }}>\n {label}\n </span>\n );\n}\n","import MediaInfoFactory from \"mediainfo.js\";\n\nexport interface VideoTrackInfo {\n codec: string; // e.g. \"AV1\", \"AVC\", \"HEVC\", \"VP9\"\n width: number;\n height: number;\n duration: number; // seconds\n bitrate: number; // bits/s\n frameRate: number;\n hdr: boolean; // HDR10 / HLG / Dolby Vision\n colorSpace: string; // e.g. \"BT.709\", \"BT.2020\"\n}\n\nexport interface AudioTrackInfo {\n codec: string; // e.g. \"AAC\", \"AC3\", \"EAC3\", \"OPUS\", \"MP3\"\n channels: number;\n sampleRate: number;\n}\n\nexport interface VideoFileInfo {\n container: string; // e.g. \"MPEG-4\", \"Matroska\", \"WebM\"\n video: VideoTrackInfo | null;\n audio: AudioTrackInfo | null;\n fileSize: number;\n}\n\nexport type VideoCompatIssue =\n | { code: \"unsupported_codec\"; codec: string }\n | { code: \"unsupported_container\"; container: string };\n\nconst UNSUPPORTED_CODECS = [\"AV1\", \"VP8\", \"VP9\", \"MPEG-1 Video\", \"MPEG-2 Video\", \"Theora\", \"RealVideo\"];\nconst UNSUPPORTED_CONTAINERS = [\"FLV\", \"Flash Video\", \"RealMedia\", \"ASF\"];\n\nexport function getCompatIssues(info: VideoFileInfo): VideoCompatIssue[] {\n const issues: VideoCompatIssue[] = [];\n if (info.video && UNSUPPORTED_CODECS.includes(info.video.codec)) {\n issues.push({ code: \"unsupported_codec\", codec: info.video.codec });\n }\n if (UNSUPPORTED_CONTAINERS.some((c) => info.container.includes(c))) {\n issues.push({ code: \"unsupported_container\", container: info.container });\n }\n return issues;\n}\n\nexport async function analyzeVideoFile(file: File): Promise<VideoFileInfo> {\n const wasmUrl = `https://cdn.jsdelivr.net/npm/mediainfo.js@0.3.7/dist/MediaInfoModule.wasm`;\n const mediainfo = await MediaInfoFactory({ format: \"object\", locateFile: () => wasmUrl });\n\n const getSize = () => file.size;\n const readChunk = (chunkSize: number, offset: number): Promise<Uint8Array> =>\n new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (e) => resolve(new Uint8Array(e.target!.result as ArrayBuffer));\n reader.onerror = reject;\n reader.readAsArrayBuffer(file.slice(offset, offset + chunkSize));\n });\n\n const result = await mediainfo.analyzeData(getSize, readChunk);\n mediainfo.close();\n\n const tracks = (result as { media?: { track?: unknown[] } }).media?.track ?? [];\n\n const general = tracks.find((t: unknown) => (t as Record<string, unknown>)[\"@type\"] === \"General\") as Record<string, unknown> | undefined;\n const video = tracks.find((t: unknown) => (t as Record<string, unknown>)[\"@type\"] === \"Video\") as Record<string, unknown> | undefined;\n const audio = tracks.find((t: unknown) => (t as Record<string, unknown>)[\"@type\"] === \"Audio\") as Record<string, unknown> | undefined;\n\n const str = (v: unknown) => (typeof v === \"string\" ? v : \"\");\n const num = (v: unknown) => parseFloat(str(v)) || 0;\n\n const hdrFormats = str(video?.[\"HDR_Format\"] ?? video?.[\"transfer_characteristics\"]);\n const isHdr = hdrFormats.length > 0 && !hdrFormats.toLowerCase().includes(\"bt.709\") && !hdrFormats.toLowerCase().includes(\"sdr\");\n\n return {\n container: str(general?.[\"Format\"]) || file.type || \"Unknown\",\n fileSize: file.size,\n video: video ? {\n codec: str(video[\"Format\"]),\n width: num(video[\"Width\"]),\n height: num(video[\"Height\"]),\n duration: num(video[\"Duration\"]) / 1000,\n bitrate: num(video[\"BitRate\"]),\n frameRate: num(video[\"FrameRate\"]),\n hdr: isHdr,\n colorSpace: str(video[\"colour_primaries\"]) || str(video[\"ColorSpace\"]),\n } : null,\n audio: audio ? {\n codec: str(audio[\"Format\"]),\n channels: num(audio[\"Channels\"]),\n sampleRate: num(audio[\"SamplingRate\"]),\n } : null,\n };\n}\n","\"use client\";\n\nimport { useState, useCallback, type CSSProperties } from \"react\";\nimport { useMultipartUpload } from \"@geekapps/silo-nextjs\";\nimport type { VideoUploadOptions } from \"@geekapps/silo-nextjs\";\nimport type { VideoUploaderProps } from \"./types.js\";\nimport { DropZone } from \"./components/DropZone.js\";\nimport { ProgressBar } from \"./components/ProgressBar.js\";\nimport { VideoOptions } from \"./components/VideoOptions.js\";\nimport { VideoCompatAlert } from \"./components/VideoCompatAlert.js\";\nimport { formatBytes } from \"./utils/format.js\";\nimport { resolveTheme, themeToVars } from \"./utils/theme.js\";\nimport { analyzeVideoFile, getCompatIssues, type VideoFileInfo, type VideoCompatIssue } from \"./utils/videoInfo.js\";\n\nconst DEFAULT_VIDEO_OPTS: VideoUploadOptions = {\n thumbnails: true, storyboard: false, autoCaptions: false,\n separateAudio: false, codec: \"h264\", transcoding: \"auto\",\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 envio…\";\n if (progress < 20) return \"Iniciando envio…\";\n if (progress < 50) return \"Enviando vídeo…\";\n if (progress < 80) return \"Ainda enviando…\";\n if (progress < 97) return \"Quase terminando…\";\n return \"Finalizando…\";\n}\n\nexport function VideoUploader({\n bucket,\n expiresIn,\n onUpload,\n onError,\n className = \"\",\n style,\n disabled = false,\n maxSize,\n accept = \"video/*\",\n showPreview = true,\n showVideoOptions = false,\n video,\n theme,\n renderIcon,\n renderProgress,\n renderSuccess,\n renderError,\n children,\n}: VideoUploaderProps) {\n const { state, upload, pause, resume, abort, reset } = useMultipartUpload(bucket);\n const [preview, setPreview] = useState<string | null>(null);\n const [videoOpts, setVideoOpts] = useState<VideoUploadOptions>(() => createInitialVideoOpts(video));\n const [stagedFile, setStagedFile] = useState<File | null>(null);\n const [videoInfo, setVideoInfo] = useState<VideoFileInfo | null>(null);\n const [videoIssues, setVideoIssues] = useState<VideoCompatIssue[]>([]);\n const [analyzing, setAnalyzing] = useState(false);\n const t = resolveTheme(theme);\n const vars = themeToVars(t);\n\n const doUpload = useCallback(async (file: File, opts: VideoUploadOptions) => {\n if (showPreview) setPreview(URL.createObjectURL(file));\n try {\n const result = await upload(file, { ...(bucket !== undefined && { bucket }), video: 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 (showVideoOptions) {\n setVideoOpts(createInitialVideoOpts(video));\n setVideoInfo(null);\n setVideoIssues([]);\n setStagedFile(file);\n if (showPreview) setPreview(URL.createObjectURL(file));\n setAnalyzing(true);\n try {\n const info = await analyzeVideoFile(file);\n setVideoInfo(info);\n setVideoIssues(getCompatIssues(info));\n } catch {\n // silently skip if analysis fails — don't block the upload\n } finally {\n setAnalyzing(false);\n }\n } else {\n await doUpload(file, video ?? videoOpts);\n }\n }, [showVideoOptions, video, videoOpts, 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 <video src={preview} className=\"max-w-full max-h-[180px] rounded-lg\" muted playsInline />\n <span className=\"text-[12px] text-slate-400\">Clique ou arraste para trocar o vídeo</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=\"M15 10l4.553-2.069A1 1 0 0121 8.878v6.244a1 1 0 01-1.447.894L15 14M3 8a2 2 0 012-2h8a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2V8z\" />\n </svg>\n )}\n {children ?? (\n <>\n <span className=\"text-slate-900 font-bold text-[15px]\">Arraste seu vídeo aqui</span>\n <span className=\"text-slate-500 text-[13px]\">ou clique para escolher do seu dispositivo</span>\n <span className=\"text-slate-400 text-[12px]\">\n MP4, MOV, MKV, WebM{maxSize ? ` · Máx ${formatBytes(maxSize)}` : \"\"}\n </span>\n </>\n )}\n </div>\n )}\n </DropZone>\n\n {showVideoOptions && stagedFile && !isUploading && state.status !== \"done\" && (\n <>\n {preview && (\n <div className=\"border border-slate-200 rounded-xl overflow-hidden bg-black\">\n <video src={preview} className=\"w-full max-h-[200px] block\" muted playsInline controls />\n </div>\n )}\n {(analyzing || videoInfo) && (\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]\">📋 Informações do arquivo</div>\n <div className=\"p-3.5\">\n <VideoCompatAlert info={videoInfo!} issues={videoIssues} analyzing={analyzing} />\n </div>\n </div>\n )}\n {videoIssues.length === 0 && (\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 <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 hover:bg-slate-100\"\n onClick={() => { setStagedFile(null); setPreview(null); setVideoInfo(null); setVideoIssues([]); setVideoOpts(createInitialVideoOpts(video)); }}\n >\n Cancelar\n </button>\n <button\n disabled={videoIssues.length > 0 || analyzing}\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 hover:opacity-90 disabled:opacity-40 disabled:cursor-not-allowed\"\n onClick={() => { const f = stagedFile; setStagedFile(null); setVideoInfo(null); setVideoIssues([]); void doUpload(f, videoOpts); setVideoOpts(createInitialVideoOpts(video)); }}\n >\n Enviar vídeo\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 <div className=\"flex gap-2 items-center\">\n <span className=\"text-[13px] font-bold text-indigo-500\">{progress}%</span>\n <button\n className=\"inline-flex items-center justify-center text-[11px] font-semibold py-0.5 px-2 rounded-lg border border-slate-200 bg-transparent text-slate-900 cursor-pointer hover:bg-slate-100\"\n onClick={pause}\n >\n Pausar\n </button>\n </div>\n </div>\n <ProgressBar progress={progress} />\n <span className=\"text-[11px] text-slate-400\">O processamento do vídeo começa automaticamente após o envio</span>\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 }), video: videoOpts })}\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 flex-col gap-2 px-4 py-3.5 bg-green-500/[0.08] rounded-xl border border-green-500/20\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-2xl\">✅</span>\n <div className=\"flex-1\">\n <div className=\"font-bold text-sm text-green-700\">Vídeo enviado 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 outro\n </button>\n </div>\n <div className=\"text-[12px] text-slate-500 px-3 py-2 rounded-lg bg-green-500/[0.06] border border-green-500/15\">\n 🎬 Seu vídeo está sendo processado em segundo plano. Isso pode levar alguns minutos dependendo do tamanho.\n </div>\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 o vídeo</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"]}