Loading editor/html/index.html +2 −1 Changes for editor/html/index.html: 2 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -90,7 +90,8 @@ <option value="">Nicht verbunden</option> </select> <button id="btn-publish-now" disabled style="padding:0.2em 0.6em;border-radius:4px;border:1px solid var(--border);background:var(--accent);color:var(--bg-primary);font-size:0.8rem;cursor:pointer;font-weight:600;opacity:0.4">🌐 Publish</button> <button id="btn-preview-mode" title="Switch Desktop/Mobile Preview" style="margin-left:auto;padding:0.2em 0.6em;border-radius:4px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-size:0.8rem;cursor:pointer" data-mode="desktop">🖥 <span data-i18n="I18N_AI_DESKTOP">Desktop</span></button> <button id="btn-preview-newtab" title="In neuem Tab öffnen" style="margin-left:auto;padding:0.2em 0.6em;border-radius:4px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-size:0.8rem;cursor:pointer">↗ <span data-i18n="I18N_OPEN_NEW_TAB">Neuer Tab</span></button> <button id="btn-preview-mode" title="Switch Desktop/Mobile Preview" style="padding:0.2em 0.6em;border-radius:4px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-size:0.8rem;cursor:pointer" data-mode="desktop">🖥 <span data-i18n="I18N_AI_DESKTOP">Desktop</span></button> <select id="theme-select" title="Theme" style="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> Loading editor/html/js/preview.js +60 −0 Changes for editor/html/js/preview.js: 60 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -91,6 +91,62 @@ var Preview = (function() { }); } function openInNewTab() { fetch('api/preview/page') .then(function(r) { return r.json(); }) .then(function(data) { if (data.error) { alert(data.error); return; } var form = document.createElement('form'); form.method = 'POST'; form.action = data.blogUrl + '/render'; form.target = '_blank'; form.style.display = 'none'; var addField = function(name, value) { var input = document.createElement('input'); input.type = 'hidden'; input.name = name; input.value = value; form.appendChild(input); }; addField('authid', data.authid); addField('html', data.html); if (_mobileMode) addField('mobile', 'true'); var colorScheme = document.getElementById('theme-select').value || 'dark'; addField('_color_mode', 'theme'); addField('_color_scheme', colorScheme); var targetSelect = document.getElementById('preview-publish-target'); if (targetSelect && targetSelect.value) { addField('target', targetSelect.value); var pfields = document.getElementById('preview-publish-fields'); if (pfields) { var inputs = pfields.querySelectorAll('[data-publish-key]'); for (var i = 0; i < inputs.length; i++) { var key = inputs[i].getAttribute('data-publish-key'); if (inputs[i].type === 'checkbox') { if (inputs[i].checked) addField(key, 'true'); } else if (inputs[i].value) { addField(key, inputs[i].value); } } } } document.body.appendChild(form); form.submit(); document.body.removeChild(form); }) .catch(function(err) { alert('Preview error: ' + err); }); } function toggleMode() { _mobileMode = !_mobileMode; var btn = document.getElementById('btn-preview-mode'); Loading @@ -114,6 +170,9 @@ var Preview = (function() { function bindToggle() { var btn = document.getElementById('btn-preview-mode'); if (btn) btn.addEventListener('click', toggleMode); var newTabBtn = document.getElementById('btn-preview-newtab'); if (newTabBtn) newTabBtn.addEventListener('click', openInNewTab); } function clear() { Loading @@ -134,6 +193,7 @@ var Preview = (function() { refresh: refresh, clear: clear, toggleMode: toggleMode, openInNewTab: openInNewTab, bindToggle: bindToggle, highlight: highlight, isMobile: function() { return _mobileMode; } Loading src/translations.h +2 −0 Changes for src/translations.h: 2 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -359,6 +359,7 @@ namespace blogi { {"I18N_AI_FAILED", "KI-Anfrage fehlgeschlagen"}, {"I18N_AI_DESKTOP", "Desktop"}, {"I18N_AI_MOBILE", "Mobile"}, {"I18N_OPEN_NEW_TAB", "Neuer Tab"}, {"I18N_AI_INCLUDE_DOC", "Dokument anhängen"}, {"I18N_AI_IMPORT_HTML", "Als HTML importieren"}, {"I18N_AI_API_KEY", "API Key"}, Loading Loading @@ -819,6 +820,7 @@ namespace blogi { {"I18N_AI_FAILED", "AI request failed"}, {"I18N_AI_DESKTOP", "Desktop"}, {"I18N_AI_MOBILE", "Mobile"}, {"I18N_OPEN_NEW_TAB", "New Tab"}, {"I18N_AI_INCLUDE_DOC", "Include document"}, {"I18N_AI_IMPORT_HTML", "Import as HTML"}, {"I18N_AI_API_KEY", "API Key"}, Loading Loading
editor/html/index.html +2 −1 Changes for editor/html/index.html: 2 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -90,7 +90,8 @@ <option value="">Nicht verbunden</option> </select> <button id="btn-publish-now" disabled style="padding:0.2em 0.6em;border-radius:4px;border:1px solid var(--border);background:var(--accent);color:var(--bg-primary);font-size:0.8rem;cursor:pointer;font-weight:600;opacity:0.4">🌐 Publish</button> <button id="btn-preview-mode" title="Switch Desktop/Mobile Preview" style="margin-left:auto;padding:0.2em 0.6em;border-radius:4px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-size:0.8rem;cursor:pointer" data-mode="desktop">🖥 <span data-i18n="I18N_AI_DESKTOP">Desktop</span></button> <button id="btn-preview-newtab" title="In neuem Tab öffnen" style="margin-left:auto;padding:0.2em 0.6em;border-radius:4px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-size:0.8rem;cursor:pointer">↗ <span data-i18n="I18N_OPEN_NEW_TAB">Neuer Tab</span></button> <button id="btn-preview-mode" title="Switch Desktop/Mobile Preview" style="padding:0.2em 0.6em;border-radius:4px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-size:0.8rem;cursor:pointer" data-mode="desktop">🖥 <span data-i18n="I18N_AI_DESKTOP">Desktop</span></button> <select id="theme-select" title="Theme" style="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> Loading
editor/html/js/preview.js +60 −0 Changes for editor/html/js/preview.js: 60 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -91,6 +91,62 @@ var Preview = (function() { }); } function openInNewTab() { fetch('api/preview/page') .then(function(r) { return r.json(); }) .then(function(data) { if (data.error) { alert(data.error); return; } var form = document.createElement('form'); form.method = 'POST'; form.action = data.blogUrl + '/render'; form.target = '_blank'; form.style.display = 'none'; var addField = function(name, value) { var input = document.createElement('input'); input.type = 'hidden'; input.name = name; input.value = value; form.appendChild(input); }; addField('authid', data.authid); addField('html', data.html); if (_mobileMode) addField('mobile', 'true'); var colorScheme = document.getElementById('theme-select').value || 'dark'; addField('_color_mode', 'theme'); addField('_color_scheme', colorScheme); var targetSelect = document.getElementById('preview-publish-target'); if (targetSelect && targetSelect.value) { addField('target', targetSelect.value); var pfields = document.getElementById('preview-publish-fields'); if (pfields) { var inputs = pfields.querySelectorAll('[data-publish-key]'); for (var i = 0; i < inputs.length; i++) { var key = inputs[i].getAttribute('data-publish-key'); if (inputs[i].type === 'checkbox') { if (inputs[i].checked) addField(key, 'true'); } else if (inputs[i].value) { addField(key, inputs[i].value); } } } } document.body.appendChild(form); form.submit(); document.body.removeChild(form); }) .catch(function(err) { alert('Preview error: ' + err); }); } function toggleMode() { _mobileMode = !_mobileMode; var btn = document.getElementById('btn-preview-mode'); Loading @@ -114,6 +170,9 @@ var Preview = (function() { function bindToggle() { var btn = document.getElementById('btn-preview-mode'); if (btn) btn.addEventListener('click', toggleMode); var newTabBtn = document.getElementById('btn-preview-newtab'); if (newTabBtn) newTabBtn.addEventListener('click', openInNewTab); } function clear() { Loading @@ -134,6 +193,7 @@ var Preview = (function() { refresh: refresh, clear: clear, toggleMode: toggleMode, openInNewTab: openInNewTab, bindToggle: bindToggle, highlight: highlight, isMobile: function() { return _mobileMode; } Loading
src/translations.h +2 −0 Changes for src/translations.h: 2 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -359,6 +359,7 @@ namespace blogi { {"I18N_AI_FAILED", "KI-Anfrage fehlgeschlagen"}, {"I18N_AI_DESKTOP", "Desktop"}, {"I18N_AI_MOBILE", "Mobile"}, {"I18N_OPEN_NEW_TAB", "Neuer Tab"}, {"I18N_AI_INCLUDE_DOC", "Dokument anhängen"}, {"I18N_AI_IMPORT_HTML", "Als HTML importieren"}, {"I18N_AI_API_KEY", "API Key"}, Loading Loading @@ -819,6 +820,7 @@ namespace blogi { {"I18N_AI_FAILED", "AI request failed"}, {"I18N_AI_DESKTOP", "Desktop"}, {"I18N_AI_MOBILE", "Mobile"}, {"I18N_OPEN_NEW_TAB", "New Tab"}, {"I18N_AI_INCLUDE_DOC", "Include document"}, {"I18N_AI_IMPORT_HTML", "Import as HTML"}, {"I18N_AI_API_KEY", "API Key"}, Loading