+ <% end %>
+
+ <%= if @settings_editor.technology_visible? do %>
+
+ <% end %>
+
<%= if @settings_editor.publishing_visible? do %>
-
+
-
+
+
+
+
+
+
diff --git a/priv/i18n/locales/de.json b/priv/i18n/locales/de.json
index fb0f71c..b4978e8 100644
--- a/priv/i18n/locales/de.json
+++ b/priv/i18n/locales/de.json
@@ -249,5 +249,94 @@
"Ask the assistant about the active project or editor.": "Frage den Assistenten zum aktiven Projekt oder Editor.",
"Start chat": "Chat starten",
"You": "Du",
- "The assistant sidebar chat surface is ready, but model execution is not connected yet.": "Die Chat-Oberfläche der Assistenten-Seitenleiste ist bereit, aber die Modellausführung ist noch nicht verbunden."
+ "The assistant sidebar chat surface is ready, but model execution is not connected yet.": "Die Chat-Oberfläche der Assistenten-Seitenleiste ist bereit, aber die Modellausführung ist noch nicht verbunden.",
+ "Search settings": "Einstellungen durchsuchen",
+ "No settings match the current search": "Keine Einstellungen entsprechen der aktuellen Suche",
+ "Blog identity, URLs, authoring defaults, and bookmarklet setup": "Blog-Identität, URLs, Autorenvorgaben und Bookmarklet-Einrichtung",
+ "Project Name": "Projektname",
+ "Description": "Beschreibung",
+ "Data Path": "Datenpfad",
+ "Public URL": "Öffentliche URL",
+ "Blog Languages": "Blog-Sprachen",
+ "Default Author": "Standardautor",
+ "Max Posts Per Page": "Maximale Beiträge pro Seite",
+ "Blogmark Category": "Blogmark-Kategorie",
+ "Blogmark Bookmarklet": "Blogmark-Bookmarklet",
+ "Bookmarklet copy support is wired through the desktop runtime and project public URL.": "Die Bookmarklet-Kopierfunktion ist über die Desktop-Laufzeit und die öffentliche Projekt-URL verdrahtet.",
+ "Default editing mode and diff presentation": "Standard-Bearbeitungsmodus und Diff-Darstellung",
+ "Default Editor Mode": "Standard-Bearbeitungsmodus",
+ "Diff View Style": "Diff-Ansicht",
+ "Inline": "Inline",
+ "Side by Side": "Nebeneinander",
+ "Wrap Long Lines": "Lange Zeilen umbrechen",
+ "Enable line wrapping in diffs": "Zeilenumbruch in Diffs aktivieren",
+ "Hide Unchanged Regions": "Unveränderte Bereiche ausblenden",
+ "Collapse unchanged diff hunks": "Unveränderte Diff-Blöcke einklappen",
+ "Content Categories": "Inhaltskategorien",
+ "Category defaults, rendering flags, and template wiring": "Kategorie-Standards, Render-Flags und Template-Zuordnung",
+ "Category": "Kategorie",
+ "Render in Lists": "In Listen rendern",
+ "Show Titles": "Titel anzeigen",
+ "Post Template": "Beitragsvorlage",
+ "List Template": "Listen-Vorlage",
+ "Default": "Standard",
+ "Add Category": "Kategorie hinzufügen",
+ "Reset to Defaults": "Auf Standard zurücksetzen",
+ "Provider keys, model preferences, airplane mode, and system prompt": "Provider-Schlüssel, Modellvorgaben, Flugmodus und System-Prompt",
+ "Anthropic / Online API Key": "Anthropic-/Online-API-Schlüssel",
+ "Mistral API Key": "Mistral-API-Schlüssel",
+ "Offline Mode": "Offline-Modus",
+ "Route AI tasks through the airplane endpoint": "KI-Aufgaben über den Flugmodus-Endpunkt leiten",
+ "Default Model": "Standardmodell",
+ "Title Model": "Titelmodell",
+ "Image Analysis Model": "Bildanalysemodell",
+ "Offline Chat Model": "Offline-Chatmodell",
+ "Offline Title Model": "Offline-Titelmodell",
+ "Offline Image Analysis Model": "Offline-Bildanalysemodell",
+ "System Prompt": "System-Prompt",
+ "Reset to Default": "Auf Standard zurücksetzen",
+ "Application-level runtime behavior and semantic indexing": "Anwendungsverhalten zur Laufzeit und semantische Indizierung",
+ "Semantic Similarity": "Semantische Ähnlichkeit",
+ "Enable duplicate search and related-post embeddings": "Duplikatsuche und Embeddings für verwandte Beiträge aktivieren",
+ "Scripting Runtime": "Scripting-Laufzeit",
+ "Scripting capabilities are configured at the application layer in the rewrite and do not expose runtime switching here.": "Scripting-Funktionen werden in der Neufassung auf Anwendungsebene konfiguriert und bieten hier keine Umschaltung der Laufzeit.",
+ "Deployment credentials for upload tasks": "Bereitstellungszugangsdaten für Upload-Aufgaben",
+ "SSH Mode": "SSH-Modus",
+ "Host": "Host",
+ "Username": "Benutzername",
+ "Remote Path": "Remote-Pfad",
+ "Agent configuration files for the built-in bDS MCP server": "Agent-Konfigurationsdateien für den integrierten bDS-MCP-Server",
+ "Not supported in the rewrite yet": "In der Neufassung noch nicht unterstützt",
+ "Remove": "Entfernen",
+ "Add": "Hinzufügen",
+ "Data Maintenance": "Datenwartung",
+ "Rebuild filesystem-backed records and thumbnails": "Dateisystemgestützte Datensätze und Vorschaubilder neu aufbauen",
+ "Rebuild Posts From Files": "Beiträge aus Dateien neu aufbauen",
+ "Rebuild Media From Files": "Medien aus Dateien neu aufbauen",
+ "Rebuild Scripts From Files": "Skripte aus Dateien neu aufbauen",
+ "Rebuild Templates From Files": "Vorlagen aus Dateien neu aufbauen",
+ "Rebuild Links": "Links neu aufbauen",
+ "Regenerate Missing Thumbnails": "Fehlende Vorschaubilder neu erzeugen",
+ "Rebuild Embedding Index": "Embedding-Index neu aufbauen",
+ "Quick Actions": "Schnellaktionen",
+ "Review title, alt text, and caption suggestions": "Titel-, Alt-Text- und Beschriftungsvorschläge prüfen",
+ "Detect Language": "Sprache erkennen",
+ "Persist the detected language for this media item": "Die erkannte Sprache für dieses Medium speichern",
+ "Select a target language for this media item": "Eine Zielsprache für dieses Medium auswählen",
+ "Replace File": "Datei ersetzen",
+ "File Name": "Dateiname",
+ "MIME Type": "MIME-Typ",
+ "Size": "Größe",
+ "Dimensions": "Abmessungen",
+ "Author": "Autor",
+ "Language": "Sprache",
+ "None": "Keine",
+ "No translations": "Keine Übersetzungen",
+ "Refresh": "Aktualisieren",
+ "Linked Posts": "Verknüpfte Beiträge",
+ "Link to Post": "Mit Beitrag verknüpfen",
+ "Search posts": "Beiträge durchsuchen",
+ "No posts to link": "Keine Beiträge zum Verknüpfen",
+ "and %{count} more": "und %{count} weitere",
+ "Not linked to any posts": "Mit keinen Beiträgen verknüpft"
}
\ No newline at end of file
diff --git a/priv/i18n/locales/en.json b/priv/i18n/locales/en.json
index d9fd0bc..008cf69 100644
--- a/priv/i18n/locales/en.json
+++ b/priv/i18n/locales/en.json
@@ -249,5 +249,94 @@
"Ask the assistant about the active project or editor.": "Ask the assistant about the active project or editor.",
"Start chat": "Start chat",
"You": "You",
- "The assistant sidebar chat surface is ready, but model execution is not connected yet.": "The assistant sidebar chat surface is ready, but model execution is not connected yet."
+ "The assistant sidebar chat surface is ready, but model execution is not connected yet.": "The assistant sidebar chat surface is ready, but model execution is not connected yet.",
+ "Search settings": "Search settings",
+ "No settings match the current search": "No settings match the current search",
+ "Blog identity, URLs, authoring defaults, and bookmarklet setup": "Blog identity, URLs, authoring defaults, and bookmarklet setup",
+ "Project Name": "Project Name",
+ "Description": "Description",
+ "Data Path": "Data Path",
+ "Public URL": "Public URL",
+ "Blog Languages": "Blog Languages",
+ "Default Author": "Default Author",
+ "Max Posts Per Page": "Max Posts Per Page",
+ "Blogmark Category": "Blogmark Category",
+ "Blogmark Bookmarklet": "Blogmark Bookmarklet",
+ "Bookmarklet copy support is wired through the desktop runtime and project public URL.": "Bookmarklet copy support is wired through the desktop runtime and project public URL.",
+ "Default editing mode and diff presentation": "Default editing mode and diff presentation",
+ "Default Editor Mode": "Default Editor Mode",
+ "Diff View Style": "Diff View Style",
+ "Inline": "Inline",
+ "Side by Side": "Side by Side",
+ "Wrap Long Lines": "Wrap Long Lines",
+ "Enable line wrapping in diffs": "Enable line wrapping in diffs",
+ "Hide Unchanged Regions": "Hide Unchanged Regions",
+ "Collapse unchanged diff hunks": "Collapse unchanged diff hunks",
+ "Content Categories": "Content Categories",
+ "Category defaults, rendering flags, and template wiring": "Category defaults, rendering flags, and template wiring",
+ "Category": "Category",
+ "Render in Lists": "Render in Lists",
+ "Show Titles": "Show Titles",
+ "Post Template": "Post Template",
+ "List Template": "List Template",
+ "Default": "Default",
+ "Add Category": "Add Category",
+ "Reset to Defaults": "Reset to Defaults",
+ "Provider keys, model preferences, airplane mode, and system prompt": "Provider keys, model preferences, airplane mode, and system prompt",
+ "Anthropic / Online API Key": "Anthropic / Online API Key",
+ "Mistral API Key": "Mistral API Key",
+ "Offline Mode": "Offline Mode",
+ "Route AI tasks through the airplane endpoint": "Route AI tasks through the airplane endpoint",
+ "Default Model": "Default Model",
+ "Title Model": "Title Model",
+ "Image Analysis Model": "Image Analysis Model",
+ "Offline Chat Model": "Offline Chat Model",
+ "Offline Title Model": "Offline Title Model",
+ "Offline Image Analysis Model": "Offline Image Analysis Model",
+ "System Prompt": "System Prompt",
+ "Reset to Default": "Reset to Default",
+ "Application-level runtime behavior and semantic indexing": "Application-level runtime behavior and semantic indexing",
+ "Semantic Similarity": "Semantic Similarity",
+ "Enable duplicate search and related-post embeddings": "Enable duplicate search and related-post embeddings",
+ "Scripting Runtime": "Scripting Runtime",
+ "Scripting capabilities are configured at the application layer in the rewrite and do not expose runtime switching here.": "Scripting capabilities are configured at the application layer in the rewrite and do not expose runtime switching here.",
+ "Deployment credentials for upload tasks": "Deployment credentials for upload tasks",
+ "SSH Mode": "SSH Mode",
+ "Host": "Host",
+ "Username": "Username",
+ "Remote Path": "Remote Path",
+ "Agent configuration files for the built-in bDS MCP server": "Agent configuration files for the built-in bDS MCP server",
+ "Not supported in the rewrite yet": "Not supported in the rewrite yet",
+ "Remove": "Remove",
+ "Add": "Add",
+ "Data Maintenance": "Data Maintenance",
+ "Rebuild filesystem-backed records and thumbnails": "Rebuild filesystem-backed records and thumbnails",
+ "Rebuild Posts From Files": "Rebuild Posts From Files",
+ "Rebuild Media From Files": "Rebuild Media From Files",
+ "Rebuild Scripts From Files": "Rebuild Scripts From Files",
+ "Rebuild Templates From Files": "Rebuild Templates From Files",
+ "Rebuild Links": "Rebuild Links",
+ "Regenerate Missing Thumbnails": "Regenerate Missing Thumbnails",
+ "Rebuild Embedding Index": "Rebuild Embedding Index",
+ "Quick Actions": "Quick Actions",
+ "Review title, alt text, and caption suggestions": "Review title, alt text, and caption suggestions",
+ "Detect Language": "Detect Language",
+ "Persist the detected language for this media item": "Persist the detected language for this media item",
+ "Select a target language for this media item": "Select a target language for this media item",
+ "Replace File": "Replace File",
+ "File Name": "File Name",
+ "MIME Type": "MIME Type",
+ "Size": "Size",
+ "Dimensions": "Dimensions",
+ "Author": "Author",
+ "Language": "Language",
+ "None": "None",
+ "No translations": "No translations",
+ "Refresh": "Refresh",
+ "Linked Posts": "Linked Posts",
+ "Link to Post": "Link to Post",
+ "Search posts": "Search posts",
+ "No posts to link": "No posts to link",
+ "and %{count} more": "and %{count} more",
+ "Not linked to any posts": "Not linked to any posts"
}
\ No newline at end of file
diff --git a/priv/i18n/locales/es.json b/priv/i18n/locales/es.json
index c5665ed..865f252 100644
--- a/priv/i18n/locales/es.json
+++ b/priv/i18n/locales/es.json
@@ -249,5 +249,94 @@
"Ask the assistant about the active project or editor.": "Pregunta al asistente sobre el proyecto o editor activo.",
"Start chat": "Iniciar chat",
"You": "Tú",
- "The assistant sidebar chat surface is ready, but model execution is not connected yet.": "La superficie de chat de la barra lateral del asistente está lista, pero la ejecución del modelo aún no está conectada."
+ "The assistant sidebar chat surface is ready, but model execution is not connected yet.": "La superficie de chat de la barra lateral del asistente está lista, pero la ejecución del modelo aún no está conectada.",
+ "Search settings": "Buscar en la configuración",
+ "No settings match the current search": "Ninguna configuración coincide con la búsqueda actual",
+ "Blog identity, URLs, authoring defaults, and bookmarklet setup": "Identidad del blog, URL, valores predeterminados de autoría y configuración del bookmarklet",
+ "Project Name": "Nombre del proyecto",
+ "Description": "Descripción",
+ "Data Path": "Ruta de datos",
+ "Public URL": "URL pública",
+ "Blog Languages": "Idiomas del blog",
+ "Default Author": "Autor predeterminado",
+ "Max Posts Per Page": "Máximo de publicaciones por página",
+ "Blogmark Category": "Categoría de blogmark",
+ "Blogmark Bookmarklet": "Bookmarklet de blogmark",
+ "Bookmarklet copy support is wired through the desktop runtime and project public URL.": "La copia del bookmarklet está conectada mediante el entorno de escritorio y la URL pública del proyecto.",
+ "Default editing mode and diff presentation": "Modo de edición predeterminado y presentación de diff",
+ "Default Editor Mode": "Modo de editor predeterminado",
+ "Diff View Style": "Estilo de vista diff",
+ "Inline": "En línea",
+ "Side by Side": "Lado a lado",
+ "Wrap Long Lines": "Ajustar líneas largas",
+ "Enable line wrapping in diffs": "Activar ajuste de línea en diffs",
+ "Hide Unchanged Regions": "Ocultar regiones sin cambios",
+ "Collapse unchanged diff hunks": "Contraer bloques de diff sin cambios",
+ "Content Categories": "Categorías de contenido",
+ "Category defaults, rendering flags, and template wiring": "Valores predeterminados de categoría, opciones de renderizado y conexión de plantillas",
+ "Category": "Categoría",
+ "Render in Lists": "Mostrar en listas",
+ "Show Titles": "Mostrar títulos",
+ "Post Template": "Plantilla de publicación",
+ "List Template": "Plantilla de lista",
+ "Default": "Predeterminado",
+ "Add Category": "Agregar categoría",
+ "Reset to Defaults": "Restablecer valores predeterminados",
+ "Provider keys, model preferences, airplane mode, and system prompt": "Claves del proveedor, preferencias de modelo, modo avión y prompt del sistema",
+ "Anthropic / Online API Key": "Clave API de Anthropic / en línea",
+ "Mistral API Key": "Clave API de Mistral",
+ "Offline Mode": "Modo sin conexión",
+ "Route AI tasks through the airplane endpoint": "Enviar tareas de IA mediante el endpoint de modo avión",
+ "Default Model": "Modelo predeterminado",
+ "Title Model": "Modelo de título",
+ "Image Analysis Model": "Modelo de análisis de imágenes",
+ "Offline Chat Model": "Modelo de chat sin conexión",
+ "Offline Title Model": "Modelo de título sin conexión",
+ "Offline Image Analysis Model": "Modelo de análisis de imágenes sin conexión",
+ "System Prompt": "Prompt del sistema",
+ "Reset to Default": "Restablecer al predeterminado",
+ "Application-level runtime behavior and semantic indexing": "Comportamiento de ejecución a nivel de aplicación e indexación semántica",
+ "Semantic Similarity": "Similitud semántica",
+ "Enable duplicate search and related-post embeddings": "Activar búsqueda de duplicados y embeddings de publicaciones relacionadas",
+ "Scripting Runtime": "Entorno de scripts",
+ "Scripting capabilities are configured at the application layer in the rewrite and do not expose runtime switching here.": "Las capacidades de scripts se configuran en la capa de aplicación en la reescritura y no exponen aquí el cambio de entorno.",
+ "Deployment credentials for upload tasks": "Credenciales de despliegue para tareas de subida",
+ "SSH Mode": "Modo SSH",
+ "Host": "Host",
+ "Username": "Nombre de usuario",
+ "Remote Path": "Ruta remota",
+ "Agent configuration files for the built-in bDS MCP server": "Archivos de configuración de agentes para el servidor MCP integrado de bDS",
+ "Not supported in the rewrite yet": "Todavía no compatible en la reescritura",
+ "Remove": "Quitar",
+ "Add": "Agregar",
+ "Data Maintenance": "Mantenimiento de datos",
+ "Rebuild filesystem-backed records and thumbnails": "Reconstruir registros respaldados por el sistema de archivos y miniaturas",
+ "Rebuild Posts From Files": "Reconstruir publicaciones desde archivos",
+ "Rebuild Media From Files": "Reconstruir medios desde archivos",
+ "Rebuild Scripts From Files": "Reconstruir scripts desde archivos",
+ "Rebuild Templates From Files": "Reconstruir plantillas desde archivos",
+ "Rebuild Links": "Reconstruir enlaces",
+ "Regenerate Missing Thumbnails": "Regenerar miniaturas faltantes",
+ "Rebuild Embedding Index": "Reconstruir índice de embeddings",
+ "Quick Actions": "Acciones rápidas",
+ "Review title, alt text, and caption suggestions": "Revisar sugerencias de título, texto alternativo y leyenda",
+ "Detect Language": "Detectar idioma",
+ "Persist the detected language for this media item": "Guardar el idioma detectado para este medio",
+ "Select a target language for this media item": "Seleccionar un idioma de destino para este medio",
+ "Replace File": "Reemplazar archivo",
+ "File Name": "Nombre del archivo",
+ "MIME Type": "Tipo MIME",
+ "Size": "Tamaño",
+ "Dimensions": "Dimensiones",
+ "Author": "Autor",
+ "Language": "Idioma",
+ "None": "Ninguno",
+ "No translations": "Sin traducciones",
+ "Refresh": "Actualizar",
+ "Linked Posts": "Publicaciones enlazadas",
+ "Link to Post": "Enlazar con publicación",
+ "Search posts": "Buscar publicaciones",
+ "No posts to link": "No hay publicaciones para enlazar",
+ "and %{count} more": "y %{count} más",
+ "Not linked to any posts": "No está enlazado a ninguna publicación"
}
\ No newline at end of file
diff --git a/priv/i18n/locales/fr.json b/priv/i18n/locales/fr.json
index 1dd153e..efed1bc 100644
--- a/priv/i18n/locales/fr.json
+++ b/priv/i18n/locales/fr.json
@@ -249,5 +249,94 @@
"Ask the assistant about the active project or editor.": "Interrogez l’assistant sur le projet ou l’éditeur actif.",
"Start chat": "Démarrer la conversation",
"You": "Vous",
- "The assistant sidebar chat surface is ready, but model execution is not connected yet.": "La surface de discussion de la barre latérale de l’assistant est prête, mais l’exécution du modèle n’est pas encore connectée."
+ "The assistant sidebar chat surface is ready, but model execution is not connected yet.": "La surface de discussion de la barre latérale de l’assistant est prête, mais l’exécution du modèle n’est pas encore connectée.",
+ "Search settings": "Rechercher dans les paramètres",
+ "No settings match the current search": "Aucun paramètre ne correspond à la recherche actuelle",
+ "Blog identity, URLs, authoring defaults, and bookmarklet setup": "Identité du blog, URLs, valeurs d’auteur par défaut et configuration du bookmarklet",
+ "Project Name": "Nom du projet",
+ "Description": "Description",
+ "Data Path": "Chemin des données",
+ "Public URL": "URL publique",
+ "Blog Languages": "Langues du blog",
+ "Default Author": "Auteur par défaut",
+ "Max Posts Per Page": "Nombre maximal d’articles par page",
+ "Blogmark Category": "Catégorie de blogmark",
+ "Blogmark Bookmarklet": "Bookmarklet blogmark",
+ "Bookmarklet copy support is wired through the desktop runtime and project public URL.": "La copie du bookmarklet est reliée via l’environnement desktop et l’URL publique du projet.",
+ "Default editing mode and diff presentation": "Mode d’édition par défaut et présentation des diffs",
+ "Default Editor Mode": "Mode d’édition par défaut",
+ "Diff View Style": "Style de vue diff",
+ "Inline": "En ligne",
+ "Side by Side": "Côte à côte",
+ "Wrap Long Lines": "Renvoyer les longues lignes",
+ "Enable line wrapping in diffs": "Activer le retour à la ligne dans les diffs",
+ "Hide Unchanged Regions": "Masquer les zones inchangées",
+ "Collapse unchanged diff hunks": "Réduire les blocs de diff inchangés",
+ "Content Categories": "Catégories de contenu",
+ "Category defaults, rendering flags, and template wiring": "Valeurs par défaut des catégories, options de rendu et liaison des modèles",
+ "Category": "Catégorie",
+ "Render in Lists": "Afficher dans les listes",
+ "Show Titles": "Afficher les titres",
+ "Post Template": "Modèle d’article",
+ "List Template": "Modèle de liste",
+ "Default": "Par défaut",
+ "Add Category": "Ajouter une catégorie",
+ "Reset to Defaults": "Réinitialiser par défaut",
+ "Provider keys, model preferences, airplane mode, and system prompt": "Clés fournisseur, préférences de modèle, mode avion et prompt système",
+ "Anthropic / Online API Key": "Clé API Anthropic / en ligne",
+ "Mistral API Key": "Clé API Mistral",
+ "Offline Mode": "Mode hors ligne",
+ "Route AI tasks through the airplane endpoint": "Acheminer les tâches IA via le point d’accès du mode avion",
+ "Default Model": "Modèle par défaut",
+ "Title Model": "Modèle pour les titres",
+ "Image Analysis Model": "Modèle d’analyse d’image",
+ "Offline Chat Model": "Modèle de chat hors ligne",
+ "Offline Title Model": "Modèle de titre hors ligne",
+ "Offline Image Analysis Model": "Modèle d’analyse d’image hors ligne",
+ "System Prompt": "Prompt système",
+ "Reset to Default": "Réinitialiser par défaut",
+ "Application-level runtime behavior and semantic indexing": "Comportement d’exécution applicatif et indexation sémantique",
+ "Semantic Similarity": "Similarité sémantique",
+ "Enable duplicate search and related-post embeddings": "Activer la recherche de doublons et les embeddings d’articles liés",
+ "Scripting Runtime": "Environnement de script",
+ "Scripting capabilities are configured at the application layer in the rewrite and do not expose runtime switching here.": "Les capacités de script sont configurées au niveau de l’application dans la réécriture et n’exposent pas de changement d’environnement ici.",
+ "Deployment credentials for upload tasks": "Identifiants de déploiement pour les tâches d’envoi",
+ "SSH Mode": "Mode SSH",
+ "Host": "Hôte",
+ "Username": "Nom d’utilisateur",
+ "Remote Path": "Chemin distant",
+ "Agent configuration files for the built-in bDS MCP server": "Fichiers de configuration d’agent pour le serveur MCP bDS intégré",
+ "Not supported in the rewrite yet": "Pas encore pris en charge dans la réécriture",
+ "Remove": "Retirer",
+ "Add": "Ajouter",
+ "Data Maintenance": "Maintenance des données",
+ "Rebuild filesystem-backed records and thumbnails": "Reconstruire les enregistrements basés sur le système de fichiers et les vignettes",
+ "Rebuild Posts From Files": "Reconstruire les articles depuis les fichiers",
+ "Rebuild Media From Files": "Reconstruire les médias depuis les fichiers",
+ "Rebuild Scripts From Files": "Reconstruire les scripts depuis les fichiers",
+ "Rebuild Templates From Files": "Reconstruire les modèles depuis les fichiers",
+ "Rebuild Links": "Reconstruire les liens",
+ "Regenerate Missing Thumbnails": "Régénérer les vignettes manquantes",
+ "Rebuild Embedding Index": "Reconstruire l’index d’embeddings",
+ "Quick Actions": "Actions rapides",
+ "Review title, alt text, and caption suggestions": "Vérifier les suggestions de titre, texte alternatif et légende",
+ "Detect Language": "Détecter la langue",
+ "Persist the detected language for this media item": "Enregistrer la langue détectée pour ce média",
+ "Select a target language for this media item": "Sélectionner une langue cible pour ce média",
+ "Replace File": "Remplacer le fichier",
+ "File Name": "Nom du fichier",
+ "MIME Type": "Type MIME",
+ "Size": "Taille",
+ "Dimensions": "Dimensions",
+ "Author": "Auteur",
+ "Language": "Langue",
+ "None": "Aucune",
+ "No translations": "Aucune traduction",
+ "Refresh": "Actualiser",
+ "Linked Posts": "Articles liés",
+ "Link to Post": "Lier à un article",
+ "Search posts": "Rechercher des articles",
+ "No posts to link": "Aucun article à lier",
+ "and %{count} more": "et %{count} de plus",
+ "Not linked to any posts": "Lié à aucun article"
}
\ No newline at end of file
diff --git a/priv/i18n/locales/it.json b/priv/i18n/locales/it.json
index ec1d92d..613b740 100644
--- a/priv/i18n/locales/it.json
+++ b/priv/i18n/locales/it.json
@@ -249,5 +249,94 @@
"Ask the assistant about the active project or editor.": "Chiedi all’assistente del progetto o editor attivo.",
"Start chat": "Avvia chat",
"You": "Tu",
- "The assistant sidebar chat surface is ready, but model execution is not connected yet.": "La superficie chat della barra laterale assistente è pronta, ma l’esecuzione del modello non è ancora collegata."
+ "The assistant sidebar chat surface is ready, but model execution is not connected yet.": "La superficie chat della barra laterale assistente è pronta, ma l’esecuzione del modello non è ancora collegata.",
+ "Search settings": "Cerca nelle impostazioni",
+ "No settings match the current search": "Nessuna impostazione corrisponde alla ricerca corrente",
+ "Blog identity, URLs, authoring defaults, and bookmarklet setup": "Identità del blog, URL, valori di autore predefiniti e configurazione del bookmarklet",
+ "Project Name": "Nome progetto",
+ "Description": "Descrizione",
+ "Data Path": "Percorso dati",
+ "Public URL": "URL pubblica",
+ "Blog Languages": "Lingue del blog",
+ "Default Author": "Autore predefinito",
+ "Max Posts Per Page": "Numero massimo di post per pagina",
+ "Blogmark Category": "Categoria blogmark",
+ "Blogmark Bookmarklet": "Bookmarklet blogmark",
+ "Bookmarklet copy support is wired through the desktop runtime and project public URL.": "La copia del bookmarklet è collegata tramite il runtime desktop e l’URL pubblica del progetto.",
+ "Default editing mode and diff presentation": "Modalità di modifica predefinita e presentazione dei diff",
+ "Default Editor Mode": "Modalità editor predefinita",
+ "Diff View Style": "Stile vista diff",
+ "Inline": "In linea",
+ "Side by Side": "Affiancato",
+ "Wrap Long Lines": "A capo per linee lunghe",
+ "Enable line wrapping in diffs": "Abilita il ritorno a capo nei diff",
+ "Hide Unchanged Regions": "Nascondi regioni invariate",
+ "Collapse unchanged diff hunks": "Comprimi i blocchi diff invariati",
+ "Content Categories": "Categorie di contenuto",
+ "Category defaults, rendering flags, and template wiring": "Valori predefiniti delle categorie, opzioni di rendering e collegamento dei template",
+ "Category": "Categoria",
+ "Render in Lists": "Mostra nelle liste",
+ "Show Titles": "Mostra titoli",
+ "Post Template": "Template del post",
+ "List Template": "Template della lista",
+ "Default": "Predefinito",
+ "Add Category": "Aggiungi categoria",
+ "Reset to Defaults": "Ripristina valori predefiniti",
+ "Provider keys, model preferences, airplane mode, and system prompt": "Chiavi provider, preferenze modello, modalità aereo e prompt di sistema",
+ "Anthropic / Online API Key": "Chiave API Anthropic / online",
+ "Mistral API Key": "Chiave API Mistral",
+ "Offline Mode": "Modalità offline",
+ "Route AI tasks through the airplane endpoint": "Instrada i task IA tramite l’endpoint modalità aereo",
+ "Default Model": "Modello predefinito",
+ "Title Model": "Modello titolo",
+ "Image Analysis Model": "Modello analisi immagini",
+ "Offline Chat Model": "Modello chat offline",
+ "Offline Title Model": "Modello titolo offline",
+ "Offline Image Analysis Model": "Modello analisi immagini offline",
+ "System Prompt": "Prompt di sistema",
+ "Reset to Default": "Ripristina predefinito",
+ "Application-level runtime behavior and semantic indexing": "Comportamento runtime a livello applicativo e indicizzazione semantica",
+ "Semantic Similarity": "Somiglianza semantica",
+ "Enable duplicate search and related-post embeddings": "Abilita ricerca duplicati ed embeddings per post correlati",
+ "Scripting Runtime": "Runtime scripting",
+ "Scripting capabilities are configured at the application layer in the rewrite and do not expose runtime switching here.": "Le capacità di scripting sono configurate a livello applicativo nella riscrittura e non espongono qui il cambio di runtime.",
+ "Deployment credentials for upload tasks": "Credenziali di distribuzione per i task di upload",
+ "SSH Mode": "Modalità SSH",
+ "Host": "Host",
+ "Username": "Nome utente",
+ "Remote Path": "Percorso remoto",
+ "Agent configuration files for the built-in bDS MCP server": "File di configurazione degli agenti per il server MCP bDS integrato",
+ "Not supported in the rewrite yet": "Non ancora supportato nella riscrittura",
+ "Remove": "Rimuovi",
+ "Add": "Aggiungi",
+ "Data Maintenance": "Manutenzione dati",
+ "Rebuild filesystem-backed records and thumbnails": "Ricostruisci record basati su filesystem e miniature",
+ "Rebuild Posts From Files": "Ricostruisci i post dai file",
+ "Rebuild Media From Files": "Ricostruisci i media dai file",
+ "Rebuild Scripts From Files": "Ricostruisci gli script dai file",
+ "Rebuild Templates From Files": "Ricostruisci i template dai file",
+ "Rebuild Links": "Ricostruisci i link",
+ "Regenerate Missing Thumbnails": "Rigenera miniature mancanti",
+ "Rebuild Embedding Index": "Ricostruisci indice embeddings",
+ "Quick Actions": "Azioni rapide",
+ "Review title, alt text, and caption suggestions": "Rivedi i suggerimenti per titolo, testo alternativo e didascalia",
+ "Detect Language": "Rileva lingua",
+ "Persist the detected language for this media item": "Salva la lingua rilevata per questo media",
+ "Select a target language for this media item": "Seleziona una lingua di destinazione per questo media",
+ "Replace File": "Sostituisci file",
+ "File Name": "Nome file",
+ "MIME Type": "Tipo MIME",
+ "Size": "Dimensione",
+ "Dimensions": "Dimensioni",
+ "Author": "Autore",
+ "Language": "Lingua",
+ "None": "Nessuno",
+ "No translations": "Nessuna traduzione",
+ "Refresh": "Aggiorna",
+ "Linked Posts": "Post collegati",
+ "Link to Post": "Collega al post",
+ "Search posts": "Cerca post",
+ "No posts to link": "Nessun post da collegare",
+ "and %{count} more": "e altri %{count}",
+ "Not linked to any posts": "Non collegato ad alcun post"
}
\ No newline at end of file
diff --git a/priv/ui/app.css b/priv/ui/app.css
index 505aef7..035a290 100644
--- a/priv/ui/app.css
+++ b/priv/ui/app.css
@@ -2598,18 +2598,339 @@ button svg * {
font: inherit;
}
-.media-editor {
- display: grid;
- grid-template-columns: minmax(320px, 0.95fr) minmax(360px, 1.05fr);
- gap: 20px;
- padding: 20px;
- align-items: start;
-}
-
-.media-editor-details-form {
+[data-testid="media-editor"] {
+ flex: 1;
display: flex;
flex-direction: column;
- gap: 14px;
+ background-color: var(--vscode-editor-background);
+ overflow: hidden;
+}
+
+[data-testid="media-editor"] .editor-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+ padding: 0 12px;
+ min-height: 35px;
+ background-color: var(--vscode-tab-activeBackground);
+ border-bottom: 1px solid var(--vscode-panel-border);
+}
+
+[data-testid="media-editor"] .editor-tabs {
+ display: flex;
+ align-items: center;
+ gap: 2px;
+ min-width: 0;
+}
+
+[data-testid="media-editor"] .editor-tab {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ min-width: 0;
+ padding: 6px 12px;
+ background-color: var(--vscode-tab-inactiveBackground);
+ color: var(--vscode-tab-inactiveForeground);
+ font-size: 13px;
+ border-radius: 4px 4px 0 0;
+}
+
+[data-testid="media-editor"] .editor-tab.active {
+ background-color: var(--vscode-tab-activeBackground);
+ color: var(--vscode-tab-activeForeground);
+}
+
+[data-testid="media-editor"] .editor-tab-title {
+ min-width: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+[data-testid="media-editor"] .editor-tab-dirty {
+ color: var(--vscode-notificationsWarningIcon-foreground, var(--vscode-editorWarning-foreground));
+ font-size: 10px;
+}
+
+[data-testid="media-editor"] .editor-actions {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+[data-testid="media-editor"] .editor-actions button {
+ padding: 4px 10px;
+ font-size: 12px;
+}
+
+[data-testid="media-editor"] .editor-actions button.danger:hover {
+ background-color: var(--vscode-notificationsErrorIcon-foreground);
+}
+
+[data-testid="media-editor"] .auto-save-indicator {
+ font-size: 11px;
+ color: var(--vscode-descriptionForeground);
+ font-style: italic;
+}
+
+[data-testid="media-editor"] .editor-content {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ padding: 16px;
+ overflow-y: auto;
+ gap: 16px;
+}
+
+[data-testid="media-editor"] > .editor-content.media-editor {
+ flex-direction: row;
+ align-items: stretch;
+ gap: 24px;
+}
+
+[data-testid="media-editor"] .editor-field {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ flex: 1;
+ min-width: 0;
+}
+
+[data-testid="media-editor"] .editor-field label {
+ font-size: 11px;
+ font-weight: 500;
+ color: var(--vscode-descriptionForeground);
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+[data-testid="media-editor"] .editor-field-row {
+ display: flex;
+ gap: 12px;
+ width: 100%;
+ margin-bottom: 0;
+}
+
+[data-testid="media-editor"] .post-editor-input,
+[data-testid="media-editor"] .post-editor-textarea {
+ width: 100%;
+ padding: 8px 10px;
+ border: 1px solid var(--vscode-input-border, var(--vscode-panel-border));
+ border-radius: 4px;
+ background: var(--vscode-input-background, rgba(255, 255, 255, 0.06));
+ color: var(--vscode-input-foreground, var(--vscode-foreground));
+ font: inherit;
+}
+
+[data-testid="media-editor"] .post-editor-input.disabled,
+[data-testid="media-editor"] .post-editor-input:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+}
+
+[data-testid="media-editor"] .post-editor-textarea {
+ line-height: 1.5;
+ resize: vertical;
+}
+
+[data-testid="media-editor"] .media-preview {
+ flex: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: var(--vscode-input-background);
+ border-radius: 8px;
+ min-height: 300px;
+}
+
+[data-testid="media-editor"] .media-preview-placeholder {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 12px;
+ color: var(--vscode-descriptionForeground);
+}
+
+[data-testid="media-editor"] .media-preview-image {
+ max-width: 100%;
+ max-height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 16px;
+}
+
+[data-testid="media-editor"] .media-preview-image img {
+ max-width: 100%;
+ max-height: 100%;
+ object-fit: contain;
+ border-radius: 4px;
+}
+
+[data-testid="media-editor"] .media-details {
+ width: 320px;
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ flex-shrink: 0;
+}
+
+[data-testid="media-editor"] .media-editor-details-form {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+[data-testid="media-editor"] .media-details textarea {
+ resize: vertical;
+}
+
+[data-testid="media-editor"] .linked-posts-section label {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+[data-testid="media-editor"] .add-link-btn {
+ background: var(--vscode-button-secondaryBackground);
+ border: none;
+ color: var(--vscode-button-secondaryForeground);
+ padding: 2px 8px;
+ border-radius: 3px;
+ cursor: pointer;
+ font-size: 11px;
+}
+
+[data-testid="media-editor"] .add-link-btn:hover {
+ background: var(--vscode-button-secondaryHoverBackground);
+}
+
+[data-testid="media-editor"] .post-picker {
+ background: var(--vscode-dropdown-background);
+ border: 1px solid var(--vscode-dropdown-border);
+ border-radius: 4px;
+ margin-top: 8px;
+ max-height: 250px;
+ overflow-y: auto;
+}
+
+[data-testid="media-editor"] .post-picker-search {
+ padding: 8px;
+ border-bottom: 1px solid var(--vscode-dropdown-border);
+ position: sticky;
+ top: 0;
+ background: var(--vscode-dropdown-background);
+}
+
+[data-testid="media-editor"] .post-picker-search input {
+ width: 100%;
+ padding: 6px 10px;
+ background: var(--vscode-input-background);
+ border: 1px solid var(--vscode-input-border);
+ border-radius: 3px;
+ color: var(--vscode-input-foreground);
+ font-size: 12px;
+}
+
+[data-testid="media-editor"] .post-picker-search input:focus {
+ outline: none;
+ border-color: var(--vscode-focusBorder);
+}
+
+[data-testid="media-editor"] .post-picker-list {
+ padding: 4px;
+}
+
+[data-testid="media-editor"] .post-picker-item {
+ width: 100%;
+ padding: 6px 8px;
+ cursor: pointer;
+ border: none;
+ border-radius: 3px;
+ background: transparent;
+ color: inherit;
+ font-size: 12px;
+ text-align: left;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+[data-testid="media-editor"] .post-picker-item:hover {
+ background: var(--vscode-list-hoverBackground);
+}
+
+[data-testid="media-editor"] .post-picker-more {
+ padding: 6px 8px;
+ color: var(--vscode-descriptionForeground);
+ font-size: 11px;
+ font-style: italic;
+}
+
+[data-testid="media-editor"] .no-posts,
+[data-testid="media-editor"] .no-linked-posts {
+ padding: 12px 8px;
+ color: var(--vscode-descriptionForeground);
+ font-size: 12px;
+ font-style: italic;
+}
+
+[data-testid="media-editor"] .linked-posts-list {
+ margin-top: 8px;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+
+[data-testid="media-editor"] .linked-post-item {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 6px 8px;
+ background: var(--vscode-sideBar-background);
+ border-radius: 4px;
+}
+
+[data-testid="media-editor"] .linked-post-title,
+[data-testid="media-editor"] .linked-post-link {
+ flex: 1;
+ min-width: 0;
+ border: none;
+ background: transparent;
+ padding: 0;
+ color: inherit;
+ text-align: left;
+ cursor: pointer;
+ font-size: 12px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+[data-testid="media-editor"] .linked-post-title:hover,
+[data-testid="media-editor"] .linked-post-link:hover {
+ color: var(--vscode-textLink-foreground);
+ text-decoration: underline;
+}
+
+[data-testid="media-editor"] .linked-post-item .unlink-btn {
+ background: none;
+ border: none;
+ color: var(--vscode-descriptionForeground);
+ cursor: pointer;
+ padding: 0 4px;
+ font-size: 14px;
+ opacity: 0;
+ transition: opacity 0.1s;
+}
+
+[data-testid="media-editor"] .linked-post-item:hover .unlink-btn {
+ opacity: 1;
+}
+
+[data-testid="media-editor"] .linked-post-item .unlink-btn:hover {
+ color: var(--vscode-errorForeground);
}
.translation-modal-backdrop {
@@ -3091,7 +3412,7 @@ button svg * {
}
@media (max-width: 1100px) {
- .media-editor,
+ [data-testid="media-editor"] > .editor-content.media-editor,
.setting-row,
.tag-form-row,
.editor-field-row,
@@ -3100,6 +3421,16 @@ button svg * {
grid-template-columns: 1fr;
}
+ [data-testid="media-editor"] > .editor-content.media-editor,
+ [data-testid="media-editor"] .editor-field-row {
+ display: flex;
+ flex-direction: column;
+ }
+
+ [data-testid="media-editor"] .media-details {
+ width: 100%;
+ }
+
.style-theme-picker {
grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
}
@@ -3340,171 +3671,6 @@ button svg * {
.lightbox-image-container {
max-width: 90%;
-
-.media-editor {
- display: flex;
- flex-direction: column;
- gap: 18px;
-}
-
-.media-editor-form {
- display: grid;
- grid-template-columns: minmax(240px, 0.9fr) minmax(0, 1.1fr);
- gap: 20px;
- align-items: start;
-}
-
-.media-preview,
-.media-translations-section,
-.linked-posts-section {
- border: 1px solid rgba(148, 163, 184, 0.24);
- border-radius: 12px;
- background: rgba(255, 255, 255, 0.84);
-}
-
-.media-preview {
- min-height: 260px;
- display: flex;
- align-items: center;
- justify-content: center;
- padding: 16px;
-}
-
-.media-preview-image,
-.media-preview-image img {
- width: 100%;
-}
-
-.media-preview-image img {
- display: block;
- max-height: 460px;
- object-fit: contain;
- border-radius: 10px;
-}
-
-.media-preview-placeholder {
- min-height: 220px;
- width: 100%;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- gap: 10px;
- color: #64748b;
-}
-
-.media-details {
- display: flex;
- flex-direction: column;
- gap: 14px;
-}
-
-.media-translations-section,
-.linked-posts-section {
- margin-top: 2px;
- padding: 14px 16px;
-}
-
-.linked-posts-list {
- display: flex;
- flex-direction: column;
- gap: 8px;
-}
-
-.linked-post-item {
- display: flex;
- align-items: center;
- justify-content: space-between;
- gap: 10px;
-}
-
-.linked-post-link {
- border: 0;
- background: transparent;
- padding: 0;
- color: #0f172a;
- text-align: left;
- cursor: pointer;
-}
-
-.unlink-btn,
-.add-link-btn {
- border: 0;
- background: transparent;
- cursor: pointer;
-}
-
-.add-link-btn {
- margin-left: 10px;
- color: #2563eb;
- font-weight: 600;
-}
-
-.unlink-btn {
- color: #b91c1c;
- font-size: 1rem;
-}
-
-.post-picker {
- margin-top: 10px;
- padding: 12px;
- border-radius: 10px;
- border: 1px solid rgba(148, 163, 184, 0.22);
- background: rgba(248, 250, 252, 0.9);
-}
-
-.post-picker-search input,
-.translation-inline-form .post-editor-input,
-.translation-inline-form .post-editor-textarea {
- width: 100%;
-}
-
-.post-picker-list {
- margin-top: 10px;
- display: flex;
- flex-direction: column;
- gap: 6px;
-}
-
-.post-picker-item,
-.post-picker-more,
-.no-linked-posts,
-.no-posts {
- padding: 8px 10px;
- border-radius: 8px;
-}
-
-.post-picker-item {
- border: 0;
- background: rgba(37, 99, 235, 0.08);
- text-align: left;
- cursor: pointer;
-}
-
-.post-picker-more,
-.no-linked-posts,
-.no-posts {
- color: #64748b;
- background: rgba(226, 232, 240, 0.4);
-}
-
-.translation-inline-form {
- margin-top: 12px;
- display: flex;
- flex-direction: column;
- gap: 10px;
-}
-
-.translation-inline-actions {
- display: flex;
- justify-content: flex-end;
-}
-
-@media (max-width: 1100px) {
- .media-editor-form {
- grid-template-columns: 1fr;
- }
-}
max-height: 78%;
}
diff --git a/test/bds/desktop/shell_live_test.exs b/test/bds/desktop/shell_live_test.exs
index 6f7c699..da050fe 100644
--- a/test/bds/desktop/shell_live_test.exs
+++ b/test/bds/desktop/shell_live_test.exs
@@ -860,6 +860,9 @@ defmodule BDS.Desktop.ShellLiveTest do
assert html =~ ~s(class="editor-content media-editor")
assert html =~ ~s(class="quick-actions-wrapper")
refute html =~ ~s(class="media-editor-form")
+ assert has_element?(view, "[data-testid='media-editor'] .editor-content.media-editor .media-details")
+ assert has_element?(view, "[data-testid='media-editor'] .editor-content.media-editor .media-details .media-translations-section")
+ assert has_element?(view, "[data-testid='media-editor'] .editor-content.media-editor .media-details .linked-posts-section")
html = render_click(view, "edit_media_translation", %{"id" => media.id, "language" => "de"})
@@ -870,6 +873,54 @@ defmodule BDS.Desktop.ShellLiveTest do
assert html =~ ~s(name="media_translation[caption]")
end
+ test "settings and media editors render localized labels when the UI language changes", %{project: project, temp_dir: temp_dir} do
+ source_path = Path.join(temp_dir, "localized-hero.txt")
+ File.write!(source_path, "media body")
+
+ assert {:ok, media} =
+ Media.import_media(%{
+ project_id: project.id,
+ source_path: source_path,
+ title: "Lokales Bild",
+ alt: "Alt",
+ caption: "Beschriftung",
+ language: "de"
+ })
+
+ {:ok, view, _html} = live_isolated(build_conn(), BDS.Desktop.ShellLive)
+
+ html =
+ view
+ |> form("[data-testid='status-language-form']", %{ui_language: "de"})
+ |> render_change()
+
+ assert html =~ "Beiträge durchsuchen..."
+
+ settings_html =
+ render_click(view, "pin_sidebar_item", %{
+ "route" => "settings",
+ "id" => "settings-editor",
+ "title" => "Editor",
+ "subtitle" => "Editor settings"
+ })
+
+ assert settings_html =~ "Standard-Bearbeitungsmodus"
+ refute settings_html =~ "Default Editor Mode"
+
+ media_html =
+ render_click(view, "pin_sidebar_item", %{
+ "route" => "media",
+ "id" => media.id,
+ "title" => media.title,
+ "subtitle" => media.original_name
+ })
+
+ assert media_html =~ "Dateiname"
+ assert media_html =~ "Verknüpfte Beiträge"
+ refute media_html =~ "File Name"
+ refute media_html =~ "Linked Posts"
+ end
+
test "remaining step-5 routes render dedicated editors instead of the generic shell placeholder", %{project: project} do
assert {:ok, script} =
Scripts.create_script(%{
@@ -965,6 +1016,28 @@ defmodule BDS.Desktop.ShellLiveTest do
refute chat_html =~ "Desktop workbench content routed through the Elixir shell."
end
+ test "settings sidebar categories render the full old-app section model and target the requested section" do
+ {:ok, view, _html} = live_isolated(build_conn(), BDS.Desktop.ShellLive)
+
+ html =
+ render_click(view, "pin_sidebar_item", %{
+ "route" => "settings",
+ "id" => "settings-ai",
+ "title" => "AI",
+ "subtitle" => "Assistant settings"
+ })
+
+ assert html =~ ~s(id="settings-section-project")
+ assert html =~ ~s(id="settings-section-editor")
+ assert html =~ ~s(id="settings-section-content")
+ assert html =~ ~s(id="settings-section-ai")
+ assert html =~ ~s(id="settings-section-technology")
+ assert html =~ ~s(id="settings-section-publishing")
+ assert html =~ ~s(id="settings-section-data")
+ assert html =~ ~s(id="settings-section-mcp")
+ assert html =~ ~s(data-selected-settings-section="ai")
+ end
+
test "template sidebar exposes old-app style delete control and removes template rows", %{project: project} do
assert {:ok, template} =
BDS.Templates.create_template(%{
diff --git a/test/bds/ui/shell_test.exs b/test/bds/ui/shell_test.exs
index ceac1ec..e3596b2 100644
--- a/test/bds/ui/shell_test.exs
+++ b/test/bds/ui/shell_test.exs
@@ -218,6 +218,27 @@ defmodule BDS.UI.ShellTest do
assert live_ex =~ "titlebar_menu_item_index"
end
+ test "desktop shell css keeps the old media editor layout contract" do
+ css = File.read!("/Users/gb/Projects/bDS2/priv/ui/app.css")
+
+ assert css =~ ".media-preview {"
+ assert css =~ "min-height: 300px;"
+ assert css =~ ".media-details {"
+ assert css =~ "width: 320px;"
+ assert css =~ ".media-details textarea {"
+ assert css =~ "resize: vertical;"
+ assert css =~ ".linked-posts-section label {"
+ assert css =~ "justify-content: space-between;"
+ assert css =~ ".add-link-btn {"
+ assert css =~ "font-size: 11px;"
+ assert css =~ ".post-picker {"
+ assert css =~ "max-height: 250px;"
+ assert css =~ ".post-picker-search input {"
+ assert css =~ "padding: 6px 10px;"
+ assert css =~ ".linked-post-item:hover .unlink-btn {"
+ assert css =~ "opacity: 1;"
+ end
+
test "desktop shell status task area keeps the compact running-task markup" do
template = File.read!("/Users/gb/Projects/bDS2/lib/bds/desktop/shell_live/index.html.heex")