| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Quantumize Browser</title> |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
| <style> |
| .error-actions { |
| display: flex; |
| gap: 10px; |
| margin-top: 20px; |
| } |
| |
| .error-action-btn { |
| padding: 10px 20px; |
| border: none; |
| border-radius: 5px; |
| background: var(--primary-color); |
| color: white; |
| cursor: pointer; |
| display: flex; |
| align-items: center; |
| gap: 8px; |
| } |
| |
| .error-action-btn:hover { |
| background: #306cce; |
| } |
| |
| .browser-iframe { |
| width: 100%; |
| height: 100%; |
| border: none; |
| background: white; |
| } |
| |
| .security-indicator { |
| margin-right: 8px; |
| font-size: 14px; |
| } |
| |
| .secure { color: #0b8043; } |
| .insecure { color: #d50000; } |
| |
| :root { |
| --primary-color: #4285f4; |
| --secondary-color: #f1f3f4; |
| --dark-color: #202124; |
| --light-color: #ffffff; |
| --border-color: #dadce0; |
| --highlight-color: #e8f0fe; |
| } |
| |
| * { |
| margin: 0; |
| padding: 0; |
| box-sizing: border-box; |
| font-family: 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; |
| } |
| |
| body { |
| background-color: #f8f9fa; |
| height: 100vh; |
| display: flex; |
| flex-direction: column; |
| overflow: hidden; |
| } |
| |
| |
| .browser-header { |
| background-color: var(--dark-color); |
| color: var(--light-color); |
| padding: 8px 16px; |
| display: flex; |
| align-items: center; |
| justify-content: space-between; |
| height: 48px; |
| -webkit-app-region: drag; |
| } |
| |
| .browser-controls { |
| display: flex; |
| align-items: center; |
| gap: 16px; |
| -webkit-app-region: no-drag; |
| } |
| |
| .control-btn { |
| background: none; |
| border: none; |
| color: var(--light-color); |
| font-size: 16px; |
| cursor: pointer; |
| padding: 4px; |
| border-radius: 4px; |
| transition: background-color 0.2s; |
| } |
| |
| .control-btn:hover { |
| background-color: rgba(255, 255, 255, 0.1); |
| } |
| |
| .window-title { |
| font-size: 14px; |
| opacity: 0.8; |
| flex: 1; |
| text-align: center; |
| padding: 0 20px; |
| -webkit-app-region: drag; |
| } |
| |
| |
| .tab-bar { |
| background-color: #fff; |
| display: flex; |
| height: 48px; |
| padding: 0 16px; |
| border-bottom: 1px solid rgba(0, 0, 0, 0.1); |
| overflow-x: auto; |
| overflow-y: hidden; |
| scrollbar-width: none; |
| } |
| |
| .tab-bar::-webkit-scrollbar { |
| display: none; |
| } |
| |
| .tab { |
| background-color: rgba(0, 0, 0, 0.05); |
| color: var(--dark-color); |
| padding: 12px 20px; |
| margin-right: 4px; |
| border-radius: 8px 8px 0 0; |
| font-size: 14px; |
| display: flex; |
| align-items: center; |
| max-width: 220px; |
| min-width: 120px; |
| position: relative; |
| cursor: pointer; |
| transition: all 0.2s; |
| border: 1px solid rgba(0, 0, 0, 0.1); |
| border-bottom: none; |
| } |
| |
| .tab.active { |
| background-color: #fff; |
| color: var(--dark-color); |
| border-color: rgba(0, 0, 0, 0.1); |
| } |
| |
| .tab:hover { |
| background-color: rgba(0, 0, 0, 0.08); |
| } |
| |
| .tab.active:hover { |
| background-color: #fff; |
| } |
| |
| .tab-title { |
| white-space: nowrap; |
| overflow: hidden; |
| text-overflow: ellipsis; |
| flex: 1; |
| margin: 0 8px; |
| } |
| |
| .tab-close { |
| width: 18px; |
| height: 18px; |
| border-radius: 50%; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| transition: background-color 0.2s; |
| color: #5f6368; |
| } |
| |
| .tab:hover .tab-close { |
| background-color: rgba(0, 0, 0, 0.1); |
| } |
| |
| .new-tab-btn { |
| color: #5f6368; |
| font-size: 20px; |
| margin-left: 8px; |
| padding: 0 12px; |
| display: flex; |
| align-items: center; |
| cursor: pointer; |
| border-radius: 4px; |
| transition: background-color 0.2s; |
| min-width: 40px; |
| flex-shrink: 0; |
| } |
| |
| .new-tab-btn:hover { |
| background-color: rgba(0, 0, 0, 0.1); |
| } |
| |
| |
| .nav-bar { |
| display: flex; |
| padding: 8px; |
| background-color: var(--light-color); |
| border-bottom: 1px solid var(--border-color); |
| align-items: center; |
| } |
| |
| .nav-btn { |
| background: none; |
| border: none; |
| font-size: 20px; |
| width: 40px; |
| height: 40px; |
| border-radius: 50%; |
| cursor: pointer; |
| color: #5f6368; |
| transition: background-color 0.2s; |
| } |
| |
| .nav-btn:hover { |
| background-color: var(--secondary-color); |
| } |
| |
| .nav-btn.disabled { |
| color: #dadce0; |
| cursor: default; |
| } |
| |
| .nav-btn.disabled:hover { |
| background: none; |
| } |
| |
| .address-bar { |
| flex: 1; |
| margin: 0 8px; |
| height: 40px; |
| border-radius: 20px; |
| border: 1px solid var(--border-color); |
| padding: 0 16px; |
| font-size: 15px; |
| outline: none; |
| transition: box-shadow 0.2s; |
| background-color: var(--secondary-color); |
| } |
| |
| .address-bar:focus { |
| background-color: #fff; |
| border-color: var(--primary-color); |
| box-shadow: 0 1px 6px rgba(32, 33, 36, 0.28); |
| } |
| |
| .extensions-area { |
| display: flex; |
| margin-left: 8px; |
| } |
| |
| .extension-icon { |
| width: 24px; |
| height: 24px; |
| margin: 0 4px; |
| cursor: pointer; |
| border-radius: 4px; |
| transition: transform 0.2s; |
| } |
| |
| .extension-icon:hover { |
| transform: scale(1.1); |
| } |
| |
| .profile-btn { |
| width: 32px; |
| height: 32px; |
| border-radius: 50%; |
| background-color: var(--primary-color); |
| color: white; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| font-weight: bold; |
| margin-left: 8px; |
| cursor: pointer; |
| transition: transform 0.2s; |
| } |
| |
| .profile-btn:hover { |
| transform: scale(1.05); |
| } |
| |
| |
| .content-area { |
| flex: 1; |
| display: flex; |
| background-color: var(--light-color); |
| overflow: hidden; |
| } |
| |
| |
| .sidebar { |
| width: 72px; |
| background-color: #f6f8fc; |
| display: flex; |
| flex-direction: column; |
| align-items: center; |
| padding: 16px 0; |
| border-right: 1px solid var(--border-color); |
| } |
| |
| .sidebar-icon { |
| width: 40px; |
| height: 40px; |
| border-radius: 50%; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| color: #5f6368; |
| margin-bottom: 16px; |
| cursor: pointer; |
| transition: all 0.2s; |
| } |
| |
| .sidebar-icon:hover { |
| background-color: rgba(0, 0, 0, 0.08); |
| } |
| |
| .sidebar-icon.active { |
| background-color: var(--highlight-color); |
| color: var(--primary-color); |
| } |
| |
| |
| .main-view { |
| flex: 1; |
| display: flex; |
| flex-direction: column; |
| overflow: hidden; |
| position: relative; |
| } |
| |
| |
| .current-page { |
| flex: 1; |
| border: none; |
| background-color: var(--light-color); |
| width: 100%; |
| height: 100%; |
| } |
| |
| |
| .status-bar { |
| height: 24px; |
| background-color: var(--light-color); |
| border-top: 1px solid var(--border-color); |
| display: flex; |
| align-items: center; |
| padding: 0 16px; |
| font-size: 12px; |
| color: #5f6368; |
| justify-content: space-between; |
| } |
| |
| |
| .profile-menu { |
| position: absolute; |
| top: 80px; |
| right: 16px; |
| background-color: var(--light-color); |
| width: 300px; |
| border-radius: 8px; |
| box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.2); |
| z-index: 100; |
| display: none; |
| padding: 16px; |
| border: 1px solid var(--border-color); |
| } |
| |
| .profile-menu.active { |
| display: block; |
| } |
| |
| .profile-header { |
| display: flex; |
| align-items: center; |
| padding-bottom: 16px; |
| border-bottom: 1px solid var(--border-color); |
| margin-bottom: 8px; |
| } |
| |
| .profile-header-icon { |
| width: 40px; |
| height: 40px; |
| border-radius: 50%; |
| background-color: var(--primary-color); |
| color: white; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| font-weight: bold; |
| margin-right: 16px; |
| } |
| |
| .profile-info h3 { |
| font-size: 16px; |
| margin-bottom: 4px; |
| } |
| |
| .profile-info p { |
| font-size: 14px; |
| color: #5f6368; |
| } |
| |
| .menu-items { |
| padding: 8px 0; |
| } |
| |
| .menu-item { |
| padding: 12px 8px; |
| display: flex; |
| align-items: center; |
| border-radius: 4px; |
| cursor: pointer; |
| } |
| |
| .menu-item:hover { |
| background-color: var(--secondary-color); |
| } |
| |
| .menu-item i { |
| margin-right: 16px; |
| color: #5f6368; |
| width: 20px; |
| text-align: center; |
| } |
| |
| |
| .extensions-menu { |
| position: absolute; |
| top: 80px; |
| right: 100px; |
| background-color: var(--light-color); |
| width: 300px; |
| border-radius: 8px; |
| box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.2); |
| z-index: 100; |
| display: none; |
| padding: 16px; |
| border: 1px solid var(--border-color); |
| } |
| |
| .extensions-menu.active { |
| display: block; |
| } |
| |
| .extensions-header { |
| display: flex; |
| justify-content: space-between; |
| align-items: center; |
| padding-bottom: 16px; |
| border-bottom: 1px solid var(--border-color); |
| margin-bottom: 8px; |
| } |
| |
| .extension { |
| display: flex; |
| align-items: center; |
| padding: 8px; |
| border-radius: 4px; |
| margin-bottom: 8px; |
| cursor: pointer; |
| } |
| |
| .extension:hover { |
| background-color: var(--secondary-color); |
| } |
| |
| .extension-icon-small { |
| width: 32px; |
| height: 32px; |
| background-color: #f1f3f4; |
| border-radius: 4px; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| margin-right: 12px; |
| color: var(--primary-color); |
| } |
| |
| .extension-info { |
| flex: 1; |
| } |
| |
| .extension-info h4 { |
| font-size: 14px; |
| margin-bottom: 2px; |
| } |
| |
| .extension-info p { |
| font-size: 12px; |
| color: #5f6368; |
| } |
| |
| .extension-toggle { |
| width: 36px; |
| height: 20px; |
| background-color: #ccc; |
| border-radius: 10px; |
| position: relative; |
| cursor: pointer; |
| } |
| |
| .extension-toggle.active { |
| background-color: var(--primary-color); |
| } |
| |
| .toggle-knob { |
| width: 16px; |
| height: 16px; |
| background-color: white; |
| border-radius: 50%; |
| position: absolute; |
| top: 2px; |
| left: 2px; |
| transition: transform 0.2s; |
| } |
| |
| .extension-toggle.active .toggle-knob { |
| transform: translateX(16px); |
| } |
| |
| |
| .download-bar { |
| position: absolute; |
| bottom: 0; |
| left: 0; |
| width: 100%; |
| background-color: var(--light-color); |
| border-top: 1px solid var(--border-color); |
| padding: 8px 16px; |
| display: none; |
| z-index: 10; |
| box-shadow: 0 -2px 5px rgba(0, 0, 0, 0.1); |
| } |
| |
| .download-bar.active { |
| display: block; |
| animation: slideUp 0.3s ease-out; |
| } |
| |
| @keyframes slideUp { |
| from { transform: translateY(100%); } |
| to { transform: translateY(0); } |
| } |
| |
| .download-item { |
| display: flex; |
| align-items: center; |
| padding: 8px; |
| border-radius: 4px; |
| } |
| |
| .download-item:hover { |
| background-color: var(--secondary-color); |
| } |
| |
| .download-icon { |
| width: 24px; |
| height: 24px; |
| margin-right: 12px; |
| color: var(--primary-color); |
| } |
| |
| .download-info { |
| flex: 1; |
| } |
| |
| .download-info h4 { |
| font-size: 14px; |
| margin-bottom: 2px; |
| white-space: nowrap; |
| overflow: hidden; |
| text-overflow: ellipsis; |
| } |
| |
| .download-info p { |
| font-size: 12px; |
| color: #5f6368; |
| } |
| |
| .download-progress { |
| width: 120px; |
| height: 4px; |
| background-color: var(--secondary-color); |
| border-radius: 2px; |
| overflow: hidden; |
| margin: 0 12px; |
| } |
| |
| .download-progress-bar { |
| height: 100%; |
| background-color: var(--primary-color); |
| width: 30%; |
| transition: width 0.3s; |
| } |
| |
| .download-actions i { |
| margin-left: 12px; |
| cursor: pointer; |
| color: #5f6368; |
| } |
| |
| |
| .theme-dark { |
| --dark-color: #202124; |
| --light-color: #35363a; |
| --border-color: #5f6368; |
| --secondary-color: #292a2d; |
| --highlight-color: #414243; |
| color: #e8eaed; |
| } |
| |
| .theme-dark .address-bar { |
| background-color: var(--dark-color); |
| color: white; |
| } |
| |
| .theme-dark .sidebar { |
| background-color: #25272a; |
| border-right-color: var(--border-color); |
| } |
| |
| .theme-dark .content-area { |
| background-color: var(--dark-color); |
| } |
| |
| .theme-dark .current-page { |
| background-color: var(--dark-color); |
| } |
| |
| .theme-dark .nav-btn { |
| color: #e8eaed; |
| } |
| |
| .theme-dark .status-bar { |
| background-color: var(--dark-color); |
| color: #9aa0a6; |
| border-top: 1px solid var(--border-color); |
| } |
| |
| .theme-dark .sidebar-icon { |
| color: #e8eaed; |
| } |
| |
| .theme-dark .sidebar-icon:hover { |
| background-color: rgba(255, 255, 255, 0.08); |
| } |
| |
| .theme-dark .sidebar-icon.active { |
| background-color: var(--highlight-color); |
| color: var(--primary-color); |
| } |
| |
| |
| .tab.dragging { |
| opacity: 0.8; |
| transform: scale(0.98); |
| box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); |
| } |
| |
| |
| .bookmarks-bar { |
| display: flex; |
| padding: 8px 16px; |
| background-color: var(--secondary-color); |
| border-bottom: 1px solid var(--border-color); |
| gap: 12px; |
| overflow-x: auto; |
| } |
| |
| .bookmark { |
| padding: 4px 12px; |
| background-color: rgba(0, 0, 0, 0.05); |
| border-radius: 4px; |
| cursor: pointer; |
| display: flex; |
| align-items: center; |
| gap: 6px; |
| white-space: nowrap; |
| font-size: 13px; |
| transition: background-color 0.2s; |
| } |
| |
| .bookmark:hover { |
| background-color: rgba(0, 0, 0, 0.1); |
| } |
| |
| .bookmark i { |
| font-size: 12px; |
| color: #5f6368; |
| } |
| |
| |
| .error-page { |
| padding: 20px; |
| text-align: center; |
| color: #ff4444; |
| display: none; |
| flex-direction: column; |
| align-items: center; |
| justify-content: center; |
| height: 100%; |
| } |
| |
| .error-page i { |
| font-size: 48px; |
| margin-bottom: 16px; |
| } |
| |
| .error-page h2 { |
| margin-bottom: 8px; |
| } |
| |
| .error-page p { |
| margin-bottom: 16px; |
| color: #5f6368; |
| max-width: 400px; |
| } |
| |
| .error-retry-btn { |
| background-color: var(--primary-color); |
| color: white; |
| border: none; |
| padding: 8px 16px; |
| border-radius: 4px; |
| cursor: pointer; |
| transition: background-color 0.2s; |
| } |
| |
| .error-retry-btn:hover { |
| background-color: #3367d6; |
| } |
| |
| |
| .loading-overlay { |
| position: absolute; |
| top: 0; |
| left: 0; |
| width: 100%; |
| height: 100%; |
| background: rgba(255, 255, 255, 0.8); |
| display: none; |
| justify-content: center; |
| align-items: center; |
| z-index: 10; |
| } |
| |
| .loading-overlay i { |
| font-size: 32px; |
| color: var(--primary-color); |
| animation: spin 1s linear infinite; |
| } |
| |
| @keyframes spin { |
| from { transform: rotate(0deg); } |
| to { transform: rotate(360deg); } |
| } |
| |
| |
| .search-suggestions { |
| position: absolute; |
| width: calc(100% - 32px); |
| background: var(--light-color); |
| border: 1px solid var(--border-color); |
| border-radius: 0 0 8px 8px; |
| margin-top: -4px; |
| display: none; |
| z-index: 1000; |
| max-height: 300px; |
| overflow-y: auto; |
| box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); |
| } |
| |
| .suggestion-item { |
| padding: 8px 16px; |
| cursor: pointer; |
| display: flex; |
| align-items: center; |
| } |
| |
| .suggestion-item:hover { |
| background-color: var(--secondary-color); |
| } |
| |
| .suggestion-item i { |
| margin-right: 10px; |
| color: #5f6368; |
| font-size: 14px; |
| } |
| |
| |
| .security-indicator { |
| margin-right: 8px; |
| font-size: 14px; |
| } |
| |
| .secure { |
| color: #0b8043; |
| } |
| |
| .insecure { |
| color: #d50000; |
| } |
| |
| |
| .window-controls { |
| display: flex; |
| align-items: center; |
| gap: 8px; |
| } |
| |
| .window-btn { |
| width: 16px; |
| height: 16px; |
| border-radius: 50%; |
| border: none; |
| cursor: pointer; |
| transition: transform 0.2s; |
| } |
| |
| .window-btn:hover { |
| transform: scale(1.1); |
| } |
| |
| .window-btn.close { |
| background-color: #ff5f56; |
| } |
| |
| .window-btn.minimize { |
| background-color: #ffbd2e; |
| } |
| |
| .window-btn.maximize { |
| background-color: #27c93f; |
| } |
| </style> |
| </head> |
| <body> |
| <div class="browser-header"> |
| <div class="browser-controls"> |
| <button class="control-btn"><i class="fas fa-bars"></i></button> |
| <button class="control-btn"><i class="fas fa-download"></i></button> |
| <button class="control-btn"><i class="fas fa-print"></i></button> |
| </div> |
| |
| <div class="window-title">Quantumize Browser</div> |
| |
| <div class="window-controls"> |
| <button class="window-btn minimize"></button> |
| <button class="window-btn maximize"></button> |
| <button class="window-btn close"></button> |
| </div> |
| </div> |
|
|
| |
| <div class="tab-bar" id="tab-bar"> |
| <div class="tab active" data-url="https://www.google.com"> |
| <i class="fas fa-lock security-indicator secure"></i> |
| <div class="tab-title">Google</div> |
| <div class="tab-close"><i class="fas fa-times"></i></div> |
| </div> |
| <div class="tab" data-url="https://www.youtube.com"> |
| <i class="fab fa-youtube" style="font-size: 12px; color: red;"></i> |
| <div class="tab-title">YouTube</div> |
| <div class="tab-close"><i class="fas fa-times"></i></div> |
| </div> |
| <div class="tab" data-url="https://www.wikipedia.org"> |
| <i class="fas fa-globe" style="font-size: 12px;"></i> |
| <div class="tab-title">Wikipedia</div> |
| <div class="tab-close"><i class="fas fa-times"></i></div> |
| </div> |
| <div class="new-tab-btn"> |
| <i class="fas fa-plus"></i> |
| </div> |
| </div> |
|
|
| |
| <div class="nav-bar"> |
| <button class="nav-btn disabled" id="back-btn"><i class="fas fa-arrow-left"></i></button> |
| <button class="nav-btn disabled" id="forward-btn"><i class="fas fa-arrow-right"></i></button> |
| <button class="nav-btn" id="reload-btn"><i class="fas fa-redo"></i></button> |
| <button class="nav-btn" id="home-btn"><i class="fas fa-home"></i></button> |
| |
| <div style="flex: 1; position: relative;"> |
| <input type="text" class="address-bar" id="address-bar" value="https://www.google.com" autocomplete="off"> |
| <div class="search-suggestions" id="search-suggestions"></div> |
| </div> |
| |
| <div class="extensions-area"> |
| <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Google_Chrome_icon_%28February_2022%29.svg/512px-Google_Chrome_icon_%28February_2022%29.svg.png" class="extension-icon" title="AdBlocker"> |
| <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/Google_Translate_logo.svg/800px-Google_Translate_logo.svg.png" class="extension-icon" title="Google Translate"> |
| <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/4/45/LastPass_icon.svg/1024px-LastPass_icon.svg.png" class="extension-icon" title="Password Manager" id="extensions-btn"> |
| </div> |
| |
| <div class="profile-btn" id="profile-btn">Q</div> |
| </div> |
| |
| <div class="bookmarks-bar" id="bookmarks-bar"> |
| <div class="bookmark" data-url="https://www.google.com"><i class="fas fa-search"></i> Google</div> |
| <div class="bookmark" data-url="https://www.youtube.com"><i class="fab fa-youtube"></i> YouTube</div> |
| <div class="bookmark" data-url="https://www.wikipedia.org"><i class="fas fa-book"></i> Wikipedia</div> |
| <div class="bookmark" data-url="https://www.github.com"><i class="fab fa-github"></i> GitHub</div> |
| <div class="bookmark" data-url="https://www.twitter.com"><i class="fab fa-twitter"></i> Twitter</div> |
| </div> |
|
|
| |
| <div class="content-area"> |
| |
| <div class="sidebar"> |
| <div class="sidebar-icon active" title="Home"> |
| <i class="fas fa-compass"></i> |
| </div> |
| <div class="sidebar-icon" title="Bookmarks"> |
| <i class="fas fa-bookmark"></i> |
| </div> |
| <div class="sidebar-icon" title="History"> |
| <i class="fas fa-history"></i> |
| </div> |
| <div class="sidebar-icon" title="Downloads" id="downloads-btn"> |
| <i class="fas fa-download"></i> |
| </div> |
| <div class="sidebar-icon" title="Settings"> |
| <i class="fas fa-cog"></i> |
| </div> |
| </div> |
|
|
| |
| <div class="main-view"> |
| <div class="loading-overlay" id="loading"> |
| <i class="fas fa-spinner"></i> |
| </div> |
| |
| <div class="error-page" id="error-page"> |
| <i class="fas fa-exclamation-triangle"></i> |
| <h2>Page not available</h2> |
| <p>The webpage at <span id="error-url">https://example.com</span> could not be loaded.</p> |
| <p>Check the internet connection or the website address.</p> |
| <button class="error-retry-btn" id="retry-btn">Retry</button> |
| </div> |
| |
| <iframe src="https://www.google.com" class="current-page" id="browser-iframe"></iframe> |
| </div> |
| </div> |
|
|
| |
| <div class="status-bar"> |
| <span id="status-text">Ready</span> |
| <span id="page-url">https://www.google.com</span> |
| </div> |
|
|
| |
| <div class="profile-menu" id="profile-menu"> |
| <div class="profile-header"> |
| <div class="profile-header-icon">Q</div> |
| <div class="profile-info"> |
| <h3>Quantumize User</h3> |
| <p>user@quantumize.com</p> |
| </div> |
| </div> |
| <div class="menu-items"> |
| <div class="menu-item"> |
| <i class="fas fa-user"></i> |
| <span>Profile</span> |
| </div> |
| <div class="menu-item"> |
| <i class="fas fa-key"></i> |
| <span>Manage accounts</span> |
| </div> |
| <div class="menu-item" id="dark-mode-btn"> |
| <i class="fas fa-moon"></i> |
| <span>Dark mode</span> |
| </div> |
| <div class="menu-item"> |
| <i class="fas fa-sign-out-alt"></i> |
| <span>Sign out</span> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="extensions-menu" id="extensions-menu"> |
| <div class="extensions-header"> |
| <h3>Extensions</h3> |
| <button class="control-btn"><i class="fas fa-cog"></i></button> |
| </div> |
| <div class="extension"> |
| <div class="extension-icon-small"> |
| <i class="fas fa-shield-alt"></i> |
| </div> |
| <div class="extension-info"> |
| <h4>AdBlocker</h4> |
| <p>Blocks ads on web pages</p> |
| </div> |
| <div class="extension-toggle active"> |
| <div class="toggle-knob"></div> |
| </div> |
| </div> |
| <div class="extension"> |
| <div class="extension-icon-small"> |
| <i class="fas fa-language"></i> |
| </div> |
| <div class="extension-info"> |
| <h4>Google Translate</h4> |
| <p>Translates web pages</p> |
| </div> |
| <div class="extension-toggle active"> |
| <div class="toggle-knob"></div> |
| </div> |
| </div> |
| <div class="extension"> |
| <div class="extension-icon-small"> |
| <i class="fas fa-lock"></i> |
| </div> |
| <div class="extension-info"> |
| <h4>Password Manager</h4> |
| <p>Securely stores your passwords</p> |
| </div> |
| <div class="extension-toggle active"> |
| <div class="toggle-knob"></div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="download-bar" id="download-bar"> |
| <div class="download-item"> |
| <i class="fas fa-file-pdf download-icon"></i> |
| <div class="download-info"> |
| <h4>document.pdf</h4> |
| <p>Downloading from example.com</p> |
| </div> |
| <div class="download-progress"> |
| <div class="download-progress-bar" id="progress-bar"></div> |
| </div> |
| <div class="download-actions"> |
| <i class="fas fa-pause" id="pause-download"></i> |
| <i class="fas fa-times" id="cancel-download"></i> |
| </div> |
| </div> |
| </div> |
|
|
| <script> |
| |
| const profileBtn = document.getElementById('profile-btn'); |
| const profileMenu = document.getElementById('profile-menu'); |
| const extensionsBtn = document.getElementById('extensions-btn'); |
| const extensionsMenu = document.getElementById('extensions-menu'); |
| const darkModeBtn = document.getElementById('dark-mode-btn'); |
| const addressBar = document.getElementById('address-bar'); |
| const browserIframe = document.getElementById('browser-iframe'); |
| const backBtn = document.getElementById('back-btn'); |
| const forwardBtn = document.getElementById('forward-btn'); |
| const reloadBtn = document.getElementById('reload-btn'); |
| const homeBtn = document.getElementById('home-btn'); |
| const tabBar = document.getElementById('tab-bar'); |
| const newTabBtn = document.querySelector('.new-tab-btn'); |
| const statusText = document.getElementById('status-text'); |
| const pageUrl = document.getElementById('page-url'); |
| const searchSuggestions = document.getElementById('search-suggestions'); |
| const errorPage = document.getElementById('error-page'); |
| const errorUrl = document.getElementById('error-url'); |
| const retryBtn = document.getElementById('retry-btn'); |
| const loadingOverlay = document.getElementById('loading'); |
| const bookmarksBar = document.getElementById('bookmarks-bar'); |
| const bookmarks = document.querySelectorAll('.bookmark'); |
| const downloadBar = document.getElementById('download-bar'); |
| const progressBar = document.getElementById('progress-bar'); |
| const pauseDownloadBtn = document.getElementById('pause-download'); |
| const cancelDownloadBtn = document.getElementById('cancel-download'); |
| const downloadsBtn = document.getElementById('downloads-btn'); |
| const closeBtn = document.querySelector('.window-btn.close'); |
| const minimizeBtn = document.querySelector('.window-btn.minimize'); |
| const maximizeBtn = document.querySelector('.window-btn.maximize'); |
| |
| |
| let tabs = Array.from(document.querySelectorAll('.tab')); |
| let activeTab = document.querySelector('.tab.active'); |
| let tabHistory = { |
| 'https://www.google.com': ['https://www.google.com'], |
| 'https://www.youtube.com': ['https://www.youtube.com'], |
| 'https://www.wikipedia.org': ['https://www.wikipedia.org'] |
| }; |
| let historyIndex = { |
| 'https://www.google.com': 0, |
| 'https://www.youtube.com': 0, |
| 'https://www.wikipedia.org': 0 |
| }; |
| |
| |
| function initTabs() { |
| tabs.forEach(tab => { |
| const url = tab.getAttribute('data-url'); |
| tabHistory[url] = [url]; |
| historyIndex[url] = 0; |
| }); |
| } |
| |
| |
| function addToHistory(url, currentUrl) { |
| if (!tabHistory[currentUrl]) { |
| tabHistory[currentUrl] = []; |
| historyIndex[currentUrl] = 0; |
| } |
| |
| if (tabHistory[currentUrl][historyIndex[currentUrl]] !== url) { |
| |
| tabHistory[currentUrl] = tabHistory[currentUrl].slice(0, historyIndex[currentUrl] + 1); |
| tabHistory[currentUrl].push(url); |
| historyIndex[currentUrl]++; |
| } |
| |
| updateNavButtons(); |
| } |
| |
| |
| function updateNavButtons() { |
| const currentUrl = activeTab.getAttribute('data-url'); |
| const history = tabHistory[currentUrl] || []; |
| const index = historyIndex[currentUrl] || 0; |
| |
| backBtn.classList.toggle('disabled', index <= 0); |
| forwardBtn.classList.toggle('disabled', index >= history.length - 1); |
| } |
| |
| |
| function switchTab(tab) { |
| tabs.forEach(t => t.classList.remove('active')); |
| tab.classList.add('active'); |
| activeTab = tab; |
| |
| const url = tab.getAttribute('data-url'); |
| browserIframe.src = url; |
| addressBar.value = url; |
| pageUrl.textContent = url; |
| |
| updateNavButtons(); |
| |
| |
| showLoading(); |
| |
| |
| errorPage.style.display = 'none'; |
| browserIframe.style.display = 'block'; |
| } |
| |
| |
| function createNewTab(url = 'about:blank', title = 'New Tab') { |
| const newTab = document.createElement('div'); |
| newTab.className = 'tab'; |
| newTab.setAttribute('data-url', url); |
| newTab.innerHTML = ` |
| <i class="fas fa-globe" style="font-size: 12px;"></i> |
| <div class="tab-title">${title}</div> |
| <div class="tab-close"><i class="fas fa-times"></i></div> |
| `; |
| |
| newTab.addEventListener('click', function() { |
| switchTab(this); |
| }); |
| |
| const tabClose = newTab.querySelector('.tab-close'); |
| tabClose.addEventListener('click', (e) => { |
| e.stopPropagation(); |
| closeTab(this); |
| }); |
| |
| |
| newTab.draggable = true; |
| newTab.addEventListener('dragstart', handleDragStart); |
| newTab.addEventListener('dragover', handleDragOver); |
| newTab.addEventListener('drop', handleDrop); |
| newTab.addEventListener('dragend', handleDragEnd); |
| |
| tabBar.insertBefore(newTab, newTabBtn); |
| tabs = Array.from(document.querySelectorAll('.tab')); |
| |
| if (!tabHistory[url]) { |
| tabHistory[url] = [url]; |
| historyIndex[url] = 0; |
| } |
| |
| return newTab; |
| } |
| |
| |
| function closeTab(tab) { |
| if (tabs.length <= 1) { |
| |
| return; |
| } |
| |
| const tabIndex = tabs.indexOf(tab); |
| tab.remove(); |
| tabs = Array.from(document.querySelectorAll('.tab')); |
| |
| |
| if (tab === activeTab) { |
| let newActiveTab = tabIndex > 0 ? tabs[tabIndex - 1] : tabs[0]; |
| switchTab(newActiveTab); |
| } |
| } |
| |
| |
| function handleDragStart(e) { |
| this.classList.add('dragging'); |
| e.dataTransfer.setData('text/plain', this.getAttribute('data-url')); |
| } |
| |
| function handleDragOver(e) { |
| e.preventDefault(); |
| const dragTab = document.querySelector('.tab.dragging'); |
| if (this !== dragTab) { |
| const rect = this.getBoundingClientRect(); |
| const midpoint = rect.left + rect.width / 2; |
| |
| if (e.clientX < midpoint) { |
| tabBar.insertBefore(dragTab, this); |
| } else { |
| tabBar.insertBefore(dragTab, this.nextSibling); |
| } |
| |
| tabs = Array.from(document.querySelectorAll('.tab')); |
| } |
| } |
| |
| function handleDrop(e) { |
| e.preventDefault(); |
| } |
| |
| function handleDragEnd() { |
| this.classList.remove('dragging'); |
| } |
| |
| |
| function navigateTo(url) { |
| |
| showLoading(); |
| |
| |
| errorPage.style.display = 'none'; |
| browserIframe.style.display = 'block'; |
| |
| |
| browserIframe.src = url; |
| addressBar.value = url; |
| pageUrl.textContent = url; |
| |
| |
| activeTab.setAttribute('data-url', url); |
| |
| |
| activeTab.querySelector('.tab-title').textContent = new URL(url).hostname; |
| |
| |
| addToHistory(url, url); |
| } |
| |
| function goBack() { |
| const currentUrl = activeTab.getAttribute('data-url'); |
| if (historyIndex[currentUrl] > 0) { |
| historyIndex[currentUrl]--; |
| const url = tabHistory[currentUrl][historyIndex[currentUrl]]; |
| navigateTo(url); |
| } |
| } |
| |
| function goForward() { |
| const currentUrl = activeTab.getAttribute('data-url'); |
| if (historyIndex[currentUrl] < tabHistory[currentUrl].length - 1) { |
| historyIndex[currentUrl]++; |
| const url = tabHistory[currentUrl][historyIndex[currentUrl]]; |
| navigateTo(url); |
| } |
| } |
| |
| |
| function showLoading() { |
| loadingOverlay.style.display = 'flex'; |
| statusText.textContent = 'Loading...'; |
| } |
| |
| function hideLoading() { |
| loadingOverlay.style.display = 'none'; |
| statusText.textContent = 'Done'; |
| |
| |
| try { |
| const title = browserIframe.contentDocument.title || new URL(browserIframe.src).hostname; |
| activeTab.querySelector('.tab-title').textContent = title; |
| |
| |
| document.querySelector('.window-title').textContent = `${title} - Quantumize Browser`; |
| |
| |
| const securityIcon = activeTab.querySelector('.security-indicator'); |
| if (browserIframe.src.startsWith('https://')) { |
| securityIcon.className = 'fas fa-lock security-indicator secure'; |
| securityIcon.title = 'Secure connection'; |
| } else { |
| securityIcon.className = 'fas fa-unlock security-indicator insecure'; |
| securityIcon.title = 'Not secure'; |
| } |
| } catch (e) { |
| console.log('Could not access iframe content:', e); |
| } |
| } |
| |
| function showError() { |
| loadingOverlay.style.display = 'none'; |
| browserIframe.style.display = 'none'; |
| errorPage.style.display = 'flex'; |
| errorUrl.textContent = browserIframe.src; |
| statusText.textContent = 'Failed to load page'; |
| } |
| |
| |
| function showSuggestions() { |
| const query = addressBar.value.toLowerCase(); |
| const popularSites = [ |
| { name: 'Google', url: 'https://www.google.com', icon: 'fa-search' }, |
| { name: 'YouTube', url: 'https://www.youtube.com', icon: 'fa-youtube' }, |
| { name: 'Wikipedia', url: 'https://www.wikipedia.org', icon: 'fa-wikipedia-w' }, |
| { name: 'GitHub', url: 'https://www.github.com', icon: 'fa-github' }, |
| { name: 'Twitter', url: 'https://www.twitter.com', icon: 'fa-twitter' } |
| ]; |
| |
| if (query.length === 0) { |
| searchSuggestions.style.display = 'none'; |
| return; |
| } |
| |
| const filtered = popularSites.filter(site => |
| site.name.toLowerCase().includes(query) || |
| site.url.toLowerCase().includes(query) |
| ); |
| |
| if (filtered.length > 0) { |
| searchSuggestions.innerHTML = filtered.map(site => ` |
| <div class="suggestion-item" data-url="${site.url}"> |
| <i class="fab ${site.icon}"></i> |
| <span>${site.name} - ${site.url}</span> |
| </div> |
| `).join(''); |
| |
| |
| document.querySelectorAll('.suggestion-item').forEach(item => { |
| item.addEventListener('click', () => { |
| navigateTo(item.getAttribute('data-url')); |
| searchSuggestions.style.display = 'none'; |
| }); |
| }); |
| |
| searchSuggestions.style.display = 'block'; |
| } else { |
| searchSuggestions.style.display = 'none'; |
| } |
| } |
| |
| |
| function simulateDownload() { |
| downloadBar.classList.add('active'); |
| let progress = 0; |
| const interval = setInterval(() => { |
| progress += 1; |
| progressBar.style.width = `${progress}%`; |
| |
| if (progress >= 100) { |
| clearInterval(interval); |
| setTimeout(() => { |
| downloadBar.classList.remove('active'); |
| }, 2000); |
| } |
| }, 30); |
| |
| |
| const downloadsIcon = document.querySelector('.sidebar-icon:nth-child(4)'); |
| downloadsIcon.innerHTML = '<i class="fas fa-download"></i><span class="badge">1</span>'; |
| } |
| |
| |
| profileBtn.addEventListener('click', (e) => { |
| profileMenu.classList.toggle('active'); |
| extensionsMenu.classList.remove('active'); |
| e.stopPropagation(); |
| }); |
| |
| extensionsBtn.addEventListener('click', (e) => { |
| extensionsMenu.classList.toggle('active'); |
| profileMenu.classList.remove('active'); |
| e.stopPropagation(); |
| }); |
| |
| document.addEventListener('click', () => { |
| profileMenu.classList.remove('active'); |
| extensionsMenu.classList.remove('active'); |
| searchSuggestions.style.display = 'none'; |
| }); |
| |
| darkModeBtn.addEventListener('click', () => { |
| document.body.classList.toggle('theme-dark'); |
| }); |
| |
| addressBar.addEventListener('keypress', (e) => { |
| if (e.key === 'Enter') { |
| let url = addressBar.value.trim(); |
| if (!url.startsWith('http://') && !url.startsWith('https://') && !url.startsWith('about:')) { |
| if (url.includes(' ') || url.includes('.')) { |
| |
| url = `https://www.google.com/search?q=${encodeURIComponent(url)}`; |
| } else { |
| |
| url = 'https://' + url; |
| } |
| } |
| |
| navigateTo(url); |
| } |
| }); |
| |
| addressBar.addEventListener('input', showSuggestions); |
| addressBar.addEventListener('focus', showSuggestions); |
| |
| backBtn.addEventListener('click', goBack); |
| forwardBtn.addEventListener('click', goForward); |
| reloadBtn.addEventListener('click', () => { |
| browserIframe.src = browserIframe.src; |
| showLoading(); |
| }); |
| |
| homeBtn.addEventListener('click', () => navigateTo('https://www.google.com')); |
| |
| |
| tabs.forEach(tab => { |
| tab.addEventListener('click', function() { |
| switchTab(this); |
| }); |
| |
| const tabClose = tab.querySelector('.tab-close'); |
| tabClose.addEventListener('click', (e) => { |
| e.stopPropagation(); |
| closeTab(tab); |
| }); |
| |
| |
| tab.draggable = true; |
| tab.addEventListener('dragstart', handleDragStart); |
| tab.addEventListener('dragover', handleDragOver); |
| tab.addEventListener('drop', handleDrop); |
| tab.addEventListener('dragend', handleDragEnd); |
| }); |
| |
| newTabBtn.addEventListener('click', () => { |
| const newTab = createNewTab(); |
| switchTab(newTab); |
| }); |
| |
| |
| bookmarks.forEach(bookmark => { |
| bookmark.addEventListener('click', () => { |
| navigateTo(bookmark.getAttribute('data-url')); |
| }); |
| }); |
| |
| |
| retryBtn.addEventListener('click', () => { |
| navigateTo(browserIframe.src); |
| }); |
| |
| |
| browserIframe.addEventListener('load', hideLoading); |
| browserIframe.addEventListener('error', showError); |
| |
| |
| document.querySelector('.control-btn:nth-child(2)').addEventListener('click', simulateDownload); |
| pauseDownloadBtn.addEventListener('click', () => { |
| alert('Download paused'); |
| }); |
| |
| cancelDownloadBtn.addEventListener('click', () => { |
| downloadBar.classList.remove('active'); |
| }); |
| |
| downloadsBtn.addEventListener('click', () => { |
| alert('Downloads page will open here'); |
| }); |
| |
| |
| closeBtn.addEventListener('click', () => { |
| alert('Closing window (in a real app, this would close the window)'); |
| }); |
| |
| minimizeBtn.addEventListener('click', () => { |
| alert('Minimizing window (in a real app, this would minimize the window)'); |
| }); |
| |
| maximizeBtn.addEventListener('click', () => { |
| alert('Maximizing window (in a real app, this would maximize the window)'); |
| }); |
| |
| |
| initTabs(); |
| switchTab(tabs[0]); |
| </script> |
| </body> |
| </html> |