diff --git a/src/app/globals.css b/src/app/globals.css index 408e2d8e..8711a4bf 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -6,9 +6,9 @@ :root { --bg: #ffffff; --surface: #f1f5f9; - --border: #cbd5e1; + --border: #94a3b8; --text: #0f172a; - --muted: #64748b; + --muted: #475569; --accent: #3b82f6; --accent-hover: #1d4ed8; --accent-muted: rgba(59, 130, 246, 0.12); diff --git a/src/components/ExportSettings.tsx b/src/components/ExportSettings.tsx index 6eee9b9b..3b5986c9 100644 --- a/src/components/ExportSettings.tsx +++ b/src/components/ExportSettings.tsx @@ -44,13 +44,13 @@ export default function ExportSettings({ return ( <> -
+
-
+
@@ -162,19 +162,19 @@ export default function ExportSettings({ }) } aria-label="Enable video stabilization" - className="w-full accent-film-600 cursor-pointer" + className="w-4 h-4 accent-film-600 cursor-pointer" />
-

+

Reduce camera shake

-
+
-

+

Reduce low-light video grain

{ + e.preventDefault(); + setDragging(false); + + const file = e.dataTransfer.files?.[0]; + + if (file) { + handleFile(file); + } +}; + // ── Drop zone (inner) ───────────────────────────────── +const DropZone = () => ( +
{ + e.preventDefault(); + setDragging(true); + }} + onDragLeave={() => setDragging(false)} + onDrop={handleDrop} + onClick={() => inputRef.current?.click()} + onKeyDown={(e) => { + if (e.key === "Enter" || e.key === " ") { + inputRef.current?.click(); + } + }} + className={cn( + "group flex flex-col items-center justify-center gap-5 py-14 px-6", + "border-2 border-dashed rounded-xl cursor-pointer transition-all duration-300 relative overflow-hidden", + dragging + ? "border-[var(--accent)] bg-[var(--accent-muted)] scale-[1.02] shadow-[var(--shadow)] ring-4 ring-[var(--accent-muted)]" + : "border-[var(--border)] bg-[var(--surface)] hover:border-film-400 hover:bg-film-50/40 shadow-sm" + )} + > + {dragging && ( +
+ )} + + {/* Upload Animation */} +
+ +
+ + {/* Main Text */} +
+

+ {dragging ? "Release to upload" : "Drag & Drop your video here"} +

+ +

+ or click to browse +

+ +

+ Ctrl+O / Cmd+O +

+
- // ── Drop zone (inner) handler ───────────────────────── - const handleDrop = (e: React.DragEvent) => { - e.preventDefault(); - setDragging(false); - const file = e.dataTransfer.files?.[0]; - if (file) handleFile(file); - }; + {/* File Types */} +
+ + MP4 / MOV / AVI / WebM +
+ + {/* Support Text */} +

+ Supports MP4, MOV, AVI, MKV, WebM, and most video formats up to 2GB +

+ + {/* Error */} + {fileError && ( +

+ {fileError} +

+ )} + + { + const f = e.target.files?.[0]; + if (f) handleFile(f); + }} + /> +
+); // ── File info (shown after upload) ─────────────────── const FileInfo = () => ( @@ -190,75 +274,8 @@ export default function FileUpload({ ); // ── Drop zone (inner) ───────────────────────────────── - const DropZone = () => ( -
{ - e.preventDefault(); - setDragging(true); - }} - onDragLeave={() => setDragging(false)} - onDrop={handleDrop} - onClick={() => inputRef.current?.click()} - onKeyDown={(e) => { - if (e.key === "Enter" || e.key === " ") { - inputRef.current?.click(); - } - }} - className={cn( - "group flex flex-col items-center justify-center gap-4 py-12 px-6", - "border-2 border-dashed rounded-xl cursor-pointer transition-all duration-300 relative overflow-hidden", - dragging - ? "border-[var(--accent)] bg-[var(--accent-muted)] scale-[1.02] shadow-[var(--shadow)] ring-4 ring-[var(--accent-muted)]" - : "border-[var(--border)] bg-[var(--bg)] hover:border-film-400 hover:bg-film-50/40" - )} - > - {dragging && ( -
- )} - -
- -
- -
-

- {dragging ? "Release to upload" : "Drag & Drop your video here"} -

-

or click to browse

-

- Ctrl+O / Cmd+O -

-
-
- - MP4 / MOV / AVI / WebM -
- -

- Supports: MP4, MOV, AVI, MKV, WebM, and most video formats up to 2GB -

- - {fileError && ( -

{fileError}

- )} - - { - const f = e.target.files?.[0]; - if (f) handleFile(f); - }} - /> -
- ); + return ( <> diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index c6006f0d..15b2cd7c 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -16,18 +16,18 @@ export default function Footer() { const [isExpanded, setIsExpanded] = useState(false); return ( -