// Outcut — Popup Settings Logic (function () { 'use strict'; // Defaults — must stay in sync with content/settings-defaults.js // (popup runs in its own JS context, no access to content script globals) var DEFAULTS = { // Primary feature keyboardMultiSelect: true, keyboardPreset: 'gmail', // Design tweaks master toggle enableDesignTweaks: false, // Theme & Appearance theme: 'swiss', colorScheme: 'system', accentColor: '', // Density & Spacing densityPreset: 'compact', compactTopBar: true, compactCommandBar: true, compactMessageList: true, compactReadingPane: true, compactFolderPane: true, narrowDateColumn: true, compressComposeToolbar: true, readingPaneMaxWidth: true, unifiedHeader: false, // Hide Elements hideCopilot: true, hideSuggestedReplies: true, hidePromoBanners: true, hideFocusedOtherTabs: true, hideSidebarAppIcons: false, hideGroupsSection: false, hideMyDayButtons: false, hideSenderAvatars: false, hideFeatureDiscovery: true, hideVivaInsights: true, hideUnreadOtherBanner: true, hideActivityFeed: true, // Readability unreadDistinction: true, previewOwnLine: false, normalizeFontWeight: true, darkModeEmailFix: true, messageListFontSize: 'medium', // Behavior autoCollapseRibbon: true, rememberSidebarState: true, suppressContactHover: true, autoAdvanceAfterDelete: true, autoDismissToasts: '5', toastPosition: 'top-right', stickyReplyBar: true, autoResizeCompose: true, throttleNotifications: false, // Quick Actions markAllReadButton: true, quickFolderJump: true, }; // --- Keyboard help text --- function updateKeyboardHelp(presetName) { var helpEl = document.getElementById('keyboardHelpText'); if (!helpEl) return; var presets = { gmail: 'j/k navigate, x/Space select, # delete, e archive, Shift+i/u read/unread, v move, f flag, p pin, Esc deselect', outlook: 'Arrows navigate, Space select, Del/Backspace delete, e archive, q read/unread, v move, f flag, p pin, Esc deselect' }; helpEl.textContent = presets[presetName] || presets.gmail; } // --- Load settings and populate UI --- function loadUI() { chrome.storage.sync.get(DEFAULTS, function (settings) { // Checkboxes var checkboxes = document.querySelectorAll('input[type="checkbox"][data-setting]'); for (var i = 0; i < checkboxes.length; i++) { checkboxes[i].checked = !!settings[checkboxes[i].dataset.setting]; } // Selects var selects = document.querySelectorAll('select[data-setting]'); for (var j = 0; j < selects.length; j++) { selects[j].value = settings[selects[j].dataset.setting] || ''; } // Version var manifest = chrome.runtime.getManifest(); document.getElementById('version').textContent = 'v' + manifest.version; // Update help text based on current preset updateKeyboardHelp(settings.keyboardPreset || 'gmail'); }); } // --- Save a single setting --- function saveSetting(key, value) { var obj = {}; obj[key] = value; chrome.storage.sync.set(obj); } // --- Section accordion --- var sectionHeaders = document.querySelectorAll('.or-section-header'); for (var s = 0; s < sectionHeaders.length; s++) { sectionHeaders[s].addEventListener('click', function () { this.parentElement.classList.toggle('open'); }); } // --- Checkbox change handlers --- var checkboxes = document.querySelectorAll('input[type="checkbox"][data-setting]'); for (var c = 0; c < checkboxes.length; c++) { checkboxes[c].addEventListener('change', function () { saveSetting(this.dataset.setting, this.checked); }); } // --- Select change handlers --- var selects = document.querySelectorAll('select[data-setting]'); for (var sl = 0; sl < selects.length; sl++) { selects[sl].addEventListener('change', function () { var settingKey = this.dataset.setting; var value = this.value; saveSetting(settingKey, value); if (settingKey === 'keyboardPreset') { updateKeyboardHelp(value); } }); } // --- Export settings --- document.getElementById('exportBtn').addEventListener('click', function () { chrome.storage.sync.get(DEFAULTS, function (settings) { var blob = new Blob([JSON.stringify(settings, null, 2)], { type: 'application/json' }); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = 'outcut-settings.json'; a.click(); URL.revokeObjectURL(url); }); }); // --- Import settings --- document.getElementById('importBtn').addEventListener('click', function () { document.getElementById('importFile').click(); }); document.getElementById('importFile').addEventListener('change', function (e) { var file = e.target.files[0]; if (!file) return; var reader = new FileReader(); reader.onload = function (event) { try { var imported = JSON.parse(event.target.result); var cleaned = {}; var defaultKeys = Object.keys(DEFAULTS); for (var i = 0; i < defaultKeys.length; i++) { if (defaultKeys[i] in imported) cleaned[defaultKeys[i]] = imported[defaultKeys[i]]; } chrome.storage.sync.set(cleaned, function () { loadUI(); }); } catch (err) { alert('Invalid settings file.'); } }; reader.readAsText(file); e.target.value = ''; }); // --- Reset to defaults --- document.getElementById('resetBtn').addEventListener('click', function () { if (confirm('Reset all settings to defaults?')) { chrome.storage.sync.set(DEFAULTS, function () { loadUI(); }); } }); // --- Init --- loadUI(); })();