Compare commits

..

1 Commits

Author SHA1 Message Date
b8863ebc89 Updated UI and fixed YT 2026-08-14 13:01:44 -04:00
10 changed files with 546 additions and 342 deletions

BIN
ico/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
ico/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

59
main.js
View File

@@ -1,15 +1,20 @@
const { app, BrowserWindow, session } = require('electron'); const { app, BrowserWindow, session, ipcMain } = require('electron');
const path = require('node:path'); const path = require('node:path');
// Use require for consistency
const { ElectronBlocker } = require('@ghostery/adblocker-electron'); const { ElectronBlocker } = require('@ghostery/adblocker-electron');
const fetch = require('cross-fetch'); const fetch = require('cross-fetch');
const androidUA = 'Mozilla/5.0 (Linux; Android 14; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.164 Mobile Safari/537.36'; const androidUA = 'Mozilla/5.0 (Linux; Android 14; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.164 Mobile Safari/537.36';
async function setupBlocker() { let historyWindow = null;
const blocker = await ElectronBlocker.fromPrebuiltAdsAndTracking(fetch);
blocker.enableBlockingInSession(session.defaultSession); async function setupBlocker(sess) {
console.log('Adblocker enabled'); try {
const blocker = await ElectronBlocker.fromPrebuiltAdsAndTracking(fetch);
blocker.enableBlockingInSession(sess);
console.log('Adblocker enabled');
} catch (err) {
console.error('Failed to load adblocker:', err);
}
} }
const createWindow = () => { const createWindow = () => {
@@ -20,23 +25,51 @@ const createWindow = () => {
preload: path.join(__dirname, 'preload.js'), preload: path.join(__dirname, 'preload.js'),
contextIsolation: false, contextIsolation: false,
nodeIntegration: true, nodeIntegration: true,
nodeIntegrationInSubFrames: true,
webSecurity: false, webSecurity: false,
sandbox: false,
webviewTag: true, webviewTag: true,
} }
}); });
win.webContents.session.setUserAgent(androidUA);
win.maximize(); win.maximize();
win.loadFile('src/index.html'); win.loadFile('src/index.html');
};
function createHistoryWindow() {
// Focus if already opened
if (historyWindow) {
historyWindow.focus();
return;
}
historyWindow = new BrowserWindow({
width: 500,
height: 650,
title: 'Browsing History',
autoHideMenuBar: true,
webPreferences: {
contextIsolation: false,
nodeIntegration: true,
}
});
historyWindow.loadFile('src/history.html');
historyWindow.on('closed', () => {
historyWindow = null;
});
} }
app.whenReady().then(async () => { // IPC Listener to handle popup creation
await setupBlocker(); ipcMain.on('open-history-window', () => {
createHistoryWindow();
});
app.whenReady().then(async () => {
const sess = session.defaultSession; const sess = session.defaultSession;
sess.setUserAgent(androidUA);
await setupBlocker(sess);
sess.webRequest.onBeforeSendHeaders((details, callback) => { sess.webRequest.onBeforeSendHeaders((details, callback) => {
details.requestHeaders['User-Agent'] = androidUA; details.requestHeaders['User-Agent'] = androidUA;
details.requestHeaders['Sec-CH-UA-Mobile'] = '?1'; details.requestHeaders['Sec-CH-UA-Mobile'] = '?1';
@@ -46,8 +79,8 @@ app.whenReady().then(async () => {
sess.webRequest.onHeadersReceived((details, callback) => { sess.webRequest.onHeadersReceived((details, callback) => {
const responseHeaders = { ...details.responseHeaders }; const responseHeaders = { ...details.responseHeaders };
const keys = Object.keys(responseHeaders);
keys.forEach(key => { Object.keys(responseHeaders).forEach((key) => {
if (['x-frame-options', 'content-security-policy'].includes(key.toLowerCase())) { if (['x-frame-options', 'content-security-policy'].includes(key.toLowerCase())) {
delete responseHeaders[key]; delete responseHeaders[key];
} }

273
package-lock.json generated
View File

@@ -15,7 +15,7 @@
"devDependencies": { "devDependencies": {
"@types/electron": "^1.4.38", "@types/electron": "^1.4.38",
"@types/node": "^25.6.0", "@types/node": "^25.6.0",
"electron": "^41.3.0", "electron": "^41.10.5",
"electron-builder": "^26.8.1" "electron-builder": "^26.8.1"
} }
}, },
@@ -37,6 +37,15 @@
"url": "https://opencollective.com/webpack" "url": "https://opencollective.com/webpack"
} }
}, },
"node_modules/@electron-internal/extract-zip": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@electron-internal/extract-zip/-/extract-zip-1.0.5.tgz",
"integrity": "sha512-+bqFCP98pLI0Tt0XQo1TmlXtwjWchISndDOxCkEcIuUgXWpBnLyRI+2DU+mesvnMMX6L1XDqYNA0lXNDHd/yiA==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=22.12.0"
}
},
"node_modules/@electron/asar": { "node_modules/@electron/asar": {
"version": "3.4.1", "version": "3.4.1",
"resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz",
@@ -141,24 +150,45 @@
} }
}, },
"node_modules/@electron/get": { "node_modules/@electron/get": {
"version": "2.0.3", "version": "5.1.0",
"resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", "resolved": "https://registry.npmjs.org/@electron/get/-/get-5.1.0.tgz",
"integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", "integrity": "sha512-3kSBtG8ObcTVfXanm5vVJ6UnBLEVmVsRk1M+vGqCuMBV+XLCbJYuWQful+yIy0GQDsSlK0kHEriEHn7SPk4EnA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"debug": "^4.1.1", "debug": "^4.1.1",
"env-paths": "^2.2.0", "env-paths": "^3.0.0",
"fs-extra": "^8.1.0", "graceful-fs": "^4.2.11",
"got": "^11.8.5",
"progress": "^2.0.3", "progress": "^2.0.3",
"semver": "^6.2.0", "semver": "^7.6.3",
"sumchecker": "^3.0.1" "sumchecker": "^3.0.1"
}, },
"engines": { "engines": {
"node": ">=12" "node": ">=22.12.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"global-agent": "^3.0.0" "undici": "^7.24.4"
}
},
"node_modules/@electron/get/node_modules/env-paths": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz",
"integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==",
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@electron/get/node_modules/undici": {
"version": "7.29.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz",
"integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==",
"license": "MIT",
"optional": true,
"engines": {
"node": ">=20.18.1"
} }
}, },
"node_modules/@electron/notarize": { "node_modules/@electron/notarize": {
@@ -668,6 +698,7 @@
"version": "4.6.0", "version": "4.6.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
"integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=10" "node": ">=10"
@@ -680,6 +711,7 @@
"version": "4.0.6", "version": "4.0.6",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
"integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"defer-to-connect": "^2.0.0" "defer-to-connect": "^2.0.0"
@@ -692,6 +724,7 @@
"version": "6.0.3", "version": "6.0.3",
"resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
"integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/http-cache-semantics": "*", "@types/http-cache-semantics": "*",
@@ -734,12 +767,14 @@
"version": "4.2.0", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
"integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/keyv": { "node_modules/@types/keyv": {
"version": "3.1.4", "version": "3.1.4",
"resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
"integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/node": "*" "@types/node": "*"
@@ -756,6 +791,7 @@
"version": "25.6.0", "version": "25.6.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz",
"integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~7.19.0" "undici-types": "~7.19.0"
@@ -777,6 +813,7 @@
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz",
"integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/node": "*" "@types/node": "*"
@@ -790,16 +827,6 @@
"license": "MIT", "license": "MIT",
"optional": true "optional": true
}, },
"node_modules/@types/yauzl": {
"version": "2.10.3",
"resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
"integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
"license": "MIT",
"optional": true,
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@xmldom/xmldom": { "node_modules/@xmldom/xmldom": {
"version": "0.8.13", "version": "0.8.13",
"resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz",
@@ -1162,6 +1189,7 @@
"resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
"integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==",
"deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true "optional": true
}, },
@@ -1204,15 +1232,6 @@
"ieee754": "^1.1.13" "ieee754": "^1.1.13"
} }
}, },
"node_modules/buffer-crc32": {
"version": "0.2.13",
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
"integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
"license": "MIT",
"engines": {
"node": "*"
}
},
"node_modules/buffer-from": { "node_modules/buffer-from": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -1301,6 +1320,7 @@
"version": "5.0.4", "version": "5.0.4",
"resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
"integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=10.6.0" "node": ">=10.6.0"
@@ -1310,6 +1330,7 @@
"version": "7.0.4", "version": "7.0.4",
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
"integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"clone-response": "^1.0.2", "clone-response": "^1.0.2",
@@ -1425,6 +1446,7 @@
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
"integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"mimic-response": "^1.0.0" "mimic-response": "^1.0.0"
@@ -1589,6 +1611,7 @@
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
"integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"mimic-response": "^3.1.0" "mimic-response": "^3.1.0"
@@ -1604,6 +1627,7 @@
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
"integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=10" "node": ">=10"
@@ -1616,6 +1640,7 @@
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
"integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=10" "node": ">=10"
@@ -1625,6 +1650,7 @@
"version": "1.1.4", "version": "1.1.4",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
@@ -1643,6 +1669,7 @@
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
"integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
@@ -1671,6 +1698,7 @@
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
"integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true "optional": true
}, },
@@ -1859,21 +1887,21 @@
} }
}, },
"node_modules/electron": { "node_modules/electron": {
"version": "41.3.0", "version": "41.10.5",
"resolved": "https://registry.npmjs.org/electron/-/electron-41.3.0.tgz", "resolved": "https://registry.npmjs.org/electron/-/electron-41.10.5.tgz",
"integrity": "sha512-2Q5aeocmFdeheZGDUTrAvSR3t+n0c3d104AJWWEnt7syJU0tE4VdibMYaPtQ47QuXSoUf0/xSsfUUvu/uSXIfg==", "integrity": "sha512-grSJOhLddanWX1UfE8B4xA2kOOduUCfpYoOQ2D4zEYte8lSQtrd1HYbV4xErsZmm+V+1Q3yzCQLBsCxEIiw/QQ==",
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron/get": "^2.0.0", "@electron-internal/extract-zip": "^1.0.1",
"@types/node": "^24.9.0", "@electron/get": "^5.0.0",
"extract-zip": "^2.0.1" "@types/node": "^24.9.0"
}, },
"bin": { "bin": {
"electron": "cli.js" "electron": "cli.js"
}, },
"engines": { "engines": {
"node": ">= 12.20.55" "node": ">= 22.12.0"
} }
}, },
"node_modules/electron-builder": { "node_modules/electron-builder": {
@@ -2072,6 +2100,7 @@
"version": "1.4.5", "version": "1.4.5",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
"integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"once": "^1.4.0" "once": "^1.4.0"
@@ -2081,6 +2110,7 @@
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
"integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=6" "node": ">=6"
@@ -2097,7 +2127,7 @@
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"devOptional": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
@@ -2107,7 +2137,7 @@
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"devOptional": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
@@ -2146,6 +2176,7 @@
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
"integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true "optional": true
}, },
@@ -2163,6 +2194,7 @@
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"engines": { "engines": {
@@ -2179,26 +2211,6 @@
"dev": true, "dev": true,
"license": "Apache-2.0" "license": "Apache-2.0"
}, },
"node_modules/extract-zip": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
"integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
"license": "BSD-2-Clause",
"dependencies": {
"debug": "^4.1.1",
"get-stream": "^5.1.0",
"yauzl": "^2.10.0"
},
"bin": {
"extract-zip": "cli.js"
},
"engines": {
"node": ">= 10.17.0"
},
"optionalDependencies": {
"@types/yauzl": "^2.9.1"
}
},
"node_modules/extsprintf": { "node_modules/extsprintf": {
"version": "1.4.1", "version": "1.4.1",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz",
@@ -2224,15 +2236,6 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/fd-slicer": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
"integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
"license": "MIT",
"dependencies": {
"pend": "~1.2.0"
}
},
"node_modules/fdir": { "node_modules/fdir": {
"version": "6.5.0", "version": "6.5.0",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
@@ -2308,20 +2311,6 @@
"node": ">= 6" "node": ">= 6"
} }
}, },
"node_modules/fs-extra": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
},
"engines": {
"node": ">=6 <7 || >=8"
}
},
"node_modules/fs.realpath": { "node_modules/fs.realpath": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -2392,6 +2381,7 @@
"version": "5.2.0", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"pump": "^3.0.0" "pump": "^3.0.0"
@@ -2460,6 +2450,7 @@
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz",
"integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==",
"dev": true,
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
@@ -2474,23 +2465,11 @@
"node": ">=10.0" "node": ">=10.0"
} }
}, },
"node_modules/global-agent/node_modules/semver": {
"version": "7.7.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"optional": true,
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/globalthis": { "node_modules/globalthis": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
"integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
@@ -2508,7 +2487,7 @@
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"devOptional": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
@@ -2521,6 +2500,7 @@
"version": "11.8.6", "version": "11.8.6",
"resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
"integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@sindresorhus/is": "^4.0.0", "@sindresorhus/is": "^4.0.0",
@@ -2562,6 +2542,7 @@
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
@@ -2630,6 +2611,7 @@
"version": "4.2.0", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
"integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
"dev": true,
"license": "BSD-2-Clause" "license": "BSD-2-Clause"
}, },
"node_modules/http-proxy-agent": { "node_modules/http-proxy-agent": {
@@ -2650,6 +2632,7 @@
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
"integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"quick-lru": "^5.1.1", "quick-lru": "^5.1.1",
@@ -2823,6 +2806,7 @@
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
"integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/json-schema-traverse": { "node_modules/json-schema-traverse": {
@@ -2836,6 +2820,7 @@
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
"dev": true,
"license": "ISC", "license": "ISC",
"optional": true "optional": true
}, },
@@ -2856,6 +2841,7 @@
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
"dev": true,
"license": "MIT", "license": "MIT",
"optionalDependencies": { "optionalDependencies": {
"graceful-fs": "^4.1.6" "graceful-fs": "^4.1.6"
@@ -2865,6 +2851,7 @@
"version": "4.5.4", "version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
"integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"json-buffer": "3.0.1" "json-buffer": "3.0.1"
@@ -2888,6 +2875,7 @@
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=8" "node": ">=8"
@@ -2910,6 +2898,7 @@
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
"integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
@@ -2969,6 +2958,7 @@
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
"integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=4" "node": ">=4"
@@ -3056,19 +3046,6 @@
"node": ">=22.12.0" "node": ">=22.12.0"
} }
}, },
"node_modules/node-abi/node_modules/semver": {
"version": "7.7.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/node-addon-api": { "node_modules/node-addon-api": {
"version": "1.7.2", "version": "1.7.2",
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz",
@@ -3087,19 +3064,6 @@
"semver": "^7.3.5" "semver": "^7.3.5"
} }
}, },
"node_modules/node-api-version/node_modules/semver": {
"version": "7.7.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/node-fetch": { "node_modules/node-fetch": {
"version": "2.7.0", "version": "2.7.0",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
@@ -3155,19 +3119,6 @@
"node": ">=20" "node": ">=20"
} }
}, },
"node_modules/node-gyp/node_modules/semver": {
"version": "7.7.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/node-gyp/node_modules/which": { "node_modules/node-gyp/node_modules/which": {
"version": "6.0.1", "version": "6.0.1",
"resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz",
@@ -3204,6 +3155,7 @@
"version": "6.1.0", "version": "6.1.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
"integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=10" "node": ">=10"
@@ -3216,6 +3168,7 @@
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"engines": { "engines": {
@@ -3226,6 +3179,7 @@
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"wrappy": "1" "wrappy": "1"
@@ -3235,6 +3189,7 @@
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
"integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=8" "node": ">=8"
@@ -3291,12 +3246,6 @@
"url": "https://github.com/sponsors/jet2jet" "url": "https://github.com/sponsors/jet2jet"
} }
}, },
"node_modules/pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
"integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
"license": "MIT"
},
"node_modules/picocolors": { "node_modules/picocolors": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -3411,6 +3360,7 @@
"version": "3.0.4", "version": "3.0.4",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
"integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"end-of-stream": "^1.1.0", "end-of-stream": "^1.1.0",
@@ -3431,6 +3381,7 @@
"version": "5.1.1", "version": "5.1.1",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=10" "node": ">=10"
@@ -3484,12 +3435,14 @@
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
"integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/responselike": { "node_modules/responselike": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
"integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"lowercase-keys": "^2.0.0" "lowercase-keys": "^2.0.0"
@@ -3527,6 +3480,7 @@
"version": "2.15.4", "version": "2.15.4",
"resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
"integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
"dev": true,
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
@@ -3569,18 +3523,22 @@
} }
}, },
"node_modules/semver": { "node_modules/semver": {
"version": "6.3.1", "version": "7.8.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
"license": "ISC", "license": "ISC",
"bin": { "bin": {
"semver": "bin/semver.js" "semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
} }
}, },
"node_modules/semver-compare": { "node_modules/semver-compare": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
"integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true "optional": true
}, },
@@ -3588,6 +3546,7 @@
"version": "7.0.1", "version": "7.0.1",
"resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
"integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
@@ -3643,19 +3602,6 @@
"node": ">=10" "node": ">=10"
} }
}, },
"node_modules/simple-update-notifier/node_modules/semver": {
"version": "7.7.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/slice-ansi": { "node_modules/slice-ansi": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
@@ -3709,6 +3655,7 @@
"version": "1.1.3", "version": "1.1.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
"integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
"dev": true,
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"optional": true "optional": true
}, },
@@ -3958,6 +3905,7 @@
"version": "0.13.1", "version": "0.13.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
"integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
"dev": true,
"license": "(MIT OR CC0-1.0)", "license": "(MIT OR CC0-1.0)",
"optional": true, "optional": true,
"engines": { "engines": {
@@ -3981,12 +3929,14 @@
"version": "7.19.2", "version": "7.19.2",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz",
"integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/universalify": { "node_modules/universalify": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">= 4.0.0" "node": ">= 4.0.0"
@@ -4079,6 +4029,7 @@
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true,
"license": "ISC" "license": "ISC"
}, },
"node_modules/xmlbuilder": { "node_modules/xmlbuilder": {
@@ -4137,16 +4088,6 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/yauzl": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
"integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
"license": "MIT",
"dependencies": {
"buffer-crc32": "~0.2.3",
"fd-slicer": "~1.1.0"
}
},
"node_modules/yocto-queue": { "node_modules/yocto-queue": {
"version": "0.1.0", "version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",

View File

@@ -1,32 +1,47 @@
{ {
"name": "risaweb", "name": "risaweb",
"version": "0.0.1", "version": "0.0.1",
"description": "", "description": "A cross-platform web browser",
"license": "ISC", "license": "ISC",
"author": "flamerxd", "author": "flamerxd",
"type": "commonjs", "type": "commonjs",
"main": "main.js", "main": "main.js",
"scripts": { "scripts": {
"start": "electron .", "start": "electron .",
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1",
}, "dist": "electron-builder"
"devDependencies": {
"@types/node": "^22.0.0",
"electron": "^31.0.0",
"electron-builder": "^24.13.3"
}, },
"dependencies": { "dependencies": {
"@ghostery/adblocker-electron": "^2.14.4", "@ghostery/adblocker-electron": "^2.14.4",
"cross-fetch": "^4.1.0" "cross-fetch": "^4.1.0"
}, },
"devDependencies": {
"@types/electron": "^1.4.38",
"@types/node": "^25.6.0",
"electron": "^41.10.5",
"electron-builder": "^26.8.1"
},
"build": { "build": {
"appId": "com.risaweb.app",
"productName": "RisaWeb",
"win": {
"target": [
"nsis",
"zip"
],
"icon": "ico/icon.ico"
},
"linux": { "linux": {
"target": [ "target": [
"AppImage", "AppImage",
"deb", "deb",
"tar.gz" "tar.gz"
], ],
"category": "Utility" "category": "Utility",
"icon": "ico/icon.png"
},
"directories": {
"output": "dist"
} }
} }
} }

92
src/history.html Normal file
View File

@@ -0,0 +1,92 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Browsing History</title>
<style>
body {
margin: 0;
padding: 16px;
font-family: 'Noto Sans', 'Segoe UI', sans-serif;
background-color: #2a2e32;
color: #fcfcfc;
user-select: none;
}
.header {
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #4d5053;
padding-bottom: 10px;
margin-bottom: 15px;
}
h2 { margin: 0; font-size: 16px; color: #eff0f1; }
.btn-clear {
background-color: #232629;
color: #fcfcfc;
border: 1px solid #4d5053;
border-radius: 4px;
padding: 6px 12px;
font-size: 12px;
cursor: pointer;
transition: background 0.15s ease;
}
.btn-clear:hover {
background-color: #da4453;
border-color: #da4453;
}
ul { list-style: none; padding: 0; margin: 0; }
.history-item {
background-color: #232629;
border: 1px solid #31363b;
border-radius: 4px;
padding: 10px 12px;
margin-bottom: 8px;
word-break: break-all;
}
.history-item:hover {
border-color: #3daee9;
}
.history-title { font-size: 13px; font-weight: bold; color: #eff0f1; margin-bottom: 3px; }
.history-url { font-size: 11px; color: #8a8d8f; }
</style>
</head>
<body>
<div class="header">
<h2>History</h2>
<button class="btn-clear" id="clearBtn">Clear History</button>
</div>
<ul id="historyList"></ul>
<script>
const historyList = document.getElementById('historyList');
function renderHistory() {
const history = JSON.parse(localStorage.getItem('browser-history')) || [];
historyList.innerHTML = '';
if (history.length === 0) {
historyList.innerHTML = '<li style="color:#8a8d8f; text-align:center; padding-top:20px;">No history recorded</li>';
return;
}
history.slice().reverse().forEach(item => {
const li = document.createElement('li');
li.className = 'history-item';
li.innerHTML = `
<div class="history-title">${item.title || 'Untitled'}</div>
<div class="history-url">${item.url}</div>
`;
historyList.appendChild(li);
});
}
document.getElementById('clearBtn').addEventListener('click', () => {
localStorage.removeItem('browser-history');
renderHistory();
});
renderHistory();
</script>
</body>
</html>

View File

@@ -4,35 +4,55 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Risa Web</title> <title>Risa Web</title>
<link rel="stylesheet" href="./styles.css"> <link rel="stylesheet" href="./styles.css">
</head> </head>
<body> <body>
<webview src="https://start.duckduckgo.com/" width="100%" height="100%" id="webpage"></webview> <div id="historyView" style="display: none;">
<div class="history-header">
<h2>Browsing History</h2>
<div>
<button id="clearHistoryBtn" class="badgebutton">Clear</button>
<button id="closeHistoryBtn" class="badgebutton">✕</button>
</div>
</div>
<ul id="historyList"></ul>
</div>
<webview
src="https://start.duckduckgo.com/"
id="webpage"
partition="persist:default"
allowpopups>
</webview>
<footer> <footer>
<button class="badgebutton" id="arrowbtn1" onclick="back()"> <button class="badgebutton" id="arrowbtn1" onclick="back()">
<img src="img/arrow_back_ios_48dp_E3E3E3_FILL0_wght700_GRAD0_opsz48.svg" alt="Icon" style="vertical-align: middle;" id="searchicon"> <img src="img/arrow_back_ios_48dp_E3E3E3_FILL0_wght700_GRAD0_opsz48.svg" alt="Back" id="searchicon">
</button> </button>
<button class="badgebutton" id="arrowbtn2" onclick="forward()"> <button class="badgebutton" id="arrowbtn2" onclick="forward()">
<img src="img/arrow_forward_ios_48dp_E3E3E3_FILL0_wght700_GRAD0_opsz48.svg" alt="Icon" style="vertical-align: middle;" id="searchicon"> <img src="img/arrow_forward_ios_48dp_E3E3E3_FILL0_wght700_GRAD0_opsz48.svg" alt="Forward" id="searchicon">
</button> </button>
<input id="search">
<input id="search" placeholder="Search or type URL...">
<button type="button" onclick="search()" class="badgebutton" id="searchbutton"> <button type="button" onclick="search()" class="badgebutton" id="searchbutton">
<img src="img/search.png" alt="Icon" style="vertical-align: middle;" id="searchicon"> <img src="img/search.png" alt="Search" id="searchicon">
</button> </button>
<div class="dropdown"> <div class="dropdown">
<button class="dropbtn"> <button class="dropbtn">
<img src="img/menu.svg" alt="Icon" style="vertical-align: middle;" id="searchicon"> <img src="img/menu.svg" alt="Menu" id="searchicon">
</button> </button>
<div class="dropdown-content"> <div class="dropdown-content">
<a onclick="homebtn()">Home</a> <a onclick="homebtn()">Home</a>
<a onclick="historybtn()">History</a>
</div> </div>
</div> </div>
</footer> </footer>
<script src="js/search.js">
</script> <script src="js/search.js"></script>
<script src="js/dropdown.js"></script> <script src="js/dropdown.js"></script>
<script src="js/history.js"></script> <script src="js/history.js"></script>
</body> </body>

View File

@@ -1,64 +1,80 @@
const { ipcRenderer } = require('electron');
const frame = document.getElementById("webpage"); const frame = document.getElementById("webpage");
function back() {
if (frame && typeof frame.canGoBack === 'function' && frame.canGoBack()) { // 1. Function to save navigation entries to localStorage
frame.goBack(); function saveToHistory(url, title = '') {
} else { // Ignore empty strings, file protocol URLs, or internal data schemes
console.log("Cannot go back: No history"); if (!url || url.startsWith('file://') || url.startsWith('data:')) return;
let history = JSON.parse(localStorage.getItem('browser-history')) || [];
// Update title if it's a consecutive repeat URL, otherwise push new entry
if (history.length > 0 && history[history.length - 1].url === url) {
if (title) {
history[history.length - 1].title = title;
} }
} else {
history.push({
url: url,
title: title || url,
timestamp: Date.now()
});
}
localStorage.setItem('browser-history', JSON.stringify(history));
} }
function forward() { // 2. Navigation Control Functions (Back & Forward)
if (frame && typeof frame.canGoForward === 'function' && frame.canGoForward()) { window.back = function() {
frame.goForward(); if (frame && typeof frame.canGoBack === 'function' && frame.canGoBack()) {
} else { frame.goBack();
console.log("Cannot go forward: No history"); }
} };
}
frame.addEventListener('did-navigate', updateButtonStates); window.forward = function() {
frame.addEventListener('did-navigate-in-page', updateButtonStates); if (frame && typeof frame.canGoForward === 'function' && frame.canGoForward()) {
frame.goForward();
}
};
function updateButtonStates() { function updateButtonStates() {
const backBtn = document.getElementById('arrowbtn1'); const backBtn = document.getElementById('arrowbtn1');
const forwardBtn = document.getElementById('arrowbtn2'); const forwardBtn = document.getElementById('arrowbtn2');
if (backBtn && forwardBtn && frame) {
backBtn.style.opacity = frame.canGoBack() ? "1" : "0.3"; backBtn.style.opacity = frame.canGoBack() ? "1" : "0.3";
forwardBtn.style.opacity = frame.canGoForward() ? "1" : "0.3"; forwardBtn.style.opacity = frame.canGoForward() ? "1" : "0.3";
}
let historyStack = [];
window.addEventListener('DOMContentLoaded', () => {
if (!frame) {
console.error("Webview element not found!");
return;
}
console.log("Webview found, attaching listeners...");
frame.addEventListener('did-start-navigation', (event) => {
console.log("Navigating to: " + event.url);
saveToHistory(event.url);
});
});
function saveToHistory(url) {
let history = JSON.parse(localStorage.getItem('browser-history')) || [];
history.push(url);
localStorage.setItem('browser-history', JSON.stringify(history));
}
frame.addEventListener('did-navigate', (event) => {
const newUrl = event.url;
if (historyStack[historyStack.length - 1] !== newUrl) {
historyStack.push(newUrl);
localStorage.setItem('browser-history', JSON.stringify(historyStack));
console.log("History Updated:", historyStack);
} }
}); }
// To view your history later: // 3. Open History Pop-Up Window via IPC
function getHistory() { window.historybtn = function() {
const savedHistory = localStorage.getItem('browser-history'); ipcRenderer.send('open-history-window');
return savedHistory ? JSON.parse(savedHistory) : []; };
// 4. Attach Webview Event Listeners
function initHistoryTracking() {
if (!frame) return;
frame.addEventListener('did-navigate', (event) => {
updateButtonStates();
saveToHistory(event.url);
});
frame.addEventListener('did-navigate-in-page', (event) => {
updateButtonStates();
saveToHistory(event.url);
});
frame.addEventListener('page-title-updated', (event) => {
saveToHistory(frame.getURL(), event.title);
});
}
// 5. Initialize tracking once DOM is ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initHistoryTracking);
} else {
initHistoryTracking();
} }

View File

@@ -3,6 +3,8 @@ const frame = document.getElementById("webpage");
function search() { function search() {
let input = sb.value.trim(); let input = sb.value.trim();
if (!input) return;
let urladdress; let urladdress;
const isUrl = input.includes('.') && !input.includes(' '); const isUrl = input.includes('.') && !input.includes(' ');
@@ -17,43 +19,26 @@ function search() {
} }
frame.src = urladdress; frame.src = urladdress;
console.log("Navigating to: " + urladdress);
} }
// Enter key in address bar
sb.addEventListener("keypress", function (event) { sb.addEventListener("keypress", function (event) {
if (event.key === "Enter") { if (event.key === "Enter") {
search(); search();
} }
}); });
function homebtn(){ // Search button click
frame.src = "https://start.duckduckgo.com/"; const searchBtn = document.getElementById("searchbutton");
if (searchBtn) {
searchBtn.addEventListener("click", search);
} }
// Sync address bar when webview navigates
frame.addEventListener('did-navigate', (event) => {
sb.value = event.url;
});
function back() { frame.addEventListener('did-navigate-in-page', (event) => {
if (frame && typeof frame.canGoBack === 'function' && frame.canGoBack()) { sb.value = event.url;
frame.goBack(); });
} else {
console.log("Cannot go back: No history");
}
}
function forward() {
if (frame && typeof frame.canGoForward === 'function' && frame.canGoForward()) {
frame.goForward();
} else {
console.log("Cannot go forward: No history");
}
}
frame.addEventListener('did-navigate', updateButtonStates);
frame.addEventListener('did-navigate-in-page', updateButtonStates);
function updateButtonStates() {
const backBtn = document.getElementById('arrowbtn1');
const forwardBtn = document.getElementById('arrowbtn2');
// Change opacity or disable if navigation isn't possible
backBtn.style.opacity = frame.canGoBack() ? "1" : "0.3";
forwardBtn.style.opacity = frame.canGoForward() ? "1" : "0.3";
}

View File

@@ -6,149 +6,251 @@ html, body {
overflow: hidden; overflow: hidden;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
font-family: 'Roboto', sans-serif; /* KDE Plasma default font family */
background-color: #000; font-family: 'Noto Sans', 'Segoe UI', sans-serif;
background-color: #2a2e32; /* Breeze Dark main background */
color: #fcfcfc;
} }
webview { webview {
flex-grow: 1; flex-grow: 1;
border: none; border: none;
width: 100%; width: 100%;
background-color: white; background-color: #2a2e32;
} }
/* KDE Plasma Taskbar / Panel Style */
footer { footer {
width: 100%; width: 100%;
height: 70px; height: 64px; /* Standard Plasma panel height */
background-color: rgba(26, 26, 26, 0.95); background-color: rgba(35, 38, 41, 0.92); /* Breeze Dark Panel */
backdrop-filter: blur(10px); backdrop-filter: blur(16px);
color: white; color: #fcfcfc;
padding: 0 20px; padding: 0 10px;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
box-sizing: border-box; box-sizing: border-box;
border-top: 1px solid #333; border-top: 1px solid rgba(255, 255, 255, 0.08); /* Subtle Plasma top border */
box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.25);
z-index: 10; z-index: 10;
} }
/* Plasma Style URL / Search Input */
#search { #search {
flex-grow: 1; flex-grow: 1;
height: 44px; height: 40px;
font-size: 16px; font-size: 13px;
padding: 0 20px; padding: 0 12px;
border: 1px solid #444; border: 1px solid #4d5053;
border-radius: 10px; border-radius: 4px; /* Plasma uses sharp/subtle 4px corners */
background-color: #2b2b2b; background-color: #232629;
color: #fff; color: #fcfcfc;
outline: none; outline: none;
transition: all 0.2s ease-in-out; transition: all 0.15s ease;
margin-right: 12px; margin-right: 8px;
}
#search:hover {
border-color: #3daee9; /* Plasma Accent Color */
} }
#search:focus { #search:focus {
background-color: #333; background-color: #1b1e20;
border-color: #3daee9;
box-shadow: 0 0 5px rgba(61, 174, 233, 0.5); /* Breeze focus glow */
} }
/* Base Button Styling (Plasma Flat Button style) */
.badgebutton { .badgebutton {
width: 44px; width: 32px;
height: 44px; height: 32px;
background-color: #007bff; background-color: transparent;
border: none; border: 1px solid transparent;
border-radius: 25%; border-radius: 4px;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
cursor: pointer; cursor: pointer;
transition: transform 0.1s active; transition: all 0.15s ease;
}
.badgebutton:hover {
background-color: rgba(255, 255, 255, 0.1);
border-color: rgba(255, 255, 255, 0.15);
} }
.badgebutton:active { .badgebutton:active {
transform: scale(0.9); background-color: rgba(61, 174, 233, 0.2);
border-color: #3daee9;
}
#arrowbtn1, #arrowbtn2 {
background-color: transparent;
border-radius: 4px;
margin: 0 2px;
} }
#searchicon { #searchicon {
width: 20px; width: 16px;
height: 20px; height: 16px;
object-fit: contain; object-fit: contain;
filter: brightness(0.9);
} }
/* Dropdown Menu (Plasma Context Menu Style) */
.dropdown { .dropdown {
position: relative; position: relative;
display: inline-block; display: inline-block;
margin-left: 10px; margin-left: 4px;
} }
.dropbtn { .dropbtn {
background-color: #2b2b2b; background-color: transparent;
color: white; color: #fcfcfc;
width: 44px; width: 32px;
height: 44px; height: 32px;
border: 1px solid #444; border: 1px solid transparent;
border-radius: 25%; border-radius: 4px;
font-size: 20px; font-size: 16px;
cursor: pointer; cursor: pointer;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
transition: all 0.2s ease; transition: all 0.15s ease;
} }
#arrowbtn1{
background-color: #2b2b2b; .dropbtn:hover {
border-radius: 50%; background-color: rgba(255, 255, 255, 0.1);
}
#arrowbtn2{
background-color: #2b2b2b;
border-radius: 50%;
margin: 10px;
} }
.dropdown-content { .dropdown-content {
display: none; display: none;
position: absolute; position: absolute;
bottom: 100%; bottom: 100%;
left: 50%; left: 50%;
transform: translateX(-50%); transform: translateX(-50%);
margin-bottom: 15px; margin-bottom: 8px;
background-color: rgba(43, 43, 43, 0.95); background-color: rgba(33, 37, 41, 0.95);
backdrop-filter: blur(10px); backdrop-filter: blur(20px);
border: 1px solid #444; border: 1px solid #4d5053;
border-radius: 12px; border-radius: 6px;
box-shadow: 0px -8px 24px rgba(0,0,0,0.5); box-shadow: 0 -4px 16px rgba(0, 0, 0, 0.4);
z-index: 11; z-index: 11;
overflow: hidden; overflow: hidden;
text-align: center; padding: 4px 0;
min-width: 120px;
text-align: left;
} }
.dropdown.active .dropdown-content { .dropdown.active .dropdown-content {
display: block; display: block;
animation: slideUp 0.2s ease-out; animation: plasmaPopup 0.15s cubic-bezier(0.1, 0.9, 0.2, 1);
} }
.dropdown.active .dropbtn { .dropdown.active .dropbtn {
border-color: #007bff; border-color: #3daee9;
background-color: #333; background-color: rgba(61, 174, 233, 0.15);
} }
.dropdown-content a { .dropdown-content a {
color: #eee; color: #eff0f1;
padding: 4px 20px; padding: 6px 14px;
text-decoration: none; text-decoration: none;
display: block; display: block;
font-size: 14px; font-size: 12px;
transition: background 0.2s; transition: background 0.1s, color 0.1s;
cursor: pointer;
} }
/* KDE Breeze Highlight for Menu Items */
.dropdown-content a:hover { .dropdown-content a:hover {
background-color: #007bff; background-color: #3daee9; /* Plasma cyan selection */
color: white; color: #ffffff;
} }
@keyframes slideUp { @keyframes plasmaPopup {
from { from {
opacity: 0; opacity: 0;
transform: translate(-50%, 10px); transform: translate(-50%, 6px);
} }
to { to {
opacity: 1; opacity: 1;
transform: translate(-50%, 0); transform: translate(-50%, 0);
} }
} }
/* Dynamically Injected History Panel Overlay */
#historyView {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: calc(100% - 48px); /* Panel height excluding the footer */
background-color: #2a2e32;
z-index: 9;
display: flex;
flex-direction: column;
padding: 20px;
box-sizing: border-box;
}
.history-header {
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #4d5053;
padding-bottom: 10px;
margin-bottom: 15px;
}
.history-header h2 {
margin: 0;
font-size: 18px;
color: #fcfcfc;
}
#historyList {
list-style: none;
padding: 0;
margin: 0;
overflow-y: auto;
flex-grow: 1;
}
.history-item {
background-color: #232629;
border: 1px solid #31363b;
border-radius: 4px;
padding: 10px 14px;
margin-bottom: 8px;
cursor: pointer;
transition: all 0.15s ease;
}
.history-item:hover {
border-color: #3daee9;
background-color: #2b2e31;
}
.history-info {
display: flex;
flex-direction: column;
}
.history-title {
color: #eff0f1;
font-size: 14px;
font-weight: 500;
}
.history-url {
color: #8a8d8f;
font-size: 12px;
margin-top: 2px;
}
.empty-msg {
color: #8a8d8f;
text-align: center;
padding: 20px;
}