A Pen by mode-mercury on CodePen.
Created
October 18, 2025 05:18
-
-
Save mode-mercury/855e83adcd9ae348141bd22ec5b63ec0 to your computer and use it in GitHub Desktop.
Untitled
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8" /> | |
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | |
| <title>Veridian Terminal</title> | |
| <style> | |
| /* Windows 95 style background - simple repeating pattern */ | |
| body { | |
| margin: 0; | |
| padding: 0; | |
| overflow: hidden; | |
| font-family: 'MS Sans Serif', 'Arial', sans-serif; | |
| color: white; | |
| height: 100vh; | |
| width: 100vw; | |
| background: #000080 url('https://i.imgur.com/4G9xXQZ.png') repeat; /* Windows 95 blue background pattern */ | |
| background-size: 64px 64px; | |
| position: relative; | |
| } | |
| /* Full screen containers */ | |
| #dos-screen, #loading-screen, #startup-screen, #terminal { | |
| position: fixed; | |
| top: 0; left: 0; | |
| width: 100vw; | |
| height: 100vh; | |
| background-color: #000080; | |
| color: #ffffff; | |
| padding: 20px; | |
| box-sizing: border-box; | |
| overflow-y: auto; | |
| font-size: 16px; | |
| line-height: 1.3; | |
| z-index: 9999; | |
| font-weight: bold; | |
| white-space: pre-wrap; | |
| font-family: 'Lucida Console', Monaco, monospace, 'MS Sans Serif'; | |
| user-select: none; | |
| } | |
| #dos-screen { | |
| background-color: black; | |
| color: #00ff00; | |
| font-size: 18px; | |
| display: none; | |
| } | |
| #loading-screen { | |
| display: none; | |
| font-size: 24px; | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| } | |
| #startup-screen { | |
| display: none; | |
| flex-direction: column; | |
| justify-content: center; | |
| align-items: center; | |
| } | |
| /* TV animation container */ | |
| #tv-animation { | |
| width: 300px; | |
| height: 200px; | |
| background-color: black; | |
| position: relative; | |
| overflow: hidden; | |
| image-rendering: pixelated; | |
| margin-bottom: 20px; | |
| } | |
| #tv-screen { | |
| width: 100%; | |
| height: 100%; | |
| background-color: black; | |
| position: relative; | |
| } | |
| .tv-eye { | |
| position: absolute; | |
| width: 40px; | |
| height: 30px; | |
| background-color: white; | |
| border-radius: 50%; | |
| } | |
| #eye-left { | |
| top: 30%; | |
| left: 30%; | |
| } | |
| #eye-right { | |
| top: 30%; | |
| right: 30%; | |
| } | |
| .tv-pupil { | |
| position: absolute; | |
| width: 15px; | |
| height: 15px; | |
| background-color: black; | |
| border-radius: 50%; | |
| top: 7px; | |
| left: 12px; | |
| } | |
| #moving-bar { | |
| width: 100%; | |
| height: 5px; | |
| background-color: white; | |
| position: absolute; | |
| bottom: 0; | |
| animation: moveBar 2s linear infinite; | |
| } | |
| @keyframes moveBar { | |
| 0% { transform: translateX(-100%); } | |
| 100% { transform: translateX(100%); } | |
| } | |
| /* Glitch effect text */ | |
| .glitch-text { | |
| position: absolute; | |
| color: red; | |
| font-size: 24px; | |
| animation: glitch 1s infinite alternate; | |
| opacity: 0; | |
| pointer-events: none; | |
| user-select: none; | |
| font-weight: bold; | |
| } | |
| @keyframes glitch { | |
| 0% { opacity: 0; transform: rotate(0deg); } | |
| 50% { opacity: 1; transform: rotate(5deg); } | |
| 100% { opacity: 0; transform: rotate(-5deg); } | |
| } | |
| /* Pixel artifacts */ | |
| .pixel { | |
| position: absolute; | |
| width: 4px; | |
| height: 4px; | |
| background-color: #f00; | |
| pointer-events: none; | |
| user-select: none; | |
| } | |
| /* Terminal styling */ | |
| #terminal { | |
| background-color: black; | |
| color: #00ff00; | |
| font-family: 'Lucida Console', Monaco, monospace, 'MS Sans Serif'; | |
| display: none; | |
| padding-bottom: 50px; /* space for input */ | |
| } | |
| #output { | |
| height: calc(100vh - 50px); | |
| overflow-y: auto; | |
| white-space: pre-wrap; | |
| padding-right: 10px; | |
| } | |
| #input { | |
| position: fixed; | |
| bottom: 10px; | |
| left: 50%; | |
| transform: translateX(-50%); | |
| width: 80%; | |
| max-width: 900px; | |
| background-color: black; | |
| color: #00ff00; | |
| border: none; | |
| outline: none; | |
| font-family: 'Lucida Console', Monaco, monospace, 'MS Sans Serif'; | |
| font-size: 18px; | |
| padding: 10px; | |
| box-sizing: border-box; | |
| border: 2px solid #00ff00; | |
| } | |
| /* Taskbar */ | |
| #taskbar { | |
| position: fixed; | |
| bottom: 0; | |
| left: 0; | |
| width: 100vw; | |
| height: 30px; | |
| background-color: #000080; | |
| color: #fff; | |
| display: flex; | |
| align-items: center; | |
| padding: 0 10px; | |
| box-shadow: 0 -2px 10px rgba(0,0,0,0.5); | |
| z-index: 10000; | |
| user-select: none; | |
| font-family: 'MS Sans Serif', Arial, sans-serif; | |
| font-size: 14px; | |
| } | |
| #start-button { | |
| cursor: pointer; | |
| padding: 0 15px; | |
| background-color: #0000a0; | |
| border: 1px solid #fff; | |
| height: 24px; | |
| line-height: 24px; | |
| user-select: none; | |
| } | |
| #taskbar-items { | |
| margin-left: 10px; | |
| display: flex; | |
| gap: 10px; | |
| flex-wrap: nowrap; | |
| overflow-x: auto; | |
| flex-grow: 1; | |
| } | |
| .task-item { | |
| background-color: #0000a0; | |
| border: 1px solid #fff; | |
| padding: 0 8px; | |
| height: 24px; | |
| line-height: 24px; | |
| cursor: pointer; | |
| white-space: nowrap; | |
| } | |
| /* Start menu */ | |
| #start-menu { | |
| display: none; | |
| position: fixed; | |
| bottom: 30px; | |
| left: 10px; | |
| width: 220px; | |
| background-color: #c0c0c0; | |
| border: 2px solid #000; | |
| box-shadow: 2px 2px 10px rgba(0,0,0,0.5); | |
| font-family: 'MS Sans Serif', Arial, sans-serif; | |
| font-size: 14px; | |
| color: black; | |
| z-index: 10001; | |
| user-select: none; | |
| } | |
| #start-menu h3 { | |
| margin: 0; | |
| padding: 5px 10px; | |
| background-color: #000080; | |
| color: white; | |
| font-weight: bold; | |
| border-bottom: 2px solid #000; | |
| } | |
| #start-menu ul { | |
| list-style: none; | |
| padding: 5px 10px; | |
| margin: 0; | |
| } | |
| #start-menu li { | |
| padding: 5px 0; | |
| cursor: pointer; | |
| border-bottom: 1px solid #808080; | |
| transition: background-color 0.3s; | |
| } | |
| #start-menu li:hover { | |
| background-color: #000080; | |
| color: white; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <!-- DOS screen with glitches and errors --> | |
| <div id="dos-screen"></div> | |
| <!-- Loading screen --> | |
| <div id="loading-screen">Loading... Please Wait...</div> | |
| <!-- Startup screen with TV animation --> | |
| <div id="startup-screen" style="display:flex; flex-direction: column; align-items: center; justify-content: center; color:white;"> | |
| <div id="tv-animation"> | |
| <div id="tv-screen"> | |
| <div class="tv-eye" id="eye-left"><div class="tv-pupil"></div></div> | |
| <div class="tv-eye" id="eye-right"><div class="tv-pupil"></div></div> | |
| </div> | |
| <div id="moving-bar"></div> | |
| </div> | |
| <div>Starting Veridian...</div> | |
| </div> | |
| <!-- Terminal --> | |
| <div id="terminal"> | |
| <div id="output"></div> | |
| <input type="text" id="input" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" /> | |
| </div> | |
| <!-- Taskbar --> | |
| <div id="taskbar"> | |
| <div id="start-button">Start</div> | |
| <div id="taskbar-items"></div> | |
| </div> | |
| <!-- Start Menu --> | |
| <div id="start-menu"> | |
| <h3>Start Menu</h3> | |
| <ul> | |
| <li id="notepad-launch">Notepad</li> | |
| <li id="audio-recorder-launch">Audio Recorder</li> | |
| <li id="netscape-launch">Netscape Navigator</li> | |
| <li id="telnet-launch">Telnet</li> | |
| <li id="file-browser-launch">File Browser</li> | |
| <li id="bbs-launch">BBS Terminal</li> | |
| <li id="program-files">Program Files</li> | |
| <li id="terminal-launch">Open Terminal</li> | |
| <li id="mirc-launch">Open mIRC</li> | |
| <li id="exit">Exit</li> | |
| </ul> | |
| </div> | |
| <!-- Apps and other windows omitted for brevity --> | |
| <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> | |
| <script> | |
| $(function() { | |
| const dosScreen = $('#dos-screen'); | |
| const loadingScreen = $('#loading-screen'); | |
| const startupScreen = $('#startup-screen'); | |
| const terminal = $('#terminal'); | |
| const output = $('#output'); | |
| const input = $('#input'); | |
| const startMenu = $('#start-menu'); | |
| const taskbarItems = $('#taskbar-items'); | |
| // DOS screen lines | |
| const dosLines = [ | |
| "C:\\> Initializing Veridian Terminal...", | |
| "C:\\> Loading modules...", | |
| "C:\\> Establishing connections...", | |
| "C:\\> Boot sequence complete.", | |
| "C:\\> System check: All systems nominal.", | |
| "C:\\> Welcome to Veridian." | |
| ]; | |
| // Show DOS screen first | |
| dosScreen.show(); | |
| // Function to add glitch errors on DOS screen | |
| function addGlitches() { | |
| // Add glitch text randomly | |
| for(let i=0; i<10; i++) { | |
| const glitch = $('<div class="glitch-text">ERROR</div>'); | |
| glitch.css({ | |
| top: Math.random() * 90 + 'vh', | |
| left: Math.random() * 90 + 'vw', | |
| transform: `rotate(${Math.random()*30-15}deg)` | |
| }); | |
| dosScreen.append(glitch); | |
| } | |
| // Add pixel artifacts | |
| for(let i=0; i<50; i++) { | |
| const pixel = $('<div class="pixel"></div>'); | |
| pixel.css({ | |
| top: Math.random() * 90 + 'vh', | |
| left: Math.random() * 90 + 'vw', | |
| backgroundColor: `rgb(${Math.floor(Math.random()*255)},${Math.floor(Math.random()*255)},${Math.floor(Math.random()*255)})` | |
| }); | |
| dosScreen.append(pixel); | |
| } | |
| } | |
| // Show DOS lines with glitches, then transition to loading screen | |
| let index = 0; | |
| function showDosLine() { | |
| if(index < dosLines.length) { | |
| dosScreen.append(dosLines[index] + "\n"); | |
| dosScreen.scrollTop(dosScreen[0].scrollHeight); | |
| index++; | |
| // Add glitches intermittently | |
| if(index === 2) addGlitches(); | |
| setTimeout(showDosLine, 1000); | |
| } else { | |
| // After DOS lines, wait a moment, then show loading screen | |
| setTimeout(() => { | |
| // Fade out DOS screen with CRT off effect | |
| dosScreen.css({opacity: 1}); | |
| dosScreen.animate({opacity: 0}, 1000, () => { | |
| dosScreen.hide().empty().css({opacity: 1}); | |
| showLoadingScreen(); | |
| }); | |
| }, 1500); | |
| } | |
| } | |
| function showLoadingScreen() { | |
| loadingScreen.show(); | |
| setTimeout(() => { | |
| loadingScreen.hide(); | |
| showStartupScreen(); | |
| }, 3000); | |
| } | |
| function showStartupScreen() { | |
| startupScreen.show(); | |
| setTimeout(() => { | |
| startupScreen.hide(); | |
| showTerminal(); | |
| }, 4000); | |
| } | |
| function showTerminal() { | |
| terminal.show(); | |
| input.focus(); | |
| } | |
| // Start the boot sequence | |
| showDosLine(); | |
| // Start Menu toggle | |
| $('#start-button').on('click', () => { | |
| startMenu.toggle(); | |
| }); | |
| // Hide start menu if clicking outside | |
| $(document).on('click', (e) => { | |
| if(!$(e.target).closest('#start-menu, #start-button').length) { | |
| startMenu.hide(); | |
| } | |
| }); | |
| // Terminal command handling example | |
| $('#input').on('keypress', (e) => { | |
| if(e.which === 13) { | |
| const cmd = input.val().trim(); | |
| output.append("> " + cmd + "\n"); | |
| input.val(''); | |
| output.scrollTop(output[0].scrollHeight); | |
| // Add simple command responses here | |
| if(cmd.toLowerCase() === 'help') { | |
| output.append("Available commands: help, exit\n"); | |
| } else if(cmd.toLowerCase() === 'exit') { | |
| output.append("Exiting terminal...\n"); | |
| terminal.hide(); | |
| } else { | |
| output.append("Unknown command\n"); | |
| } | |
| } | |
| }); | |
| }); | |
| </script> | |
| </body> | |
| </html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment