diff --git a/css/base.css b/css/base.css index b5b927671..e8bcee31b 100644 --- a/css/base.css +++ b/css/base.css @@ -3,12 +3,15 @@ padding: 0; box-sizing: border-box; font-size: 16px; - font-family: ".SFNSText-Regular", "BlinkMacSystemFont", "Helvetica Neue", - "Segoe UI", "Arial", sans-serif; + /* font-family: ".SFNSText-Regular", "BlinkMacSystemFont", "Helvetica Neue", + "Segoe UI", "Arial", sans-serif; */ + + font-family: 'Roboto', monospace; + /* font-family: "Amore", cursive; */ } /* TODO figure out why the default focus color in Electron is orange */ *:focus { - outline-color: rgb(0, 117, 255); + outline-color: rgb(0, 255, 191); } .dark-mode *:focus { outline-color: transparent; @@ -30,16 +33,16 @@ button { } body, html { - background-color: #fff; - color: #000; + background-color: #fff; /* Color de fondo para tema claro por defecto */ + color: #000; /* Color de texto para tema claro por defecto */ height: 100%; overflow: hidden; -webkit-user-select: none; } body.dark-mode { - background-color: rgb(33, 37, 43); - color: lightgrey; + background-color: var(--theme-background-color); + color: var(--theme-text-color); } h1, @@ -55,6 +58,13 @@ h3 { h2 { text-align: left; font-size: 2.75em; + margin: 0.5em 0; + font-weight: 300; + opacity: 0.8; + color: inherit; +} +h2:first-of-type { + border-top: none; } h3 { text-align: left; @@ -95,19 +105,64 @@ a { /* styled scrollbars */ -.has-thin-scrollbar::-webkit-scrollbar { - height: 0.25em; +/* Estilo global para todas las scrollbars */ +::-webkit-scrollbar { + width: 8px; /* Ancho reducido */ + height: 8px; /* Alto reducido para scrollbars horizontales */ } -.has-thin-scrollbar::-webkit-scrollbar-track { - background-color: rgba(0, 0, 0, 0.05); + +::-webkit-scrollbar-track { + background: transparent; /* Hacemos el track invisible */ +} + +::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.3); /* Un color oscuro semitransparente para el thumb */ + border-radius: 10px; /* Bordes redondeados */ + border: 2px solid transparent; /* Espacio alrededor del thumb */ + background-clip: content-box; /* Para que el borde sea transparente y no afecte el color del thumb */ } -.has-thin-scrollbar::-webkit-scrollbar-thumb { - background-color: rgba(0, 0, 0, 0.175); - border-radius: 0.25em; + +::-webkit-scrollbar-thumb:hover { + background-color: rgba(0, 0, 0, 0.5); } -.dark-theme .has-thin-scrollbar::-webkit-scrollbar-track { - background-color: rgba(255, 255, 255, 0.25); + +/* Estilo para el tema oscuro */ +body.dark-mode ::-webkit-scrollbar-thumb { + background-color: rgba(20, 18, 18, 0.3); /* Un color claro semitransparente para el thumb en modo oscuro */ } -.dark-theme .has-thin-scrollbar::-webkit-scrollbar-thumb { - background-color: rgba(255, 255, 255, 0.6); + +body.dark-mode ::-webkit-scrollbar-thumb:hover { + background-color: rgba(255, 255, 255, 0.5); +} + +.section-separator { + /* Eliminado: restauración del archivo original */ +} + +#navbar { + display: flex; + height: calc(36px + var(--control-space-top)); + transition: 0.2s background-color; /* <- Importante: ya hay una transición de color */ + width: 100%; + -webkit-user-select: none; + position: relative; + outline: none; + z-index: 2; + padding-top: var(--control-space-top); + padding-left: var(--control-space-left); + padding-right: var(--control-space-right); + background-color: var(--navbar-light); /* Color para tema claro por defecto */ +} + +/* Estilos de la barra de navegación */ +/* #navbar { + background-color: var(--navbar-light) !important; +} + +body.dark-theme #navbar { + background-color: var(--navbar-dark) !important; +} */ + +.dark-theme #navbar { /* O body.dark-theme #navbar si es más consistente con el resto */ + background-color: var(--navbar-dark); /* Color para tema oscuro */ } diff --git a/css/custom-theme.css b/css/custom-theme.css new file mode 100644 index 000000000..3fbad4be0 --- /dev/null +++ b/css/custom-theme.css @@ -0,0 +1,135 @@ +:root { + /* --- Dark Developer Theme --- */ + + /* Colores principales */ + --primary-color: #61AFEF; /* Azul Eléctrico (Atom/VSCode) */ + --secondary-color: #98C379; /* Verde Suave (Atom/VSCode) */ + --accent-color: #E5C07B; /* Amarillo/Dorado Suave (Atom/VSCode) */ + --danger-color: #E06C75; /* Rojo para cierres/alertas (Atom/VSCode) */ + + /* Colores de fondo */ + --background-light: #FAFAFA; /* Gris muy claro (para tema claro opcional) */ + --background-dark: rgb(15, 23, 42); /* NUEVO FONDO OSCURO */ + + /* Colores de texto */ + --text-light: #333333; /* Gris oscuro (para tema claro opcional) */ + --text-dark: #ABB2BF; /* Gris claro (Atom/VSCode) */ + + /* Colores de la barra de navegación (Dark) */ + --navbar-light: #E0E0E0; /* Mantener un fallback para tema claro */ + --navbar-dark: #21252B; /* Ligeramente más claro que el fondo oscuro */ + + /* Colores de pestañas (Dark) */ + --tab-active-dark: rgba(97, 175, 239, 0.15); /* Azul primario con opacidad */ + --tab-hover-dark: rgba(97, 175, 239, 0.1); /* Azul primario con menor opacidad */ + /* Para pestañas inactivas, generalmente toman el color de --navbar-dark o un gris muy sutil */ + + /* Fallbacks para tema claro (pueden mantenerse o ajustarse si se usa el tema claro) */ + --tab-active-light: rgba(97, 175, 239, 0.1); + --tab-hover-light: rgba(0, 0, 0, 0.05); + + --rgb-dark-base: 15, 23, 42; /* Definimos los componentes RGB */ + --tw-bg-opacity: 1; /* Tu variable de opacidad, default a 1 */ + --background-dark: rgba(var(--rgb-dark-base), var(--tw-bg-opacity)); +} + +/* Tema claro (configuración básica) */ +body { + --theme-background-color: var(--background-light); + --theme-text-color: var(--text-light); + --theme-accent-color: var(--primary-color); + position: relative; /* Necesario para que el z-index del ::before funcione correctamente */ + background-color: var(--theme-background-color); + color: var(--theme-text-color); /* Asegura que el color de texto del tema se aplique */ +} + +/* Tema oscuro (enfoque principal) */ +body.dark-theme, body.dark-mode { /* Unificado y asegura que ambas clases activen estos estilos */ + --theme-background-color: var(--background-dark); + --theme-text-color: rgb(204, 214, 246); /* NUEVO color de texto para modo oscuro */ + --theme-accent-color: var(--secondary-color); /* O --primary-color según preferencia */ +} + +/* CSS para el efecto Spotlight sobre el fondo oscuro */ +body.dark-theme::before { + content: ""; + position: fixed; /* Se mueve con la ventana, no con el scroll del body */ + top: 0; + left: 0; + right: 0; + bottom: 0; + background: radial-gradient( + circle 250px at var(--mouse-x, 50%) var(--mouse-y, 50%), /* Tamaño del spotlight y posición (default centro) */ + rgba(255, 255, 255, 0.08) 0%, /* Luz blanca muy sutil en el centro */ + transparent 70% /* Se desvanece a transparente, mostrando el fondo oscuro del body */ + ); + pointer-events: none; /* Para que no interfiera con los clics en la página */ + z-index: 0; /* Sutilmente por encima del fondo del body pero detrás del contenido principal */ + /* Ajustar si es necesario. Si el contenido del body tiene z-index, este podría necesitar ser más alto o más bajo. */ +} + +/* Estilos de la barra de navegación */ +#navbar { + background-color: var(--navbar-light) !important; /* Fallback tema claro */ +} + +body.dark-theme #navbar { + background-color: var(--navbar-dark) !important; +} + +/* Estilos de las pestañas */ +.tab-item { + /* Los estilos de pestañas inactivas en tema oscuro suelen heredar de #navbar o tener un color muy sutil */ + /* Se podría añadir una variable --tab-inactive-dark si se quiere más control */ +} + +.tab-item.active { + background-color: var(--tab-active-light) !important; /* Fallback tema claro */ +} + +body.dark-theme .tab-item.active { + background-color: var(--tab-active-dark) !important; +} + +.tab-item:hover { + background-color: var(--tab-hover-light) !important; /* Fallback tema claro */ +} + +body.dark-theme .tab-item:hover { + background-color: var(--tab-hover-dark) !important; +} + +/* Estilos de botones de acción de la navbar (ej. nueva pestaña) */ +.navbar-action-button { + color: var(--theme-text-color) !important; +} + +body.dark-theme .navbar-action-button { + color: var(--text-dark) !important; /* Asegurar que los iconos usen el color de texto del tema oscuro */ +} + +.navbar-action-button:hover { + background-color: var(--theme-accent-color) !important; + color: var(--background-dark) !important; /* Texto oscuro sobre fondo de acento */ +} + +body.dark-theme .navbar-action-button:hover { + background-color: var(--primary-color) !important; /* Usar primario para hover en tema dark */ + color: var(--background-dark) !important; +} + +/* Botones de ventana (Minimizar, Maximizar, Cerrar) */ +/* Estos son más complejos de temar con variables globales ya que dependen de la plataforma */ +/* Sin embargo, podemos intentar influir en el color de los iconos si son fuentes */ +.window-controls .element { + /* color: var(--text-dark); */ /* Intento para iconos de ventana en dark mode */ +} + +/* Estilos de la barra de búsqueda */ +#searchbar { + background-color: var(--navbar-light) !important; /* Fallback tema claro */ +} + +body.dark-theme #searchbar { + background-color: var(--navbar-dark) !important; +} \ No newline at end of file diff --git a/css/tabBar.css b/css/tabBar.css index e956064a5..fe7479da2 100644 --- a/css/tabBar.css +++ b/css/tabBar.css @@ -1,6 +1,6 @@ #navbar { display: flex; - height: calc(36px + var(--control-space-top)); + height: calc(28px + var(--control-space-top)); transition: 0.2s background-color; width: 100%; -webkit-user-select: none; @@ -101,8 +101,8 @@ body.linux #menu-button { flex: 1; min-width: 125px; transition: 0.2s transform; - line-height: 36px; - height: 36px; + line-height: 28px; + height: 28px; overflow: hidden; word-break: break-all; position: relative; @@ -185,7 +185,7 @@ body:not(.touch) .tab-item .tab-icon { position: relative; - font-size: 0.875em; + font-size: 0.75em; box-sizing: border-box; display: flex; justify-content: center; @@ -194,8 +194,8 @@ body:not(.touch) } .tab-item .tab-icon:not(.permission-request-icon):hover:after { content: ""; - width: 24px; - height: 24px; + width: 20px; + height: 20px; border-radius: 50%; background: rgba(0, 0, 0, 0.075); position: absolute; @@ -204,11 +204,13 @@ body:not(.touch) transform: translate(-50%, -50%); z-index: -1; } -.dark-theme .tab-item .tab-icon:hover:after { +.dark-theme .tab-item .tab-icon:not(.permission-request-icon):hover:after { background: rgba(255, 255, 255, 0.15); } .tab-item.active:not(:only-child) { background: rgba(0, 0, 0, 0.06); + display: block; + margin-top: 2px; } .dark-theme .tab-item.active:not(:only-child) { background: rgba(255, 255, 255, 0.2); @@ -285,15 +287,18 @@ body:not(.touch) .navbar-action-button { padding: 0 1rem; - height: 36px; - margin-top: -0.5px; - font-size: 1.4em !important; + height: 28px; + margin-top: 0; + font-size: 1em !important; + display: inline-flex; + align-items: center; + justify-content: center; } body.windows .navbar-action-button:not(:disabled):hover { background-color: rgba(0, 0, 0, 0.075); } body.windows.dark-theme .navbar-action-button:not(:disabled):hover { - background: rgba(255, 255, 255, 0.075); + background: rgba(255, 255, 255, 0.15); } .navbar-action-button.invisible { visibility: hidden; @@ -307,15 +312,16 @@ body.windows.dark-theme .navbar-action-button:not(:disabled):hover { .navbar-right-actions #add-tab-button { padding: 0; - width: 36px; - font-size: 1.6em !important; + width: auto; + font-size: 1.3em !important; + color: var(--accent-color); } /* audio button */ .tab-item .tab-audio-button { vertical-align: text-bottom; padding: 0; - font-size: 1.1em !important; + font-size: 1em !important; } /* reader button */ @@ -323,7 +329,7 @@ body.windows.dark-theme .navbar-action-button:not(:disabled):hover { .tab-item .reader-button { display: none; vertical-align: text-bottom; - font-size: 1.1em !important; + font-size: 1em !important; order: -1; } .tab-item.active .reader-button.can-reader { @@ -373,7 +379,7 @@ body.windows.dark-theme .navbar-action-button:not(:disabled):hover { /* in Carbon, close icon is a bit smaller than other icons, enlarge it in order to match with other icons */ .tab-item .tab-close-button { - font-size: 1.25em; + font-size: 1.0em; box-sizing: border-box; order: 1; } @@ -432,3 +438,37 @@ body:not(.dark-theme) .progress-bar { transform: translateX(0%); transition: transform 500ms cubic-bezier(0.25, 0.46, 0.45, 0.94); } + +.tab-bar, .navbar-action-button, .tab-item { + font-family: 'MesloLGL Nerd Font', 'MesloLGL NF', 'MesloLGLDZ Nerd Font', 'MesloLGLDZ NF', monospace; +} + +body.windows:not(.separate-titlebar) .windows-caption-buttons { + display: flex; + position: absolute; + top: var(--control-space-top); + right: 0; + z-index: 10; +} + +.windows-caption-buttons .element { + line-height: 28px; + width: 36px; + stroke: #000; + padding: 0 5px; + box-sizing: content-box; + fill: transparent; + text-align: center; +} + +#switch-task-button svg { + width: 0.8em; + height: 0.8em; + display: block; + margin-top: 2px; +} + +/* Nueva regla para el color del icono en hover */ +/* .tab-item .tab-icon:not(.permission-request-icon):hover { <---- ESTA SECCION COMPLETA DEBE SER ELIMINADA + color: var(--accent-color); +} */ diff --git a/css/taskOverlay.css b/css/taskOverlay.css index 0b2f0965f..841a33edb 100644 --- a/css/taskOverlay.css +++ b/css/taskOverlay.css @@ -53,18 +53,38 @@ top: var(--control-space-top); right: var(--control-space-right); z-index: 4; - padding: 0.5em; + padding: 0 8px; + height: 28px; + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: center; } #switch-task-button.active { color: royalblue !important; } +#switch-task-button:hover { + background-color: rgba(0, 0, 0, 0.075); +} + +#switch-task-button:hover svg { + /* fill: var(--accent-color); <- Eliminado */ +} + +.dark-theme #switch-task-button:hover { + background-color: rgba(255, 255, 255, 0.15); +} + +.dark-theme #switch-task-button:hover svg { + /* fill: var(--accent-color); <- Eliminado */ +} + #switch-task-button svg { - width: 0.8em; - height: 0.8em; + width: 0.7em; + height: 0.7em; display: block; - margin-top: 2px; } #task-overlay { display: flex; diff --git a/css/windowControls.css b/css/windowControls.css index 94f9a16f5..040dc2d20 100644 --- a/css/windowControls.css +++ b/css/windowControls.css @@ -74,7 +74,7 @@ body.windows:not(.separate-titlebar) .windows-caption-buttons { } .windows-caption-buttons .element { - line-height: 36px; + line-height: 28px; width: 36px; stroke: #000; padding: 0 5px; @@ -96,14 +96,20 @@ body:not(.task-overlay-is-shown).dark-theme .windows-caption-buttons .element { transition: background-color 0.1s linear, color 0.1s linear; } .windows-caption-buttons .element:hover { - background-color: rgba(196, 196, 196, 0.4); + background-color: rgba(0, 0, 0, 0.075); transition: none; } + +body:not(.task-overlay-is-shown).dark-theme .windows-caption-buttons .element:hover { + background-color: rgba(255, 255, 255, 0.15); +} + .windows-caption-buttons .element:active { background-color: rgba(168, 168, 168, 0.5); } .windows-caption-buttons .element.caption-close:hover { background-color: #e81123; + stroke: #fff; } .windows-caption-buttons .element.caption-close:hover > svg, .windows-caption-buttons .element.caption-close:active > svg { diff --git a/index.html b/index.html index d0e97bc17..33d782586 100644 --- a/index.html +++ b/index.html @@ -4,10 +4,11 @@ - Min + Apu + @@ -346,5 +347,6 @@ + diff --git a/js/effects/mouseSpotlight.js b/js/effects/mouseSpotlight.js new file mode 100644 index 000000000..c643fd004 --- /dev/null +++ b/js/effects/mouseSpotlight.js @@ -0,0 +1,40 @@ +// js/effects/mouseSpotlight.js + +function updateMousePosition(event) { + const x = event.clientX; + const y = event.clientY; + document.documentElement.style.setProperty('--mouse-x', `${x}px`); + document.documentElement.style.setProperty('--mouse-y', `${y}px`); +} + +function activateSpotlightEffect() { + // Solo activar en tema oscuro y si el efecto está "habilitado" + if (document.body.classList.contains('dark-theme') || document.body.classList.contains('dark-mode')) { + window.addEventListener('mousemove', updateMousePosition); + } +} + +function deactivateSpotlightEffect() { + window.removeEventListener('mousemove', updateMousePosition); +} + +// Observador para cambios en la clase del body (para detectar cambio de tema) +const themeObserver = new MutationObserver((mutationsList) => { + for (const mutation of mutationsList) { + if (mutation.type === 'attributes' && mutation.attributeName === 'class') { + if (document.body.classList.contains('dark-theme') || document.body.classList.contains('dark-mode')) { + activateSpotlightEffect(); + } else { + deactivateSpotlightEffect(); + } + } + } +}); + +// Iniciar la observación de cambios en el body +themeObserver.observe(document.body, { attributes: true }); + +// Activar inicialmente si ya está en tema oscuro al cargar la página +if (document.body.classList.contains('dark-theme') || document.body.classList.contains('dark-mode')) { + activateSpotlightEffect(); +} \ No newline at end of file diff --git a/localization/languages/tr.json b/localization/languages/tr.json index 19acc5ae1..9ad74e110 100644 --- a/localization/languages/tr.json +++ b/localization/languages/tr.json @@ -2,9 +2,6 @@ "name": "Turkish (Turkey)", "identifier": "tr", "translations": { - /* Context menu items - these are the items displayed in the menu when you right-click on a page - */ "addToDictionary": "Sözlüğe Ekle", "pictureInPicture": "Resim İçinde Resim", "openInNewTab": "Yeni Sekmede Aç", @@ -14,32 +11,28 @@ "openImageInNewTab": "Resmi Yeni Sekmede Aç", "openImageInNewPrivateTab": "Resmi Yeni Gizli Sekmede Aç", "saveImageAs": "Resmi Farklı Kaydet", - "searchWith": "%s ile ara", //%s will be replaced with the name of the current search engine + "searchWith": "%s ile ara", "copyLink": "Linki Kopyala", "copyEmailAddress": "E-Posta Adresini Kopyala", "selectAll": "Hepsini Seç", "undo": "Geri", "redo": "İleri", "cut": "Kes", - "copy": "Kopyala", //this is a verb (as in "copy the currently-selected text") + "copy": "Kopyala", "paste": "Yapıştır", "pasteAndMatchStyle": "Yapıştır ve Stili Eşle", "goBack": "Geri Git", "goForward": "İleri Git", "inspectElement": "Öğeyi İncele", "translatePage": "Sayfayı Çevir", - /* searchbar */ "placesPluginOpenAgain": "Yeniden Aç", "placesPluginSwitchToTab": "Sekmeye Git", "placesPluginSwitchToTask": "Şu Göreve Git \"%t\"", "pasteAndGo": "Yapıştır ve Git", - "DDGAnswerSubtitle": "Cevap", //this is a noun - it is used as a subtitle when displaying Instant Answers from DuckDuckGo in the searchbar - "suggestedSite": "Önerilen site", //this is used to label suggested websites from the DuckDuckGo API, - "resultsFromDDG": "DuckDuckGo'dan sonuçlar", //this is used as a label to indicate which results come from DuckDuckGo's API - "taskN": "Görev %n", //this is used as a way to identify which tab a task is in "task 1", "task 2", ... - /* custom commands - these are some of the items that show up when you press ! in the searchbar. - Each one of these strings describes what the command will do when you run it. */ + "DDGAnswerSubtitle": "Cevap", + "suggestedSite": "Önerilen site", + "resultsFromDDG": "DuckDuckGo'dan sonuçlar", + "taskN": "Görev %n", "showMoreBangs": "Daha fazla göster", "viewSettings": "Görünüm Ayarları", "takeScreenshot": "Ekran Görüntüsü Al", @@ -63,19 +56,17 @@ "importBookmarks": "Yer imlerini HTML dosyasından içe aktar", "exportBookmarks": "Yer imlerini dışa aktar", "runUserscript": "Kullanıcı betiklerini çalıştır", - /* navbar */ "openMenu": "Menüyü Aç", "enterReaderView": "Okuyucu görünümüne girin", "exitReaderView": "Okuyucu görünümünden çıkın", - "newTabLabel": "Yeni Sekme", //this is a noun, used for tabs that don't have a page loaded in them yet + "newTabLabel": "Yeni Sekme", "connectionNotSecure": "Bu web sitesine yapmış olduğunuz bağlantı güvenli değil.", "searchbarPlaceholder": "Arayın veya adres girin", "privateTab": "Gizli sekme", - "newTabAction": "Yeni Sekme", //this is a verb, used to label a button that adds a tab to the tabstrip when clicked - /* task overlay */ + "newTabAction": "Yeni Sekme", "viewTasks": "Görevleri Görüntüle", - "newTask": "Yeni Görev", //"new" is a verb - it is used for a button at the bottom of the task overlay - "defaultTaskName": "Görev %n", //this is the name used for newly-created tasks; %n is replaced with a number ("task 1", "task 2", etc) + "newTask": "Yeni Görev", + "defaultTaskName": "Görev %n", "taskDeleteWarning": { "unsafeHTML": "Görev silindi. Geri al" }, @@ -83,16 +74,13 @@ "returnToTask": "Önceki göreve geri dön", "taskDescriptionTwo": "%t ve %t", "taskDescriptionThree": "%t, %t ve %n fazlası", - /* find in page toolbar */ - "searchInPage": "Sayfada Ara", //this is used as the placeholder text for the textbox in the find in page toolbar - "findMatchesSingular": "%i / %t eşleşme", //this and the next label are used to indicate which match is currently highlighted + "searchInPage": "Sayfada Ara", + "findMatchesSingular": "%i / %t eşleşme", "findMatchesPlural": "%i / %t eşleşme", - /* Focus mode */ "isFocusMode": "Odak Modundasınız.", - "closeDialog": "Tamam", //used as a label for the button that closes the dialog + "closeDialog": "Tamam", "focusModeExplanation1": "Odak modunda yeni sekme açamaz ya da görevler arasında geçiş yapamazsınız.", "focusModeExplanation2": "Odak modundan çıkmak için görünüm menüsünden \"odak modu\" tikini kaldırabilirsiniz.", - /* relative dates */ "timeRangeJustNow": "Şu anda", "timeRangeMinutes": "Birkaç dakika önce", "timeRangeHour": "Son bir saat içinde", @@ -102,7 +90,6 @@ "timeRangeMonth": "Geçtiğimiz ay", "timeRangeYear": "Geçtiğimiz yıl", "timeRangeLongerAgo": "Çok uzun zaman önce", - /* pages/error/index.html */ "crashErrorTitle": "Bir şeyler yanlış gitti.", "crashErrorSubtitle": "Bu sayfayı görüntülerken bir sorun oluştu.", "errorPagePrimaryAction": "Tekrar deneyin", @@ -119,21 +106,17 @@ "sslTimeErrorMessage": "Min, siteye güvenli bir şekilde bağlanamadı. Lütfen bilgisayarınızın saat ayarının doğru olduğundan emin olun.", "addressInvalidTitle": "Bu adres geçersiz.", "genericError": "Bir hata oluştu", - /* pages/phishing/index.html */ "phishingErrorTitle": "Bu site size zarar verebilir.", "phishingErrorMessage": "Bu web sitesi, şifreleriniz veya banka bilgileri gibi kişisel bilgilerinizi çalmaya çalışıyor olabilir.", "phishingErrorVisitAnyway": "Siteyi yine de ziyaret et", "phishingErrorLeave": "Bu siteden ayrıl", - /* multiple instances alert */ "multipleInstancesErrorMessage": "Bir hata oluştu. Açık olan tüm sekmeleri kapatıp, Min'i yeniden başlatın.", - /* pages/sessionRestoreError/index.html */ "sessionRestoreErrorTitle": "Bir hata oluştu", "sessionRestoreErrorExplanation": "Kaydedilen sekmeleriniz doğru bir şekilde geri yüklenemedi.", - "sessionRestoreErrorBackupInfo": "Verilerinizin yedeği şu konuma kaydedildi: %l.", //%l will be replaced with a path to a file + "sessionRestoreErrorBackupInfo": "Verilerinizin yedeği şu konuma kaydedildi: %l.", "sessionRestoreErrorLinkInfo": { "unsafeHTML": "Bu hata olmaya devam ederse, lütfen buradan yeni bir sorun başlığı açın." }, - /* pages/settings/index.html */ "settingsPreferencesHeading": "Tercihler", "settingsRestartRequired": "Değişiklikleri uygulamak için yeniden başlatmanız gerekiyor.", "settingsPrivacyHeading": "İçerik Engelleme", @@ -146,8 +129,8 @@ "settingsBlockedRequestCount": { "unsafeHTML": "Min şimdiye kadar, reklam ve takipçi engelledi." }, - "settingsCustomBangs": "Kişiselleştirilebilir Komutlar" - "settingsCustomBangsAdd": "Yeni komut ekle" + "settingsCustomBangs": "Kişiselleştirilebilir Komutlar", + "settingsCustomBangsAdd": "Yeni komut ekle", "settingsCustomBangsPhrase": "Cümle (Gerekli)", "settingsCustomBangsSnippet": "Açıklama (İsteğe Bağlı)", "settingsCustomBangsRedirect": "Yönlendirme URL'si (Gerekli)", @@ -184,7 +167,7 @@ "settingsNewWindowPickTask": "Görev listesini göster", "settingsSearchEngineHeading": "Arama Motoru", "settingsDefaultSearchEngine": "Bir varsayılan arama motoru seçin:", - "settingsDDGExplanation": "Arama çubuğundaki anlık yanıtları görmek için DuckDuckGo’yu varsayılan arama motoru olarak ayarlayın.", + "settingsDDGExplanation": "Arama çubuğundaki anlık yanıtları görmek için DuckDuckGo'yu varsayılan arama motoru olarak ayarlayın.", "customSearchEngineDescription": "Arama terimini %s ile değiştir", "settingsKeyboardShortcutsHeading": "Klavye Kısayolları", "settingsKeyboardShortcutsHelp": "Birden çok kısayolu ayırmak için virgül kullanın.", @@ -195,7 +178,6 @@ "settingsProxyRules": "Vekil sunucu kuralları:", "settingsProxyBypassRules": "Vekil sunucu kullanılmasın:", "settingsProxyConfigurationURL": "Konfigürasyon Adresi", - /* app menu */ "appMenuFile": "Dosya", "appMenuNewTab": "Yeni Sekme", "appMenuDuplicateTab": "Sekmeyi Çoğalt", @@ -217,7 +199,7 @@ "appMenuZoomIn": "Yakınlaştır", "appMenuZoomOut": "Uzaklaştır", "appMenuActualSize": "Gerçek Boyut", - "appMenuFullScreen": "Tam Ekran", //on some platforms, this string is replaced with one built-in to the OS + "appMenuFullScreen": "Tam Ekran", "appMenuFocusMode": "Odak Modu", "appMenuBookmarks": "Yer İmleri", "appMenuHistory": "Geçmiş", @@ -234,7 +216,7 @@ "appMenuReportBug": "Hata Bildir", "appMenuTakeTour": "Tur atın", "appMenuViewGithub": "GitHub'da Göster", - "appMenuAbout": "%n Hakkında", //%n is replaced with app name + "appMenuAbout": "%n Hakkında", "appMenuPreferences": "Seçenekler", "appMenuServices": "Servisler", "appMenuHide": "%n i Gizle", @@ -242,74 +224,9 @@ "appMenuShowAll": "Tümünü Göster", "appMenuQuit": "%n'den Çık", "appMenuBringToFront": "Tümünü Öne Getir", - /* Tab menu */ "tabMenuNewWindow": "Sekmeyi Yeni Pencereye Taşı", "tabMenuReload": "Yeniden Yükle", - /* PDF Viewer */ "PDFInvertPage": "Sayfa renklerini ters çevir", - "PDFPageCounter": { - "unsafeHTML": " sayfanın i" - }, - /* Context Reader */ - "buttonReaderSettings": "Okuyucu Ayarları", - "buttonReaderLightTheme": "Açık", - "buttonReaderSepiaTheme": "Sepya", - "buttonReaderDarkTheme": "Koyu", - "openReaderView": "Her zaman okuyucu görünümünde aç", - "autoRedirectBannerReader": "Bu sitedeki makaleler her zaman okuyucu görünümünde açılsın mı?", - "buttonReaderRedirectYes": "Evet", - "buttonReaderRedirectNo": "Hayır", - "articleReaderView": "Orjinal Makale", - /* Download manager */ - "downloadCancel": "İptal", - "downloadStateCompleted": "Tamamlandı", - "downloadStateFailed": "İndirilemedi", - /* Update Notifications */ - "updateNotificationTitle": "Min'in yeni bir sürümü mevcut", - /* Autofill settings */ - "settingsPasswordAutoFillHeadline": "Parola Otomatik Doldurma", - "settingsSelectPasswordManager": "Desteklenen parola yöneticilerinden birini seçin:", - "keychainViewPasswords": "Kayıtlı parolaları pöster", - /* Password manager setup */ - "passwordManagerSetupHeading": "Otomatik Doldurmayı kullanabilmek için %p kurulumunu tamamlayın", - "passwordManagerSetupStep1": { - "unsafeHTML": "İlk olarak, ve ve arşivden çıkartın." - }, - "passwordManagerInstallerSetup": { - "unsafeHTML": " indirin ve dosyayı aşağıdaki kutucuğa sürükleyip bırakın:" - }, - "passwordManagerSetupLink": "%p CLI aracını indir ", - "passwordManagerSetupLinkInstaller": "%p CLI yükleyicisi", - "passwordManagerSetupStep2": "Ardından aracı aşağıdaki kutucuğa sürükleyip bırakın:", - "passwordManagerSetupDragBox": "Aracı buraya sürükleyin", - "passwordManagerSetupInstalling": "Yükleniyor...", - "passwordManagerBitwardenSignIn": "Bitwarden hesabınızı bağlamak için vault.bitwarden.com/#/settings/account adresine gidin, sayfanın altına inin ve \"View API Key\"yi seçin. Ardından değerleri aşağıdaki alanlara yapıştırın.", - "passwordManagerSetupSignIn": "Otomatik doldurmayı kullanabilmek için parola yöneticinize giriş yapın. Kimlik bilgileriniz Min içerisinde bir yere kaydedilmeyecektir.", - "disableAutofill": "Otomatik doldurmayı Devre Dışı Bırak", - "passwordManagerSetupUnlockError": "Parola kaydedicisinin kilidi açılamadı: ", - "passwordManagerSetupRetry": "Doğru dosyayı kullandığınızdan ve geçerli parolayı girdiğinizden emin olun. Dosyayı buraya sürükleyerek tekrar deneyebilirsniz.", - "passwordManagerUnlock": "Parola kayıtlarınızın kilidini açmak için %p ana parolasını girin:", - /* Password save bar */ - "passwordCaptureSavePassword": "% için parola kaydedilsin mi?", - "passwordCaptureSave": "Kaydet", - "passwordCaptureDontSave": "Kaydetme", - "passwordCaptureNeverSave": "Asla kaydetme", - "generatePassword": "Parola Oluştur", - /* Password viewer */ - "savedPasswordsHeading": "Kayıtlı Parolalar", - "savedPasswordsEmpty": "Kaydedilmiş parola yok.", - "savedPasswordsNeverSavedLabel": "Daha önce kaydedilmedi", - "deletePassword": "% için parola silinsin mi?", - /* Dialogs */ - "loginPromptTitle": "Giriş yapın %h", //%h is replaced with host, %r with realm (title of protected part of site) - "dialogConfirmButton": "Onayla", - "dialogSkipButton": "İptal", - "username": "Kullanıcı Adı", - "email": "E-Posta", - "password": "Parola", - "secretKey": "Gizli anahtar", - "openExternalApp": "Harici uygulamayı aç", - "clickToCopy": "Kopyalamak için Tıkla", - "copied": "Kopyalandı" + "PDFPageCounter": "%i / %t" } } diff --git a/package.json b/package.json index b437d28e3..378c687c4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "min", - "productName": "Min", + "name": "apu", + "productName": "Apu", "author": "PalmerAL", "version": "1.35.0", "description": "A fast, minimal browser that protects your privacy", @@ -64,8 +64,10 @@ "postinstall": "node ./scripts/setupDevEnv.js", "test": "standard --verbose js/**/*.js main/*.js", "watch": "node ./scripts/watch.js", + "watchStyles": "node ./scripts/watchStyles.js", "startElectron": "electron . --development-mode", "start": "npm run build && concurrently \"npm run watch\" \"npm run startElectron\"", + "dev": "concurrently \"npm run watch\" \"npm run watchStyles\" \"npm run startElectron\"", "buildMain": "node ./scripts/buildMain.js", "buildBrowser": "node ./scripts/buildBrowser.js", "buildBrowserStyles": "node ./scripts/buildBrowserStyles.js", diff --git a/pages/settings/index.html b/pages/settings/index.html index bc608428c..63456259a 100644 --- a/pages/settings/index.html +++ b/pages/settings/index.html @@ -367,5 +367,8 @@

+ + + diff --git a/pages/settings/settings.css b/pages/settings/settings.css index 34f5ee524..77921e654 100644 --- a/pages/settings/settings.css +++ b/pages/settings/settings.css @@ -1,6 +1,26 @@ +:root { + /* ... tus otras variables ... */ + --theme-separator-color: rgba(0,0,0,0.15); /* Color para el separador en tema claro */ + --background-dark: rgb(15, 23, 42); /* NUEVO FONDO OSCURO */ +} + +body.dark-theme, body.dark-mode { + --theme-background-color: var(--background-dark); /* Variable de tema que usa el color base */ + --theme-text-color: rgb(204, 214, 246); + --theme-accent-color: var(--secondary-color); /* O --primary-color según preferencia */ + --theme-separator-color: rgba(255,255,255,0.3); /* Color para el separador en tema oscuro - Más visible */ +} + body, html { overflow: auto; + background-color: var(--theme-background-color); + color: var(--theme-text-color); +} + +body.dark-mode { + background-color: var(--theme-background-color); + color: var(--theme-text-color); } .settings-info-subheading { @@ -38,6 +58,16 @@ html { max-width: 1000px; margin: 2.25em auto; padding: 0 1em; + border-top: 1px solid var(--theme-separator-color, rgba(0,0,0,0.15)); + padding-top: 2em; +} +.settings-container:first-of-type { + border-top: none; + padding-top: 0; + margin-top: 1em; +} +.settings-container h3 { + margin-bottom: 1.5em; } .settings-container .setting-option + .setting-option { margin: 0.5em 0; @@ -187,3 +217,21 @@ html { vertical-align: middle; margin-bottom: 0.2em; } + +/* CSS para el efecto Spotlight sobre el fondo oscuro */ +body.dark-theme::before, +body.dark-mode::before { + content: ""; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: radial-gradient( + circle 250px at var(--mouse-x, 50%) var(--mouse-y, 50%), + rgba(255, 255, 255, 0.08) 0%, + transparent 70% + ); + pointer-events: none; + z-index: 0; +} diff --git a/scripts/buildBrowserStyles.js b/scripts/buildBrowserStyles.js index ded9b3145..293d05d57 100644 --- a/scripts/buildBrowserStyles.js +++ b/scripts/buildBrowserStyles.js @@ -5,6 +5,7 @@ const outFile = path.resolve(__dirname, '../dist/bundle.css') const modules = [ 'css/base.css', + 'css/custom-theme.css', 'css/windowControls.css', 'css/modal.css', 'css/tabBar.css', diff --git a/scripts/watchStyles.js b/scripts/watchStyles.js new file mode 100644 index 000000000..05241c5c8 --- /dev/null +++ b/scripts/watchStyles.js @@ -0,0 +1,44 @@ +const chokidar = require('chokidar'); +const { exec } = require('child_process'); +const path = require('path'); + +// Directorio a observar +const watchDir = path.resolve(__dirname, '../css'); + +// Función para reconstruir los estilos +function rebuildStyles() { + console.log('🔄 Reconstruyendo estilos...'); + exec('npm run buildBrowserStyles', (error, stdout, stderr) => { + if (error) { + console.error('❌ Error al reconstruir estilos:', error); + return; + } + if (stderr) { + console.error('⚠️ Advertencias:', stderr); + } + console.log('✅ Estilos reconstruidos exitosamente'); + }); +} + +// Configurar el observador +const watcher = chokidar.watch(watchDir, { + ignored: /(^|[\/\\])\../, // ignorar archivos ocultos + persistent: true +}); + +// Eventos del observador +watcher + .on('add', path => { + console.log(`📝 Archivo ${path} ha sido añadido`); + rebuildStyles(); + }) + .on('change', path => { + console.log(`📝 Archivo ${path} ha sido modificado`); + rebuildStyles(); + }) + .on('unlink', path => { + console.log(`🗑️ Archivo ${path} ha sido eliminado`); + rebuildStyles(); + }); + +console.log('👀 Observando cambios en archivos CSS...'); \ No newline at end of file