Skip to content

Commit 4cf9dcf

Browse files
committed
Merge branch 'release/1.2.0'
2 parents 5a83212 + b7c9d92 commit 4cf9dcf

40 files changed

Lines changed: 1110 additions & 363 deletions

.vscode/settings.json

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,9 @@
1010
"source.removeUnusedImports": "explicit"
1111
},
1212
"files.trimTrailingWhitespace": true,
13-
"typescript.preferences.importModuleSpecifier": "non-relative",
14-
"typescript.suggest.autoImports": true,
15-
"javascript.preferences.quoteStyle": "single",
16-
"typescript.preferences.quoteStyle": "single",
17-
"javascript.suggest.autoImports": true,
13+
"js/ts.preferences.importModuleSpecifier": "non-relative",
14+
"js/ts.suggest.autoImports": true,
15+
"js/ts.preferences.quoteStyle": "single",
1816
"[typescript]": {
1917
"editor.tabSize": 2,
2018
"editor.insertSpaces": true

package-lock.json

Lines changed: 12 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
"@eslint/js": "^10.0.1",
3434
"@stylistic/eslint-plugin": "^5.10.0",
3535
"@types/auto-launch": "^5.0.5",
36-
"@types/node": "^25.5.2",
36+
"@types/node": "^25.6.0",
3737
"clean-css": "^5.3.3",
3838
"concurrently": "^9.2.1",
3939
"copy-webpack-plugin": "^14.0.0",
@@ -46,7 +46,7 @@
4646
"ts-loader": "^9.5.7",
4747
"typescript": "^5.9.3",
4848
"typescript-eslint": "^8.58.1",
49-
"webpack": "^5.105.4",
49+
"webpack": "^5.106.1",
5050
"webpack-cli": "^7.0.2"
5151
},
5252
"dependencies": {

src/AppState.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ class AppState {
2424
private _tray?: Tray;
2525
private _preferences?: BrowserWindow;
2626
private _pages: Page[] = [];
27-
private readonly _fromClipboardPage: Page = new Page(void 0, this.strings.menu.fromClipboard);
27+
private readonly _fromClipboardPage: Page = Page.newTransientPage(
28+
this.strings.menu.fromClipboard,
29+
Storage.getSettings<string>(Settings.CLIPBOARD_URL_SESSION),
30+
);
2831
private readonly currentStack: { frame?: BaseWindow, navbar?: WebContentsView, page?: Page } = {};
2932
private readonly onViewChangeHandler = function (this: Page) { ViewPropagator.propagate(this.view); };
3033
private readonly contextMenu: {

src/data/Constants.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ const Settings = {
2626
APP_LANGUAGE: 'app_language',
2727
GROUP_PAGES_BY_SESSION: 'group_pages_by_session',
2828
MUTE_STARTUP_SOUND: 'mute_startup_sound',
29+
CLIPBOARD_URL_SESSION: 'clipboard_url_session',
2930
RESIZE_REFRESH_RATE: 'resize_refresh_rate',
3031
DRAG_REFRESH_RATE: 'drag_refresh_rate',
3132
QUICK_MENU_SHORTCUT: 'quick_menu_shortcut',
33+
RIGHT_MARGIN_WHEN_MAXIMIZED: 'right_margin_when_maximized',
3234
};
3335

3436
const SyncSettings = {
@@ -74,12 +76,26 @@ DefaultSettings[Settings.PREFERRED_LANGUAGE] = '';
7476
DefaultSettings[Settings.APP_LANGUAGE] = '';
7577
DefaultSettings[Settings.GROUP_PAGES_BY_SESSION] = false;
7678
DefaultSettings[Settings.MUTE_STARTUP_SOUND] = false;
79+
DefaultSettings[Settings.CLIPBOARD_URL_SESSION] = '';
7780
DefaultSettings[Settings.RESIZE_REFRESH_RATE] = '';
7881
DefaultSettings[Settings.DRAG_REFRESH_RATE] = '';
7982
DefaultSettings[Settings.QUICK_MENU_SHORTCUT] = 'CmdOrCtrl+P';
83+
DefaultSettings[Settings.RIGHT_MARGIN_WHEN_MAXIMIZED] = 16;
8084
DefaultSettings[SyncSettings.GIST_ID] = undefined;
8185
DefaultSettings[SyncSettings.GIST_TOKEN] = undefined;
8286

87+
export interface QuickAction {
88+
id: string;
89+
label: string;
90+
url: string;
91+
}
92+
93+
const DefaultQuickActions: QuickAction[] = [
94+
{ id: 'default-google', label: 'Google', url: 'https://www.google.com/search?q=${encodedText}' },
95+
{ id: 'default-google-ai', label: 'Google AI', url: 'https://www.google.com/search?q=${encodedText}&udm=50' },
96+
{ id: 'default-translate', label: 'Translate', url: 'https://translate.google.com/?sl=auto&tl=${language}&text=${encodedText}' },
97+
];
98+
8399
const OS = {
84100
IS_DARWIN: process.platform === 'darwin',
85101
IS_LINUX: process.platform === 'linux',
@@ -119,5 +135,5 @@ const IsDebug = {
119135
'state': !IsProduction && true,
120136
};
121137

122-
export { DefaultSettings, IsDebug, IsProduction, OS, Path, Permission, Positions, Settings, SyncSettings };
138+
export { DefaultQuickActions, DefaultSettings, IsDebug, IsProduction, OS, Path, Permission, Positions, Settings, SyncSettings };
123139

src/data/Storage.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { DefaultSettings, IsDebug, Permission, Settings } from '@/data/Constants';
1+
import { DefaultQuickActions, DefaultSettings, IsDebug, Permission, QuickAction, Settings } from '@/data/Constants';
22
import { PlainPage } from '@/model/Page';
33
import PreferencesService from '@/service/PreferencesService';
44
import { app, safeStorage, session } from 'electron';
@@ -253,6 +253,14 @@ class Storage {
253253
static export(): string {
254254
return Vault.export();
255255
}
256+
257+
static getQuickActions(): QuickAction[] {
258+
return Vault.get('QuickActions', DefaultQuickActions)!;
259+
}
260+
261+
static setQuickActions(items: QuickAction[]): void {
262+
Vault.set('QuickActions', items);
263+
}
256264
}
257265

258266
/**

src/locale/de.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const de: Strings = {
4444
home: 'Startseite',
4545
resetWindow: 'Fenster Zurücksetzen',
4646
resetBounds: 'Position Zurücksetzen',
47-
searchOnWeb: 'Im Web suchen',
47+
quickActions: 'Schnellaktionen',
4848
searchOnGoogle: 'Google durchsuchen',
4949
searchWithGemini: 'Mit Gemini suchen',
5050
translate: 'Übersetzen',
@@ -187,6 +187,7 @@ export const de: Strings = {
187187
pages: 'Seiten',
188188
permissions: 'Berechtigungen',
189189
settings: 'Einstellungen',
190+
quickActions: 'Schnellaktionen',
190191
sync: 'Synchronisierung',
191192
about: 'Über',
192193
},
@@ -218,6 +219,8 @@ export const de: Strings = {
218219
groupPagesBySessionDesc: 'Seiten in der Taskleiste und Kontextmenüs nach Sitzung gruppiert organisieren.',
219220
muteStartupSound: 'Startton stummschalten',
220221
muteStartupSoundDesc: 'Deaktiviert den Ton, der beim Start der Anwendung abgespielt wird.',
222+
clipboardUrlSession: 'Zwischenablage-URL-Sitzung',
223+
clipboardUrlSessionDesc: 'Legt die Sitzung fest, die für die Zwischenablage-URL-Seite verwendet wird. Leer lassen, um die Standardsitzung zu verwenden.',
221224

222225
showFrame: 'Titelleiste anzeigen',
223226
backgroundColor: 'Hintergrundfarbe',
@@ -255,6 +258,8 @@ export const de: Strings = {
255258
preferredLanguageDesc: 'Eine bevorzugte Sprache für Webseiten über den "Accept-Language"-Header erzwingen. „Anwendung“ folgt der Anwendungssprache. Erfordert einen Neustart, um auf bestehende Sitzungen zu wirken.',
256259
googleApiKey: 'Google API-Schlüssel',
257260
googleApiKeyDesc: 'Geben Sie einen Google Maps API-Schlüssel für genaue Geolokalisierung an. Ohne ihn können Standortanfragen fehlschlagen oder ungenaue Daten liefern. Holen Sie sich einen Schlüssel von der Google Cloud Console mit aktivierter Geolocation-API.',
261+
rightMarginWhenMaximized: 'Rechter Rand bei Maximierung',
262+
rightMarginWhenMaximizedDesc: 'Windows entfernt Pixel von den Fensterrändern beim Maximieren. Diese Einstellung fügt einen rechten Rand als Workaround hinzu, um zu verhindern, dass Inhalte den Rand erreichen.',
258263

259264
resizeRefreshRate: 'Aktualisierungsrate bei Größenänderung',
260265
resizeRefreshRateDesc: 'Legt die maximale Aktualisierungsrate bei der Größenänderung von Fenstern fest. „Automatisch" verwendet die Systemvorgabe.',
@@ -316,6 +321,30 @@ export const de: Strings = {
316321
revokeUrlDialog: 'Alle Berechtigungen für "{url}" widerrufen?',
317322
},
318323

324+
quickActions: {
325+
search: 'Schnellaktionen suchen...',
326+
label: 'Bezeichnung',
327+
labelPlaceholder: 'Menüname',
328+
url: 'URL',
329+
urlPlaceholder: 'https://example.com/search?q=${encodedText}',
330+
addItem: 'Schnellaktion hinzufügen',
331+
remove: 'Entfernen',
332+
drag: 'Ziehen zum Neuanordnen',
333+
emptyTitle: 'Keine Schnellaktionen',
334+
emptyDesc: 'Fügen Sie Ihre erste Schnellaktion hinzu',
335+
variablesTitle: 'Verfügbare Variablen',
336+
variablesDesc: 'Verwenden Sie diese Variablen in der URL-Vorlage. Sie werden beim Ausführen der Suche durch die tatsächlichen Werte ersetzt.',
337+
variables: {
338+
language: 'Sprachcode aus der App-Sprache (z. B. "de")',
339+
region: 'Regionscode aus der App-Sprache (z. B. "DE"), leer falls nicht verfügbar',
340+
locale: 'Vollständige App-Sprache (z. B. "de-DE")',
341+
encodedText: 'Markierter Text, URL-kodiert',
342+
text: 'Markierter Text, roh (nicht kodiert)',
343+
encodedLink: 'Link-URL des angeklickten Elements, URL-kodiert',
344+
link: 'Link-URL des rechts angeklickten Elements, leer wenn kein Link',
345+
},
346+
},
347+
319348
sync: {
320349
localFileTitle: 'Lokale Dateisicherung',
321350
localFileDesc: 'Exportieren Sie Ihre Konfiguration in eine JSON-Datei oder importieren Sie aus einer zuvor gespeicherten Sicherung.',

src/locale/en.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const en = {
4444
home: 'Home',
4545
resetWindow: 'Reset Window',
4646
resetBounds: 'Reset Bounds',
47-
searchOnWeb: 'Search on Web',
47+
quickActions: 'Quick Actions',
4848
searchOnGoogle: 'Search on Google',
4949
searchWithGemini: 'Search with Gemini',
5050
translate: 'Translate',
@@ -186,6 +186,7 @@ export const en = {
186186
pages: 'Pages',
187187
permissions: 'Permissions',
188188
settings: 'Settings',
189+
quickActions: 'Quick Actions',
189190
sync: 'Sync',
190191
about: 'About',
191192
},
@@ -217,6 +218,8 @@ export const en = {
217218
groupPagesBySessionDesc: 'Organize pages in the tray and context menus grouped by their session.',
218219
muteStartupSound: 'Mute startup sound',
219220
muteStartupSoundDesc: 'Disable the sound that plays when the application starts.',
221+
clipboardUrlSession: 'Clipboard URL session',
222+
clipboardUrlSessionDesc: 'Set the session used by the Clipboard URL page. Leave empty to use the default session.',
220223

221224
showFrame: 'Show frame',
222225
backgroundColor: 'Background color',
@@ -254,6 +257,8 @@ export const en = {
254257
preferredLanguageDesc: 'Force a preferred language for web pages via Accept-Language header. "Application" follows the app language setting. Requires restart to take effect on existing sessions.',
255258
googleApiKey: 'Google API key',
256259
googleApiKeyDesc: 'Provide a Google Maps API key for accurate geolocation. Without it, location requests may fail or return inaccurate data. Get a key from the Google Cloud Console with Geolocation API enabled.',
260+
rightMarginWhenMaximized: 'Right margin when maximized',
261+
rightMarginWhenMaximizedDesc: 'Windows removes pixels from window edges when maximizing. This setting adds a right side margin as a workaround to prevent content from reaching the edge.',
257262

258263
resizeRefreshRate: 'Resize refresh rate',
259264
resizeRefreshRateDesc: 'Sets the maximum refresh rate when resizing windows. "Auto" uses the system default.',
@@ -315,6 +320,30 @@ export const en = {
315320
revokeUrlDialog: 'Revoke all permissions for "{url}"?',
316321
},
317322

323+
quickActions: {
324+
search: 'Search quick actions...',
325+
label: 'Label',
326+
labelPlaceholder: 'Menu name',
327+
url: 'URL',
328+
urlPlaceholder: 'https://example.com/search?q=${encodedText}',
329+
addItem: 'Add quick action',
330+
remove: 'Remove',
331+
drag: 'Drag to reorder',
332+
emptyTitle: 'No quick actions',
333+
emptyDesc: 'Add your first quick action to get started',
334+
variablesTitle: 'Available Variables',
335+
variablesDesc: 'Use these variables in the URL template. They will be replaced with the actual values when the search is performed.',
336+
variables: {
337+
language: 'Language code from app locale (e.g. "en")',
338+
region: 'Region code from app locale (e.g. "US"), empty if not available',
339+
locale: 'Full app locale (e.g. "en-US")',
340+
encodedText: 'Selected text, URL encoded',
341+
text: 'Selected text, raw (not encoded)',
342+
encodedLink: 'Link URL of the right-clicked element, URL encoded',
343+
link: 'Link URL of the right-clicked element, empty if not a link',
344+
},
345+
},
346+
318347
sync: {
319348
localFileTitle: 'Local File Backup',
320349
localFileDesc: 'Export your configuration to a JSON file or import from a previously saved backup.',

src/locale/es.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const es: Strings = {
4444
home: 'Inicio',
4545
resetWindow: 'Restablecer Ventana',
4646
resetBounds: 'Restablecer Posición',
47-
searchOnWeb: 'Buscar en la Web',
47+
quickActions: 'Acciones rápidas',
4848
searchOnGoogle: 'Buscar en Google',
4949
searchWithGemini: 'Buscar con Gemini',
5050
translate: 'Traducir',
@@ -187,6 +187,7 @@ export const es: Strings = {
187187
pages: 'Páginas',
188188
permissions: 'Permisos',
189189
settings: 'Configuración',
190+
quickActions: 'Acciones rápidas',
190191
sync: 'Sincronización',
191192
about: 'Acerca de',
192193
},
@@ -218,6 +219,8 @@ export const es: Strings = {
218219
groupPagesBySessionDesc: 'Organiza las páginas en la bandeja y menús contextuales agrupadas por su sesión.',
219220
muteStartupSound: 'Silenciar sonido de inicio',
220221
muteStartupSoundDesc: 'Desactiva el sonido que se reproduce cuando la aplicación se inicia.',
222+
clipboardUrlSession: 'Sesión de URL del portapapeles',
223+
clipboardUrlSessionDesc: 'Define la sesión utilizada por la página de URL del portapapeles. Dejar vacío para usar la sesión predeterminada.',
221224

222225
showFrame: 'Mostrar barra de título',
223226
backgroundColor: 'Color de fondo',
@@ -255,6 +258,8 @@ export const es: Strings = {
255258
preferredLanguageDesc: 'Forzar un idioma preferido para páginas web mediante el encabezado "Accept-Language". "Aplicación" sigue el idioma de la aplicación. Requiere reinicio para surtir efecto en sesiones existentes.',
256259
googleApiKey: 'Clave de la API de Google',
257260
googleApiKeyDesc: 'Proporciona una clave de la API de Google Maps para una geolocalización precisa. Sin ella, las solicitudes de ubicación pueden fallar o devolver datos imprecisos. Obtén una clave desde Google Cloud Console con la API de Geolocalización habilitada.',
261+
rightMarginWhenMaximized: 'Margen derecho cuando está maximizado',
262+
rightMarginWhenMaximizedDesc: 'Windows elimina píxeles de los bordes de la ventana al maximizarla. Este ajuste añade un margen derecho como solución para evitar que el contenido llegue al borde.',
258263

259264
resizeRefreshRate: 'Tasa de refresco al redimensionar',
260265
resizeRefreshRateDesc: 'Establece la tasa de refresco máxima al redimensionar ventanas. "Auto" utiliza el valor predeterminado del sistema.',
@@ -316,6 +321,30 @@ export const es: Strings = {
316321
revokeUrlDialog: '¿Revocar todos los permisos para "{url}"?',
317322
},
318323

324+
quickActions: {
325+
search: 'Buscar acciones rápidas...',
326+
label: 'Etiqueta',
327+
labelPlaceholder: 'Nombre del menú',
328+
url: 'URL',
329+
urlPlaceholder: 'https://example.com/search?q=${encodedText}',
330+
addItem: 'Agregar acción rápida',
331+
remove: 'Eliminar',
332+
drag: 'Arrastrar para reordenar',
333+
emptyTitle: 'Sin acciones rápidas',
334+
emptyDesc: 'Agregue su primera acción rápida para comenzar',
335+
variablesTitle: 'Variables disponibles',
336+
variablesDesc: 'Use estas variables en la plantilla de URL. Se reemplazarán con los valores reales al realizar la búsqueda.',
337+
variables: {
338+
language: 'Código de idioma de la aplicación (p. ej. "es")',
339+
region: 'Código de región de la aplicación (p. ej. "ES"), vacío si no está disponible',
340+
locale: 'Idioma completo de la aplicación (p. ej. "es-ES")',
341+
encodedText: 'Texto seleccionado, codificado en URL',
342+
text: 'Texto seleccionado, sin codificar',
343+
encodedLink: 'URL del enlace del elemento clicado, codificada',
344+
link: 'URL del enlace del elemento clicado, vacío si no es un enlace',
345+
},
346+
},
347+
319348
sync: {
320349
localFileTitle: 'Copia de Seguridad Local',
321350
localFileDesc: 'Exporta tu configuración a un archivo JSON o importa desde una copia de seguridad guardada anteriormente.',

0 commit comments

Comments
 (0)