{"id":1302,"date":"2026-03-23T19:22:07","date_gmt":"2026-03-23T19:22:07","guid":{"rendered":"https:\/\/primetoolhub.com\/?page_id=1302"},"modified":"2026-08-14T03:31:24","modified_gmt":"2026-08-14T03:31:24","slug":"turbo-video-editor","status":"publish","type":"page","link":"https:\/\/schoolict.net\/tools\/turbo-video-editor\/","title":{"rendered":"Fast Offline Turbo Video Editor &amp; Compressor (Turbo Speed)"},"content":{"rendered":"\n<div class=\"pth-hero-section\">\n    <div class=\"pth-hero-content\">\n        <h2>Turbo Video Editor <\/h2>\n        <p>Need a Fast Offline Turbo Video Editor? Experience desktop-grade speeds with our multi-threaded, 100% offline video studio. Compress, trim, reverse, and convert instantly.<\/p>\n\n        <div id=\"pth-toc-placeholder\"><\/div>\n    <\/div>\n\n   <div class=\"pth-hero-image\">\n    <img data-no-lazy=\"1\" src=\"https:\/\/schoolict.net\/tools\/wp-content\/uploads\/2026\/05\/offline-Turbo-Video-Editor-800x447.jpeg\" width=\"800\" height=\"447\" alt=\"offline Turbo Video Editor\" fetchpriority=\"high\" loading=\"eager\" decoding=\"async\" style=\"width:100%; height:auto; display:block;\">\n  <\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Table of Contents<\/h2><nav><ul><li><a href=\"#\ud83d\udd34-a-full-video-workflow-without-uploading-anything\">\ud83d\udd34\u00a0A Full Video Workflow Without Uploading Anything<\/a><\/li><li><a href=\"#\ud83d\udfe1-what-you-can-actually-do-here\">\ud83d\udfe1\u00a0What You Can Actually Do Here<\/a><\/li><li><a href=\"#\ud83d\udfe2-when-this-tool-is-the-right-choice-and-when-it-isnt\">\ud83d\udfe2\u00a0When This Tool Is the Right Choice (and When It Isn&#8217;t)<\/a><\/li><\/ul><\/nav><\/div>\n\n\n<div id=\"pth-vs-wrapper\">\r\n\r\n<style data-no-optimize=\"1\">\r\n#pth-vs-wrapper *,#pth-vs-wrapper *::before,#pth-vs-wrapper *::after{box-sizing:border-box;min-width:0;}\r\n#pth-vs-wrapper{font-family:'Inter',system-ui,sans-serif;background:#f8fafc;border-radius:16px;padding:20px;color:#1e293b;font-weight:500;opacity:1;display:block;}\r\n.pth-vs-header{margin-bottom:16px;}\r\n.pth-vs-meta-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:10px;}\r\n.pth-vs-version-badge{background:#eff6ff;color:#1d4ed8;font-size:.72rem;font-weight:700;padding:3px 10px;border-radius:20px;border:1px solid #bfdbfe;}\r\n.pth-vs-status-offline{background:#f0fdf4;color:#047857;font-size:.72rem;font-weight:700;padding:3px 10px;border-radius:20px;border:1px solid #bbf7d0;}\r\n.pth-vs-header h2{color:#1d4ed8;font-size:1.5rem;font-weight:800;margin:0 0 6px;}\r\n.pth-vs-header p{color:#334155;font-size:.88rem;margin:0;font-weight:500;}\r\n.pth-vs-tabs{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:16px;border-bottom:2px solid #e2e8f0;padding-bottom:10px;}\r\n.pth-vs-tab-btn{background:#fff;border:2px solid #e2e8f0;color:#334155;font-size:.85rem;font-weight:700;padding:9px 16px;border-radius:8px;cursor:pointer;font-family:'Inter',system-ui,sans-serif;white-space:nowrap;transition:all .15s;}\r\n.pth-vs-tab-btn:hover{border-color:#2563eb;color:#1d4ed8;background:#eff6ff;}\r\n.pth-vs-tab-btn.pth-vs-active{background:#2563eb;border-color:#2563eb;color:#fff;}\r\n.pth-vs-panel{display:none;opacity:1;}\r\n.pth-vs-panel.pth-vs-panel-active{display:block;}\r\n.pth-vs-empty{background:#fff;border:1px dashed #cbd5e1;border-radius:12px;padding:30px 20px;text-align:center;color:#334155;font-weight:600;min-height:120px;}\r\n@media(max-width:768px){#pth-vs-wrapper{padding:10px;border-radius:0;background:transparent;}.pth-vs-tab-btn{font-size:.78rem;padding:7px 12px;}.pth-vs-header h2{font-size:1.2rem;}}\r\n<\/style>\r\n\r\n<div class=\"pth-vs-header\">\r\n  <div class=\"pth-vs-meta-bar\">\r\n    <span class=\"pth-vs-version-badge\">v1.0<\/span>\r\n    <span class=\"pth-vs-status-offline\">\ud83d\udd12 100% Offline<\/span>\r\n  <\/div>\r\n  <h2>\ud83c\udfac Video Studio<\/h2>\r\n  <p>Multi-clip timeline editor plus 25+ quick video tools \u2014 trim, crop, convert, compress and more. No upload, no login.<\/p>\r\n<\/div>\r\n\r\n<div class=\"pth-vs-tabs\" role=\"tablist\" aria-label=\"Video Studio tools\">\r\n  <button class=\"pth-vs-tab-btn pth-vs-active\"  data-tab=\"quick\"    role=\"tab\" aria-selected=\"true\">\u26a1 Quick Tools<\/button>\r\n  <button class=\"pth-vs-tab-btn\"                data-tab=\"timeline\" role=\"tab\" aria-selected=\"false\">\ud83c\udf9e\ufe0f Timeline Editor<\/button>\r\n<\/div>\r\n\r\n<div class=\"pth-vs-panel pth-vs-panel-active\" id=\"pth-vs-tab-quick\" role=\"tabpanel\">\r\n  <div class=\"pth-vs-empty\" id=\"pth-vs-empty-quick\">Loading Quick Tools\u2026<\/div>\r\n<\/div>\r\n<div class=\"pth-vs-panel\" id=\"pth-vs-tab-timeline\" role=\"tabpanel\">\r\n  <div class=\"pth-vs-empty\" id=\"pth-vs-empty-timeline\">Loading Timeline Editor\u2026<\/div>\r\n<\/div>\r\n\r\n<\/div>\r\n<script data-no-optimize=\"1\" data-no-minify=\"1\" data-cfasync=\"false\">\r\n(function () {\r\n  'use strict';\r\n  window.pthVS = window.pthVS || {};\r\n  window.pthVS.activeTab = 'quick'; \/\/ Changed default tab to 'quick'\r\n\r\n  function initTabs() {\r\n    var root = document.getElementById('pth-vs-wrapper');\r\n    if (!root) return;\r\n    var btns = root.querySelectorAll('.pth-vs-tab-btn');\r\n    btns.forEach(function (btn) {\r\n      btn.addEventListener('click', function () {\r\n        var tab = btn.getAttribute('data-tab');\r\n        btns.forEach(function (b) {\r\n          b.classList.remove('pth-vs-active');\r\n          b.setAttribute('aria-selected', 'false');\r\n        });\r\n        btn.classList.add('pth-vs-active');\r\n        btn.setAttribute('aria-selected', 'true');\r\n        root.querySelectorAll('.pth-vs-panel').forEach(function (p) {\r\n          p.classList.remove('pth-vs-panel-active');\r\n        });\r\n        var panel = document.getElementById('pth-vs-tab-' + tab);\r\n        if (panel) panel.classList.add('pth-vs-panel-active');\r\n        window.pthVS.activeTab = tab;\r\n        document.dispatchEvent(new CustomEvent('pthVSTabActive', { detail: { tab: tab } }));\r\n      });\r\n    });\r\n\r\n    \/* Deep-link: ?tab=timeline \/ ?tab=quick *\/\r\n    try {\r\n      var want = new URLSearchParams(window.location.search).get('tab');\r\n      if (want === 'timeline' || want === 'quick') {\r\n        var target = root.querySelector('.pth-vs-tab-btn[data-tab=\"' + want + '\"]');\r\n        if (target) target.click();\r\n      }\r\n    } catch (e) {}\r\n  }\r\n\r\n  function runInit() {\r\n    if (window.pthVS.shellReady) return;\r\n    if (!document.getElementById('pth-vs-wrapper')) return;\r\n    window.pthVS.shellReady = true;\r\n    initTabs();\r\n  }\r\n\r\n  runInit();\r\n  if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', runInit); }\r\n  window.addEventListener('load', function () { setTimeout(runInit, 50); });\r\n  if (!window.pthVS.shellReady && typeof MutationObserver !== 'undefined') {\r\n    var obs = new MutationObserver(function () {\r\n      if (document.getElementById('pth-vs-wrapper')) { obs.disconnect(); runInit(); }\r\n    });\r\n    obs.observe(document.body || document.documentElement, { childList: true, subtree: true });\r\n    setTimeout(function () { obs.disconnect(); }, 10000);\r\n  }\r\n})();\r\n<\/script>\n\n\n<script src=\"https:\/\/unpkg.com\/@ffmpeg\/ffmpeg@0.11.6\/dist\/ffmpeg.min.js\" data-no-optimize=\"1\"><\/script>\r\n\r\n<style>\r\n\/* --- SCOPED CSS & BOX SIZING RECOVERY --- *\/\r\n#pth-ve-wrapper { box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; color: #0f172a; max-width: 1450px; margin: 0 auto; line-height: 1.6; }\r\n#pth-ve-wrapper *, #pth-ve-wrapper *::before, #pth-ve-wrapper *::after { box-sizing: inherit; }\r\n.pth-hidden { display: none !important; }\r\n\r\n\/* Topbar *\/\r\n.pth-ve-topbar { display: flex; justify-content: space-between; align-items: center; background: #ffffff; border: 1px solid #e2e8f0; padding: 16px 24px; border-radius: 12px; margin-bottom: 24px; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.05); flex-wrap: wrap; gap: 15px; }\r\n.pth-ve-title-container { display: flex; align-items: center; gap: 16px; }\r\n.pth-ve-icon { width: 48px; height: 48px; background: #2563eb; color: #fff; border-radius: 12px; display: flex; justify-content: center; align-items: center; font-size: 22px; box-shadow: 0 4px 10px rgba(37, 99, 235, 0.3); }\r\n.pth-ve-title { margin: 0; font-size: 22px; font-weight: 800; color: #0f172a; }\r\n.pth-ve-badges { display: flex; gap: 8px; margin-top: 4px; }\r\n.pth-ve-badge { background: #eff6ff; color: #2563eb; padding: 2px 8px; border-radius: 20px; font-size: 11px; font-weight: 800; border: 1px solid #bfdbfe; }\r\n.pth-ve-fw-btn { background: #f1f5f9; border: 1px solid #cbd5e1; color: #334155; padding: 8px 16px; border-radius: 8px; font-weight: 700; font-size: 13px; cursor: pointer; transition: 0.2s; display: flex; align-items: center; gap: 8px; }\r\n.pth-ve-fw-btn:hover { background: #e2e8f0; color: #0f172a; }\r\n\r\n\/* Grid Layout *\/\r\n.pth-ve-grid { display: grid; grid-template-columns: 1.8fr 1fr; gap: 24px; transition: all 0.3s ease; }\r\n@media (max-width: 992px) { .pth-ve-grid { grid-template-columns: 1fr; } }\r\n\r\n\/* Cards *\/\r\n.pth-ve-card { background: #ffffff; border: 1px solid #e2e8f0; border-radius: 12px; padding: 20px; box-shadow: 0 2px 4px rgba(0,0,0,0.02); margin-bottom: 24px; display: flex; flex-direction: column; }\r\n.pth-ve-card-title { font-size: 13px; font-weight: 800; color: #64748b; margin: 0 0 16px 0; display: flex; align-items: center; justify-content: space-between; text-transform: uppercase; border-bottom: 2px solid #f1f5f9; padding-bottom: 10px; letter-spacing: 0.5px;}\r\n\r\n\/* Video Player *\/\r\n.pth-ve-player-container { background: #000; border-radius: 12px; overflow: hidden; aspect-ratio: 16\/9; position: relative; box-shadow: inset 0 0 20px rgba(0,0,0,0.8); border: 2px solid #1e293b; margin-bottom: 20px; }\r\n.pth-ve-video { width: 100%; height: 100%; object-fit: contain; transition: filter 0.2s, transform 0.2s; }\r\n.pth-ve-watermark { position: absolute; bottom: 15px; right: 15px; opacity: 0.4; color: #fff; font-size: 12px; font-weight: 800; text-shadow: 1px 1px 2px #000; pointer-events: none; letter-spacing: 1px; }\r\n\r\n\/* Processing Overlay *\/\r\n.pth-ve-overlay { position: absolute; inset: 0; background: rgba(15,23,42,0.9); z-index: 50; display: flex; flex-direction: column; align-items: center; justify-content: center; backdrop-filter: blur(4px); }\r\n.pth-ve-spinner { border: 4px solid rgba(255,255,255,0.1); border-left-color: #3b82f6; border-radius: 50%; width: 40px; height: 40px; animation: pthVeSpin 1s linear infinite; margin-bottom: 15px; }\r\n@keyframes pthVeSpin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\r\n.pth-ve-log-box { width: 80%; height: 120px; background: #0f172a; color: #4ade80; border: 1px solid #334155; border-radius: 8px; padding: 10px; font-family: monospace; font-size: 11px; overflow-y: auto; text-align: left; }\r\n\r\n\/* Storyboard Area *\/\r\n.pth-ve-sequence-area { background: #f8fafc; border: 1px dashed #cbd5e1; border-radius: 12px; padding: 15px; min-height: 120px; display: flex; gap: 10px; overflow-x: auto; align-items: center; }\r\n.pth-ve-empty-seq { width: 100%; text-align: center; color: #94a3b8; font-size: 14px; font-weight: 600; }\r\n.pth-ve-seq-item { background: #ffffff; border: 2px solid #e2e8f0; border-radius: 8px; width: 140px; flex-shrink: 0; padding: 10px; cursor: pointer; transition: 0.2s; position: relative; box-shadow: 0 2px 4px rgba(0,0,0,0.05); }\r\n.pth-ve-seq-item:hover { border-color: #94a3b8; transform: translateY(-2px); }\r\n.pth-ve-seq-item.active { border-color: #3b82f6; box-shadow: 0 0 0 3px rgba(59,130,246,0.2); }\r\n.pth-ve-seq-thumb { width: 100%; height: 60px; background: #1e293b; border-radius: 4px; margin-bottom: 8px; display: flex; align-items: center; justify-content: center; color: #64748b; overflow: hidden; }\r\n.pth-ve-seq-name { font-size: 11px; font-weight: 700; color: #334155; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-align: center; }\r\n.pth-ve-seq-remove { position: absolute; top: -8px; right: -8px; background: #ef4444; color: #fff; width: 20px; height: 20px; border-radius: 50%; font-size: 10px; display: flex; align-items: center; justify-content: center; cursor: pointer; border: 2px solid #fff; font-weight: bold; }\r\n\r\n\/* Media Bin *\/\r\n.pth-ve-btn-import { width: 100%; padding: 16px; border: 2px dashed #94a3b8; background: #f8fafc; border-radius: 12px; font-size: 14px; font-weight: 800; color: #475569; cursor: pointer; transition: 0.2s; display: flex; flex-direction: column; align-items: center; gap: 8px; margin-bottom: 16px; }\r\n.pth-ve-btn-import:hover { background: #eff6ff; border-color: #3b82f6; color: #2563eb; }\r\n.pth-ve-media-list { display: flex; flex-direction: column; gap: 8px; max-height: 200px; overflow-y: auto; padding-right: 5px; }\r\n.pth-ve-media-item { display: flex; justify-content: space-between; align-items: center; background: #f1f5f9; padding: 10px 12px; border-radius: 8px; border: 1px solid #e2e8f0; }\r\n.pth-ve-media-name { font-size: 12px; font-weight: 700; color: #1e293b; max-width: 150px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\r\n.pth-ve-btn-add { background: #3b82f6; color: #fff; border: none; padding: 4px 10px; border-radius: 6px; font-size: 11px; font-weight: 800; cursor: pointer; transition: 0.2s; }\r\n.pth-ve-btn-add:hover { background: #2563eb; }\r\n\r\n\/* Inspector *\/\r\n.pth-ve-inspector { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 12px; padding: 16px; margin-bottom: 15px; }\r\n.pth-ve-input-group { margin-bottom: 15px; padding-bottom: 15px; border-bottom: 1px solid #e2e8f0; }\r\n.pth-ve-input-group:last-child { margin-bottom: 0; padding-bottom: 0; border-bottom: none; }\r\n.pth-ve-label { display: block; font-size: 11px; font-weight: 800; color: #475569; text-transform: uppercase; margin-bottom: 8px; }\r\n.pth-ve-grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }\r\n.pth-ve-input { width: 100%; padding: 10px; border: 1px solid #cbd5e1; border-radius: 8px; font-family: monospace; font-size: 14px; font-weight: 700; color: #0f172a; text-align: center; outline: none; transition: 0.2s; background: #fff;}\r\n.pth-ve-input:focus { border-color: #3b82f6; box-shadow: 0 0 0 3px rgba(59,130,246,0.1); }\r\n.pth-ve-range { width: 100%; accent-color: #3b82f6; cursor: pointer; }\r\n\r\n\/* Actions *\/\r\n.pth-ve-action-btn { width: 100%; padding: 14px; border-radius: 10px; font-size: 14px; font-weight: 800; border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 8px; transition: 0.2s; color: #fff; box-shadow: 0 4px 6px rgba(0,0,0,0.1); }\r\n.pth-ve-action-btn:hover { transform: translateY(-2px); box-shadow: 0 6px 12px rgba(0,0,0,0.15); }\r\n.pth-ve-btn-export { background: linear-gradient(135deg, #10b981, #059669); margin-top: 10px; font-size: 16px; padding: 16px; }\r\n.pth-ve-btn-export:disabled { background: #94a3b8; cursor: not-allowed; transform: none; box-shadow: none; }\r\n\r\n\/* --- v2.0 additions: thumbnails, mute, split, note --- *\/\r\n.pth-ve-thumb-img { width: 100%; height: 100%; object-fit: cover; display: block; }\r\n.pth-ve-seq-badges { position: absolute; top: 4px; left: 4px; display: flex; gap: 3px; }\r\n.pth-ve-seq-badge-ic { background: rgba(15,23,42,0.85); color: #fff; font-size: 10px; line-height: 1; padding: 3px 4px; border-radius: 4px; }\r\n.pth-ve-media-thumb { width: 40px; height: 24px; border-radius: 4px; object-fit: cover; background: #1e293b; flex-shrink: 0; }\r\n.pth-ve-mute-row { display: flex; align-items: center; gap: 8px; margin-top: 10px; }\r\n.pth-ve-mute-row input { width: 16px; height: 16px; accent-color: #dc2626; cursor: pointer; }\r\n.pth-ve-mute-row label { font-size: 12px; font-weight: 700; color: #334155; cursor: pointer; margin: 0; text-transform: none; }\r\n.pth-ve-btn-split { background: linear-gradient(135deg, #0ea5e9, #2563eb); margin: 12px 0 0; }\r\n.pth-ve-note { position: fixed; bottom: 20px; right: 20px; background: #0f172a; color: #fff; padding: 12px 18px; border-radius: 10px; font-size: 13px; font-weight: 700; box-shadow: 0 10px 25px rgba(0,0,0,0.25); z-index: 9999; opacity: 0; transform: translateY(10px); transition: opacity .2s, transform .2s; pointer-events: none; max-width: 300px; }\r\n.pth-ve-note.show { opacity: 1; transform: translateY(0); }\r\n.pth-ve-note.err { background: #991b1b; }\r\n.pth-ve-note.ok { background: #047857; }\r\n<\/style>\r\n\r\n<div id=\"pth-ve-wrapper\">\r\n    \r\n    <div class=\"pth-ve-topbar\">\r\n        <div class=\"pth-ve-title-container\">\r\n            <div class=\"pth-ve-icon\">\ud83c\udfac<\/div>\r\n            <div>\r\n                <h2 class=\"pth-ve-title\">Video Editor Studio<\/h2>\r\n                <div class=\"pth-ve-badges\">\r\n                    <span class=\"pth-ve-badge\">100% Offline<\/span>\r\n                    <span class=\"pth-ve-badge\">MP4 Export<\/span>\r\n                    <span class=\"pth-ve-badge\">Split & Thumbnails<\/span>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n        <div style=\"display:flex; gap:12px; align-items:center; flex-wrap:wrap;\">\r\n            <button id=\"pth-ve-fw-toggle\" class=\"pth-ve-fw-btn\">\u26f6 Full Width<\/button>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"pth-ve-grid\" id=\"pth-ve-main-grid\">\r\n        \r\n        <div class=\"pth-ve-main-col\">\r\n            <div class=\"pth-ve-card\">\r\n                <h3 class=\"pth-ve-card-title\"><span>Preview Window<\/span><\/h3>\r\n                \r\n                <div class=\"pth-ve-player-container\">\r\n                    <video id=\"pth-ve-player\" class=\"pth-ve-video\" controls><\/video>\r\n                    <div class=\"pth-ve-watermark\">primetoolhub.com<\/div>\r\n                    \r\n                    <div id=\"pth-ve-overlay\" class=\"pth-ve-overlay pth-hidden\">\r\n                        <div class=\"pth-ve-spinner\"><\/div>\r\n                        <div id=\"pth-ve-overlay-title\" style=\"color:#fff; font-weight:800; letter-spacing:1px; margin-bottom:10px;\">RENDERING FINAL VIDEO...<\/div>\r\n                        <div id=\"pth-ve-log\" class=\"pth-ve-log-box\">Initializing FFmpeg Engine...<\/div>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <h3 class=\"pth-ve-card-title\" style=\"margin-top: 10px;\">\r\n                    <span>Storyboard Sequence (Drag to reorder)<\/span> \r\n                    <span id=\"pth-ve-seq-count\" style=\"background:#f1f5f9; color:#64748b; padding:2px 8px; border-radius:10px; font-size:11px;\">0 Clips<\/span>\r\n                <\/h3>\r\n                \r\n                <div class=\"pth-ve-sequence-area\" id=\"pth-ve-sequence\">\r\n                    <div class=\"pth-ve-empty-seq\" id=\"pth-ve-empty-msg\">Import files and click \"Add\" to build your sequence.<\/div>\r\n                <\/div>\r\n                \r\n                <div style=\"display:flex; gap:10px; flex-wrap:wrap; margin-top:20px;\">\r\n                    <button id=\"pth-ve-btn-export\" class=\"pth-ve-action-btn pth-ve-btn-export\" style=\"margin:0; flex:1;\" disabled>\ud83c\udfac Render & Merge Final Video<\/button>\r\n                    <a id=\"pth-ve-download-link\" class=\"pth-hidden pth-ve-action-btn\" style=\"background:#2563eb; text-decoration:none; margin:0; flex:1; align-items:center; justify-content:center;\">\u2b07\ufe0f Download Result<\/a>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"pth-ve-side-col\" id=\"pth-ve-sidebar\">\r\n            \r\n            <div class=\"pth-ve-card\">\r\n                <h3 class=\"pth-ve-card-title\">Media Bin<\/h3>\r\n                <input type=\"file\" id=\"pth-ve-file-input\" accept=\"video\/mp4,video\/webm,video\/quicktime\" multiple class=\"pth-hidden\">\r\n                <button id=\"pth-ve-btn-import\" class=\"pth-ve-btn-import\">\r\n                    <span style=\"font-size: 24px;\">\ud83d\udcc1<\/span>\r\n                    Import Local Videos\r\n                <\/button>\r\n                <div class=\"pth-ve-media-list\" id=\"pth-ve-media-list\"><\/div>\r\n            <\/div>\r\n\r\n            <div class=\"pth-ve-card\">\r\n                <h3 class=\"pth-ve-card-title\">Clip Inspector<\/h3>\r\n                \r\n                <div id=\"pth-ve-inspector-empty\" style=\"text-align: center; color: #94a3b8; font-size: 13px; padding: 20px 0;\">\r\n                    Select a clip from the Storyboard below the player to edit its properties.\r\n                <\/div>\r\n\r\n                <div id=\"pth-ve-inspector-panel\" class=\"pth-hidden\">\r\n                    <div class=\"pth-ve-inspector\">\r\n                        \r\n                        <div class=\"pth-ve-input-group\">\r\n                            <label class=\"pth-ve-label\">\u2702\ufe0f Trim Time (MM:SS.ms)<\/label>\r\n                            <div class=\"pth-ve-grid-2\">\r\n                                <div>\r\n                                    <div style=\"font-size:9px; color:#64748b; margin-bottom:2px;\">START TIME<\/div>\r\n                                    <input type=\"text\" id=\"pth-ve-trim-start\" class=\"pth-ve-input\" value=\"00:00.00\">\r\n                                <\/div>\r\n                                <div>\r\n                                    <div style=\"font-size:9px; color:#64748b; margin-bottom:2px;\">END TIME<\/div>\r\n                                    <input type=\"text\" id=\"pth-ve-trim-end\" class=\"pth-ve-input\" value=\"00:00.00\">\r\n                                <\/div>\r\n                            <\/div>\r\n                        <\/div>\r\n\r\n                        <button id=\"pth-ve-btn-split\" class=\"pth-ve-action-btn pth-ve-btn-split\" type=\"button\">\u2702\ufe0f Split Clip at Playhead<\/button>\r\n\r\n                        <div class=\"pth-ve-input-group\" style=\"margin-top:15px;\">\r\n                            <label class=\"pth-ve-label\">\ud83c\udfa8 Color Grading<\/label>\r\n                            <div style=\"margin-bottom:8px;\">\r\n                                <div style=\"display:flex; justify-content:space-between; font-size:10px; color:#64748b; font-weight:700;\"><span>Brightness<\/span> <span id=\"pth-ve-br-val\">1.0<\/span><\/div>\r\n                                <input type=\"range\" id=\"pth-ve-bright\" class=\"pth-ve-range\" min=\"0.5\" max=\"1.5\" step=\"0.1\" value=\"1\">\r\n                            <\/div>\r\n                            <div style=\"margin-bottom:8px;\">\r\n                                <div style=\"display:flex; justify-content:space-between; font-size:10px; color:#64748b; font-weight:700;\"><span>Contrast<\/span> <span id=\"pth-ve-con-val\">1.0<\/span><\/div>\r\n                                <input type=\"range\" id=\"pth-ve-contrast\" class=\"pth-ve-range\" min=\"0.5\" max=\"1.5\" step=\"0.1\" value=\"1\">\r\n                            <\/div>\r\n                            <div>\r\n                                <div style=\"display:flex; justify-content:space-between; font-size:10px; color:#64748b; font-weight:700;\"><span>Saturation<\/span> <span id=\"pth-ve-sat-val\">1.0<\/span><\/div>\r\n                                <input type=\"range\" id=\"pth-ve-sat\" class=\"pth-ve-range\" min=\"0\" max=\"2\" step=\"0.1\" value=\"1\">\r\n                            <\/div>\r\n                        <\/div>\r\n\r\n                        <div class=\"pth-ve-input-group\">\r\n                            <label class=\"pth-ve-label\" style=\"display:flex; justify-content:space-between;\">\r\n                                \ud83d\udd0a Audio Setup <span id=\"pth-ve-vol-val\" style=\"color:#3b82f6;\">100%<\/span>\r\n                            <\/label>\r\n                            <input type=\"range\" id=\"pth-ve-volume\" class=\"pth-ve-range\" min=\"0\" max=\"2\" step=\"0.1\" value=\"1\" aria-label=\"Clip volume\">\r\n                            <div class=\"pth-ve-mute-row\">\r\n                                <input type=\"checkbox\" id=\"pth-ve-mute\" aria-label=\"Mute this clip\">\r\n                                <label for=\"pth-ve-mute\">\ud83d\udd07 Mute this clip in the final render<\/label>\r\n                            <\/div>\r\n                        <\/div>\r\n\r\n                        <div class=\"pth-ve-input-group\">\r\n                            <label class=\"pth-ve-label\" style=\"display:flex; justify-content:space-between;\">\r\n                                \u26a1 Playback Speed <span id=\"pth-ve-speed-val\" style=\"color:#3b82f6;\">1.0x<\/span>\r\n                            <\/label>\r\n                            <input type=\"range\" id=\"pth-ve-speed\" class=\"pth-ve-range\" min=\"0.5\" max=\"3\" step=\"0.1\" value=\"1\">\r\n                        <\/div>\r\n\r\n                        <div class=\"pth-ve-input-group\">\r\n                            <label class=\"pth-ve-label\">\ud83d\udd04 Rotation<\/label>\r\n                            <select id=\"pth-ve-rotation\" class=\"pth-ve-input\" style=\"padding:6px 10px; font-size:13px;\">\r\n                                <option value=\"0\">0\u00b0 (Normal)<\/option>\r\n                                <option value=\"90\">90\u00b0 (Right)<\/option>\r\n                                <option value=\"180\">180\u00b0 (Upside Down)<\/option>\r\n                                <option value=\"270\">270\u00b0 (Left)<\/option>\r\n                            <\/select>\r\n                        <\/div>\r\n                    <\/div>\r\n                    \r\n                    <div style=\"display:flex; gap:10px; flex-direction:column;\">\r\n                        <button id=\"pth-ve-btn-reverse\" class=\"pth-ve-action-btn\" style=\"background: linear-gradient(135deg, #8b5cf6, #6366f1); margin:0;\">\u23ea Reverse Clip Natively<\/button>\r\n                        <button id=\"pth-ve-btn-mirror\" class=\"pth-ve-action-btn\" style=\"background: linear-gradient(135deg, #f59e0b, #d97706); margin:0;\">\u2194\ufe0f Mirror Clip Natively<\/button>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <div id=\"pth-ve-note\" class=\"pth-ve-note\" role=\"status\" aria-live=\"polite\"><\/div>\r\n<\/div>\r\n\r\n    <script data-no-optimize=\"1\">\r\n    class PthVideoEditor {\r\n        constructor() {\r\n            this.mediaBin = [];\r\n            this.sequence = [];\r\n            this.selectedClipId = null;\r\n            this.isProcessing = false;\r\n            \r\n            this.initElements();\r\n            this.bindEvents();\r\n        }\r\n\r\n        initElements() {\r\n            this.el = {\r\n                fwToggle: document.getElementById('pth-ve-fw-toggle'),\r\n                sidebar: document.getElementById('pth-ve-sidebar'),\r\n                mainGrid: document.getElementById('pth-ve-main-grid'),\r\n                \r\n                player: document.getElementById('pth-ve-player'),\r\n                overlay: document.getElementById('pth-ve-overlay'),\r\n                overlayTitle: document.getElementById('pth-ve-overlay-title'),\r\n                logBox: document.getElementById('pth-ve-log'),\r\n                \r\n                fileInput: document.getElementById('pth-ve-file-input'),\r\n                btnImport: document.getElementById('pth-ve-btn-import'),\r\n                mediaList: document.getElementById('pth-ve-media-list'),\r\n                \r\n                seqArea: document.getElementById('pth-ve-sequence'),\r\n                emptyMsg: document.getElementById('pth-ve-empty-msg'),\r\n                seqCount: document.getElementById('pth-ve-seq-count'),\r\n                \r\n                inspEmpty: document.getElementById('pth-ve-inspector-empty'),\r\n                inspPanel: document.getElementById('pth-ve-inspector-panel'),\r\n                \r\n                trimStart: document.getElementById('pth-ve-trim-start'),\r\n                trimEnd: document.getElementById('pth-ve-trim-end'),\r\n                volume: document.getElementById('pth-ve-volume'),\r\n                volVal: document.getElementById('pth-ve-vol-val'),\r\n                mute: document.getElementById('pth-ve-mute'),\r\n                btnSplit: document.getElementById('pth-ve-btn-split'),\r\n                note: document.getElementById('pth-ve-note'),\r\n                \r\n                bright: document.getElementById('pth-ve-bright'),\r\n                brVal: document.getElementById('pth-ve-br-val'),\r\n                contrast: document.getElementById('pth-ve-contrast'),\r\n                conVal: document.getElementById('pth-ve-con-val'),\r\n                sat: document.getElementById('pth-ve-sat'),\r\n                satVal: document.getElementById('pth-ve-sat-val'),\r\n                \r\n                speed: document.getElementById('pth-ve-speed'),\r\n                speedVal: document.getElementById('pth-ve-speed-val'),\r\n                rotation: document.getElementById('pth-ve-rotation'),\r\n                \r\n                btnReverse: document.getElementById('pth-ve-btn-reverse'),\r\n                btnMirror: document.getElementById('pth-ve-btn-mirror'),\r\n                \r\n                btnExport: document.getElementById('pth-ve-btn-export'),\r\n                downloadLink: document.getElementById('pth-ve-download-link')\r\n            };\r\n        }\r\n\r\n        bindEvents() {\r\n            let isFw = false;\r\n            this.el.fwToggle.addEventListener('click', () => {\r\n                isFw = !isFw;\r\n                if(isFw) {\r\n                    this.el.sidebar.style.display = 'none';\r\n                    this.el.mainGrid.style.gridTemplateColumns = '1fr';\r\n                    this.el.fwToggle.innerText = '\u25e8 Exit Full Width';\r\n                } else {\r\n                    this.el.sidebar.style.display = 'block';\r\n                    this.el.mainGrid.style.gridTemplateColumns = '1.8fr 1fr';\r\n                    this.el.fwToggle.innerText = '\u26f6 Full Width';\r\n                }\r\n            });\r\n\r\n            this.el.btnImport.addEventListener('click', () => this.el.fileInput.click());\r\n            this.el.fileInput.addEventListener('change', (e) => this.handleFiles(e));\r\n\r\n            \/\/ Inspector Events\r\n            this.el.trimStart.addEventListener('change', (e) => this.updateClipData('trimStart', e.target.value));\r\n            this.el.trimEnd.addEventListener('change', (e) => this.updateClipData('trimEnd', e.target.value));\r\n            \r\n            this.el.volume.addEventListener('input', (e) => {\r\n                this.el.volVal.innerText = Math.round(e.target.value * 100) + '%';\r\n                this.updateClipData('volume', parseFloat(e.target.value));\r\n                this.el.player.volume = parseFloat(e.target.value);\r\n            });\r\n\r\n            \/\/ Per-clip mute toggle\r\n            this.el.mute.addEventListener('change', (e) => {\r\n                const isMuted = e.target.checked;\r\n                this.updateClipData('muted', isMuted);\r\n                this.el.player.muted = isMuted;\r\n                this.renderSequence();\r\n            });\r\n\r\n            \/\/ Split clip at playhead\r\n            this.el.btnSplit.addEventListener('click', () => this.splitClip());\r\n\r\n            \/\/ Colors\r\n            this.el.bright.addEventListener('input', (e) => { this.el.brVal.innerText = e.target.value; this.updateClipData('bright', parseFloat(e.target.value)); this.updatePreviewTransform(); });\r\n            this.el.contrast.addEventListener('input', (e) => { this.el.conVal.innerText = e.target.value; this.updateClipData('contrast', parseFloat(e.target.value)); this.updatePreviewTransform(); });\r\n            this.el.sat.addEventListener('input', (e) => { this.el.satVal.innerText = e.target.value; this.updateClipData('sat', parseFloat(e.target.value)); this.updatePreviewTransform(); });\r\n            \r\n            this.el.speed.addEventListener('input', (e) => {\r\n                const val = parseFloat(e.target.value);\r\n                this.el.speedVal.innerText = val.toFixed(1) + 'x';\r\n                this.updateClipData('speed', val);\r\n                if (this.el.player) this.el.player.playbackRate = val;\r\n            });\r\n\r\n            this.el.rotation.addEventListener('change', (e) => { this.updateClipData('rotation', parseInt(e.target.value)); this.updatePreviewTransform(); });\r\n            \r\n            \/\/ Native Processing Buttons\r\n            this.el.btnReverse.addEventListener('click', () => this.nativeProcessClip('reverse'));\r\n            this.el.btnMirror.addEventListener('click', () => this.nativeProcessClip('mirror'));\r\n            \r\n            this.el.btnExport.addEventListener('click', () => this.exportSequence());\r\n            \r\n            this.el.player.addEventListener('timeupdate', () => {\r\n                if (this.selectedClipId && !this.isProcessing) {\r\n                    const clip = this.sequence.find(c => c.id === this.selectedClipId);\r\n                    if (clip) {\r\n                        const endSec = this.parseTime(clip.trimEnd);\r\n                        if (this.el.player.currentTime >= endSec) {\r\n                            this.el.player.pause();\r\n                            this.el.player.currentTime = this.parseTime(clip.trimStart);\r\n                        }\r\n                    }\r\n                }\r\n            });\r\n        }\r\n\r\n        updatePreviewTransform() {\r\n            if (!this.selectedClipId || !this.el.player) return;\r\n            const clip = this.sequence.find(c => c.id === this.selectedClipId);\r\n            if (!clip) return;\r\n            \r\n            \/\/ Visual CSS Colors\r\n            this.el.player.style.filter = `brightness(${clip.bright}) contrast(${clip.contrast}) saturate(${clip.sat})`;\r\n\r\n            let transform = '';\r\n            if (clip.rotation && clip.rotation !== 0) transform += `rotate(${clip.rotation}deg) `;\r\n            \r\n            this.el.player.style.transform = transform.trim() || 'none';\r\n            this.el.player.style.transformOrigin = 'center center';\r\n        }\r\n\r\n        handleFiles(e) {\r\n            const files = Array.from(e.target.files);\r\n            files.forEach(file => {\r\n                const url = URL.createObjectURL(file);\r\n                const tempVideo = document.createElement('video');\r\n                tempVideo.src = url;\r\n                tempVideo.onloadedmetadata = () => {\r\n                    const item = {\r\n                        id: 'media_' + Date.now() + Math.floor(Math.random()*1000),\r\n                        name: file.name, file: file, url: url, duration: tempVideo.duration, thumb: ''\r\n                    };\r\n                    this.mediaBin.push(item);\r\n                    this.renderMediaBin();\r\n                    \/\/ Grab a thumbnail frame in the background, then refresh the bin\r\n                    this.captureThumb(url, tempVideo.duration, (dataUrl) => {\r\n                        if (dataUrl) {\r\n                            item.thumb = dataUrl;\r\n                            this.renderMediaBin();\r\n                        }\r\n                    });\r\n                };\r\n            });\r\n            this.el.fileInput.value = '';\r\n        }\r\n\r\n        \/\/ Capture a single frame as a JPEG data URL (canvas \u2014 no FFmpeg, no upload)\r\n        captureThumb(url, duration, cb) {\r\n            try {\r\n                const v = document.createElement('video');\r\n                v.muted = true;\r\n                v.preload = 'auto';\r\n                v.src = url;\r\n                let done = false;\r\n                const finish = (result) => {\r\n                    if (done) return;\r\n                    done = true;\r\n                    try { v.removeAttribute('src'); v.load(); } catch (err) {}\r\n                    cb(result);\r\n                };\r\n                v.addEventListener('loadeddata', () => {\r\n                    const seekTo = (isFinite(duration) && duration > 0) ? Math.min(1, duration \/ 2) : 0.1;\r\n                    try { v.currentTime = seekTo; } catch (err) { finish(''); }\r\n                });\r\n                v.addEventListener('seeked', () => {\r\n                    try {\r\n                        const c = document.createElement('canvas');\r\n                        c.width = 160; c.height = 90;\r\n                        c.getContext('2d').drawImage(v, 0, 0, 160, 90);\r\n                        finish(c.toDataURL('image\/jpeg', 0.6));\r\n                    } catch (err) { finish(''); }\r\n                }, { once: true });\r\n                v.addEventListener('error', () => finish(''));\r\n                setTimeout(() => finish(''), 6000);\r\n            } catch (err) { cb(''); }\r\n        }\r\n\r\n        \/\/ Small transient message (bottom-right)\r\n        showNote(msg, type) {\r\n            const n = this.el.note;\r\n            if (!n) return;\r\n            n.className = 'pth-ve-note' + (type ? ' ' + type : '');\r\n            n.innerText = msg;\r\n            void n.offsetWidth;\r\n            n.classList.add('show');\r\n            clearTimeout(this._noteTimer);\r\n            this._noteTimer = setTimeout(() => { n.classList.remove('show'); }, 2800);\r\n        }\r\n\r\n        renderMediaBin() {\r\n            this.el.mediaList.innerHTML = this.mediaBin.map(m => `\r\n                <div class=\"pth-ve-media-item\">\r\n                    <div style=\"display:flex; align-items:center; gap:8px;\">\r\n                        ${m.thumb\r\n                            ? `<img decoding=\"async\" class=\"pth-ve-media-thumb\" src=\"${m.thumb}\" width=\"40\" height=\"24\" alt=\"Thumbnail of ${m.name}\" data-no-lazy=\"1\">`\r\n                            : `<span style=\"color:#3b82f6; width:40px; text-align:center;\">\ud83c\udf9e\ufe0f<\/span>`}\r\n                        <div>\r\n                            <div class=\"pth-ve-media-name\" title=\"${m.name}\">${m.name}<\/div>\r\n                            <div style=\"font-size:9px; color:#64748b; font-family:monospace;\">${this.formatTime(m.duration)}<\/div>\r\n                        <\/div>\r\n                    <\/div>\r\n                    <button class=\"pth-ve-btn-add\" onclick=\"window.pthVeApp.addToSequence('${m.id}')\">+ Add<\/button>\r\n                <\/div>\r\n            `).join('');\r\n        }\r\n\r\n        addToSequence(mediaId) {\r\n            const media = this.mediaBin.find(m => m.id === mediaId);\r\n            if (!media) return;\r\n            const seqItem = {\r\n                id: 'seq_' + Date.now() + '_' + Math.floor(Math.random()*100000),\r\n                mediaId: media.id, name: media.name, file: media.file, url: media.url, duration: media.duration,\r\n                thumb: media.thumb || '',\r\n                trimStart: \"00:00.00\", trimEnd: this.formatTime(media.duration),\r\n                volume: 1.0, muted: false, bright: 1.0, contrast: 1.0, sat: 1.0,\r\n                speed: 1.0, rotation: 0, isReversed: false, isMirrored: false\r\n            };\r\n            this.sequence.push(seqItem);\r\n            this.renderSequence();\r\n            this.selectClip(seqItem.id);\r\n        }\r\n\r\n        renderSequence() {\r\n            if (this.sequence.length === 0) {\r\n                this.el.emptyMsg.style.display = 'block';\r\n                this.el.btnExport.disabled = true;\r\n                this.el.seqCount.innerText = '0 Clips';\r\n                this.el.seqArea.innerHTML = '';\r\n                this.el.seqArea.appendChild(this.el.emptyMsg);\r\n                this.selectClip(null);\r\n                return;\r\n            }\r\n            this.el.emptyMsg.style.display = 'none';\r\n            this.el.btnExport.disabled = false;\r\n            this.el.seqCount.innerText = `${this.sequence.length} Clip${this.sequence.length > 1 ? 's' : ''}`;\r\n\r\n            this.el.seqArea.innerHTML = this.sequence.map((c, index) => {\r\n                const badges = [];\r\n                if (c.isReversed) badges.push('\u23ea');\r\n                if (c.isMirrored) badges.push('\u2194\ufe0f');\r\n                if (c.muted) badges.push('\ud83d\udd07');\r\n                const badgeHtml = badges.length\r\n                    ? `<div class=\"pth-ve-seq-badges\">${badges.map(b => `<span class=\"pth-ve-seq-badge-ic\">${b}<\/span>`).join('')}<\/div>`\r\n                    : '';\r\n                const thumbInner = c.thumb\r\n                    ? `<img decoding=\"async\" class=\"pth-ve-thumb-img\" src=\"${c.thumb}\" width=\"120\" height=\"60\" alt=\"Clip ${index+1} thumbnail\" data-no-lazy=\"1\">`\r\n                    : `<span style=\"font-size:20px;\">\ud83c\udfac<\/span>`;\r\n                return `\r\n                <div class=\"pth-ve-seq-item ${this.selectedClipId === c.id ? 'active' : ''}\" onclick=\"window.pthVeApp.selectClip('${c.id}')\" draggable=\"true\" ondragstart=\"event.dataTransfer.setData('idx', ${index})\" ondragover=\"event.preventDefault()\" ondrop=\"window.pthVeApp.dropSequence(event, ${index})\">\r\n                    <div class=\"pth-ve-seq-remove\" onclick=\"event.stopPropagation(); window.pthVeApp.removeFromSequence('${c.id}')\">\u2715<\/div>\r\n                    <div class=\"pth-ve-seq-thumb\">\r\n                        ${thumbInner}\r\n                        ${badgeHtml}\r\n                    <\/div>\r\n                    <div class=\"pth-ve-seq-name\"><span style=\"color:#94a3b8; font-family:monospace; margin-right:4px;\">${index+1}.<\/span>${c.name}<\/div>\r\n                <\/div>\r\n                `;\r\n            }).join('');\r\n        }\r\n\r\n        dropSequence(e, targetIdx) {\r\n            const srcIdx = e.dataTransfer.getData('idx');\r\n            if(srcIdx === \"\" || srcIdx == targetIdx) return;\r\n            const item = this.sequence.splice(srcIdx, 1)[0];\r\n            this.sequence.splice(targetIdx, 0, item);\r\n            this.renderSequence();\r\n        }\r\n\r\n        removeFromSequence(seqId) {\r\n            this.sequence = this.sequence.filter(c => c.id !== seqId);\r\n            if (this.selectedClipId === seqId) this.selectClip(null);\r\n            this.renderSequence();\r\n        }\r\n\r\n        \/\/ \u2702\ufe0f Split the selected clip into two parts at the current player position\r\n        splitClip() {\r\n            if (!this.selectedClipId) { this.showNote('Select a clip first.', 'err'); return; }\r\n            const idx = this.sequence.findIndex(c => c.id === this.selectedClipId);\r\n            if (idx === -1) return;\r\n            const clip = this.sequence[idx];\r\n\r\n            const playhead = this.el.player.currentTime;\r\n            const startSec = this.parseTime(clip.trimStart);\r\n            const endSec = this.parseTime(clip.trimEnd);\r\n\r\n            if (!isFinite(playhead)) { this.showNote('Play the clip, then pause where you want to split.', 'err'); return; }\r\n            if (playhead <= startSec + 0.15 || playhead >= endSec - 0.15) {\r\n                this.showNote('Move the playhead inside the clip (not at the very start or end).', 'err');\r\n                return;\r\n            }\r\n\r\n            const cutStr = this.formatTime(playhead);\r\n\r\n            \/\/ Part B \u2014 a copy that starts at the cut point\r\n            const partB = Object.assign({}, clip);\r\n            partB.id = 'seq_' + Date.now() + '_' + Math.floor(Math.random()*100000);\r\n            partB.trimStart = cutStr;\r\n            partB.trimEnd = clip.trimEnd;\r\n            partB.name = clip.name.replace(\/\\s*\\((?:Part )?[AB]\\)$\/, '') + ' (B)';\r\n\r\n            \/\/ Part A \u2014 the original, now ending at the cut point\r\n            clip.trimEnd = cutStr;\r\n            clip.name = clip.name.replace(\/\\s*\\((?:Part )?[AB]\\)$\/, '') + ' (A)';\r\n\r\n            this.sequence.splice(idx + 1, 0, partB);\r\n            this.renderSequence();\r\n            this.selectClip(clip.id);\r\n            this.showNote('Clip split into 2 parts at ' + cutStr, 'ok');\r\n        }\r\n\r\n        selectClip(seqId) {\r\n            this.selectedClipId = seqId;\r\n            this.renderSequence();\r\n            \r\n            if (!seqId) {\r\n                this.el.inspEmpty.classList.remove('pth-hidden');\r\n                this.el.inspPanel.classList.add('pth-hidden');\r\n                this.el.player.src = '';\r\n                return;\r\n            }\r\n\r\n            const clip = this.sequence.find(c => c.id === seqId);\r\n            if (clip) {\r\n                this.el.inspEmpty.classList.add('pth-hidden');\r\n                this.el.inspPanel.classList.remove('pth-hidden');\r\n                \r\n                this.el.trimStart.value = clip.trimStart;\r\n                this.el.trimEnd.value = clip.trimEnd;\r\n                \r\n                this.el.volume.value = clip.volume;\r\n                this.el.volVal.innerText = Math.round(clip.volume * 100) + '%';\r\n                this.el.mute.checked = !!clip.muted;\r\n                \r\n                this.el.bright.value = clip.bright; this.el.brVal.innerText = clip.bright;\r\n                this.el.contrast.value = clip.contrast; this.el.conVal.innerText = clip.contrast;\r\n                this.el.sat.value = clip.sat; this.el.satVal.innerText = clip.sat;\r\n                \r\n                this.el.speed.value = clip.speed;\r\n                this.el.speedVal.innerText = clip.speed.toFixed(1) + 'x';\r\n                this.el.rotation.value = clip.rotation;\r\n                \r\n                this.el.player.src = clip.url;\r\n                this.el.player.currentTime = this.parseTime(clip.trimStart);\r\n                this.el.player.volume = clip.volume;\r\n                this.el.player.muted = !!clip.muted;\r\n                this.el.player.playbackRate = clip.speed;\r\n                this.updatePreviewTransform();\r\n                this.el.player.pause();\r\n            }\r\n        }\r\n\r\n        updateClipData(key, value) {\r\n            if (!this.selectedClipId) return;\r\n            const clip = this.sequence.find(c => c.id === this.selectedClipId);\r\n            if (clip) {\r\n                clip[key] = value;\r\n                if (key === 'trimStart') this.el.player.currentTime = this.parseTime(value);\r\n            }\r\n        }\r\n\r\n        formatTime(totalSeconds) {\r\n            const m = String(Math.floor(totalSeconds \/ 60)).padStart(2, '0');\r\n            const s = String(Math.floor(totalSeconds % 60)).padStart(2, '0');\r\n            const ms = String(Math.floor((totalSeconds % 1) * 100)).padStart(2, '0');\r\n            return `${m}:${s}.${ms}`;\r\n        }\r\n\r\n        parseTime(timeStr) {\r\n            if (!timeStr) return 0;\r\n            const parts = timeStr.split(':');\r\n            if (parts.length === 2) return (parseFloat(parts[0]) * 60) + parseFloat(parts[1]);\r\n            return parseFloat(timeStr);\r\n        }\r\n\r\n        log(msg) {\r\n            this.el.logBox.innerHTML += `<br>> ${msg}`;\r\n            this.el.logBox.scrollTop = this.el.logBox.scrollHeight;\r\n        }\r\n\r\n        \/\/ \ud83d\udd25 THE BULLETPROOF FIX: We spawn a completely fresh FFmpeg instance for EACH heavy task\r\n        async spawnFreshFFmpeg() {\r\n            const { createFFmpeg } = window.FFmpeg;\r\n            const ffmpeg = createFFmpeg({\r\n                log: true, \r\n                logger: ({ message }) => this.log(message)\r\n            });\r\n            await ffmpeg.load();\r\n            return ffmpeg;\r\n        }\r\n\r\n        \/\/ Wrapper to catch the false-positive 'exit(0)' that crashes standard runs\r\n        async safeRun(ffmpeg, argsArray) {\r\n            try {\r\n                await ffmpeg.run(...argsArray);\r\n            } catch (e) {\r\n                if (e.message && (e.message.includes('exit(0)') || e.message.includes('exit status 0'))) {\r\n                    \/\/ Ignore false positive\r\n                } else {\r\n                    throw e; \r\n                }\r\n            }\r\n        }\r\n\r\n        \/\/ --- NATIVE PROCESS CLIP (Reverse or Mirror) ---\r\n        async nativeProcessClip(type) {\r\n            if (!this.selectedClipId) return;\r\n            const clip = this.sequence.find(c => c.id === this.selectedClipId);\r\n            if (!clip) return;\r\n            \r\n            try {\r\n                this.isProcessing = true;\r\n                const isMirror = (type === 'mirror');\r\n                this.el.overlayTitle.innerText = isMirror ? \"MIRRORING CLIP...\" : \"REVERSING CLIP...\";\r\n                this.el.logBox.innerHTML = \"Initializing Engine...\";\r\n                this.el.overlay.classList.remove('pth-hidden');\r\n                \r\n                const ffmpeg = await this.spawnFreshFFmpeg();\r\n                const { fetchFile } = window.FFmpeg;\r\n                \r\n                const ext = clip.file.name.split('.').pop() || 'mp4';\r\n                const inName = `nat_in.${ext}`;\r\n                const outName = `nat_out.mp4`;\r\n                \r\n                this.log(`Loading ${clip.name} into memory...`);\r\n                ffmpeg.FS('writeFile', inName, await fetchFile(clip.file));\r\n                \r\n                this.log(`Applying ${type} filters. This may take time based on file size...`);\r\n                \r\n                let runArgs = [];\r\n                if (isMirror) {\r\n                    runArgs = ['-i', inName, '-vf', 'hflip', '-c:v', 'libx264', '-preset', 'ultrafast', outName];\r\n                } else {\r\n                    runArgs = ['-i', inName, '-vf', 'reverse', '-af', 'areverse', '-c:v', 'libx264', '-preset', 'ultrafast', outName];\r\n                }\r\n\r\n                await this.safeRun(ffmpeg, runArgs);\r\n                \r\n                this.log(\"Extracting processed file...\");\r\n                const data = ffmpeg.FS('readFile', outName);\r\n                const newBlob = new Blob([data.buffer], { type: 'video\/mp4' });\r\n                \r\n                clip.file = new File([newBlob], `${isMirror ? 'Mirrored' : 'Reversed'}_${clip.name}.mp4`, { type: 'video\/mp4' });\r\n                clip.url = URL.createObjectURL(newBlob);\r\n                clip.name = isMirror ? `\u2194\ufe0f Mirrored: ${clip.name}` : `\u23ea Reversed: ${clip.name}`;\r\n                \r\n                if (isMirror) clip.isMirrored = true; else clip.isReversed = true;\r\n                \r\n                clip.trimStart = \"00:00.00\"; \r\n                clip.trimEnd = this.formatTime(clip.duration);\r\n                \r\n                this.selectClip(clip.id);\r\n                this.log(`<span style='color:#4ade80'>\u2705 ${type.toUpperCase()} Success!<\/span>`);\r\n                \r\n            } catch (err) {\r\n                console.error(err);\r\n                this.log(`<span style=\"color:#ef4444\">\u274c PROCESS ERROR: ${err.message}<\/span>`);\r\n            } finally {\r\n                setTimeout(() => { this.el.overlay.classList.add('pth-hidden'); this.isProcessing = false; }, 2000);\r\n            }\r\n        }\r\n\r\n        async exportSequence() {\r\n            if (this.sequence.length === 0) return;\r\n            \r\n            try {\r\n                this.isProcessing = true;\r\n                this.el.overlayTitle.innerText = \"RENDERING FINAL VIDEO...\";\r\n                this.el.logBox.innerHTML = \"Initializing Render Engine...\";\r\n                this.el.overlay.classList.remove('pth-hidden');\r\n                \r\n                \/\/ Hide download, show processing button state\r\n                this.el.downloadLink.classList.add('pth-hidden');\r\n                this.el.downloadLink.style.display = 'none';\r\n                this.el.btnExport.style.display = 'flex';\r\n                this.el.btnExport.disabled = true;\r\n                this.el.btnExport.innerText = \"Processing...\";\r\n                \r\n                const { fetchFile } = window.FFmpeg;\r\n                let processedBlobs = [];\r\n                \r\n                \/\/ DEEP RENDER LOOP (Handles formats & heavy effects properly)\r\n                for (let i = 0; i < this.sequence.length; i++) {\r\n                    const clip = this.sequence[i];\r\n                    this.log(`\\n--- Rendering Clip ${i+1}\/${this.sequence.length} ---`);\r\n                    \r\n                    const ffmpegDeep = await this.spawnFreshFFmpeg();\r\n                    ffmpegDeep.FS('writeFile', 'in.mp4', await fetchFile(clip.file));\r\n                    \r\n                    const start = clip.trimStart;\r\n                    const durSecs = this.parseTime(clip.trimEnd) - this.parseTime(clip.trimStart);\r\n                    \r\n                    const vf = [];\r\n                    \/\/ Color Effects (Mapping HTML sliders to FFmpeg EQ filter)\r\n                    \/\/ FFmpeg brightness: -1.0 to 1.0 (Default 0). HTML slider: 0.5 to 1.5 (Default 1.0). So HTML - 1.0.\r\n                    const brightFF = (parseFloat(clip.bright) - 1.0).toFixed(2);\r\n                    vf.push(`eq=brightness=${brightFF}:contrast=${clip.contrast}:saturation=${clip.sat}`);\r\n                    \r\n                    if (clip.rotation === 90) vf.push('transpose=1');\r\n                    else if (clip.rotation === 180) vf.push('transpose=2,transpose=2');\r\n                    else if (clip.rotation === 270) vf.push('transpose=2');\r\n                    if (clip.speed !== 1) vf.push(`setpts=PTS\/${clip.speed}`);\r\n                    \r\n                    \/\/ Force standard 1280x720 layout so videos merge perfectly\r\n                    vf.push('scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)\/2:(oh-ih)\/2,setsar=1');\r\n                    \r\n                    const clipVol = clip.muted ? 0 : clip.volume;\r\n                    let af = `volume=${clipVol}`;\r\n                    if (clip.speed !== 1) af += `,atempo=${clip.speed}`;\r\n\r\n                    await this.safeRun(ffmpegDeep, [\r\n                        '-ss', start.toString(), '-i', 'in.mp4', '-t', durSecs.toString(),\r\n                        '-vf', vf.join(','), '-af', af,\r\n                        '-c:v', 'libx264', '-preset', 'ultrafast', '-r', '30', 'out.mp4'\r\n                    ]);\r\n                    \r\n                    const data = ffmpegDeep.FS('readFile', 'out.mp4');\r\n                    processedBlobs.push(new Blob([data.buffer], { type: 'video\/mp4' }));\r\n                }\r\n                \r\n                this.log(`\\n--- Merging Sequence ---`);\r\n                const ffmpegFinal = await this.spawnFreshFFmpeg();\r\n                let listContent = \"\";\r\n                for(let i=0; i < processedBlobs.length; i++) {\r\n                    ffmpegFinal.FS('writeFile', `p_${i}.mp4`, await fetchFile(processedBlobs[i]));\r\n                    listContent += `file 'p_${i}.mp4'\\n`;\r\n                }\r\n                \r\n                ffmpegFinal.FS('writeFile', 'list.txt', listContent);\r\n                await this.safeRun(ffmpegFinal, ['-f', 'concat', '-safe', '0', '-i', 'list.txt', '-c', 'copy', 'final.mp4']);\r\n                \r\n                this.log(\"Finalizing Output File...\");\r\n                const fData = ffmpegFinal.FS('readFile', 'final.mp4');\r\n                const outBlob = new Blob([fData.buffer], { type: 'video\/mp4' });\r\n                const outUrl = URL.createObjectURL(outBlob);\r\n                \r\n                \/\/ Show Download and Activate Re-Create\r\n                this.el.downloadLink.href = outUrl;\r\n                this.el.downloadLink.download = `PTH-Video-Studio-Export-${Date.now()}.mp4`;\r\n                this.el.downloadLink.classList.remove('pth-hidden');\r\n                this.el.downloadLink.style.display = 'flex';\r\n                \r\n                this.el.btnExport.innerText = \"\ud83d\udd04 Re-Render Sequence\";\r\n                this.el.btnExport.disabled = false;\r\n                \r\n                this.el.player.src = outUrl;\r\n                this.el.player.controls = true;\r\n                \r\n                this.log(\"<span style='color:#4ade80'>\u2705 EXPORT COMPLETE! Click Download.<\/span>\");\r\n                \r\n            } catch (err) {\r\n                console.error(err);\r\n                this.log(`<span style=\"color:#ef4444\">\u274c RENDER ERROR: ${err.message}<\/span>`);\r\n                this.el.btnExport.innerText = \"\ud83c\udfac Render & Merge Final Video\";\r\n                this.el.btnExport.disabled = false;\r\n            } finally {\r\n                setTimeout(() => { this.el.overlay.classList.add('pth-hidden'); this.isProcessing = false; }, 3000);\r\n            }\r\n        }\r\n    }\r\n\r\n    document.addEventListener('DOMContentLoaded', () => { window.pthVeApp = new PthVideoEditor(); });\r\n    <\/script>\r\n\t\t<script data-no-optimize=\"1\" data-no-minify=\"1\" data-cfasync=\"false\">\r\n(function () {\r\n  'use strict';\r\n  function mount() {\r\n    var panel = document.getElementById('pth-vs-tab-timeline');\r\n    var tool  = document.getElementById('pth-ve-wrapper');\r\n    if (!panel || !tool) return false;\r\n    if (tool.parentNode !== panel) {\r\n      var ph = document.getElementById('pth-vs-empty-timeline');\r\n      if (ph && ph.parentNode) ph.parentNode.removeChild(ph);\r\n      tool.style.margin = '0';\r\n      panel.appendChild(tool);\r\n    }\r\n    return true;\r\n  }\r\n  if (mount()) return;\r\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', mount);\r\n  window.addEventListener('load', function () { setTimeout(mount, 60); });\r\n  if (typeof MutationObserver !== 'undefined') {\r\n    var o = new MutationObserver(function () { if (mount()) o.disconnect(); });\r\n    o.observe(document.body || document.documentElement, { childList: true, subtree: true });\r\n    setTimeout(function () { o.disconnect(); }, 10000);\r\n  }\r\n})();\r\n<\/script>\n\n\n<style>\r\n\/* ==========================================================================\r\n   PRIME VIDEO STUDIO [TRUE TURBO] v5.0 \u2014 Enhanced Edition\r\n   ========================================================================== *\/\r\n:root {\r\n    --bg: #ffffff;\r\n    --surface: #f8fafc;\r\n    --surface2: #f1f5f9;\r\n    --border: #e2e8f0;\r\n    --border2: #cbd5e1;\r\n    --text: #0f172a;\r\n    --text2: #475569;\r\n    --text3: #94a3b8;\r\n    --blue: #1d4ed8;\r\n    --blue-l: #eff6ff;\r\n    --blue-b: #bfdbfe;\r\n    --blue-h: #1e40af;\r\n    --green: #10b981;\r\n    --green-l: #ecfdf5;\r\n    --red: #ef4444;\r\n    --red-l: #fef2f2;\r\n    --amber: #f59e0b;\r\n    --amber-l: #fffbeb;\r\n    --purple: #7c3aed;\r\n    --purple-l: #f5f3ff;\r\n    --shadow: 0 4px 6px -1px rgba(0,0,0,0.07), 0 2px 4px -2px rgba(0,0,0,0.05);\r\n    --shadow-lg: 0 10px 30px -5px rgba(37,99,235,0.12);\r\n    --r: 12px;\r\n    --r-sm: 8px;\r\n    --player-max-height: 380px;\r\n    --viewport-min-height: 300px;\r\n}\r\n\r\n*, *::before, *::after { box-sizing: border-box; }\r\n\r\nbody { margin: 0; padding: 0; background: #f0f4f8; font-family: 'DM Sans', sans-serif; }\r\n\r\n#pth-turbo-wrapper {\r\n    font-family: 'DM Sans', sans-serif;\r\n    background: var(--bg);\r\n    border: 1px solid var(--border);\r\n    border-radius: 20px;\r\n    padding: 22px;\r\n    box-shadow: var(--shadow-lg);\r\n    color: var(--text);\r\n    width: 100%;\r\n    margin: 0 auto;\r\n    line-height: 1.5;\r\n}\r\n\r\n\/* \u2500\u2500 TOPBAR \u2500\u2500 *\/\r\n.pth-header {\r\n    display: flex; justify-content: space-between; align-items: center;\r\n    background: var(--surface); border: 1px solid var(--border);\r\n    padding: 14px 20px; border-radius: var(--r); margin-bottom: 22px;\r\n    box-shadow: var(--shadow); flex-wrap: wrap; gap: 12px;\r\n}\r\n.pth-title-container { display: flex; align-items: center; gap: 14px; }\r\n.pth-title-icon {\r\n    width: 46px; height: 46px; background: linear-gradient(135deg,#ef4444,#dc2626);\r\n    color: #fff; border-radius: var(--r-sm); display: flex; justify-content: center;\r\n    align-items: center; font-size: 22px; box-shadow: 0 4px 12px rgba(239,68,68,0.3);\r\n    flex-shrink: 0;\r\n}\r\n.pth-title-text h1 { margin:0; font-size:20px; font-weight:900; color:var(--text); line-height:1.2; border:none; padding:0; }\r\n.pth-title-text p { margin:3px 0 0; font-size:11px; color:var(--text3); font-weight:700; text-transform:uppercase; letter-spacing:0.8px; }\r\n.pth-header-right { display:flex; align-items:center; gap:10px; flex-wrap:wrap; }\r\n.pth-badge { display:inline-flex; align-items:center; gap:6px; padding:7px 14px; border-radius:var(--r-sm); font-size:12px; font-weight:800; border:1px solid; }\r\n.pth-badge-turbo { background:var(--blue-l); color:var(--blue); border-color:var(--blue-b); }\r\n.pth-badge-info { background:var(--surface); color:var(--text2); border-color:var(--border); font-size:11px; font-family:'Space Mono',monospace; }\r\n.pth-shortcuts-btn { background:transparent; border:1px solid var(--border2); color:var(--text2); padding:7px 12px; border-radius:var(--r-sm); font-size:11px; font-weight:700; cursor:pointer; transition:.2s; }\r\n.pth-shortcuts-btn:hover { background:var(--surface2); color:var(--text); }\r\n\r\n\/* \u2500\u2500 2-COLUMN LAYOUT \u2500\u2500 *\/\r\n.pth-main-layout { display:grid; grid-template-columns:220px 1fr; gap:22px; align-items:start; }\r\n@media(max-width:860px){.pth-main-layout{grid-template-columns:1fr;}}\r\n\r\n\/* \u2500\u2500 SIDEBAR \u2500\u2500 *\/\r\n.pth-sidebar { background:var(--surface); border:1px solid var(--border); border-radius:16px; padding:14px; position:sticky; top:10px; }\r\n.pth-sidebar-head { font-size:11px; font-weight:800; color:var(--text3); text-transform:uppercase; letter-spacing:1px; margin-bottom:10px; text-align:center; }\r\n.pth-search-wrap { position:relative; margin-bottom:12px; }\r\n.pth-search-wrap input { width:100%; padding:8px 10px 8px 30px; border:1px solid var(--border); border-radius:var(--r-sm); font-size:12px; font-family:inherit; background:var(--bg); color:var(--text); outline:none; transition:.2s; }\r\n.pth-search-wrap input:focus { border-color:var(--blue); box-shadow:0 0 0 3px rgba(29,78,216,0.08); }\r\n.pth-search-wrap::before { content:'\ud83d\udd0d'; position:absolute; left:8px; top:50%; transform:translateY(-50%); font-size:13px; }\r\n\r\n.pth-cat-label { font-size:10px; font-weight:800; color:var(--text3); text-transform:uppercase; letter-spacing:0.8px; margin:12px 0 6px; padding-left:2px; }\r\n.pth-tools { display:grid; grid-template-columns:repeat(2,1fr); gap:7px; }\r\n.pth-opt {\r\n    background:var(--bg); border:1px solid var(--border); border-radius:var(--r-sm);\r\n    padding:9px 4px; text-align:center; cursor:pointer; transition:.18s;\r\n    display:flex; flex-direction:column; align-items:center; justify-content:center;\r\n    gap:6px; min-height:68px; position:relative;\r\n}\r\n.pth-opt:hover { border-color:var(--blue); background:var(--blue-l); transform:translateY(-1px); }\r\n.pth-opt.active { background:var(--blue-l); border-color:var(--blue); color:var(--blue-h); font-weight:800; box-shadow:0 2px 8px rgba(29,78,216,0.18); }\r\n.pth-opt .new-badge { position:absolute; top:-5px; right:-5px; background:var(--red); color:#fff; font-size:8px; font-weight:800; padding:2px 5px; border-radius:10px; text-transform:uppercase; }\r\n.pth-opt-icon { font-size:20px; font-style:normal; }\r\n.pth-opt-text { font-size:10.5px; font-weight:700; line-height:1.1; }\r\n\r\n\/* \u2500\u2500 WORKSPACE \u2500\u2500 *\/\r\n.pth-workspace { display:flex; flex-direction:column; gap:18px; }\r\n\r\n\/* \u2500\u2500 FILE INFO BAR \u2500\u2500 *\/\r\n.pth-file-info {\r\n    display:none; background:var(--surface); border:1px solid var(--border);\r\n    border-radius:var(--r-sm); padding:10px 16px; gap:20px;\r\n    font-size:12px; font-family:'Space Mono',monospace;\r\n    flex-wrap:wrap; align-items:center;\r\n}\r\n.pth-fi-item { display:flex; flex-direction:column; gap:2px; }\r\n.pth-fi-label { font-size:10px; color:var(--text3); font-weight:700; text-transform:uppercase; }\r\n.pth-fi-val { color:var(--blue); font-weight:700; font-size:13px; }\r\n\r\n\/* \u2500\u2500 UPLOAD AREA \u2500\u2500 *\/\r\n.pth-up-area {\r\n    background:var(--bg); border:2px dashed var(--border2); border-radius:var(--r);\r\n    padding:30px 20px; text-align:center; transition:all .3s ease; cursor:pointer;\r\n}\r\n.pth-up-area.dragover { background:var(--blue-l); border-color:var(--blue); transform:scale(1.015); }\r\n.pth-up-area.has-file { border-style:solid; border-color:var(--green); background:var(--green-l); padding:16px 20px; }\r\n.pth-label-btn {\r\n    background:linear-gradient(135deg,#1d4ed8,#1e40af); color:#fff; padding:13px 30px;\r\n    border-radius:var(--r-sm); font-size:14px; font-weight:800; display:inline-flex;\r\n    align-items:center; gap:8px; cursor:pointer; transition:.3s;\r\n    box-shadow:0 4px 14px rgba(29,78,216,0.25); justify-content:center;\r\n}\r\n.pth-label-btn:hover { transform:translateY(-2px); box-shadow:0 6px 20px rgba(29,78,216,0.35); }\r\n.pth-label-btn.disabled { background:#94a3b8; cursor:not-allowed; pointer-events:none; box-shadow:none; }\r\n.pth-up-sub { font-size:12px; color:var(--text2); margin-top:10px; font-weight:600; line-height:1.6; }\r\n.pth-up-tags { display:flex; justify-content:center; gap:8px; margin-top:10px; flex-wrap:wrap; }\r\n.pth-up-tag { background:var(--surface2); color:var(--text2); padding:3px 10px; border-radius:20px; font-size:11px; font-weight:700; border:1px solid var(--border); }\r\n\r\n\/* \u2500\u2500 SETTINGS \u2500\u2500 *\/\r\n.pth-settings { background:var(--surface); border:1px solid var(--border); border-radius:var(--r); padding:18px; }\r\n.pth-global-bar { border-bottom:1px dashed var(--border); padding-bottom:14px; margin-bottom:14px; display:grid; grid-template-columns:1fr 1fr; gap:12px; }\r\n.pth-group { display:none; }\r\n.pth-field { margin-bottom:13px; }\r\n.pth-field:last-child { margin-bottom:0; }\r\n.pth-field label { display:block; font-size:11px; font-weight:800; color:var(--text2); margin-bottom:5px; text-transform:uppercase; letter-spacing:0.5px; }\r\n.pth-input {\r\n    width:100%; padding:9px 12px; border:1px solid var(--border2); border-radius:var(--r-sm);\r\n    font-size:13px; font-family:inherit; background:var(--bg); color:var(--text); outline:none; transition:.2s;\r\n}\r\n.pth-input:focus { border-color:var(--blue); box-shadow:0 0 0 3px rgba(29,78,216,0.08); }\r\n.pth-range { width:100%; cursor:pointer; accent-color:var(--blue); margin-top:2px; }\r\n.pth-val { font-weight:800; color:var(--blue); float:right; font-family:'Space Mono',monospace; }\r\n.pth-note { font-size:11px; color:var(--amber); margin:5px 0 0; font-weight:600; padding:6px 10px; background:var(--amber-l); border-radius:6px; }\r\n.pth-note-info { font-size:11px; color:var(--text2); margin:0; font-weight:600; padding:6px 10px; background:var(--surface2); border-radius:6px; line-height:1.6; }\r\n.pth-grid-2 { display:grid; grid-template-columns:1fr 1fr; gap:12px; }\r\n\r\n\/* COLOR PRESETS *\/\r\n.pth-presets { display:flex; gap:8px; flex-wrap:wrap; margin-top:10px; }\r\n.pth-preset-btn { padding:6px 12px; border-radius:20px; font-size:11px; font-weight:800; cursor:pointer; border:2px solid transparent; transition:.2s; }\r\n.pth-preset-btn:hover { transform:scale(1.05); }\r\n.pth-preset-btn.sel { border-color:var(--blue); box-shadow:0 0 0 2px rgba(29,78,216,0.2); }\r\n.preset-none { background:#e2e8f0; color:#475569; }\r\n.preset-cinema { background:linear-gradient(135deg,#2d1b00,#6b3300); color:#fbbf24; }\r\n.preset-vintage { background:linear-gradient(135deg,#78350f,#92400e); color:#fde68a; }\r\n.preset-cool { background:linear-gradient(135deg,#1e40af,#0369a1); color:#bae6fd; }\r\n.preset-warm { background:linear-gradient(135deg,#dc2626,#ea580c); color:#fef3c7; }\r\n.preset-fade { background:linear-gradient(135deg,#6b7280,#9ca3af); color:#f9fafb; }\r\n.preset-neon { background:linear-gradient(135deg,#7c3aed,#be185d); color:#fce7f3; }\r\n\r\n\/* \u2500\u2500 PREVIEW GRID \u2500\u2500 *\/\r\n.pth-grid { display:grid; grid-template-columns:1fr 1fr; gap:16px; }\r\n@media(max-width:700px){.pth-grid{grid-template-columns:1fr;}}\r\n.pth-card { background:var(--bg); border:1px solid var(--border); border-radius:var(--r); padding:16px; display:flex; flex-direction:column; box-shadow:var(--shadow); }\r\n.pth-card-title { font-size:13px; font-weight:800; color:var(--text); margin-bottom:12px; display:flex; justify-content:space-between; align-items:center; border-bottom:2px solid var(--surface2); padding-bottom:8px; }\r\n.pth-view-port {\r\n    flex-grow:1; display:flex; flex-direction:column; align-items:center; justify-content:center;\r\n    background:#0d1117; border-radius:var(--r-sm); overflow:hidden; position:relative;\r\n    min-height:var(--viewport-min-height);\r\n}\r\n.pth-video-player { width:100%; border-radius:var(--r-sm); object-fit:contain; transition:filter .2s; max-height:var(--player-max-height); }\r\n.pth-ph { color:#475569; text-align:center; padding:20px; }\r\n.pth-ph span { font-size:36px; opacity:0.4; display:block; margin-bottom:8px; }\r\n.pth-ph p { font-size:12px; margin:0; }\r\n\r\n\/* COMPARE SLIDER *\/\r\n.pth-compare-wrap { position:relative; display:none; width:100%; overflow:hidden; border-radius:var(--r-sm); }\r\n.pth-compare-label { position:absolute; top:8px; font-size:10px; font-weight:800; padding:3px 8px; border-radius:4px; z-index:10; pointer-events:none; }\r\n.pth-compare-label.left { left:8px; background:rgba(0,0,0,0.6); color:#fff; }\r\n.pth-compare-label.right { right:8px; background:rgba(29,78,216,0.8); color:#fff; }\r\n.pth-compare-slider { position:absolute; top:0; bottom:0; width:3px; background:#fff; box-shadow:0 0 8px rgba(0,0,0,0.5); cursor:ew-resize; z-index:9; }\r\n.pth-compare-slider::after { content:''; position:absolute; top:50%; left:50%; transform:translate(-50%,-50%); width:28px; height:28px; background:#fff; border-radius:50%; box-shadow:0 2px 8px rgba(0,0,0,0.3); }\r\n.pth-compare-before, .pth-compare-after { position:absolute; inset:0; overflow:hidden; }\r\n.pth-compare-before img,.pth-compare-before video { width:100%; height:100%; object-fit:contain; }\r\n.pth-compare-after img,.pth-compare-after video { width:100%; height:100%; object-fit:contain; position:absolute; inset:0; }\r\n.pth-compare-toggle { background:var(--purple); color:#fff; border:none; padding:7px 14px; border-radius:var(--r-sm); font-size:11px; font-weight:800; cursor:pointer; margin-top:8px; transition:.2s; width:100%; display:none; }\r\n.pth-compare-toggle:hover { background:var(--purple); opacity:.85; }\r\n\r\n.pth-dl-wrap { margin-top:12px; width:100%; display:flex; gap:8px; flex-direction:column; }\r\n.pth-dl-btn { display:none; background:linear-gradient(135deg,#10b981,#059669); color:#fff; width:100%; padding:12px; border-radius:var(--r-sm); font-size:14px; font-weight:800; text-align:center; text-decoration:none; transition:.2s; box-shadow:0 4px 12px rgba(16,185,129,0.2); }\r\n.pth-dl-btn:hover { opacity:.9; transform:translateY(-1px); }\r\n.pth-copy-btn { display:none; background:var(--blue-l); color:var(--blue); width:100%; padding:10px; border-radius:var(--r-sm); font-size:12px; font-weight:800; text-align:center; cursor:pointer; border:1px solid var(--blue-b); transition:.2s; }\r\n.pth-copy-btn:hover { background:var(--blue); color:#fff; }\r\n\r\n\/* \u2500\u2500 FOOTER \/ CONTROLS \u2500\u2500 *\/\r\n.pth-footer { border-top:1px solid var(--border); padding-top:18px; }\r\n.pth-btn-row { display:grid; grid-template-columns:1fr auto; gap:10px; margin-bottom:12px; }\r\n.pth-btn-main { background:linear-gradient(135deg,#1d4ed8,#1e40af); color:#fff; border:none; padding:15px 24px; border-radius:var(--r-sm); font-size:15px; font-weight:800; cursor:pointer; width:100%; transition:.2s; box-shadow:0 4px 15px rgba(29,78,216,0.28); font-family:inherit; }\r\n.pth-btn-main:hover:not(:disabled) { transform:translateY(-1px); box-shadow:0 6px 20px rgba(29,78,216,0.38); }\r\n.pth-btn-main:disabled { background:#cbd5e1; cursor:not-allowed; box-shadow:none; transform:none; }\r\n.pth-reset { background:transparent; border:1px solid var(--red); color:var(--red); padding:15px 20px; border-radius:var(--r-sm); font-size:13px; font-weight:700; cursor:pointer; transition:.2s; display:none; font-family:inherit; white-space:nowrap; }\r\n.pth-reset:hover { background:var(--red-l); }\r\n\r\n.pth-prog-wrap { background:var(--surface2); border-radius:var(--r-sm); overflow:hidden; margin-bottom:12px; display:none; position:relative; height:26px; }\r\n.pth-prog-bar { height:100%; width:0%; background:linear-gradient(90deg,#3b82f6,#1d4ed8); transition:width .3s ease; }\r\n.pth-prog-text { position:absolute; inset:0; display:flex; align-items:center; justify-content:center; font-size:11px; font-weight:800; color:#fff; text-shadow:0 1px 2px rgba(0,0,0,0.4); font-family:'Space Mono',monospace; }\r\n.pth-stages { display:none; gap:4px; margin-bottom:10px; flex-wrap:wrap; }\r\n.pth-stage-dot { padding:3px 10px; border-radius:20px; font-size:10px; font-weight:800; background:var(--surface2); color:var(--text3); border:1px solid var(--border); transition:.3s; }\r\n.pth-stage-dot.active { background:var(--blue-l); color:var(--blue); border-color:var(--blue-b); }\r\n.pth-stage-dot.done { background:var(--green-l); color:var(--green); border-color:#a7f3d0; }\r\n.pth-timer { font-family:'Space Mono',monospace; font-size:13px; font-weight:700; color:var(--blue); margin-bottom:10px; display:none; text-align:right; }\r\n\r\n\/* \u2500\u2500 LOG \u2500\u2500 *\/\r\n.pth-log-header { display:flex; justify-content:space-between; align-items:center; margin-bottom:6px; }\r\n.pth-log-title { font-size:11px; font-weight:800; color:var(--text3); text-transform:uppercase; letter-spacing:0.8px; }\r\n.pth-log-clear { background:transparent; border:none; color:var(--text3); font-size:11px; cursor:pointer; font-weight:600; }\r\n.pth-black-cage {\r\n    background:#0d1117; color:#38bdf8; padding:12px 14px; border-radius:var(--r-sm);\r\n    font-family:'Space Mono',monospace; font-size:11px; height:130px;\r\n    overflow-y:auto; text-align:left; border:1px solid #1e293b;\r\n    box-shadow:inset 0 2px 10px rgba(0,0,0,0.4);\r\n}\r\n.pth-black-cage div { margin-bottom:4px; border-bottom:1px dashed rgba(255,255,255,0.06); padding-bottom:4px; line-height:1.5; }\r\n.pth-black-cage .step { color:#facc15; font-weight:700; }\r\n.pth-black-cage .err { color:#f87171; }\r\n.pth-black-cage .ok { color:#34d399; }\r\n\r\n\/* \u2500\u2500 SHORTCUTS MODAL \u2500\u2500 *\/\r\n.pth-modal-overlay { position:fixed; inset:0; background:rgba(15,23,42,0.6); display:none; align-items:center; justify-content:center; z-index:9999; backdrop-filter:blur(4px); }\r\n.pth-modal { background:#fff; border-radius:16px; padding:28px; max-width:420px; width:90%; box-shadow:0 20px 60px rgba(0,0,0,0.2); }\r\n.pth-modal h3 { margin:0 0 18px; font-size:18px; font-weight:900; }\r\n.pth-kv { display:flex; justify-content:space-between; align-items:center; padding:8px 0; border-bottom:1px solid var(--border); font-size:13px; }\r\n.pth-kv:last-child { border-bottom:none; }\r\n.pth-kv kbd { background:var(--surface2); border:1px solid var(--border2); border-radius:4px; padding:3px 8px; font-family:'Space Mono',monospace; font-size:11px; font-weight:700; }\r\n.pth-modal-close { background:var(--red); color:#fff; border:none; padding:10px 20px; border-radius:var(--r-sm); font-size:13px; font-weight:800; cursor:pointer; width:100%; margin-top:18px; font-family:inherit; }\r\n\r\n\/* SCROLLBAR *\/\r\n.pth-black-cage::-webkit-scrollbar { width:4px; }\r\n.pth-black-cage::-webkit-scrollbar-track { background:#1e293b; }\r\n.pth-black-cage::-webkit-scrollbar-thumb { background:#334155; border-radius:2px; }\r\n\r\n\/* HIDDEN *\/\r\n.hidden { display:none!important; }\r\n<\/style>\r\n\r\n<div id=\"pth-turbo-wrapper\">\r\n\r\n    <!-- HEADER -->\r\n    <div class=\"pth-header\">\r\n        <div class=\"pth-title-container\">\r\n            <div class=\"pth-title-icon\">\u26a1<\/div>\r\n            <div class=\"pth-title-text\">\r\n                <h2>Turbo Video Studio Pro<\/h2>\r\n                <p>Multi-Threaded \u2022 100% Offline \u2022 v5.0<\/p>\r\n            <\/div>\r\n        <\/div>\r\n        <div class=\"pth-header-right\">\r\n            <button class=\"pth-shortcuts-btn\" onclick=\"document.getElementById('pth-modal').style.display='flex'\">\u2328\ufe0f Shortcuts<\/button>\r\n            <div class=\"pth-badge pth-badge-info\" id=\"pth-file-badge\">No file loaded<\/div>\r\n            <div class=\"pth-badge pth-badge-turbo\" id=\"pth-status-badge\">\u23f3 Loading\u2026<\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <!-- MAIN LAYOUT -->\r\n    <div class=\"pth-main-layout\">\r\n\r\n        <!-- SIDEBAR -->\r\n        <div class=\"pth-sidebar\">\r\n            <div class=\"pth-sidebar-head\">Tools<\/div>\r\n            <div class=\"pth-search-wrap\">\r\n                <input type=\"text\" id=\"pth-tool-search\" placeholder=\"Search tools...\" oninput=\"window.pthSearchTools(this.value)\">\r\n            <\/div>\r\n\r\n            <div class=\"pth-cat-label\">\ud83d\udce6 Basic<\/div>\r\n            <div class=\"pth-tools\" id=\"pth-tools-basic\">\r\n                <div class=\"pth-opt active\" id=\"pth-btn-compress\" onclick=\"window.pthSetTool('compress')\"><i class=\"pth-opt-icon\">\ud83d\udddc\ufe0f<\/i><span class=\"pth-opt-text\">Compress<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-trim\" onclick=\"window.pthSetTool('trim')\"><i class=\"pth-opt-icon\">\u2702\ufe0f<\/i><span class=\"pth-opt-text\">Trim<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-convert\" onclick=\"window.pthSetTool('convert')\"><i class=\"pth-opt-icon\">\ud83d\udd04<\/i><span class=\"pth-opt-text\">Convert<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-snapshot\" onclick=\"window.pthSetTool('snapshot')\"><i class=\"pth-opt-icon\">\ud83d\udcf8<\/i><span class=\"pth-opt-text\">Snapshot<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-extractaudio\" onclick=\"window.pthSetTool('extractaudio')\"><i class=\"pth-opt-icon\">\ud83c\udfb5<\/i><span class=\"pth-opt-text\">Audio(MP3)<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-mute\" onclick=\"window.pthSetTool('mute')\"><i class=\"pth-opt-icon\">\ud83d\udd07<\/i><span class=\"pth-opt-text\">Mute<\/span><\/div>\r\n            <\/div>\r\n\r\n            <div class=\"pth-cat-label\">\ud83c\udfac Transform<\/div>\r\n            <div class=\"pth-tools\" id=\"pth-tools-transform\">\r\n                <div class=\"pth-opt\" id=\"pth-btn-reverse\" onclick=\"window.pthSetTool('reverse')\"><i class=\"pth-opt-icon\">\u23ea<\/i><span class=\"pth-opt-text\">Reverse<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-mirror\" onclick=\"window.pthSetTool('mirror')\"><i class=\"pth-opt-icon\">\u2194\ufe0f<\/i><span class=\"pth-opt-text\">Mirror<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-revmirror\" onclick=\"window.pthSetTool('revmirror')\"><i class=\"pth-opt-icon\">\ud83d\udd00<\/i><span class=\"pth-opt-text\">Rev+Mirror<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-speed\" onclick=\"window.pthSetTool('speed')\"><i class=\"pth-opt-icon\">\u26a1<\/i><span class=\"pth-opt-text\">Speed<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-rotate\" onclick=\"window.pthSetTool('rotate')\"><i class=\"pth-opt-icon\">\ud83d\udd03<\/i><span class=\"pth-opt-text\">Rotate<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-resize\" onclick=\"window.pthSetTool('resize')\"><i class=\"pth-opt-icon\">\ud83d\udccf<\/i><span class=\"pth-opt-text\">Resize<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-crop\" onclick=\"window.pthSetTool('crop')\"><i class=\"pth-opt-icon\">\ud83d\uddbc\ufe0f<\/i><span class=\"pth-opt-text\">Crop<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-fps\" onclick=\"window.pthSetTool('fps')\"><i class=\"pth-opt-icon\">\u23f1\ufe0f<\/i><span class=\"pth-opt-text\">FPS<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-loop\" onclick=\"window.pthSetTool('loop')\"><i class=\"pth-opt-icon\">\ud83d\udd01<\/i><span class=\"pth-opt-text\">Loop<span class=\"new-badge\">NEW<\/span><\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-fade\" onclick=\"window.pthSetTool('fade')\"><i class=\"pth-opt-icon\">\ud83c\udf05<\/i><span class=\"pth-opt-text\">Fade<span class=\"new-badge\">NEW<\/span><\/span><\/div>\r\n            <\/div>\r\n\r\n            <div class=\"pth-cat-label\">\ud83c\udfa8 Color \/ FX<\/div>\r\n            <div class=\"pth-tools\" id=\"pth-tools-color\">\r\n                <div class=\"pth-opt\" id=\"pth-btn-brightness\" onclick=\"window.pthSetTool('brightness')\"><i class=\"pth-opt-icon\">\u2600\ufe0f<\/i><span class=\"pth-opt-text\">Brightness<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-contrast\" onclick=\"window.pthSetTool('contrast')\"><i class=\"pth-opt-icon\">\ud83c\udf13<\/i><span class=\"pth-opt-text\">Contrast<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-saturation\" onclick=\"window.pthSetTool('saturation')\"><i class=\"pth-opt-icon\">\ud83c\udf08<\/i><span class=\"pth-opt-text\">Saturation<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-sharpen\" onclick=\"window.pthSetTool('sharpen')\"><i class=\"pth-opt-icon\">\ud83e\ude84<\/i><span class=\"pth-opt-text\">Sharpen<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-grayscale\" onclick=\"window.pthSetTool('grayscale')\"><i class=\"pth-opt-icon\">\u26ab<\/i><span class=\"pth-opt-text\">Grayscale<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-colorgrade\" onclick=\"window.pthSetTool('colorgrade')\"><i class=\"pth-opt-icon\">\ud83c\udf9e\ufe0f<\/i><span class=\"pth-opt-text\">Color Grade<span class=\"new-badge\">NEW<\/span><\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-vignette\" onclick=\"window.pthSetTool('vignette')\"><i class=\"pth-opt-icon\">\ud83d\udd18<\/i><span class=\"pth-opt-text\">Vignette<span class=\"new-badge\">NEW<\/span><\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-denoise\" onclick=\"window.pthSetTool('denoise')\"><i class=\"pth-opt-icon\">\u2728<\/i><span class=\"pth-opt-text\">Denoise<span class=\"new-badge\">NEW<\/span><\/span><\/div>\r\n            <\/div>\r\n\r\n            <div class=\"pth-cat-label\">\ud83d\udcdd Overlay<\/div>\r\n            <div class=\"pth-tools\" id=\"pth-tools-overlay\">\r\n                <div class=\"pth-opt\" id=\"pth-btn-watermark\" onclick=\"window.pthSetTool('watermark')\"><i class=\"pth-opt-icon\">\u270d\ufe0f<\/i><span class=\"pth-opt-text\">Watermark<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-volume\" onclick=\"window.pthSetTool('volume')\"><i class=\"pth-opt-icon\">\ud83d\udd0a<\/i><span class=\"pth-opt-text\">Volume<\/span><\/div>\r\n                <div class=\"pth-opt\" id=\"pth-btn-subtitle\" onclick=\"window.pthSetTool('subtitle')\"><i class=\"pth-opt-icon\">\ud83d\udcac<\/i><span class=\"pth-opt-text\">Subtitle<span class=\"new-badge\">NEW<\/span><\/span><\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <!-- WORKSPACE -->\r\n        <div class=\"pth-workspace\">\r\n\r\n            <!-- FILE INFO BAR -->\r\n            <div class=\"pth-file-info\" id=\"pth-file-info\">\r\n                <div class=\"pth-fi-item\"><div class=\"pth-fi-label\">File Name<\/div><div class=\"pth-fi-val\" id=\"fi-name\">\u2014<\/div><\/div>\r\n                <div class=\"pth-fi-item\"><div class=\"pth-fi-label\">File Size<\/div><div class=\"pth-fi-val\" id=\"fi-size\">\u2014<\/div><\/div>\r\n                <div class=\"pth-fi-item\"><div class=\"pth-fi-label\">Duration<\/div><div class=\"pth-fi-val\" id=\"fi-dur\">\u2014<\/div><\/div>\r\n                <div class=\"pth-fi-item\"><div class=\"pth-fi-label\">Resolution<\/div><div class=\"pth-fi-val\" id=\"fi-res\">\u2014<\/div><\/div>\r\n                <div class=\"pth-fi-item\"><div class=\"pth-fi-label\">Type<\/div><div class=\"pth-fi-val\" id=\"fi-type\">\u2014<\/div><\/div>\r\n            <\/div>\r\n\r\n            <!-- UPLOAD -->\r\n            <div class=\"pth-up-area\" id=\"pth-drop-zone\" onclick=\"document.getElementById('pth-file-input').click()\">\r\n                <div id=\"pth-up-content\">\r\n                    <label class=\"pth-label-btn disabled\" id=\"pth-up-label\" onclick=\"event.stopPropagation()\">Loading Engine\u2026<\/label>\r\n                    <p class=\"pth-up-sub\">Drag & Drop File Here or Click to Browse<br>Maximum Speed \u2022 Multi-Thread Enabled \u2022 100% Offline Privacy<\/p>\r\n                    <div class=\"pth-up-tags\">\r\n                        <span class=\"pth-up-tag\">MP4<\/span><span class=\"pth-up-tag\">MOV<\/span><span class=\"pth-up-tag\">AVI<\/span>\r\n                        <span class=\"pth-up-tag\">WEBM<\/span><span class=\"pth-up-tag\">MKV<\/span><span class=\"pth-up-tag\">GIF<\/span>\r\n                        <span class=\"pth-up-tag\">PNG<\/span><span class=\"pth-up-tag\">JPG<\/span><span class=\"pth-up-tag\">WEBP<\/span>\r\n                    <\/div>\r\n                <\/div>\r\n                <input type=\"file\" id=\"pth-file-input\" accept=\"video\/*,image\/*\" style=\"display:none;\" onchange=\"window.pthHandle(this)\">\r\n            <\/div>\r\n\r\n            <!-- SETTINGS -->\r\n            <div class=\"pth-settings\" id=\"pth-settings-area\">\r\n\r\n                <div class=\"pth-global-bar\">\r\n                    <div class=\"pth-field\" style=\"margin:0\">\r\n                        <label>\ud83c\udf10 Export Quality<\/label>\r\n                        <select id=\"pth-comp-lvl\" class=\"pth-input\">\r\n                            <option value=\"18\">Ultra High (Large)<\/option>\r\n                            <option value=\"23\">High Quality<\/option>\r\n                            <option value=\"28\" selected>Standard (Balanced)<\/option>\r\n                            <option value=\"32\">Extreme Small<\/option>\r\n                        <\/select>\r\n                    <\/div>\r\n                    <div class=\"pth-field\" style=\"margin:0\">\r\n                        <label>\ud83d\udd0a Audio Bitrate<\/label>\r\n                        <select id=\"pth-audio-bitrate\" class=\"pth-input\">\r\n                            <option value=\"320k\">320k (HQ)<\/option>\r\n                            <option value=\"192k\" selected>192k (Standard)<\/option>\r\n                            <option value=\"128k\">128k (Small)<\/option>\r\n                            <option value=\"96k\">96k (Mini)<\/option>\r\n                        <\/select>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <!-- Tool-specific settings -->\r\n                <div id=\"pth-set-compress\" class=\"pth-group\" style=\"display:block;\">\r\n                    <p class=\"pth-note-info\">Uses Global Export Quality to reduce file size. Supports video & images. Output is re-encoded with libx264 for maximum compatibility.<\/p>\r\n                <\/div>\r\n\r\n                <div id=\"pth-set-trim\" class=\"pth-group\">\r\n                    <div class=\"pth-grid-2\">\r\n                        <div class=\"pth-field\"><label>Start (HH:MM:SS or s)<\/label><input type=\"text\" id=\"pth-trim-s\" class=\"pth-input\" value=\"00:00:00\" placeholder=\"00:00:00\"><\/div>\r\n                        <div class=\"pth-field\"><label>End (HH:MM:SS or s)<\/label><input type=\"text\" id=\"pth-trim-e\" class=\"pth-input\" value=\"00:00:10\" placeholder=\"00:00:10\"><\/div>\r\n                    <\/div>\r\n                    <div class=\"pth-field\">\r\n                        <label>Trim Mode<\/label>\r\n                        <select id=\"pth-trim-mode\" class=\"pth-input\">\r\n                            <option value=\"copy\">Fast (No Re-encode)<\/option>\r\n                            <option value=\"reencode\">Precise (Re-encode)<\/option>\r\n                        <\/select>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div id=\"pth-set-speed\" class=\"pth-group\">\r\n                    <div class=\"pth-field\"><label>Playback Rate <span id=\"pth-spd-val\" class=\"pth-val\">1.0\u00d7<\/span><\/label><input type=\"range\" id=\"pth-spd-rng\" class=\"pth-range\" min=\"0.25\" max=\"4.0\" step=\"0.05\" value=\"1.0\" oninput=\"document.getElementById('pth-spd-val').innerText=parseFloat(this.value).toFixed(2)+'\u00d7'\"><\/div>\r\n                    <p class=\"pth-note-info\">Range: 0.25\u00d7 (slow-mo) to 4.0\u00d7 (fast forward). Audio pitch is auto-corrected.<\/p>\r\n                <\/div>\r\n\r\n                <div id=\"pth-set-convert\" class=\"pth-group\">\r\n                    <div class=\"pth-grid-2\">\r\n                        <div class=\"pth-field\"><label>Output Format<\/label>\r\n                            <select id=\"pth-conv-fmt\" class=\"pth-input\">\r\n                                <option value=\"mp4\">MP4 (H.264)<\/option>\r\n                                <option value=\"webm\">WebM (VP8)<\/option>\r\n                                <option value=\"gif\">Animated GIF<\/option>\r\n                            <\/select>\r\n                        <\/div>\r\n                        <div class=\"pth-field\"><label>GIF FPS (if GIF)<\/label><input type=\"number\" id=\"pth-gif-fps\" class=\"pth-input\" value=\"12\" min=\"5\" max=\"30\"><\/div>\r\n                    <\/div>\r\n                    <div class=\"pth-field\"><label>GIF Width (px, 0=auto)<\/label><input type=\"number\" id=\"pth-gif-w\" class=\"pth-input\" value=\"480\" min=\"100\" max=\"1920\"><\/div>\r\n                <\/div>\r\n\r\n                <div id=\"pth-set-rotate\" class=\"pth-group\">\r\n                    <div class=\"pth-field\"><label>Rotation<\/label>\r\n                        <select id=\"pth-rot-val\" class=\"pth-input\">\r\n                            <option value=\"90\">90\u00b0 Clockwise<\/option>\r\n                            <option value=\"180\">180\u00b0 (Upside Down)<\/option>\r\n                            <option value=\"270\">90\u00b0 Counter-Clockwise<\/option>\r\n                            <option value=\"vflip\">Vertical Flip<\/option>\r\n                        <\/select>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div id=\"pth-set-resize\" class=\"pth-group\">\r\n                    <div class=\"pth-field\"><label>Preset Width<\/label>\r\n                        <select id=\"pth-res-val\" class=\"pth-input\">\r\n                            <option value=\"3840\">3840px (4K UHD)<\/option>\r\n                            <option value=\"1920\">1920px (Full HD)<\/option>\r\n                            <option value=\"1280\">1280px (HD)<\/option>\r\n                            <option value=\"854\">854px (SD)<\/option>\r\n                            <option value=\"640\">640px (Web)<\/option>\r\n                            <option value=\"480\">480px (Mobile)<\/option>\r\n                            <option value=\"custom\">Custom\u2026<\/option>\r\n                        <\/select>\r\n                    <\/div>\r\n                    <div class=\"pth-field\" id=\"pth-res-custom-wrap\" style=\"display:none;\"><label>Custom Width (px)<\/label><input type=\"number\" id=\"pth-res-custom\" class=\"pth-input\" value=\"720\" min=\"100\" max=\"7680\"><\/div>\r\n                <\/div>\r\n\r\n                <div id=\"pth-set-volume\" class=\"pth-group\">\r\n                    <div class=\"pth-field\"><label>Master Volume <span id=\"pth-vol-val\" class=\"pth-val\">100%<\/span><\/label><input type=\"range\" id=\"pth-vol-rng\" class=\"pth-range\" min=\"0\" max=\"300\" step=\"5\" value=\"100\" oninput=\"document.getElementById('pth-vol-val').innerText=this.value+'%'\"><\/div>\r\n                    <p class=\"pth-note-info\">0% = silent, 100% = original, 300% = triple boost. Exceeding 150% may cause clipping.<\/p>\r\n                <\/div>\r\n\r\n                <div id=\"pth-set-crop\" class=\"pth-group\">\r\n                    <div class=\"pth-field\"><label>Aspect Ratio Crop<\/label>\r\n                        <select id=\"pth-crop-val\" class=\"pth-input\">\r\n                            <option value=\"center\">Center Focus (80%)<\/option>\r\n                            <option value=\"square\">1:1 Square<\/option>\r\n                            <option value=\"portrait\">9:16 Portrait (Shorts\/Reels)<\/option>\r\n                            <option value=\"wide\">21:9 Ultra-Wide<\/option>\r\n                            <option value=\"cinema\">2.35:1 Cinematic<\/option>\r\n                        <\/select>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div id=\"pth-set-fps\" class=\"pth-group\">\r\n                    <div class=\"pth-field\"><label>Frame Rate (FPS)<\/label>\r\n                        <select id=\"pth-fps-preset\" class=\"pth-input\">\r\n                            <option value=\"24\">24 fps (Cinematic)<\/option>\r\n                            <option value=\"25\">25 fps (PAL)<\/option>\r\n                            <option value=\"30\" selected>30 fps (Standard)<\/option>\r\n                            <option value=\"50\">50 fps (Smooth)<\/option>\r\n                            <option value=\"60\">60 fps (High)<\/option>\r\n                            <option value=\"custom\">Custom\u2026<\/option>\r\n                        <\/select>\r\n                    <\/div>\r\n                    <div class=\"pth-field\" id=\"pth-fps-custom-wrap\" style=\"display:none;\"><label>Custom FPS<\/label><input type=\"number\" id=\"pth-fps-val\" class=\"pth-input\" value=\"30\" min=\"1\" max=\"120\"><\/div>\r\n                <\/div>\r\n\r\n                <div id=\"pth-set-loop\" class=\"pth-group\">\r\n                    <div class=\"pth-field\"><label>Loop Count <span id=\"pth-loop-val\" class=\"pth-val\">2\u00d7<\/span><\/label><input type=\"range\" id=\"pth-loop-rng\" class=\"pth-range\" min=\"2\" max=\"10\" step=\"1\" value=\"2\" oninput=\"document.getElementById('pth-loop-val').innerText=this.value+'\u00d7'\"><\/div>\r\n                    <p class=\"pth-note-info\">Repeats the video N times seamlessly. Great for creating looping content.<\/p>\r\n                <\/div>\r\n\r\n                <div id=\"pth-set-fade\" class=\"pth-group\">\r\n                    <div class=\"pth-grid-2\">\r\n                        <div class=\"pth-field\"><label>Fade In Duration (s)<\/label><input type=\"number\" id=\"pth-fade-in\" class=\"pth-input\" value=\"1\" min=\"0\" max=\"10\" step=\"0.5\"><\/div>\r\n                        <div class=\"pth-field\"><label>Fade Out Duration (s)<\/label><input type=\"number\" id=\"pth-fade-out\" class=\"pth-input\" value=\"1\" min=\"0\" max=\"10\" step=\"0.5\"><\/div>\r\n                    <\/div>\r\n                    <div class=\"pth-field\">\r\n                        <label>Fade Type<\/label>\r\n                        <select id=\"pth-fade-type\" class=\"pth-input\">\r\n                            <option value=\"both\">Video + Audio Fade<\/option>\r\n                            <option value=\"video\">Video Only<\/option>\r\n                            <option value=\"audio\">Audio Only<\/option>\r\n                        <\/select>\r\n                    <\/div>\r\n                    <p class=\"pth-note-info\">Requires video duration info. Upload video first for best results.<\/p>\r\n                <\/div>\r\n\r\n                <div id=\"pth-set-brightness\" class=\"pth-group\">\r\n                    <div class=\"pth-field\"><label>Brightness <span id=\"pth-bri-val\" class=\"pth-val\">0.00<\/span><\/label><input type=\"range\" id=\"pth-bri-rng\" class=\"pth-range\" min=\"-0.5\" max=\"0.5\" step=\"0.01\" value=\"0\" oninput=\"document.getElementById('pth-bri-val').innerText=parseFloat(this.value).toFixed(2); window.updateLivePreview();\"><\/div>\r\n                    <p class=\"pth-note\">Live preview active on source video.<\/p>\r\n                <\/div>\r\n\r\n                <div id=\"pth-set-saturation\" class=\"pth-group\">\r\n                    <div class=\"pth-field\"><label>Saturation <span id=\"pth-sat-val\" class=\"pth-val\">1.0<\/span><\/label><input type=\"range\" id=\"pth-sat-rng\" class=\"pth-range\" min=\"0\" max=\"3\" step=\"0.1\" value=\"1\" oninput=\"document.getElementById('pth-sat-val').innerText=parseFloat(this.value).toFixed(1); window.updateLivePreview();\"><\/div>\r\n                    <p class=\"pth-note\">Live preview active on source video.<\/p>\r\n                <\/div>\r\n\r\n                <div id=\"pth-set-contrast\" class=\"pth-group\">\r\n                    <div class=\"pth-field\"><label>Contrast <span id=\"pth-cont-val\" class=\"pth-val\">1.0<\/span><\/label><input type=\"range\" id=\"pth-cont-rng\" class=\"pth-range\" min=\"0\" max=\"3\" step=\"0.1\" value=\"1\" oninput=\"document.getElementById('pth-cont-val').innerText=parseFloat(this.value).toFixed(1); window.updateLivePreview();\"><\/div>\r\n                    <p class=\"pth-note\">Live preview active on source video.<\/p>\r\n                <\/div>\r\n\r\n                <div id=\"pth-set-watermark\" class=\"pth-group\">\r\n                    <div class=\"pth-grid-2\">\r\n                        <div class=\"pth-field\"><label>Overlay Text<\/label><input type=\"text\" id=\"pth-wm-text\" class=\"pth-input\" value=\"PrimeToolHub\"><\/div>\r\n                        <div class=\"pth-field\"><label>Font Size (px)<\/label><input type=\"number\" id=\"pth-wm-size\" class=\"pth-input\" value=\"24\" min=\"10\" max=\"120\"><\/div>\r\n                    <\/div>\r\n                    <div class=\"pth-grid-2\">\r\n                        <div class=\"pth-field\"><label>Position<\/label>\r\n                            <select id=\"pth-wm-pos\" class=\"pth-input\">\r\n                                <option value=\"tl\">Top Left<\/option>\r\n                                <option value=\"tr\">Top Right<\/option>\r\n                                <option value=\"bl\">Bottom Left<\/option>\r\n                                <option value=\"br\" selected>Bottom Right<\/option>\r\n                                <option value=\"center\">Center<\/option>\r\n                            <\/select>\r\n                        <\/div>\r\n                        <div class=\"pth-field\"><label>Opacity (0\u20131)<\/label><input type=\"number\" id=\"pth-wm-opacity\" class=\"pth-input\" value=\"0.8\" min=\"0.1\" max=\"1\" step=\"0.1\"><\/div>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div id=\"pth-set-colorgrade\" class=\"pth-group\">\r\n                    <div class=\"pth-field\"><label>Color Grade Preset<\/label><\/div>\r\n                    <div class=\"pth-presets\" id=\"pth-presets-wrap\">\r\n                        <button class=\"pth-preset-btn preset-none sel\" data-preset=\"none\" onclick=\"window.pthSelectPreset(this,'none')\">Original<\/button>\r\n                        <button class=\"pth-preset-btn preset-cinema\" data-preset=\"cinema\" onclick=\"window.pthSelectPreset(this,'cinema')\">\ud83c\udfac Cinematic<\/button>\r\n                        <button class=\"pth-preset-btn preset-vintage\" data-preset=\"vintage\" onclick=\"window.pthSelectPreset(this,'vintage')\">\ud83d\udcf7 Vintage<\/button>\r\n                        <button class=\"pth-preset-btn preset-cool\" data-preset=\"cool\" onclick=\"window.pthSelectPreset(this,'cool')\">\u2744\ufe0f Cool<\/button>\r\n                        <button class=\"pth-preset-btn preset-warm\" data-preset=\"warm\" onclick=\"window.pthSelectPreset(this,'warm')\">\ud83d\udd25 Warm<\/button>\r\n                        <button class=\"pth-preset-btn preset-fade\" data-preset=\"fade\" onclick=\"window.pthSelectPreset(this,'fade')\">\ud83c\udf2b\ufe0f Faded<\/button>\r\n                        <button class=\"pth-preset-btn preset-neon\" data-preset=\"neon\" onclick=\"window.pthSelectPreset(this,'neon')\">\ud83c\udf08 Neon<\/button>\r\n                    <\/div>\r\n                    <p class=\"pth-note-info\" style=\"margin-top:12px;\">Each preset applies a custom color-curve filter via FFmpeg eq parameters.<\/p>\r\n                <\/div>\r\n\r\n                <div id=\"pth-set-vignette\" class=\"pth-group\">\r\n                    <div class=\"pth-field\"><label>Vignette Intensity <span id=\"pth-vig-val\" class=\"pth-val\">0.5<\/span><\/label><input type=\"range\" id=\"pth-vig-rng\" class=\"pth-range\" min=\"0.1\" max=\"1.5\" step=\"0.05\" value=\"0.5\" oninput=\"document.getElementById('pth-vig-val').innerText=parseFloat(this.value).toFixed(2)\"><\/div>\r\n                    <p class=\"pth-note-info\">Adds a dark circular border to the video \u2014 cinematic look.<\/p>\r\n                <\/div>\r\n\r\n                <div id=\"pth-set-denoise\" class=\"pth-group\">\r\n                    <div class=\"pth-field\"><label>Denoise Strength<\/label>\r\n                        <select id=\"pth-denoise-val\" class=\"pth-input\">\r\n                            <option value=\"light\">Light (hqdn3d=3:3:6:6)<\/option>\r\n                            <option value=\"medium\" selected>Medium (hqdn3d=6:6:10:10)<\/option>\r\n                            <option value=\"heavy\">Heavy (hqdn3d=10:10:15:15)<\/option>\r\n                        <\/select>\r\n                    <\/div>\r\n                    <p class=\"pth-note-info\">Removes temporal noise. Heavier settings take longer but clean up grainier footage better.<\/p>\r\n                <\/div>\r\n\r\n                <div id=\"pth-set-subtitle\" class=\"pth-group\">\r\n                    <div class=\"pth-field\"><label>Subtitle Text (one line)<\/label><input type=\"text\" id=\"pth-sub-text\" class=\"pth-input\" value=\"Subscribe for more videos!\"><\/div>\r\n                    <div class=\"pth-grid-2\">\r\n                        <div class=\"pth-field\"><label>Show at (seconds)<\/label><input type=\"number\" id=\"pth-sub-start\" class=\"pth-input\" value=\"2\" min=\"0\" step=\"0.5\"><\/div>\r\n                        <div class=\"pth-field\"><label>Hide at (seconds)<\/label><input type=\"number\" id=\"pth-sub-end\" class=\"pth-input\" value=\"6\" min=\"0\" step=\"0.5\"><\/div>\r\n                    <\/div>\r\n                    <div class=\"pth-field\"><label>Font Size<\/label><input type=\"number\" id=\"pth-sub-size\" class=\"pth-input\" value=\"28\" min=\"12\" max=\"80\"><\/div>\r\n                    <p class=\"pth-note-info\">Text appears at the bottom center between specified time codes. Includes semi-transparent background box.<\/p>\r\n                <\/div>\r\n\r\n                <!-- Stateless info panels -->\r\n                <div id=\"pth-set-reverse\" class=\"pth-group\"><p class=\"pth-note-info\">Reverses video and audio playback backwards. Works best with short clips.<\/p><\/div>\r\n                <div id=\"pth-set-mirror\" class=\"pth-group\"><p class=\"pth-note-info\">Flips video horizontally (Left\u2194Right mirror effect).<\/p><\/div>\r\n                <div id=\"pth-set-revmirror\" class=\"pth-group\"><p class=\"pth-note-info\">Applies Reverse + Horizontal Mirror simultaneously in one pass.<\/p><\/div>\r\n                <div id=\"pth-set-mute\" class=\"pth-group\"><p class=\"pth-note-info\">Permanently strips all audio tracks. Output file will be silent.<\/p><\/div>\r\n                <div id=\"pth-set-extractaudio\" class=\"pth-group\"><p class=\"pth-note-info\">Extracts audio track and exports as high-quality MP3. Uses Audio Bitrate setting above.<\/p><\/div>\r\n                <div id=\"pth-set-snapshot\" class=\"pth-group\"><p class=\"pth-note-info\">Captures the very first frame of the video as a full-resolution JPG image.<\/p><\/div>\r\n                <div id=\"pth-set-sharpen\" class=\"pth-group\"><p class=\"pth-note-info\">Applies unsharp masking (5\u00d75 kernel) to enhance edge clarity and detail.<\/p><\/div>\r\n                <div id=\"pth-set-grayscale\" class=\"pth-group\"><p class=\"pth-note\">Live Preview Active. Converts video to Black & White (removes all color data).<\/p><\/div>\r\n            <\/div>\r\n\r\n            <!-- PREVIEW GRID -->\r\n            <div class=\"pth-grid\">\r\n                <div class=\"pth-card\">\r\n                    <div class=\"pth-card-title\"><span>Original Source<\/span><span id=\"pth-in-sz\" style=\"color:var(--blue); font-family:'Space Mono',monospace;\">\u2014<\/span><\/div>\r\n                    <div class=\"pth-view-port\">\r\n                        <div class=\"pth-ph\" id=\"pth-in-ph\"><span>\ud83d\udcf9<\/span><p>Upload a video or image<\/p><\/div>\r\n                        <video id=\"pth-vid-in\" class=\"pth-video-player\" controls preload=\"auto\" style=\"display:none;\" playsinline><\/video>\r\n                        <img id=\"pth-img-in\" class=\"pth-video-player\" style=\"display:none;\" alt=\"Input\">\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"pth-card\">\r\n                    <div class=\"pth-card-title\"><span>Output Result<\/span><span id=\"pth-out-sz\" style=\"color:var(--green); font-family:'Space Mono',monospace;\"><\/span><\/div>\r\n                    <div class=\"pth-view-port\">\r\n                        <div class=\"pth-ph\" id=\"pth-out-ph\"><span>\u2728<\/span><p>Result appears here<\/p><\/div>\r\n                        <video id=\"pth-vid-out\" class=\"pth-video-player\" controls preload=\"auto\" style=\"display:none;\" playsinline><\/video>\r\n                        <img id=\"pth-img-out\" class=\"pth-video-player\" style=\"display:none;\" alt=\"Output\">\r\n                    <\/div>\r\n                    <div class=\"pth-dl-wrap\">\r\n                        <a id=\"pth-dl-btn\" class=\"pth-dl-btn\" download>\u2b07\ufe0f DOWNLOAD RESULT<\/a>\r\n                        <button id=\"pth-copy-btn\" class=\"pth-copy-btn\" onclick=\"window.pthCopyToClipboard()\">\ud83d\udccb Copy to Clipboard<\/button>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <!-- FOOTER -->\r\n            <div class=\"pth-footer\">\r\n                <div class=\"pth-stages\" id=\"pth-stages\">\r\n                    <div class=\"pth-stage-dot\" id=\"st-init\">Init<\/div>\r\n                    <div class=\"pth-stage-dot\" id=\"st-load\">Load File<\/div>\r\n                    <div class=\"pth-stage-dot\" id=\"st-build\">Build CMD<\/div>\r\n                    <div class=\"pth-stage-dot\" id=\"st-render\">Render<\/div>\r\n                    <div class=\"pth-stage-dot\" id=\"st-export\">Export<\/div>\r\n                <\/div>\r\n                <div class=\"pth-prog-wrap\" id=\"pth-prog-wrap\">\r\n                    <div class=\"pth-prog-bar\" id=\"pth-prog-bar\"><\/div>\r\n                    <div class=\"pth-prog-text\" id=\"pth-prog-text\">0%<\/div>\r\n                <\/div>\r\n                <div id=\"pth-timer\" class=\"pth-timer\">\u23f1\ufe0f Render Time: 00:00<\/div>\r\n                <div class=\"pth-btn-row\">\r\n                    <button id=\"pth-btn-main\" class=\"pth-btn-main\" onclick=\"window.pthProcess()\">\u26a1 START PROCESSING<\/button>\r\n                    <button id=\"pth-btn-reset\" class=\"pth-reset\" onclick=\"window.location.reload()\">\ud83d\udd04 Reset<\/button>\r\n                <\/div>\r\n                <div class=\"pth-log-header\">\r\n                    <div class=\"pth-log-title\">System Log<\/div>\r\n                    <button class=\"pth-log-clear\" onclick=\"document.getElementById('pth-log').innerHTML=''\">Clear<\/button>\r\n                <\/div>\r\n                <div id=\"pth-log\" class=\"pth-black-cage\"><\/div>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\r\n\r\n<!-- SHORTCUTS MODAL -->\r\n<div class=\"pth-modal-overlay\" id=\"pth-modal\" onclick=\"if(event.target===this)this.style.display='none'\">\r\n    <div class=\"pth-modal\">\r\n        <h3>\u2328\ufe0f Keyboard Shortcuts<\/h3>\r\n        <div class=\"pth-kv\"><span>Play \/ Pause source video<\/span><kbd>Space<\/kbd><\/div>\r\n        <div class=\"pth-kv\"><span>Start Processing<\/span><kbd>Enter<\/kbd><\/div>\r\n        <div class=\"pth-kv\"><span>Open file picker<\/span><kbd>O<\/kbd><\/div>\r\n        <div class=\"pth-kv\"><span>Reset Studio<\/span><kbd>R<\/kbd><\/div>\r\n        <div class=\"pth-kv\"><span>Next tool<\/span><kbd>\u2192<\/kbd><\/div>\r\n        <div class=\"pth-kv\"><span>Previous tool<\/span><kbd>\u2190<\/kbd><\/div>\r\n        <div class=\"pth-kv\"><span>Close this panel<\/span><kbd>Esc<\/kbd><\/div>\r\n        <button class=\"pth-modal-close\" onclick=\"document.getElementById('pth-modal').style.display='none'\">Close<\/button>\r\n    <\/div>\r\n<\/div>\r\n\r\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/@ffmpeg\/ffmpeg@0.11.0\/dist\/ffmpeg.min.js\" data-no-optimize=\"1\"><\/script>\r\n<script data-no-optimize=\"1\">\r\n\/\/ ==========================================================================\r\n\/\/ \ud83d\udd34 TURBO STUDIO v5.0 \u2014 Enhanced Engine\r\n\/\/ ==========================================================================\r\n'use strict';\r\n\r\nlet pthFile=null, pthFF=null, pthIsProc=false, pthOp='compress';\r\nlet pthTimerId=null, pthSecs=0, pthFetchFile=null, pthColorPreset='none';\r\nlet pthDuration=0;\r\n\r\n\/\/ All tool IDs in order (for arrow navigation)\r\nconst PTH_TOOLS = [\r\n    'compress','trim','convert','snapshot','extractaudio','mute',\r\n    'reverse','mirror','revmirror','speed','rotate','resize','crop','fps','loop','fade',\r\n    'brightness','contrast','saturation','sharpen','grayscale','colorgrade','vignette','denoise',\r\n    'watermark','volume','subtitle'\r\n];\r\nlet pthToolIdx = 0;\r\n\r\n\/\/ \u2500\u2500\u2500 LOG \u2500\u2500\u2500\r\nwindow.pthLog = function(m, cls='') {\r\n    var t=document.getElementById('pth-log'); if(!t) return;\r\n    var time=new Date().toLocaleTimeString('en',{hour12:false,hour:'2-digit',minute:'2-digit',second:'2-digit'});\r\n    var prefix = cls ? `<span class=\"${cls}\">${m}<\/span>` : `<span style=\"color:#94a3b8\">[${time}]<\/span> ${m}`;\r\n    t.insertAdjacentHTML('beforeend',`<div>${prefix}<\/div>`);\r\n    t.scrollTop=t.scrollHeight;\r\n};\r\n\r\n\/\/ \u2500\u2500\u2500 STAGE INDICATOR \u2500\u2500\u2500\r\nwindow.pthStage = function(id) {\r\n    document.getElementById('pth-stages').style.display='flex';\r\n    ['st-init','st-load','st-build','st-render','st-export'].forEach(s=>{\r\n        var el=document.getElementById(s);\r\n        if(!el) return;\r\n        var order=['st-init','st-load','st-build','st-render','st-export'];\r\n        var curIdx=order.indexOf(id), elIdx=order.indexOf(s);\r\n        el.className='pth-stage-dot'+(s===id?' active':elIdx<curIdx?' done':'');\r\n    });\r\n};\r\n\r\n\/\/ \u2500\u2500\u2500 BOOT \u2500\u2500\u2500\r\nsetTimeout(async function(){\r\n    if(typeof FFmpeg==='undefined'){\r\n        pthLog('\u274c FFmpeg library failed to load from CDN.','err'); return;\r\n    }\r\n    if(typeof SharedArrayBuffer==='undefined'){\r\n        pthLog('\u274c CRITICAL: SharedArrayBuffer blocked. Server security headers missing (COEP\/COOP).','err');\r\n        document.getElementById('pth-status-badge').innerHTML='\u274c Headers Blocked';\r\n        document.getElementById('pth-status-badge').style.background='#fef2f2';\r\n        document.getElementById('pth-status-badge').style.color='#ef4444';\r\n        return;\r\n    }\r\n    pthLog('\u2705 Security headers verified. Multi-threading ENABLED.','ok');\r\n    try {\r\n        const {createFFmpeg,fetchFile}=FFmpeg;\r\n        pthFetchFile=fetchFile;\r\n        pthLog('[INFO] Loading FFmpeg WASM core\u2026');\r\n        pthFF=createFFmpeg({\r\n            log:false,\r\n            logger:function(p){ if(p.message&&(p.message.includes('frame=')||p.message.includes('size='))) pthLog(p.message); },\r\n            progress:function(p){\r\n                var raw=Math.round(p.ratio*100);\r\n                var bar=document.getElementById('pth-prog-bar');\r\n                var txt=document.getElementById('pth-prog-text');\r\n                if(isNaN(raw)||raw<0){\r\n                    txt.innerText='Processing\u2026 (Calculating)';\r\n                    bar.style.width='85%';\r\n                    bar.style.background='linear-gradient(90deg,#f59e0b,#d97706)';\r\n                } else {\r\n                    var pct=Math.max(0,Math.min(100,raw));\r\n                    bar.style.background='linear-gradient(90deg,#3b82f6,#1d4ed8)';\r\n                    bar.style.width=pct+'%';\r\n                    txt.innerText='Rendering: '+pct+'%';\r\n                }\r\n            }\r\n        });\r\n        await pthFF.load();\r\n        document.getElementById('pth-status-badge').innerHTML='\u26a1 Engine Ready';\r\n        var btn=document.getElementById('pth-up-label');\r\n        btn.classList.remove('disabled'); btn.innerText='\ud83d\udcc2 Select Media File';\r\n        var dropZone=document.getElementById('pth-drop-zone');\r\n        dropZone.style.cursor='pointer';\r\n        pthLog('\u2705 Fast Core v0.11 loaded and ready.','ok');\r\n    } catch(e){ pthLog('\u274c Engine load error: '+e.message,'err'); }\r\n},500);\r\n\r\n\/\/ \u2500\u2500\u2500 DRAG & DROP \u2500\u2500\u2500\r\ndocument.addEventListener('DOMContentLoaded',function(){\r\n    var dz=document.getElementById('pth-drop-zone');\r\n    var fi=document.getElementById('pth-file-input');\r\n    dz.addEventListener('dragover',function(e){ e.preventDefault(); e.stopPropagation(); dz.classList.add('dragover'); });\r\n    dz.addEventListener('dragleave',function(e){ e.preventDefault(); e.stopPropagation(); dz.classList.remove('dragover'); });\r\n    dz.addEventListener('drop',function(e){\r\n        e.preventDefault(); e.stopPropagation(); dz.classList.remove('dragover');\r\n        if(document.getElementById('pth-up-label').classList.contains('disabled')){ pthLog('\u23f3 Engine still loading, please wait.'); return; }\r\n        var files=e.dataTransfer.files;\r\n        if(files&&files.length>0){ fi.files=files; window.pthHandle(fi); }\r\n    });\r\n\r\n    \/\/ Paste from clipboard\r\n    document.addEventListener('paste',function(e){\r\n        var items=e.clipboardData&&e.clipboardData.items;\r\n        if(!items) return;\r\n        for(var i=0;i<items.length;i++){\r\n            if(items[i].type.startsWith('image\/')){\r\n                var blob=items[i].getAsFile();\r\n                if(blob){\r\n                    var dt=new DataTransfer(); dt.items.add(blob);\r\n                    fi.files=dt.files; window.pthHandle(fi);\r\n                    pthLog('[INFO] Image pasted from clipboard.');\r\n                }\r\n            }\r\n        }\r\n    });\r\n\r\n    \/\/ Resize custom toggle\r\n    document.getElementById('pth-res-val').addEventListener('change',function(){\r\n        document.getElementById('pth-res-custom-wrap').style.display=this.value==='custom'?'block':'none';\r\n    });\r\n    \/\/ FPS custom toggle\r\n    document.getElementById('pth-fps-preset').addEventListener('change',function(){\r\n        document.getElementById('pth-fps-custom-wrap').style.display=this.value==='custom'?'block':'none';\r\n    });\r\n});\r\n\r\n\/\/ \u2500\u2500\u2500 TOOL SEARCH \u2500\u2500\u2500\r\nwindow.pthSearchTools = function(q){\r\n    q=q.toLowerCase().trim();\r\n    document.querySelectorAll('.pth-opt').forEach(function(el){\r\n        var txt=el.querySelector('.pth-opt-text').innerText.toLowerCase();\r\n        var id=el.id.replace('pth-btn-','');\r\n        el.style.display=(q===''||txt.includes(q)||id.includes(q))?'flex':'none';\r\n    });\r\n};\r\n\r\n\/\/ \u2500\u2500\u2500 LIVE PREVIEW \u2500\u2500\u2500\r\nwindow.updateLivePreview = function(){\r\n    var vi=document.getElementById('pth-vid-in');\r\n    var ii=document.getElementById('pth-img-in');\r\n    var f='none';\r\n    if(pthOp==='brightness'||pthOp==='contrast'||pthOp==='saturation'){\r\n        var b=1+parseFloat(document.getElementById('pth-bri-rng').value);\r\n        var c=parseFloat(document.getElementById('pth-cont-rng').value);\r\n        var s=parseFloat(document.getElementById('pth-sat-rng').value);\r\n        f=`brightness(${b}) contrast(${c}) saturate(${s})`;\r\n    } else if(pthOp==='grayscale'){ f='grayscale(100%)'; }\r\n    vi.style.filter=f; ii.style.filter=f;\r\n};\r\n\r\n\/\/ \u2500\u2500\u2500 COLOR PRESET SELECTION \u2500\u2500\u2500\r\nwindow.pthSelectPreset=function(btn,preset){\r\n    document.querySelectorAll('.pth-preset-btn').forEach(b=>b.classList.remove('sel'));\r\n    btn.classList.add('sel');\r\n    pthColorPreset=preset;\r\n    pthLog('[COLOR GRADE] Preset selected: '+preset.toUpperCase());\r\n};\r\n\r\n\/\/ \u2500\u2500\u2500 SET TOOL \u2500\u2500\u2500\r\nwindow.pthSetTool = function(op){\r\n    pthOp=op;\r\n    pthToolIdx=PTH_TOOLS.indexOf(op);\r\n    document.querySelectorAll('.pth-opt').forEach(b=>b.classList.remove('active'));\r\n    var btn=document.getElementById('pth-btn-'+op);\r\n    if(btn){ btn.classList.add('active'); btn.scrollIntoView({behavior:'smooth',block:'nearest'}); }\r\n    document.querySelectorAll('.pth-group').forEach(g=>g.style.display='none');\r\n    var ts=document.getElementById('pth-set-'+op);\r\n    if(ts) ts.style.display='block';\r\n    window.updateLivePreview();\r\n};\r\n\r\n\/\/ \u2500\u2500\u2500 FILE HANDLE \u2500\u2500\u2500\r\nwindow.pthHandle = function(input){\r\n    if(!input.files||input.files.length===0) return;\r\n    pthFile=input.files[0];\r\n\r\n    var name=pthFile.name;\r\n    var sizeMB=(pthFile.size\/1048576).toFixed(2);\r\n\r\n    \/\/ Update file info bar\r\n    document.getElementById('fi-name').innerText=name.length>20?name.substring(0,18)+'\u2026':name;\r\n    document.getElementById('fi-size').innerText=sizeMB+' MB';\r\n    document.getElementById('fi-type').innerText=pthFile.type||'unknown';\r\n    document.getElementById('fi-res').innerText='Loading\u2026';\r\n    document.getElementById('fi-dur').innerText='Loading\u2026';\r\n    document.getElementById('pth-file-info').style.display='flex';\r\n\r\n    document.getElementById('pth-in-ph').style.display='none';\r\n    document.getElementById('pth-in-sz').innerText=sizeMB+' MB';\r\n    document.getElementById('pth-btn-reset').style.display='inline-block';\r\n    document.getElementById('pth-file-badge').innerText=name.length>22?name.substring(0,20)+'\u2026':name;\r\n\r\n    var url=URL.createObjectURL(pthFile);\r\n    var vi=document.getElementById('pth-vid-in');\r\n    var ii=document.getElementById('pth-img-in');\r\n\r\n    if(pthFile.type.startsWith('image\/')){\r\n        ii.src=url; ii.style.display='block'; vi.style.display='none';\r\n        var img2=new Image();\r\n        img2.onload=function(){ document.getElementById('fi-res').innerText=img2.naturalWidth+'\u00d7'+img2.naturalHeight; document.getElementById('fi-dur').innerText='Image'; };\r\n        img2.src=url;\r\n    } else {\r\n        vi.src=url; vi.style.display='block'; ii.style.display='none'; vi.load();\r\n        vi.onloadedmetadata=function(){\r\n            pthDuration=vi.duration;\r\n            var d=pthDuration;\r\n            var h=Math.floor(d\/3600), m=Math.floor((d%3600)\/60), s=Math.floor(d%60);\r\n            document.getElementById('fi-dur').innerText=(h>0?String(h).padStart(2,'0')+':':'')+String(m).padStart(2,'0')+':'+String(s).padStart(2,'0');\r\n            document.getElementById('fi-res').innerText=vi.videoWidth+'\u00d7'+vi.videoHeight;\r\n        };\r\n    }\r\n\r\n    \/\/ Update drop zone state\r\n    var dz=document.getElementById('pth-drop-zone');\r\n    dz.classList.add('has-file');\r\n    document.getElementById('pth-up-content').innerHTML=`<div style=\"font-size:14px;font-weight:800;color:#059669;\">\u2705 ${name}<\/div><p style=\"font-size:12px;color:#6b7280;margin-top:4px;\">Click to change file<\/p>`;\r\n\r\n    window.updateLivePreview();\r\n    pthLog('[INFO] File loaded: '+name+' ('+sizeMB+' MB)');\r\n};\r\n\r\n\/\/ \u2500\u2500\u2500 TIME PARSE \u2500\u2500\u2500\r\nwindow.pthParseTime = function(t){\r\n    if(!t||t==='') return 0;\r\n    t=t.trim();\r\n    var parts=t.split(':');\r\n    if(parts.length===3) return parseInt(parts[0]||0)*3600+parseInt(parts[1]||0)*60+parseFloat(parts[2]||0);\r\n    if(parts.length===2) return parseInt(parts[0]||0)*60+parseFloat(parts[1]||0);\r\n    return parseFloat(t)||0;\r\n};\r\n\r\n\/\/ \u2500\u2500\u2500 WATERMARK POSITION \u2500\u2500\u2500\r\nfunction pthWmPos(pos, size){\r\n    var pad=10;\r\n    switch(pos){\r\n        case 'tl': return `x=${pad}:y=${pad}`;\r\n        case 'tr': return `x=w-text_w-${pad}:y=${pad}`;\r\n        case 'bl': return `x=${pad}:y=h-text_h-${pad}`;\r\n        case 'br': return `x=w-text_w-${pad}:y=h-text_h-${pad}`;\r\n        case 'center': return `x=(w-text_w)\/2:y=(h-text_h)\/2`;\r\n        default: return `x=${pad}:y=${pad}`;\r\n    }\r\n}\r\n\r\n\/\/ \u2500\u2500\u2500 COLOR GRADE FILTER \u2500\u2500\u2500\r\nfunction pthColorGradeFilter(preset){\r\n    switch(preset){\r\n        case 'cinema': return 'eq=contrast=1.15:saturation=0.8:brightness=-0.05,colorbalance=rs=-0.1:gs=0:bs=0.1';\r\n        case 'vintage': return 'eq=contrast=0.9:saturation=0.6:brightness=0.05,colorbalance=rs=0.15:gs=0.05:bs=-0.1';\r\n        case 'cool': return 'eq=contrast=1.05:saturation=1.1:brightness=0,colorbalance=rs=-0.05:gs=0:bs=0.15';\r\n        case 'warm': return 'eq=contrast=1.05:saturation=1.2:brightness=0.03,colorbalance=rs=0.15:gs=0.05:bs=-0.08';\r\n        case 'fade': return 'eq=contrast=0.85:saturation=0.7:brightness=0.08,curves=r=\\'0\/20 255\/235\\':g=\\'0\/15 255\/240\\':b=\\'0\/18 255\/230\\'';\r\n        case 'neon': return 'eq=contrast=1.3:saturation=2.0:brightness=-0.05';\r\n        default: return null;\r\n    }\r\n}\r\n\r\n\/\/ \u2500\u2500\u2500 COPY TO CLIPBOARD \u2500\u2500\u2500\r\nwindow.pthCopyToClipboard=async function(){\r\n    var imgOut=document.getElementById('pth-img-out');\r\n    var vidOut=document.getElementById('pth-vid-out');\r\n    if(imgOut.style.display!=='none'&&imgOut.src){\r\n        try {\r\n            var resp=await fetch(imgOut.src);\r\n            var blob=await resp.blob();\r\n            await navigator.clipboard.write([new ClipboardItem({[blob.type]:blob})]);\r\n            pthLog('\u2705 Image copied to clipboard!','ok');\r\n        } catch(e){ pthLog('\u274c Clipboard copy failed: '+e.message,'err'); }\r\n    } else { pthLog('[INFO] Clipboard copy works for image outputs only.'); }\r\n};\r\n\r\n\/\/ \u2500\u2500\u2500 MAIN PROCESS \u2500\u2500\u2500\r\nwindow.pthProcess = async function(){\r\n    if(pthIsProc||!pthFile||!pthFF){ if(!pthFile) pthLog('\u26a0\ufe0f Please upload a file first.','err'); return; }\r\n    pthIsProc=true;\r\n\r\n    var mainBtn=document.getElementById('pth-btn-main');\r\n    mainBtn.disabled=true; mainBtn.innerText='\u2699\ufe0f Processing\u2026';\r\n    document.getElementById('pth-prog-wrap').style.display='block';\r\n    document.getElementById('pth-prog-bar').style.width='0%';\r\n    document.getElementById('pth-prog-text').innerText='Starting\u2026';\r\n    document.getElementById('pth-dl-btn').style.display='none';\r\n    document.getElementById('pth-copy-btn').style.display='none';\r\n    document.getElementById('pth-vid-out').style.display='none';\r\n    document.getElementById('pth-img-out').style.display='none';\r\n    document.getElementById('pth-out-ph').style.display='flex';\r\n    document.getElementById('pth-out-ph').innerHTML='<span style=\"font-size:36px;opacity:0.5;\">\u2699\ufe0f<\/span><p style=\"font-size:13px;font-weight:700;color:#f59e0b;\">Processing\u2026<\/p>';\r\n\r\n    pthSecs=0;\r\n    document.getElementById('pth-timer').style.display='block';\r\n    document.getElementById('pth-timer').innerText='\u23f1\ufe0f Render Time: 00:00';\r\n    pthTimerId=setInterval(()=>{\r\n        pthSecs++;\r\n        var mm=Math.floor(pthSecs\/60).toString().padStart(2,'0');\r\n        var ss=(pthSecs%60).toString().padStart(2,'0');\r\n        document.getElementById('pth-timer').innerText=`\u23f1\ufe0f Render Time: ${mm}:${ss}`;\r\n    },1000);\r\n\r\n    var isImg=pthFile.type.startsWith('image\/');\r\n    var origName=pthFile.name.toLowerCase();\r\n    var ext=origName.split('.').pop()||( isImg?'jpg':'mp4');\r\n    var fIn='input.'+ext;\r\n    var out='output.mp4';\r\n    var args=['-i',fIn];\r\n    var o=pthOp;\r\n    var crf=document.getElementById('pth-comp-lvl').value;\r\n    var audioBr=document.getElementById('pth-audio-bitrate').value;\r\n\r\n    try {\r\n        pthStage('st-init');\r\n        pthLog('[Step 1] Initializing secure WASM sandbox\u2026','step');\r\n\r\n        pthStage('st-load');\r\n        pthLog('[Step 2] Loading file via fetchFile\u2026','step');\r\n        pthFF.FS('writeFile',fIn,await pthFetchFile(pthFile));\r\n\r\n        if(isImg&&o!=='convert') out='output.'+ext;\r\n        pthStage('st-build');\r\n        pthLog('[Step 3] Building FFmpeg command for: '+o.toUpperCase(),'step');\r\n\r\n        \/* === COMMAND BUILDER === *\/\r\n        if(o==='compress'){ \/* Global quality only \u2014 handled below *\/ }\r\n        else if(o==='trim'){\r\n            var tMode=document.getElementById('pth-trim-mode').value;\r\n            var tStart=window.pthParseTime(document.getElementById('pth-trim-s').value);\r\n            var tDur=window.pthParseTime(document.getElementById('pth-trim-e').value);\r\n            args=['-ss',String(tStart),'-i',fIn,'-t',String(tDur)];\r\n            if(tMode==='copy') args.push('-c','copy');\r\n        }\r\n        else if(o==='reverse') args.push('-vf','reverse','-af','areverse');\r\n        else if(o==='mirror') args.push('-vf','hflip');\r\n        else if(o==='revmirror') args.push('-vf','hflip,reverse','-af','areverse');\r\n        else if(o==='speed'){\r\n            var spd=parseFloat(document.getElementById('pth-spd-rng').value);\r\n            var aSpd=Math.max(0.5,Math.min(2.0,spd)); \/\/ atempo is limited 0.5\u20132.0\r\n            args.push('-filter_complex',`[0:v]setpts=${(1\/spd).toFixed(4)}*PTS[v];[0:a]atempo=${aSpd.toFixed(2)}[a]`,'-map','[v]','-map','[a]');\r\n        }\r\n        else if(o==='convert'){\r\n            var fmt=document.getElementById('pth-conv-fmt').value;\r\n            var gifFps=document.getElementById('pth-gif-fps').value;\r\n            var gifW=document.getElementById('pth-gif-w').value;\r\n            if(fmt==='gif'){\r\n                args.push('-vf',`fps=${gifFps},scale=${gifW}:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse`,'-loop','0');\r\n                out='out.gif';\r\n            } else if(fmt==='webm'){\r\n                out='out.webm'; args.push('-c:v','libvpx','-b:v','1M','-c:a','libvorbis');\r\n            } else {\r\n                out='out.mp4'; args.push('-c:v','libx264','-preset','ultrafast','-pix_fmt','yuv420p','-crf',crf,'-c:a','aac','-b:a',audioBr);\r\n            }\r\n        }\r\n        else if(o==='mute') args.push('-an');\r\n        else if(o==='rotate'){\r\n            var rv=document.getElementById('pth-rot-val').value;\r\n            if(rv==='vflip') args.push('-vf','vflip');\r\n            else if(rv==='90') args.push('-vf','transpose=1');\r\n            else if(rv==='180') args.push('-vf','transpose=1,transpose=1');\r\n            else args.push('-vf','transpose=2');\r\n        }\r\n        else if(o==='resize'){\r\n            var rVal=document.getElementById('pth-res-val').value;\r\n            var rW=(rVal==='custom')?document.getElementById('pth-res-custom').value:rVal;\r\n            args.push('-vf','scale='+rW+':-2');  \/\/ -2 keeps even pixels\r\n        }\r\n        else if(o==='volume') args.push('-af','volume='+document.getElementById('pth-vol-rng').value\/100);\r\n        else if(o==='crop'){\r\n            var cv=document.getElementById('pth-crop-val').value;\r\n            var cropFilter={\r\n                center:'crop=iw*0.8:ih*0.8',square:'crop=min(iw\\\\,ih):min(iw\\\\,ih)',\r\n                portrait:'crop=min(iw\\\\,ih*9\/16):min(ih\\\\,iw*16\/9)',\r\n                wide:'crop=iw:iw*9\/21',cinema:\"crop=iw:iw\/2.35\"\r\n            };\r\n            args.push('-vf',cropFilter[cv]||cropFilter.center);\r\n        }\r\n        else if(o==='grayscale') args.push('-vf','format=gray');\r\n        else if(o==='fps'){\r\n            var fpsV=document.getElementById('pth-fps-preset').value;\r\n            var fpsFinal=(fpsV==='custom')?document.getElementById('pth-fps-val').value:fpsV;\r\n            args.push('-r',fpsFinal);\r\n        }\r\n        else if(o==='extractaudio'){\r\n            args=['-i',fIn,'-vn','-acodec','libmp3lame','-b:a',audioBr]; out='output.mp3';\r\n        }\r\n        else if(o==='brightness') args.push('-vf','eq=brightness='+document.getElementById('pth-bri-rng').value);\r\n        else if(o==='saturation') args.push('-vf','eq=saturation='+document.getElementById('pth-sat-rng').value);\r\n        else if(o==='contrast') args.push('-vf','eq=contrast='+document.getElementById('pth-cont-rng').value);\r\n        else if(o==='sharpen') args.push('-vf','unsharp=5:5:1.2:5:5:0.0');\r\n        else if(o==='watermark'){\r\n            var wmTxt=document.getElementById('pth-wm-text').value.replace(\/'\/g,\"\\\\'\");\r\n            var wmSz=document.getElementById('pth-wm-size').value;\r\n            var wmPos=pthWmPos(document.getElementById('pth-wm-pos').value);\r\n            var wmOp=document.getElementById('pth-wm-opacity').value;\r\n            args.push('-vf',`drawtext=text='${wmTxt}':fontcolor=white@${wmOp}:fontsize=${wmSz}:${wmPos}:box=1:boxcolor=black@0.4:boxborderw=5`);\r\n        }\r\n        else if(o==='loop'){\r\n            var lp=document.getElementById('pth-loop-rng').value;\r\n            args=['-stream_loop',String(parseInt(lp)-1),'-i',fIn,'-c','copy'];\r\n        }\r\n        else if(o==='fade'){\r\n            var fiDur=pthDuration||10;\r\n            var fadeIn=parseFloat(document.getElementById('pth-fade-in').value)||0;\r\n            var fadeOut=parseFloat(document.getElementById('pth-fade-out').value)||0;\r\n            var fadeOutStart=Math.max(0,fiDur-fadeOut);\r\n            var fadeType=document.getElementById('pth-fade-type').value;\r\n            var vFilters=[],aFilters=[];\r\n            if(fadeIn>0) vFilters.push(`fade=t=in:st=0:d=${fadeIn}`);\r\n            if(fadeOut>0) vFilters.push(`fade=t=out:st=${fadeOutStart.toFixed(2)}:d=${fadeOut}`);\r\n            if(fadeIn>0) aFilters.push(`afade=t=in:st=0:d=${fadeIn}`);\r\n            if(fadeOut>0) aFilters.push(`afade=t=out:st=${fadeOutStart.toFixed(2)}:d=${fadeOut}`);\r\n            if((fadeType==='both'||fadeType==='video')&&vFilters.length) args.push('-vf',vFilters.join(','));\r\n            if((fadeType==='both'||fadeType==='audio')&&aFilters.length) args.push('-af',aFilters.join(','));\r\n        }\r\n        else if(o==='colorgrade'){\r\n            var gradeFilter=pthColorGradeFilter(pthColorPreset);\r\n            if(gradeFilter) args.push('-vf',gradeFilter);\r\n            else { pthLog('\u26a0\ufe0f Select a preset to apply color grading.','err'); throw new Error('No preset selected. Please choose a color grade preset.'); }\r\n        }\r\n        else if(o==='vignette'){\r\n            var vigStr=document.getElementById('pth-vig-rng').value;\r\n            args.push('-vf',`vignette=PI\/${(1\/vigStr).toFixed(2)}`);\r\n        }\r\n        else if(o==='denoise'){\r\n            var dnVal=document.getElementById('pth-denoise-val').value;\r\n            var dnMap={light:'hqdn3d=3:3:6:6',medium:'hqdn3d=6:6:10:10',heavy:'hqdn3d=10:10:15:15'};\r\n            args.push('-vf',dnMap[dnVal]||dnMap.medium);\r\n        }\r\n        else if(o==='snapshot'){\r\n            args.push('-vframes','1'); out='out.jpg';\r\n        }\r\n        else if(o==='subtitle'){\r\n            var subTxt=document.getElementById('pth-sub-text').value.replace(\/'\/g,\"\\\\'\");\r\n            var subSt=document.getElementById('pth-sub-start').value;\r\n            var subEt=document.getElementById('pth-sub-end').value;\r\n            var subSz=document.getElementById('pth-sub-size').value;\r\n            args.push('-vf',`drawtext=text='${subTxt}':fontcolor=white:fontsize=${subSz}:x=(w-text_w)\/2:y=h-text_h-30:box=1:boxcolor=black@0.55:boxborderw=10:enable='between(t,${subSt},${subEt})'`);\r\n        }\r\n\r\n        \/\/ GLOBAL COMPRESSION (applied to most video tools unless convert\/extract handles its own codec)\r\n        var skipGlobal=(['convert','extractaudio','loop'].includes(o));\r\n        var trimCopyMode=(o==='trim'&&document.getElementById('pth-trim-mode').value==='copy');\r\n        if(!skipGlobal&&!trimCopyMode&&!isImg&&o!=='snapshot'){\r\n            args.push('-vcodec','libx264','-crf',crf,'-preset','ultrafast','-c:a','aac','-b:a',audioBr);\r\n        } else if(isImg&&['compress','resize','crop','rotate','grayscale','watermark','brightness','contrast','saturation','sharpen','colorgrade','vignette','denoise'].includes(o)){\r\n            args.push('-q:v','2');\r\n        }\r\n        \r\n        args.push(out); \/\/ \ud83d\udd34 FIX: Unconditionally push the output filename here\r\n\r\n        pthStage('st-render');\r\n        pthLog('[Step 4] Executing render\u2026 (Multi-threading active)','step');\r\n        pthLog('CMD: ffmpeg '+args.join(' '));\r\n\r\n        await pthFF.run(...args);\r\n\r\n        pthStage('st-export');\r\n        pthLog('[Step 5] Render complete. Exporting result\u2026','step');\r\n        clearInterval(pthTimerId);\r\n\r\n        var resData=pthFF.FS('readFile',out);\r\n        var mimeMap={'gif':'image\/gif','mp3':'audio\/mpeg','jpg':'image\/jpeg','png':'image\/png','webm':'video\/webm','webp':'image\/webp'};\r\n        var outExt=out.split('.').pop();\r\n        var mime=mimeMap[outExt]||'video\/mp4';\r\n        var resultUrl=URL.createObjectURL(new Blob([resData.buffer],{type:mime}));\r\n\r\n        document.getElementById('pth-out-ph').style.display='none';\r\n\r\n        var dl=document.getElementById('pth-dl-btn');\r\n        var baseName=pthFile.name.replace(\/\\.[^.]+$\/,'');\r\n        dl.href=resultUrl; dl.download=`${baseName}_${o}.${outExt}`; dl.style.display='block';\r\n        document.getElementById('pth-out-sz').innerText=(resData.length\/1048576).toFixed(2)+' MB';\r\n\r\n        var origMB=pthFile.size\/1048576;\r\n        var newMB=resData.length\/1048576;\r\n        var savings=((1-newMB\/origMB)*100).toFixed(1);\r\n        if(newMB<origMB) pthLog(`\ud83d\udcc9 Size reduced by ${savings}% (${origMB.toFixed(2)}MB \u2192 ${newMB.toFixed(2)}MB)`,'ok');\r\n\r\n        if(['jpg','png','gif','webp'].includes(outExt)){\r\n            var imgOut=document.getElementById('pth-img-out');\r\n            imgOut.src=resultUrl; imgOut.style.display='block';\r\n            document.getElementById('pth-copy-btn').style.display='block';\r\n        } else if(outExt!=='mp3'){\r\n            var vidOut=document.getElementById('pth-vid-out');\r\n            vidOut.src=resultUrl; vidOut.style.display='block'; vidOut.load();\r\n        }\r\n\r\n        document.getElementById('pth-prog-text').innerText='\u2705 Completed! 100%';\r\n        document.getElementById('pth-prog-bar').style.width='100%';\r\n        document.getElementById('pth-prog-bar').style.background='linear-gradient(90deg,#10b981,#059669)';\r\n        pthLog(`\u2705 Done in ${pthSecs}s.`,'ok');\r\n\r\n        \/\/ Cleanup WASM memory\r\n        try { pthFF.FS('unlink',fIn); } catch(e){}\r\n        try { pthFF.FS('unlink',out); } catch(e){}\r\n\r\n    } catch(e){\r\n        clearInterval(pthTimerId);\r\n        pthLog('\u274c Error: '+e.message,'err');\r\n        document.getElementById('pth-prog-bar').style.background='#ef4444';\r\n        document.getElementById('pth-prog-text').innerText='Failed.';\r\n        document.getElementById('pth-out-ph').innerHTML='<span style=\"font-size:36px;opacity:0.5;\">\u274c<\/span><p style=\"font-size:13px;font-weight:700;color:#ef4444;\">'+e.message+'<\/p>';\r\n    }\r\n\r\n    pthIsProc=false;\r\n    mainBtn.disabled=false; mainBtn.innerText='\u26a1 START PROCESSING';\r\n};\r\n\r\n\/\/ \u2500\u2500\u2500 KEYBOARD SHORTCUTS \u2500\u2500\u2500\r\ndocument.addEventListener('keydown',function(e){\r\n    var tag=document.activeElement.tagName;\r\n    if(tag==='INPUT'||tag==='SELECT'||tag==='TEXTAREA') return;\r\n    switch(e.key){\r\n        case ' ': e.preventDefault(); var v=document.getElementById('pth-vid-in'); if(v.style.display!=='none'){v.paused?v.play():v.pause();} break;\r\n        case 'Enter': e.preventDefault(); if(!pthIsProc) window.pthProcess(); break;\r\n        case 'o': case 'O': document.getElementById('pth-file-input').click(); break;\r\n        case 'r': case 'R': if(!pthIsProc) window.location.reload(); break;\r\n        case 'Escape': document.getElementById('pth-modal').style.display='none'; break;\r\n        case 'ArrowRight':\r\n            pthToolIdx=Math.min(PTH_TOOLS.length-1,pthToolIdx+1);\r\n            window.pthSetTool(PTH_TOOLS[pthToolIdx]); break;\r\n        case 'ArrowLeft':\r\n            pthToolIdx=Math.max(0,pthToolIdx-1);\r\n            window.pthSetTool(PTH_TOOLS[pthToolIdx]); break;\r\n    }\r\n});\r\n\r\n\/\/ \u2500\u2500\u2500 INIT LOG \u2500\u2500\u2500\r\npthLog('[SYSTEM] Booting Turbo Video Studio v5.0\u2026');\r\npthLog('[INFO] Checking SharedArrayBuffer and WASM support\u2026');\r\n<\/script>\r\n<script data-no-optimize=\"1\" data-no-minify=\"1\" data-cfasync=\"false\">\r\n(function () {\r\n  'use strict';\r\n  function mount() {\r\n    var panel = document.getElementById('pth-vs-tab-quick');\r\n    var tool  = document.getElementById('pth-turbo-wrapper');\r\n    if (!panel || !tool) return false;\r\n    if (tool.parentNode !== panel) {\r\n      var ph = document.getElementById('pth-vs-empty-quick');\r\n      if (ph && ph.parentNode) ph.parentNode.removeChild(ph);\r\n      tool.style.margin = '0';\r\n      panel.appendChild(tool);\r\n    }\r\n    return true;\r\n  }\r\n  if (mount()) return;\r\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', mount);\r\n  window.addEventListener('load', function () { setTimeout(mount, 60); });\r\n  if (typeof MutationObserver !== 'undefined') {\r\n    var o = new MutationObserver(function () { if (mount()) o.disconnect(); });\r\n    o.observe(document.body || document.documentElement, { childList: true, subtree: true });\r\n    setTimeout(function () { o.disconnect(); }, 10000);\r\n  }\r\n})();\r\n<\/script>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \n\n\n\n<style data-no-optimize=\"1\" data-no-minify=\"1\" data-cfasync=\"false\">\n\/* PTH self-contained article styles (scoped to .pth-post) *\/\n.pth-post .pth-container{max-width:1480px;margin:0 auto;padding:0 20px;box-sizing:border-box}.pth-post .pth-feature-wrap{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-bottom:40px}.pth-post .pth-feat-box{border:1px solid #e2e8f0;background:#ffffff;padding:24px;border-radius:12px;box-shadow:0 4px 6px -1px rgba(0,0,0,0.02);transition:all 0.3s ease}.pth-post .pth-feat-box:hover{border-color:#bfdbfe;transform:translateY(-3px);box-shadow:0 10px 15px -3px rgba(0,0,0,0.05)}.pth-post .pth-feat-title{font-size:1.05rem;font-weight:800;color:#0f172a;margin:0 0 10px 0;display:flex;align-items:center;gap:10px}.pth-post .pth-feat-text{font-size:0.9rem;color:#1e293b;line-height:1.6;margin:0;font-weight:500}.pth-post .pth-steps-wrap{border:1px solid #e2e8f0;background:#ffffff;padding:40px 30px;border-radius:16px;text-align:center;box-shadow:0 4px 6px -1px rgba(0,0,0,0.02);margin-bottom:40px;width:100%;box-sizing:border-box}.pth-post .pth-steps-title{font-size:1.2rem;font-weight:800;color:#0f172a;text-transform:uppercase;margin:0 0 35px 0;letter-spacing:1px}.pth-post .pth-steps-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:30px}.pth-post .pth-step-item{display:flex;flex-direction:column;align-items:center}.pth-post .pth-step-num{width:45px;height:45px;background:#2563eb;color:#ffffff;border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:1.2rem;margin-bottom:15px;box-shadow:0 4px 10px rgba(37,99,235,0.3)}.pth-post .pth-step-name{font-weight:800;color:#0f172a;margin:0 0 8px 0;font-size:1rem}.pth-post .pth-step-desc{font-size:0.9rem;color:#1e293b;line-height:1.5;margin:0;font-weight:500}.pth-post .pth-article-wrapper{background:#ffffff !important;max-width:1480px;margin:0 auto 40px auto;padding:0 20px;box-sizing:border-box;font-family:inherit}.pth-post .pth-article-wrapper p{color:#1e293b !important;font-weight:500;line-height:1.75}.pth-post .pth-article-wrapper p strong, .pth-post .pth-article-wrapper strong{color:#0f172a !important;font-weight:800 !important}.pth-post .pth-article-wrapper ul li{color:#1e293b !important;font-weight:500;line-height:1.7;margin-bottom:8px}.pth-post .pth-article-wrapper h2{color:#0f172a;font-weight:800;font-size:1.3rem;margin:32px 0 14px}.pth-post .pth-article-wrapper h3{color:#0f172a;font-weight:800;font-size:1.1rem;margin:24px 0 10px}.pth-post .pth-faq-section{margin:50px auto 40px;font-family:inherit;max-width:1480px;padding:0 20px;box-sizing:border-box}.pth-post .pth-faq-header{font-size:1.8rem;font-weight:800;color:#0f172a;margin-bottom:25px;border-bottom:2px solid #e2e8f0;padding-bottom:10px;display:flex;align-items:center;gap:10px}.pth-post .pth-faq-grid{display:grid;grid-template-columns:1fr;gap:20px}\n@media(min-width:768px){.pth-post .pth-faq-grid{grid-template-columns:repeat(2,1fr)}}\n@media(min-width:1024px){.pth-post .pth-faq-grid{grid-template-columns:repeat(3,1fr)}}.pth-post .pth-faq-card{background:#f8fafc;padding:24px;border-radius:12px;border:1px solid #e2e8f0;transition:transform .2s ease;break-inside:avoid}.pth-post .pth-faq-card:hover{transform:translateY(-3px);box-shadow:0 4px 12px rgba(0,0,0,.05)}.pth-post .pth-faq-q{color:#0f172a;font-size:1rem;font-weight:700;margin:0 0 12px;line-height:1.4}.pth-post .pth-faq-a{margin:0;font-size:.95rem;color:#1e293b;line-height:1.6;font-weight:500}.pth-post .pth-author-bio{display:flex;align-items:center;gap:14px;padding:14px 18px;border-left:4px solid #10b981;background:#f0fdf4;border-radius:0 10px 10px 0;margin:16px 0 0 0}.pth-post .pth-author-bio img{border-radius:50%;object-fit:cover;flex-shrink:0;border:2px solid #6ee7b7}.pth-post .pth-author-bio-text{font-size:0.88rem;color:#1e293b;line-height:1.5;font-weight:500}.pth-post .pth-author-bio-text a{color:#064e3b;font-weight:800;text-decoration:underline}\n \n.pth-post .pth-hero-section{display:grid;grid-template-columns:1.5fr 1fr;gap:30px;align-items:center;background:#ffffff;border:1px solid #e2e8f0;border-radius:16px;padding:30px;margin:0 auto 30px;max-width:1480px;box-shadow:0 4px 6px -1px rgba(0,0,0,0.02);box-sizing:border-box}\n.pth-post .pth-hero-content h2{font-size:1.8rem;font-weight:800;color:#0f172a;margin:0 0 14px;line-height:1.3}\n.pth-post .pth-hero-content p{color:#1e293b;font-weight:500;line-height:1.7;margin:0}\n.pth-post .pth-hero-image{min-height:120px}\n@media(max-width:768px){.pth-post .pth-hero-section{grid-template-columns:1fr;padding:20px}}\n<\/style>\n \n<!-- ONE self-contained HTML block: paste everything below into a single WP Custom HTML block -->\n<div class=\"pth-post\">\n\n<div class=\"pth-container\">\n    <div class=\"pth-feature-wrap\">\n        <div class=\"pth-feat-box\">\n            <p class=\"pth-feat-title\"><span aria-hidden=\"true\">\ud83d\udfe2<\/span> One Studio, 20+ Video Tools<\/p>\n            <p class=\"pth-feat-text\">Compress, trim, convert, crop, rotate, resize, add a watermark, change speed or FPS, and apply filters like brightness, denoise, color grade and vignette \u2014 all from one screen. Load a clip once and switch tools without re-uploading anything.<\/p>\n        <\/div>\n        <div class=\"pth-feat-box\">\n            <p class=\"pth-feat-title\"><span aria-hidden=\"true\">\ud83d\udd35<\/span> 100% Offline &amp; Private<\/p>\n            <p class=\"pth-feat-text\">Every operation runs inside your browser using WebAssembly. Your video never leaves your device and is never sent to a server, so there is nothing to upload and nothing stored afterwards. It keeps working with Wi-Fi switched off.<\/p>\n        <\/div>\n        <div class=\"pth-feat-box\">\n            <p class=\"pth-feat-title\"><span aria-hidden=\"true\">\ud83d\udfe3<\/span> No Watermark, No Sign-up<\/p>\n            <p class=\"pth-feat-text\">The output is clean \u2014 no watermark on your frames and no account required. Multi-threaded processing uses more of your CPU cores, so a short clip is usually ready in seconds rather than minutes.<\/p>\n        <\/div>\n    <\/div>\n \n    <div class=\"pth-steps-wrap\">\n        <p class=\"pth-steps-title\">How to Edit a Video in Your Browser<\/p>\n        <div class=\"pth-steps-grid\">\n            <div class=\"pth-step-item\">\n                <div class=\"pth-step-num\" aria-hidden=\"true\">1<\/div>\n                <p class=\"pth-step-name\">Load Your Clip<\/p>\n                <p class=\"pth-step-desc\">Click the upload area and pick an MP4, WebM or MOV file from your device. A preview appears instantly.<\/p>\n            <\/div>\n            <div class=\"pth-step-item\">\n                <div class=\"pth-step-num\" aria-hidden=\"true\">2<\/div>\n                <p class=\"pth-step-name\">Choose a Tool<\/p>\n                <p class=\"pth-step-desc\">Select an action from the Tools list \u2014 Compress, Trim, Convert or a filter. Each shows only the settings it needs.<\/p>\n            <\/div>\n            <div class=\"pth-step-item\">\n                <div class=\"pth-step-num\" aria-hidden=\"true\">3<\/div>\n                <p class=\"pth-step-name\">Adjust and Run<\/p>\n                <p class=\"pth-step-desc\">Set your values, such as a trim start and end or a target size, then start. A progress bar shows how far along it is.<\/p>\n            <\/div>\n            <div class=\"pth-step-item\">\n                <div class=\"pth-step-num\" aria-hidden=\"true\">4<\/div>\n                <p class=\"pth-step-name\">Preview and Download<\/p>\n                <p class=\"pth-step-desc\">Check the result in the output area and download it. If you like, feed it back in and apply another tool on top.<\/p>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Last updated: July 2026<\/p>\n\n\n\n<h2 id=\"\ud83d\udd34-a-full-video-workflow-without-uploading-anything\" class=\"wp-block-heading\">\ud83d\udd34&nbsp;<strong>A Full Video Workflow Without Uploading Anything<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most people reach for an&nbsp;<strong>online video editor<\/strong>&nbsp;to do one small thing \u2014 shave a few seconds off a clip, shrink a file so it fits an upload limit, or convert a MOV into an MP4 that actually plays on a colleague&#8217;s laptop. The problem is that the usual free sites make you upload the whole file to their servers, wait in a queue, and then hand back a result with a watermark unless you pay. Turbo Video Studio Pro takes a different route: the editing engine runs on your own machine, so the file you drop in never travels anywhere.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That single choice changes what the tool is good for. Because there is no upload step, a 200&nbsp;MB screen recording starts processing the moment you load it. Because nothing is stored on a server, a private client video or an unlisted family clip stays private. And because the same clip lives in the browser the whole time, you can chain several edits \u2014 trim, then compress, then convert \u2014 without the round trips a normal site forces on you.<\/p>\n\n\n\n<h2 id=\"\ud83d\udfe1-what-you-can-actually-do-here\" class=\"wp-block-heading\">\ud83d\udfe1&nbsp;<strong>What You Can Actually Do Here<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The studio groups its features so you are not hunting through menus:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83d\udd35&nbsp;<strong>Size &amp; format:<\/strong>&nbsp;compress to a target size, convert between MP4, WebM and other common formats, and change resolution or FPS to match where the video is going.<\/li>\n\n\n\n<li>\ud83d\udfe0&nbsp;<strong>Cutting &amp; framing:<\/strong>&nbsp;trim to an exact start and end, crop the frame, rotate, mirror, loop a section, or grab a single snapshot as an image.<\/li>\n\n\n\n<li>\ud83d\udfe3&nbsp;<strong>Look &amp; sound:<\/strong>&nbsp;adjust brightness, contrast, saturation and sharpness, apply grayscale, color grade or a vignette, reduce noise, add a watermark, and mute or change the volume.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Under the hood this is powered by a browser build of&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/FFmpeg\" rel=\"noreferrer noopener\" target=\"_blank\">FFmpeg<\/a>&nbsp;compiled to&nbsp;<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/WebAssembly\" rel=\"noreferrer noopener\" target=\"_blank\">WebAssembly<\/a>, which is why professional-grade operations run locally at all. The multi-threaded mode spreads the work across several CPU cores, so encoding finishes noticeably faster than a single-threaded browser tool.<\/p>\n\n\n\n<h2 id=\"\ud83d\udfe2-when-this-tool-is-the-right-choice-and-when-it-isnt\" class=\"wp-block-heading\">\ud83d\udfe2&nbsp;<strong>When This Tool Is the Right Choice (and When It Isn&#8217;t)<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This studio shines for quick, self-contained jobs: prepping a clip for WhatsApp or email, compressing a recording that is just over an upload limit, converting a format your player refuses to open, or cleaning up a single video with filters. Students trimming a presentation, teachers resizing a lesson recording, and creators making a fast social cut will get what they need in a couple of clicks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is honest to say what it is&nbsp;<em>not<\/em>: this is a single-clip toolkit, not a multi-track timeline editor. If you need to stitch ten clips together with transitions, layered audio and titles, a dedicated desktop editor is the better fit. For everything short of that, doing it in the browser \u2014 with no upload, no watermark and no sign-up \u2014 is usually faster. If you specifically want to shrink a file, our guide on&nbsp;compressing video without losing quality&nbsp;walks through the settings that matter, and you can pair this with the&nbsp;<a href=\"https:\/\/schoolict.net\/tools\/free-advanced-image-studio-pro\/\" target=\"_blank\" rel=\"noreferrer noopener\">Advanced Image Studio<\/a>&nbsp;for thumbnails and stills.<\/p>\n\n\n\n<style>\n.pth-faq-section{margin-top:50px;margin-bottom:40px}\n.pth-faq-header{font-size:1.8rem;font-weight:800;color:#0f172a;margin-bottom:25px;border-bottom:2px solid #e2e8f0;padding-bottom:10px;display:flex;align-items:center;gap:10px}\n.pth-faq-grid{display:grid;grid-template-columns:100%;gap:18px}\n@media(min-width:768px){.pth-faq-grid{grid-template-columns:repeat(2,1fr)}}\n@media(min-width:1024px){.pth-faq-grid{grid-template-columns:repeat(3,1fr)}}\n.pth-faq-card{background:#f8fafc;padding:22px;border-radius:12px;border:1px solid #e2e8f0;transition:transform .2s ease}\n.pth-faq-card:hover{transform:translateY(-3px);box-shadow:0 4px 12px rgba(0,0,0,.05)}\n.pth-faq-q{color:#0f172a;font-size:1rem;font-weight:700;margin:0 0 10px;line-height:1.4}\n.pth-faq-a{margin:0;font-size:.92rem;color:#1e293b;line-height:1.6;font-weight:500}\n<\/style>\n<div class=\"pth-faq-section\">\n    <p class=\"pth-faq-header\" role=\"heading\" aria-level=\"2\"><span aria-hidden=\"true\">\ud83e\udd14<\/span> Frequently Asked Questions<\/p>\n    <div class=\"pth-faq-grid\">\n \n        <div class=\"pth-faq-card\">\n            <p class=\"pth-faq-q\">Is my video uploaded to a server?<\/p>\n            <p class=\"pth-faq-a\">No. The whole studio runs inside your browser, so the file stays on your device from start to finish. Nothing is uploaded, and nothing is kept after you close the tab.<\/p>\n        <\/div>\n \n        <div class=\"pth-faq-card\">\n            <p class=\"pth-faq-q\">Does the exported video have a watermark?<\/p>\n            <p class=\"pth-faq-a\">No watermark is added. The output is a clean file you can use anywhere, and you do not need an account to download it.<\/p>\n        <\/div>\n \n        <div class=\"pth-faq-card\">\n            <p class=\"pth-faq-q\">What video formats can I open and export?<\/p>\n            <p class=\"pth-faq-a\">Common formats such as MP4, WebM and MOV work for input, and you can convert to widely supported outputs like MP4 and WebM. If a file refuses to load, converting it first usually solves playback issues elsewhere.<\/p>\n        <\/div>\n \n        <div class=\"pth-faq-card\">\n            <p class=\"pth-faq-q\">Why does a big file still process quickly?<\/p>\n            <p class=\"pth-faq-a\">There is no upload wait, and the multi-threaded engine uses several of your CPU cores at once. Speed depends on your device, but short clips are typically ready in seconds.<\/p>\n        <\/div>\n \n        <div class=\"pth-faq-card\">\n            <p class=\"pth-faq-q\">Can I apply more than one edit to the same clip?<\/p>\n            <p class=\"pth-faq-a\">Yes. Run one tool, then feed the result back in and apply the next \u2014 for example trim, then compress, then convert \u2014 without re-uploading anything.<\/p>\n        <\/div>\n \n        <div class=\"pth-faq-card\">\n            <p class=\"pth-faq-q\">Can it join several clips into one timeline?<\/p>\n            <p class=\"pth-faq-a\">Not yet. This is a single-clip studio focused on fast edits. For multi-clip timeline editing with transitions and layered audio, a desktop editor is a better match.<\/p>\n        <\/div>\n \n        <div class=\"pth-faq-card\">\n            <p class=\"pth-faq-q\">Does it work on mobile?<\/p>\n            <p class=\"pth-faq-a\">It runs in modern mobile browsers, though heavy operations are faster on a laptop or desktop with more CPU cores and memory. For large files, a computer gives the smoothest experience.<\/p>\n        <\/div>\n \n    <\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Turbo Video Editor Need a Fast Offline Turbo Video Editor? Experience desktop-grade speeds with our multi-threaded, 100% offline video studio. Compress, trim, reverse, and convert instantly. \ud83d\udfe2 One Studio, 20+ Video Tools Compress, trim, convert, crop, rotate, resize, add a watermark, change speed or FPS, and apply filters like brightness, denoise, color grade and vignette &#8230; <a title=\"Fast Offline Turbo Video Editor &amp; Compressor (Turbo Speed)\" class=\"read-more\" href=\"https:\/\/schoolict.net\/tools\/turbo-video-editor\/\" aria-label=\"Read more about Fast Offline Turbo Video Editor &amp; Compressor (Turbo Speed)\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":3485,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1302","page","type-page","status-publish","has-post-thumbnail"],"_links":{"self":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages\/1302","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/comments?post=1302"}],"version-history":[{"count":16,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages\/1302\/revisions"}],"predecessor-version":[{"id":7061,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages\/1302\/revisions\/7061"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/media\/3485"}],"wp:attachment":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/media?parent=1302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}