diff mrjunejune/test/snapshots/tools_markdown_to_html_index.html.snapshot @ 109:1c446ab6f945

[MrJuneJune] New Blog about writing Seobeo library.
author June Park <parkjune1995@gmail.com>
date Sat, 03 Jan 2026 19:37:51 -0800
parents 092afa595764
children d6d578b49a19
line wrap: on
line diff
--- a/mrjunejune/test/snapshots/tools_markdown_to_html_index.html.snapshot	Sat Jan 03 17:29:12 2026 -0800
+++ b/mrjunejune/test/snapshots/tools_markdown_to_html_index.html.snapshot	Sat Jan 03 19:37:51 2026 -0800
@@ -4,7 +4,10 @@
 Connection: close
 Body: 
 
-t/otf" crossorigin>
+/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>
 
@@ -13,15 +16,137 @@
 
 
     <style>
-      .epi-photo {
-        display: flex;
-        justify-content: center;
-        margin-bottom: 10px;
-      }
+        .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>
+</head>
+<body>
+    <style>
   :root {
     --header-background: var(--white);
     --header-color: rgb(var(--black));
@@ -159,46 +284,54 @@
 <script src="/index.js"></script>
 
 
-     <main>
-       <p>Hi, my name is Juntae, but most people call me June or MrJuneJune.</p>
+
+    <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>
 
-       <p>I am a software engineer with experience spanning a wide range of companies, from small startups to FAANGs....</p>
-       <p>I know it is lame to work for them, but I have a dog so I need to put foods on my table.</p>
+            <div class="file-input-wrapper">
+                <label for="imageInput">Choose an image file:</label>
+                <input type="file" id="imageInput" accept="image/*">
+            </div>
 
-       <div class="epi-photo">
-         <img id="currentPhoto" style="opacity: 0; transition: opacity 0.2s;" />
-       </div>
+            <button id="convertImageBtn" onclick="convertImageToWebP()">Convert to WebP</button>
+
+            <div class="loading" id="imageLoading">Converting... Please wait.</div>
 
-       <p>During my free time, I like to write codes mostly in C, Python, and Typescript. All in mono repo styles using mercurial and bazel. (I know that is mentally ill...)</p>
-       <p>Feel free to check it out. My bad code..</p>
+            <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>
 
-       <h2>Links</h2>
-       <ul>
-         <li><a href="https://zenbu.babocoder.com/file/tip">Repository</a> - Check out my monorepo code</li>
-         <li><a href="/resume">Resume</a> - My professional experiences </li>
-         <li><a href="/tools">Tools</a> - Tools </li>
-         <!-- <li><a href="/blogs">Blogs</a> - Personal Blogs where I rant </li> -->
-       </ul> 
-     </main>
-     <div style="display: flex; align-items: center; justify-content: center; margin: 30px 0px;">
+            <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>&copy; 2026 June Park</small>
 </div>
 
-  </body>
-  <script>
-    let arr = Array.from({ length: 18 }, (_, i) => i+1);
-    function setRandomImages() {
-      const randomIndex = Math.floor(Math.random() * arr.length);
-      const pos = arr[randomIndex];
-      currentPhoto.src = `/public/epi-photos/webp/${pos}.webp`;
-      currentPhoto.onload = () => {
-        currentPhoto.style.opacity = "1";
-      };
-      setTimeout(() => setRandomImages(), 1000);
-    }
-    setRandomImages();
-  </script>
-</htmlLocation: /
-Location: /resume
-Location: /tools/markdown_to_html
+    </div>
+    <script src="/tools/file_converter/index.js"></script>
+</body>
+</htmlLocation: /tools/markdown_to_html