Loading editor/html/css/editor.css +18 −1 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ box-sizing: border-box; } :root { :root, [data-theme="dark"] { --bg-primary: #1e1e2e; --bg-secondary: #2a2a3e; --bg-tertiary: #35354a; Loading @@ -23,6 +23,23 @@ --shadow: rgba(0, 0, 0, 0.3); } [data-theme="light"] { --bg-primary: #eff1f5; --bg-secondary: #e6e9ef; --bg-tertiary: #dce0e8; --bg-hover: #ccd0da; --text-primary: #4c4f69; --text-secondary: #5c5f77; --text-muted: #8c8fa1; --accent: #1e66f5; --accent-hover: #2a6ef7; --border: #bcc0cc; --danger: #d20f39; --success: #40a02b; --warning: #df8e1d; --shadow: rgba(0, 0, 0, 0.1); } body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: var(--bg-primary); Loading editor/html/index.html +7 −16 Original line number Diff line number Diff line Loading @@ -57,6 +57,10 @@ <main id="preview-pane"> <div id="preview-toolbar"> <button id="btn-refresh-preview" data-i18n-title="I18N_TITLE_REFRESH_TREE">🔄 <span data-i18n="I18N_VIEW">Vorschau</span></button> <select id="theme-select" title="Theme" style="margin-left:auto;padding:0.2em 0.4em;border-radius:4px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-size:0.8rem;cursor:pointer"> <option value="dark">🌙 Dark</option> <option value="light">☀ Light</option> </select> </div> <iframe id="preview-frame" sandbox="allow-same-origin"></iframe> </main> Loading Loading @@ -271,23 +275,10 @@ <!-- Connection section --> <div id="settings-connection" class="set-section" style="display:none"> <h4 data-i18n="I18N_CONNECTION">Verbindung</h4> <div class="set-field"> <label data-i18n="I18N_BLOG_NAME">Blog Name</label> <input type="text" id="settings-blog-name" placeholder="Mein Blog"> </div> <div class="set-field"> <label data-i18n="I18N_BLOG_URL">Blog URL</label> <input type="text" id="settings-blog-url" placeholder="https://mein-blog.de"> </div> <div class="set-field"> <label data-i18n="I18N_BLOG_API_KEY">API Key</label> <input type="password" id="settings-blog-apikey" placeholder=""> </div> <h4 data-i18n="I18N_CONNECTIONS">Verbindungen</h4> <p class="hint" data-i18n="I18N_CONN_MANAGER_HINT">Verbindungen werden im Verbindungsmanager verwaltet.</p> <div class="set-field"> <button id="btn-settings-conn-save" class="set-save-btn" data-i18n="save">Speichern</button> <button id="btn-settings-conn-test" class="set-save-btn" data-i18n="I18N_TEST_CONNECTION">Verbindung testen</button> <span id="settings-conn-status" class="set-status"></span> <button id="btn-settings-open-connmgr" class="set-save-btn" data-i18n="I18N_OPEN_CONN_MANAGER">Verbindungsmanager öffnen</button> </div> </div> </div> Loading editor/html/js/editor.js +19 −35 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ // --- Initialize --- function init() { initTheme(); I18n.load(function() { I18n.translatePage(); loadPlugins(); Loading @@ -28,6 +29,20 @@ }); } // --- Theme --- function initTheme() { var saved = localStorage.getItem('blogi-theme') || 'dark'; document.documentElement.setAttribute('data-theme', saved); var sel = document.getElementById('theme-select'); sel.value = saved; sel.addEventListener('change', function() { var theme = this.value; document.documentElement.setAttribute('data-theme', theme); localStorage.setItem('blogi-theme', theme); }); } // --- Load widget plugins --- function loadPlugins() { Loading Loading @@ -473,12 +488,6 @@ document.getElementById('settings-ai-apikey').value = resp.api_key || ''; document.getElementById('settings-ai-status').textContent = ''; }); EditorApi.getConnectionSettings().then(function(resp) { document.getElementById('settings-blog-name').value = resp.name || ''; document.getElementById('settings-blog-url').value = resp.url || ''; document.getElementById('settings-blog-apikey').value = resp.api_key || ''; document.getElementById('settings-conn-status').textContent = ''; }); document.getElementById('settings-dialog').showModal(); } Loading Loading @@ -545,35 +554,10 @@ }); }); // Connection settings save document.getElementById('btn-settings-conn-save').addEventListener('click', function() { var status = document.getElementById('settings-conn-status'); status.textContent = I18n.t('I18N_SAVING', 'Saving...'); var name = document.getElementById('settings-blog-name').value; var url = document.getElementById('settings-blog-url').value; var apiKey = document.getElementById('settings-blog-apikey').value; EditorApi.setConnectionSettings(name, url, apiKey).then(function() { status.textContent = I18n.t('I18N_SAVED', 'Saved'); status.className = 'set-status success'; setTimeout(function() { status.textContent = ''; status.className = 'set-status'; }, 2000); }).catch(function() { status.textContent = I18n.t('I18N_SAVE_FAILED', 'Save failed'); status.className = 'set-status error'; }); }); // Connection test document.getElementById('btn-settings-conn-test').addEventListener('click', function() { var status = document.getElementById('settings-conn-status'); status.textContent = I18n.t('I18N_TESTING', 'Teste...'); status.className = 'set-status'; EditorApi.testConnection().then(function() { status.textContent = I18n.t('I18N_CONNECTION_OK', 'Verbindung erfolgreich'); status.className = 'set-status success'; }).catch(function(err) { status.textContent = I18n.t('I18N_CONNECTION_FAILED', 'Verbindung fehlgeschlagen') + ': ' + (err.error || ''); status.className = 'set-status error'; }); // Connection manager link from settings document.getElementById('btn-settings-open-connmgr').addEventListener('click', function() { document.getElementById('settings-dialog').close(); openConnectionManager(); }); } Loading src/translations.h +4 −0 Original line number Diff line number Diff line Loading @@ -368,6 +368,8 @@ namespace blogi { {"I18N_IGNORE_SSL", "SSL ignorieren"}, {"I18N_SELECT_CONNECTION", "Verbindung auswählen oder neue hinzufügen."}, {"I18N_NO_CONNECTIONS", "Keine Verbindungen"}, {"I18N_CONN_MANAGER_HINT", "Verbindungen werden im Verbindungsmanager verwaltet."}, {"I18N_OPEN_CONN_MANAGER", "Verbindungsmanager öffnen"}, {"I18N_ADD", "Hinzufügen"}, {"I18N_DELETE", "Löschen"}, {"I18N_FIELDS_REQUIRED", "Name und URL sind erforderlich"}, Loading Loading @@ -805,6 +807,8 @@ namespace blogi { {"I18N_IGNORE_SSL", "Ignore SSL"}, {"I18N_SELECT_CONNECTION", "Select a connection or add a new one."}, {"I18N_NO_CONNECTIONS", "No connections"}, {"I18N_CONN_MANAGER_HINT", "Connections are managed in the Connection Manager."}, {"I18N_OPEN_CONN_MANAGER", "Open Connection Manager"}, {"I18N_ADD", "Add"}, {"I18N_DELETE", "Delete"}, {"I18N_FIELDS_REQUIRED", "Name and URL are required"}, Loading Loading
editor/html/css/editor.css +18 −1 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ box-sizing: border-box; } :root { :root, [data-theme="dark"] { --bg-primary: #1e1e2e; --bg-secondary: #2a2a3e; --bg-tertiary: #35354a; Loading @@ -23,6 +23,23 @@ --shadow: rgba(0, 0, 0, 0.3); } [data-theme="light"] { --bg-primary: #eff1f5; --bg-secondary: #e6e9ef; --bg-tertiary: #dce0e8; --bg-hover: #ccd0da; --text-primary: #4c4f69; --text-secondary: #5c5f77; --text-muted: #8c8fa1; --accent: #1e66f5; --accent-hover: #2a6ef7; --border: #bcc0cc; --danger: #d20f39; --success: #40a02b; --warning: #df8e1d; --shadow: rgba(0, 0, 0, 0.1); } body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: var(--bg-primary); Loading
editor/html/index.html +7 −16 Original line number Diff line number Diff line Loading @@ -57,6 +57,10 @@ <main id="preview-pane"> <div id="preview-toolbar"> <button id="btn-refresh-preview" data-i18n-title="I18N_TITLE_REFRESH_TREE">🔄 <span data-i18n="I18N_VIEW">Vorschau</span></button> <select id="theme-select" title="Theme" style="margin-left:auto;padding:0.2em 0.4em;border-radius:4px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-size:0.8rem;cursor:pointer"> <option value="dark">🌙 Dark</option> <option value="light">☀ Light</option> </select> </div> <iframe id="preview-frame" sandbox="allow-same-origin"></iframe> </main> Loading Loading @@ -271,23 +275,10 @@ <!-- Connection section --> <div id="settings-connection" class="set-section" style="display:none"> <h4 data-i18n="I18N_CONNECTION">Verbindung</h4> <div class="set-field"> <label data-i18n="I18N_BLOG_NAME">Blog Name</label> <input type="text" id="settings-blog-name" placeholder="Mein Blog"> </div> <div class="set-field"> <label data-i18n="I18N_BLOG_URL">Blog URL</label> <input type="text" id="settings-blog-url" placeholder="https://mein-blog.de"> </div> <div class="set-field"> <label data-i18n="I18N_BLOG_API_KEY">API Key</label> <input type="password" id="settings-blog-apikey" placeholder=""> </div> <h4 data-i18n="I18N_CONNECTIONS">Verbindungen</h4> <p class="hint" data-i18n="I18N_CONN_MANAGER_HINT">Verbindungen werden im Verbindungsmanager verwaltet.</p> <div class="set-field"> <button id="btn-settings-conn-save" class="set-save-btn" data-i18n="save">Speichern</button> <button id="btn-settings-conn-test" class="set-save-btn" data-i18n="I18N_TEST_CONNECTION">Verbindung testen</button> <span id="settings-conn-status" class="set-status"></span> <button id="btn-settings-open-connmgr" class="set-save-btn" data-i18n="I18N_OPEN_CONN_MANAGER">Verbindungsmanager öffnen</button> </div> </div> </div> Loading
editor/html/js/editor.js +19 −35 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ // --- Initialize --- function init() { initTheme(); I18n.load(function() { I18n.translatePage(); loadPlugins(); Loading @@ -28,6 +29,20 @@ }); } // --- Theme --- function initTheme() { var saved = localStorage.getItem('blogi-theme') || 'dark'; document.documentElement.setAttribute('data-theme', saved); var sel = document.getElementById('theme-select'); sel.value = saved; sel.addEventListener('change', function() { var theme = this.value; document.documentElement.setAttribute('data-theme', theme); localStorage.setItem('blogi-theme', theme); }); } // --- Load widget plugins --- function loadPlugins() { Loading Loading @@ -473,12 +488,6 @@ document.getElementById('settings-ai-apikey').value = resp.api_key || ''; document.getElementById('settings-ai-status').textContent = ''; }); EditorApi.getConnectionSettings().then(function(resp) { document.getElementById('settings-blog-name').value = resp.name || ''; document.getElementById('settings-blog-url').value = resp.url || ''; document.getElementById('settings-blog-apikey').value = resp.api_key || ''; document.getElementById('settings-conn-status').textContent = ''; }); document.getElementById('settings-dialog').showModal(); } Loading Loading @@ -545,35 +554,10 @@ }); }); // Connection settings save document.getElementById('btn-settings-conn-save').addEventListener('click', function() { var status = document.getElementById('settings-conn-status'); status.textContent = I18n.t('I18N_SAVING', 'Saving...'); var name = document.getElementById('settings-blog-name').value; var url = document.getElementById('settings-blog-url').value; var apiKey = document.getElementById('settings-blog-apikey').value; EditorApi.setConnectionSettings(name, url, apiKey).then(function() { status.textContent = I18n.t('I18N_SAVED', 'Saved'); status.className = 'set-status success'; setTimeout(function() { status.textContent = ''; status.className = 'set-status'; }, 2000); }).catch(function() { status.textContent = I18n.t('I18N_SAVE_FAILED', 'Save failed'); status.className = 'set-status error'; }); }); // Connection test document.getElementById('btn-settings-conn-test').addEventListener('click', function() { var status = document.getElementById('settings-conn-status'); status.textContent = I18n.t('I18N_TESTING', 'Teste...'); status.className = 'set-status'; EditorApi.testConnection().then(function() { status.textContent = I18n.t('I18N_CONNECTION_OK', 'Verbindung erfolgreich'); status.className = 'set-status success'; }).catch(function(err) { status.textContent = I18n.t('I18N_CONNECTION_FAILED', 'Verbindung fehlgeschlagen') + ': ' + (err.error || ''); status.className = 'set-status error'; }); // Connection manager link from settings document.getElementById('btn-settings-open-connmgr').addEventListener('click', function() { document.getElementById('settings-dialog').close(); openConnectionManager(); }); } Loading
src/translations.h +4 −0 Original line number Diff line number Diff line Loading @@ -368,6 +368,8 @@ namespace blogi { {"I18N_IGNORE_SSL", "SSL ignorieren"}, {"I18N_SELECT_CONNECTION", "Verbindung auswählen oder neue hinzufügen."}, {"I18N_NO_CONNECTIONS", "Keine Verbindungen"}, {"I18N_CONN_MANAGER_HINT", "Verbindungen werden im Verbindungsmanager verwaltet."}, {"I18N_OPEN_CONN_MANAGER", "Verbindungsmanager öffnen"}, {"I18N_ADD", "Hinzufügen"}, {"I18N_DELETE", "Löschen"}, {"I18N_FIELDS_REQUIRED", "Name und URL sind erforderlich"}, Loading Loading @@ -805,6 +807,8 @@ namespace blogi { {"I18N_IGNORE_SSL", "Ignore SSL"}, {"I18N_SELECT_CONNECTION", "Select a connection or add a new one."}, {"I18N_NO_CONNECTIONS", "No connections"}, {"I18N_CONN_MANAGER_HINT", "Connections are managed in the Connection Manager."}, {"I18N_OPEN_CONN_MANAGER", "Open Connection Manager"}, {"I18N_ADD", "Add"}, {"I18N_DELETE", "Delete"}, {"I18N_FIELDS_REQUIRED", "Name and URL are required"}, Loading