Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
72d3407
Add EscapeShellArg utility function
ovsky Dec 4, 2025
63ac636
Remove unnecessary const_cast in password decryption
ovsky Dec 4, 2025
fc9845d
Change DRM default to disabled in ResetToDefaults
ovsky Dec 4, 2025
6e7bee2
Use EscapeShellArg for shell command paths
ovsky Dec 4, 2025
faec4d2
Update UI.cpp
ovsky Dec 4, 2025
9711a9e
Add file creation checks in CreateExtensionTemplate
ovsky Dec 4, 2025
d9c655c
Fix file URL detection in OnDOMReady
ovsky Dec 4, 2025
f6cc8c9
Refactor URL checks and remove debug logging
ovsky Dec 4, 2025
946ad53
Revamp downloads page with dark purple theme
ovsky Dec 5, 2025
b71dd5a
Update extensions page to dark purple theme
ovsky Dec 5, 2025
5f4b24c
Update window to create custom extension
ovsky Dec 5, 2025
37fff9f
Add Ctrl+P shortcut for Passwords menu item
ovsky Dec 5, 2025
8df0f3d
Update extensions shortcut to Ctrl+E
ovsky Dec 5, 2025
6a3e3b8
Improve menu shortcut badge styling and layout
ovsky Dec 5, 2025
82e88c6
Call OnRequestNewWindow for 'new-window' menu action
ovsky Dec 5, 2025
5cb478c
Add shortcut for opening new window
ovsky Dec 5, 2025
ba95cbd
Add support for opening new windows and passwords tab
ovsky Dec 5, 2025
2de60b8
Add OnRequestNewWindow handler to UI class
ovsky Dec 5, 2025
e2e93db
Skip dark mode for internal browser pages
ovsky Dec 5, 2025
661d554
Add Dark Theme Excluded Sites settings section
ovsky Dec 5, 2025
3796db5
Add new appearance, privacy, and developer settings
ovsky Dec 5, 2025
ca6b30f
Add dark_theme_excluded_sites to settings load/save
ovsky Dec 5, 2025
2095f97
Add support for dark theme excluded sites
ovsky Dec 5, 2025
df32c20
Add accessibility and appearance settings support
ovsky Dec 5, 2025
4dcc2da
Apply accessibility settings on DOM ready
ovsky Dec 5, 2025
e920caf
Optimize dark mode exclusion for internal pages
ovsky Dec 5, 2025
ed27941
Skip CSS injection for internal browser pages
ovsky Dec 5, 2025
762fa9b
Preload internal and start pages for instant tab creation
ovsky Dec 5, 2025
981086c
Update UI.cpp
ovsky Dec 5, 2025
b48b95b
Update favicons for HTML asset pages
ovsky Dec 5, 2025
0f46e33
Add favicon and logo image assets
ovsky Dec 5, 2025
22c8f7a
Update internal page favicons to base64 SVGs
ovsky Dec 5, 2025
9cd437d
Update favicon color in downloads page
ovsky Dec 5, 2025
8034312
Add UpdateTabFavicon and improve favicon caching
ovsky Dec 5, 2025
bd0587e
Inject favicon fetcher and handle favicon updates
ovsky Dec 5, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
239 changes: 172 additions & 67 deletions assets/downloads.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,32 @@
<meta charset="utf-8" />
<title>Downloads</title>
<link rel="icon" type="image/svg+xml"
href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23222' d='M5 20h14v-2H5v2m7-18l-5 6h3v6h4v-6h3l-5-6z'/%3E%3C/svg%3E" />
href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23c2bce8'%3E%3Cpath d='M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z'/%3E%3C/svg%3E" />
<link rel="stylesheet" type="text/css" href="ui.css">
<style>
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}

:root {
color-scheme: light dark;
/* Dark purple theme matching Passwords & Settings */
--bg-primary: #1e1e2e;
--bg-secondary: #282839;
--bg-tertiary: #32324a;
--bg-hover: #3d3d5c;
--text-primary: #e4e4ef;
--text-secondary: #9999b3;
--text-tertiary: #71718a;
--border-color: #404060;
--accent-color: #7c6aef;
--accent-hover: #9182f3;
--accent-light: rgba(124, 106, 239, 0.15);
--danger-color: #ef6a6a;
--success-color: #6aef8a;
--warning-color: #efcf6a;
--card-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
}

html,
Expand All @@ -23,36 +40,43 @@
}

body {
margin: 0;
font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji";
background: var(--bg, #f6f7f9);
color: var(--fg, #111);
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
background: linear-gradient(135deg, var(--bg-primary) 0%, #252540 100%);
color: var(--text-primary);
line-height: 1.5;
min-height: 100vh;
opacity: 0;
/* Fade in on load (CSS only) */
animation: ul_fade_in 1s ease forwards;
-webkit-animation: ul_fade_in 1s ease forwards;
animation: ul_fade_in 0.3s ease forwards;
-webkit-animation: ul_fade_in 0.3s ease forwards;
}

.container {
max-width: 960px;
margin: 32px auto;
padding: 0 16px 48px;
overflow: visible !important;
max-width: 900px;
margin: 0 auto;
padding: 24px;
}

header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
margin-bottom: 16px;
margin-bottom: 24px;
padding-bottom: 16px;
border-bottom: 1px solid var(--border-color);
}

h1 {
font-size: 20px;
margin: 0;
display: flex;
align-items: center;
gap: 12px;
font-size: 24px;
font-weight: 600;
margin: 0;
}

h1::before {
content: '⬇️';
font-size: 32px;
}

.controls {
Expand All @@ -62,62 +86,127 @@
}

.btn {
padding: 8px 12px;
border-radius: 8px;
border: 1px solid rgba(0, 0, 0, 0.1);
background: white;
color: inherit;
display: inline-flex;
align-items: center;
gap: 6px;
padding: 8px 16px;
border: none;
border-radius: 6px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
background: var(--bg-tertiary);
color: var(--text-primary);
border: 1px solid var(--border-color);
}

.btn:hover {
background: #f2f2f2;
background: var(--bg-hover);
border-color: var(--accent-color);
transform: translateY(-1px);
}

.btn-primary {
background: var(--accent-color);
color: white;
border-color: var(--accent-color);
}

.btn-primary:hover {
background: var(--accent-hover);
box-shadow: 0 4px 12px rgba(124, 106, 239, 0.4);
}

.btn-danger {
background: var(--danger-color);
color: white;
border-color: var(--danger-color);
}

.btn-danger:hover {
background: #f37878;
box-shadow: 0 4px 12px rgba(239, 106, 106, 0.4);
}

.list {
display: flex;
flex-direction: column;
gap: 12px;
gap: 16px;
}

.item {
padding: 14px 16px;
border-radius: 10px;
background: rgba(255, 255, 255, 0.85);
border: 1px solid rgba(0, 0, 0, 0.07);
box-shadow: 0 6px 18px rgba(15, 23, 42, 0.08);
padding: 16px 20px;
border-radius: 12px;
background: var(--bg-secondary);
border: 1px solid var(--border-color);
box-shadow: var(--card-shadow);
transition: all 0.2s;
}

.item:hover {
border-color: var(--accent-color);
transform: translateY(-2px);
box-shadow: 0 4px 16px rgba(124, 106, 239, 0.2);
}

.item h2 {
margin: 0 0 8px 0;
margin: 0 0 12px 0;
font-size: 16px;
font-weight: 600;
display: flex;
align-items: center;
gap: 8px;
color: var(--text-primary);
word-break: break-word;
}

.meta {
font-size: 12px;
color: #666;
font-size: 13px;
color: var(--text-secondary);
display: flex;
flex-wrap: wrap;
gap: 12px;
margin-bottom: 8px;
gap: 16px;
margin-bottom: 12px;
}

.meta span {
display: flex;
align-items: center;
gap: 4px;
}

.status {
font-weight: 600;
text-transform: capitalize;
padding: 4px 10px;
border-radius: 6px;
font-size: 12px;
}

.status.in-progress {
background: var(--accent-light);
color: var(--accent-color);
}

.status.completed {
background: rgba(106, 239, 138, 0.15);
color: var(--success-color);
}

.status.failed,
.status.cancelled {
background: rgba(239, 106, 106, 0.15);
color: var(--danger-color);
}

.progress {
position: relative;
height: 6px;
height: 8px;
border-radius: 999px;
background: rgba(0, 0, 0, 0.08);
background: var(--bg-tertiary);
overflow: hidden;
margin: 10px 0;
margin: 12px 0;
}

.progress span {
Expand All @@ -126,54 +215,67 @@
left: 0;
bottom: 0;
width: 0%;
background: linear-gradient(90deg, #6366f1, #38bdf8);
background: linear-gradient(90deg, var(--accent-color), var(--accent-hover));
transition: width 0.3s ease;
}

.actions {
display: flex;
gap: 10px;
gap: 8px;
flex-wrap: wrap;
margin-top: 12px;
}

.actions .btn {
font-size: 12px;
font-size: 13px;
padding: 6px 14px;
}

.empty {
text-align: center;
padding: 48px 10px;
color: #666;
padding: 80px 20px;
color: var(--text-secondary);
}

@media (prefers-color-scheme: dark) {
body {
background: #121212;
color: #e5e7eb;
}
.empty::before {
content: '⬇️';
font-size: 64px;
display: block;
margin-bottom: 16px;
opacity: 0.5;
}

.item {
background: rgba(18, 18, 18, 0.7);
border-color: rgba(255, 255, 255, 0.05);
}
.empty h2 {
font-size: 20px;
margin-bottom: 8px;
color: var(--text-primary);
}

.btn {
background: rgba(255, 255, 255, 0.08);
color: inherit;
border-color: rgba(255, 255, 255, 0.1);
}
.empty p {
font-size: 14px;
color: var(--text-secondary);
}

.btn:hover {
background: rgba(255, 255, 255, 0.12);
}
/* Scrollbar styling */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}

.meta {
color: #9ca3af;
}
::-webkit-scrollbar-track {
background: var(--bg-secondary);
border-radius: 4px;
}

.empty {
color: #9ca3af;
}
::-webkit-scrollbar-thumb {
background: rgba(124, 106, 239, 0.3);
border-radius: 4px;
}

::-webkit-scrollbar-thumb:hover {
background: rgba(124, 106, 239, 0.5);
}

@keyframes ul_fade_in { from { opacity: 0; } to { opacity: 1; } }
@-webkit-keyframes ul_fade_in { from { opacity: 0; } to { opacity: 1; } }
</style>
Expand All @@ -188,7 +290,10 @@ <h1>Downloads</h1>
</div>
</header>
<section id="content">
<div id="empty" class="empty">No downloads yet.</div>
<div id="empty" class="empty" style="display: none;">
<h2>No Downloads Yet</h2>
<p>Your downloads will appear here</p>
</div>
<div id="list" class="list"></div>
</section>
</div>
Expand Down Expand Up @@ -237,7 +342,7 @@ <h1>Downloads</h1>
const meta = document.createElement('div');
meta.className = 'meta';
const status = document.createElement('span');
status.className = 'status';
status.className = 'status ' + (item.status || 'pending').toLowerCase().replace(/[^a-z-]/g, '');
status.textContent = item.status || 'pending';
meta.appendChild(status);

Expand Down
Loading
Loading