| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>CyberpunkDesktop</title> |
| <script src="https://cdn.tailwindcss.com"></script> |
| <script> |
| tailwind.config = { |
| theme: { |
| extend: { |
| colors: { |
| cyberpink: '#ff2a6d', |
| cyberblue: '#05d9fe', |
| cyberpurple: '#d300c5', |
| cyberdark: '#0d0221', |
| cybergray: '#1a1a2e', |
| }, |
| fontFamily: { |
| 'cyber': ['"Rajdhani"', 'sans-serif'], |
| }, |
| boxShadow: { |
| 'neon-pink': '0 0 10px #ff2a6d, 0 0 20px #ff2a6d, 0 0 30px #ff2a6d', |
| 'neon-blue': '0 0 10px #05d9fe, 0 0 20px #05d9fe, 0 0 30px #05d9fe', |
| 'neon-purple': '0 0 10px #d300c5, 0 0 20px #d300c5, 0 0 30px #d300c5', |
| } |
| } |
| } |
| } |
| </script> |
| <link href="https://fonts.googleapis.com/css2?family=Rajdhani:wght@300;400;500;600;700&display=swap" rel="stylesheet"> |
| <style> |
| |
| body { |
| background-color: #0d0221; |
| background-image: |
| linear-gradient(rgba(5, 217, 254, 0.1) 1px, transparent 1px), |
| linear-gradient(90deg, rgba(5, 217, 254, 0.1) 1px, transparent 1px); |
| background-size: 20px 20px; |
| overflow: hidden; |
| user-select: none; |
| font-family: 'Rajdhani', sans-serif; |
| } |
| |
| .window { |
| backdrop-filter: blur(10px); |
| background: rgba(26, 26, 46, 0.7); |
| border: 1px solid rgba(5, 217, 254, 0.3); |
| box-shadow: 0 0 15px rgba(5, 217, 254, 0.2); |
| } |
| |
| .window-header { |
| background: linear-gradient(90deg, rgba(5, 217, 254, 0.2), rgba(255, 42, 109, 0.2)); |
| } |
| |
| .taskbar { |
| backdrop-filter: blur(10px); |
| background: rgba(13, 2, 33, 0.7); |
| border-top: 1px solid rgba(5, 217, 254, 0.3); |
| } |
| |
| .icon:hover { |
| filter: drop-shadow(0 0 5px #05d9fe) drop-shadow(0 0 10px #ff2a6d); |
| } |
| |
| .resize-handle { |
| background: transparent; |
| z-index: 10; |
| } |
| |
| .resize-handle:hover { |
| background: rgba(5, 217, 254, 0.3); |
| } |
| |
| .terminal-cursor { |
| animation: blink 1s infinite; |
| } |
| |
| @keyframes blink { |
| 0%, 100% { opacity: 1; } |
| 50% { opacity: 0; } |
| } |
| |
| .context-menu { |
| backdrop-filter: blur(10px); |
| background: rgba(26, 26, 46, 0.9); |
| border: 1px solid rgba(255, 42, 109, 0.5); |
| box-shadow: 0 0 15px rgba(255, 42, 109, 0.3); |
| } |
| |
| .context-menu-item:hover { |
| background: rgba(255, 42, 109, 0.3); |
| } |
| |
| .ghost-window { |
| border: 2px dashed rgba(5, 217, 254, 0.7); |
| background: rgba(5, 217, 254, 0.1); |
| pointer-events: none; |
| } |
| </style> |
| </head> |
| <body class="h-screen w-screen text-white font-cyber flex flex-col"> |
| |
| <div id="desktop" class="flex-1 relative overflow-hidden"> |
| |
| </div> |
|
|
| |
| <div class="taskbar h-12 flex items-center px-2"> |
| <button id="start-button" class="h-10 px-3 flex items-center gap-2 hover:bg-cyberpurple hover:bg-opacity-20 rounded transition-all"> |
| <span class="text-cyberpink font-bold">START</span> |
| </button> |
| <div id="taskbar-items" class="flex-1 flex items-center gap-1 ml-2"> |
| |
| </div> |
| <div class="text-cyberblue text-sm font-medium px-2"> |
| <span id="clock">00:00:00</span> |
| </div> |
| </div> |
|
|
| |
| <div id="windows-container"> |
| |
| </div> |
|
|
| |
| <div id="context-menu" class="context-menu absolute hidden w-48 py-1 rounded z-50"> |
| <div class="context-menu-item px-4 py-2 cursor-pointer hover:text-cyberpink" onclick="openApp('explorer')">Open Explorer</div> |
| <div class="context-menu-item px-4 py-2 cursor-pointer hover:text-cyberpink" onclick="openApp('notepad')">New Text File</div> |
| <div class="context-menu-item px-4 py-2 cursor-pointer hover:text-cyberpink" onclick="location.reload()">Refresh</div> |
| </div> |
|
|
| |
| <div id="ghost-window" class="ghost-window absolute hidden z-40"></div> |
|
|
| <script> |
| |
| const apps = [ |
| { |
| id: 'explorer', |
| title: 'File Explorer', |
| icon: '📁', |
| content: ` |
| <div class="p-4"> |
| <h3 class="text-cyberpink mb-4">File Explorer</h3> |
| <div class="grid grid-cols-4 gap-4"> |
| <div class="icon p-2 rounded hover:bg-cyberblue hover:bg-opacity-10 cursor-pointer"> |
| <div class="text-4xl text-center">📁</div> |
| <div class="text-center mt-1 text-xs">Documents</div> |
| </div> |
| <div class="icon p-2 rounded hover:bg-cyberblue hover:bg-opacity-10 cursor-pointer"> |
| <div class="text-4xl text-center">🎵</div> |
| <div class="text-center mt-1 text-xs">Music</div> |
| </div> |
| <div class="icon p-2 rounded hover:bg-cyberblue hover:bg-opacity-10 cursor-pointer"> |
| <div class="text-4xl text-center">🖼️</div> |
| <div class="text-center mt-1 text-xs">Pictures</div> |
| </div> |
| <div class="icon p-2 rounded hover:bg-cyberblue hover:bg-opacity-10 cursor-pointer"> |
| <div class="text-4xl text-center">🎮</div> |
| <div class="text-center mt-1 text-xs">Games</div> |
| </div> |
| </div> |
| </div> |
| ` |
| }, |
| { |
| id: 'notepad', |
| title: 'Notepad', |
| icon: '📝', |
| content: ` |
| <div class="flex flex-col h-full"> |
| <textarea class="flex-1 bg-transparent p-4 outline-none resize-none" placeholder="Type something..."></textarea> |
| </div> |
| ` |
| }, |
| { |
| id: 'calculator', |
| title: 'Calculator', |
| icon: '🧮', |
| content: ` |
| <div class="p-4"> |
| <div class="bg-cybergray rounded p-2 mb-4 text-right text-xl h-10" id="calc-display">0</div> |
| <div class="grid grid-cols-4 gap-2"> |
| <button class="calc-btn bg-cyberpink bg-opacity-20 hover:bg-opacity-30" onclick="calcInput('7')">7</button> |
| <button class="calc-btn bg-cyberpink bg-opacity-20 hover:bg-opacity-30" onclick="calcInput('8')">8</button> |
| <button class="calc-btn bg-cyberpink bg-opacity-20 hover:bg-opacity-30" onclick="calcInput('9')">9</button> |
| <button class="calc-btn bg-cyberblue bg-opacity-20 hover:bg-opacity-30" onclick="calcInput('+')">+</button> |
| <button class="calc-btn bg-cyberpink bg-opacity-20 hover:bg-opacity-30" onclick="calcInput('4')">4</button> |
| <button class="calc-btn bg-cyberpink bg-opacity-20 hover:bg-opacity-30" onclick="calcInput('5')">5</button> |
| <button class="calc-btn bg-cyberpink bg-opacity-20 hover:bg-opacity-30" onclick="calcInput('6')">6</button> |
| <button class="calc-btn bg-cyberblue bg-opacity-20 hover:bg-opacity-30" onclick="calcInput('-')">-</button> |
| <button class="calc-btn bg-cyberpink bg-opacity-20 hover:bg-opacity-30" onclick="calcInput('1')">1</button> |
| <button class="calc-btn bg-cyberpink bg-opacity-20 hover:bg-opacity-30" onclick="calcInput('2')">2</button> |
| <button class="calc-btn bg-cyberpink bg-opacity-20 hover:bg-opacity-30" onclick="calcInput('3')">3</button> |
| <button class="calc-btn bg-cyberblue bg-opacity-20 hover:bg-opacity-30" onclick="calcInput('*')">×</button> |
| <button class="calc-btn bg-cyberpink bg-opacity-20 hover:bg-opacity-30" onclick="calcInput('0')">0</button> |
| <button class="calc-btn bg-cyberpink bg-opacity-20 hover:bg-opacity-30" onclick="calcInput('.')">.</button> |
| <button class="calc-btn bg-cyberblue bg-opacity-20 hover:bg-opacity-30" onclick="calcClear()">C</button> |
| <button class="calc-btn bg-cyberblue bg-opacity-20 hover:bg-opacity-30" onclick="calcInput('/')">÷</button> |
| <button class="calc-btn col-span-4 bg-cyberpurple bg-opacity-20 hover:bg-opacity-30" onclick="calcEquals()">=</button> |
| </div> |
| </div> |
| ` |
| }, |
| { |
| id: 'terminal', |
| title: 'Terminal', |
| icon: '💻', |
| content: ` |
| <div class="flex flex-col h-full p-2 bg-black bg-opacity-50"> |
| <div class="flex-1 overflow-y-auto font-mono text-sm" id="terminal-output"> |
| <div>CyberTerminal v1.0</div> |
| <div>Type "help" for available commands</div> |
| <div class="terminal-line"> </div> |
| </div> |
| <div class="flex items-center"> |
| <span class="text-cyberpink mr-2">$</span> |
| <input type="text" id="terminal-input" class="flex-1 bg-transparent outline-none" autocomplete="off" onkeydown="handleTerminalInput(event)"> |
| <span class="terminal-cursor ml-1">█</span> |
| </div> |
| </div> |
| ` |
| } |
| ]; |
| |
| |
| let activeWindowId = null; |
| let zIndexCounter = 1; |
| let isDragging = false; |
| let isResizing = false; |
| let resizeDirection = null; |
| let dragOffset = { x: 0, y: 0 }; |
| let originalWindowSize = { width: 0, height: 0 }; |
| let originalMousePos = { x: 0, y: 0 }; |
| |
| |
| function initDesktop() { |
| const desktop = document.getElementById('desktop'); |
| |
| apps.forEach(app => { |
| |
| const icon = document.createElement('div'); |
| icon.className = 'icon absolute flex flex-col items-center w-16 p-2 cursor-pointer'; |
| icon.style.left = `${Math.random() * (window.innerWidth - 100)}px`; |
| icon.style.top = `${Math.random() * (window.innerHeight - 150)}px`; |
| icon.innerHTML = ` |
| <div class="text-4xl">${app.icon}</div> |
| <div class="text-xs mt-1 text-center">${app.title}</div> |
| `; |
| icon.onclick = () => openApp(app.id); |
| desktop.appendChild(icon); |
| }); |
| |
| |
| updateClock(); |
| setInterval(updateClock, 1000); |
| |
| |
| document.addEventListener('contextmenu', (e) => { |
| e.preventDefault(); |
| const contextMenu = document.getElementById('context-menu'); |
| contextMenu.style.left = `${e.clientX}px`; |
| contextMenu.style.top = `${e.clientY}px`; |
| contextMenu.classList.remove('hidden'); |
| }); |
| |
| |
| document.addEventListener('click', () => { |
| document.getElementById('context-menu').classList.add('hidden'); |
| }); |
| |
| |
| setupWindowInteractions(); |
| } |
| |
| |
| function openApp(appId) { |
| const app = apps.find(a => a.id === appId); |
| if (!app) return; |
| |
| |
| let windowElement = document.getElementById(`window-${appId}`); |
| |
| if (!windowElement) { |
| |
| windowElement = document.createElement('div'); |
| windowElement.id = `window-${appId}`; |
| windowElement.className = 'window rounded-lg overflow-hidden absolute flex flex-col'; |
| windowElement.style.width = '400px'; |
| windowElement.style.height = '300px'; |
| windowElement.style.left = `${Math.random() * (window.innerWidth - 400)}px`; |
| windowElement.style.top = `${Math.random() * (window.innerHeight - 350)}px`; |
| |
| windowElement.innerHTML = ` |
| <div class="window-header h-8 flex items-center justify-between px-3 cursor-move"> |
| <div class="flex items-center gap-2"> |
| <span>${app.icon}</span> |
| <span class="font-medium">${app.title}</span> |
| </div> |
| <div class="flex gap-2"> |
| <button class="w-4 h-4 rounded-full bg-yellow-500 hover:bg-yellow-400" onclick="minimizeWindow('${appId}')"></button> |
| <button class="w-4 h-4 rounded-full bg-green-500 hover:bg-green-400" onclick="maximizeWindow('${appId}')"></button> |
| <button class="w-4 h-4 rounded-full bg-red-500 hover:bg-red-400" onclick="closeWindow('${appId}')"></button> |
| </div> |
| </div> |
| <div class="flex-1 overflow-auto"> |
| ${app.content} |
| </div> |
| <div class="resize-handle absolute bottom-0 right-0 w-3 h-3 cursor-nwse-resize"></div> |
| `; |
| |
| document.getElementById('windows-container').appendChild(windowElement); |
| |
| |
| addToTaskbar(appId); |
| } |
| |
| |
| bringToFront(windowElement); |
| |
| |
| windowElement.classList.remove('hidden'); |
| |
| |
| activeWindowId = appId; |
| |
| |
| if (appId === 'terminal') { |
| initTerminal(); |
| } |
| } |
| |
| |
| function closeWindow(appId) { |
| const windowElement = document.getElementById(`window-${appId}`); |
| if (windowElement) { |
| windowElement.remove(); |
| removeFromTaskbar(appId); |
| } |
| } |
| |
| |
| function minimizeWindow(appId) { |
| const windowElement = document.getElementById(`window-${appId}`); |
| if (windowElement) { |
| windowElement.classList.add('hidden'); |
| } |
| } |
| |
| |
| function maximizeWindow(appId) { |
| const windowElement = document.getElementById(`window-${appId}`); |
| if (windowElement) { |
| if (windowElement.classList.contains('maximized')) { |
| |
| windowElement.classList.remove('maximized'); |
| windowElement.style.width = originalWindowSize.width + 'px'; |
| windowElement.style.height = originalWindowSize.height + 'px'; |
| windowElement.style.left = originalWindowSize.left + 'px'; |
| windowElement.style.top = originalWindowSize.top + 'px'; |
| } else { |
| |
| originalWindowSize = { |
| width: parseInt(windowElement.style.width), |
| height: parseInt(windowElement.style.height), |
| left: parseInt(windowElement.style.left), |
| top: parseInt(windowElement.style.top) |
| }; |
| |
| windowElement.classList.add('maximized'); |
| windowElement.style.width = (window.innerWidth - 20) + 'px'; |
| windowElement.style.height = (window.innerHeight - 60) + 'px'; |
| windowElement.style.left = '10px'; |
| windowElement.style.top = '10px'; |
| } |
| } |
| } |
| |
| |
| function bringToFront(windowElement) { |
| zIndexCounter++; |
| windowElement.style.zIndex = zIndexCounter; |
| activeWindowId = windowElement.id.replace('window-', ''); |
| } |
| |
| |
| function addToTaskbar(appId) { |
| const app = apps.find(a => a.id === appId); |
| if (!app) return; |
| |
| const taskbarItems = document.getElementById('taskbar-items'); |
| const existingItem = document.getElementById(`taskbar-${appId}`); |
| |
| if (!existingItem) { |
| const item = document.createElement('div'); |
| item.id = `taskbar-${appId}`; |
| item.className = 'flex items-center gap-2 px-3 py-1 rounded hover:bg-cyberblue hover:bg-opacity-20 cursor-pointer'; |
| item.innerHTML = ` |
| <span>${app.icon}</span> |
| <span class="text-sm">${app.title}</span> |
| `; |
| item.onclick = () => { |
| const windowElement = document.getElementById(`window-${appId}`); |
| if (windowElement) { |
| if (windowElement.classList.contains('hidden')) { |
| windowElement.classList.remove('hidden'); |
| bringToFront(windowElement); |
| } else { |
| bringToFront(windowElement); |
| } |
| } else { |
| openApp(appId); |
| } |
| }; |
| taskbarItems.appendChild(item); |
| } |
| } |
| |
| |
| function removeFromTaskbar(appId) { |
| const item = document.getElementById(`taskbar-${appId}`); |
| if (item) { |
| item.remove(); |
| } |
| } |
| |
| |
| function updateClock() { |
| const now = new Date(); |
| const hours = now.getHours().toString().padStart(2, '0'); |
| const minutes = now.getMinutes().toString().padStart(2, '0'); |
| const seconds = now.getSeconds().toString().padStart(2, '0'); |
| document.getElementById('clock').textContent = `${hours}:${minutes}:${seconds}`; |
| } |
| |
| |
| function setupWindowInteractions() { |
| document.addEventListener('mousedown', (e) => { |
| |
| const header = e.target.closest('.window-header'); |
| if (header) { |
| const windowElement = header.closest('.window'); |
| if (windowElement) { |
| |
| bringToFront(windowElement); |
| |
| |
| isDragging = true; |
| dragOffset = { |
| x: e.clientX - windowElement.getBoundingClientRect().left, |
| y: e.clientY - windowElement.getBoundingClientRect().top |
| }; |
| |
| |
| document.body.style.userSelect = 'none'; |
| } |
| } |
| |
| |
| const resizeHandle = e.target.closest('.resize-handle'); |
| if (resizeHandle) { |
| const windowElement = resizeHandle.closest('.window'); |
| if (windowElement) { |
| |
| bringToFront(windowElement); |
| |
| |
| isResizing = true; |
| resizeDirection = 'se'; |
| originalWindowSize = { |
| width: parseInt(windowElement.style.width), |
| height: parseInt(windowElement.style.height) |
| }; |
| originalMousePos = { x: e.clientX, y: e.clientY }; |
| |
| |
| const ghostWindow = document.getElementById('ghost-window'); |
| ghostWindow.style.width = originalWindowSize.width + 'px'; |
| ghostWindow.style.height = originalWindowSize.height + 'px'; |
| ghostWindow.style.left = windowElement.style.left; |
| ghostWindow.style.top = windowElement.style.top; |
| ghostWindow.classList.remove('hidden'); |
| |
| |
| document.body.style.userSelect = 'none'; |
| } |
| } |
| }); |
| |
| document.addEventListener('mousemove', (e) => { |
| if (isDragging) { |
| const windowElement = document.getElementById(`window-${activeWindowId}`); |
| if (windowElement) { |
| let newLeft = e.clientX - dragOffset.x; |
| let newTop = e.clientY - dragOffset.y; |
| |
| |
| newLeft = Math.max(0, Math.min(newLeft, window.innerWidth - windowElement.offsetWidth)); |
| newTop = Math.max(0, Math.min(newTop, window.innerHeight - windowElement.offsetHeight)); |
| |
| windowElement.style.left = `${newLeft}px`; |
| windowElement.style.top = `${newTop}px`; |
| } |
| } |
| |
| if (isResizing) { |
| const windowElement = document.getElementById(`window-${activeWindowId}`); |
| if (windowElement) { |
| const ghostWindow = document.getElementById('ghost-window'); |
| |
| const deltaX = e.clientX - originalMousePos.x; |
| const deltaY = e.clientY - originalMousePos.y; |
| |
| let newWidth = originalWindowSize.width; |
| let newHeight = originalWindowSize.height; |
| |
| if (resizeDirection.includes('e')) { |
| newWidth = Math.max(150, originalWindowSize.width + deltaX); |
| } |
| if (resizeDirection.includes('s')) { |
| newHeight = Math.max(100, originalWindowSize.height + deltaY); |
| } |
| |
| ghostWindow.style.width = `${newWidth}px`; |
| ghostWindow.style.height = `${newHeight}px`; |
| } |
| } |
| }); |
| |
| document.addEventListener('mouseup', () => { |
| if (isDragging) { |
| isDragging = false; |
| document.body.style.userSelect = ''; |
| } |
| |
| if (isResizing) { |
| isResizing = false; |
| document.body.style.userSelect = ''; |
| |
| const windowElement = document.getElementById(`window-${activeWindowId}`); |
| const ghostWindow = document.getElementById('ghost-window'); |
| |
| if (windowElement && ghostWindow) { |
| windowElement.style.width = ghostWindow.style.width; |
| windowElement.style.height = ghostWindow.style.height; |
| } |
| |
| ghostWindow.classList.add('hidden'); |
| } |
| }); |
| } |
| |
| |
| function calcInput(value) { |
| const display = document.getElementById('calc-display'); |
| if (display.textContent === '0' && value !== '.') { |
| display.textContent = value; |
| } else { |
| display.textContent += value; |
| } |
| } |
| |
| function calcClear() { |
| document.getElementById('calc-display').textContent = '0'; |
| } |
| |
| function calcEquals() { |
| const display = document.getElementById('calc-display'); |
| try { |
| |
| const expression = display.textContent.replace(/×/g, '*').replace(/÷/g, '/'); |
| display.textContent = eval(expression).toString(); |
| } catch (e) { |
| display.textContent = 'Error'; |
| } |
| } |
| |
| |
| function initTerminal() { |
| |
| const terminalInput = document.getElementById('terminal-input'); |
| if (terminalInput) { |
| terminalInput.value = ''; |
| terminalInput.focus(); |
| } |
| } |
| |
| function handleTerminalInput(e) { |
| if (e.key === 'Enter') { |
| const input = document.getElementById('terminal-input'); |
| const command = input.value.trim(); |
| input.value = ''; |
| |
| processTerminalCommand(command); |
| } |
| } |
| |
| function processTerminalCommand(command) { |
| const output = document.getElementById('terminal-output'); |
| |
| |
| const commandLine = document.createElement('div'); |
| commandLine.innerHTML = `<span class="text-cyberpink">$</span> ${command}`; |
| output.appendChild(commandLine); |
| |
| |
| let response = ''; |
| switch (command.toLowerCase()) { |
| case 'help': |
| response = ` |
| Available commands:<br> |
| - help: Show this help<br> |
| - clear: Clear terminal<br> |
| - about: Show system info<br> |
| - hack: Initiate hacking sequence (just kidding)<br> |
| `; |
| break; |
| case 'clear': |
| output.innerHTML = ''; |
| output.appendChild(document.createElement('div')); |
| return; |
| case 'about': |
| response = ` |
| CyberTerminal v1.0<br> |
| Running on CyberpunkDesktop<br> |
| System status: <span class="text-cyberblue">OPERATIONAL</span> |
| `; |
| break; |
| case 'hack': |
| response = ` |
| <span class="text-cyberpink">INITIATING HACKING SEQUENCE...</span><br> |
| Accessing mainframe...<br> |
| Bypassing firewalls...<br> |
| <span class="text-cyberblue">ERROR: Not a real terminal</span><br> |
| Just kidding! This is a simulation. |
| `; |
| break; |
| case '': |
| response = ''; |
| break; |
| default: |
| response = `<span class="text-cyberpink">Command not found: ${command}</span>`; |
| } |
| |
| const responseLine = document.createElement('div'); |
| responseLine.innerHTML = response; |
| output.appendChild(responseLine); |
| |
| |
| output.appendChild(document.createElement('div')); |
| |
| |
| output.scrollTop = output.scrollHeight; |
| } |
| |
| |
| document.addEventListener('DOMContentLoaded', initDesktop); |
| </script> |
| <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=Boobs00/windy" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> |
| </html> |