Mercurial
view mrjunejune/test/snapshots/tools_file_converter.snapshot @ 206:240337164a80
[Seobeo] SSL should be used for large file as well lol.
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Sun, 15 Feb 2026 11:41:53 -0800 |
| parents | 1c0878eb17de |
| children |
line wrap: on
line source
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>File Format Converter</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="icon" type="image/svg+xml" href="/public/epi_all_colors.svg"> <link rel="preload" href="/public/fonts/Roboto-Regular.ttf" as="font" crossorigin> <link rel="preload" href="/public/fonts/Roboto-Thin.ttf"as="font" crossorigin> <!-- <link rel="preload" href="/public/fonts/atkinson-regular.woff" as="font" type="font/woff" crossorigin> --> <!-- <link rel="preload" href="/public/fonts/atkinson-bold.woff" as="font" type="font/woff" crossorigin> --> <!-- <link rel="preload" href="/public/fonts/more-sugar.extras.otf" as="font" type="font/otf" crossorigin> --> <link rel="preload" href="/public/fonts/more-sugar.regular.otf" as="font" type="font/otf" crossorigin> <link rel="preload" href="/public/fonts/more-sugar.thin.otf" as="font" type="font/otf" crossorigin> <link rel="preload" href="/public/epi_all_colors.svg" as="image"> <link rel="preload" href="/base.css" as="style" /> <link rel="stylesheet" href="/base.css" /> <style> .container { max-width: 800px; margin: 2rem auto; padding: 2rem; } .converter-section { border-radius: 8px; border: 2px solid var(--lightgray); padding: 2rem; margin-bottom: 2rem; } .converter-section h2 { margin-top: 0; color: var(--black); } .file-input-wrapper { margin: 1rem 0; } .file-input-wrapper label { display: block; margin-bottom: 0.5rem; font-weight: 600; } input[type="file"] { padding: 0.75rem; border: 2px dashed #ccc; border-radius: 4px; background: white; font-size: 16px; } button { background: var(--purple); font-family: "More Thin", sans-serif; color: var(--gray-gradient); border: none; padding: 0.75rem 1.5rem; border-radius: 4px; cursor: pointer; font-size: 1rem; margin-top: 1rem; min-height: 44px; } button:hover { background: var(--orange); } button:disabled { background: var(--gray); cursor: not-allowed; } .result { margin-top: 1rem; padding: 1rem; background: white; border-radius: 4px; display: none; } .result.show { display: block; } .result.success { border-left: 4px solid var(--blue); } .result.error { border-left: 4px solid var(--red); } .download-link { display: inline-block; margin-top: 0.5rem; color: var(--awesome); text-decoration: none; } .download-link:hover { text-decoration: underline; } .loading { display: none; margin-top: 1rem; } .loading.show { display: block; } /* Mobile responsive */ @media (max-width: 720px) { .container { padding: 1rem; margin: 1rem auto; } .converter-section { padding: 1.5rem 1rem; } .converter-section h2 { font-size: 1.5rem; } .file-input-wrapper label { font-size: 1rem; } button { font-size: 1.1rem; padding: 1rem 1.5rem; } .result { padding: 1rem; font-size: 1rem; } } </style> </head> <body> <style> :root { --header-background: var(--white); --header-color: rgb(var(--black)); --link-hover-accent: var(--awesome); } /* Fixed icon in top left corner */ #themeToggle { position: fixed; top: 20px; left: 20px; background: var(--header-background); display: flex; align-items: center; border-radius: 50%; cursor: pointer; z-index: 1000; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); transition: transform 0.2s ease; } #themeToggle:hover { transform: scale(1.05); } /* Professional header */ header { margin: auto; padding: 1.5em 1em; font-family: "More", sans-serif; box-shadow: 0 2px 8px rgba(var(--black), 5%); width: 720px; max-width: calc(100% - 2em); text-align: center; } header h1 { margin: 0; font-size: 1.8em; font-weight: 700; letter-spacing: -0.5px; } header h1 a { text-decoration: none; color: var(--header-color); } header h1 a::before { display: none; } /* Mobile responsiveness */ @media (max-width: 720px) { #themeToggle { top: 15px; left: 15px; } header { padding: 1em; } header h1 { font-size: 1.5em; } } @media (max-width: 480px) { #themeToggle { top: 10px; left: 10px; } #themeToggle img { height: 40px; width: 40px; } header h1 { font-size: 1.3em; } } #logo { width: 300px; } /* 1. DEFINE THE DEFAULTS (Light Mode) */ :root { --logo-invert: invert(0); --epi-grayscale: grayscale(0) brightness(1); } /* 2. MANUAL DARK OVERRIDE */ html.dark { --logo-invert: invert(1); --epi-grayscale: grayscale(1); } /* 3. MANUAL LIGHT OVERRIDE */ html.light-mode { --logo-invert: invert(0); --epi-grayscale: brightness(2.9) grayscale(1); } /* 4. SYSTEM PREFERENCE */ @media (prefers-color-scheme: dark) { :root:not(.light-mode) { --logo-invert: invert(1); } } /* 5. APPLY TO ELEMENTS */ #logo { -webkit-filter: var(--logo-invert); filter: var(--logo-invert); transition: filter 0.3s ease; } .epi-logo { -webkit-filter: var(--epi-grayscale); filter: var(--epi-grayscale); transition: filter 0.3s ease; } </style> <div id="themeToggle"> <img id="epiChan" class="epi-logo" aria-label="Toggle dark mode" src="/public/epi_all_colors.svg" height="50" width="50"> </div> <header> <h1><a href="/">MrJuneJune</a></h1> </header> <script src="/index.js"></script> <div class="container"> <h1>File Format Converter</h1> <p>Convert your images and videos to different formats using FFmpeg</p> <div class="converter-section"> <h2>Image to WebP Converter</h2> <p>Upload an image file (PNG, JPG, GIF, etc.) to convert it to WebP format</p> <div class="file-input-wrapper"> <label for="imageInput">Choose an image file:</label> <input type="file" id="imageInput" accept="image/*"> </div> <button id="convertImageBtn" onclick="convertImageToWebP()">Convert to WebP</button> <div class="loading" id="imageLoading">Converting... Please wait.</div> <div class="result" id="imageResult"> <p id="imageMessage"></p> <a id="imageDownload" class="download-link" style="display: none;">Download WebP Image</a> </div> </div> <div class="converter-section"> <h2>Video to MP4 Converter</h2> <p>Upload a video file (AVI, MOV, MKV, etc.) to convert it to MP4 format</p> <div class="file-input-wrapper"> <label for="videoInput">Choose a video file:</label> <input type="file" id="videoInput" accept="video/*"> </div> <button id="convertVideoBtn" onclick="convertVideoToMP4()">Convert to MP4</button> <div class="loading" id="videoLoading">Converting... Please wait.</div> <div class="result" id="videoResult"> <p id="videoMessage"></p> <a id="videoDownload" class="download-link" style="display: none;">Download MP4 Video</a> </div> </div> <div style="display: flex; align-items: center; justify-content: center; margin: 30px 0px;"> <small>© 2026 June Park</small> </div> </div> <script src="/tools/file_converter/index.js"></script> </body> </html>