diff --git a/noctalia-visual-layer/BarWidget.qml b/noctalia-visual-layer/BarWidget.qml new file mode 100755 index 00000000..23e53154 --- /dev/null +++ b/noctalia-visual-layer/BarWidget.qml @@ -0,0 +1,72 @@ +import Quickshell +import qs.Commons +import qs.Services.UI +import qs.Widgets + +NIconButton { + id: root + + property var pluginApi: null + + property ShellScreen screen + property string widgetId: "" + property string section: "" + + // --- LÓGICA ESTÁNDAR DE CONFIGURACIÓN (1:1 Hello World) --- + property var cfg: pluginApi?.pluginSettings || ({}) + property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({}) + + // Aquí definimos el color. Si no hay config, usa "primary" por defecto. + readonly property string iconColorKey: cfg.iconColor ?? defaults.iconColor ?? "onSurface" + + // --- DATOS PROPIOS DEL PLUGIN --- + icon: "adjustments-horizontal" + tooltipText: pluginApi?.tr("widget.tooltip") || "Noctalia Visual Layer" + + // --- ESTILOS DEL SISTEMA (1:1 Hello World) --- + // Usamos las variables globales para máxima compatibilidad + tooltipDirection: BarService.getTooltipDirection(screen?.name) + baseSize: Style.getCapsuleHeightForScreen(screen?.name) + applyUiScale: false + + customRadius: Style.radiusL // El estándar usa Radius L + + // Colores del sistema (Cápsula sólida) + colorBg: Style.capsuleColor + colorFg: Color.resolveColorKey(iconColorKey) + + border.color: Style.capsuleBorderColor + border.width: Style.capsuleBorderWidth + + // --- INTERACCIÓN --- + onClicked: { + if (pluginApi) { + pluginApi.openPanel(root.screen, this); + } + } + + // --- MENÚ CONTEXTUAL ESTÁNDAR --- + NPopupContextMenu { + id: contextMenu + + model: [ + { + "label": pluginApi?.tr("menu.settings") || "Ajustes", + "action": "settings", + "icon": "settings" + }, + ] + + onTriggered: function (action) { + contextMenu.close(); + PanelService.closeContextMenu(screen); + if (action === "settings") { + BarService.openPluginSettings(root.screen, pluginApi.manifest); + } + } + } + + onRightClicked: { + PanelService.showContextMenu(contextMenu, root, screen); + } +} diff --git a/noctalia-visual-layer/LEEME.md b/noctalia-visual-layer/LEEME.md new file mode 100755 index 00000000..fae538a8 --- /dev/null +++ b/noctalia-visual-layer/LEEME.md @@ -0,0 +1,154 @@ +

+Noctalia Visual Layer Banner +

+ +# 🦉 Noctalia Visual Layer + +### El Controlador Estético Definitivo para Hyprland + +**Noctalia Visual Layer (NVL)** es un ecosistema de personalización dinámica y no destructiva para **Hyprland** y **Noctalia Shell**, desarrollado con **Quickshell (QML)** y **Bash**. Permite cambiar animaciones, bordes, shaders y geometría al instante, sin riesgo de corromper la configuración principal del usuario. + +--- + +## ✨ Características Principales + +| Característica | Descripción | +| --- | --- | +| **🛡️ Escudo Guardián (Watchdog)** | NVL despliega una ruta externa segura y un script de autolimpieza. Si desinstalas el plugin, el sistema se autolimpia al reiniciar sin romper Hyprland. | +| **⚡ Aplicación Instantánea** | La lógica reactiva aplica cualquier cambio en milisegundos, sin necesidad de recargar. | +| **🎬 Biblioteca de Movimiento** | Desde la suavidad de *Seda* hasta la agresividad de *Cyber Glitch*. | +| **🎨 Bordes Inteligentes** | Degradados dinámicos y efectos reactivos al foco de la ventana. | +| **🕶️ Shaders en Tiempo Real** | Filtros de post-procesado (Noche, CRT, Monocromo, OLED) aplicados al vuelo. | +| **🌍 Internacionalización** | Soporte nativo multilingüe. El sistema se adapta a tu idioma automáticamente. | + +--- + +## 📂 Estructura del Proyecto + +Para garantizar la máxima estabilidad, NVL separa la lógica del plugin de la configuración que se inyecta en el sistema: + +```text +~/.config/noctalia/ +├── NVL/ # 🛡️ REFUGIO SEGURO (Generado al activar) +│ ├── overlay.conf # ARCHIVO MAESTRO: Sourced directamente por Hyprland +│ └── nvl_watchdog.sh # Script guardián para autolimpieza pasiva +│ +└── plugins/noctalia-visual-layer/ + ├── manifest.json # Metadatos y definición del plugin + ├── BarWidget.qml # Punto de entrada: Botón disparador en la barra + ├── Panel.qml # Interfaz principal (Contenedor de módulos) + │ + ├── modules/ # Lógica de la Interfaz (QML) + │ ├── WelcomeModule.qml # Panel de bienvenida y persistencia + │ ├── BorderModule.qml # Selector de estilos y colores + │ └── ... # Otros módulos (Animation, Shader, etc.) + │ + ├── assets/ # El "Motor" y Recursos + │ ├── nvl-colors.conf # DINÁMICO: Colores procesados con Alpha (Mustache) + │ ├── borders/ # Biblioteca de estilos (.conf) + │ ├── animations/ # Biblioteca de curvas de movimiento (.conf) + │ ├── shaders/ # Filtros de post-procesado (.frag) + │ ├── fragments/ # Estado actual (Simlinks de los estilos activos) + │ └── scripts/ # Bash Engine (Ensamblado y lógica de aplicación) + │ + └── i18n/ # Traducciones (Soporte para más de 16 idiomas) + +``` + +--- + +## 🚀 Instalación y Activación + +Es necesario tener **Noctalia Shell** y **Hyprland** para poder utilizar este plugin. Aquí tienes los pasos exactos para su correcta instalación: + +1. Descarga este repositorio en la ruta `~/.config/noctalia/plugins/`. +2. Una vez tengas el plugin en la ruta correcta, debes ir a la **Configuración** de Noctalia Shell e ir al apartado de **Plugins**, donde debería aparecer en la lista de instalados para poder activarlo. Una vez activo, debe aparecer en la barra de Noctalia. +3. Una vez dentro del panel, para que las modificaciones funcionen, debes activar el interruptor **"Habilitar Visual Layer"**. + +> [!NOTE] +> Al activarlo, NVL desplegará automáticamente el escudo guardián e inyectará una ruta externa segura (`source = ~/.config/noctalia/NVL/overlay.conf`) en tu `hyprland.conf`. Al apagarlo, limpiará tu configuración y eliminará el refugio seguro, dejándolo en su estado original inmaculado. + +--- + +## 🧠 Arquitectura Técnica (El Sistema de Fragmentos) + +A diferencia de otros gestores que editan archivos estáticos, NVL utiliza un flujo de **construcción dinámica** combinado con un recolector de basura pasivo: + +1. **Escaneo Dinámico:** El script `scan.sh` extrae metadatos directamente de los comentarios en los archivos de `assets/`. +2. **Generación de Fragmentos:** Al seleccionar un estilo en QML, se clona en `assets/fragments/`. +3. **Ensamblaje:** `assemble.sh` unifica todos los fragmentos activos y los escribe en la ruta externa segura (`NVL/overlay.conf`). +4. **Inyección y Protección:** Hyprland recarga el nuevo overlay externo, mientras `nvl_watchdog.sh` vigila silenciosamente la existencia del plugin en cada arranque. + +```mermaid +graph LR + A[UI QML] -->|Calcula Intención| B(Script Bash) + B -->|Genera| C[Fragmento .conf] + B -->|Despliega| W[nvl_watchdog.sh] + C -->|assemble.sh| D[NVL/overlay.conf] + D -->|reload| E[Hyprland Core] + W -->|Protege| E + +``` + +--- + +## 🛠️ Guía de Modding (Protocolo de Metadatos) + +Para añadir tus propios archivos y que aparezcan en el panel automáticamente, usa este formato en la cabecera: + +### Para Animaciones y Bordes (`.conf`) + +```ini +# @Title: Mi Estilo Épico +# @Icon: rocket +# @Color: #ff0000 +# @Tag: CUSTOM +# @Desc: Una descripción breve de tu creación. + +general { + col.active_border = rgb(ff0000) rgb(00ff00) 45deg +} + +``` + +### Para Shaders (`.frag`) + +```glsl +// @Title: Filtro Vision +// @Icon: eye +// @Color: #4ade80 +// @Tag: NIGHT +// @Desc: Descripción del post-procesado. + +void main() { ... } + +``` + +### 🎨 Iconografía + +El sistema utiliza **Tabler Icons**. Para añadir nuevos iconos, consulta el catálogo en [tabler-icons.io](https://tabler-icons.io/) y usa el nombre exacto (ej. `brand-github`, `bolt`). + +--- + +## ⚠️ Solución de Problemas + +**El panel muestra exclamaciones `!!text!!` en un estilo.** + +* El sistema no encuentra la traducción oficial. Si persiste, el sistema usará el texto de respaldo de tu archivo automáticamente (Fallback seguro). + +**He creado un estilo propio y Hyprland da error.** + +* NVL aísla los errores en `overlay.conf`. Si un estilo no carga, revisa la sintaxis de código de tu archivo personal. + +**Las animaciones de los bordes se detienen y no giran en bucle.** + +* Es una limitación conocida del motor de Hyprland al recargar la configuración en caliente sobre ventanas que ya están dibujadas en pantalla. Para solucionarlo de inmediato, basta con reabrir la ventana afectada. De todos modos, este detalle se irá disipando por sí solo a medida que abras nuevas ventanas durante tu flujo de trabajo, y funcionará de manera impecable y global la próxima vez que inicies sesión. + +--- + +## ❤️ Créditos y Autoría + +* **Arquitectura & Core:** Ximo +* **Asistencia Técnica:** Co-programado con IA (Gemini - Google) +* **Inspiración:** HyDE Project & JaKooLit. +* **Comunidad:** Gracias a todos los usuarios de Noctalia. diff --git a/noctalia-visual-layer/Panel.qml b/noctalia-visual-layer/Panel.qml new file mode 100755 index 00000000..23dd265f --- /dev/null +++ b/noctalia-visual-layer/Panel.qml @@ -0,0 +1,195 @@ +import QtQuick +import Quickshell +import Quickshell.Io +import QtQuick.Layouts +import QtQuick.Controls +import qs.Commons +import qs.Widgets +import qs.Services.UI +import "./modules" + +Item { + id: root + + // IMPORTANTE: Aseguramos el nombre estándar + property var pluginApi: null + property var runHypr: null + readonly property int barHeight: 20 + + // --- MOTOR DE SCRIPTS --- + Process { + id: bashProcess + onStdoutChanged: console.log("[SCRIPT LOG]: " + stdout) + onStderrChanged: console.log("[SCRIPT ERROR]: " + stderr) + } + + function runScript(scriptName, args) { + var scriptPath = Quickshell.env("HOME") + "/.config/noctalia/plugins/noctalia-visual-layer/assets/scripts/" + scriptName + console.log("Ejecutando: " + scriptPath + " " + args) + bashProcess.command = ["bash", scriptPath, args] + bashProcess.running = true + } + + property real contentPreferredWidth: 700 * Style.uiScaleRatio + property real contentPreferredHeight: 700 * Style.uiScaleRatio + + anchors.fill: parent + + NBox { + anchors.fill: parent + anchors.topMargin: root.barHeight + color: "transparent" + + ColumnLayout { + anchors.fill: parent + anchors.margins: Style.marginL + spacing: Style.marginM + + // 1. CABECERA CENTRADA + RowLayout { + Layout.fillWidth: true + spacing: Style.marginS + Layout.bottomMargin: Style.marginL + + Item { Layout.fillWidth: true } + + NIcon { + icon: "adjustments-horizontal" + color: Color.mPrimary + pointSize: Style.fontSizeXXL + } + + ColumnLayout { + spacing: 0 + Layout.alignment: Qt.AlignCenter + NText { + // TRADUCCIÓN: Título principal + text: root.pluginApi ? root.pluginApi.tr("panel.header_title") : "Noctalia Visual" + pointSize: Style.fontSizeXL + font.weight: Font.Bold + color: Color.mPrimary + } + NText { + // TRADUCCIÓN: Subtítulo + text: root.pluginApi ? root.pluginApi.tr("panel.header_subtitle") : "Centro de Control Estético" + pointSize: Style.fontSizeS + color: Color.mOnSurfaceVariant + } + } + + Item { Layout.fillWidth: true } + } + + // 2. BARRA DE NAVEGACIÓN + RowLayout { + Layout.fillWidth: true + spacing: 8 + + // TRADUCCIÓN: Pestañas usando las keys del JSON (panel.tabs.xxxx) + TabItem { + label: root.pluginApi ? root.pluginApi.tr("panel.tabs.home") : "Inicio" + iconName: "home" + index: 0 + accentColor: "#38bdf8" + isSelected: stackLayout.currentIndex === 0 + } + TabItem { + label: root.pluginApi ? root.pluginApi.tr("panel.tabs.animations") : "Animaciones" + iconName: "movie" + index: 1 + accentColor: "#fbbf24" + isSelected: stackLayout.currentIndex === 1 + } + TabItem { + label: root.pluginApi ? root.pluginApi.tr("panel.tabs.borders") : "Bordes" + iconName: "border-all" + index: 2 + accentColor: "#10b981" + isSelected: stackLayout.currentIndex === 2 + } + TabItem { + label: root.pluginApi ? root.pluginApi.tr("panel.tabs.effects") : "Efectos" + iconName: "wand" + index: 3 + accentColor: "#c084fc" + isSelected: stackLayout.currentIndex === 3 + } + } + + // 3. ÁREA DE CONTENIDO + NBox { + Layout.fillWidth: true + Layout.fillHeight: true + color: Color.mSurfaceVariant + radius: Style.radiusM + clip: true + + StackLayout { + id: stackLayout + anchors.fill: parent + anchors.margins: Style.marginS + currentIndex: 0 + + // Pasamos pluginApi correctamente a los hijos + WelcomeModule { pluginApi: root.pluginApi; runScript: root.runScript } + AnimationModule { pluginApi: root.pluginApi; runScript: root.runScript } + BorderModule { pluginApi: root.pluginApi; runScript: root.runScript } + ShaderModule { pluginApi: root.pluginApi; runScript: root.runScript } + } + } + } + } + + component TabItem : Rectangle { + id: tabRoot + property string label + property string iconName + property color accentColor: Color.mPrimary + property int index + property bool isSelected + + Layout.fillWidth: true + height: 40 * Style.uiScaleRatio + radius: Style.radiusM + + readonly property color currentAccent: isSelected ? Color.mPrimary : accentColor + + color: isSelected + ? Qt.alpha(Color.mPrimary, 0.15) + : (tabMouse.containsMouse ? Qt.alpha(accentColor, 0.1) : "transparent") + + border.width: 1 + border.color: isSelected + ? Color.mPrimary + : (tabMouse.containsMouse ? accentColor : Qt.alpha(accentColor, 0.2)) + + Behavior on color { ColorAnimation { duration: 150 } } + Behavior on border.color { ColorAnimation { duration: 150 } } + + MouseArea { + id: tabMouse + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: stackLayout.currentIndex = index + } + + RowLayout { + anchors.centerIn: parent + spacing: 8 + + NIcon { + icon: iconName + color: (isSelected || tabMouse.containsMouse) ? tabRoot.currentAccent : Color.mOnSurfaceVariant + Behavior on color { ColorAnimation { duration: 150 } } + } + + NText { + text: label + font.weight: isSelected ? Font.Bold : Font.Normal + color: (isSelected || tabMouse.containsMouse) ? Color.mOnSurface : Color.mOnSurfaceVariant + pointSize: Style.fontSizeS + } + } + } +} diff --git a/noctalia-visual-layer/README.md b/noctalia-visual-layer/README.md new file mode 100755 index 00000000..f5de14c9 --- /dev/null +++ b/noctalia-visual-layer/README.md @@ -0,0 +1,154 @@ +

+Noctalia Visual Layer Banner +

+ +# 🦉 Noctalia Visual Layer + +### Dynamic Visual Layer for Hyprland Customization + +**Noctalia Visual Layer (NVL)** is a dynamic and non-destructive customization ecosystem for **Hyprland** and **Noctalia Shell**, developed with **Quickshell (QML)** and **Bash**. It allows you to instantly change animations, borders, shaders, and geometry, without any risk of corrupting the user's main configuration. + +--- + +## ✨ Key Features + +| Feature | Description | +| --- | --- | +| **🛡️ Guardian Shield (Watchdog)** | NVL deploys a secure external path and an auto-cleanup script. If you uninstall the plugin, the system self-cleans on the next reboot without crashing Hyprland. | +| **⚡ Instant Application** | The reactive logic applies any change in milliseconds, without the need to reload the session. | +| **🎬 Motion Library** | From the smoothness of *Silk* to the aggressiveness of *Cyber Glitch*. | +| **🎨 Smart Borders** | Dynamic gradients and reactive effects tied to window focus. | +| **🕶️ Real-Time Shaders** | Post-processing filters (Night, CRT, Monochrome, OLED) applied on the fly. | +| **🌍 Internationalization** | Native multilingual support. The system automatically adapts to your system's language. | + +--- + +## 📂 Project Structure + +To ensure maximum stability, NVL separates the plugin logic from the configuration injected into the system: + +```text +~/.config/noctalia/ +├── NVL/ # 🛡️ THE SAFE REFUGE (Generated on activation) +│ ├── overlay.conf # MASTER CONFIG: Sourced directly by Hyprland +│ └── nvl_watchdog.sh # Guardian script for passive auto-cleanup +│ +└── plugins/noctalia-visual-layer/ + ├── manifest.json # Plugin metadata and definitions + ├── BarWidget.qml # Entry Point: Taskbar trigger icon + ├── Panel.qml # Main UI Container (Module host) + │ + ├── modules/ # UI Components (QML) + │ ├── WelcomeModule.qml # Persistence & Welcome screen + │ ├── BorderModule.qml # Style & Geometry selector + │ └── ... # Animation and Shader modules + │ + ├── assets/ # The "Engine" & Resources + │ ├── nvl-colors.conf # DYNAMIC: Processed colors with Alpha support + │ ├── borders/ # Border styles library (.conf) + │ ├── animations/ # Movement & Bezier curves library (.conf) + │ ├── shaders/ # GLSL Post-processing filters (.frag) + │ ├── fragments/ # Symlinks of current active styles + │ └── scripts/ # Bash Engine (Assembly and logic) + │ + └── i18n/ # Multilingual support (16+ Translations) + +``` + +--- + +## 🚀 Installation and Activation + +**Noctalia Shell** and **Hyprland** are required to use this plugin. Here are the exact steps for a proper installation: + +1. Download this repository into the path `~/.config/noctalia/plugins/`. +2. Once the plugin is in the correct directory, go to Noctalia Shell's **Settings** and navigate to the **Plugins** section. It should appear in the installed list, where you can enable it. Once active, the plugin icon will appear in your Noctalia bar. +3. Open the plugin panel and toggle the **"Enable Visual Layer"** switch to allow the modifications to take effect. + +> [!NOTE] +> When activated, NVL will automatically deploy the guardian shield and inject a secure source line (`source = ~/.config/noctalia/NVL/overlay.conf`) into your `hyprland.conf`. When deactivated, it will clean up your configuration and delete the safe refuge, leaving your system in its pristine original state. + +--- + +## 🧠 Technical Architecture (The Fragment System) + +Unlike other managers that edit static files directly, NVL uses a **dynamic construction** flow combined with a passive garbage collector: + +1. **Dynamic Scanning:** The `scan.sh` script extracts metadata directly from the comments within the `assets/` files. +2. **Fragment Generation:** When a style is selected via QML, it is cloned into `assets/fragments/`. +3. **Assembly:** The `assemble.sh` script unifies all active fragments and writes them to the external safe directory (`NVL/overlay.conf`). +4. **Injection & Protection:** Hyprland reloads the new external overlay, while `nvl_watchdog.sh` silently monitors the plugin's existence on every boot. + +```mermaid +graph LR + A[UI QML] -->|Calculates Intent| B(Bash Script) + B -->|Generates| C[.conf Fragment] + B -->|Deploys| W[nvl_watchdog.sh] + C -->|assemble.sh| D[NVL/overlay.conf] + D -->|reload| E[Hyprland Core] + W -->|Protects| E + +``` + +--- + +## 🛠️ Modding Guide (Metadata Protocol) + +To add your own custom files and have them automatically appear in the panel, use the following header format: + +### For Animations and Borders (`.conf`) + +```ini +# @Title: My Epic Style +# @Icon: rocket +# @Color: #ff0000 +# @Tag: CUSTOM +# @Desc: A brief description of your creation. + +general { + col.active_border = rgb(ff0000) rgb(00ff00) 45deg +} + +``` + +### For Shaders (`.frag`) + +```glsl +// @Title: Vision Filter +// @Icon: eye +// @Color: #4ade80 +// @Tag: NIGHT +// @Desc: Post-processing description. + +void main() { ... } + +``` + +### 🎨 Iconography + +The system utilizes **Tabler Icons**. To add new icons, browse the catalog at [tabler-icons.io](https://tabler-icons.io/) and use the exact icon name (e.g., `brand-github`, `bolt`). + +--- + +## ⚠️ Troubleshooting + +**The panel displays exclamation marks `!!text!!` in a style name/description.** + +* The system cannot find the official translation key. If the issue persists, the system will safely fallback to the raw text provided in your file. + +**I created a custom style and Hyprland throws an error.** + +* NVL isolates all errors within `overlay.conf`. If a custom style fails to load, double-check the Hyprland syntax in your personal `.conf` file. + +**Border animations stop looping and freeze.** + +* This is a known limitation of the Hyprland engine when hot-reloading the configuration on currently drawn windows. The immediate solution is to simply reopen the affected window. Regardless, this issue will naturally fade away as you open new windows during your regular workflow, and the looping effect will apply flawlessly across the board upon your next session restart. + +--- + +## ❤️ Credits and Authorship + +* **Architecture & Core:** Ximo +* **Technical Assistance:** Co-programmed with AI (Gemini - Google) +* **Inspiration:** HyDE Project & JaKooLit. +* **Community:** Thanks to all Noctalia users. diff --git a/noctalia-visual-layer/assets/animations/01_relampago.conf b/noctalia-visual-layer/assets/animations/01_relampago.conf new file mode 100755 index 00000000..00a0497f --- /dev/null +++ b/noctalia-visual-layer/assets/animations/01_relampago.conf @@ -0,0 +1,42 @@ +# @Title: Relámpago +# @Icon: bolt +# @Color: #f87171 +# @Tag: FAST +# @Desc: Máxima respuesta visual. + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# +animations { + enabled = true + + # --- BEZIERS (CURVAS DE VELOCIDAD) --- + # "Lightning": Empieza ultra rápido y frena en seco al final. + bezier = lightning, 0.05, 0.9, 0.1, 1.05 + # "Smooth": Lineal pero suave para fades. + bezier = smooth, 0.25, 1, 0.5, 1 + # "Instant": Casi instantáneo para movimiento. + bezier = instant, 0, 1, 0, 1 + + # --- VENTANAS (El núcleo del cambio) --- + # Entrada: Muy rápida (Speed 2), aparece al 80% (menos recorrido visual). + animation = windowsIn, 1, 2, lightning, popin 80% + + # Salida: Fugaz (Speed 1.5). Desaparece más rápido de lo que llegó. + animation = windowsOut, 1, 1.5, lightning, popin 80% + + # Movimiento: Pegado al ratón. Speed 1.5 hace que se sienta eléctrico. + animation = windowsMove, 1, 1.5, instant, slide + + # --- CAPAS Y FADES --- + animation = fade, 1, 2, smooth + animation = layers, 1, 2, lightning, fade + animation = layersIn, 1, 2, lightning, fade + animation = layersOut, 1, 1.5, lightning, fade + + # --- ESPACIOS DE TRABAJO --- + # Slidefade: Desliza pero se desvanece un 20%. Da sensación de velocidad warp. + animation = workspaces, 1, 2.5, lightning, slidefade 20% + animation = specialWorkspace, 1, 2.5, lightning, slidevert +} diff --git a/noctalia-visual-layer/assets/animations/02_inercia_elastica.conf b/noctalia-visual-layer/assets/animations/02_inercia_elastica.conf new file mode 100755 index 00000000..243044b1 --- /dev/null +++ b/noctalia-visual-layer/assets/animations/02_inercia_elastica.conf @@ -0,0 +1,52 @@ +# @Title: Inercia Elástica +# @Icon: adjustments +# @Color: #60a5fa +# @Tag: PHYSICS +# @Desc: Movimiento orgánico. Las ventanas toman impulso al salir y rebotan al entrar. + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# + +animations { + enabled = true + + # --- BEZIERS DE FÍSICA --- + + # 1. ANTICIPACIÓN (Para cerrar): + # La curva baja a -0.1 (toma impulso atrás) y luego dispara a 1. + bezier = anticipate, 0.1, -0.1, 0.1, 1.0 + + # 2. INERCIA (Para abrir): + # Llega rápido y se pasa un poco (1.05) para asentarse suavemente. + bezier = inertia, 0.05, 0.9, 0.1, 1.05 + + # 3. FRICCIÓN (Para mover): + # Empieza rápido, termina muy suave. + bezier = friction, 0.05, 0.9, 0.1, 1.0 + + # --- ANIMACIONES --- + + # ENTRADA: Inercia pura. + # Usamos 'slide' para que entre desde abajo/lado como una carta física. + animation = windowsIn, 1, 5, inertia, slide + + # SALIDA: Anticipación. + # Fíjate en el efecto: la ventana retrocede un milímetro antes de irse volando. + # Bajamos la velocidad a 6 para que dé tiempo a ver ese "impulso". + animation = windowsOut, 1, 6, anticipate, slide + + # MOVIMIENTO: Fricción. + # Sin rebotes raros, solo suavidad al arrastrar. + animation = windowsMove, 1, 5, friction, slide + + # CAPAS Y FADES: Sincronizados. + # Bajamos de 10 a 5. Ahora la opacidad va a la par que el movimiento. + animation = fade, 1, 5, friction + animation = layers, 1, 5, friction, fade + + # WORKSPACES: + # 'slidefade 20%' da una sensación de profundidad 3D muy moderna. + animation = workspaces, 1, 6, inertia, slidefade 20% +} diff --git a/noctalia-visual-layer/assets/animations/03_seda_minimalista.conf b/noctalia-visual-layer/assets/animations/03_seda_minimalista.conf new file mode 100755 index 00000000..b53bb7af --- /dev/null +++ b/noctalia-visual-layer/assets/animations/03_seda_minimalista.conf @@ -0,0 +1,42 @@ +# @Title: Seda Minimalista +# @Icon: circle-dot +# @Color: #818cf8 +# @Tag: SOFT +# @Desc: Suavidad absoluta. Sin rebotes, solo aterrizajes perfectos estilo macOS. + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# + +animations { + enabled = yes + + # --- BEZIERS (MATEMÁTICA PURA) --- + # Quartic Out: La curva de la elegancia. Frena muy suavemente. + bezier = quart, 0.25, 1, 0.5, 1 + + # Expo Out: Para los escritorios, queremos que el final sea aún más suave. + bezier = expo, 0.16, 1, 0.3, 1 + + # --- VENTANAS (El cambio a Popin) --- + # ENTRADA: 'popin 80%'. La ventana nace desde el centro (al 80% de tamaño) y crece. + # Es mucho más elegante que verla volar desde un lado de la pantalla. + animation = windowsIn, 1, 6, quart, popin 80% + + # SALIDA: Un poco más rápida (Velocidad 5) para que no estorbe. + animation = windowsOut, 1, 5, quart, popin 80% + + # MOVIMIENTO: Usamos 'quart' para que la ventana tenga peso al arrastrarla. + animation = windowsMove, 1, 6, quart, slide + + # --- CAPAS --- + # Los menús se desvanecen suavemente. + animation = fade, 1, 6, quart + + # --- ESPACIOS DE TRABAJO --- + # AQUÍ ESTÁ EL TRUCO: 'slidefade 20%' + # En lugar de solo deslizar, el escritorio viejo se oscurece un poco y se aleja. + # Da una sensación de profundidad 3D muy sutil. + animation = workspaces, 1, 6, expo, slidefade 20% +} diff --git a/noctalia-visual-layer/assets/animations/04_minimalismo_snappy.conf b/noctalia-visual-layer/assets/animations/04_minimalismo_snappy.conf new file mode 100755 index 00000000..5f9cbc12 --- /dev/null +++ b/noctalia-visual-layer/assets/animations/04_minimalismo_snappy.conf @@ -0,0 +1,36 @@ +# @Title: Minimalismo Snappy +# @Icon: bolt +# @Color: #94a3b8 +# @Tag: SNAPPY +# @Desc: Optimizado para la máxima velocidad. Solo gestión de ventanas y workspaces. + + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# + +animations { + enabled = true + + # Beziers específicos de movimiento + bezier = winIn, 0.07, 0.88, 0.04, 0.99 + bezier = menu_decel, 0.05, 0.82, 0, 1 + bezier = menu_accel, 0.38, 0, 1, 1 # <--- ¡AÑADIDO! La pieza que faltaba + bezier = md3_decel, 0.05, 0.8, 0.1, 0.97 + bezier = easeOutCirc, 0, 0.48, 0.38, 1 + + # Animaciones de Ventanas + animation = windowsIn, 1, 3.2, winIn, slide + animation = windowsOut, 1, 2.8, easeOutCirc, slide # Añadido 'slide' para evitar saltos + animation = windowsMove, 1, 3.0, md3_decel, slide + + # Fades y Capas + animation = fade, 1, 1.8, md3_decel + animation = layersIn, 1, 1.8, menu_decel, slide + animation = layersOut, 1, 1.5, menu_accel, slide # Ahora 'menu_accel' ya existe + + # Espacios de trabajo + animation = workspaces, 1, 4.0, menu_decel, slidefade 20% + animation = specialWorkspace, 1, 2.3, md3_decel, slidefadevert 15% +} diff --git a/noctalia-visual-layer/assets/animations/05_material_moderno.conf b/noctalia-visual-layer/assets/animations/05_material_moderno.conf new file mode 100755 index 00000000..a206ec0f --- /dev/null +++ b/noctalia-visual-layer/assets/animations/05_material_moderno.conf @@ -0,0 +1,52 @@ +# @Title: Material Moderno +# @Icon: layers-intersect +# @Color: #c084fc +# @Tag: MODERN +# @Desc: Estética Google Pixel. Animaciones orgánicas, escalas sutiles y respuesta táctil. + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# + +animations { + enabled = true + + # --- BEZIERS (Oficiales de Android) --- + # Decel: Para cosas que entran (frenan al llegar) + bezier = md3_decel, 0.05, 0.7, 0.1, 1 + # Accel: Para cosas que salen (aceleran al irse) + bezier = md3_accel, 0.3, 0, 0.8, 0.15 + # Standard: Para movimientos dentro de la pantalla + bezier = md3_standard, 0.2, 0, 0, 1 + + # --- VENTANAS (Escala Sutil) --- + # Entrada: 'popin 80%'. Menos recorrido, más elegancia. + # Velocidad 4: Un poco más suave que el estándar para apreciar la curva. + animation = windowsIn, 1, 4, md3_decel, popin 80% + + # Salida: 'popin 80%'. Se encoge ligeramente al desaparecer. + # Velocidad 3: Rápida, no queremos esperar a que se cierre. + animation = windowsOut, 1, 3, md3_accel, popin 80% + + # Movimiento: [CRÍTICO] Definido explícitamente como 'slide'. + # Usamos 'md3_standard' para que se sienta pegado al ratón pero con peso. + animation = windowsMove, 1, 3, md3_standard, slide + + # --- CAPAS Y MENÚS (Coherencia) --- + animation = fade, 1, 3, md3_decel + + # Layers: Si entra deslizando, sale deslizando. + animation = layersIn, 1, 3, md3_decel, slide + animation = layersOut, 1, 3, md3_accel, slide + animation = fadeLayersIn, 1, 2, md3_decel + animation = fadeLayersOut, 1, 2, md3_accel + + # --- ESPACIOS DE TRABAJO (Profundidad) --- + # Usamos 'slidefade 20%' para simular la navegación por gestos de Android. + # El escritorio anterior se oscurece ligeramente al irse. + animation = workspaces, 1, 5, md3_decel, slidefade 20% + + # Special: Slide vertical (como el cajón de aplicaciones). + animation = specialWorkspace, 1, 3, md3_decel, slidevert +} diff --git a/noctalia-visual-layer/assets/animations/06_impacto_clasico.conf b/noctalia-visual-layer/assets/animations/06_impacto_clasico.conf new file mode 100755 index 00000000..5604ebb4 --- /dev/null +++ b/noctalia-visual-layer/assets/animations/06_impacto_clasico.conf @@ -0,0 +1,51 @@ +# @Title: Impacto Clásico +# @Icon: flame +# @Color: #fb7185 +# @Tag: FX +# @Desc: Efecto "Jelly". Rebote elástico al entrar y anticipación al salir. + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# + +animations { + enabled = true + + # --- BEZIERS DE CARÁCTER --- + + # 1. ELASTIC (Entrada): Sube rápido y rebota al final (Overshoot). + bezier = elastic, 0.05, 0.9, 0.1, 1.05 + + # 2. RETRO (Salida): Toma impulso hacia atrás (BackIn) y acelera. + # Esto hace que la ventana parezca que se "encoge" antes de desaparecer. + bezier = retro, 0.6, -0.28, 0.735, 0.045 + + # 3. SMOOTH (Movimiento): Para arrastrar ventanas sin que parezca gelatina. + bezier = smooth, 0.1, 1, 0.1, 1 + + # --- VENTANAS --- + + # ENTRADA: Velocidad 6. El 'popin 80%' combinado con 'elastic' crea el efecto rebote. + animation = windowsIn, 1, 6, elastic, popin 80% + + # SALIDA: Velocidad 5 (Un poco más rápida). + # La curva 'retro' hace que se chupe hacia adentro antes de irse. + animation = windowsOut, 1, 5, retro, popin 80% + + # MOVIMIENTO: Usamos 'slide' y una curva suave. + # Si usáramos 'elastic' aquí, la ventana vibraría al soltarla, lo cual marea. + animation = windowsMove, 1, 5, smooth, slide + + # --- RESTO DEL SISTEMA --- + + # Fades estándar + animation = fade, 1, 5, smooth + + # Workspaces: Les damos el mismo rebote 'elastic' para que todo el sistema + # se sienta juguetón y coherente. + animation = workspaces, 1, 6, elastic, slide + + # Special: Slide vertical con rebote. + animation = specialWorkspace, 1, 6, elastic, slidevert +} diff --git a/noctalia-visual-layer/assets/animations/07_lineal.conf b/noctalia-visual-layer/assets/animations/07_lineal.conf new file mode 100755 index 00000000..d662c867 --- /dev/null +++ b/noctalia-visual-layer/assets/animations/07_lineal.conf @@ -0,0 +1,43 @@ +# @Title: Lineal +# @Icon: chart-line +# @Color: #2dd4bf +# @Tag: FLAT +# @Desc: Precisión matemática. Movimiento constante estilo "Sci-Fi HUD". + + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# + +# ----------------------------------------------------- +# Optimizado por NVL: Velocidad aumentada para evitar sensación de lag. +# ----------------------------------------------------- + +animations { + enabled = true + + # --- BEZIER LINEAL ESTÁNDAR --- + # Definición matemática correcta de una recta de 0 a 1. + bezier = linear, 0.0, 0.0, 1.0, 1.0 + + # --- VENTANAS (Estilo Máquina) --- + # Velocidad 5: Lo suficientemente rápido para que el "golpe" final no moleste. + # Usamos 'slide' puro. Sin escalas ni transparencias raras. + animation = windowsIn, 1, 5, linear, slide + animation = windowsOut, 1, 5, linear, slide + + # Movimiento: Aquí la linealidad se siente muy "raw" (cruda). + # La ventana sigue al ratón exactamente, sin peso. + animation = windowsMove, 1, 5, linear, slide + + # --- FADES Y CAPAS --- + # Los desvanecimientos lineales deben ser rápidos. + animation = fade, 1, 4, linear + animation = layers, 1, 4, linear, fade + + # --- ESPACIOS DE TRABAJO --- + # Slide simple. Es como pasar diapositivas de un proyector antiguo. + # Seco, rápido y funcional. + animation = workspaces, 1, 5, linear, slide +} diff --git a/noctalia-visual-layer/assets/animations/08_cristal.conf b/noctalia-visual-layer/assets/animations/08_cristal.conf new file mode 100755 index 00000000..b50fa55f --- /dev/null +++ b/noctalia-visual-layer/assets/animations/08_cristal.conf @@ -0,0 +1,53 @@ +# @Title: Cristal +# @Icon: droplet +# @Color: #38bdf8 +# @Tag: VIBE +# @Desc: Deslizamiento etéreo. Sensación de vidrio flotando sin fricción. + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# + +# ----------------------------------------------------- +# Optimizado por NVL: Eliminados los rebotes elásticos. +# Enfoque en suavidad "Glass" y transparencias. +# ----------------------------------------------------- + +animations { + enabled = yes + + # --- BEZIERS (CRISTALINOS) --- + + # "Glass": Una curva exponencial suave. + # Empieza rápido y frena con una suavidad extrema al final (sin rebote). + bezier = glass, 0.16, 1, 0.3, 1 + + # "Fade": Lineal pero suavizado para las opacidades. + bezier = fade, 0.33, 1, 0.68, 1 + + # --- VENTANAS --- + + # ENTRADA: Usamos 'slide' pero con la curva 'glass'. + # La ventana entra deslizando como si estuviera sobre hielo/vidrio. + # Velocidad 6: Lenta y elegante. + animation = windowsIn, 1, 6, glass, slide + + # SALIDA: Aquí aplicamos el "toque etéreo". + # Usamos 'popin 90%'. La ventana se aleja un poquito mientras desaparece. + animation = windowsOut, 1, 6, glass, popin 90% + + # MOVIMIENTO: Absolutamente fluido. + animation = windowsMove, 1, 6, glass, slide + + # --- FADES (Protagonistas) --- + # Para un efecto "Cristal", los fades deben ser notables. + # Velocidad 7: Las cosas tardan un poco en volverse sólidas. + animation = fade, 1, 7, fade + animation = layers, 1, 6, glass, fade + + # --- ESPACIOS DE TRABAJO --- + # 'slidefade 10%' es clave aquí. + # El movimiento es sutil y transparente, no agresivo. + animation = workspaces, 1, 6, glass, slidefade 10% +} diff --git a/noctalia-visual-layer/assets/animations/09_seda_silk.conf b/noctalia-visual-layer/assets/animations/09_seda_silk.conf new file mode 100755 index 00000000..701c0a9e --- /dev/null +++ b/noctalia-visual-layer/assets/animations/09_seda_silk.conf @@ -0,0 +1,57 @@ +# @Title: Seda (Silk) +# @Icon: feather +# @Color: #4ade80 +# @Tag: HYBRID +# @Desc: El estilo JaKooLit refinado. Entradas con energía, salidas fugaces y workspaces estables. + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# + +# ----------------------------------------------------- +# Optimizado por NVL: Se ha suavizado el rebote en los +# workspaces para evitar mareos (Motion Sickness). +# ----------------------------------------------------- + +animations { + enabled = yes + + # --- BEZIERS (La Firma de JaKooLit) --- + + # "Overshot": El rebote estándar perfecto. + # Sube rápido, se pasa un 5% y vuelve. Se siente orgánico. + bezier = overshot, 0.05, 0.9, 0.1, 1.05 + + # "SmoothOut": Una curva suave para salidas rápidas. + # Empieza suave, acelera y termina suave. Sin tirones. + bezier = smoothOut, 0.3, 0, 0.3, 1 + + # "Crazy": (Opcional) Si quieres mantener esa entrada agresiva del original. + # Lo usaremos solo para la entrada de ventanas, NO para workspaces. + bezier = crazy, 0.1, 1.1, 0.1, 1.1 + + # --- VENTANAS (Energía Controlada) --- + + # ENTRADA: Usamos 'overshot' (o 'crazy' si quieres más rebote). + # 'popin 80%' + 'slide' crea ese efecto de que la ventana se lanza hacia ti. + # Velocidad 6: Se nota la fluidez. + animation = windowsIn, 1, 6, overshot, slide + + # SALIDA: Rápida (Velocidad 4). + # La ventana se va sin molestar usando la curva suave. + animation = windowsOut, 1, 4, smoothOut, slide + + # MOVIMIENTO: Fluido y conectado al ratón. + animation = windowsMove, 1, 5, overshot, slide + + # --- CAPAS Y FADES --- + animation = fade, 1, 5, smoothOut + animation = layers, 1, 5, overshot, slide + + # --- ESPACIOS DE TRABAJO (Aquí está la mejora) --- + # En lugar de usar curvas locas, usamos 'overshot' estándar. + # El cambio de escritorio tiene un pequeño "asentamiento" al final, + # pero ya no parece que la pantalla sea de gelatina. + animation = workspaces, 1, 6, overshot, slide +} diff --git a/noctalia-visual-layer/assets/animations/10_retro_arcade.conf b/noctalia-visual-layer/assets/animations/10_retro_arcade.conf new file mode 100755 index 00000000..c7615f32 --- /dev/null +++ b/noctalia-visual-layer/assets/animations/10_retro_arcade.conf @@ -0,0 +1,58 @@ +# @Title: Retro Arcade +# @Icon: device-gamepad-2 +# @Color: #f472b6 +# @Tag: 80s +# @Desc: Efecto "Toon/Arcade". Las ventanas saltan y rebotan exageradamente. + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# + +# ----------------------------------------------------- +# Optimizado por NVL: Hemos movido la curva "loca" +# del movimiento (donde molestaba) a la entrada (donde divierte). +# ----------------------------------------------------- + +animations { + enabled = true + + # --- BEZIERS ARCADE --- + + # "JUMP" (Tu antigua smoothIn): La joya de la corona. + # Retrocede mucho y rebota mucho. Perfecto para ventanas que "saltan". + bezier = jump, 0.5, -0.3, 0.68, 1.4 + + # "SQUASH" (Para cerrar): + # Anticipación para coger impulso y desaparecer. + bezier = squash, 0.5, -0.5, 0.1, 1.0 + + # "RUBBER" (Para mover): + # Un rebote más controlado para que arrastrar no sea un suplicio. + bezier = rubber, 0.05, 0.9, 0.1, 1.05 + + # --- VENTANAS (El Show) --- + + # ENTRADA: 'popin 80%' + 'jump'. + # La ventana aparece pequeña, se encoge un milisegundo y ¡BOING! explota en pantalla. + # Velocidad 5 para que se aprecie la caricatura. + animation = windowsIn, 1, 5, jump, popin 80% + + # SALIDA: 'popin 80%' + 'squash'. + # La ventana se encoge drásticamente (como si la aspiraran) antes de irse. + animation = windowsOut, 1, 4, squash, popin 80% + + # MOVIMIENTO: Usamos 'rubber' (overshot estándar). + # Queremos que sea divertido pero controlable. + animation = windowsMove, 1, 4, rubber, slide + + # --- RESTO DEL SISTEMA --- + + # Fades: Rápidos y simples para no distraer del show principal. + animation = fade, 1, 3, default + + # Workspaces: ¡BOING! + # Cambiar de escritorio hace que toda la pantalla rebote. + # Es un efecto muy fuerte, pero encaja perfecto con el tema "Retro". + animation = workspaces, 1, 5, jump, slide +} diff --git a/noctalia-visual-layer/assets/animations/11_futurista.conf b/noctalia-visual-layer/assets/animations/11_futurista.conf new file mode 100755 index 00000000..165bac43 --- /dev/null +++ b/noctalia-visual-layer/assets/animations/11_futurista.conf @@ -0,0 +1,57 @@ +# @Title: Futurista +# @Icon: cpu +# @Color: #22d3ee +# @Tag: TECH +# @Desc: Interfaz holográfica. Precisión digital, cero rebotes y flujo de datos vertical. + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# + +# ----------------------------------------------------- +# Optimizado por NVL: Eliminada la elasticidad. +# Ahora usa curvas exponenciales para una precisión "Robótica". +# ----------------------------------------------------- + +animations { + enabled = true + + # --- BEZIERS TECH --- + + # "Holo": Curva Exponencial (Quint). + # Sale disparada y frena en seco justo en el píxel exacto. + bezier = holo, 0.23, 1, 0.32, 1 + + # "Data": Lineal-Suavizada. Para flujos de información continuos. + bezier = data, 0.16, 1, 0.3, 1 + + # --- VENTANAS (Proyección) --- + + # ENTRADA: 'slide' desde abajo. + # Parece que la ventana "emerge" de la consola. + # Velocidad 5: Rápida pero visible. + animation = windowsIn, 1, 5, holo, slide + + # SALIDA: 'popin 100%' + 'slide'. + # La ventana no cambia de tamaño, simplemente se desliza y se apaga. + # Velocidad 4: Desconexión rápida. + animation = windowsOut, 1, 4, holo, popin 100% + + # MOVIMIENTO: Precisión quirúrgica. + # La ventana sigue al ratón sin peso, como un cursor láser. + animation = windowsMove, 1, 5, holo, slide + + # --- FADES (Digitales) --- + animation = fade, 1, 5, data + animation = layers, 1, 5, holo, fade + + # --- ESPACIOS DE TRABAJO (The Matrix Style) --- + # AQUÍ ESTÁ LA CLAVE: 'slidevert' (Deslizamiento Vertical). + # Cambiar de escritorio se siente como hacer scroll en una terminal gigante. + # Muy "Cyberpunk". + animation = workspaces, 1, 6, holo, slidevert + + # Special: Lo mismo, coherencia vertical total. + animation = specialWorkspace, 1, 6, holo, slidevert +} diff --git a/noctalia-visual-layer/assets/animations/12_rebote.conf b/noctalia-visual-layer/assets/animations/12_rebote.conf new file mode 100755 index 00000000..a2723151 --- /dev/null +++ b/noctalia-visual-layer/assets/animations/12_rebote.conf @@ -0,0 +1,58 @@ +# @Title: Rebote +# @Icon: trending-up +# @Color: #fbbf24 +# @Tag: BOUNCY +# @Desc: Física de muelle vertical. Las ventanas caen y rebotan al abrirse. + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# + +# ----------------------------------------------------- +# Optimizado por NVL: Convertido de "Ascensor Rápido" +# a "Muelle Físico Real". +# ----------------------------------------------------- + +animations { + enabled = true + + # --- BEZIERS DE FÍSICA --- + + # "Spring" (El Muelle): + # Sube rápido, se pasa hasta el 1.1 (10% extra) y vuelve a su sitio. + bezier = spring, 0.05, 0.9, 0.1, 1.1 + + # "Crouch" (Agacharse): + # Antes de saltar (cerrarse), se encoge un poco hacia abajo (-0.1). + bezier = crouch, 0.1, -0.1, 0.1, 1.0 + + # --- VENTANAS (Efecto Gravedad) --- + + # ENTRADA: 'popin 80%' + 'spring'. + # La ventana cae desde arriba (o crece) y BOING, rebota al llegar. + # Velocidad 5: Necesitamos tiempo para ver el rebote. + animation = windowsIn, 1, 5, spring, popin 80% + + # SALIDA: 'popin 80%' + 'crouch'. + # La ventana hace el gesto de coger impulso hacia abajo y desaparece. + animation = windowsOut, 1, 5, crouch, popin 80% + + # MOVIMIENTO: Fluido pero con un toque elástico. + animation = windowsMove, 1, 5, spring, slide + + # --- FADES --- + animation = fade, 1, 3, default + animation = fadeLayersIn, 1, 3, default + animation = layers, 1, 4, spring, popin + + # --- ESPACIOS DE TRABAJO (El Pogo Stick) --- + # Mantenemos tu idea original de verticalidad ('slidevert'). + # Al cambiar de escritorio, la pantalla entera sube/baja y rebota al frenar. + # Es un efecto muy divertido. + animation = workspaces, 1, 5, spring, slidevert + + # Gestos (Comentados por seguridad, mejor en hyprland.conf) + # gesture = 3, horizontal, unset + # gesture = 3, vertical, workspace +} diff --git a/noctalia-visual-layer/assets/animations/13_organico.conf b/noctalia-visual-layer/assets/animations/13_organico.conf new file mode 100755 index 00000000..4b3909ea --- /dev/null +++ b/noctalia-visual-layer/assets/animations/13_organico.conf @@ -0,0 +1,56 @@ +# ----------------------------------------------------- +# @Title: Orgánico +# @Icon: leaf +# @Color: #a3e635 +# @Tag: NATURE +# @Desc: Movimiento de "brote". Crecimiento vertical suave y desvanecimientos lentos. +# ----------------------------------------------------- + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# + +# >>> Optimizado por NVL: Limpieza de redundancias y física de planta. <<< + +animations { + enabled = yes + + # --- BEZIERS NATURALES --- + + # "Sprout" (Brote): + # Empieza lento, sube y se asienta con una suavidad extrema. + # No tiene rebote agresivo, es como una hoja mecida por el viento. + bezier = sprout, 0.25, 0.8, 0.25, 1.0 + + # "Wind" (Viento): + # Un ligero overshot (1.05) para cuando movemos ventanas, + # para que no parezcan piedras, sino algo ligero. + bezier = wind, 0.05, 0.9, 0.1, 1.05 + + # --- VENTANAS (Fotosíntesis) --- + + # ENTRADA: 'popin 85%'. + # La ventana "brota" casi a tamaño completo. + # Velocidad 6: Lento y relajante. + animation = windowsIn, 1, 6, sprout, popin 85% + + # SALIDA: 'popin 95%'. + # Apenas se encoge. Simplemente se evapora como el rocío. + animation = windowsOut, 1, 5, sprout, popin 95% + + # MOVIMIENTO: Usamos 'wind' para que se sienta ligero al arrastrar. + animation = windowsMove, 1, 5, wind, slide + + # --- FADES (Niebla) --- + # Velocidad 7: Transparencias muy lentas y oníricas. + animation = fade, 1, 7, sprout + + # Capas: Entran suavemente creciendo. + animation = layers, 1, 5, sprout, popin + + # --- ESPACIOS DE TRABAJO (Enredadera) --- + # Mantenemos tu 'slidevert'. + # Moverse entre escritorios se siente como trepar por una enredadera. + animation = workspaces, 1, 6, sprout, slidevert +} diff --git a/noctalia-visual-layer/assets/animations/14_elastico.conf b/noctalia-visual-layer/assets/animations/14_elastico.conf new file mode 100755 index 00000000..16418b7b --- /dev/null +++ b/noctalia-visual-layer/assets/animations/14_elastico.conf @@ -0,0 +1,57 @@ +# @Title: Elástico +# @Icon: arrows-diagonal +# @Color: #6366f1 +# @Tag: FLEX +# @Desc: Física de banda elástica. Las ventanas llegan, se estiran y rebotan verticalmente. + + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# + +# ----------------------------------------------------- +# Optimizado por NVL: Se ha inyectado física real de rebote +# (Overshoot del 15%) para justificar el nombre "Elástico". +# ----------------------------------------------------- + +animations { + enabled = yes + + # --- BEZIERS ELÁSTICOS --- + + # "Rubber" (La Goma): + # Sube muy rápido y se pasa bastante (1.15) para crear vibración visual. + bezier = rubber, 0.05, 0.9, 0.1, 1.15 + + # "Snap" (El Chasquido): + # Para cerrar ventanas. Una curva inversa que empieza lenta y acelera muchísimo al final. + # Como soltar una goma tensa. + bezier = snap, 0.1, 1, 0, 1 + + # --- VENTANAS (Bungee Jumping) --- + + # ENTRADA: 'slidevert' + 'rubber'. + # La ventana entra desde abajo/arriba y rebota al llegar a su posición. + # Velocidad 5: Perfecta para ver el efecto. + animation = windowsIn, 1, 5, rubber, slidevert + + # SALIDA: 'slidevert' + 'snap'. + # La ventana sale disparada hacia el borde vertical. + # Velocidad 4: Rápida y seca. + animation = windowsOut, 1, 4, snap, slidevert + + # MOVIMIENTO: Aquí suavizamos un poco (overshot menor) para no marear. + animation = windowsMove, 1, 5, rubber, slide + + # --- FADES (Rápidos) --- + # La elasticidad implica energía cinética, no lentitud. + animation = fade, 1, 4, default + + # Capas: Los menús también rebotan verticalmente. + animation = layers, 1, 4, rubber, slidevert + + # --- ESPACIOS DE TRABAJO (Trampolín) --- + # Desplazamiento vertical con mucho rebote. + animation = workspaces, 1, 6, rubber, slidevert +} diff --git a/noctalia-visual-layer/assets/animations/15_desvanecido.conf b/noctalia-visual-layer/assets/animations/15_desvanecido.conf new file mode 100755 index 00000000..69e38ceb --- /dev/null +++ b/noctalia-visual-layer/assets/animations/15_desvanecido.conf @@ -0,0 +1,56 @@ +# @Title: Desvanecido +# @Icon: cloud +# @Color: #cbd5e1 +# @Tag: GHOST +# @Desc: Materialización espectral. Las ventanas aparecen suavemente sin moverse apenas. + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# + +# ----------------------------------------------------- +# Optimizado por NVL: Eliminados los rebotes físicos. +# Enfoque total en opacidad y escalado sutil (The Ghost Effect). +# ----------------------------------------------------- + +animations { + enabled = yes + + # --- BEZIERS ESPECTRALES --- + + # "Phantom": Una curva Sine pura. + # No hay acelerones ni frenazos bruscos. Es como respirar. + bezier = phantom, 0.4, 0, 0.6, 1 + + # "Mist" (Niebla): + # Para el movimiento. Un poco más de fricción para que no resbale. + bezier = mist, 0.2, 0.8, 0.2, 1 + + # --- VENTANAS (Apariciones) --- + + # ENTRADA: 'popin 90%' + 'phantom'. + # La ventana aparece casi en su tamaño final, solo crece un 10% mientras se hace opaca. + # Velocidad 7: Lento. Queremos ver la transición. + animation = windowsIn, 1, 7, phantom, popin 90% + + # SALIDA: 'popin 95%' + 'phantom'. + # Apenas se mueve al cerrarse. Simplemente deja de estar ahí. + animation = windowsOut, 1, 6, phantom, popin 95% + + # MOVIMIENTO: Suave y silencioso. + animation = windowsMove, 1, 6, mist, slide + + # --- FADES (El Núcleo) --- + # Velocidad 8: Las transparencias son muy notables. + animation = fade, 1, 8, phantom + + # Capas: Los menús aparecen flotando. + animation = layers, 1, 6, phantom, popin + + # --- ESPACIOS DE TRABAJO (Teletransportación) --- + # Olvida el 'slidevert'. Un fantasma atraviesa paredes. + # Usamos 'fade' puro o 'slidefade' con muy poco movimiento. + # Esto hace que el escritorio viejo se disuelva en el nuevo. + animation = workspaces, 1, 8, phantom, fade +} diff --git a/noctalia-visual-layer/assets/animations/16_dinamico.conf b/noctalia-visual-layer/assets/animations/16_dinamico.conf new file mode 100755 index 00000000..07ea96e9 --- /dev/null +++ b/noctalia-visual-layer/assets/animations/16_dinamico.conf @@ -0,0 +1,58 @@ +# @Title: Dinámico +# @Icon: adjustments +# @Color: #f97316 +# @Tag: LIVE +# @Desc: Ritmo orgánico. Combinación de velocidad y asentamiento suave. + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# + +# ----------------------------------------------------- +# Optimizado por NVL: Diferenciado de "Inercia". +# Enfoque en el ritmo variable y la "respiración" de las ventanas. +# ----------------------------------------------------- + +animations { + enabled = true + + # --- BEZIERS DE RITMO --- + + # "Pulse" (Pulso): + # Sube rápido (0.1), frena (0.9), y tiene un micro-rebote final (1.05). + # Es menos exagerado que el "Arcade" pero más vivo que el "Material". + bezier = pulse, 0.1, 0.9, 0.1, 1.05 + + # "Quick" (Rápido): + # Una curva agresiva para salidas. Sin anticipación, solo velocidad. + bezier = quick, 0.2, 1, 0.2, 1 + + # --- VENTANAS (Bio-Mecánica) --- + + # ENTRADA: 'slide' + 'pulse'. + # La ventana entra rápido y se acomoda con un pequeño "suspiro" visual. + # Velocidad 6: Da tiempo a sentir el ritmo. + animation = windowsIn, 1, 6, pulse, slide + + # SALIDA: 'slide' + 'quick'. + # A diferencia de la entrada suave, la salida es decidida. + # Esto crea el contraste "Dinámico": Entrar suave / Salir rápido. + animation = windowsOut, 1, 4, quick, slide + + # MOVIMIENTO: Fluido. + animation = windowsMove, 1, 5, pulse, slide + + # --- FADES (Sincronizados) --- + # Velocidad 5: Ni muy lento ni muy rápido. Sincronizado con el movimiento. + animation = fade, 1, 5, pulse + + # Capas: Entran con el mismo "pulso" que las ventanas. + animation = layers, 1, 5, pulse, popin + + # --- ESPACIOS DE TRABAJO (Escena) --- + # AQUÍ ESTÁ EL TRUCO: 'slidefade 40%'. + # Al moverte, el escritorio viejo se vuelve casi transparente. + # Da una sensación de mucha profundidad y dinamismo, como pasar páginas de aire. + animation = workspaces, 1, 6, pulse, slidefade 40% +} diff --git a/noctalia-visual-layer/assets/animations/17_sutil.conf b/noctalia-visual-layer/assets/animations/17_sutil.conf new file mode 100755 index 00000000..0e90e67b --- /dev/null +++ b/noctalia-visual-layer/assets/animations/17_sutil.conf @@ -0,0 +1,60 @@ +# @Title: Sutil +# @Icon: sparkles +# @Color: #94a3b8 +# @Tag: PRO +# @Desc: Cero distracciones. Suavidad absoluta sin rebotes ni movimientos bruscos. + + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# + +# ----------------------------------------------------- +# Optimizado por NVL: Eliminada toda la física de rebote. +# Ajustado para máxima concentración y fatiga visual cero. +# ----------------------------------------------------- + +animations { + enabled = true + + # --- BEZIERS DE OFICINA --- + + # "Soft": Una curva Quartic suave. + # Empieza con decisión y frena con una elegancia absoluta. + bezier = soft, 0.25, 1, 0.5, 1 + + # "Focus": Lineal-Suavizada. + # Para movimientos que necesitan ser rápidos pero no secos. + bezier = focus, 0.16, 1, 0.3, 1 + + # --- VENTANAS (Focus Mode) --- + + # ENTRADA: 'popin 95%' + 'soft'. + # La ventana aparece casi en su sitio. No viaja por la pantalla. + # Velocidad 5: Lo suficientemente rápido para no esperar, lo suficientemente lento para no asustar. + animation = windowsIn, 1, 5, soft, popin 95% + + # SALIDA: 'popin 98%' + 'focus'. + # Casi un desvanecimiento puro, con un micro-escalado. + # Velocidad 4: Desaparición rápida. + animation = windowsOut, 1, 4, focus, popin 98% + + # MOVIMIENTO: Sólido. + # La ventana se siente pesada y estable, no flota. + animation = windowsMove, 1, 5, soft, slide + + # --- CAPAS Y FADES --- + # Velocidad 4: Transiciones rápidas. + animation = fade, 1, 4, soft + + # Capas: Entran deslizando muy poco. + animation = layers, 1, 4, soft, popin + + # --- ESPACIOS DE TRABAJO (Flujo) --- + # 'slidefade 5%'. + # Fíjate en el 5%. Es un movimiento minúsculo. + # El escritorio cambia casi sin moverse, solo se desliza unos píxeles. + # Es la definición de "Sutil". + animation = workspaces, 1, 5, soft, slidefade 5% +} diff --git a/noctalia-visual-layer/assets/animations/18_energico.conf b/noctalia-visual-layer/assets/animations/18_energico.conf new file mode 100755 index 00000000..8e59eb47 --- /dev/null +++ b/noctalia-visual-layer/assets/animations/18_energico.conf @@ -0,0 +1,59 @@ +# @Title: Enérgico +# @Icon: flame +# @Color: #e11d48 +# @Tag: BOLD +# @Desc: Impacto visual máximo. Rebotes exagerados (56%) y salidas con retroceso. + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# + +# ----------------------------------------------------- +# Optimizado por NVL: Reasignada la curva de alto impacto +# a la entrada para evitar glitches visuales al cerrar. +# ----------------------------------------------------- + +animations { + enabled = true + + # --- BEZIERS DE ALTO OCTANAJE --- + + # "Nitro" (Tu OutBack original): + # Sube hasta el 1.56. Es el rebote más agresivo de toda la colección. + # Perfecto para entradas triunfales. + bezier = nitro, 0.34, 1.56, 0.64, 1 + + # "Recoil" (El contragolpe): + # Baja hasta -0.3. La ventana se contrae visiblemente antes de desaparecer. + # Es como el retroceso de un arma. + bezier = recoil, 0.36, 0, 0.66, -0.56 + + # "Crazy" (Para movimiento): + # Un rebote fuerte pero controlado para que arrastrar ventanas se sienta poderoso. + bezier = crazy, 0.05, 0.9, 0.1, 1.05 + + # --- VENTANAS (Explosiones) --- + + # ENTRADA: 'popin 80%' + 'nitro'. + # La ventana aparece, crece más de la cuenta (ocupa casi toda la pantalla un instante) + # y se asienta en su sitio. ¡BOOM! + animation = windowsIn, 1, 6, nitro, popin 80% + + # SALIDA: 'popin 80%' + 'recoil'. + # La ventana se encoge bruscamente y desaparece. + animation = windowsOut, 1, 5, recoil, popin 80% + + # MOVIMIENTO: Pesado y potente. + animation = windowsMove, 1, 5, crazy, slide + + # --- FADES --- + # Rápidos, no queremos distraer de la acción principal. + animation = fade, 1, 3, default + animation = layers, 1, 4, nitro, popin + + # --- ESPACIOS DE TRABAJO (Terremoto) --- + # Usamos 'nitro' también aquí. + # Cambiar de escritorio sacude la pantalla con fuerza. + animation = workspaces, 1, 5, nitro, slide +} diff --git a/noctalia-visual-layer/assets/animations/store.conf b/noctalia-visual-layer/assets/animations/store.conf new file mode 100755 index 00000000..0911372d --- /dev/null +++ b/noctalia-visual-layer/assets/animations/store.conf @@ -0,0 +1,2 @@ +[General] +activeAnimFile=14_elastico.conf diff --git a/noctalia-visual-layer/assets/borders/01_cascade.conf b/noctalia-visual-layer/assets/borders/01_cascade.conf new file mode 100755 index 00000000..ffcaf733 --- /dev/null +++ b/noctalia-visual-layer/assets/borders/01_cascade.conf @@ -0,0 +1,30 @@ +# @Title: Cascada +# @Icon: arrow-down +# @Color: #cba6f7 +# @Tag: FLOW +# @Desc: Borde dinámico con degradado vertical usando la paleta de Noctalia. + +# _ _ ___ ____ _____ _ _ ___ _ +# | \ | |/ _ \ / ___|_ _|/ \ | | |_ _| / \ +# | \| | | | | | | | / _ \ | | | | / _ \ +# | |\ | |_| | |___ | |/ ___ \| |___ | | / ___ \ +# |_| \_|\___/ \____| |_/_/ \_\_____|___/_/ \_ +# ____ ___ ____ ____ ____ ____ ____ +# | __ ) / _ \| _ \| _ \| __ | _ \/ ___| +# | _ \| | | | |_) | | | | _ | |_) \___ \ +# | |_) | |_| | _ <| |_| | |__| _ < ___) | +# |____/ \___/|_| \_\____/|____|_| \_\____/ +# +# ----------------------------------------------------- +# PRESET: 01_CASCADE (DYNAMIC VERSION) +# ----------------------------------------------------- + +general { + # 180deg = Vertical (Arriba a Abajo) + # Repetimos $primary para forzar el color sólido hasta abajo + col.active_border = $primary $surface 90deg + col.inactive_border = $surface_lowest +} +# La animación de ángulo DEBE estar desactivada para que la cascada +# no empiece a dar vueltas como una lavadora. +animation = borderangle, 0 diff --git a/noctalia-visual-layer/assets/borders/02_diagonal.conf b/noctalia-visual-layer/assets/borders/02_diagonal.conf new file mode 100755 index 00000000..c9ee32f4 --- /dev/null +++ b/noctalia-visual-layer/assets/borders/02_diagonal.conf @@ -0,0 +1,32 @@ +# @Title: Diagonal +# @Icon: slash +# @Color: #cba6f7 +# @Tag: FADE +# @Desc: Degradado suave en ángulo de 45° usando la paleta de Noctalia. + +# _ _ ___ ____ _____ _ _ ___ _ +# | \ | |/ _ \ / ___|_ _|/ \ | | |_ _| / \ +# | \| | | | | | | | / _ \ | | | | / _ \ +# | |\ | |_| | |___ | |/ ___ \| |___ | | / ___ \ +# |_| \_|\___/ \____| |_/_/ \_\_____|___/_/ \_ +# ____ ___ ____ ____ ____ ____ ____ +# | __ ) / _ \| _ \| _ \| __ | _ \/ ___| +# | _ \| | | | |_) | | | | _ | |_) \___ \ +# | |_) | |_| | _ <| |_| | |__| _ < ___) | +# |____/ \___/|_| \_\____/|____|_| \_\____/ +# +# ----------------------------------------------------- +# PRESET: 02_DIAGONAL_FADE (DYNAMIC VERSION) +# ----------------------------------------------------- + +general { + # Fusionamos el color Primario con el color de Superficie + # Esto crea el efecto de desvanecimiento hacia el fondo de la ventana + col.active_border = $primary $surface 45deg + + # Inactivo sutil para no distraer + col.inactive_border = $surface_lowest +} + +# Mantenemos la animación en 0 para un degradado estático y limpio +animation = borderangle, 0 diff --git a/noctalia-visual-layer/assets/borders/03_duo.conf b/noctalia-visual-layer/assets/borders/03_duo.conf new file mode 100755 index 00000000..38ffa138 --- /dev/null +++ b/noctalia-visual-layer/assets/borders/03_duo.conf @@ -0,0 +1,32 @@ +# @Title: Dúo Dinámico +# @Icon: circle-half +# @Color: #cba6f7 +# @Tag: 2-TONE +# @Desc: Alto contraste entre el color Primario y Secundario de Noctalia. + +# _ _ ___ ____ _____ _ _ ___ _ +# | \ | |/ _ \ / ___|_ _|/ \ | | |_ _| / \ +# | \| | | | | | | | / _ \ | | | | / _ \ +# | |\ | |_| | |___ | |/ ___ \| |___ | | / ___ \ +# |_| \_|\___/ \____| |_/_/ \_\_____|___/_/ \_ +# ____ ___ ____ ____ ____ ____ ____ +# | __ ) / _ \| _ \| _ \| __ | _ \/ ___| +# | _ \| | | | |_) | | | | _ | |_) \___ \ +# | |_) | |_| | _ <| |_| | |__| _ < ___) | +# |____/ \___/|_| \_\____/|____|_| \_\____/ +# +# ----------------------------------------------------- +# PRESET: 03_DUO_CONTRAST (DYNAMIC VERSION) +# ----------------------------------------------------- + +general { + # Combinamos el Morado ($primary) con el Melocotón ($secondary) + # El ángulo de 45 grados crea una división diagonal perfecta + col.active_border = $primary $secondary 90deg + + # Inactivo sutil + col.inactive_border = $surface_lowest +} + +# Sin rotación para mantener la jerarquía de colores fija +animation = borderangle, 0 diff --git a/noctalia-visual-layer/assets/borders/04_tri.conf b/noctalia-visual-layer/assets/borders/04_tri.conf new file mode 100755 index 00000000..4aad7e69 --- /dev/null +++ b/noctalia-visual-layer/assets/borders/04_tri.conf @@ -0,0 +1,32 @@ +# @Title: Tridente Noctalia +# @Icon: triangle +# @Color: #94e2d5 +# @Tag: 3-TONE +# @Desc: El equilibrio perfecto entre Primario, Secundario y Terciario. + +# _ _ ___ ____ _____ _ _ ___ _ +# | \ | |/ _ \ / ___|_ _|/ \ | | |_ _| / \ +# | \| | | | | | | | / _ \ | | | | / _ \ +# | |\ | |_| | |___ | |/ ___ \| |___ | | / ___ \ +# |_| \_|\___/ \____| |_/_/ \_\_____|___/_/ \_ +# ____ ___ ____ ____ ____ ____ ____ +# | __ ) / _ \| _ \| _ \| __ | _ \/ ___| +# | _ \| | | | |_) | | | | _ | |_) \___ \ +# | |_) | |_| | _ <| |_| | |__| _ < ___) | +# |____/ \___/|_| \_\____/|____|_| \_\____/ +# +# ----------------------------------------------------- +# PRESET: 04_TRI_PRIME (DYNAMIC VERSION) +# ----------------------------------------------------- + +general { + # La tríada de Noctalia: Morado ($primary), Naranja ($secondary) y Aguamarina ($tertiary) + # A 45 grados, los tres colores se reparten la atención de la ventana. + col.active_border = $primary $secondary $tertiary 90deg + + # Inactivo oscuro para resaltar la ventana de trabajo + col.inactive_border = $surface_lowest +} + +# Sin movimiento para mantener la elegancia de los tres tonos fijos +animation = borderangle, 0 diff --git a/noctalia-visual-layer/assets/borders/05_spectrum.conf b/noctalia-visual-layer/assets/borders/05_spectrum.conf new file mode 100755 index 00000000..d6b7c582 --- /dev/null +++ b/noctalia-visual-layer/assets/borders/05_spectrum.conf @@ -0,0 +1,32 @@ +# @Title: Spectrum +# @Icon: aperture +# @Color: #fab387 +# @Tag: RAINBOW +# @Desc: El ciclo de color completo de Noctalia (Estático). + +# _ _ ___ ____ _____ _ _ ___ _ +# | \ | |/ _ \ / ___|_ _|/ \ | | |_ _| / \ +# | \| | | | | | | | / _ \ | | | | / _ \ +# | |\ | |_| | |___ | |/ ___ \| |___ | | / ___ \ +# |_| \_|\___/ \____| |_/_/ \_\_____|___/_/ \_ +# ____ ___ ____ ____ ____ ____ ____ +# | __ ) / _ \| _ \| _ \| __ | _ \/ ___| +# | _ \| | | | |_) | | | | _ | |_) \___ \ +# | |_) | |_| | _ <| |_| | |__| _ < ___) | +# |____/ \___/|_| \_\____/|____|_| \_\____/ +# +# ----------------------------------------------------- +# PRESET: 05_FULL_SPECTRUM (DYNAMIC VERSION) +# ----------------------------------------------------- + +general { + # La "Cuadrilla Noctalia": Morado, Naranja, Aguamarina y Rosa/Rojo. + # Esta combinación cubre todo el espectro visual de tu marca. + col.active_border = $primary $secondary $tertiary $error 45deg + + # Fondo ultra oscuro para que el espectro brille más + col.inactive_border = $surface_lowest +} + +# Mantenemos el ángulo estático para apreciar la paleta completa +animation = borderangle, 0 diff --git a/noctalia-visual-layer/assets/borders/06_pulse.conf b/noctalia-visual-layer/assets/borders/06_pulse.conf new file mode 100755 index 00000000..7da54527 --- /dev/null +++ b/noctalia-visual-layer/assets/borders/06_pulse.conf @@ -0,0 +1,47 @@ +# @Title: Latido +# @Icon: activity +# @Color: #fab387 +# @Tag: EKG +# @Desc: Efecto electro-cardiograma. Un pulso de color recorre la ventana al enfocarla. + +# _ _ ___ ____ _____ _ _ ___ _ +# | \ | |/ _ \ / ___|_ _|/ \ | | |_ _| / \ +# | \| | | | | | | | / _ \ | | | | / _ \ +# | |\ | |_| | |___ | |/ ___ \| |___ | | / ___ \ +# |_| \_|\___/ \____| |_/_/ \_\_____|___/_/ \_ +# ____ ___ ____ ____ ____ ____ ____ +# | __ ) / _ \| _ \| _ \| __ | _ \/ ___| +# | _ \| | | | |_) | | | | _ | |_) \___ \ +# | |_) | |_| | _ <| |_| | |__| _ < ___) | +# |____/ \___/|_| \_\____/|____|_| \_\____/ +# +# ----------------------------------------------------- +# PRESET: 06_HEARTBEAT (EKG STYLE) +# ----------------------------------------------------- +general { + # Mantenemos el truco visual: Mucho espacio vacío y poco color. + # Esto crea la "bola de energía" que gira. + col.active_border = $primary $surface $surface $surface 45deg + col.inactive_border = $surface_lowest +} + +animations { + enabled = yes + + # --- LA CURVA MÁGICA --- + # bezier = nombre, x1, y1, x2, y2 + # + # 0.05, 0.9 -> En el 5% del tiempo, ya ha completado el 90% del giro. + # 0.1, 1.0 -> En el 10% del tiempo, ha terminado el giro (100%). + # Resto del tiempo -> Se queda plano en 1.0 (quieto) hasta que reinicia el loop. + bezier = heartbeat, 0.05, 0.9, 0.1, 1.0 + + # Animación: + # Velocidad 40: Ponemos un tiempo largo (aprox 4 seg totales). + # Gracias a la curva, el giro dura 0.4s y la pausa dura 3.6s. + # loop: Se repite infinitamente. + animation = borderangle, 1, 40, heartbeat, loop + + # El color entra de golpe y se queda + animation = border, 1, 10, default +} diff --git a/noctalia-visual-layer/assets/borders/07_infinity.conf b/noctalia-visual-layer/assets/borders/07_infinity.conf new file mode 100755 index 00000000..2486cc73 --- /dev/null +++ b/noctalia-visual-layer/assets/borders/07_infinity.conf @@ -0,0 +1,39 @@ +# @Title: Infinito +# @Icon: infinity +# @Color: #cba6f7 +# @Tag: LOOP +# @Desc: Bucle fluido de colores Noctalia. Rotación constante y elegante. + +# _ _ ___ ____ _____ _ _ ___ _ +# | \ | |/ _ \ / ___|_ _|/ \ | | |_ _| / \ +# | \| | | | | | | | / _ \ | | | | / _ \ +# | |\ | |_| | |___ | |/ ___ \| |___ | | / ___ \ +# |_| \_|\___/ \____| |_/_/ \_\_____|___/_/ \_ +# ____ ___ ____ ____ ____ ____ ____ +# | __ ) / _ \| _ \| _ \| __ | _ \/ ___| +# | _ \| | | | |_) | | | | _ | |_) \___ \ +# | |_) | |_| | _ <| |_| | |__| _ < ___) | +# |____/ \___/|_| \_\____/|____|_| \_\____/ +# +# ----------------------------------------------------- +# PRESET: 07_INFINITY_LOOP (DYNAMIC VERSION) +# ----------------------------------------------------- + +general { + # Usamos la paleta completa: Primario -> Secundario -> Terciario -> Error -> Primario + # Repetir $primary al final garantiza que el degradado sea circular y sin cortes. + col.active_border = $primary $secondary $tertiary $error $primary $secondary $tertiary $error 45deg + col.inactive_border = $surface_lowest +} + +animations { + enabled = yes + + # La curva 'linear' es obligatoria para que el movimiento no tenga tirones. + # Nota: Ya la inyectamos en assemble.sh, pero definirla aquí asegura que funcione. + bezier = linear, 0.0, 0.0, 1.0, 1.0 + + # Velocidad: 50 (Equilibrado). Ni muy rápido que distraiga, ni muy lento que no se vea. + # El modo 'loop' lo mantiene activo mientras la ventana tenga el foco. + animation = borderangle, 1, 50, linear, loop +} diff --git a/noctalia-visual-layer/assets/borders/08_neon.conf b/noctalia-visual-layer/assets/borders/08_neon.conf new file mode 100755 index 00000000..29ae8f0b --- /dev/null +++ b/noctalia-visual-layer/assets/borders/08_neon.conf @@ -0,0 +1,47 @@ +# @Title: Neón +# @Icon: blur +# @Color: #cba6f7 +# @Tag: GLITCH +# @Desc: Efecto "Cyberpunk". La luz del borde parpadea, avanza y retrocede como electricidad inestable. + +# _ _ ___ ____ _____ _ _ ___ _ +# | \ | |/ _ \ / ___|_ _|/ \ | | |_ _| / \ +# | \| | | | | | | | / _ \ | | | | / _ \ +# | |\ | |_| | |___ | |/ ___ \| |___ | | / ___ \ +# |_| \_|\___/ \____| |_/_/ \_\_____|___/_/ \_ +# ____ ___ ____ ____ ____ ____ ____ +# | __ ) / _ \| _ \| _ \| __ | _ \/ ___| +# | _ \| | | | |_) | | | | _ | |_) \___ \ +# | |_) | |_| | _ <| |_| | |__| _ < ___) | +# |____/ \___/|_| \_\____/|____|_| \_\____/ +# +# ----------------------------------------------------- +# PRESET: 08_NEON_GLITCH (CYBERPUNK VERSION) +# ----------------------------------------------------- + +general { + # ALTO CONTRASTE: + # Alternamos el color primario con el fondo repetidas veces. + # Esto crea "rayas" de luz en lugar de un degradado suave. + # Parece el filamento de una bombilla o código de barras. + col.active_border = $primary $surface $primary $surface $primary $surface 45deg + + col.inactive_border = $surface_lowest +} + +animations { + enabled = yes + + # --- LA CURVA "GLITCH" --- + # Fíjate en los números negativos (-0.5) y excesivos (1.5). + # Esto significa: + # 1. Avanza rápido hacia adelante. + # 2. ¡Retrocede! (El -0.5 hace que el giro vaya marcha atrás un instante). + # 3. Vuelve a lanzarse hacia adelante (1.5). + bezier = glitch, 0.1, 1.5, 0.9, -0.5 + + # Velocidad 40: Un bucle de 4 segundos. + # Al ser un loop infinito con esa curva loca, el borde parecerá que + # está sufriendo interferencias eléctricas constantes. + animation = borderangle, 1, 40, glitch, loop +} diff --git a/noctalia-visual-layer/assets/borders/09_glitch.conf b/noctalia-visual-layer/assets/borders/09_glitch.conf new file mode 100755 index 00000000..0d6057de --- /dev/null +++ b/noctalia-visual-layer/assets/borders/09_glitch.conf @@ -0,0 +1,38 @@ +# @Title: Cyber Glitch +# @Icon: bug +# @Color: #f38ba8 +# @Tag: ERROR +# @Desc: Efecto de fallo digital agresivo. Colores de alerta con rotación ultra rápida. + +# _ _ ___ ____ _____ _ _ ___ _ +# | \ | |/ _ \ / ___|_ _|/ \ | | |_ _| / \ +# | \| | | | | | | | / _ \ | | | | / _ \ +# | |\ | |_| | |___ | |/ ___ \| |___ | | / ___ \ +# |_| \_|\___/ \____| |_/_/ \_\_____|___/_/ \_ +# ____ ___ ____ ____ ____ ____ ____ +# | __ ) / _ \| _ \| _ \| __ | _ \/ ___| +# | _ \| | | | |_) | | | | _ | |_) \___ \ +# | |_) | |_| | _ <| |_| | |__| _ < ___) | +# |____/ \___/|_| \_\____/|____|_| \_\____/ +# +# ----------------------------------------------------- +# PRESET: 09_CYBER_GLITCH (DYNAMIC VERSION) +# ----------------------------------------------------- + +general { + # El truco del Glitch: Ponemos el color de fondo ($surface) entre los colores brillantes. + # Al rotar rápido, parecerá que el borde tiene "píxeles muertos" o parpadeos. + col.active_border = $error $surface $primary $surface 90deg + col.inactive_border = $surface_lowest +} + +animations { + enabled = yes + + # Curva 'rapid': Salta casi instantáneamente, eliminando cualquier suavidad. + bezier = rapid, 0, 1, 0, 1 + + # Velocidad: 15 (Frenético). + # En tu RTX 5070ti esto se verá nítido y eléctrico, sin estelas borrosas. + animation = borderangle, 1, 15, rapid, loop +} diff --git a/noctalia-visual-layer/assets/borders/10_golden.conf b/noctalia-visual-layer/assets/borders/10_golden.conf new file mode 100755 index 00000000..707ac06b --- /dev/null +++ b/noctalia-visual-layer/assets/borders/10_golden.conf @@ -0,0 +1,44 @@ +# @Title: Golden Luxury +# @Icon: crown +# @Color: #FFD700 +# @Tag: PRO +# @Desc: Oro de 24k. Un reflejo blanco intenso viaja sobre una superficie dorada real. + +# _ _ ___ ____ _____ _ _ ___ _ +# | \ | |/ _ \ / ___|_ _|/ \ | | |_ _| / \ +# | \| | | | | | | | / _ \ | | | | / _ \ +# | |\ | |_| | |___ | |/ ___ \| |___ | | / ___ \ +# |_| \_|\___/ \____| |_/_/ \_\_____|___/_/ \_ +# ____ ___ ____ ____ ____ ____ ____ +# | __ ) / _ \| _ \| _ \| __ | _ \/ ___| +# | _ \| | | | |_) | | | | _ | |_) \___ \ +# | |_) | |_| | _ <| |_| | |__| _ < ___) | +# |____/ \___/|_| \_\____/|____|_| \_\____/ +# + +# ----------------------------------------------------- +# PRESET: 10_GOLDEN_LUXURY (HARDCODED GOLD) +# ----------------------------------------------------- + +general { + # PALETA DE ORO REAL: + # 0xffC5A000 = Oro Oscuro (Base) + # 0xffFFD700 = Oro Puro (Brillo medio) + # 0xffFFFFFF = Blanco (Reflejo Especular) + + # La secuencia crea un degradado metálico muy rico: + col.active_border = 0xffC5A000 0xffFFD700 0xffFFFFFF 0xffFFD700 0xffC5A000 45deg + + # Inactivo: Un gris oscuro muy sutil para que el oro destaque más al activarse + col.inactive_border = $surface_lowest +} + +animations { + enabled = yes + + # "Shimmer": Curva suave para que el brillo se mueva con elegancia. + bezier = shimmer, 0.45, 0, 0.55, 1 + + # Velocidad 60: Movimiento lento y pesado, como metal precioso. + animation = borderangle, 1, 60, shimmer, loop +} diff --git a/noctalia-visual-layer/assets/borders/11_toxic.conf b/noctalia-visual-layer/assets/borders/11_toxic.conf new file mode 100755 index 00000000..834df7e5 --- /dev/null +++ b/noctalia-visual-layer/assets/borders/11_toxic.conf @@ -0,0 +1,32 @@ +# @Title: Tóxico +# @Icon: biohazard +# @Color: #39ff14 +# @Tag: ACID +# @Desc: Verde radiactivo intenso con efecto de flujo tóxico. + +# ----------------------------------------------------- +# Optimizado por NVL +# ----------------------------------------------------- + +general { + # Grosor para que el efecto se aprecie bien + border_size = 2 + + # --- Efecto Flujo Radiactivo --- + # Usamos Verde Neón (39ff14) + Negro Profundo (0c1017) + Verde Neón (39ff14) + # Esto crea una "mancha" de luz que recorre el borde. + col.active_border = rgba(39ff14ff) rgba(0c1017ff) rgba(39ff14ff) 30deg + + # Borde inactivo en un verde oscuro muy sutil + col.inactive_border = rgba(022c0b55) +} + +animations { + enabled = yes + + # Curva suave para el movimiento del líquido + bezier = nv_toxic, 0.4, 0, 0.2, 1 + + # Velocidad 40: Un término medio entre lo frenético y lo elegante + animation = borderangle, 1, 40, nv_toxic, loop +} diff --git a/noctalia-visual-layer/assets/borders/12_neon_cyberpunk.conf b/noctalia-visual-layer/assets/borders/12_neon_cyberpunk.conf new file mode 100755 index 00000000..2a501d68 --- /dev/null +++ b/noctalia-visual-layer/assets/borders/12_neon_cyberpunk.conf @@ -0,0 +1,38 @@ +# @Title: Neón Cyber-Glow (Dual) +# @Icon: bolt +# @Color: #00fff7 +# @Tag: GLOW +# @Desc: Simulación de brillo bicolor usando una base de luz blanca/violeta. + +# ----------------------------------------------------- +# Optimizado por NVL +# ----------------------------------------------------- + +general { + border_size = 2 + # El borde sigue siendo bicolor (Cian y Magenta) + col.active_border = rgba(00fff7ff) rgba(1a0026ff) rgba(ff00ffff) 45deg + col.inactive_border = rgba(0f0f2655) +} + +decoration { + shadow { + enabled = true + range = 20 # Aumentamos el rango para que el aura sea mayor + render_power = 4 # Más potencia para que el brillo sea denso + + # --- EL TRUCO --- + # Usamos un color "puente". Un blanco azulado muy transparente (44) + # actúa como un foco detrás del borde. Al girar el cian y el rosa + # sobre este blanco, parece que ambos emiten su propia luz. + color = rgba(ffffff44) + + offset = 0 0 + } +} + +animations { + enabled = yes + bezier = nv_neon_flow, 0.4, 0, 0.2, 1 + animation = borderangle, 1, 30, nv_neon_flow, loop +} diff --git a/noctalia-visual-layer/assets/borders/13_the_joker.conf b/noctalia-visual-layer/assets/borders/13_the_joker.conf new file mode 100755 index 00000000..618f4c60 --- /dev/null +++ b/noctalia-visual-layer/assets/borders/13_the_joker.conf @@ -0,0 +1,46 @@ +# @Title: the_joker +# @Icon: mood-suprised +# @Color: #39ff14 +# @Tag: THEME +# @Desc: Estética Joker: Verde ácido y morado profundo con resplandor eléctrico. + +# ----------------------------------------------------- +# Optimizado por NVL +# ----------------------------------------------------- + +general { + border_size = 2 + + # --- El Caos del Joker --- + # Combinamos el Verde Neón (39ff14) con un Morado Eléctrico (9d00ff). + # El color oscuro en medio (1a0026) es vital para que las luces parezcan separadas. + col.active_border = rgba(39ff14ff) rgba(1a0026ff) rgba(9d00ffff) 45deg + + # Inactivo: Morado muy oscuro y sutil + col.inactive_border = rgba(1a002655) +} + +decoration { + # --- Resplandor de Gotham --- + shadow { + enabled = true + range = 18 # Un aura un poco más amplia para el efecto Joker + render_power = 3 + + # Usamos el morado intenso para la sombra. + # Al girar el verde sobre este fondo morado, se crea un efecto óptico vibrante. + color = rgba(9d00ff55) + + offset = 0 0 + } +} + +animations { + enabled = yes + + # Curva de flujo constante + bezier = nv_joker_flow, 0.4, 0, 0.2, 1 + + # Velocidad 30: Un giro constante que mantiene el dinamismo + animation = borderangle, 1, 30, nv_joker_flow, loop +} diff --git a/noctalia-visual-layer/assets/borders/geometry_store.conf b/noctalia-visual-layer/assets/borders/geometry_store.conf new file mode 100755 index 00000000..8b137891 --- /dev/null +++ b/noctalia-visual-layer/assets/borders/geometry_store.conf @@ -0,0 +1 @@ + diff --git a/noctalia-visual-layer/assets/borders/store.conf b/noctalia-visual-layer/assets/borders/store.conf new file mode 100755 index 00000000..2fe36880 --- /dev/null +++ b/noctalia-visual-layer/assets/borders/store.conf @@ -0,0 +1,5 @@ +[General] +activeBorderFile=13_the_joker.conf + +[VisualLayer_Geometry] +borderSize=3 diff --git a/noctalia-visual-layer/assets/fragments/animation.conf b/noctalia-visual-layer/assets/fragments/animation.conf new file mode 100644 index 00000000..16418b7b --- /dev/null +++ b/noctalia-visual-layer/assets/fragments/animation.conf @@ -0,0 +1,57 @@ +# @Title: Elástico +# @Icon: arrows-diagonal +# @Color: #6366f1 +# @Tag: FLEX +# @Desc: Física de banda elástica. Las ventanas llegan, se estiran y rebotan verticalmente. + + +# ----------------------------------------------------- +# ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ +# █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ +# + +# ----------------------------------------------------- +# Optimizado por NVL: Se ha inyectado física real de rebote +# (Overshoot del 15%) para justificar el nombre "Elástico". +# ----------------------------------------------------- + +animations { + enabled = yes + + # --- BEZIERS ELÁSTICOS --- + + # "Rubber" (La Goma): + # Sube muy rápido y se pasa bastante (1.15) para crear vibración visual. + bezier = rubber, 0.05, 0.9, 0.1, 1.15 + + # "Snap" (El Chasquido): + # Para cerrar ventanas. Una curva inversa que empieza lenta y acelera muchísimo al final. + # Como soltar una goma tensa. + bezier = snap, 0.1, 1, 0, 1 + + # --- VENTANAS (Bungee Jumping) --- + + # ENTRADA: 'slidevert' + 'rubber'. + # La ventana entra desde abajo/arriba y rebota al llegar a su posición. + # Velocidad 5: Perfecta para ver el efecto. + animation = windowsIn, 1, 5, rubber, slidevert + + # SALIDA: 'slidevert' + 'snap'. + # La ventana sale disparada hacia el borde vertical. + # Velocidad 4: Rápida y seca. + animation = windowsOut, 1, 4, snap, slidevert + + # MOVIMIENTO: Aquí suavizamos un poco (overshot menor) para no marear. + animation = windowsMove, 1, 5, rubber, slide + + # --- FADES (Rápidos) --- + # La elasticidad implica energía cinética, no lentitud. + animation = fade, 1, 4, default + + # Capas: Los menús también rebotan verticalmente. + animation = layers, 1, 4, rubber, slidevert + + # --- ESPACIOS DE TRABAJO (Trampolín) --- + # Desplazamiento vertical con mucho rebote. + animation = workspaces, 1, 6, rubber, slidevert +} diff --git a/noctalia-visual-layer/assets/fragments/border.conf b/noctalia-visual-layer/assets/fragments/border.conf new file mode 100644 index 00000000..618f4c60 --- /dev/null +++ b/noctalia-visual-layer/assets/fragments/border.conf @@ -0,0 +1,46 @@ +# @Title: the_joker +# @Icon: mood-suprised +# @Color: #39ff14 +# @Tag: THEME +# @Desc: Estética Joker: Verde ácido y morado profundo con resplandor eléctrico. + +# ----------------------------------------------------- +# Optimizado por NVL +# ----------------------------------------------------- + +general { + border_size = 2 + + # --- El Caos del Joker --- + # Combinamos el Verde Neón (39ff14) con un Morado Eléctrico (9d00ff). + # El color oscuro en medio (1a0026) es vital para que las luces parezcan separadas. + col.active_border = rgba(39ff14ff) rgba(1a0026ff) rgba(9d00ffff) 45deg + + # Inactivo: Morado muy oscuro y sutil + col.inactive_border = rgba(1a002655) +} + +decoration { + # --- Resplandor de Gotham --- + shadow { + enabled = true + range = 18 # Un aura un poco más amplia para el efecto Joker + render_power = 3 + + # Usamos el morado intenso para la sombra. + # Al girar el verde sobre este fondo morado, se crea un efecto óptico vibrante. + color = rgba(9d00ff55) + + offset = 0 0 + } +} + +animations { + enabled = yes + + # Curva de flujo constante + bezier = nv_joker_flow, 0.4, 0, 0.2, 1 + + # Velocidad 30: Un giro constante que mantiene el dinamismo + animation = borderangle, 1, 30, nv_joker_flow, loop +} diff --git a/noctalia-visual-layer/assets/fragments/geometry.conf b/noctalia-visual-layer/assets/fragments/geometry.conf new file mode 100644 index 00000000..e786ee52 --- /dev/null +++ b/noctalia-visual-layer/assets/fragments/geometry.conf @@ -0,0 +1,3 @@ +general { + border_size = 3 +} diff --git a/noctalia-visual-layer/assets/fragments/shader.conf b/noctalia-visual-layer/assets/fragments/shader.conf new file mode 100644 index 00000000..e69de29b diff --git a/noctalia-visual-layer/assets/owl_neon.png b/noctalia-visual-layer/assets/owl_neon.png new file mode 100755 index 00000000..55f5f43c Binary files /dev/null and b/noctalia-visual-layer/assets/owl_neon.png differ diff --git a/noctalia-visual-layer/assets/scripts/apply_animation.sh b/noctalia-visual-layer/assets/scripts/apply_animation.sh new file mode 100755 index 00000000..8972801e --- /dev/null +++ b/noctalia-visual-layer/assets/scripts/apply_animation.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# --- RUTAS --- +PLUGIN_DIR="$HOME/.config/noctalia/plugins/noctalia-visual-layer" +PRESETS_DIR="$PLUGIN_DIR/assets/animations" # Carpeta de presets +FRAGMENTS_DIR="$PLUGIN_DIR/assets/fragments" +SCRIPTS_DIR="$PLUGIN_DIR/assets/scripts" + +mkdir -p "$FRAGMENTS_DIR" +PRESET_NAME=$1 + +# 1. LÓGICA DE APAGADO +if [ "$PRESET_NAME" == "none" ] || [ -z "$PRESET_NAME" ]; then + rm -f "$FRAGMENTS_DIR/animation.conf" + echo "Animaciones desactivadas." +else + # 2. CARGA DINÁMICA + TARGET_FILE="$PRESETS_DIR/$PRESET_NAME" + + if [ -f "$TARGET_FILE" ]; then + cat "$TARGET_FILE" > "$FRAGMENTS_DIR/animation.conf" + echo "Aplicada animación: $PRESET_NAME" + else + # Si no existe, no aplicamos nada para no romper Hyprland + rm -f "$FRAGMENTS_DIR/animation.conf" + echo "Error: Animación $PRESET_NAME no encontrada." + fi +fi + +# 3. ENSAMBLAJE +bash "$SCRIPTS_DIR/assemble.sh" diff --git a/noctalia-visual-layer/assets/scripts/assemble.sh b/noctalia-visual-layer/assets/scripts/assemble.sh new file mode 100755 index 00000000..fc970377 --- /dev/null +++ b/noctalia-visual-layer/assets/scripts/assemble.sh @@ -0,0 +1,84 @@ +#!/bin/bash + +# --- CONFIGURACIÓN DE RUTAS AUTOCONTENIDAS --- +PLUGIN_DIR="$HOME/.config/noctalia/plugins/noctalia-visual-layer" +FRAGMENTS_DIR="$PLUGIN_DIR/assets/fragments" + +# [CAMBIO 1] Definimos la nueva ruta segura fuera del plugin +NVL_SAFE_DIR="$HOME/.config/noctalia/NVL" + +# [CAMBIO 2] Apuntamos el archivo temporal y el final a la nueva ruta +FINAL_FILE="$NVL_SAFE_DIR/overlay.conf" +TEMP_FILE="$NVL_SAFE_DIR/overlay.tmp" + +# Ruta de los colores oficiales de Noctalia +COLORS_FILE="$HOME/.config/hypr/noctalia/noctalia-colors.conf" + +# Aseguramos que la carpeta de fragmentos exista dentro del plugin +mkdir -p "$FRAGMENTS_DIR" + +# [CAMBIO 3] Aseguramos que el refugio seguro exista antes de escribir en él +mkdir -p "$NVL_SAFE_DIR" + +# 1. CREACIÓN DEL ARCHIVO TEMPORAL +echo "# NOCTALIA VISUAL LAYER - OVERLAY MAESTRO" > "$TEMP_FILE" +echo "# Generado automáticamente el: $(date)" >> "$TEMP_FILE" +echo "" >> "$TEMP_FILE" + +# --- [CRÍTICO: COLORES PRIMERO] --- +# Cargamos las variables ($primary, $secondary...) antes que nada. +if [ -f "$COLORS_FILE" ]; then + echo "# [SISTEMA: COLORES]" >> "$TEMP_FILE" + echo "source = $COLORS_FILE" >> "$TEMP_FILE" + echo "" >> "$TEMP_FILE" +else + echo "# [ADVERTENCIA] Archivo de colores no encontrado: $COLORS_FILE" >> "$TEMP_FILE" +fi + +# --- [FIX CRÍTICO: CURVA INMORTAL] --- +# Inyectamos la curva linear GLOBALMENTE aquí. +echo "bezier = linear, 0, 0, 1, 1" >> "$TEMP_FILE" +echo "# ----------------------------------------------------" >> "$TEMP_FILE" +echo "" >> "$TEMP_FILE" + + +# 2. ENSAMBLAJE ORDENADO (JERARQUÍA DE PODER) + +# -- A) ANIMACIONES -- +if [ -f "$FRAGMENTS_DIR/animation.conf" ]; then + echo "# [MÓDULO: ANIMACIONES]" >> "$TEMP_FILE" + cat "$FRAGMENTS_DIR/animation.conf" >> "$TEMP_FILE" + echo "" >> "$TEMP_FILE" +fi + +# -- B) BORDES (Estilo y Color) -- +if [ -f "$FRAGMENTS_DIR/border.conf" ]; then + echo "# [MÓDULO: BORDES]" >> "$TEMP_FILE" + cat "$FRAGMENTS_DIR/border.conf" >> "$TEMP_FILE" + echo "" >> "$TEMP_FILE" +fi + +# -- C) SHADERS -- +if [ -f "$FRAGMENTS_DIR/shader.conf" ]; then + echo "# [MÓDULO: SHADERS]" >> "$TEMP_FILE" + cat "$FRAGMENTS_DIR/shader.conf" >> "$TEMP_FILE" + echo "" >> "$TEMP_FILE" +fi + +# -- D) GEOMETRÍA (El Jefe Supremo) -- +# Lo ponemos AL FINAL para que el slider siempre mande sobre el tamaño, +# sobrescribiendo cualquier error que venga de los bordes anteriores. +if [ -f "$FRAGMENTS_DIR/geometry.conf" ]; then + echo "# [MÓDULO: GEOMETRÍA]" >> "$TEMP_FILE" + cat "$FRAGMENTS_DIR/geometry.conf" >> "$TEMP_FILE" + echo "" >> "$TEMP_FILE" +fi + +# 3. MOVIMIENTO MAESTRO +mv "$TEMP_FILE" "$FINAL_FILE" + +# 4. APLICACIÓN +if pgrep -x "Hyprland" > /dev/null; then + # Usamos reload para aplicar cambios sin reiniciar la sesión + hyprctl reload +fi diff --git a/noctalia-visual-layer/assets/scripts/border.sh b/noctalia-visual-layer/assets/scripts/border.sh new file mode 100755 index 00000000..49b3b62c --- /dev/null +++ b/noctalia-visual-layer/assets/scripts/border.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# --- RUTAS --- +PLUGIN_DIR="$HOME/.config/noctalia/plugins/noctalia-visual-layer" +PRESETS_DIR="$PLUGIN_DIR/assets/borders" # Donde el usuario guarda sus .conf +FRAGMENTS_DIR="$PLUGIN_DIR/assets/fragments" # Donde se genera el temporal +SCRIPTS_DIR="$PLUGIN_DIR/assets/scripts" + +mkdir -p "$FRAGMENTS_DIR" +PRESET_NAME=$1 + +# 1. LÓGICA DE APAGADO (None o vacío) +if [ "$PRESET_NAME" == "none" ] || [ -z "$PRESET_NAME" ]; then + rm -f "$FRAGMENTS_DIR/border.conf" + echo "Borde desactivado." +else + # 2. CARGA DINÁMICA + # Buscamos el archivo .conf en la carpeta assets/borders/ + TARGET_FILE="$PRESETS_DIR/$PRESET_NAME" + + if [ -f "$TARGET_FILE" ]; then + # Copiamos el contenido del preset al fragmento + cat "$TARGET_FILE" > "$FRAGMENTS_DIR/border.conf" + echo "Aplicado preset de borde: $PRESET_NAME" + else + # Fallback de seguridad: si el archivo no existe, usa el color base + echo "general { col.active_border = \$primary }" > "$FRAGMENTS_DIR/border.conf" + echo "Advertencia: Preset $PRESET_NAME no encontrado." + fi +fi + +# 3. ENSAMBLAJE +bash "$SCRIPTS_DIR/assemble.sh" diff --git a/noctalia-visual-layer/assets/scripts/geometry.sh b/noctalia-visual-layer/assets/scripts/geometry.sh new file mode 100755 index 00000000..15e747bd --- /dev/null +++ b/noctalia-visual-layer/assets/scripts/geometry.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# geometry.sh - Controla solo el tamaño físico (Encapsulado) + +# --- RUTAS AUTOCONTENIDAS --- +PLUGIN_DIR="$HOME/.config/noctalia/plugins/noctalia-visual-layer" +FRAGMENTS_DIR="$PLUGIN_DIR/assets/fragments" +SCRIPTS_DIR="$PLUGIN_DIR/assets/scripts" + +# Aseguramos que la carpeta interna exista +mkdir -p "$FRAGMENTS_DIR" + +SIZE=$1 + +# Validación básica +if [ -z "$SIZE" ]; then + SIZE=2 +fi + +# 1. GENERACIÓN DEL FRAGMENTO INTERNO +# Mantenemos el FIX de no usar 'no_border_on_floating' +echo "general { + border_size = $SIZE +}" > "$FRAGMENTS_DIR/geometry.conf" + +# 2. RECONSTRUCCIÓN CON EL ENSAMBLADOR INTERNO +if [ -f "$SCRIPTS_DIR/assemble.sh" ]; then + bash "$SCRIPTS_DIR/assemble.sh" +else + echo "Error: No se encuentra el script ensamblador en $SCRIPTS_DIR" + exit 1 +fi diff --git a/noctalia-visual-layer/assets/scripts/init.sh b/noctalia-visual-layer/assets/scripts/init.sh new file mode 100755 index 00000000..eec09102 --- /dev/null +++ b/noctalia-visual-layer/assets/scripts/init.sh @@ -0,0 +1,110 @@ +#!/bin/bash + +# --- RUTAS PRINCIPALES --- +PLUGIN_DIR="$HOME/.config/noctalia/plugins/noctalia-visual-layer" +FRAGMENTS_DIR="$PLUGIN_DIR/assets/fragments" + +# 🌟 NUEVA RUTA SEGURA (El Refugio) 🌟 +NVL_SAFE_DIR="$HOME/.config/noctalia/NVL" +OVERLAY_FILE="$NVL_SAFE_DIR/overlay.conf" # El overlay ahora vive fuera del plugin +WATCHDOG_FILE="$NVL_SAFE_DIR/nvl_watchdog.sh" + +# Mantenemos la ruta de tus colores +COLORS_FILE="$HOME/.config/hypr/noctalia/noctalia-colors.conf" +HYPR_CONF="$HOME/.config/hypr/hyprland.conf" + +# Ruta interna del ensamblador +ASSEMBLE_SCRIPT="$PLUGIN_DIR/assets/scripts/assemble.sh" + +# --- MARCADORES PARA HYPRLAND --- +MARKER_START="# >>> NOCTALIA VISUAL LAYER START <<<" +MARKER_END="# >>> NOCTALIA VISUAL LAYER END <<<" + +# --- CONTENIDO A INYECTAR --- +LINE_WATCHDOG="exec-once = $WATCHDOG_FILE" # Inyección del guardián +LINE_COLORS="source = $COLORS_FILE" +LINE_OVERLAY="source = $OVERLAY_FILE" + +ACTION=$1 + +# --- FUNCIÓN DE LIMPIEZA --- +clean_hyprland_conf() { + # 1. Borrar todo el bloque entre los marcadores + sed -i "/$MARKER_START/,/$MARKER_END/d" "$HYPR_CONF" + + # 2. Limpieza de seguridad por si quedaron líneas sueltas viejas + sed -i "\|source = .*noctalia-visual-layer/overlay.conf|d" "$HYPR_CONF" + sed -i "\|$LINE_OVERLAY|d" "$HYPR_CONF" + sed -i "\|$LINE_COLORS|d" "$HYPR_CONF" + + # 3. Eliminar líneas vacías extra al final + sed -i '${/^$/d;}' "$HYPR_CONF" +} + +# --- FUNCIÓN DE PREPARACIÓN --- +setup_files() { + echo "Preparando entorno seguro y guardián de Noctalia..." + + # Crear carpeta de fragmentos y el nuevo refugio NVL + mkdir -p "$FRAGMENTS_DIR" + mkdir -p "$NVL_SAFE_DIR" + + # Dar permisos de ejecución a los scripts internos + chmod +x "$PLUGIN_DIR/assets/scripts/"*.sh + + # 🛡️ Desplegar el script guardián + cp "$PLUGIN_DIR/assets/scripts/nvl_watchdog.sh" "$WATCHDOG_FILE" + chmod +x "$WATCHDOG_FILE" + + # Crear fragmentos vacíos internos + touch "$FRAGMENTS_DIR/animation.conf" + touch "$FRAGMENTS_DIR/geometry.conf" + touch "$FRAGMENTS_DIR/border.conf" + touch "$FRAGMENTS_DIR/shader.conf" + + # Ejecutar el ensamblador interno + # Exportamos la variable para que assemble.sh sepa dónde debe guardar el archivo final + export OVERLAY_FILE="$NVL_SAFE_DIR/overlay.conf" + + if [ -f "$ASSEMBLE_SCRIPT" ]; then + bash "$ASSEMBLE_SCRIPT" + + # PARCHE DE SEGURIDAD: Por si assemble.sh tiene la ruta vieja escrita "a fuego" en su código + if [ -f "$PLUGIN_DIR/overlay.conf" ]; then + mv "$PLUGIN_DIR/overlay.conf" "$NVL_SAFE_DIR/overlay.conf" + fi + else + echo "# Noctalia Overlay Base" > "$OVERLAY_FILE" + fi +} + +# --- LÓGICA PRINCIPAL --- + +if [ "$ACTION" == "enable" ]; then + setup_files + clean_hyprland_conf # Limpiar duplicados + + # Inyectamos el BLOQUE COMPLETO apuntando al refugio seguro + echo "" >> "$HYPR_CONF" + echo "$MARKER_START" >> "$HYPR_CONF" + echo "# 1. Guardián de Desinstalación Activo" >> "$HYPR_CONF" + echo "$LINE_WATCHDOG" >> "$HYPR_CONF" + echo "# 2. Definición de Variables (Paleta de Colores)" >> "$HYPR_CONF" + echo "$LINE_COLORS" >> "$HYPR_CONF" + echo "# 3. Aplicación de Efectos (Visual Layer)" >> "$HYPR_CONF" + echo "$LINE_OVERLAY" >> "$HYPR_CONF" + echo "$MARKER_END" >> "$HYPR_CONF" + + # Recarga final + hyprctl reload + notify-send "Noctalia Visual" "Sistema ACTIVADO (Entorno Seguro)" -i system-software-update + +elif [ "$ACTION" == "disable" ]; then + clean_hyprland_conf # Borra el bloque de hyprland.conf + + # 🧹 Limpieza total: borramos la carpeta refugio con el overlay y el guardián + rm -rf "$NVL_SAFE_DIR" + + hyprctl reload + notify-send "Noctalia Visual" "Sistema DESACTIVADO" -i system-shutdown +fi diff --git a/noctalia-visual-layer/assets/scripts/nvl_watchdog.sh b/noctalia-visual-layer/assets/scripts/nvl_watchdog.sh new file mode 100755 index 00000000..b9f62e9e --- /dev/null +++ b/noctalia-visual-layer/assets/scripts/nvl_watchdog.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# nvl_watchdog.sh - Vigila que el plugin siga instalado y limpia si no es así + +# 1. Definimos las rutas (ahora apuntando a la nueva carpeta NVL) +PLUGIN_DIR="$HOME/.config/noctalia/plugins/noctalia-visual-layer" +HYPR_CONF="$HOME/.config/hypr/hyprland.conf" +NVL_SAFE_DIR="$HOME/.config/noctalia/NVL" + +# 2. Comprobamos si la carpeta original del plugin ha sido borrada por la Shell +if [ ! -d "$PLUGIN_DIR" ]; then + + # Eliminamos la línea conflictiva del hyprland.conf del usuario silenciosamente + sed -i '/source = ~\/.config\/noctalia\/NVL\/overlay.conf/d' "$HYPR_CONF" + + # Borramos toda la carpeta de refugio NVL (se lleva el overlay y el propio script por delante) + rm -rf "$NVL_SAFE_DIR" +fi diff --git a/noctalia-visual-layer/assets/scripts/scan.sh b/noctalia-visual-layer/assets/scripts/scan.sh new file mode 100755 index 00000000..924c7c52 --- /dev/null +++ b/noctalia-visual-layer/assets/scripts/scan.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +# --- RUTAS --- +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +ASSETS_DIR="$SCRIPT_DIR/.." +TARGET_FOLDER="$1" +SEARCH_DIR="$ASSETS_DIR/$TARGET_FOLDER" + +if [ ! -d "$SEARCH_DIR" ]; then echo "[]"; exit 0; fi + +echo "[" +FIRST=true + +while read -r filepath; do + filename=$(basename "$filepath") + + # Saltamos archivos de sistema + if [[ "$filename" == *"store"* || "$filename" == "geometry.conf" ]]; then continue; fi + + ID_NAME="${filename%.*}" + + # 1. Claves para traducción (Lo que ya tenías) + KEY_T="${TARGET_FOLDER}.presets.${ID_NAME}.title" + KEY_D="${TARGET_FOLDER}.presets.${ID_NAME}.desc" + + # 2. LECTURA REAL DEL ARCHIVO (¡ESTO ES LO QUE FALTABA!) + function get_meta() { + # El 2>/dev/null evita errores si el archivo es raro + grep -m1 -E "^[ \t]*(#|//) @$1:" "$filepath" 2>/dev/null | cut -d: -f2- | sed 's/^[ \t]*//;s/[ \t]*$//;s/"/\\"/g' | tr -d '\r' + } + + RAW_T=$(get_meta "Title") + RAW_D=$(get_meta "Desc") + ICON=$(get_meta "Icon") + COLOR=$(get_meta "Color") + TAG=$(get_meta "Tag") + + # Valores por defecto de seguridad + [ -z "$RAW_T" ] && RAW_T="$ID_NAME" + [ -z "$ICON" ] && ICON="help" + [ -z "$COLOR" ] && COLOR="#888888" + [ -z "$TAG" ] && TAG="USER" + + if [ "$FIRST" = true ]; then FIRST=false; else echo ","; fi + + # 3. Salida JSON con TODO (Claves + Texto Real) + cat < "$FRAGMENTS_DIR/shader.conf" + + echo "Sincronizando: Aplicando shader $PRESET" +fi + +# --- LLAMADA AL MAESTRO ENSAMBLADOR --- +if [ -f "$SCRIPTS_DIR/assemble.sh" ]; then + bash "$SCRIPTS_DIR/assemble.sh" +else + # Fallback si por algún motivo assemble.sh no está + hyprctl reload +fi diff --git a/noctalia-visual-layer/assets/shaders/01_night.frag b/noctalia-visual-layer/assets/shaders/01_night.frag new file mode 100755 index 00000000..e940228e --- /dev/null +++ b/noctalia-visual-layer/assets/shaders/01_night.frag @@ -0,0 +1,80 @@ +// @Title: Luz Nocturna +// @Icon: moon +// @Color: #fcd34d +// @Tag: WARM +// @Desc: Reduce la luz azul para proteger la vista. + +// from https://github.com/hyprwm/Hyprland/issues/1140#issuecomment-1335128437 + + + +/* +To override this parameters create a file named './blue-light-filter.inc' +We only need to match the file name and use 'inc' to incdicate that + this is an "include" file + Example: + + ┌────────────────────────────────────────────────────────────────────────────┐ + │ // file: ./blue-light-filter.inc │ + │ // float in Kelvin (lower = warmer) │ + │ #define BLUE_LIGHT_FILTER_TEMPERATURE 3000.0 │ + │ // float (0.0 = no effect, 1.0 = full effect) │ + │ #define BLUE_LIGHT_FILTER_INTENSITY 0.9 │ + │ │ + └────────────────────────────────────────────────────────────────────────────┘ + + + */ +#version 300 es + +#ifndef BLUE_LIGHT_FILTER_TEMPERATURE + #define BLUE_LIGHT_FILTER_TEMPERATURE 3000.0 // Default fallback value +#endif +#ifndef BLUE_LIGHT_FILTER_INTENSITY + #define BLUE_LIGHT_FILTER_INTENSITY 0.9 // Default fallback value +#endif + + +precision highp float; +in vec2 v_texcoord; +out vec4 fragColor; +uniform sampler2D tex; + + +const float TEMPERATURE = BLUE_LIGHT_FILTER_TEMPERATURE; +const float INTENSITY = BLUE_LIGHT_FILTER_INTENSITY; + +#define WithQuickAndDirtyLuminancePreservation +const float LuminancePreservationFactor = 1.0; + +// function from https://www.shadertoy.com/view/4sc3D7 +// valid from 1000 to 40000 K (and additionally 0 for pure full white) +vec3 colorTemperatureToRGB(const in float TEMPERATURE) { + // values from: http://blenderartists.org/forum/showthread.php?270332-OSL-Goodness&p=2268693&viewfull=1#post2268693 + mat3 m = (TEMPERATURE <= 6500.0) ? mat3(vec3(0.0, -2902.1955373783176, -8257.7997278925690), + vec3(0.0, 1669.5803561666639, 2575.2827530017594), + vec3(1.0, 1.3302673723350029, 1.8993753891711275)) + : mat3(vec3(1745.0425298314172, 1216.6168361476490, -8257.7997278925690), + vec3(-2666.3474220535695, -2173.1012343082230, 2575.2827530017594), + vec3(0.55995389139931482, 0.70381203140554553, 1.8993753891711275)); + return mix(clamp(vec3(m[0] / (vec3(clamp(TEMPERATURE, 1000.0, 40000.0)) + m[1]) + m[2]), vec3(0.0), vec3(1.0)), + vec3(1.0), smoothstep(1000.0, 0.0, TEMPERATURE)); +} + +void main() { + vec4 pixColor = texture(tex, v_texcoord); + + // RGB + vec3 color = vec3(pixColor[0], pixColor[1], pixColor[2]); + +#ifdef WithQuickAndDirtyLuminancePreservation + color *= mix(1.0, dot(color, vec3(0.2126, 0.7152, 0.0722)) / max(dot(color, vec3(0.2126, 0.7152, 0.0722)), 1e-5), + LuminancePreservationFactor); +#endif + + color = mix(color, color * colorTemperatureToRGB(TEMPERATURE), INTENSITY); + + vec4 outCol = vec4(color, pixColor[3]); + + fragColor = outCol; +} diff --git a/noctalia-visual-layer/assets/shaders/02_mono.frag b/noctalia-visual-layer/assets/shaders/02_mono.frag new file mode 100755 index 00000000..0b08b81e --- /dev/null +++ b/noctalia-visual-layer/assets/shaders/02_mono.frag @@ -0,0 +1,24 @@ +// @Title: Monocromo +// @Icon: circle-half +// @Color: #94a3b8 +// @Tag: BW +// @Desc: Escala de grises para máxima concentración. + +#version 300 es +precision highp float; + +in vec2 v_texcoord; +out vec4 fragColor; +uniform sampler2D tex; + +void main() { + vec4 c = texture(tex, v_texcoord); + + // Fórmula estándar de luminancia (NTSC/PAL) + // El ojo humano percibe el verde más brillante que el azul, + // por eso usamos estos pesos: + float gray = dot(c.rgb, vec3(0.299, 0.587, 0.114)); + + // Creamos un nuevo color usando el valor gris para R, G y B + fragColor = vec4(vec3(gray), c.a); +} diff --git a/noctalia-visual-layer/assets/shaders/03_vibrant.frag b/noctalia-visual-layer/assets/shaders/03_vibrant.frag new file mode 100755 index 00000000..46a45b95 --- /dev/null +++ b/noctalia-visual-layer/assets/shaders/03_vibrant.frag @@ -0,0 +1,39 @@ +// @Title: Vibrante +// @Icon: sun +// @Color: #facc15 +// @Tag: SAT +// @Desc: Aumenta la saturación y el contraste. + +#version 300 es +precision highp float; + +in vec2 v_texcoord; +out vec4 fragColor; +uniform sampler2D tex; + +void main() { + // 1. Captura de color moderna + vec4 col = texture(tex, v_texcoord); + + // 2. Cálculo de saturación actual + // Buscamos la diferencia entre el canal más fuerte y el más débil + float max_val = max(col.r, max(col.g, col.b)); + float min_val = min(col.r, min(col.g, col.b)); + float sat = max_val - min_val; + + // 3. Luminancia estándar (Rec. 709) + // Usamos los coeficientes modernos para mayor precisión en pantallas digitales: + // $$L = 0.2126R + 0.7152G + 0.0722B$$ + float luma = dot(col.rgb, vec3(0.2126, 0.7152, 0.0722)); + + // 4. Lógica de Vibrancia + // Intensidad: 0.8. Cuanto más bajo sea 'sat', más 'amount' aplicaremos. + float vibrance = 0.8; + float amount = vibrance * (1.0 - sat); + + // Mezclamos la luminancia con el color original basándonos en el cálculo inteligente + vec3 result = mix(vec3(luma), col.rgb, 1.0 + amount); + + // 5. Salida + fragColor = vec4(result, col.a); +} diff --git a/noctalia-visual-layer/assets/shaders/04_sharp.frag b/noctalia-visual-layer/assets/shaders/04_sharp.frag new file mode 100755 index 00000000..999c2b61 --- /dev/null +++ b/noctalia-visual-layer/assets/shaders/04_sharp.frag @@ -0,0 +1,37 @@ +// @Title: Nitidez +// @Icon: aperture +// @Color: #22d3ee +// @Tag: SHARP +// @Desc: Realza los bordes y textos (Sharpen). + +#version 300 es +precision highp float; + +in vec2 v_texcoord; +out vec4 fragColor; +uniform sampler2D tex; + +void main() { + // 1. Tomamos el píxel central (Muestreo moderno) + vec4 center = texture(tex, v_texcoord); + + // 2. Definimos el desplazamiento + // Nota: 0.0005 es ideal para 1080p. + // Si usas 4K, podrías necesitar subirlo a 0.001. + float offset = 0.0005; + + // 3. Muestreamos adyacentes (texture en lugar de texture2D) + vec3 up = texture(tex, v_texcoord + vec2(0.0, offset)).rgb; + vec3 down = texture(tex, v_texcoord - vec2(0.0, offset)).rgb; + vec3 left = texture(tex, v_texcoord - vec2(offset, 0.0)).rgb; + vec3 right = texture(tex, v_texcoord + vec2(offset, 0.0)).rgb; + + // 4. Kernel de enfoque (Laplacian Sharpening) + // Multiplicamos el centro por 5 y restamos la cruz de vecinos. + // Esto amplifica las diferencias de contraste en los bordes. + vec3 result = center.rgb * 5.0 - (up + down + left + right); + + // 5. Salida con recorte de seguridad (clamp) + // El clamp es vital aquí porque la resta puede dar valores negativos + fragColor = vec4(clamp(result, 0.0, 1.0), center.a); +} diff --git a/noctalia-visual-layer/assets/shaders/05_ink.frag b/noctalia-visual-layer/assets/shaders/05_ink.frag new file mode 100755 index 00000000..d409a8ca --- /dev/null +++ b/noctalia-visual-layer/assets/shaders/05_ink.frag @@ -0,0 +1,36 @@ +// @Title: Papel +// @Icon: file-text +// @Color: #fdba74 +// @Tag: READ +// @Desc: Tono sepia suave para lectura prolongada. + +#version 300 es +precision highp float; + +in vec2 v_texcoord; +out vec4 fragColor; +uniform sampler2D tex; + +// Función de ruido (Sigue funcionando igual en 300 es) +float rand(vec2 co){ + return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); +} + +void main() { + // 1. Muestreo (texture en lugar de texture2D) + vec4 color = texture(tex, v_texcoord); + + // 2. Escala de grises (Luminancia estándar) + float gray = dot(color.rgb, vec3(0.299, 0.587, 0.114)); + + // 3. Tinte sepia/papel + // Multiplicamos el gris por un vector que tira al amarillo/crema + vec3 sepia = vec3(gray) * vec3(1.0, 0.95, 0.82); + + // 4. Añadir ruido (grano de papel) + // El ruido se suma al color final para dar esa sensación de textura + float noise = (rand(v_texcoord) - 0.5) * 0.05; + + // 5. Salida final + fragColor = vec4(sepia + noise, color.a); +} diff --git a/noctalia-visual-layer/assets/shaders/06_invert.frag b/noctalia-visual-layer/assets/shaders/06_invert.frag new file mode 100755 index 00000000..b678211c --- /dev/null +++ b/noctalia-visual-layer/assets/shaders/06_invert.frag @@ -0,0 +1,22 @@ +// @Title: Invertido +// @Icon: repeat +// @Color: #ffffff +// @Tag: INV +// @Desc: Invierte los colores (Modo Alto Contraste). + +#version 300 es +precision highp float; + +in vec2 v_texcoord; // Antes: varying +out vec4 fragColor; // Antes: gl_FragColor (¡Ahora lo definimos nosotros!) +uniform sampler2D tex; + +void main() { + // Antes: texture2D -> Ahora: texture + vec4 pixColor = texture(tex, v_texcoord); + + // La lógica matemática NO cambia, solo la "fontanería" + vec3 inverted = 1.0 - pixColor.rgb; + + fragColor = vec4(inverted, pixColor.a); +} diff --git a/noctalia-visual-layer/assets/shaders/07_oled.frag b/noctalia-visual-layer/assets/shaders/07_oled.frag new file mode 100755 index 00000000..6f4412ba --- /dev/null +++ b/noctalia-visual-layer/assets/shaders/07_oled.frag @@ -0,0 +1,27 @@ +// @Title: OLED Puro +// @Icon: square +// @Color: #000000 +// @Tag: DARK +// @Desc: Negros absolutos para pantallas OLED. + +#version 300 es +precision highp float; + +in vec2 v_texcoord; +out vec4 fragColor; +uniform sampler2D tex; + +void main() { + // 1. Muestreo moderno + vec4 col = texture(tex, v_texcoord); + + // 2. Lógica de umbral (Threshold) + // 'length(col.rgb)' mide la intensidad total del color. + // Si la intensidad es menor a 0.1, lo forzamos a negro absoluto. + if(length(col.rgb) < 0.1) { + col.rgb = vec3(0.0); + } + + // 3. Salida + fragColor = col; +} diff --git a/noctalia-visual-layer/assets/shaders/08_vision.frag b/noctalia-visual-layer/assets/shaders/08_vision.frag new file mode 100755 index 00000000..e7423bab --- /dev/null +++ b/noctalia-visual-layer/assets/shaders/08_vision.frag @@ -0,0 +1,28 @@ +// @Title: Visión Nocturna +// @Icon: eye +// @Color: #4ade80 +// @Tag: NIGHT +// @Desc: Filtro de fósforo verde de alto contraste. + + + + +#version 300 es +precision highp float; + +in vec2 v_texcoord; +out vec4 fragColor; +uniform sampler2D tex; + +void main() { + // 1. Muestreo moderno + vec4 col = texture(tex, v_texcoord); + + // 2. Cálculo de luminancia + // Multiplicamos los colores por la sensibilidad del ojo humano + float lum = dot(col.rgb, vec3(0.299, 0.587, 0.114)); + + // 3. Reconstrucción de color + // R = 0.0, G = lum, B = 0.0, A = original + fragColor = vec4(0.0, lum, 0.0, col.a); +} diff --git a/noctalia-visual-layer/assets/shaders/09_hybrid.frag b/noctalia-visual-layer/assets/shaders/09_hybrid.frag new file mode 100755 index 00000000..87d4ca84 --- /dev/null +++ b/noctalia-visual-layer/assets/shaders/09_hybrid.frag @@ -0,0 +1,29 @@ +// @Title: Cyberpunk +// @Icon: cpu +// @Color: #d946ef +// @Tag: CYBER +// @Desc: Mezcla de contraste alto y tonos neón. + +#version 300 es +precision highp float; + +in vec2 v_texcoord; +out vec4 fragColor; +uniform sampler2D tex; + +void main() { + // 1. Captura de color moderna + vec4 col = texture(tex, v_texcoord); + + // 2. Desaturación controlada (30%) + // Calculamos el gris y lo mezclamos con el original para no perder todo el color + float gray = dot(col.rgb, vec3(0.299, 0.587, 0.114)); + vec3 mixed = mix(col.rgb, vec3(gray), 0.3); + + // 3. Empuje de contraste (Mid-tone boost) + // Usamos 0.5 como punto de pivote: lo claro se aclara, lo oscuro se oscurece + mixed = mix(vec3(0.5), mixed, 1.2); + + // 4. Salida final + fragColor = vec4(mixed, col.a); +} diff --git a/noctalia-visual-layer/assets/shaders/store.conf b/noctalia-visual-layer/assets/shaders/store.conf new file mode 100755 index 00000000..d8ce9885 --- /dev/null +++ b/noctalia-visual-layer/assets/shaders/store.conf @@ -0,0 +1,2 @@ +[General] +activeShaderFile= diff --git a/noctalia-visual-layer/assets/welcome.conf b/noctalia-visual-layer/assets/welcome.conf new file mode 100755 index 00000000..701ccba6 --- /dev/null +++ b/noctalia-visual-layer/assets/welcome.conf @@ -0,0 +1,2 @@ +[General] +isSystemActive=true diff --git a/noctalia-visual-layer/i18n/de.json b/noctalia-visual-layer/i18n/de.json new file mode 100644 index 00000000..b6951783 --- /dev/null +++ b/noctalia-visual-layer/i18n/de.json @@ -0,0 +1,248 @@ +{ + "meta": { + "lang": "de", + "name": "Deutsch", + "author": "Ximo & AI" + }, + "widget": { + "tooltip": "Noctalia Visual Layer", + "menu_settings": "Plugin-Einstellungen" + }, + "panel": { + "header_title": "Noctalia Visual", + "header_subtitle": "Ästhetisches Kontrollzentrum", + "tabs": { + "home": "Start", + "animations": "Animationen", + "borders": "Ränder", + "effects": "Effekte" + } + }, + "welcome": { + "activation_title": "Systemaktivierung", + "system_active": "Das System ist betriebsbereit. Visuelle Effekte werden sicher von NVL verwaltet.", + "system_inactive": "System angehalten. Erfordert die Annahme des Persistenzvertrags, um fortzufahren.", + "enable_label": "Visual Layer Aktivieren", + "warning": { + "title": "SICHERER PERSISTENZVERTRAG", + "text": "Bei Aktivierung wird NVL einen Wächterschild einsetzen und einen sicheren Pfad in Ihre hyprland.conf einfügen. Wenn Sie das Plugin über die Shell deinstallieren, reinigt sich das System beim nächsten Neustart selbst, ohne Hyprland-Fehler zu verursachen." + }, + "features": { + "title": "Funktionen", + "description": "Die Evolution Ihres Desktops.", + "list": { + "fluid_anim": "✨ Flüssige Animationen", + "smart_borders": "🎨 Smarte Ränder", + "realtime_shaders": "🕶️ Echtzeit-Shader", + "non_destructive": "🛡️ Nicht-destruktiv" + } + }, + "docs": { + "title": "Technische Dokumentation", + "description": "Interne Struktur und Guide.", + "btn_show": "Struktur anzeigen", + "btn_hide": "Struktur verbergen", + "content": { + "arch_title": "MODULARE ARCHITEKTUR", + "arch_desc": "Fragment-System zur Vermeidung von Konflikten.", + "struct_title": "DATEISTRUKTUR", + "flow_title": "DATENFLUSS", + "flow_1": "1. Aktivierung erstellt Datei in fragments/.", + "flow_2": "2. Script assemble.sh verbindet alles.", + "flow_3": "3. Saubere overlay.conf wird generiert.", + "flow_4": "4. Hyprland lädt ohne Fehler neu.", + "debug_title": "DEBUGGING", + "debug_desc": "Bei Fehlern overlay.conf prüfen." + } + }, + "credits": { + "title": "Credits", + "description": "Dank an HyDE Project.", + "btn_hyde": "Inspiriert von HyDE", + "ai_title": "Co-Coded mit KI", + "ai_desc": "Danke an Gemini für QML-Support." + } + }, + "animations": { + "header_title": "Bewegungsbibliothek", + "header_subtitle": "Wählen Sie den Animationsstil für Ihren Desktop", + "presets": { + "01_relampago": { + "title": "Blitz", + "desc": "Maximale visuelle Reaktion." + }, + "02_inercia_elastica": { + "title": "Elastische Trägheit", + "desc": "Organische Bewegung. Schwung beim Beenden und Abprallen beim Eintritt." + }, + "03_seda_minimalista": { + "title": "Minimalistische Seide", + "desc": "Absolute Sanftheit. Perfekte Landungen im macOS-Stil." + }, + "04_minimalismo_snappy": { + "title": "Snappy-Minimalismus", + "desc": "Optimiert für maximale Geschwindigkeit." + }, + "05_material_moderno": { + "title": "Modernes Material", + "desc": "Google Pixel Ästhetik. Organische Animationen." + }, + "06_impacto_clasico": { + "title": "Klassischer Aufprall", + "desc": "\"Jelly\"-Effekt. Elastisches Abprallen und Antizipation." + }, + "07_lineal": { + "title": "Linear", + "desc": "Mathematische Präzision. \"Sci-Fi HUD\"-Stil." + }, + "08_cristal": { + "title": "Glas", + "desc": "Ätherisches Gleiten. Gefühl von schwebendem Glas." + }, + "09_seda_silk": { + "title": "Seide (Silk)", + "desc": "Verfeinerter JaKooLit-Stil. Energische Einträge." + }, + "10_retro_arcade": { + "title": "Retro Arcade", + "desc": "\"Toon\"-Effekt. Übertriebenes Springen und Abprallen." + }, + "11_futurista": { + "title": "Futuristisch", + "desc": "Holografisches Interface. Digitaler vertikaler Fluss." + }, + "12_rebote": { + "title": "Abprall", + "desc": "Vertikale Federphysik. Fenster fallen und prallen ab." + }, + "13_organico": { + "title": "Organisch", + "desc": "Sanftes vertikales Wachstum und langsames Verblassen." + }, + "14_elastico": { + "title": "Elastisch", + "desc": "Gummiband-Physik. Dynamische Dehnung." + }, + "15_desvanecido": { + "title": "Verblassen", + "desc": "Spektrale Materialisierung ohne Bewegung." + }, + "16_dinamico": { + "title": "Dynamisch", + "desc": "Organischer Rhythmus. Geschwindigkeit und Sanftheit." + }, + "17_sutil": { + "title": "Subtil", + "desc": "Keine Ablenkungen. Absolute Sanftheit." + }, + "18_energico": { + "title": "Energisch", + "desc": "Maximaler visueller Effekt. Rückstoß-Exits." + } + } + }, + "borders": { + "geometry": { + "title": "Dicke", + "desc": "Breite (0-3px)" + }, + "header_title": "Visuelle Stile", + "header_subtitle": "Fensterpersönlichkeit", + "presets": { + "01_cascade": { + "title": "Kaskade", + "desc": "Sanfter Verlauf." + }, + "02_diagonal": { + "title": "Diagonal", + "desc": "Winkelverlauf." + }, + "03_duo": { + "title": "Duo", + "desc": "Starker Kontrast." + }, + "04_tri": { + "title": "Dreizack", + "desc": "Dreifarbige Eleganz." + }, + "05_spectrum": { + "title": "Spektrum", + "desc": "Vier Farben." + }, + "06_pulse": { + "title": "Puls", + "desc": "Rotiert bei Auswahl." + }, + "07_infinity": { + "title": "Unendlich", + "desc": "Konstante Rotation." + }, + "08_neon": { + "title": "Neon", + "desc": "Langsame Oszillation." + }, + "09_glitch": { + "title": "Cyber Glitch", + "desc": "Aggressiv, schnell." + }, + "10_golden": { + "title": "Gold", + "desc": "Metallische Reflexe." + }, + "11_toxic": { + "title": "Giftgrün", + "desc": "Fluoreszierende Reflexe." + }, + "12_neon_cyberpunk": { + "title": "Neon Cyber-Glow (Dual)", + "desc": "Simulation zweifarbiger Helligkeit mit einer weiß-violetten Lichtbasis." + }, + "13_the_joker": { + "title": "Der Joker", + "desc": "Joker-Ästhetik: Säuregrün und tiefes Lila mit elektrischem Leuchten." + } + } + }, + "shaders": { + "header_title": "Bildschirmfilter", + "header_subtitle": "Echtzeit-Verarbeitung", + "presets": { + "01_night": { + "title": "Nachtlicht", + "desc": "Augenschutz." + }, + "02_mono": { + "title": "Monochrom", + "desc": "Graustufen." + }, + "03_vibrant": { + "title": "Lebendig", + "desc": "Verstärkt Farben." + }, + "04_sharp": { + "title": "Schärfe", + "desc": "Verbessert Kanten." + }, + "05_ink": { + "title": "E-Ink", + "desc": "Papier-Textur." + }, + "06_invert": { + "title": "Invertiert", + "desc": "Invertiert Farben." + }, + "07_oled": { + "title": "OLED", + "desc": "Reines Schwarz." + }, + "08_vision": { + "title": "Nachtsicht", + "desc": "Militärgrün." + }, + "09_hybrid": { + "title": "Hybrid", + "desc": "Balance." + } + } + } +} diff --git a/noctalia-visual-layer/i18n/en.json b/noctalia-visual-layer/i18n/en.json new file mode 100644 index 00000000..eb1f60b0 --- /dev/null +++ b/noctalia-visual-layer/i18n/en.json @@ -0,0 +1,237 @@ +{ + "meta": { + "lang": "en", + "name": "English", + "author": "Ximo & AI" + }, + "widget": { + "tooltip": "Noctalia Visual Layer", + "menu_settings": "Plugin Settings" + }, + "panel": { + "header_title": "Noctalia Visual", + "header_subtitle": "Aesthetic Control Center", + "tabs": { + "home": "Home", + "animations": "Animations", + "borders": "Borders", + "effects": "Effects" + } + }, + "welcome": { + "activation_title": "System Activation", + "system_active": "The system is operational. Visual effects are safely managed by NVL.", + "system_inactive": "System halted. Requires acceptance of the persistence contract to continue.", + "enable_label": "Enable Visual Layer", + "warning": { + "title": "SECURE PERSISTENCE CONTRACT", + "text": "Upon activation, NVL will deploy a guardian shield and inject a secure path into your hyprland.conf. If you uninstall the plugin from the Shell, the system will self-clean on the next reboot without causing Hyprland errors." + }, + "features": { + "title": "Features & Benefits", + "description": "Noctalia Visual Layer is the aesthetic evolution of your desktop.", + "list": { + "fluid_anim": "✨ Fluid Animations", + "smart_borders": "🎨 Smart Borders", + "realtime_shaders": "🕶️ Real-Time Shaders", + "non_destructive": "🛡️ Non-Destructive" + } + }, + "docs": { + "title": "Architecture & Documentation", + "description": "Discover how NVL works under the hood.", + "summary": "Noctalia Visual Layer uses a real-time Fragments and Assembly system. It never touches your main configuration. Everything is safely generated in an isolated overlay.conf master file.", + "btn_readme": "Read Full Manual", + "btn_folder": "Browse Files" + }, + "credits": { + "title": "Credits", + "description": "Special thanks to the HyDE Project.", + "btn_hyde": "Inspired by HyDE Project", + "ai_title": "AI Co-Programmed", + "ai_desc": "QML Architecture assistance by Gemini (Google)." + } + }, + "animations": { + "header_title": "Motion Library", + "header_subtitle": "Select the animation style for your desktop", + "presets": { + "01_relampago": { + "title": "Lightning", + "desc": "Maximum visual response." + }, + "02_inercia_elastica": { + "title": "Elastic Inertia", + "desc": "Organic movement. Windows gain momentum on exit and bounce on entry." + }, + "03_seda_minimalista": { + "title": "Minimalist Silk", + "desc": "Absolute smoothness. No bounces, just perfect macOS-style landings." + }, + "04_minimalismo_snappy": { + "title": "Snappy Minimalism", + "desc": "Optimized for maximum speed. Window and workspace management only." + }, + "05_material_moderno": { + "title": "Modern Material", + "desc": "Google Pixel aesthetic. Organic animations, subtle scaling, and tactile response." + }, + "06_impacto_clasico": { + "title": "Classic Impact", + "desc": "\"Jelly\" effect. Elastic bounce on entry and anticipation on exit." + }, + "07_lineal": { + "title": "Linear", + "desc": "Mathematical precision. Constant motion, \"Sci-Fi HUD\" style." + }, + "08_cristal": { + "title": "Glass", + "desc": "Ethereal glide. Feeling of glass floating without friction." + }, + "09_seda_silk": { + "title": "Silk", + "desc": "Refined JaKooLit style. Energetic entries, fleeting exits, and stable workspaces." + }, + "10_retro_arcade": { + "title": "Retro Arcade", + "desc": "\"Toon/Arcade\" effect. Windows jump and bounce exaggeratedly." + }, + "11_futurista": { + "title": "Futuristic", + "desc": "Holographic interface. Digital precision, zero bounces, and vertical data flow." + }, + "12_rebote": { + "title": "Bounce", + "desc": "Vertical spring physics. Windows fall and bounce upon opening." + }, + "13_organico": { + "title": "Organic", + "desc": "\"Sprout\" movement. Smooth vertical growth and slow fades." + }, + "14_elastico": { + "title": "Elastic", + "desc": "Rubber band physics. Windows arrive, stretch, and bounce vertically." + }, + "15_desvanecido": { + "title": "Fade", + "desc": "Spectral materialization. Windows appear smoothly with barely any movement." + }, + "16_dinamico": { + "title": "Dynamic", + "desc": "Organic rhythm. Combination of speed and smooth settling." + }, + "17_sutil": { + "title": "Subtle", + "desc": "Zero distractions. Absolute smoothness without bounces or abrupt movements." + }, + "18_energico": { + "title": "Energetic", + "desc": "Maximum visual impact. Exaggerated bounces (56%) and kickback exits." + } + } + }, + "borders": { + "geometry": { + "title": "Border Thickness", + "desc": "Define line thickness (0-3px)" + }, + "header_title": "Visual Styles", + "header_subtitle": "Define your windows' personality", + "presets": { + "01_cascade": { + "title": "Cascade", + "desc": "Soft vertical gradient at 50%." + }, + "02_diagonal": { + "title": "Diagonal", + "desc": "Dynamic angle fade." + }, + "03_duo": { + "title": "Duo Contrast", + "desc": "Strong Primary/Secondary contrast." + }, + "04_tri": { + "title": "Trident", + "desc": "Tricolor elegance with gold." + }, + "05_spectrum": { + "title": "Spectrum", + "desc": "Four colors for maximum visibility." + }, + "06_pulse": { + "title": "Pulse", + "desc": "Rotates once when selecting window." + }, + "07_infinity": { + "title": "Infinity", + "desc": "Constant color rotation." + }, + "08_neon": { + "title": "Neon Breath", + "desc": "Slow and relaxing oscillation." + }, + "09_glitch": { + "title": "Cyber Glitch", + "desc": "Aggressive, fast, and error colors." + }, + "10_golden": { + "title": "Golden Luxury", + "desc": "Gold metallic reflections." + }, + "11_toxic": { + "title": "Toxic Green", + "desc": "Fluor green metallic reflections." + }, + "12_neon_cyberpunk": { + "title": "Neon Cyber-Glow (Dual)", + "desc": "Simulation of bicolor brightness using a white/violet light base." + }, + "13_the_joker": { + "title": "The Joker", + "desc": "Joker aesthetic: Acid green and deep purple with an electric glow." + } + } + }, + "shaders": { + "header_title": "Screen Filters", + "header_subtitle": "Real-time image post-processing", + "presets": { + "01_night": { + "title": "Night Light", + "desc": "Warm filter to protect eyesight." + }, + "02_mono": { + "title": "Monochrome", + "desc": "Grayscale for concentration." + }, + "03_vibrant": { + "title": "Vibrant", + "desc": "Intelligently enhances colors." + }, + "04_sharp": { + "title": "HD Sharpness", + "desc": "Improves border and text definition." + }, + "05_ink": { + "title": "E-Ink Paper", + "desc": "Sepia electronic paper texture." + }, + "06_invert": { + "title": "Inverted", + "desc": "Inverts all colors." + }, + "07_oled": { + "title": "OLED Mode", + "desc": "Pure blacks and dramatic contrast." + }, + "08_vision": { + "title": "Night Vision", + "desc": "Military green phosphor effect." + }, + "09_hybrid": { + "title": "Hybrid", + "desc": "Balance between correction and style." + } + } + } +} diff --git a/noctalia-visual-layer/i18n/es.json b/noctalia-visual-layer/i18n/es.json new file mode 100644 index 00000000..32ea13f9 --- /dev/null +++ b/noctalia-visual-layer/i18n/es.json @@ -0,0 +1,237 @@ +{ + "meta": { + "lang": "es", + "name": "Español", + "author": "Ximo & AI" + }, + "widget": { + "tooltip": "Noctalia Visual Layer", + "menu_settings": "Ajustes del Plugin" + }, + "panel": { + "header_title": "Noctalia Visual", + "header_subtitle": "Centro de Control Estético", + "tabs": { + "home": "Inicio", + "animations": "Animaciones", + "borders": "Bordes", + "effects": "Efectos" + } + }, + "welcome": { + "activation_title": "Activación del Sistema", + "system_active": "El sistema está operativo. Los efectos visuales están gestionados por NVL de forma segura.", + "system_inactive": "Sistema detenido. Requiere aceptación del contrato de persistencia para continuar.", + "enable_label": "Habilitar Visual Layer", + "warning": { + "title": "CONTRATO DE PERSISTENCIA SEGURA", + "text": "Al activar, NVL desplegará un escudo guardián e inyectará una ruta segura en tu hyprland.conf. Si desinstalas el plugin desde la Shell, el sistema se autolimpiará en el próximo reinicio sin causar errores en Hyprland." + }, + "features": { + "title": "Características & Bondades", + "description": "Noctalia Visual Layer es la evolución estética de tu escritorio.", + "list": { + "fluid_anim": "✨ Animaciones Fluidas", + "smart_borders": "🎨 Bordes Inteligentes", + "realtime_shaders": "🕶️ Shaders Real-Time", + "non_destructive": "🛡️ No Destructivo" + } + }, + "docs": { + "title": "Arquitectura y Documentación", + "description": "Descubre cómo funciona NVL por debajo.", + "summary": "Noctalia Visual Layer utiliza un sistema de Fragmentos y Ensamblaje en tiempo real. Nunca toca tu configuración principal. Todo se genera de forma segura en un archivo maestro overlay.conf aislado.", + "btn_readme": "Leer Manual Completo", + "btn_folder": "Explorar Archivos" + }, + "credits": { + "title": "Créditos", + "description": "Agradecimientos especiales al HyDE Project.", + "btn_hyde": "Inspirado en HyDE Project", + "ai_title": "Co-Programado con IA", + "ai_desc": "Agradecimientos a Gemini (Google) por la asistencia en arquitectura QML." + } + }, + "animations": { + "header_title": "Biblioteca de Movimiento", + "header_subtitle": "Selecciona el estilo de animación para tu escritorio", + "presets": { + "01_relampago": { + "title": "Relámpago", + "desc": "Máxima respuesta visual." + }, + "02_inercia_elastica": { + "title": "Inercia Elástica", + "desc": "Movimiento orgánico. Las ventanas toman impulso al salir y rebotan al entrar." + }, + "03_seda_minimalista": { + "title": "Seda Minimalista", + "desc": "Suavidad absoluta. Sin rebotes, solo aterrizajes perfectos estilo macOS." + }, + "04_minimalismo_snappy": { + "title": "Minimalismo Snappy", + "desc": "Optimizado para la máxima velocidad. Solo gestión de ventanas y workspaces." + }, + "05_material_moderno": { + "title": "Material Moderno", + "desc": "Estética Google Pixel. Animaciones orgánicas, escalas sutiles y respuesta táctil." + }, + "06_impacto_clasico": { + "title": "Impacto Clásico", + "desc": "Efecto \"Jelly\". Rebote elástico al entrar y anticipación al salir." + }, + "07_lineal": { + "title": "Lineal", + "desc": "Precisión matemática. Movimiento constante estilo \"Sci-Fi HUD\"." + }, + "08_cristal": { + "title": "Cristal", + "desc": "Deslizamiento etéreo. Sensación de vidrio flotando sin fricción." + }, + "09_seda_silk": { + "title": "Seda (Silk)", + "desc": "El estilo JaKooLit refinado. Entradas con energía, salidas fugaces y workspaces estables." + }, + "10_retro_arcade": { + "title": "Retro Arcade", + "desc": "Efecto \"Toon/Arcade\". Las ventanas saltan y rebotan exageradamente." + }, + "11_futurista": { + "title": "Futurista", + "desc": "Interfaz holográfica. Precisión digital, cero rebotes y flujo de datos vertical." + }, + "12_rebote": { + "title": "Rebote", + "desc": "Física de muelle vertical. Las ventanas caen y rebotan al abrirse." + }, + "13_organico": { + "title": "Orgánico", + "desc": "Movimiento de \"brote\". Crecimiento vertical suave y desvanecimientos lentos." + }, + "14_elastico": { + "title": "Elástico", + "desc": "Física de banda elástica. Las ventanas llegan, se estiran y rebotan verticalmente." + }, + "15_desvanecido": { + "title": "Desvanecido", + "desc": "Materialización espectral. Las ventanas aparecen suavemente sin moverse apenas." + }, + "16_dinamico": { + "title": "Dinámico", + "desc": "Ritmo orgánico. Combinación de velocidad y asentamiento suave." + }, + "17_sutil": { + "title": "Sutil", + "desc": "Cero distracciones. Suavidad absoluta sin rebotes ni movimientos bruscos." + }, + "18_energico": { + "title": "Enérgico", + "desc": "Impacto visual máximo. Rebotes exagerados (56%) y salidas con retroceso." + } + } + }, + "borders": { + "geometry": { + "title": "Grosor del Borde", + "desc": "Define el grosor de la línea (0-3px)" + }, + "header_title": "Estilos Visuales", + "header_subtitle": "Define la personalidad de tus ventanas", + "presets": { + "01_cascade": { + "title": "Cascada", + "desc": "Degradado vertical suave al 50%." + }, + "02_diagonal": { + "title": "Diagonal", + "desc": "Desvanecimiento dinámico en ángulo." + }, + "03_duo": { + "title": "Dúo Contraste", + "desc": "Fuerte contraste Primario/Secundario." + }, + "04_tri": { + "title": "Tridente", + "desc": "Elegancia tricolor con dorado." + }, + "05_spectrum": { + "title": "Espectro", + "desc": "Cuatro colores para máxima visibilidad." + }, + "06_pulse": { + "title": "Latido", + "desc": "Gira una vez al seleccionar la ventana." + }, + "07_infinity": { + "title": "Infinito", + "desc": "Rotación constante de colores." + }, + "08_neon": { + "title": "Respiración Neón", + "desc": "Oscilación lenta y relajante." + }, + "09_glitch": { + "title": "Cyber Glitch", + "desc": "Agresivo, rápido y colores de error." + }, + "10_golden": { + "title": "Golden Luxury", + "desc": "Reflejos metálicos dorados." + }, + "11_toxic": { + "title": "Toxic Green", + "desc": "Reflejos metálicos verdes flúor." + }, + "12_neon_cyberpunk": { + "title": "Neón Cyber-Glow (Dual)", + "desc": "Simulación de brillo bicolor usando una base de luz blanca y violeta." + }, + "13_the_joker": { + "title": "El Joker", + "desc": "Estética Joker: Verde ácido y morado profundo con un brillo eléctrico." + } + } + }, + "shaders": { + "header_title": "Filtros de Pantalla", + "header_subtitle": "Post-procesado de imagen en tiempo real", + "presets": { + "01_night": { + "title": "Luz Nocturna", + "desc": "Filtro cálido para proteger la vista." + }, + "02_mono": { + "title": "Monocromo", + "desc": "Escala de grises para concentración." + }, + "03_vibrant": { + "title": "Vibrante", + "desc": "Realza colores de forma inteligente." + }, + "04_sharp": { + "title": "Nitidez HD", + "desc": "Mejora la definición de bordes y textos." + }, + "05_ink": { + "title": "Papel E-Ink", + "desc": "Textura de papel electrónico sepia." + }, + "06_invert": { + "title": "Invertido", + "desc": "Invierte todos los colores." + }, + "07_oled": { + "title": "Modo OLED", + "desc": "Negros puros y contraste dramático." + }, + "08_vision": { + "title": "Visión Nocturna", + "desc": "Efecto fósforo verde militar." + }, + "09_hybrid": { + "title": "Híbrido", + "desc": "Balance entre corrección y estilo." + } + } + } +} diff --git a/noctalia-visual-layer/i18n/fr.json b/noctalia-visual-layer/i18n/fr.json new file mode 100644 index 00000000..3d4eb011 --- /dev/null +++ b/noctalia-visual-layer/i18n/fr.json @@ -0,0 +1,248 @@ +{ + "meta": { + "lang": "fr", + "name": "Français", + "author": "Ximo & AI" + }, + "widget": { + "tooltip": "Noctalia Visual Layer", + "menu_settings": "Paramètres du Plugin" + }, + "panel": { + "header_title": "Noctalia Visual", + "header_subtitle": "Centre de Contrôle Esthétique", + "tabs": { + "home": "Accueil", + "animations": "Animations", + "borders": "Bordures", + "effects": "Effets" + } + }, + "welcome": { + "activation_title": "Activation du Système", + "system_active": "Le système est opérationnel. Les effets visuels sont gérés par NVL en toute sécurité.", + "system_inactive": "Système arrêté. Nécessite l'acceptation du contrat de persistance pour continuer.", + "enable_label": "Activer Visual Layer", + "warning": { + "title": "CONTRAT DE PERSISTANCE SÉCURISÉE", + "text": "Lors de l'activation, NVL déploiera un bouclier gardien et injectera un chemin sécurisé dans votre hyprland.conf. Si vous désinstallez le plugin depuis le Shell, le système s'auto-nettoiera au prochain redémarrage sans causer d'erreurs dans Hyprland." + }, + "features": { + "title": "Caractéristiques", + "description": "Noctalia Visual Layer est l'évolution esthétique de votre bureau.", + "list": { + "fluid_anim": "✨ Animations Fluides", + "smart_borders": "🎨 Bordures Intelligentes", + "realtime_shaders": "🕶️ Shaders Temps Réel", + "non_destructive": "🛡️ Non Destructif" + } + }, + "docs": { + "title": "Documentation Technique", + "description": "Structure interne et guide développeur.", + "btn_show": "Voir Structure", + "btn_hide": "Masquer Structure", + "content": { + "arch_title": "ARCHITECTURE MODULAIRE (Système de Fragments)", + "arch_desc": "Ce plugin utilise un système de construction dynamique pour éviter les conflits.", + "struct_title": "STRUCTURE DES FICHIERS", + "flow_title": "FLUX DE DONNÉES", + "flow_1": "1. L'activation crée un fichier dans fragments/.", + "flow_2": "2. Le script assemble.sh joint tous les fragments.", + "flow_3": "3. Un fichier overlay.conf propre est généré.", + "flow_4": "4. Hyprland recharge la configuration sans erreurs.", + "debug_title": "DÉBOGAGE", + "debug_desc": "Si quelque chose échoue, vérifiez overlay.conf." + } + }, + "credits": { + "title": "Crédits", + "description": "Merci au Projet HyDE.", + "btn_hyde": "Inspiré par HyDE Project", + "ai_title": "Co-Codé avec IA", + "ai_desc": "Merci à Gemini pour l'assistance QML." + } + }, + "animations": { + "header_title": "Bibliothèque de Mouvement", + "header_subtitle": "Sélectionnez le style d’animation pour votre bureau", + "presets": { + "01_relampago": { + "title": "Éclair", + "desc": "Réponse visuelle maximale." + }, + "02_inercia_elastica": { + "title": "Inertie Élastique", + "desc": "Mouvement organique. Élan en sortie et rebond à l’entrée." + }, + "03_seda_minimalista": { + "title": "Soie Minimaliste", + "desc": "Douceur absolue. Atterrissages parfaits style macOS." + }, + "04_minimalismo_snappy": { + "title": "Minimalisme Snappy", + "desc": "Vitesse maximale. Gestion pure des fenêtres et espaces." + }, + "05_material_moderno": { + "title": "Matériel Moderne", + "desc": "Esthétique Google Pixel. Animations organiques et tactiles." + }, + "06_impacto_clasico": { + "title": "Impact Classique", + "desc": "Effet \"Jelly\". Rebond élastique et anticipation." + }, + "07_lineal": { + "title": "Linéaire", + "desc": "Précision mathématique. Style \"Sci-Fi HUD\"." + }, + "08_cristal": { + "title": "Cristal", + "desc": "Glissement éthéré. Sensation de verre en apesanteur." + }, + "09_seda_silk": { + "title": "Soie (Silk)", + "desc": "Le style JaKooLit raffiné. Entrées énergiques." + }, + "10_retro_arcade": { + "title": "Rétro Arcade", + "desc": "Effet \"Toon\". Sauts et rebonds exagérés." + }, + "11_futurista": { + "title": "Futuriste", + "desc": "Interface holographique. Flux de données vertical." + }, + "12_rebote": { + "title": "Rebond", + "desc": "Physique de ressort. Les fenêtres tombent et rebondissent." + }, + "13_organico": { + "title": "Organique", + "desc": "Croissance verticale douce et fondus lents." + }, + "14_elastico": { + "title": "Élastique", + "desc": "Physique de bande élastique. Étirement dynamique." + }, + "15_desvanecido": { + "title": "Fondu", + "desc": "Matérialisation spectrale sans mouvement." + }, + "16_dinamico": { + "title": "Dynamique", + "desc": "Rythme organique. Vitesse et stabilité." + }, + "17_sutil": { + "title": "Subtil", + "desc": "Zéro distraction. Douceur absolue." + }, + "18_energico": { + "title": "Énergique", + "desc": "Impact visuel maximal. Sorties avec recul." + } + } + }, + "borders": { + "geometry": { + "title": "Épaisseur", + "desc": "Largeur (0-3px)" + }, + "header_title": "Styles Visuels", + "header_subtitle": "Personnalité des fenêtres", + "presets": { + "01_cascade": { + "title": "Cascade", + "desc": "Dégradé vertical doux." + }, + "02_diagonal": { + "title": "Diagonale", + "desc": "Fondu dynamique en angle." + }, + "03_duo": { + "title": "Duo Contraste", + "desc": "Fort contraste Primaire/Secondaire." + }, + "04_tri": { + "title": "Trident", + "desc": "Élégance tricolor dorée." + }, + "05_spectrum": { + "title": "Spectre", + "desc": "Quatre couleurs pour visibilité max." + }, + "06_pulse": { + "title": "Pulsation", + "desc": "Tourne une fois à la sélection." + }, + "07_infinity": { + "title": "Infini", + "desc": "Rotation constante des couleurs." + }, + "08_neon": { + "title": "Souffle Néon", + "desc": "Oscillation lente et relaxante." + }, + "09_glitch": { + "title": "Cyber Glitch", + "desc": "Agressif, rapide, couleurs d'erreur." + }, + "10_golden": { + "title": "Luxe Doré", + "desc": "Reflets métalliques dorés." + }, + "11_toxic": { + "title": "Vert Toxique", + "desc": "Reflets métalliques vert fluo." + }, + "12_neon_cyberpunk": { + "title": "Néon Cyber-Glow (Dual)", + "desc": "Simulation de luminosité bicolore utilisant une base de lumière blanche et violette." + }, + "13_the_joker": { + "title": "Le Joker", + "desc": "Esthétique Joker : Vert acide et violet profond avec un éclat électrique." + } + } + }, + "shaders": { + "header_title": "Filtres d'Écran", + "header_subtitle": "Post-traitement temps réel", + "presets": { + "01_night": { + "title": "Lumière Nocturne", + "desc": "Filtre chaud protecteur." + }, + "02_mono": { + "title": "Monochrome", + "desc": "Niveaux de gris pour focus." + }, + "03_vibrant": { + "title": "Vibrant", + "desc": "Rehausse les couleurs." + }, + "04_sharp": { + "title": "Netteté HD", + "desc": "Améliore bords et textes." + }, + "05_ink": { + "title": "Papier E-Ink", + "desc": "Texture papier sépia." + }, + "06_invert": { + "title": "Inversé", + "desc": "Inverse toutes les couleurs." + }, + "07_oled": { + "title": "Mode OLED", + "desc": "Noirs purs et contraste." + }, + "08_vision": { + "title": "Vision Nocturne", + "desc": "Effet phosphore vert." + }, + "09_hybrid": { + "title": "Hybride", + "desc": "Équilibre correction et style." + } + } + } +} diff --git a/noctalia-visual-layer/i18n/hu.json b/noctalia-visual-layer/i18n/hu.json new file mode 100644 index 00000000..ce3377f0 --- /dev/null +++ b/noctalia-visual-layer/i18n/hu.json @@ -0,0 +1,248 @@ +{ + "meta": { + "lang": "en", + "name": "English", + "author": "Ximo & AI" + }, + "widget": { + "tooltip": "Noctalia Visual Layer", + "menu_settings": "Plugin Settings" + }, + "panel": { + "header_title": "Noctalia Visual", + "header_subtitle": "Aesthetic Control Center", + "tabs": { + "home": "Home", + "animations": "Animations", + "borders": "Borders", + "effects": "Effects" + } + }, + "welcome": { + "activation_title": "System Activation", + "system_active": "The system is operational. Visual effects are safely managed by NVL.", + "system_inactive": "System halted. Requires acceptance of the persistence contract to continue.", + "enable_label": "Enable Visual Layer", + "warning": { + "title": "SECURE PERSISTENCE CONTRACT", + "text": "Upon activation, NVL will deploy a guardian shield and inject a secure path into your hyprland.conf. If you uninstall the plugin from the Shell, the system will self-clean on the next reboot without causing Hyprland errors." + }, + "features": { + "title": "Features & Benefits", + "description": "Noctalia Visual Layer is the aesthetic evolution of your desktop.", + "list": { + "fluid_anim": "✨ Fluid Animations", + "smart_borders": "🎨 Smart Borders", + "realtime_shaders": "🕶️ Real-Time Shaders", + "non_destructive": "🛡️ Non-Destructive" + } + }, + "docs": { + "title": "Technical Documentation", + "description": "Internal plugin structure and developer guide.", + "btn_show": "Show File Structure", + "btn_hide": "Hide Structure", + "content": { + "arch_title": "MODULAR ARCHITECTURE (Fragment System)", + "arch_desc": "This plugin uses a dynamic construction system to avoid module conflicts.", + "struct_title": "FILE STRUCTURE", + "flow_title": "DATA FLOW", + "flow_1": "1. Activating a module creates its file in fragments/.", + "flow_2": "2. The assemble.sh script joins all fragments.", + "flow_3": "3. A clean overlay.conf is generated.", + "flow_4": "4. Hyprland reloads configuration without errors.", + "debug_title": "DEBUGGING", + "debug_desc": "If something fails, check the overlay.conf file. It should contain the sum of all active effects." + } + }, + "credits": { + "title": "Credits", + "description": "Special thanks to the HyDE Project.", + "btn_hyde": "Inspired by HyDE Project", + "ai_title": "AI Co-Programmed", + "ai_desc": "QML Architecture assistance by Gemini (Google)." + } + }, + "animations": { + "header_title": "Motion Library", + "header_subtitle": "Select the animation style for your desktop", + "presets": { + "01_relampago": { + "title": "Lightning", + "desc": "Maximum visual response." + }, + "02_inercia_elastica": { + "title": "Elastic Inertia", + "desc": "Organic movement. Windows gain momentum on exit and bounce on entry." + }, + "03_seda_minimalista": { + "title": "Minimalist Silk", + "desc": "Absolute smoothness. No bounces, just perfect macOS-style landings." + }, + "04_minimalismo_snappy": { + "title": "Snappy Minimalism", + "desc": "Optimized for maximum speed. Window and workspace management only." + }, + "05_material_moderno": { + "title": "Modern Material", + "desc": "Google Pixel aesthetic. Organic animations, subtle scaling, and tactile response." + }, + "06_impacto_clasico": { + "title": "Classic Impact", + "desc": "\"Jelly\" effect. Elastic bounce on entry and anticipation on exit." + }, + "07_lineal": { + "title": "Linear", + "desc": "Mathematical precision. Constant motion, \"Sci-Fi HUD\" style." + }, + "08_cristal": { + "title": "Glass", + "desc": "Ethereal glide. Feeling of glass floating without friction." + }, + "09_seda_silk": { + "title": "Silk", + "desc": "Refined JaKooLit style. Energetic entries, fleeting exits, and stable workspaces." + }, + "10_retro_arcade": { + "title": "Retro Arcade", + "desc": "\"Toon/Arcade\" effect. Windows jump and bounce exaggeratedly." + }, + "11_futurista": { + "title": "Futuristic", + "desc": "Holographic interface. Digital precision, zero bounces, and vertical data flow." + }, + "12_rebote": { + "title": "Bounce", + "desc": "Vertical spring physics. Windows fall and bounce upon opening." + }, + "13_organico": { + "title": "Organic", + "desc": "\"Sprout\" movement. Smooth vertical growth and slow fades." + }, + "14_elastico": { + "title": "Elastic", + "desc": "Rubber band physics. Windows arrive, stretch, and bounce vertically." + }, + "15_desvanecido": { + "title": "Fade", + "desc": "Spectral materialization. Windows appear smoothly with barely any movement." + }, + "16_dinamico": { + "title": "Dynamic", + "desc": "Organic rhythm. Combination of speed and smooth settling." + }, + "17_sutil": { + "title": "Subtle", + "desc": "Zero distractions. Absolute smoothness without bounces or abrupt movements." + }, + "18_energico": { + "title": "Energetic", + "desc": "Maximum visual impact. Exaggerated bounces (56%) and kickback exits." + } + } + }, + "borders": { + "geometry": { + "title": "Border Thickness", + "desc": "Define line thickness (0-3px)" + }, + "header_title": "Visual Styles", + "header_subtitle": "Define your windows' personality", + "presets": { + "01_cascade": { + "title": "Cascade", + "desc": "Soft vertical gradient at 50%." + }, + "02_diagonal": { + "title": "Diagonal", + "desc": "Dynamic angle fade." + }, + "03_duo": { + "title": "Duo Contrast", + "desc": "Strong Primary/Secondary contrast." + }, + "04_tri": { + "title": "Trident", + "desc": "Tricolor elegance with gold." + }, + "05_spectrum": { + "title": "Spectrum", + "desc": "Four colors for maximum visibility." + }, + "06_pulse": { + "title": "Pulse", + "desc": "Rotates once when selecting window." + }, + "07_infinity": { + "title": "Infinity", + "desc": "Constant color rotation." + }, + "08_neon": { + "title": "Neon Breath", + "desc": "Slow and relaxing oscillation." + }, + "09_glitch": { + "title": "Cyber Glitch", + "desc": "Aggressive, fast, and error colors." + }, + "10_golden": { + "title": "Golden Luxury", + "desc": "Gold metallic reflections." + }, + "11_toxic": { + "title": "Toxic Green", + "desc": "Fluor green metallic reflections." + }, + "12_neon_cyberpunk": { + "title": "Neon Cyber-Glow (Dual)", + "desc": "Simulation of bicolor brightness using a white/violet light base." + }, + "13_the_joker": { + "title": "The Joker", + "desc": "Joker aesthetic: Acid green and deep purple with an electric glow." + } + } + }, + "shaders": { + "header_title": "Screen Filters", + "header_subtitle": "Real-time image post-processing", + "presets": { + "01_night": { + "title": "Night Light", + "desc": "Warm filter to protect eyesight." + }, + "02_mono": { + "title": "Monochrome", + "desc": "Grayscale for concentration." + }, + "03_vibrant": { + "title": "Vibrant", + "desc": "Intelligently enhances colors." + }, + "04_sharp": { + "title": "HD Sharpness", + "desc": "Improves border and text definition." + }, + "05_ink": { + "title": "E-Ink Paper", + "desc": "Sepia electronic paper texture." + }, + "06_invert": { + "title": "Inverted", + "desc": "Inverts all colors." + }, + "07_oled": { + "title": "OLED Mode", + "desc": "Pure blacks and dramatic contrast." + }, + "08_vision": { + "title": "Night Vision", + "desc": "Military green phosphor effect." + }, + "09_hybrid": { + "title": "Hybrid", + "desc": "Balance between correction and style." + } + } + } +} diff --git a/noctalia-visual-layer/i18n/it.json b/noctalia-visual-layer/i18n/it.json new file mode 100644 index 00000000..ec299b52 --- /dev/null +++ b/noctalia-visual-layer/i18n/it.json @@ -0,0 +1,248 @@ +{ + "meta": { + "lang": "it", + "name": "Italiano", + "author": "Ximo & AI" + }, + "widget": { + "tooltip": "Noctalia Visual Layer", + "menu_settings": "Impostazioni Plugin" + }, + "panel": { + "header_title": "Noctalia Visual", + "header_subtitle": "Centro di Controllo", + "tabs": { + "home": "Home", + "animations": "Animazioni", + "borders": "Bordi", + "effects": "Effetti" + } + }, + "welcome": { + "activation_title": "Attivazione del Sistema", + "system_active": "Il sistema è operativo. Gli effetti visivi sono gestiti da NVL in modo sicuro.", + "system_inactive": "Sistema fermo. Richiede l'accettazione del contratto di persistenza per continuare.", + "enable_label": "Abilita Visual Layer", + "warning": { + "title": "CONTRATTO DI PERSISTENZA SICURA", + "text": "All'attivazione, NVL distribuirà uno scudo guardiano e inietterà un percorso sicuro nel tuo hyprland.conf. Se disinstalli il plugin dalla Shell, il sistema si auto-pulirà al prossimo riavvio senza causare errori in Hyprland." + }, + "features": { + "title": "Caratteristiche", + "description": "L'evoluzione estetica del desktop.", + "list": { + "fluid_anim": "✨ Animazioni Fluide", + "smart_borders": "🎨 Bordi Intelligenti", + "realtime_shaders": "🕶️ Shaders Real-Time", + "non_destructive": "🛡️ Non Distruttivo" + } + }, + "docs": { + "title": "Documentazione", + "description": "Guida tecnica.", + "btn_show": "Vedi Struttura", + "btn_hide": "Nascondi Struttura", + "content": { + "arch_title": "ARCHITETTURA MODULARE", + "arch_desc": "Sistema a frammenti per evitare conflitti.", + "struct_title": "STRUTTURA FILE", + "flow_title": "FLUSSO DATI", + "flow_1": "1. L'attivazione crea file in fragments/.", + "flow_2": "2. Script assemble.sh unisce tutto.", + "flow_3": "3. Generato overlay.conf pulito.", + "flow_4": "4. Hyprland ricarica senza errori.", + "debug_title": "DEBUG", + "debug_desc": "Se fallisce, controlla overlay.conf." + } + }, + "credits": { + "title": "Crediti", + "description": "Grazie a HyDE Project.", + "btn_hyde": "Ispirato da HyDE", + "ai_title": "Co-Codificato con IA", + "ai_desc": "Grazie a Gemini per aiuto QML." + } + }, + "animations": { + "header_title": "Libreria di Movimento", + "header_subtitle": "Seleziona lo stile di animazione per il desktop", + "presets": { + "01_relampago": { + "title": "Fulmine", + "desc": "Massima risposta visiva." + }, + "02_inercia_elastica": { + "title": "Inerzia Elastica", + "desc": "Movimento organico. Slancio in uscita e rimbalzo in entrata." + }, + "03_seda_minimalista": { + "title": "Seta Minimalista", + "desc": "Morbidezza assoluta. Atterraggi perfetti stile macOS." + }, + "04_minimalismo_snappy": { + "title": "Minimalismo Snappy", + "desc": "Ottimizzato per la velocità massima." + }, + "05_material_moderno": { + "title": "Materiale Moderno", + "desc": "Estetica Google Pixel. Animazioni organiche e tattili." + }, + "06_impacto_clasico": { + "title": "Impatto Classico", + "desc": "Effetto \"Jelly\". Rimbalzo elastico e anticipazione." + }, + "07_lineal": { + "title": "Lineare", + "desc": "Precisione matematica. Stile \"Sci-Fi HUD\"." + }, + "08_cristal": { + "title": "Cristallo", + "desc": "Scorrimento etereo. Sensazione di vetro fluttuante." + }, + "09_seda_silk": { + "title": "Seta (Silk)", + "desc": "Stile JaKooLit raffinato. Ingressi energici." + }, + "10_retro_arcade": { + "title": "Retro Arcade", + "desc": "Effetto \"Toon\". Salti e rimbalzi esagerati." + }, + "11_futurista": { + "title": "Futurista", + "desc": "Interfaccia olografica. Flusso di dati verticale." + }, + "12_rebote": { + "title": "Rimbalzo", + "desc": "Fisica a molla verticale. Le finestre cadono e rimbalzano." + }, + "13_organico": { + "title": "Organico", + "desc": "Crescita verticale morbida e dissolvenze lente." + }, + "14_elastico": { + "title": "Elastico", + "desc": "Fisica dell’elastico. Allungamento dinamico." + }, + "15_desvanecido": { + "title": "Dissolvenza", + "desc": "Materializzazione spettrale senza movimento." + }, + "16_dinamico": { + "title": "Dinamico", + "desc": "Ritmo organico. Velocità e morbidezza." + }, + "17_sutil": { + "title": "Sottile", + "desc": "Zero distrazioni. Morbidezza assoluta." + }, + "18_energico": { + "title": "Energico", + "desc": "Massimo impatto visivo. Uscite con rinculo." + } + } + }, + "borders": { + "geometry": { + "title": "Spessore", + "desc": "Larghezza (0-3px)" + }, + "header_title": "Stili Visivi", + "header_subtitle": "Personalità finestre", + "presets": { + "01_cascade": { + "title": "Cascata", + "desc": "Gradiente verticale." + }, + "02_diagonal": { + "title": "Diagonale", + "desc": "Dissolvenza angolare." + }, + "03_duo": { + "title": "Duo", + "desc": "Forte contrasto." + }, + "04_tri": { + "title": "Tridente", + "desc": "Eleganza tricolore." + }, + "05_spectrum": { + "title": "Spettro", + "desc": "Quattro colori." + }, + "06_pulse": { + "title": "Polso", + "desc": "Ruota alla selezione." + }, + "07_infinity": { + "title": "Infinito", + "desc": "Rotazione costante." + }, + "08_neon": { + "title": "Neon", + "desc": "Oscillazione lenta." + }, + "09_glitch": { + "title": "Glitch", + "desc": "Aggressivo, errore." + }, + "10_golden": { + "title": "Oro", + "desc": "Riflessi metallici." + }, + "11_toxic": { + "title": "Tossico", + "desc": "Verde fluo." + }, + "12_neon_cyberpunk": { + "title": "Neon Cyber-Glow (Dual)", + "desc": "Simulazione di luminosità bicolore utilizzando una base di luce bianca e viola." + }, + "13_the_joker": { + "title": "Il Joker", + "desc": "Estetica Joker: Verde acido e viola profondo con un bagliore elettrico." + } + } + }, + "shaders": { + "header_title": "Filtri Schermo", + "header_subtitle": "Post-processing", + "presets": { + "01_night": { + "title": "Luce Notturna", + "desc": "Filtro caldo." + }, + "02_mono": { + "title": "Monocromatico", + "desc": "Scala di grigi." + }, + "03_vibrant": { + "title": "Vibrante", + "desc": "Migliora colori." + }, + "04_sharp": { + "title": "Nitidezza", + "desc": "Migliora bordi." + }, + "05_ink": { + "title": "E-Ink", + "desc": "Effetto carta." + }, + "06_invert": { + "title": "Invertito", + "desc": "Inverte colori." + }, + "07_oled": { + "title": "OLED", + "desc": "Neri puri." + }, + "08_vision": { + "title": "Visione Notturna", + "desc": "Fosforo verde." + }, + "09_hybrid": { + "title": "Ibrido", + "desc": "Bilanciamento." + } + } + } +} diff --git a/noctalia-visual-layer/i18n/ja.json b/noctalia-visual-layer/i18n/ja.json new file mode 100644 index 00000000..ce3377f0 --- /dev/null +++ b/noctalia-visual-layer/i18n/ja.json @@ -0,0 +1,248 @@ +{ + "meta": { + "lang": "en", + "name": "English", + "author": "Ximo & AI" + }, + "widget": { + "tooltip": "Noctalia Visual Layer", + "menu_settings": "Plugin Settings" + }, + "panel": { + "header_title": "Noctalia Visual", + "header_subtitle": "Aesthetic Control Center", + "tabs": { + "home": "Home", + "animations": "Animations", + "borders": "Borders", + "effects": "Effects" + } + }, + "welcome": { + "activation_title": "System Activation", + "system_active": "The system is operational. Visual effects are safely managed by NVL.", + "system_inactive": "System halted. Requires acceptance of the persistence contract to continue.", + "enable_label": "Enable Visual Layer", + "warning": { + "title": "SECURE PERSISTENCE CONTRACT", + "text": "Upon activation, NVL will deploy a guardian shield and inject a secure path into your hyprland.conf. If you uninstall the plugin from the Shell, the system will self-clean on the next reboot without causing Hyprland errors." + }, + "features": { + "title": "Features & Benefits", + "description": "Noctalia Visual Layer is the aesthetic evolution of your desktop.", + "list": { + "fluid_anim": "✨ Fluid Animations", + "smart_borders": "🎨 Smart Borders", + "realtime_shaders": "🕶️ Real-Time Shaders", + "non_destructive": "🛡️ Non-Destructive" + } + }, + "docs": { + "title": "Technical Documentation", + "description": "Internal plugin structure and developer guide.", + "btn_show": "Show File Structure", + "btn_hide": "Hide Structure", + "content": { + "arch_title": "MODULAR ARCHITECTURE (Fragment System)", + "arch_desc": "This plugin uses a dynamic construction system to avoid module conflicts.", + "struct_title": "FILE STRUCTURE", + "flow_title": "DATA FLOW", + "flow_1": "1. Activating a module creates its file in fragments/.", + "flow_2": "2. The assemble.sh script joins all fragments.", + "flow_3": "3. A clean overlay.conf is generated.", + "flow_4": "4. Hyprland reloads configuration without errors.", + "debug_title": "DEBUGGING", + "debug_desc": "If something fails, check the overlay.conf file. It should contain the sum of all active effects." + } + }, + "credits": { + "title": "Credits", + "description": "Special thanks to the HyDE Project.", + "btn_hyde": "Inspired by HyDE Project", + "ai_title": "AI Co-Programmed", + "ai_desc": "QML Architecture assistance by Gemini (Google)." + } + }, + "animations": { + "header_title": "Motion Library", + "header_subtitle": "Select the animation style for your desktop", + "presets": { + "01_relampago": { + "title": "Lightning", + "desc": "Maximum visual response." + }, + "02_inercia_elastica": { + "title": "Elastic Inertia", + "desc": "Organic movement. Windows gain momentum on exit and bounce on entry." + }, + "03_seda_minimalista": { + "title": "Minimalist Silk", + "desc": "Absolute smoothness. No bounces, just perfect macOS-style landings." + }, + "04_minimalismo_snappy": { + "title": "Snappy Minimalism", + "desc": "Optimized for maximum speed. Window and workspace management only." + }, + "05_material_moderno": { + "title": "Modern Material", + "desc": "Google Pixel aesthetic. Organic animations, subtle scaling, and tactile response." + }, + "06_impacto_clasico": { + "title": "Classic Impact", + "desc": "\"Jelly\" effect. Elastic bounce on entry and anticipation on exit." + }, + "07_lineal": { + "title": "Linear", + "desc": "Mathematical precision. Constant motion, \"Sci-Fi HUD\" style." + }, + "08_cristal": { + "title": "Glass", + "desc": "Ethereal glide. Feeling of glass floating without friction." + }, + "09_seda_silk": { + "title": "Silk", + "desc": "Refined JaKooLit style. Energetic entries, fleeting exits, and stable workspaces." + }, + "10_retro_arcade": { + "title": "Retro Arcade", + "desc": "\"Toon/Arcade\" effect. Windows jump and bounce exaggeratedly." + }, + "11_futurista": { + "title": "Futuristic", + "desc": "Holographic interface. Digital precision, zero bounces, and vertical data flow." + }, + "12_rebote": { + "title": "Bounce", + "desc": "Vertical spring physics. Windows fall and bounce upon opening." + }, + "13_organico": { + "title": "Organic", + "desc": "\"Sprout\" movement. Smooth vertical growth and slow fades." + }, + "14_elastico": { + "title": "Elastic", + "desc": "Rubber band physics. Windows arrive, stretch, and bounce vertically." + }, + "15_desvanecido": { + "title": "Fade", + "desc": "Spectral materialization. Windows appear smoothly with barely any movement." + }, + "16_dinamico": { + "title": "Dynamic", + "desc": "Organic rhythm. Combination of speed and smooth settling." + }, + "17_sutil": { + "title": "Subtle", + "desc": "Zero distractions. Absolute smoothness without bounces or abrupt movements." + }, + "18_energico": { + "title": "Energetic", + "desc": "Maximum visual impact. Exaggerated bounces (56%) and kickback exits." + } + } + }, + "borders": { + "geometry": { + "title": "Border Thickness", + "desc": "Define line thickness (0-3px)" + }, + "header_title": "Visual Styles", + "header_subtitle": "Define your windows' personality", + "presets": { + "01_cascade": { + "title": "Cascade", + "desc": "Soft vertical gradient at 50%." + }, + "02_diagonal": { + "title": "Diagonal", + "desc": "Dynamic angle fade." + }, + "03_duo": { + "title": "Duo Contrast", + "desc": "Strong Primary/Secondary contrast." + }, + "04_tri": { + "title": "Trident", + "desc": "Tricolor elegance with gold." + }, + "05_spectrum": { + "title": "Spectrum", + "desc": "Four colors for maximum visibility." + }, + "06_pulse": { + "title": "Pulse", + "desc": "Rotates once when selecting window." + }, + "07_infinity": { + "title": "Infinity", + "desc": "Constant color rotation." + }, + "08_neon": { + "title": "Neon Breath", + "desc": "Slow and relaxing oscillation." + }, + "09_glitch": { + "title": "Cyber Glitch", + "desc": "Aggressive, fast, and error colors." + }, + "10_golden": { + "title": "Golden Luxury", + "desc": "Gold metallic reflections." + }, + "11_toxic": { + "title": "Toxic Green", + "desc": "Fluor green metallic reflections." + }, + "12_neon_cyberpunk": { + "title": "Neon Cyber-Glow (Dual)", + "desc": "Simulation of bicolor brightness using a white/violet light base." + }, + "13_the_joker": { + "title": "The Joker", + "desc": "Joker aesthetic: Acid green and deep purple with an electric glow." + } + } + }, + "shaders": { + "header_title": "Screen Filters", + "header_subtitle": "Real-time image post-processing", + "presets": { + "01_night": { + "title": "Night Light", + "desc": "Warm filter to protect eyesight." + }, + "02_mono": { + "title": "Monochrome", + "desc": "Grayscale for concentration." + }, + "03_vibrant": { + "title": "Vibrant", + "desc": "Intelligently enhances colors." + }, + "04_sharp": { + "title": "HD Sharpness", + "desc": "Improves border and text definition." + }, + "05_ink": { + "title": "E-Ink Paper", + "desc": "Sepia electronic paper texture." + }, + "06_invert": { + "title": "Inverted", + "desc": "Inverts all colors." + }, + "07_oled": { + "title": "OLED Mode", + "desc": "Pure blacks and dramatic contrast." + }, + "08_vision": { + "title": "Night Vision", + "desc": "Military green phosphor effect." + }, + "09_hybrid": { + "title": "Hybrid", + "desc": "Balance between correction and style." + } + } + } +} diff --git a/noctalia-visual-layer/i18n/ku.json b/noctalia-visual-layer/i18n/ku.json new file mode 100644 index 00000000..ce3377f0 --- /dev/null +++ b/noctalia-visual-layer/i18n/ku.json @@ -0,0 +1,248 @@ +{ + "meta": { + "lang": "en", + "name": "English", + "author": "Ximo & AI" + }, + "widget": { + "tooltip": "Noctalia Visual Layer", + "menu_settings": "Plugin Settings" + }, + "panel": { + "header_title": "Noctalia Visual", + "header_subtitle": "Aesthetic Control Center", + "tabs": { + "home": "Home", + "animations": "Animations", + "borders": "Borders", + "effects": "Effects" + } + }, + "welcome": { + "activation_title": "System Activation", + "system_active": "The system is operational. Visual effects are safely managed by NVL.", + "system_inactive": "System halted. Requires acceptance of the persistence contract to continue.", + "enable_label": "Enable Visual Layer", + "warning": { + "title": "SECURE PERSISTENCE CONTRACT", + "text": "Upon activation, NVL will deploy a guardian shield and inject a secure path into your hyprland.conf. If you uninstall the plugin from the Shell, the system will self-clean on the next reboot without causing Hyprland errors." + }, + "features": { + "title": "Features & Benefits", + "description": "Noctalia Visual Layer is the aesthetic evolution of your desktop.", + "list": { + "fluid_anim": "✨ Fluid Animations", + "smart_borders": "🎨 Smart Borders", + "realtime_shaders": "🕶️ Real-Time Shaders", + "non_destructive": "🛡️ Non-Destructive" + } + }, + "docs": { + "title": "Technical Documentation", + "description": "Internal plugin structure and developer guide.", + "btn_show": "Show File Structure", + "btn_hide": "Hide Structure", + "content": { + "arch_title": "MODULAR ARCHITECTURE (Fragment System)", + "arch_desc": "This plugin uses a dynamic construction system to avoid module conflicts.", + "struct_title": "FILE STRUCTURE", + "flow_title": "DATA FLOW", + "flow_1": "1. Activating a module creates its file in fragments/.", + "flow_2": "2. The assemble.sh script joins all fragments.", + "flow_3": "3. A clean overlay.conf is generated.", + "flow_4": "4. Hyprland reloads configuration without errors.", + "debug_title": "DEBUGGING", + "debug_desc": "If something fails, check the overlay.conf file. It should contain the sum of all active effects." + } + }, + "credits": { + "title": "Credits", + "description": "Special thanks to the HyDE Project.", + "btn_hyde": "Inspired by HyDE Project", + "ai_title": "AI Co-Programmed", + "ai_desc": "QML Architecture assistance by Gemini (Google)." + } + }, + "animations": { + "header_title": "Motion Library", + "header_subtitle": "Select the animation style for your desktop", + "presets": { + "01_relampago": { + "title": "Lightning", + "desc": "Maximum visual response." + }, + "02_inercia_elastica": { + "title": "Elastic Inertia", + "desc": "Organic movement. Windows gain momentum on exit and bounce on entry." + }, + "03_seda_minimalista": { + "title": "Minimalist Silk", + "desc": "Absolute smoothness. No bounces, just perfect macOS-style landings." + }, + "04_minimalismo_snappy": { + "title": "Snappy Minimalism", + "desc": "Optimized for maximum speed. Window and workspace management only." + }, + "05_material_moderno": { + "title": "Modern Material", + "desc": "Google Pixel aesthetic. Organic animations, subtle scaling, and tactile response." + }, + "06_impacto_clasico": { + "title": "Classic Impact", + "desc": "\"Jelly\" effect. Elastic bounce on entry and anticipation on exit." + }, + "07_lineal": { + "title": "Linear", + "desc": "Mathematical precision. Constant motion, \"Sci-Fi HUD\" style." + }, + "08_cristal": { + "title": "Glass", + "desc": "Ethereal glide. Feeling of glass floating without friction." + }, + "09_seda_silk": { + "title": "Silk", + "desc": "Refined JaKooLit style. Energetic entries, fleeting exits, and stable workspaces." + }, + "10_retro_arcade": { + "title": "Retro Arcade", + "desc": "\"Toon/Arcade\" effect. Windows jump and bounce exaggeratedly." + }, + "11_futurista": { + "title": "Futuristic", + "desc": "Holographic interface. Digital precision, zero bounces, and vertical data flow." + }, + "12_rebote": { + "title": "Bounce", + "desc": "Vertical spring physics. Windows fall and bounce upon opening." + }, + "13_organico": { + "title": "Organic", + "desc": "\"Sprout\" movement. Smooth vertical growth and slow fades." + }, + "14_elastico": { + "title": "Elastic", + "desc": "Rubber band physics. Windows arrive, stretch, and bounce vertically." + }, + "15_desvanecido": { + "title": "Fade", + "desc": "Spectral materialization. Windows appear smoothly with barely any movement." + }, + "16_dinamico": { + "title": "Dynamic", + "desc": "Organic rhythm. Combination of speed and smooth settling." + }, + "17_sutil": { + "title": "Subtle", + "desc": "Zero distractions. Absolute smoothness without bounces or abrupt movements." + }, + "18_energico": { + "title": "Energetic", + "desc": "Maximum visual impact. Exaggerated bounces (56%) and kickback exits." + } + } + }, + "borders": { + "geometry": { + "title": "Border Thickness", + "desc": "Define line thickness (0-3px)" + }, + "header_title": "Visual Styles", + "header_subtitle": "Define your windows' personality", + "presets": { + "01_cascade": { + "title": "Cascade", + "desc": "Soft vertical gradient at 50%." + }, + "02_diagonal": { + "title": "Diagonal", + "desc": "Dynamic angle fade." + }, + "03_duo": { + "title": "Duo Contrast", + "desc": "Strong Primary/Secondary contrast." + }, + "04_tri": { + "title": "Trident", + "desc": "Tricolor elegance with gold." + }, + "05_spectrum": { + "title": "Spectrum", + "desc": "Four colors for maximum visibility." + }, + "06_pulse": { + "title": "Pulse", + "desc": "Rotates once when selecting window." + }, + "07_infinity": { + "title": "Infinity", + "desc": "Constant color rotation." + }, + "08_neon": { + "title": "Neon Breath", + "desc": "Slow and relaxing oscillation." + }, + "09_glitch": { + "title": "Cyber Glitch", + "desc": "Aggressive, fast, and error colors." + }, + "10_golden": { + "title": "Golden Luxury", + "desc": "Gold metallic reflections." + }, + "11_toxic": { + "title": "Toxic Green", + "desc": "Fluor green metallic reflections." + }, + "12_neon_cyberpunk": { + "title": "Neon Cyber-Glow (Dual)", + "desc": "Simulation of bicolor brightness using a white/violet light base." + }, + "13_the_joker": { + "title": "The Joker", + "desc": "Joker aesthetic: Acid green and deep purple with an electric glow." + } + } + }, + "shaders": { + "header_title": "Screen Filters", + "header_subtitle": "Real-time image post-processing", + "presets": { + "01_night": { + "title": "Night Light", + "desc": "Warm filter to protect eyesight." + }, + "02_mono": { + "title": "Monochrome", + "desc": "Grayscale for concentration." + }, + "03_vibrant": { + "title": "Vibrant", + "desc": "Intelligently enhances colors." + }, + "04_sharp": { + "title": "HD Sharpness", + "desc": "Improves border and text definition." + }, + "05_ink": { + "title": "E-Ink Paper", + "desc": "Sepia electronic paper texture." + }, + "06_invert": { + "title": "Inverted", + "desc": "Inverts all colors." + }, + "07_oled": { + "title": "OLED Mode", + "desc": "Pure blacks and dramatic contrast." + }, + "08_vision": { + "title": "Night Vision", + "desc": "Military green phosphor effect." + }, + "09_hybrid": { + "title": "Hybrid", + "desc": "Balance between correction and style." + } + } + } +} diff --git a/noctalia-visual-layer/i18n/nl.json b/noctalia-visual-layer/i18n/nl.json new file mode 100644 index 00000000..ce3377f0 --- /dev/null +++ b/noctalia-visual-layer/i18n/nl.json @@ -0,0 +1,248 @@ +{ + "meta": { + "lang": "en", + "name": "English", + "author": "Ximo & AI" + }, + "widget": { + "tooltip": "Noctalia Visual Layer", + "menu_settings": "Plugin Settings" + }, + "panel": { + "header_title": "Noctalia Visual", + "header_subtitle": "Aesthetic Control Center", + "tabs": { + "home": "Home", + "animations": "Animations", + "borders": "Borders", + "effects": "Effects" + } + }, + "welcome": { + "activation_title": "System Activation", + "system_active": "The system is operational. Visual effects are safely managed by NVL.", + "system_inactive": "System halted. Requires acceptance of the persistence contract to continue.", + "enable_label": "Enable Visual Layer", + "warning": { + "title": "SECURE PERSISTENCE CONTRACT", + "text": "Upon activation, NVL will deploy a guardian shield and inject a secure path into your hyprland.conf. If you uninstall the plugin from the Shell, the system will self-clean on the next reboot without causing Hyprland errors." + }, + "features": { + "title": "Features & Benefits", + "description": "Noctalia Visual Layer is the aesthetic evolution of your desktop.", + "list": { + "fluid_anim": "✨ Fluid Animations", + "smart_borders": "🎨 Smart Borders", + "realtime_shaders": "🕶️ Real-Time Shaders", + "non_destructive": "🛡️ Non-Destructive" + } + }, + "docs": { + "title": "Technical Documentation", + "description": "Internal plugin structure and developer guide.", + "btn_show": "Show File Structure", + "btn_hide": "Hide Structure", + "content": { + "arch_title": "MODULAR ARCHITECTURE (Fragment System)", + "arch_desc": "This plugin uses a dynamic construction system to avoid module conflicts.", + "struct_title": "FILE STRUCTURE", + "flow_title": "DATA FLOW", + "flow_1": "1. Activating a module creates its file in fragments/.", + "flow_2": "2. The assemble.sh script joins all fragments.", + "flow_3": "3. A clean overlay.conf is generated.", + "flow_4": "4. Hyprland reloads configuration without errors.", + "debug_title": "DEBUGGING", + "debug_desc": "If something fails, check the overlay.conf file. It should contain the sum of all active effects." + } + }, + "credits": { + "title": "Credits", + "description": "Special thanks to the HyDE Project.", + "btn_hyde": "Inspired by HyDE Project", + "ai_title": "AI Co-Programmed", + "ai_desc": "QML Architecture assistance by Gemini (Google)." + } + }, + "animations": { + "header_title": "Motion Library", + "header_subtitle": "Select the animation style for your desktop", + "presets": { + "01_relampago": { + "title": "Lightning", + "desc": "Maximum visual response." + }, + "02_inercia_elastica": { + "title": "Elastic Inertia", + "desc": "Organic movement. Windows gain momentum on exit and bounce on entry." + }, + "03_seda_minimalista": { + "title": "Minimalist Silk", + "desc": "Absolute smoothness. No bounces, just perfect macOS-style landings." + }, + "04_minimalismo_snappy": { + "title": "Snappy Minimalism", + "desc": "Optimized for maximum speed. Window and workspace management only." + }, + "05_material_moderno": { + "title": "Modern Material", + "desc": "Google Pixel aesthetic. Organic animations, subtle scaling, and tactile response." + }, + "06_impacto_clasico": { + "title": "Classic Impact", + "desc": "\"Jelly\" effect. Elastic bounce on entry and anticipation on exit." + }, + "07_lineal": { + "title": "Linear", + "desc": "Mathematical precision. Constant motion, \"Sci-Fi HUD\" style." + }, + "08_cristal": { + "title": "Glass", + "desc": "Ethereal glide. Feeling of glass floating without friction." + }, + "09_seda_silk": { + "title": "Silk", + "desc": "Refined JaKooLit style. Energetic entries, fleeting exits, and stable workspaces." + }, + "10_retro_arcade": { + "title": "Retro Arcade", + "desc": "\"Toon/Arcade\" effect. Windows jump and bounce exaggeratedly." + }, + "11_futurista": { + "title": "Futuristic", + "desc": "Holographic interface. Digital precision, zero bounces, and vertical data flow." + }, + "12_rebote": { + "title": "Bounce", + "desc": "Vertical spring physics. Windows fall and bounce upon opening." + }, + "13_organico": { + "title": "Organic", + "desc": "\"Sprout\" movement. Smooth vertical growth and slow fades." + }, + "14_elastico": { + "title": "Elastic", + "desc": "Rubber band physics. Windows arrive, stretch, and bounce vertically." + }, + "15_desvanecido": { + "title": "Fade", + "desc": "Spectral materialization. Windows appear smoothly with barely any movement." + }, + "16_dinamico": { + "title": "Dynamic", + "desc": "Organic rhythm. Combination of speed and smooth settling." + }, + "17_sutil": { + "title": "Subtle", + "desc": "Zero distractions. Absolute smoothness without bounces or abrupt movements." + }, + "18_energico": { + "title": "Energetic", + "desc": "Maximum visual impact. Exaggerated bounces (56%) and kickback exits." + } + } + }, + "borders": { + "geometry": { + "title": "Border Thickness", + "desc": "Define line thickness (0-3px)" + }, + "header_title": "Visual Styles", + "header_subtitle": "Define your windows' personality", + "presets": { + "01_cascade": { + "title": "Cascade", + "desc": "Soft vertical gradient at 50%." + }, + "02_diagonal": { + "title": "Diagonal", + "desc": "Dynamic angle fade." + }, + "03_duo": { + "title": "Duo Contrast", + "desc": "Strong Primary/Secondary contrast." + }, + "04_tri": { + "title": "Trident", + "desc": "Tricolor elegance with gold." + }, + "05_spectrum": { + "title": "Spectrum", + "desc": "Four colors for maximum visibility." + }, + "06_pulse": { + "title": "Pulse", + "desc": "Rotates once when selecting window." + }, + "07_infinity": { + "title": "Infinity", + "desc": "Constant color rotation." + }, + "08_neon": { + "title": "Neon Breath", + "desc": "Slow and relaxing oscillation." + }, + "09_glitch": { + "title": "Cyber Glitch", + "desc": "Aggressive, fast, and error colors." + }, + "10_golden": { + "title": "Golden Luxury", + "desc": "Gold metallic reflections." + }, + "11_toxic": { + "title": "Toxic Green", + "desc": "Fluor green metallic reflections." + }, + "12_neon_cyberpunk": { + "title": "Neon Cyber-Glow (Dual)", + "desc": "Simulation of bicolor brightness using a white/violet light base." + }, + "13_the_joker": { + "title": "The Joker", + "desc": "Joker aesthetic: Acid green and deep purple with an electric glow." + } + } + }, + "shaders": { + "header_title": "Screen Filters", + "header_subtitle": "Real-time image post-processing", + "presets": { + "01_night": { + "title": "Night Light", + "desc": "Warm filter to protect eyesight." + }, + "02_mono": { + "title": "Monochrome", + "desc": "Grayscale for concentration." + }, + "03_vibrant": { + "title": "Vibrant", + "desc": "Intelligently enhances colors." + }, + "04_sharp": { + "title": "HD Sharpness", + "desc": "Improves border and text definition." + }, + "05_ink": { + "title": "E-Ink Paper", + "desc": "Sepia electronic paper texture." + }, + "06_invert": { + "title": "Inverted", + "desc": "Inverts all colors." + }, + "07_oled": { + "title": "OLED Mode", + "desc": "Pure blacks and dramatic contrast." + }, + "08_vision": { + "title": "Night Vision", + "desc": "Military green phosphor effect." + }, + "09_hybrid": { + "title": "Hybrid", + "desc": "Balance between correction and style." + } + } + } +} diff --git a/noctalia-visual-layer/i18n/pl.json b/noctalia-visual-layer/i18n/pl.json new file mode 100644 index 00000000..ce3377f0 --- /dev/null +++ b/noctalia-visual-layer/i18n/pl.json @@ -0,0 +1,248 @@ +{ + "meta": { + "lang": "en", + "name": "English", + "author": "Ximo & AI" + }, + "widget": { + "tooltip": "Noctalia Visual Layer", + "menu_settings": "Plugin Settings" + }, + "panel": { + "header_title": "Noctalia Visual", + "header_subtitle": "Aesthetic Control Center", + "tabs": { + "home": "Home", + "animations": "Animations", + "borders": "Borders", + "effects": "Effects" + } + }, + "welcome": { + "activation_title": "System Activation", + "system_active": "The system is operational. Visual effects are safely managed by NVL.", + "system_inactive": "System halted. Requires acceptance of the persistence contract to continue.", + "enable_label": "Enable Visual Layer", + "warning": { + "title": "SECURE PERSISTENCE CONTRACT", + "text": "Upon activation, NVL will deploy a guardian shield and inject a secure path into your hyprland.conf. If you uninstall the plugin from the Shell, the system will self-clean on the next reboot without causing Hyprland errors." + }, + "features": { + "title": "Features & Benefits", + "description": "Noctalia Visual Layer is the aesthetic evolution of your desktop.", + "list": { + "fluid_anim": "✨ Fluid Animations", + "smart_borders": "🎨 Smart Borders", + "realtime_shaders": "🕶️ Real-Time Shaders", + "non_destructive": "🛡️ Non-Destructive" + } + }, + "docs": { + "title": "Technical Documentation", + "description": "Internal plugin structure and developer guide.", + "btn_show": "Show File Structure", + "btn_hide": "Hide Structure", + "content": { + "arch_title": "MODULAR ARCHITECTURE (Fragment System)", + "arch_desc": "This plugin uses a dynamic construction system to avoid module conflicts.", + "struct_title": "FILE STRUCTURE", + "flow_title": "DATA FLOW", + "flow_1": "1. Activating a module creates its file in fragments/.", + "flow_2": "2. The assemble.sh script joins all fragments.", + "flow_3": "3. A clean overlay.conf is generated.", + "flow_4": "4. Hyprland reloads configuration without errors.", + "debug_title": "DEBUGGING", + "debug_desc": "If something fails, check the overlay.conf file. It should contain the sum of all active effects." + } + }, + "credits": { + "title": "Credits", + "description": "Special thanks to the HyDE Project.", + "btn_hyde": "Inspired by HyDE Project", + "ai_title": "AI Co-Programmed", + "ai_desc": "QML Architecture assistance by Gemini (Google)." + } + }, + "animations": { + "header_title": "Motion Library", + "header_subtitle": "Select the animation style for your desktop", + "presets": { + "01_relampago": { + "title": "Lightning", + "desc": "Maximum visual response." + }, + "02_inercia_elastica": { + "title": "Elastic Inertia", + "desc": "Organic movement. Windows gain momentum on exit and bounce on entry." + }, + "03_seda_minimalista": { + "title": "Minimalist Silk", + "desc": "Absolute smoothness. No bounces, just perfect macOS-style landings." + }, + "04_minimalismo_snappy": { + "title": "Snappy Minimalism", + "desc": "Optimized for maximum speed. Window and workspace management only." + }, + "05_material_moderno": { + "title": "Modern Material", + "desc": "Google Pixel aesthetic. Organic animations, subtle scaling, and tactile response." + }, + "06_impacto_clasico": { + "title": "Classic Impact", + "desc": "\"Jelly\" effect. Elastic bounce on entry and anticipation on exit." + }, + "07_lineal": { + "title": "Linear", + "desc": "Mathematical precision. Constant motion, \"Sci-Fi HUD\" style." + }, + "08_cristal": { + "title": "Glass", + "desc": "Ethereal glide. Feeling of glass floating without friction." + }, + "09_seda_silk": { + "title": "Silk", + "desc": "Refined JaKooLit style. Energetic entries, fleeting exits, and stable workspaces." + }, + "10_retro_arcade": { + "title": "Retro Arcade", + "desc": "\"Toon/Arcade\" effect. Windows jump and bounce exaggeratedly." + }, + "11_futurista": { + "title": "Futuristic", + "desc": "Holographic interface. Digital precision, zero bounces, and vertical data flow." + }, + "12_rebote": { + "title": "Bounce", + "desc": "Vertical spring physics. Windows fall and bounce upon opening." + }, + "13_organico": { + "title": "Organic", + "desc": "\"Sprout\" movement. Smooth vertical growth and slow fades." + }, + "14_elastico": { + "title": "Elastic", + "desc": "Rubber band physics. Windows arrive, stretch, and bounce vertically." + }, + "15_desvanecido": { + "title": "Fade", + "desc": "Spectral materialization. Windows appear smoothly with barely any movement." + }, + "16_dinamico": { + "title": "Dynamic", + "desc": "Organic rhythm. Combination of speed and smooth settling." + }, + "17_sutil": { + "title": "Subtle", + "desc": "Zero distractions. Absolute smoothness without bounces or abrupt movements." + }, + "18_energico": { + "title": "Energetic", + "desc": "Maximum visual impact. Exaggerated bounces (56%) and kickback exits." + } + } + }, + "borders": { + "geometry": { + "title": "Border Thickness", + "desc": "Define line thickness (0-3px)" + }, + "header_title": "Visual Styles", + "header_subtitle": "Define your windows' personality", + "presets": { + "01_cascade": { + "title": "Cascade", + "desc": "Soft vertical gradient at 50%." + }, + "02_diagonal": { + "title": "Diagonal", + "desc": "Dynamic angle fade." + }, + "03_duo": { + "title": "Duo Contrast", + "desc": "Strong Primary/Secondary contrast." + }, + "04_tri": { + "title": "Trident", + "desc": "Tricolor elegance with gold." + }, + "05_spectrum": { + "title": "Spectrum", + "desc": "Four colors for maximum visibility." + }, + "06_pulse": { + "title": "Pulse", + "desc": "Rotates once when selecting window." + }, + "07_infinity": { + "title": "Infinity", + "desc": "Constant color rotation." + }, + "08_neon": { + "title": "Neon Breath", + "desc": "Slow and relaxing oscillation." + }, + "09_glitch": { + "title": "Cyber Glitch", + "desc": "Aggressive, fast, and error colors." + }, + "10_golden": { + "title": "Golden Luxury", + "desc": "Gold metallic reflections." + }, + "11_toxic": { + "title": "Toxic Green", + "desc": "Fluor green metallic reflections." + }, + "12_neon_cyberpunk": { + "title": "Neon Cyber-Glow (Dual)", + "desc": "Simulation of bicolor brightness using a white/violet light base." + }, + "13_the_joker": { + "title": "The Joker", + "desc": "Joker aesthetic: Acid green and deep purple with an electric glow." + } + } + }, + "shaders": { + "header_title": "Screen Filters", + "header_subtitle": "Real-time image post-processing", + "presets": { + "01_night": { + "title": "Night Light", + "desc": "Warm filter to protect eyesight." + }, + "02_mono": { + "title": "Monochrome", + "desc": "Grayscale for concentration." + }, + "03_vibrant": { + "title": "Vibrant", + "desc": "Intelligently enhances colors." + }, + "04_sharp": { + "title": "HD Sharpness", + "desc": "Improves border and text definition." + }, + "05_ink": { + "title": "E-Ink Paper", + "desc": "Sepia electronic paper texture." + }, + "06_invert": { + "title": "Inverted", + "desc": "Inverts all colors." + }, + "07_oled": { + "title": "OLED Mode", + "desc": "Pure blacks and dramatic contrast." + }, + "08_vision": { + "title": "Night Vision", + "desc": "Military green phosphor effect." + }, + "09_hybrid": { + "title": "Hybrid", + "desc": "Balance between correction and style." + } + } + } +} diff --git a/noctalia-visual-layer/i18n/pt.json b/noctalia-visual-layer/i18n/pt.json new file mode 100644 index 00000000..a9792db5 --- /dev/null +++ b/noctalia-visual-layer/i18n/pt.json @@ -0,0 +1,248 @@ +{ + "meta": { + "lang": "pt", + "name": "Português", + "author": "Ximo & AI" + }, + "widget": { + "tooltip": "Noctalia Visual Layer", + "menu_settings": "Configurações" + }, + "panel": { + "header_title": "Noctalia Visual", + "header_subtitle": "Centro de Controle", + "tabs": { + "home": "Início", + "animations": "Animações", + "borders": "Bordas", + "effects": "Efeitos" + } + }, + "welcome": { + "activation_title": "Ativação do Sistema", + "system_active": "O sistema está operacional. Os efeitos visuais são geridos pela NVL de forma segura.", + "system_inactive": "Sistema parado. Requer aceitação do contrato de persistência para continuar.", + "enable_label": "Ativar Visual Layer", + "warning": { + "title": "CONTRATO DE PERSISTÊNCIA SEGURA", + "text": "Ao ativar, a NVL implantará um escudo guardião e injetará um caminho seguro no seu hyprland.conf. Se desinstalar o plugin a partir da Shell, o sistema limpar-se-á automaticamente no próximo reinício sem causar erros no Hyprland." + }, + "features": { + "title": "Recursos", + "description": "A evolução estética do desktop.", + "list": { + "fluid_anim": "✨ Animações Fluidas", + "smart_borders": "🎨 Bordas Inteligentes", + "realtime_shaders": "🕶️ Shaders Tempo Real", + "non_destructive": "🛡️ Não Destrutivo" + } + }, + "docs": { + "title": "Documentação", + "description": "Guia técnico.", + "btn_show": "Ver Estrutura", + "btn_hide": "Ocultar Estrutura", + "content": { + "arch_title": "ARQUITETURA MODULAR", + "arch_desc": "Sistema de fragmentos para evitar conflitos.", + "struct_title": "ESTRUTURA DE ARQUIVOS", + "flow_title": "FLUXO DE DADOS", + "flow_1": "1. Ativação cria arquivo em fragments/.", + "flow_2": "2. Script assemble.sh une tudo.", + "flow_3": "3. overlay.conf limpo é gerado.", + "flow_4": "4. Hyprland recarrega sem erros.", + "debug_title": "DEBUG", + "debug_desc": "Se falhar, verifique overlay.conf." + } + }, + "credits": { + "title": "Créditos", + "description": "Obrigado ao HyDE Project.", + "btn_hyde": "Inspirado no HyDE", + "ai_title": "Co-Codificado com IA", + "ai_desc": "Obrigado ao Gemini pela ajuda QML." + } + }, + "animations": { + "header_title": "Biblioteca de Movimento", + "header_subtitle": "Selecione o estilo de animação para o seu desktop", + "presets": { + "01_relampago": { + "title": "Relâmpago", + "desc": "Resposta visual máxima." + }, + "02_inercia_elastica": { + "title": "Inércia Elástica", + "desc": "Movimento orgânico. Impulso na saída e ressalto na entrada." + }, + "03_seda_minimalista": { + "title": "Seda Minimalista", + "desc": "Suavidade absoluta. Aterragens perfeitas estilo macOS." + }, + "04_minimalismo_snappy": { + "title": "Minimalismo Snappy", + "desc": "Otimizado para a velocidade máxima." + }, + "05_material_moderno": { + "title": "Material Moderno", + "desc": "Estética Google Pixel. Animações orgânicas e táteis." + }, + "06_impacto_clasico": { + "title": "Impacto Clássico", + "desc": "Efeito \"Jelly\". Ressalto elástico e antecipação." + }, + "07_lineal": { + "title": "Linear", + "desc": "Precisão matemática. Estilo \"Sci-Fi HUD\"." + }, + "08_cristal": { + "title": "Cristal", + "desc": "Deslizamento etéreo. Sensação de vidro flutuante." + }, + "09_seda_silk": { + "title": "Seda (Silk)", + "desc": "Estilo JaKooLit refinado. Entradas enérgicas." + }, + "10_retro_arcade": { + "title": "Retro Arcade", + "desc": "Efeito \"Toon\". Saltos e ressaltos exagerados." + }, + "11_futurista": { + "title": "Futurista", + "desc": "Interface holográfica. Fluxo de dados vertical." + }, + "12_rebote": { + "title": "Ressalto", + "desc": "Física de mola vertical. As janelas caem e ressaltam." + }, + "13_organico": { + "title": "Orgânico", + "desc": "Crescimento vertical suave e desvanecimentos lentos." + }, + "14_elastico": { + "title": "Elástico", + "desc": "Física de banda elástica. Estiramento dinâmico." + }, + "15_desvanecido": { + "title": "Desvanecido", + "desc": "Materialização espetral sem movimento." + }, + "16_dinamico": { + "title": "Dinâmico", + "desc": "Ritmo orgânico. Velocidade e suavidade." + }, + "17_sutil": { + "title": "Sutil", + "desc": "Zero distrações. Suavidade absoluta." + }, + "18_energico": { + "title": "Enérgico", + "desc": "Impacto visual máximo. Saídas com recuo." + } + } + }, + "borders": { + "geometry": { + "title": "Espessura", + "desc": "Largura (0-3px)" + }, + "header_title": "Estilos Visuais", + "header_subtitle": "Personalidade das janelas", + "presets": { + "01_cascade": { + "title": "Cascata", + "desc": "Degradê vertical." + }, + "02_diagonal": { + "title": "Diagonal", + "desc": "Em ângulo." + }, + "03_duo": { + "title": "Duo", + "desc": "Forte contraste." + }, + "04_tri": { + "title": "Tridente", + "desc": "Tricolor dourado." + }, + "05_spectrum": { + "title": "Espectro", + "desc": "Quatro cores." + }, + "06_pulse": { + "title": "Pulso", + "desc": "Gira ao selecionar." + }, + "07_infinity": { + "title": "Infinito", + "desc": "Rotação constante." + }, + "08_neon": { + "title": "Neon", + "desc": "Oscilação lenta." + }, + "09_glitch": { + "title": "Glitch", + "desc": "Agressivo, erro." + }, + "10_golden": { + "title": "Luxo Dourado", + "desc": "Reflexos metálicos." + }, + "11_toxic": { + "title": "Tóxico", + "desc": "Verde flúor." + }, + "12_neon_cyberpunk": { + "title": "Neon Cyber-Glow (Dual)", + "desc": "Simulação de brilho bicolor usando uma base de luz branca e violeta." + }, + "13_the_joker": { + "title": "O Joker", + "desc": "Estética Joker: Verde ácido e roxo profundo com um brilho elétrico." + } + } + }, + "shaders": { + "header_title": "Filtros de Tela", + "header_subtitle": "Pós-processamento", + "presets": { + "01_night": { + "title": "Luz Noturna", + "desc": "Filtro quente." + }, + "02_mono": { + "title": "Monocromático", + "desc": "Escala de cinza." + }, + "03_vibrant": { + "title": "Vibrante", + "desc": "Realça cores." + }, + "04_sharp": { + "title": "Nitidez", + "desc": "Melhora textos." + }, + "05_ink": { + "title": "Papel E-Ink", + "desc": "Textura sépia." + }, + "06_invert": { + "title": "Invertido", + "desc": "Inverte cores." + }, + "07_oled": { + "title": "OLED", + "desc": "Pretos puros." + }, + "08_vision": { + "title": "Visão Noturna", + "desc": "Fósforo verde." + }, + "09_hybrid": { + "title": "Híbrido", + "desc": "Balanço." + } + } + } +} diff --git a/noctalia-visual-layer/i18n/ru.json b/noctalia-visual-layer/i18n/ru.json new file mode 100644 index 00000000..c1a8fd82 --- /dev/null +++ b/noctalia-visual-layer/i18n/ru.json @@ -0,0 +1,248 @@ +{ + "meta": { + "lang": "ru", + "name": "Русский", + "author": "Ximo & AI" + }, + "widget": { + "tooltip": "Noctalia Visual Layer", + "menu_settings": "Настройки плагина" + }, + "panel": { + "header_title": "Noctalia Visual", + "header_subtitle": "Центр Эстетики", + "tabs": { + "home": "Главная", + "animations": "Анимации", + "borders": "Границы", + "effects": "Эффекты" + } + }, + "welcome": { + "activation_title": "Активация Системы", + "system_active": "Система работает. Визуальные эффекты безопасно управляются NVL.", + "system_inactive": "Система остановлена. Для продолжения требуется принятие контракта о постоянстве.", + "enable_label": "Включить Visual Layer", + "warning": { + "title": "БЕЗОПАСНЫЙ КОНТРАКТ О ПОСТОЯНСТВЕ", + "text": "При активации NVL развернет защитный щит и внедрит безопасный путь в ваш hyprland.conf. Если вы удалите плагин из Shell, система самоочистится при следующей перезагрузке, не вызывая ошибок Hyprland." + }, + "features": { + "title": "Особенности", + "description": "Эволюция вашего десктопа.", + "list": { + "fluid_anim": "✨ Плавные Анимации", + "smart_borders": "🎨 Умные Границы", + "realtime_shaders": "🕶️ Real-Time Шейдеры", + "non_destructive": "🛡️ Безопасно" + } + }, + "docs": { + "title": "Документация", + "description": "Внутренняя структура.", + "btn_show": "Показать Структуру", + "btn_hide": "Скрыть Структуру", + "content": { + "arch_title": "МОДУЛЬНАЯ АРХИТЕКТУРА", + "arch_desc": "Система фрагментов для избежания конфликтов.", + "struct_title": "СТРУКТУРА ФАЙЛОВ", + "flow_title": "ПОТОК ДАННЫХ", + "flow_1": "1. Активация создает файл в fragments/.", + "flow_2": "2. Скрипт assemble.sh собирает фрагменты.", + "flow_3": "3. Генерируется чистый overlay.conf.", + "flow_4": "4. Hyprland перезагружается без ошибок.", + "debug_title": "ОТЛАДКА", + "debug_desc": "При ошибках проверьте overlay.conf." + } + }, + "credits": { + "title": "Кредиты", + "description": "Спасибо HyDE Project.", + "btn_hyde": "Вдохновлено HyDE", + "ai_title": "Написано с ИИ", + "ai_desc": "Спасибо Gemini за помощь с QML." + } + }, + "animations": { + "header_title": "Библиотека движений", + "header_subtitle": "Выберите стиль анимации для вашего рабочего стола", + "presets": { + "01_relampago": { + "title": "Молния", + "desc": "Максимальный визуальный отклик." + }, + "02_inercia_elastica": { + "title": "Эластичная инерция", + "desc": "Органичное движение. Импульс при выходе и отскок при входе." + }, + "03_seda_minimalista": { + "title": "Минималистичный шелк", + "desc": "Абсолютная плавность в стиле macOS." + }, + "04_minimalismo_snappy": { + "title": "Быстрый минимализм", + "desc": "Оптимизировано для максимальной скорости." + }, + "05_material_moderno": { + "title": "Современный материал", + "desc": "Эстетика Google Pixel. Тактильный отклик." + }, + "06_impacto_clasico": { + "title": "Классический удар", + "desc": "Эффект \"Jelly\". Эластичный отскок и предвосхищение." + }, + "07_lineal": { + "title": "Линейный", + "desc": "Математическая точность в стиле Sci-Fi HUD." + }, + "08_cristal": { + "title": "Кристалл", + "desc": "Эфирное скольжение. Ощущение парящего стекла." + }, + "09_seda_silk": { + "title": "Шелк (Silk)", + "desc": "Утонченный стиль JaKooLit. Энергичные входы." + }, + "10_retro_arcade": { + "title": "Ретро Аркада", + "desc": "Эффект мультфильма. Преувеличенные прыжки." + }, + "11_futurista": { + "title": "Футуристичный", + "desc": "Голографический интерфейс. Вертикальный поток." + }, + "12_rebote": { + "title": "Отскок", + "desc": "Физика вертикальной пружины." + }, + "13_organico": { + "title": "Органический", + "desc": "Мягкий вертикальный рост и медленное затухание." + }, + "14_elastico": { + "title": "Эластичный", + "desc": "Физика резиновой ленты. Растяжение." + }, + "15_desvanecido": { + "title": "Затухание", + "desc": "Призрачное появление без движения." + }, + "16_dinamico": { + "title": "Динамичный", + "desc": "Органичный ритм. Скорость и плавность." + }, + "17_sutil": { + "title": "Тонкий", + "desc": "Никаких отвлекающих факторов." + }, + "18_energico": { + "title": "Энергичный", + "desc": "Максимальный визуальный эффект." + } + } + }, + "borders": { + "geometry": { + "title": "Толщина", + "desc": "Линия (0-3px)" + }, + "header_title": "Стили", + "header_subtitle": "Личность окон", + "presets": { + "01_cascade": { + "title": "Каскад", + "desc": "Мягкий градиент." + }, + "02_diagonal": { + "title": "Диагональ", + "desc": "Угловое затухание." + }, + "03_duo": { + "title": "Дуо", + "desc": "Контраст." + }, + "04_tri": { + "title": "Трезубец", + "desc": "Золотая элегантность." + }, + "05_spectrum": { + "title": "Спектр", + "desc": "4 цвета." + }, + "06_pulse": { + "title": "Пульс", + "desc": "Вращение при выборе." + }, + "07_infinity": { + "title": "Инфинити", + "desc": "Постоянное вращение." + }, + "08_neon": { + "title": "Неон", + "desc": "Медленная осцилляция." + }, + "09_glitch": { + "title": "Глитч", + "desc": "Агрессивно, быстро." + }, + "10_golden": { + "title": "Золото", + "desc": "Металлические рефлексы." + }, + "11_toxic": { + "title": "Токсик", + "desc": "Зеленый неон." + }, + "12_neon_cyberpunk": { + "title": "Неоновое Кибер-Свечение (Dual)", + "desc": "Имитация двухцветного свечения с использованием бело-фиолетовой световой базы." + }, + "13_the_joker": { + "title": "Джокер", + "desc": "Эстетика Джокера: Кислотно-зеленый и глубокий фиолетовый с электрическим свечением." + } + } + }, + "shaders": { + "header_title": "Фильтры", + "header_subtitle": "Постобработка", + "presets": { + "01_night": { + "title": "Ночной свет", + "desc": "Защита глаз." + }, + "02_mono": { + "title": "Монохром", + "desc": "Ч/Б." + }, + "03_vibrant": { + "title": "Вибрация", + "desc": "Улучшение цветов." + }, + "04_sharp": { + "title": "Резкость", + "desc": "Улучшение текста." + }, + "05_ink": { + "title": "E-Ink", + "desc": "Текстура бумаги." + }, + "06_invert": { + "title": "Инверсия", + "desc": "Инверсия цветов." + }, + "07_oled": { + "title": "OLED", + "desc": "Чистый черный." + }, + "08_vision": { + "title": "Ночное видение", + "desc": "Зеленый фильтр." + }, + "09_hybrid": { + "title": "Гибрид", + "desc": "Баланс." + } + } + } +} diff --git a/noctalia-visual-layer/i18n/tr.json b/noctalia-visual-layer/i18n/tr.json new file mode 100644 index 00000000..ce3377f0 --- /dev/null +++ b/noctalia-visual-layer/i18n/tr.json @@ -0,0 +1,248 @@ +{ + "meta": { + "lang": "en", + "name": "English", + "author": "Ximo & AI" + }, + "widget": { + "tooltip": "Noctalia Visual Layer", + "menu_settings": "Plugin Settings" + }, + "panel": { + "header_title": "Noctalia Visual", + "header_subtitle": "Aesthetic Control Center", + "tabs": { + "home": "Home", + "animations": "Animations", + "borders": "Borders", + "effects": "Effects" + } + }, + "welcome": { + "activation_title": "System Activation", + "system_active": "The system is operational. Visual effects are safely managed by NVL.", + "system_inactive": "System halted. Requires acceptance of the persistence contract to continue.", + "enable_label": "Enable Visual Layer", + "warning": { + "title": "SECURE PERSISTENCE CONTRACT", + "text": "Upon activation, NVL will deploy a guardian shield and inject a secure path into your hyprland.conf. If you uninstall the plugin from the Shell, the system will self-clean on the next reboot without causing Hyprland errors." + }, + "features": { + "title": "Features & Benefits", + "description": "Noctalia Visual Layer is the aesthetic evolution of your desktop.", + "list": { + "fluid_anim": "✨ Fluid Animations", + "smart_borders": "🎨 Smart Borders", + "realtime_shaders": "🕶️ Real-Time Shaders", + "non_destructive": "🛡️ Non-Destructive" + } + }, + "docs": { + "title": "Technical Documentation", + "description": "Internal plugin structure and developer guide.", + "btn_show": "Show File Structure", + "btn_hide": "Hide Structure", + "content": { + "arch_title": "MODULAR ARCHITECTURE (Fragment System)", + "arch_desc": "This plugin uses a dynamic construction system to avoid module conflicts.", + "struct_title": "FILE STRUCTURE", + "flow_title": "DATA FLOW", + "flow_1": "1. Activating a module creates its file in fragments/.", + "flow_2": "2. The assemble.sh script joins all fragments.", + "flow_3": "3. A clean overlay.conf is generated.", + "flow_4": "4. Hyprland reloads configuration without errors.", + "debug_title": "DEBUGGING", + "debug_desc": "If something fails, check the overlay.conf file. It should contain the sum of all active effects." + } + }, + "credits": { + "title": "Credits", + "description": "Special thanks to the HyDE Project.", + "btn_hyde": "Inspired by HyDE Project", + "ai_title": "AI Co-Programmed", + "ai_desc": "QML Architecture assistance by Gemini (Google)." + } + }, + "animations": { + "header_title": "Motion Library", + "header_subtitle": "Select the animation style for your desktop", + "presets": { + "01_relampago": { + "title": "Lightning", + "desc": "Maximum visual response." + }, + "02_inercia_elastica": { + "title": "Elastic Inertia", + "desc": "Organic movement. Windows gain momentum on exit and bounce on entry." + }, + "03_seda_minimalista": { + "title": "Minimalist Silk", + "desc": "Absolute smoothness. No bounces, just perfect macOS-style landings." + }, + "04_minimalismo_snappy": { + "title": "Snappy Minimalism", + "desc": "Optimized for maximum speed. Window and workspace management only." + }, + "05_material_moderno": { + "title": "Modern Material", + "desc": "Google Pixel aesthetic. Organic animations, subtle scaling, and tactile response." + }, + "06_impacto_clasico": { + "title": "Classic Impact", + "desc": "\"Jelly\" effect. Elastic bounce on entry and anticipation on exit." + }, + "07_lineal": { + "title": "Linear", + "desc": "Mathematical precision. Constant motion, \"Sci-Fi HUD\" style." + }, + "08_cristal": { + "title": "Glass", + "desc": "Ethereal glide. Feeling of glass floating without friction." + }, + "09_seda_silk": { + "title": "Silk", + "desc": "Refined JaKooLit style. Energetic entries, fleeting exits, and stable workspaces." + }, + "10_retro_arcade": { + "title": "Retro Arcade", + "desc": "\"Toon/Arcade\" effect. Windows jump and bounce exaggeratedly." + }, + "11_futurista": { + "title": "Futuristic", + "desc": "Holographic interface. Digital precision, zero bounces, and vertical data flow." + }, + "12_rebote": { + "title": "Bounce", + "desc": "Vertical spring physics. Windows fall and bounce upon opening." + }, + "13_organico": { + "title": "Organic", + "desc": "\"Sprout\" movement. Smooth vertical growth and slow fades." + }, + "14_elastico": { + "title": "Elastic", + "desc": "Rubber band physics. Windows arrive, stretch, and bounce vertically." + }, + "15_desvanecido": { + "title": "Fade", + "desc": "Spectral materialization. Windows appear smoothly with barely any movement." + }, + "16_dinamico": { + "title": "Dynamic", + "desc": "Organic rhythm. Combination of speed and smooth settling." + }, + "17_sutil": { + "title": "Subtle", + "desc": "Zero distractions. Absolute smoothness without bounces or abrupt movements." + }, + "18_energico": { + "title": "Energetic", + "desc": "Maximum visual impact. Exaggerated bounces (56%) and kickback exits." + } + } + }, + "borders": { + "geometry": { + "title": "Border Thickness", + "desc": "Define line thickness (0-3px)" + }, + "header_title": "Visual Styles", + "header_subtitle": "Define your windows' personality", + "presets": { + "01_cascade": { + "title": "Cascade", + "desc": "Soft vertical gradient at 50%." + }, + "02_diagonal": { + "title": "Diagonal", + "desc": "Dynamic angle fade." + }, + "03_duo": { + "title": "Duo Contrast", + "desc": "Strong Primary/Secondary contrast." + }, + "04_tri": { + "title": "Trident", + "desc": "Tricolor elegance with gold." + }, + "05_spectrum": { + "title": "Spectrum", + "desc": "Four colors for maximum visibility." + }, + "06_pulse": { + "title": "Pulse", + "desc": "Rotates once when selecting window." + }, + "07_infinity": { + "title": "Infinity", + "desc": "Constant color rotation." + }, + "08_neon": { + "title": "Neon Breath", + "desc": "Slow and relaxing oscillation." + }, + "09_glitch": { + "title": "Cyber Glitch", + "desc": "Aggressive, fast, and error colors." + }, + "10_golden": { + "title": "Golden Luxury", + "desc": "Gold metallic reflections." + }, + "11_toxic": { + "title": "Toxic Green", + "desc": "Fluor green metallic reflections." + }, + "12_neon_cyberpunk": { + "title": "Neon Cyber-Glow (Dual)", + "desc": "Simulation of bicolor brightness using a white/violet light base." + }, + "13_the_joker": { + "title": "The Joker", + "desc": "Joker aesthetic: Acid green and deep purple with an electric glow." + } + } + }, + "shaders": { + "header_title": "Screen Filters", + "header_subtitle": "Real-time image post-processing", + "presets": { + "01_night": { + "title": "Night Light", + "desc": "Warm filter to protect eyesight." + }, + "02_mono": { + "title": "Monochrome", + "desc": "Grayscale for concentration." + }, + "03_vibrant": { + "title": "Vibrant", + "desc": "Intelligently enhances colors." + }, + "04_sharp": { + "title": "HD Sharpness", + "desc": "Improves border and text definition." + }, + "05_ink": { + "title": "E-Ink Paper", + "desc": "Sepia electronic paper texture." + }, + "06_invert": { + "title": "Inverted", + "desc": "Inverts all colors." + }, + "07_oled": { + "title": "OLED Mode", + "desc": "Pure blacks and dramatic contrast." + }, + "08_vision": { + "title": "Night Vision", + "desc": "Military green phosphor effect." + }, + "09_hybrid": { + "title": "Hybrid", + "desc": "Balance between correction and style." + } + } + } +} diff --git a/noctalia-visual-layer/i18n/uk-UA.json b/noctalia-visual-layer/i18n/uk-UA.json new file mode 100644 index 00000000..ce3377f0 --- /dev/null +++ b/noctalia-visual-layer/i18n/uk-UA.json @@ -0,0 +1,248 @@ +{ + "meta": { + "lang": "en", + "name": "English", + "author": "Ximo & AI" + }, + "widget": { + "tooltip": "Noctalia Visual Layer", + "menu_settings": "Plugin Settings" + }, + "panel": { + "header_title": "Noctalia Visual", + "header_subtitle": "Aesthetic Control Center", + "tabs": { + "home": "Home", + "animations": "Animations", + "borders": "Borders", + "effects": "Effects" + } + }, + "welcome": { + "activation_title": "System Activation", + "system_active": "The system is operational. Visual effects are safely managed by NVL.", + "system_inactive": "System halted. Requires acceptance of the persistence contract to continue.", + "enable_label": "Enable Visual Layer", + "warning": { + "title": "SECURE PERSISTENCE CONTRACT", + "text": "Upon activation, NVL will deploy a guardian shield and inject a secure path into your hyprland.conf. If you uninstall the plugin from the Shell, the system will self-clean on the next reboot without causing Hyprland errors." + }, + "features": { + "title": "Features & Benefits", + "description": "Noctalia Visual Layer is the aesthetic evolution of your desktop.", + "list": { + "fluid_anim": "✨ Fluid Animations", + "smart_borders": "🎨 Smart Borders", + "realtime_shaders": "🕶️ Real-Time Shaders", + "non_destructive": "🛡️ Non-Destructive" + } + }, + "docs": { + "title": "Technical Documentation", + "description": "Internal plugin structure and developer guide.", + "btn_show": "Show File Structure", + "btn_hide": "Hide Structure", + "content": { + "arch_title": "MODULAR ARCHITECTURE (Fragment System)", + "arch_desc": "This plugin uses a dynamic construction system to avoid module conflicts.", + "struct_title": "FILE STRUCTURE", + "flow_title": "DATA FLOW", + "flow_1": "1. Activating a module creates its file in fragments/.", + "flow_2": "2. The assemble.sh script joins all fragments.", + "flow_3": "3. A clean overlay.conf is generated.", + "flow_4": "4. Hyprland reloads configuration without errors.", + "debug_title": "DEBUGGING", + "debug_desc": "If something fails, check the overlay.conf file. It should contain the sum of all active effects." + } + }, + "credits": { + "title": "Credits", + "description": "Special thanks to the HyDE Project.", + "btn_hyde": "Inspired by HyDE Project", + "ai_title": "AI Co-Programmed", + "ai_desc": "QML Architecture assistance by Gemini (Google)." + } + }, + "animations": { + "header_title": "Motion Library", + "header_subtitle": "Select the animation style for your desktop", + "presets": { + "01_relampago": { + "title": "Lightning", + "desc": "Maximum visual response." + }, + "02_inercia_elastica": { + "title": "Elastic Inertia", + "desc": "Organic movement. Windows gain momentum on exit and bounce on entry." + }, + "03_seda_minimalista": { + "title": "Minimalist Silk", + "desc": "Absolute smoothness. No bounces, just perfect macOS-style landings." + }, + "04_minimalismo_snappy": { + "title": "Snappy Minimalism", + "desc": "Optimized for maximum speed. Window and workspace management only." + }, + "05_material_moderno": { + "title": "Modern Material", + "desc": "Google Pixel aesthetic. Organic animations, subtle scaling, and tactile response." + }, + "06_impacto_clasico": { + "title": "Classic Impact", + "desc": "\"Jelly\" effect. Elastic bounce on entry and anticipation on exit." + }, + "07_lineal": { + "title": "Linear", + "desc": "Mathematical precision. Constant motion, \"Sci-Fi HUD\" style." + }, + "08_cristal": { + "title": "Glass", + "desc": "Ethereal glide. Feeling of glass floating without friction." + }, + "09_seda_silk": { + "title": "Silk", + "desc": "Refined JaKooLit style. Energetic entries, fleeting exits, and stable workspaces." + }, + "10_retro_arcade": { + "title": "Retro Arcade", + "desc": "\"Toon/Arcade\" effect. Windows jump and bounce exaggeratedly." + }, + "11_futurista": { + "title": "Futuristic", + "desc": "Holographic interface. Digital precision, zero bounces, and vertical data flow." + }, + "12_rebote": { + "title": "Bounce", + "desc": "Vertical spring physics. Windows fall and bounce upon opening." + }, + "13_organico": { + "title": "Organic", + "desc": "\"Sprout\" movement. Smooth vertical growth and slow fades." + }, + "14_elastico": { + "title": "Elastic", + "desc": "Rubber band physics. Windows arrive, stretch, and bounce vertically." + }, + "15_desvanecido": { + "title": "Fade", + "desc": "Spectral materialization. Windows appear smoothly with barely any movement." + }, + "16_dinamico": { + "title": "Dynamic", + "desc": "Organic rhythm. Combination of speed and smooth settling." + }, + "17_sutil": { + "title": "Subtle", + "desc": "Zero distractions. Absolute smoothness without bounces or abrupt movements." + }, + "18_energico": { + "title": "Energetic", + "desc": "Maximum visual impact. Exaggerated bounces (56%) and kickback exits." + } + } + }, + "borders": { + "geometry": { + "title": "Border Thickness", + "desc": "Define line thickness (0-3px)" + }, + "header_title": "Visual Styles", + "header_subtitle": "Define your windows' personality", + "presets": { + "01_cascade": { + "title": "Cascade", + "desc": "Soft vertical gradient at 50%." + }, + "02_diagonal": { + "title": "Diagonal", + "desc": "Dynamic angle fade." + }, + "03_duo": { + "title": "Duo Contrast", + "desc": "Strong Primary/Secondary contrast." + }, + "04_tri": { + "title": "Trident", + "desc": "Tricolor elegance with gold." + }, + "05_spectrum": { + "title": "Spectrum", + "desc": "Four colors for maximum visibility." + }, + "06_pulse": { + "title": "Pulse", + "desc": "Rotates once when selecting window." + }, + "07_infinity": { + "title": "Infinity", + "desc": "Constant color rotation." + }, + "08_neon": { + "title": "Neon Breath", + "desc": "Slow and relaxing oscillation." + }, + "09_glitch": { + "title": "Cyber Glitch", + "desc": "Aggressive, fast, and error colors." + }, + "10_golden": { + "title": "Golden Luxury", + "desc": "Gold metallic reflections." + }, + "11_toxic": { + "title": "Toxic Green", + "desc": "Fluor green metallic reflections." + }, + "12_neon_cyberpunk": { + "title": "Neon Cyber-Glow (Dual)", + "desc": "Simulation of bicolor brightness using a white/violet light base." + }, + "13_the_joker": { + "title": "The Joker", + "desc": "Joker aesthetic: Acid green and deep purple with an electric glow." + } + } + }, + "shaders": { + "header_title": "Screen Filters", + "header_subtitle": "Real-time image post-processing", + "presets": { + "01_night": { + "title": "Night Light", + "desc": "Warm filter to protect eyesight." + }, + "02_mono": { + "title": "Monochrome", + "desc": "Grayscale for concentration." + }, + "03_vibrant": { + "title": "Vibrant", + "desc": "Intelligently enhances colors." + }, + "04_sharp": { + "title": "HD Sharpness", + "desc": "Improves border and text definition." + }, + "05_ink": { + "title": "E-Ink Paper", + "desc": "Sepia electronic paper texture." + }, + "06_invert": { + "title": "Inverted", + "desc": "Inverts all colors." + }, + "07_oled": { + "title": "OLED Mode", + "desc": "Pure blacks and dramatic contrast." + }, + "08_vision": { + "title": "Night Vision", + "desc": "Military green phosphor effect." + }, + "09_hybrid": { + "title": "Hybrid", + "desc": "Balance between correction and style." + } + } + } +} diff --git a/noctalia-visual-layer/i18n/zh-CN.json b/noctalia-visual-layer/i18n/zh-CN.json new file mode 100644 index 00000000..ce3377f0 --- /dev/null +++ b/noctalia-visual-layer/i18n/zh-CN.json @@ -0,0 +1,248 @@ +{ + "meta": { + "lang": "en", + "name": "English", + "author": "Ximo & AI" + }, + "widget": { + "tooltip": "Noctalia Visual Layer", + "menu_settings": "Plugin Settings" + }, + "panel": { + "header_title": "Noctalia Visual", + "header_subtitle": "Aesthetic Control Center", + "tabs": { + "home": "Home", + "animations": "Animations", + "borders": "Borders", + "effects": "Effects" + } + }, + "welcome": { + "activation_title": "System Activation", + "system_active": "The system is operational. Visual effects are safely managed by NVL.", + "system_inactive": "System halted. Requires acceptance of the persistence contract to continue.", + "enable_label": "Enable Visual Layer", + "warning": { + "title": "SECURE PERSISTENCE CONTRACT", + "text": "Upon activation, NVL will deploy a guardian shield and inject a secure path into your hyprland.conf. If you uninstall the plugin from the Shell, the system will self-clean on the next reboot without causing Hyprland errors." + }, + "features": { + "title": "Features & Benefits", + "description": "Noctalia Visual Layer is the aesthetic evolution of your desktop.", + "list": { + "fluid_anim": "✨ Fluid Animations", + "smart_borders": "🎨 Smart Borders", + "realtime_shaders": "🕶️ Real-Time Shaders", + "non_destructive": "🛡️ Non-Destructive" + } + }, + "docs": { + "title": "Technical Documentation", + "description": "Internal plugin structure and developer guide.", + "btn_show": "Show File Structure", + "btn_hide": "Hide Structure", + "content": { + "arch_title": "MODULAR ARCHITECTURE (Fragment System)", + "arch_desc": "This plugin uses a dynamic construction system to avoid module conflicts.", + "struct_title": "FILE STRUCTURE", + "flow_title": "DATA FLOW", + "flow_1": "1. Activating a module creates its file in fragments/.", + "flow_2": "2. The assemble.sh script joins all fragments.", + "flow_3": "3. A clean overlay.conf is generated.", + "flow_4": "4. Hyprland reloads configuration without errors.", + "debug_title": "DEBUGGING", + "debug_desc": "If something fails, check the overlay.conf file. It should contain the sum of all active effects." + } + }, + "credits": { + "title": "Credits", + "description": "Special thanks to the HyDE Project.", + "btn_hyde": "Inspired by HyDE Project", + "ai_title": "AI Co-Programmed", + "ai_desc": "QML Architecture assistance by Gemini (Google)." + } + }, + "animations": { + "header_title": "Motion Library", + "header_subtitle": "Select the animation style for your desktop", + "presets": { + "01_relampago": { + "title": "Lightning", + "desc": "Maximum visual response." + }, + "02_inercia_elastica": { + "title": "Elastic Inertia", + "desc": "Organic movement. Windows gain momentum on exit and bounce on entry." + }, + "03_seda_minimalista": { + "title": "Minimalist Silk", + "desc": "Absolute smoothness. No bounces, just perfect macOS-style landings." + }, + "04_minimalismo_snappy": { + "title": "Snappy Minimalism", + "desc": "Optimized for maximum speed. Window and workspace management only." + }, + "05_material_moderno": { + "title": "Modern Material", + "desc": "Google Pixel aesthetic. Organic animations, subtle scaling, and tactile response." + }, + "06_impacto_clasico": { + "title": "Classic Impact", + "desc": "\"Jelly\" effect. Elastic bounce on entry and anticipation on exit." + }, + "07_lineal": { + "title": "Linear", + "desc": "Mathematical precision. Constant motion, \"Sci-Fi HUD\" style." + }, + "08_cristal": { + "title": "Glass", + "desc": "Ethereal glide. Feeling of glass floating without friction." + }, + "09_seda_silk": { + "title": "Silk", + "desc": "Refined JaKooLit style. Energetic entries, fleeting exits, and stable workspaces." + }, + "10_retro_arcade": { + "title": "Retro Arcade", + "desc": "\"Toon/Arcade\" effect. Windows jump and bounce exaggeratedly." + }, + "11_futurista": { + "title": "Futuristic", + "desc": "Holographic interface. Digital precision, zero bounces, and vertical data flow." + }, + "12_rebote": { + "title": "Bounce", + "desc": "Vertical spring physics. Windows fall and bounce upon opening." + }, + "13_organico": { + "title": "Organic", + "desc": "\"Sprout\" movement. Smooth vertical growth and slow fades." + }, + "14_elastico": { + "title": "Elastic", + "desc": "Rubber band physics. Windows arrive, stretch, and bounce vertically." + }, + "15_desvanecido": { + "title": "Fade", + "desc": "Spectral materialization. Windows appear smoothly with barely any movement." + }, + "16_dinamico": { + "title": "Dynamic", + "desc": "Organic rhythm. Combination of speed and smooth settling." + }, + "17_sutil": { + "title": "Subtle", + "desc": "Zero distractions. Absolute smoothness without bounces or abrupt movements." + }, + "18_energico": { + "title": "Energetic", + "desc": "Maximum visual impact. Exaggerated bounces (56%) and kickback exits." + } + } + }, + "borders": { + "geometry": { + "title": "Border Thickness", + "desc": "Define line thickness (0-3px)" + }, + "header_title": "Visual Styles", + "header_subtitle": "Define your windows' personality", + "presets": { + "01_cascade": { + "title": "Cascade", + "desc": "Soft vertical gradient at 50%." + }, + "02_diagonal": { + "title": "Diagonal", + "desc": "Dynamic angle fade." + }, + "03_duo": { + "title": "Duo Contrast", + "desc": "Strong Primary/Secondary contrast." + }, + "04_tri": { + "title": "Trident", + "desc": "Tricolor elegance with gold." + }, + "05_spectrum": { + "title": "Spectrum", + "desc": "Four colors for maximum visibility." + }, + "06_pulse": { + "title": "Pulse", + "desc": "Rotates once when selecting window." + }, + "07_infinity": { + "title": "Infinity", + "desc": "Constant color rotation." + }, + "08_neon": { + "title": "Neon Breath", + "desc": "Slow and relaxing oscillation." + }, + "09_glitch": { + "title": "Cyber Glitch", + "desc": "Aggressive, fast, and error colors." + }, + "10_golden": { + "title": "Golden Luxury", + "desc": "Gold metallic reflections." + }, + "11_toxic": { + "title": "Toxic Green", + "desc": "Fluor green metallic reflections." + }, + "12_neon_cyberpunk": { + "title": "Neon Cyber-Glow (Dual)", + "desc": "Simulation of bicolor brightness using a white/violet light base." + }, + "13_the_joker": { + "title": "The Joker", + "desc": "Joker aesthetic: Acid green and deep purple with an electric glow." + } + } + }, + "shaders": { + "header_title": "Screen Filters", + "header_subtitle": "Real-time image post-processing", + "presets": { + "01_night": { + "title": "Night Light", + "desc": "Warm filter to protect eyesight." + }, + "02_mono": { + "title": "Monochrome", + "desc": "Grayscale for concentration." + }, + "03_vibrant": { + "title": "Vibrant", + "desc": "Intelligently enhances colors." + }, + "04_sharp": { + "title": "HD Sharpness", + "desc": "Improves border and text definition." + }, + "05_ink": { + "title": "E-Ink Paper", + "desc": "Sepia electronic paper texture." + }, + "06_invert": { + "title": "Inverted", + "desc": "Inverts all colors." + }, + "07_oled": { + "title": "OLED Mode", + "desc": "Pure blacks and dramatic contrast." + }, + "08_vision": { + "title": "Night Vision", + "desc": "Military green phosphor effect." + }, + "09_hybrid": { + "title": "Hybrid", + "desc": "Balance between correction and style." + } + } + } +} diff --git a/noctalia-visual-layer/i18n/zh-TW.json b/noctalia-visual-layer/i18n/zh-TW.json new file mode 100644 index 00000000..ce3377f0 --- /dev/null +++ b/noctalia-visual-layer/i18n/zh-TW.json @@ -0,0 +1,248 @@ +{ + "meta": { + "lang": "en", + "name": "English", + "author": "Ximo & AI" + }, + "widget": { + "tooltip": "Noctalia Visual Layer", + "menu_settings": "Plugin Settings" + }, + "panel": { + "header_title": "Noctalia Visual", + "header_subtitle": "Aesthetic Control Center", + "tabs": { + "home": "Home", + "animations": "Animations", + "borders": "Borders", + "effects": "Effects" + } + }, + "welcome": { + "activation_title": "System Activation", + "system_active": "The system is operational. Visual effects are safely managed by NVL.", + "system_inactive": "System halted. Requires acceptance of the persistence contract to continue.", + "enable_label": "Enable Visual Layer", + "warning": { + "title": "SECURE PERSISTENCE CONTRACT", + "text": "Upon activation, NVL will deploy a guardian shield and inject a secure path into your hyprland.conf. If you uninstall the plugin from the Shell, the system will self-clean on the next reboot without causing Hyprland errors." + }, + "features": { + "title": "Features & Benefits", + "description": "Noctalia Visual Layer is the aesthetic evolution of your desktop.", + "list": { + "fluid_anim": "✨ Fluid Animations", + "smart_borders": "🎨 Smart Borders", + "realtime_shaders": "🕶️ Real-Time Shaders", + "non_destructive": "🛡️ Non-Destructive" + } + }, + "docs": { + "title": "Technical Documentation", + "description": "Internal plugin structure and developer guide.", + "btn_show": "Show File Structure", + "btn_hide": "Hide Structure", + "content": { + "arch_title": "MODULAR ARCHITECTURE (Fragment System)", + "arch_desc": "This plugin uses a dynamic construction system to avoid module conflicts.", + "struct_title": "FILE STRUCTURE", + "flow_title": "DATA FLOW", + "flow_1": "1. Activating a module creates its file in fragments/.", + "flow_2": "2. The assemble.sh script joins all fragments.", + "flow_3": "3. A clean overlay.conf is generated.", + "flow_4": "4. Hyprland reloads configuration without errors.", + "debug_title": "DEBUGGING", + "debug_desc": "If something fails, check the overlay.conf file. It should contain the sum of all active effects." + } + }, + "credits": { + "title": "Credits", + "description": "Special thanks to the HyDE Project.", + "btn_hyde": "Inspired by HyDE Project", + "ai_title": "AI Co-Programmed", + "ai_desc": "QML Architecture assistance by Gemini (Google)." + } + }, + "animations": { + "header_title": "Motion Library", + "header_subtitle": "Select the animation style for your desktop", + "presets": { + "01_relampago": { + "title": "Lightning", + "desc": "Maximum visual response." + }, + "02_inercia_elastica": { + "title": "Elastic Inertia", + "desc": "Organic movement. Windows gain momentum on exit and bounce on entry." + }, + "03_seda_minimalista": { + "title": "Minimalist Silk", + "desc": "Absolute smoothness. No bounces, just perfect macOS-style landings." + }, + "04_minimalismo_snappy": { + "title": "Snappy Minimalism", + "desc": "Optimized for maximum speed. Window and workspace management only." + }, + "05_material_moderno": { + "title": "Modern Material", + "desc": "Google Pixel aesthetic. Organic animations, subtle scaling, and tactile response." + }, + "06_impacto_clasico": { + "title": "Classic Impact", + "desc": "\"Jelly\" effect. Elastic bounce on entry and anticipation on exit." + }, + "07_lineal": { + "title": "Linear", + "desc": "Mathematical precision. Constant motion, \"Sci-Fi HUD\" style." + }, + "08_cristal": { + "title": "Glass", + "desc": "Ethereal glide. Feeling of glass floating without friction." + }, + "09_seda_silk": { + "title": "Silk", + "desc": "Refined JaKooLit style. Energetic entries, fleeting exits, and stable workspaces." + }, + "10_retro_arcade": { + "title": "Retro Arcade", + "desc": "\"Toon/Arcade\" effect. Windows jump and bounce exaggeratedly." + }, + "11_futurista": { + "title": "Futuristic", + "desc": "Holographic interface. Digital precision, zero bounces, and vertical data flow." + }, + "12_rebote": { + "title": "Bounce", + "desc": "Vertical spring physics. Windows fall and bounce upon opening." + }, + "13_organico": { + "title": "Organic", + "desc": "\"Sprout\" movement. Smooth vertical growth and slow fades." + }, + "14_elastico": { + "title": "Elastic", + "desc": "Rubber band physics. Windows arrive, stretch, and bounce vertically." + }, + "15_desvanecido": { + "title": "Fade", + "desc": "Spectral materialization. Windows appear smoothly with barely any movement." + }, + "16_dinamico": { + "title": "Dynamic", + "desc": "Organic rhythm. Combination of speed and smooth settling." + }, + "17_sutil": { + "title": "Subtle", + "desc": "Zero distractions. Absolute smoothness without bounces or abrupt movements." + }, + "18_energico": { + "title": "Energetic", + "desc": "Maximum visual impact. Exaggerated bounces (56%) and kickback exits." + } + } + }, + "borders": { + "geometry": { + "title": "Border Thickness", + "desc": "Define line thickness (0-3px)" + }, + "header_title": "Visual Styles", + "header_subtitle": "Define your windows' personality", + "presets": { + "01_cascade": { + "title": "Cascade", + "desc": "Soft vertical gradient at 50%." + }, + "02_diagonal": { + "title": "Diagonal", + "desc": "Dynamic angle fade." + }, + "03_duo": { + "title": "Duo Contrast", + "desc": "Strong Primary/Secondary contrast." + }, + "04_tri": { + "title": "Trident", + "desc": "Tricolor elegance with gold." + }, + "05_spectrum": { + "title": "Spectrum", + "desc": "Four colors for maximum visibility." + }, + "06_pulse": { + "title": "Pulse", + "desc": "Rotates once when selecting window." + }, + "07_infinity": { + "title": "Infinity", + "desc": "Constant color rotation." + }, + "08_neon": { + "title": "Neon Breath", + "desc": "Slow and relaxing oscillation." + }, + "09_glitch": { + "title": "Cyber Glitch", + "desc": "Aggressive, fast, and error colors." + }, + "10_golden": { + "title": "Golden Luxury", + "desc": "Gold metallic reflections." + }, + "11_toxic": { + "title": "Toxic Green", + "desc": "Fluor green metallic reflections." + }, + "12_neon_cyberpunk": { + "title": "Neon Cyber-Glow (Dual)", + "desc": "Simulation of bicolor brightness using a white/violet light base." + }, + "13_the_joker": { + "title": "The Joker", + "desc": "Joker aesthetic: Acid green and deep purple with an electric glow." + } + } + }, + "shaders": { + "header_title": "Screen Filters", + "header_subtitle": "Real-time image post-processing", + "presets": { + "01_night": { + "title": "Night Light", + "desc": "Warm filter to protect eyesight." + }, + "02_mono": { + "title": "Monochrome", + "desc": "Grayscale for concentration." + }, + "03_vibrant": { + "title": "Vibrant", + "desc": "Intelligently enhances colors." + }, + "04_sharp": { + "title": "HD Sharpness", + "desc": "Improves border and text definition." + }, + "05_ink": { + "title": "E-Ink Paper", + "desc": "Sepia electronic paper texture." + }, + "06_invert": { + "title": "Inverted", + "desc": "Inverts all colors." + }, + "07_oled": { + "title": "OLED Mode", + "desc": "Pure blacks and dramatic contrast." + }, + "08_vision": { + "title": "Night Vision", + "desc": "Military green phosphor effect." + }, + "09_hybrid": { + "title": "Hybrid", + "desc": "Balance between correction and style." + } + } + } +} diff --git a/noctalia-visual-layer/manifest.json b/noctalia-visual-layer/manifest.json new file mode 100755 index 00000000..7d5fd06c --- /dev/null +++ b/noctalia-visual-layer/manifest.json @@ -0,0 +1,23 @@ +{ + "id": "noctalia-visual-layer", + "name": "Noctalia Visual Layer", + "version": "1.0.0", + "minNoctaliaVersion": "3.6.0", + "author": "XimoCP", + "license": "MIT", + "repository": "https://github.com/XimoCP/noctalia-visual-layer", + "description": "Elevate your Hyprland experience. A modular Noctalia Shell plugin to safely inject custom animations, borders, and visual effects on the fly.", + "tags": ["Panel", "Bar", "System", "Fun"], + "entryPoints": { + "panel": "Panel.qml", + "barWidget": "BarWidget.qml" + }, + "dependencies": { + "plugins": [] + }, + "metadata": { + "defaultSettings": { + "layer_enabled": false + } + } +} diff --git a/noctalia-visual-layer/modules/AnimationModule.qml b/noctalia-visual-layer/modules/AnimationModule.qml new file mode 100755 index 00000000..9f1ec9fe --- /dev/null +++ b/noctalia-visual-layer/modules/AnimationModule.qml @@ -0,0 +1,185 @@ +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import Qt.labs.settings 1.0 as LabSettings +import Quickshell +import Quickshell.Io +import qs.Widgets +import qs.Commons + +NScrollView { + id: animRoot + + property var pluginApi: null + property var runHypr: null + property var runScript: null + + Layout.fillWidth: true + Layout.fillHeight: true + contentHeight: mainLayout.implicitHeight + 50 + clip: true + + // --- LÓGICA DE TRADUCCIÓN HÍBRIDA (ANTI-EXCLAMACIONES) --- + function tr(key, fallback) { + if (pluginApi && pluginApi.tr) { + var t = pluginApi.tr(key); + if (t !== key && t !== "" && t.indexOf("!!") === -1) { + return t; + } + } + return fallback || key; + } + + // --- PERSISTENCIA --- + LabSettings.Settings { + id: animSettings + fileName: Quickshell.env("HOME") + "/.config/noctalia/plugins/noctalia-visual-layer/assets/animations/store.conf" + property string activeAnimFile: "" + } + + // --- ESCÁNER --- + Process { + id: scanner + command: ["bash", Quickshell.env("HOME") + "/.config/noctalia/plugins/noctalia-visual-layer/assets/scripts/scan.sh", "animations"] + property string outputData: "" + stdout: SplitParser { onRead: function(data) { scanner.outputData += data; } } + onExited: (code) => { + if (code === 0) { + try { + var data = JSON.parse(scanner.outputData); + animModel.clear(); + for (var i = 0; i < data.length; i++) { animModel.append(data[i]); } + } catch (e) { console.error("JSON Error: " + e); } + } + } + } + Component.onCompleted: scanner.running = true + + // --- DELEGADO --- + Component { + id: animDelegate + NBox { + id: cardRoot + Layout.fillWidth: true + Layout.preferredHeight: 85 * Style.uiScaleRatio + radius: Style.radiusM + + // 1. MAPEO DE PROPIEDADES + property string cTitleKey: model.title || "" + property string cDescKey: model.desc || "" + property string cRawTitle: model.rawTitle || "" + property string cRawDesc: model.rawDesc || "" + + property string cFile: model.file || "" + property string cTag: model.tag || "USER" + property color cColor: model.color || "#888888" + property string cIcon: model.icon || "help" + + property bool isActive: animSettings.activeAnimFile === cFile + + color: isActive ? Qt.alpha(cColor, 0.12) : (hoverArea.containsMouse ? Qt.alpha(cColor, 0.05) : "transparent") + border.width: isActive ? 2 : 1 + border.color: isActive ? cColor : (hoverArea.containsMouse ? Qt.alpha(cColor, 0.4) : Color.mOutline) + + Behavior on color { ColorAnimation { duration: 150 } } + Behavior on border.color { ColorAnimation { duration: 150 } } + + MouseArea { + id: hoverArea; anchors.fill: parent; hoverEnabled: true; cursorShape: Qt.PointingHandCursor + onClicked: { + // 1. CAPTURAR EL ESTADO ACTUAL + var wasActive = isActive + + // 2. CALCULAR LA INTENCIÓN + var scriptArg = wasActive ? "none" : cardRoot.cFile + var settingArg = wasActive ? "" : cardRoot.cFile + + // 3. EJECUTAR EL SCRIPT PRIMERO + if (animRoot.runScript) animRoot.runScript("apply_animation.sh", scriptArg) + + // 4. ACTUALIZAR LA UI AL FINAL + animSettings.activeAnimFile = settingArg + } + } + RowLayout { + anchors.fill: parent; anchors.margins: Style.marginM; spacing: Style.marginM + NIcon { + icon: cardRoot.cIcon + color: (cardRoot.isActive || hoverArea.containsMouse) ? cardRoot.cColor : Color.mOnSurfaceVariant + pointSize: Style.fontSizeL + } + ColumnLayout { + Layout.fillWidth: true; spacing: 2 + RowLayout { + spacing: 8 + // 2. USO DE TRADUCCIÓN SEGURA + NText { + text: animRoot.tr(cardRoot.cTitleKey, cardRoot.cRawTitle) + font.weight: Font.Bold + color: cardRoot.isActive ? Color.mOnSurface : Color.mOnSurfaceVariant + } + Rectangle { + width: tagT.implicitWidth + 10; height: 16; radius: 4; color: Qt.alpha(cardRoot.cColor, 0.15) + NText { id: tagT; text: cardRoot.cTag; pointSize: 7; color: cardRoot.cColor; anchors.centerIn: parent; font.weight: Font.Bold } + } + } + NText { + text: animRoot.tr(cardRoot.cDescKey, cardRoot.cRawDesc) + pointSize: Style.fontSizeS; color: Color.mOnSurfaceVariant; elide: Text.ElideRight; Layout.fillWidth: true + } + } + // Switch visual para consistencia + VisualSwitch { + checked: cardRoot.isActive + onToggled: hoverArea.clicked(null) + } + } + } + } + + ListModel { id: animModel } + + ColumnLayout { + id: mainLayout + width: animRoot.availableWidth + spacing: Style.marginS + Layout.margins: Style.marginM + + ColumnLayout { + Layout.fillWidth: true; spacing: 4; Layout.margins: Style.marginL + // CABECERAS TRADUCIBLES + NText { + text: animRoot.tr("animations.header_title", "Biblioteca de Movimiento") + font.weight: Font.Bold; pointSize: Style.fontSizeL; color: Color.mPrimary + } + NText { + text: animRoot.tr("animations.header_subtitle", "Selecciona el estilo de animación") + pointSize: Style.fontSizeS; color: Color.mOnSurfaceVariant + } + } + + NDivider { Layout.fillWidth: true; opacity: 0.5 } + + Repeater { + model: animModel + delegate: animDelegate + } + } + + component VisualSwitch : Item { + id: sw; property bool checked: false; signal toggled() + width: 40 * Style.uiScaleRatio; height: 20 * Style.uiScaleRatio + Rectangle { + anchors.fill: parent; radius: height / 2 + color: sw.checked ? Color.mPrimary : "transparent" + border.color: sw.checked ? Color.mPrimary : Color.mOutline; border.width: 1 + Rectangle { + width: parent.height - 6; height: width; radius: width / 2 + color: sw.checked ? Color.mOnPrimary : Color.mOnSurfaceVariant + anchors.verticalCenter: parent.verticalCenter + x: sw.checked ? (parent.width - width - 3) : 3 + Behavior on x { NumberAnimation { duration: 200 } } + } + } + } +} diff --git a/noctalia-visual-layer/modules/BorderModule.qml b/noctalia-visual-layer/modules/BorderModule.qml new file mode 100755 index 00000000..1145ccb7 --- /dev/null +++ b/noctalia-visual-layer/modules/BorderModule.qml @@ -0,0 +1,231 @@ +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import Qt.labs.settings 1.0 as LabSettings +import Quickshell +import Quickshell.Io +import qs.Widgets +import qs.Commons + +NScrollView { + id: borderRoot + + property var pluginApi: null + property var runHypr: null + property var runScript: null + + Layout.fillWidth: true + Layout.fillHeight: true + contentHeight: mainLayout.implicitHeight + 50 + clip: true + + // --- LÓGICA DE TRADUCCIÓN HÍBRIDA (ANTI-EXCLAMACIONES) --- + function tr(key, fallback) { + if (pluginApi && pluginApi.tr) { + var translated = pluginApi.tr(key); + + // Verificamos DOS cosas: + // 1. Que no sea igual a la clave + // 2. Que NO contenga "!!" (que es como Noctalia marca los errores) + if (translated !== key && translated.indexOf("!!") === -1) { + return translated; + } + } + // Si falla la traducción o devuelve error (!!), usamos el texto original del archivo + return fallback || key; + } + // --- PERSISTENCIA --- + LabSettings.Settings { + id: borderSettings + fileName: Quickshell.env("HOME") + "/.config/noctalia/plugins/noctalia-visual-layer/assets/borders/store.conf" + property string activeBorderFile: "" + } + LabSettings.Settings { + id: geomSettings + category: "VisualLayer_Geometry" + fileName: Quickshell.env("HOME") + "/.config/noctalia/plugins/noctalia-visual-layer/assets/borders/store.conf" + property int borderSize: 2 + } + + // --- ESCÁNER --- + Process { + id: scanner + command: ["bash", Quickshell.env("HOME") + "/.config/noctalia/plugins/noctalia-visual-layer/assets/scripts/scan.sh", "borders"] + property string outputData: "" + stdout: SplitParser { onRead: function(data) { scanner.outputData += data; } } + onExited: (code) => { + if (code === 0) { + try { + var data = JSON.parse(scanner.outputData); + borderModel.clear(); + for (var i = 0; i < data.length; i++) { borderModel.append(data[i]); } + } catch (e) { console.error("JSON Error: " + e); } + } + } + } + Component.onCompleted: scanner.running = true + + // --- DELEGADO --- + Component { + id: borderDelegate + NBox { + id: cardRoot + Layout.fillWidth: true + Layout.preferredHeight: 85 * Style.uiScaleRatio + radius: Style.radiusM + + // 1. MAPEO DE PROPIEDADES (Ahora leemos rawTitle y rawDesc del JSON) + property string cTitleKey: model.title || "" + property string cDescKey: model.desc || "" + property string cRawTitle: model.rawTitle || "" + property string cRawDesc: model.rawDesc || "" + + property string cFile: model.file || "" + property string cIcon: model.icon || "help" // Evita exclamaciones si falta icono + property color cColor: model.color || "#888888" // Evita exclamaciones si falta color + property string cTag: model.tag || "USER" + + property bool isActive: borderSettings.activeBorderFile === cFile + + color: isActive ? Qt.alpha(cColor, 0.12) : (hoverArea.containsMouse ? Qt.alpha(cColor, 0.05) : "transparent") + border.width: isActive ? 2 : 1 + border.color: isActive ? cColor : (hoverArea.containsMouse ? Qt.alpha(cColor, 0.4) : Color.mOutline) + + Behavior on color { ColorAnimation { duration: 150 } } + Behavior on border.color { ColorAnimation { duration: 150 } } + + MouseArea { + id: hoverArea; anchors.fill: parent; hoverEnabled: true; cursorShape: Qt.PointingHandCursor + onClicked: { + // 1. CAPTURAR EL ESTADO ACTUAL (Antes de que cambie) + var wasActive = isActive + + // 2. CALCULAR LA INTENCIÓN + var scriptArg = wasActive ? "none" : cardRoot.cFile + var settingArg = wasActive ? "" : cardRoot.cFile + + // 3. EJECUTAR EL SCRIPT PRIMERO + if (borderRoot.runScript) borderRoot.runScript("border.sh", scriptArg) + + // 4. ACTUALIZAR LA UI AL FINAL + borderSettings.activeBorderFile = settingArg + } + } + + RowLayout { + anchors.fill: parent; anchors.margins: Style.marginM; spacing: Style.marginM + NIcon { + icon: cardRoot.cIcon + color: (cardRoot.isActive || hoverArea.containsMouse) ? cardRoot.cColor : Color.mOnSurfaceVariant + pointSize: Style.fontSizeL + } + ColumnLayout { + Layout.fillWidth: true; spacing: 2 + RowLayout { + spacing: 8 + // 2. USO DE LA TRADUCCIÓN HÍBRIDA + NText { + // "Intenta traducir la Key, si no puedes, dame el RawTitle" + text: borderRoot.tr(cardRoot.cTitleKey, cardRoot.cRawTitle) + font.weight: Font.Bold + color: cardRoot.isActive ? Color.mOnSurface : Color.mOnSurfaceVariant + } + Rectangle { + width: tagT.implicitWidth + 10; height: 16; radius: 4; color: Qt.alpha(cardRoot.cColor, 0.15) + NText { id: tagT; text: cardRoot.cTag; pointSize: 7; color: cardRoot.cColor; anchors.centerIn: parent; font.weight: Font.Bold } + } + } + NText { + // "Intenta traducir la Key, si no puedes, dame el RawDesc" + text: borderRoot.tr(cardRoot.cDescKey, cardRoot.cRawDesc) + pointSize: Style.fontSizeS + color: Color.mOnSurfaceVariant + elide: Text.ElideRight + Layout.fillWidth: true + } + } + // Switch visual (opcional, para coherencia) + Item { + width: 40 * Style.uiScaleRatio; height: 20 * Style.uiScaleRatio + Rectangle { + anchors.fill: parent; radius: height / 2 + color: cardRoot.isActive ? Color.mPrimary : "transparent" + border.color: cardRoot.isActive ? Color.mPrimary : Color.mOutline; border.width: 1 + Rectangle { + width: parent.height - 6; height: width; radius: width / 2 + color: cardRoot.isActive ? Color.mOnPrimary : Color.mOnSurfaceVariant + anchors.verticalCenter: parent.verticalCenter + x: cardRoot.isActive ? (parent.width - width - 3) : 3 + Behavior on x { NumberAnimation { duration: 200 } } + } + } + } + } + } + } + + ListModel { id: borderModel } + + ColumnLayout { + id: mainLayout + width: borderRoot.availableWidth + spacing: Style.marginS + Layout.margins: Style.marginM + + // CABECERA (También usa la función tr segura) + ColumnLayout { + Layout.fillWidth: true; spacing: 4; Layout.margins: Style.marginL + NText { + text: borderRoot.tr("borders.header_title", "Estilos de Borde") + font.weight: Font.Bold; pointSize: Style.fontSizeL; color: Color.mPrimary + } + NText { + text: borderRoot.tr("borders.header_subtitle", "Personaliza los colores y degradados de las ventanas") + pointSize: Style.fontSizeS; color: Color.mOnSurfaceVariant + } + } + + NDivider { Layout.fillWidth: true; opacity: 0.5 } + + // SLIDER DE GEOMETRÍA + NBox { + Layout.fillWidth: true + implicitHeight: geoCol.implicitHeight + (Style.marginL * 2) + color: Qt.alpha(Color.mSurface, 0.4) + radius: Style.radiusM + border.color: Color.mOutline; border.width: 1 + + ColumnLayout { + id: geoCol + anchors.fill: parent; anchors.margins: Style.marginL; spacing: Style.marginM + RowLayout { + spacing: Style.marginS + NIcon { icon: "maximize"; color: Color.mPrimary; pointSize: Style.fontSizeM } + NText { + text: borderRoot.tr("borders.geometry.title", "Grosor del Borde") + font.weight: Font.Bold; color: Color.mOnSurface + } + Item { Layout.fillWidth: true } + NText { text: thicknessSlider.value + "px"; color: Color.mPrimary; font.family: Style.fontMono; font.weight: Font.Bold } + } + NSlider { + id: thicknessSlider + Layout.fillWidth: true + from: 1; to: 5; stepSize: 1 + value: geomSettings.borderSize + onMoved: { + geomSettings.borderSize = value + if (borderRoot.runScript) borderRoot.runScript("geometry.sh", value.toString()) + } + } + } + } + + NDivider { Layout.fillWidth: true; Layout.topMargin: Style.marginM; Layout.bottomMargin: Style.marginS; opacity: 0.3 } + + Repeater { + model: borderModel + delegate: borderDelegate + } + } +} diff --git a/noctalia-visual-layer/modules/ShaderModule.qml b/noctalia-visual-layer/modules/ShaderModule.qml new file mode 100755 index 00000000..14eb9a20 --- /dev/null +++ b/noctalia-visual-layer/modules/ShaderModule.qml @@ -0,0 +1,186 @@ +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import Qt.labs.settings 1.0 as LabSettings +import Quickshell +import Quickshell.Io +import qs.Widgets +import qs.Commons + +NScrollView { + id: shaderRoot + + property var pluginApi: null + property var runHypr: null + property var runScript: null + + Layout.fillWidth: true + Layout.fillHeight: true + contentHeight: mainLayout.implicitHeight + 50 + clip: true + + // --- LÓGICA DE TRADUCCIÓN HÍBRIDA (ANTI-EXCLAMACIONES) --- + function tr(key, fallback) { + if (pluginApi && pluginApi.tr) { + var t = pluginApi.tr(key); + // Si es distinto a la clave Y no contiene exclamaciones de error + if (t !== key && t !== "" && t.indexOf("!!") === -1) { + return t; + } + } + return fallback || key; + } + + // --- PERSISTENCIA --- + LabSettings.Settings { + id: shaderSettings + fileName: Quickshell.env("HOME") + "/.config/noctalia/plugins/noctalia-visual-layer/assets/shaders/store.conf" + property string activeShaderFile: "" + } + + // --- ESCÁNER --- + Process { + id: scanner + command: ["bash", Quickshell.env("HOME") + "/.config/noctalia/plugins/noctalia-visual-layer/assets/scripts/scan.sh", "shaders"] + property string outputData: "" + stdout: SplitParser { onRead: function(data) { scanner.outputData += data; } } + onExited: (code) => { + if (code === 0) { + try { + var data = JSON.parse(scanner.outputData); + shaderModel.clear(); + for (var i = 0; i < data.length; i++) { shaderModel.append(data[i]); } + } catch (e) { console.error("JSON Error: " + e); } + } + } + } + Component.onCompleted: scanner.running = true + + // --- DELEGADO --- + Component { + id: shaderDelegate + NBox { + id: cardRoot + Layout.fillWidth: true + Layout.preferredHeight: 85 * Style.uiScaleRatio + radius: Style.radiusM + + // 1. MAPEO DE PROPIEDADES (Raw + Key) + property string cTitleKey: model.title || "" + property string cDescKey: model.desc || "" + property string cRawTitle: model.rawTitle || "" + property string cRawDesc: model.rawDesc || "" + + property string cFile: model.file || "" + property string cTag: model.tag || "USER" + property color cColor: model.color || "#888888" + property string cIcon: model.icon || "help" + + property bool isActive: shaderSettings.activeShaderFile === cFile + + color: isActive ? Qt.alpha(cColor, 0.12) : (hoverArea.containsMouse ? Qt.alpha(cColor, 0.05) : "transparent") + border.width: isActive ? 2 : 1 + border.color: isActive ? cColor : (hoverArea.containsMouse ? Qt.alpha(cColor, 0.4) : Color.mOutline) + + Behavior on color { ColorAnimation { duration: 150 } } + Behavior on border.color { ColorAnimation { duration: 150 } } + + MouseArea { + id: hoverArea; anchors.fill: parent; hoverEnabled: true; cursorShape: Qt.PointingHandCursor + onClicked: { + // 1. CAPTURAR EL ESTADO ACTUAL + var wasActive = isActive + + // 2. CALCULAR LA INTENCIÓN + var scriptArg = wasActive ? "none" : cardRoot.cFile + var settingArg = wasActive ? "" : cardRoot.cFile + + // 3. EJECUTAR EL SCRIPT PRIMERO + if (shaderRoot.runScript) shaderRoot.runScript("shader.sh", scriptArg) + + // 4. ACTUALIZAR LA UI AL FINAL + shaderSettings.activeShaderFile = settingArg + } + } + + RowLayout { + anchors.fill: parent; anchors.margins: Style.marginM; spacing: Style.marginM + NIcon { + icon: cardRoot.cIcon + color: (cardRoot.isActive || hoverArea.containsMouse) ? cardRoot.cColor : Color.mOnSurfaceVariant + pointSize: Style.fontSizeL + } + ColumnLayout { + Layout.fillWidth: true; spacing: 2 + RowLayout { + spacing: 8 + // 2. USO DE TRADUCCIÓN SEGURA + NText { + text: shaderRoot.tr(cardRoot.cTitleKey, cardRoot.cRawTitle) + font.weight: Font.Bold + color: cardRoot.isActive ? Color.mOnSurface : Color.mOnSurfaceVariant + } + Rectangle { + width: tagT.implicitWidth + 10; height: 16; radius: 4; color: Qt.alpha(cardRoot.cColor, 0.15) + NText { id: tagT; text: cardRoot.cTag; pointSize: 7; color: cardRoot.cColor; anchors.centerIn: parent; font.weight: Font.Bold } + } + } + NText { + text: shaderRoot.tr(cardRoot.cDescKey, cardRoot.cRawDesc) + pointSize: Style.fontSizeS; color: Color.mOnSurfaceVariant; elide: Text.ElideRight; Layout.fillWidth: true + } + } + VisualSwitch { + checked: cardRoot.isActive + onToggled: hoverArea.clicked(null) + } + } + } + } + + ListModel { id: shaderModel } + + ColumnLayout { + id: mainLayout + width: shaderRoot.availableWidth + spacing: Style.marginS + Layout.margins: Style.marginM + + ColumnLayout { + Layout.fillWidth: true; spacing: 4; Layout.margins: Style.marginL + // CABECERAS TRADUCIBLES + NText { + text: shaderRoot.tr("shaders.header_title", "Filtros Visuales") + font.weight: Font.Bold; pointSize: Style.fontSizeL; color: Color.mPrimary + } + NText { + text: shaderRoot.tr("shaders.header_subtitle", "Post-procesado de imagen") + pointSize: Style.fontSizeS; color: Color.mOnSurfaceVariant + } + } + + NDivider { Layout.fillWidth: true; opacity: 0.5 } + + Repeater { + model: shaderModel + delegate: shaderDelegate + } + } + + component VisualSwitch : Item { + id: sw; property bool checked: false; signal toggled() + width: 40 * Style.uiScaleRatio; height: 20 * Style.uiScaleRatio + Rectangle { + anchors.fill: parent; radius: height / 2 + color: sw.checked ? Color.mPrimary : "transparent" + border.color: sw.checked ? Color.mPrimary : Color.mOutline; border.width: 1 + Rectangle { + width: parent.height - 6; height: width; radius: width / 2 + color: sw.checked ? Color.mOnPrimary : Color.mOnSurfaceVariant + anchors.verticalCenter: parent.verticalCenter + x: sw.checked ? (parent.width - width - 3) : 3 + Behavior on x { NumberAnimation { duration: 200 } } + } + } + } +} diff --git a/noctalia-visual-layer/modules/WelcomeModule.qml b/noctalia-visual-layer/modules/WelcomeModule.qml new file mode 100755 index 00000000..f68ae737 --- /dev/null +++ b/noctalia-visual-layer/modules/WelcomeModule.qml @@ -0,0 +1,268 @@ +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import Qt.labs.settings 1.0 as LabSettings +import Quickshell +import Quickshell.Io +import qs.Widgets +import qs.Commons + +NScrollView { + id: welcomeRoot + + // CAMBIO: Renombrado a pluginApi + property var pluginApi: null + property var runHypr: null + property var runScript: null + + Layout.fillWidth: true + Layout.fillHeight: true + contentHeight: mainLayout.implicitHeight + 100 + clip: true + + // Función helper segura para traducir (si pluginApi es null, devuelve key) + function tr(key, defaultText) { + if (welcomeRoot.pluginApi && welcomeRoot.pluginApi.tr) { + return welcomeRoot.pluginApi.tr(key); + } + return defaultText || key; + } + + // --- PERSISTENCIA --- + LabSettings.Settings { + id: welcomeSettings + fileName: Quickshell.env("HOME") + "/.config/noctalia/plugins/noctalia-visual-layer/assets/welcome.conf" + property bool isSystemActive: false + } + + ColumnLayout { + id: mainLayout + width: welcomeRoot.availableWidth + spacing: Style.marginXL + Layout.margins: Style.marginL + + // --- CABECERA --- + ColumnLayout { + Layout.fillWidth: true + Layout.topMargin: Style.marginXL + Layout.bottomMargin: Style.marginM + Layout.alignment: Qt.AlignHCenter + + Image { + source: "../assets/owl_neon.png" + fillMode: Image.PreserveAspectFit + Layout.preferredHeight: 400 * Style.uiScaleRatio + Layout.preferredWidth: 600 * Style.uiScaleRatio + Layout.alignment: Qt.AlignHCenter + smooth: true + } + } + + NDivider { Layout.fillWidth: true } + + // --- ACTIVACIÓN --- + ProCard { + title: tr("welcome.activation_title", "Activación del Sistema") + iconName: "power" + accentColor: welcomeSettings.isSystemActive ? Color.mPrimary : "#ef4444" + description: welcomeSettings.isSystemActive + ? tr("welcome.system_active", "Sistema operativo.") + : tr("welcome.system_inactive", "Sistema detenido.") + + extraContent: ColumnLayout { + spacing: Style.marginM + Layout.fillWidth: true + + RowLayout { + Layout.fillWidth: true + Layout.margins: 15 + NText { + text: tr("welcome.enable_label", "Habilitar Visual Layer") + font.weight: Font.Bold + pointSize: Style.fontSizeL + color: Color.mOnSurface + } + Item { Layout.fillWidth: true } + VisualSwitch { + checked: welcomeSettings.isSystemActive + onToggled: { + welcomeSettings.isSystemActive = checked + if (welcomeRoot.runScript) { + welcomeRoot.runScript("init.sh", checked ? "enable" : "disable") + } + } + } + } + + Rectangle { + visible: !welcomeSettings.isSystemActive + Layout.fillWidth: true + implicitHeight: warnCol.implicitHeight + 24 + color: Qt.alpha("#ef4444", 0.08) + radius: Style.radiusM + border.color: Qt.alpha("#ef4444", 0.3) + border.width: 1 + RowLayout { + id: warnCol + anchors.fill: parent; anchors.margins: 12; spacing: 12 + NIcon { icon: "alert-circle"; color: "#ef4444"; pointSize: 20; Layout.alignment: Qt.AlignTop } + ColumnLayout { + Layout.fillWidth: true; spacing: 4 + NText { + text: tr("welcome.warning.title", "CONTRATO DE PERSISTENCIA") + font.weight: Font.Bold; color: "#ef4444"; pointSize: Style.fontSizeS + } + NText { + // CAMBIO: Texto actualizado para reflejar la nueva seguridad + text: tr("welcome.warning.text", "Se creará un escudo guardián y se añadirá una línea segura a hyprland.conf. Si desinstalas el plugin, el sistema se limpiará automáticamente en el siguiente reinicio sin generar errores.") + color: Color.mOnSurfaceVariant; wrapMode: Text.WordWrap; textFormat: Text.RichText; Layout.fillWidth: true; pointSize: Style.fontSizeS + } + } + } + } + } + } + + // --- CARACTERÍSTICAS --- + ProCard { + title: tr("welcome.features.title", "Características") + iconName: "star"; accentColor: "#fbbf24" + description: tr("welcome.features.description", "La evolución estética.") + extraContent: ColumnLayout { + spacing: 6 + Repeater { + // Usamos las claves del JSON para la lista + model: [ + tr("welcome.features.list.fluid_anim", "Animaciones"), + tr("welcome.features.list.smart_borders", "Bordes"), + tr("welcome.features.list.realtime_shaders", "Shaders"), + tr("welcome.features.list.non_destructive", "No Destructivo") + ] + delegate: RowLayout { + spacing: 8 + NIcon { icon: "check"; color: Color.mPrimary; pointSize: 12 } + NText { text: modelData; color: Color.mOnSurfaceVariant; pointSize: 10; textFormat: Text.RichText } + } + } + } + } + // --- DOCUMENTACIÓN TÉCNICA --- + ProCard { + title: tr("welcome.docs.title", "Arquitectura y Documentación") + iconName: "book"; accentColor: "#38bdf8" + description: tr("welcome.docs.description", "Descubre cómo funciona NVL por debajo.") + + extraContent: ColumnLayout { + spacing: 15 + + // Resumen Técnico Elegante + NText { + Layout.fillWidth: true + wrapMode: Text.Wrap + color: "#a9b1d6" + font.pointSize: 10 + textFormat: Text.RichText + text: tr("welcome.docs.summary", "Noctalia Visual Layer utiliza un sistema de Fragmentos y Ensamblaje en tiempo real. Nunca toca tu configuración principal. Todo se genera de forma segura en un archivo maestro overlay.conf aislado.") + } + + // Fila de Botones de Acción + RowLayout { + spacing: 10 + Layout.fillWidth: true + + NButton { + text: tr("welcome.docs.btn_readme", "Leer Manual Completo") + icon: "external-link" + Layout.fillWidth: true + onClicked: { + // Abre el LEEME.md (o README.md) con la aplicación por defecto del sistema + Qt.openUrlExternally("file://" + Quickshell.env("HOME") + "/.config/noctalia/plugins/noctalia-visual-layer/LEEME.md") + } + } + + NButton { + text: tr("welcome.docs.btn_folder", "Explorar Archivos") + icon: "folder" + Layout.fillWidth: true + onClicked: { + // Abre el gestor de archivos directamente en la carpeta del plugin + Qt.openUrlExternally("file://" + Quickshell.env("HOME") + "/.config/noctalia/plugins/noctalia-visual-layer/") + } + } + } + } + } + + // --- CRÉDITOS --- + ProCard { + title: tr("welcome.credits.title", "Créditos") + iconName: "heart"; accentColor: "#f472b6" + description: tr("welcome.credits.description", "Gracias a HyDE.") + + extraContent: ColumnLayout { + spacing: Style.marginM + NButton { + text: tr("welcome.credits.btn_hyde", "Inspirado en HyDE") + icon: "brand-github"; Layout.fillWidth: true + onClicked: Qt.openUrlExternally("https://github.com/HyDE-Project/") + } + NDivider { Layout.fillWidth: true } + RowLayout { + spacing: Style.marginM + NIcon { icon: "code"; color: Color.mOnSurfaceVariant; pointSize: Style.fontSizeL } + ColumnLayout { + spacing: 2 + NText { text: tr("welcome.credits.ai_title", "IA"); font.weight: Font.Bold } + NText { + text: tr("welcome.credits.ai_desc", "Gracias a Gemini."); + color: Color.mOnSurfaceVariant; wrapMode: Text.Wrap; Layout.fillWidth: true; pointSize: Style.fontSizeS + } + } + } + } + } + Item { Layout.preferredHeight: 50 } + } + + // --- COMPONENTES AUXILIARES --- + component ProCard : NBox { + id: cardRoot + property string title; property string iconName; property string description + property color accentColor; property Component extraContent: null + Layout.fillWidth: true; Layout.leftMargin: Style.marginL; Layout.rightMargin: Style.marginL + implicitHeight: cardCol.implicitHeight + (Style.marginL * 2) + radius: Style.radiusM + border.color: Qt.alpha(accentColor, 0.3); border.width: 1 + color: Qt.alpha(accentColor, 0.03) + + ColumnLayout { + id: cardCol; anchors.fill: parent; anchors.margins: Style.marginL; spacing: Style.marginM + RowLayout { + spacing: Style.marginM + NIcon { icon: iconName; color: accentColor; pointSize: Style.fontSizeL } + NText { text: cardRoot.title; font.weight: Font.Bold; pointSize: Style.fontSizeL } + } + NDivider { Layout.fillWidth: true; opacity: 0.2 } + NText { text: cardRoot.description; color: Color.mOnSurface; wrapMode: Text.WordWrap; Layout.fillWidth: true; textFormat: Text.RichText } + Loader { active: extraContent !== null; sourceComponent: extraContent; Layout.fillWidth: true } + } + } + + component VisualSwitch : Item { + id: sw; property bool checked: false; signal toggled() + width: 46 * Style.uiScaleRatio; height: 24 * Style.uiScaleRatio + Rectangle { + anchors.fill: parent; radius: height / 2 + color: sw.checked ? Color.mPrimary : Color.mSurface + border.color: sw.checked ? Color.mPrimary : Color.mOutline; border.width: 1 + Rectangle { + width: parent.height - 8; height: width; radius: width / 2 + color: sw.checked ? Color.mOnPrimary : Color.mOnSurfaceVariant + anchors.verticalCenter: parent.verticalCenter + x: sw.checked ? (parent.width - width - 4) : 4 + Behavior on x { NumberAnimation { duration: 200; easing.type: Easing.OutBack } } + } + } + MouseArea { anchors.fill: parent; cursorShape: Qt.PointingHandCursor; onClicked: { sw.checked = !sw.checked; sw.toggled() } } + } +} diff --git a/noctalia-visual-layer/preview.png b/noctalia-visual-layer/preview.png new file mode 100644 index 00000000..80223d7e Binary files /dev/null and b/noctalia-visual-layer/preview.png differ